'use client' import React, {Dispatch, SetStateAction, useContext, useState} from "react"; import {Book, Globe, LucideIcon, Map, Pencil, Trash2, User, Wand2} from 'lucide-react'; import {useTranslations} from '@/lib/i18n'; import AlertBox from "@/components/ui/AlertBox"; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import OfflineContext, {OfflineContextType} from '@/context/OfflineContext'; import {isDesktop} from '@/lib/configs'; import {apiDelete} from '@/lib/api/client'; import {deleteSeries} from '@/lib/tauri'; import {SeriesContext, SeriesContextProps} from '@/context/SeriesContext'; import {SeriesSyncContext, SeriesSyncContextProps} from '@/context/SeriesSyncContext'; import {SyncedSeries} from '@/lib/types/synced-series'; import {LocalSyncQueueContext, LocalSyncQueueContextProps} from '@/context/SyncQueueContext'; interface SeriesSettingOption { id: string; name: string; icon: LucideIcon; } interface SeriesSettingSidebarProps { selectedSetting: string; setSelectedSetting: Dispatch>; seriesId: string; onClose: () => void; } export default function SeriesSettingSidebar( { selectedSetting, setSelectedSetting, seriesId, onClose }: SeriesSettingSidebarProps) { const t = useTranslations(); const {session}: SessionContextProps = useContext(SessionContext); const {lang}: LangContextProps = useContext(LangContext); const {errorMessage, successMessage}: AlertContextProps = useContext(AlertContext); const {isCurrentlyOffline} = useContext(OfflineContext); const {localSyncedSeries}: SeriesSyncContextProps = useContext(SeriesSyncContext); const {addToQueue}: LocalSyncQueueContextProps = useContext(LocalSyncQueueContext); const userToken: string = session?.accessToken ? session?.accessToken : ''; const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); async function handleDeleteSeries(): Promise { try { const useLocal: boolean = isDesktop && isCurrentlyOffline(); const deletedAt: number = Math.floor(Date.now() / 1000); let success: boolean; if (useLocal) { success = await deleteSeries(seriesId, deletedAt); } else { success = await apiDelete('series/delete', {seriesId: seriesId}, userToken, lang); if (isDesktop && localSyncedSeries.find((s: SyncedSeries): boolean => s.id === seriesId)) { addToQueue('delete_series', {seriesId, deletedAt}); } } if (success) { successMessage(t('seriesSetting.deleteSuccess')); onClose(); window.location.reload(); } } catch (error: unknown) { if (error instanceof Error) { errorMessage(error.message); } else { errorMessage(t('seriesSetting.deleteError')); } } } async function handleDeleteConfirm(): Promise { await handleDeleteSeries(); setShowDeleteConfirm(false); } const settings: SeriesSettingOption[] = [ {id: 'basic-information', name: 'seriesSetting.basicInformation', icon: Pencil}, {id: 'books', name: 'seriesSetting.books', icon: Book}, {id: 'characters', name: 'seriesSetting.characters', icon: User}, {id: 'worlds', name: 'seriesSetting.worlds', icon: Globe}, {id: 'locations', name: 'seriesSetting.locations', icon: Map}, {id: 'spells', name: 'seriesSetting.spells', icon: Wand2}, ]; return (
{showDeleteConfirm && ( setShowDeleteConfirm(false)} confirmText={t('common.delete')} cancelText={t('common.cancel')} /> )}
); }