'use client' import React, {ChangeEvent, forwardRef, useContext, useEffect, useImperativeHandle, useState} from 'react'; import {apiGet, apiPost} from '@/lib/api/client'; import {isDesktop} from '@/lib/configs'; import * as tauri from '@/lib/tauri'; import OfflineContext, {OfflineContextType} from '@/context/OfflineContext'; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import {BookContext, BookContextProps} from '@/context/BookContext'; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {GuideLine} from "@/lib/types/book"; import TextAreaInput from "@/components/form/TextAreaInput"; import InputField from "@/components/form/InputField"; import {useTranslations} from '@/lib/i18n'; import {LangContext, LangContextProps} from "@/context/LangContext"; import {SettingRef} from "@/lib/types/settings"; function GuideLineSetting(_props: object, ref: React.ForwardedRef): React.JSX.Element { const t = useTranslations(); const {lang}: LangContextProps = useContext(LangContext); const {book}: BookContextProps = useContext(BookContext); const {session}: SessionContextProps = useContext(SessionContext); const userToken: string = session?.accessToken ? session?.accessToken : ''; const {errorMessage, successMessage}: AlertContextProps = useContext(AlertContext); const {isCurrentlyOffline}: OfflineContextType = useContext(OfflineContext); const bookId: string = book?.bookId ?? ''; const [tone, setTone] = useState(''); const [atmosphere, setAtmosphere] = useState(''); const [writingStyle, setWritingStyle] = useState(''); const [themes, setThemes] = useState(''); const [symbolism, setSymbolism] = useState(''); const [motifs, setMotifs] = useState(''); const [narrativeVoice, setNarrativeVoice] = useState(''); const [pacing, setPacing] = useState(''); const [intendedAudience, setIntendedAudience] = useState(''); const [keyMessages, setKeyMessages] = useState(''); useEffect((): void => { getGuideLine().then(); }, []); useImperativeHandle(ref, (): SettingRef => ({ handleSave: savePersonal })); async function getGuideLine(): Promise { try { let response: GuideLine; if (isDesktop && (isCurrentlyOffline() || book?.localBook)) { response = await tauri.getGuideLine(bookId); } else { response = await apiGet( `book/guide-line`, userToken, lang, {id: bookId}, ); } if (response) { setTone(response.tone); setAtmosphere(response.atmosphere); setWritingStyle(response.writingStyle); setThemes(response.themes); setSymbolism(response.symbolism); setMotifs(response.motifs); setNarrativeVoice(response.narrativeVoice); setPacing(response.pacing); setIntendedAudience(response.intendedAudience); setKeyMessages(response.keyMessages); } } catch (error: unknown) { if (error instanceof Error) { errorMessage(error.message); } else { errorMessage(t("guideLineSetting.errorUnknown")); } } } async function savePersonal(): Promise { try { let response: boolean; if (isDesktop && (isCurrentlyOffline() || book?.localBook)) { response = await tauri.updateGuideLine({ bookId: bookId, tone: tone, atmosphere: atmosphere, writingStyle: writingStyle, themes: themes, symbolism: symbolism, motifs: motifs, narrativeVoice: narrativeVoice, pacing: pacing, intendedAudience: intendedAudience, keyMessages: keyMessages, }); } else { response = await apiPost( 'book/guide-line', { bookId: bookId, tone: tone, atmosphere: atmosphere, writingStyle: writingStyle, themes: themes, symbolism: symbolism, motifs: motifs, narrativeVoice: narrativeVoice, pacing: pacing, intendedAudience: intendedAudience, keyMessages: keyMessages, }, userToken, lang, ); } if (!response) { errorMessage(t("guideLineSetting.saveError")); return; } successMessage(t("guideLineSetting.saveSuccess")); } catch (error: unknown) { if (error instanceof Error) { errorMessage(error.message); } else { errorMessage(t("guideLineSetting.errorUnknown")); } } } return (
): void => setTone(e.target.value)} placeholder={t("guideLineSetting.tonePlaceholder")} /> }/> ): void => setAtmosphere(e.target.value)} placeholder={t("guideLineSetting.atmospherePlaceholder")} /> }/> ): void => setWritingStyle(e.target.value)} placeholder={t("guideLineSetting.writingStylePlaceholder")} /> }/> ): void => setThemes(e.target.value)} placeholder={t("guideLineSetting.themesPlaceholder")} /> }/> ): void => setSymbolism(e.target.value)} placeholder={t("guideLineSetting.symbolismPlaceholder")} /> }/> ): void => setMotifs(e.target.value)} placeholder={t("guideLineSetting.motifsPlaceholder")} /> }/> ): void => setNarrativeVoice(e.target.value)} placeholder={t("guideLineSetting.narrativeVoicePlaceholder")} /> }/> ): void => setPacing(e.target.value)} placeholder={t("guideLineSetting.pacingPlaceholder")} /> }/> ): void => setIntendedAudience(e.target.value)} placeholder={t("guideLineSetting.intendedAudiencePlaceholder")} /> }/> ): void => setKeyMessages(e.target.value)} placeholder={t("guideLineSetting.keyMessagesPlaceholder")} /> }/>
); } export default forwardRef(GuideLineSetting);