'use client' import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {faFeather, faTimes} from "@fortawesome/free-solid-svg-icons"; import {ChangeEvent, forwardRef, useContext, useImperativeHandle, useState} from "react"; import System from "@/lib/models/System"; import axios, {AxiosResponse} from "axios"; import {AlertContext} from "@/context/AlertContext"; import {BookContext} from "@/context/BookContext"; import {SessionContext} from "@/context/SessionContext"; import TextInput from "@/components/form/TextInput"; import TexteAreaInput from "@/components/form/TexteAreaInput"; import InputField from "@/components/form/InputField"; import NumberInput from "@/components/form/NumberInput"; import DatePicker from "@/components/form/DatePicker"; import {configs} from "@/lib/configs"; import {useTranslations} from "next-intl"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {BookProps} from "@/lib/models/Book"; import OfflineContext, {OfflineContextType} from "@/context/OfflineContext"; function BasicInformationSetting(props: any, ref: any) { const t = useTranslations(); const {lang} = useContext(LangContext) const {isCurrentlyOffline} = useContext(OfflineContext); const {session} = useContext(SessionContext); const {book, setBook} = useContext(BookContext); const userToken: string = session?.accessToken ? session?.accessToken : ''; const {errorMessage, successMessage} = useContext(AlertContext); const bookId: string = book?.bookId ? book?.bookId.toString() : ''; const [currentImage, setCurrentImage] = useState(book?.coverImage ?? ''); const [title, setTitle] = useState(book?.title ? book?.title : ''); const [subTitle, setSubTitle] = useState(book?.subTitle ? book?.subTitle : ''); const [summary, setSummary] = useState(book?.summary ? book?.summary : ''); const [publicationDate, setPublicationDate] = useState(book?.publicationDate ? book?.publicationDate : ''); const [wordCount, setWordCount] = useState(book?.desiredWordCount ? book?.desiredWordCount : 0); useImperativeHandle(ref, function () { return { handleSave: handleSave }; }); async function handleCoverImageChange(e: ChangeEvent): Promise { const file: File | undefined = e.target.files?.[0]; if (!file) { errorMessage(t('basicInformationSetting.error.noFileSelected')); return; } const formData = new FormData(); formData.append('bookId', bookId); formData.append('picture', file); try { const query: AxiosResponse = await axios({ method: "POST", url: configs.apiUrl + `book/cover?bookid=${bookId}`, headers: { 'Authorization': `Bearer ${userToken}`, }, params: { lang: lang, plateforme: 'web', }, data: formData, responseType: 'arraybuffer' }); const contentType: string = query.headers['content-type'] || 'image/jpeg'; const blob = new Blob([query.data], {type: contentType}); const reader = new FileReader(); reader.onloadend = function (): void { if (typeof reader.result === 'string') { setCurrentImage(reader.result); } }; reader.readAsDataURL(blob); } catch (e: unknown) { if (axios.isAxiosError(e)) { const serverMessage: string = e.response?.data?.message || e.response?.data || e.message; throw new Error(serverMessage as string); } else if (e instanceof Error) { throw new Error(e.message); } else { throw new Error('An unexpected error occurred'); } } } async function handleRemoveCurrentImage(): Promise { try { const response: boolean = await System.authDeleteToServer(`book/cover/delete`, { bookId: bookId }, userToken, lang); if (!response) { errorMessage(t('basicInformationSetting.error.removeCover')); } setCurrentImage(''); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t('basicInformationSetting.error.unknown')); } } } async function handleSave(): Promise { if (!title) { errorMessage(t('basicInformationSetting.error.titleRequired')); return; } try { let response: boolean; if (isCurrentlyOffline()) { response = await window.electron.invoke('db:book:updateBasicInformation', { title: title, subTitle: subTitle, summary: summary, publicationDate: publicationDate, wordCount: wordCount, bookId: bookId }); } else { response = await System.authPostToServer('book/basic-information', { title: title, subTitle: subTitle, summary: summary, publicationDate: publicationDate, wordCount: wordCount, bookId: bookId }, userToken, lang); } if (!response) { errorMessage(t('basicInformationSetting.error.update')); return; } if (!book) { errorMessage(t('basicInformationSetting.error.unknown')); return; } const updatedBook: BookProps = { ...book, title: title, subTitle: subTitle, summary: summary, publicationDate: publicationDate, desiredWordCount: wordCount, }; setBook!!(updatedBook); successMessage(t('basicInformationSetting.success.update')); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t('basicInformationSetting.error.unknown')); } } } return (
) => setTitle(e.target.value)} placeholder={t('basicInformationSetting.fields.titlePlaceholder')} />}/> ) => setSubTitle(e.target.value)} placeholder={t('basicInformationSetting.fields.subtitlePlaceholder')} />}/>
) => setSummary(e.target.value)} placeholder={t('basicInformationSetting.fields.summaryPlaceholder')} />}/>
) => setPublicationDate(e.target.value)} /> }/> }/>
{currentImage ? (
{t('basicInformationSetting.fields.coverImageAlt')}
) : (
{ }} input={}/>
)}
); } export default forwardRef(BasicInformationSetting);