'use client'; import React, {ChangeEvent, Dispatch, SetStateAction, useContext, useState} from "react"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import OfflineContext, {OfflineContextType} from '@/context/OfflineContext'; import {isDesktop} from '@/lib/configs'; import {apiPost} from '@/lib/api/client'; import {createSeries} from '@/lib/tauri'; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {Book, Check, Layers, Pencil} from 'lucide-react'; import InputField from "@/components/form/InputField"; import TextInput from "@/components/form/TextInput"; import TextAreaInput from "@/components/form/TextAreaInput"; import Button from "@/components/ui/Button"; import Modal from "@/components/ui/Modal"; import {useTranslations} from '@/lib/i18n'; import {LangContext, LangContextProps} from "@/context/LangContext"; import {BooksSyncContext, BooksSyncContextProps} from "@/context/BooksSyncContext"; import {SyncedBook} from "@/lib/types/synced-book"; interface AddNewSeriesFormProps { setCloseForm: Dispatch>; onSeriesCreated?: (seriesId: string, name: string) => void; } export default function AddNewSeriesForm({setCloseForm, onSeriesCreated}: AddNewSeriesFormProps) { const t = useTranslations(); const {lang}: LangContextProps = useContext(LangContext); const {session}: SessionContextProps = useContext(SessionContext); const {errorMessage, successMessage}: AlertContextProps = useContext(AlertContext); const {isCurrentlyOffline} = useContext(OfflineContext); const { serverSyncedBooks, setServerSyncedBooks }: BooksSyncContextProps = useContext(BooksSyncContext); const [name, setName] = useState(''); const [description, setDescription] = useState(''); const [selectedBookIds, setSelectedBookIds] = useState([]); const [isAddingSeries, setIsAddingSeries] = useState(false); const token: string = session?.accessToken ?? ''; function toggleBookSelection(bookId: string): void { setSelectedBookIds((prev: string[]): string[] => { if (prev.includes(bookId)) { return prev.filter((id: string): boolean => id !== bookId); } return [...prev, bookId]; }); } async function handleAddSeries(): Promise { if (!name) { errorMessage(t('addNewSeriesForm.error.nameMissing')); return; } if (name.length < 2) { errorMessage(t('addNewSeriesForm.error.nameTooShort')); return; } if (name.length > 100) { errorMessage(t('addNewSeriesForm.error.nameTooLong')); return; } setIsAddingSeries(true); try { const useLocal: boolean = isDesktop && isCurrentlyOffline(); const response: string = useLocal ? await createSeries({name, description: description || null, bookIds: selectedBookIds}) : await apiPost('series/add', {name, description: description || null, bookIds: selectedBookIds}, token, lang); if (!response) { errorMessage(t('addNewSeriesForm.error.addingSeries')); setIsAddingSeries(false); return; } successMessage(t('addNewSeriesForm.success')); if (selectedBookIds.length > 0) { setServerSyncedBooks((prev: SyncedBook[]): SyncedBook[] => prev.map((book: SyncedBook): SyncedBook => selectedBookIds.includes(book.id) ? {...book, seriesId: response} : book ) ); } if (onSeriesCreated) { onSeriesCreated(response, name); } setIsAddingSeries(false); setCloseForm(false); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t('addNewSeriesForm.error.addingSeries')); } setIsAddingSeries(false); } } return ( setCloseForm(false)} size="md" footer={ <> } > ): void => setName(e.target.value)} placeholder={t("addNewSeriesForm.namePlaceholder")} /> }/> ): void => setDescription(e.target.value)} placeholder={t("addNewSeriesForm.descriptionPlaceholder")} /> } />
{t("addNewSeriesForm.selectBooks")} {selectedBookIds.length > 0 && ( ({selectedBookIds.length} {t("addNewSeriesForm.selected")}) )}
{serverSyncedBooks.length === 0 ? (

{t("addNewSeriesForm.noBooks")}

) : (
{serverSyncedBooks.map((book: SyncedBook) => { const isSelected: boolean = selectedBookIds.includes(book.id); return ( ); })}
)}
); }