import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {faTrash} from "@fortawesome/free-solid-svg-icons"; import {useContext, useState} from "react"; import System from "@/lib/models/System"; import {SessionContext} from "@/context/SessionContext"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import AlertBox from "@/components/AlertBox"; import OfflineContext, {OfflineContextType} from "@/context/OfflineContext"; import {BooksSyncContext, BooksSyncContextProps} from "@/context/BooksSyncContext"; import {SyncedBook} from "@/lib/models/SyncedBook"; import {useTranslations} from "next-intl"; interface DeleteBookProps { bookId: string; } export default function DeleteBook({bookId}: DeleteBookProps) { const {session} = useContext(SessionContext); const {lang} = useContext(LangContext) const {isCurrentlyOffline} = useContext(OfflineContext); const [showConfirmBox, setShowConfirmBox] = useState(false); const [deleteLocalToo, setDeleteLocalToo] = useState(false); const {errorMessage} = useContext(AlertContext) const {serverOnlyBooks,setServerOnlyBooks,localOnlyBooks,setLocalOnlyBooks,localSyncedBooks,setLocalSyncedBooks,setServerSyncedBooks} = useContext(BooksSyncContext); const t = useTranslations('deleteBook'); const ifLocalOnlyBook: SyncedBook | undefined = localOnlyBooks.find((book: SyncedBook): boolean => book.id === bookId); const ifSyncedBook: SyncedBook | undefined = localSyncedBooks.find((book: SyncedBook): boolean => book.id === bookId); function handleConfirmation(): void { setDeleteLocalToo(false); setShowConfirmBox(true); } async function handleDeleteBook(): Promise { try { let response: boolean; const deleteData = { id: bookId }; if (isCurrentlyOffline() || ifLocalOnlyBook) { response = await window.electron.invoke('db:book:delete', deleteData); } else { response = await System.authDeleteToServer( `book/delete`, deleteData, session.accessToken, lang ); // If synced book and user wants to delete local too if (response && ifSyncedBook && deleteLocalToo) { await window.electron.invoke('db:book:delete', deleteData); } } if (response) { setShowConfirmBox(false); if (ifLocalOnlyBook) { setLocalOnlyBooks(localOnlyBooks.filter((b: SyncedBook): boolean => b.id !== bookId)); } else if (ifSyncedBook) { // Remove from synced lists setLocalSyncedBooks(localSyncedBooks.filter((b: SyncedBook): boolean => b.id !== bookId)); setServerSyncedBooks((prev: SyncedBook[]): SyncedBook[] => prev.filter((b: SyncedBook): boolean => b.id !== bookId)); // If not deleting local, move to localOnlyBooks if (!deleteLocalToo) { setLocalOnlyBooks([...localOnlyBooks, ifSyncedBook]); } } else { setServerOnlyBooks(serverOnlyBooks.filter((b: SyncedBook): boolean => b.id !== bookId)); } } } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message) } else { errorMessage(t('errorUnknown')); } } } return ( <> { showConfirmBox && ( setShowConfirmBox(false)} confirmText={t('confirm')} cancelText={t('cancel')}> {ifSyncedBook && !isCurrentlyOffline() && (

{t('deleteLocalWarning')}

)}
) } ) }