'use client' import {ChangeEvent, forwardRef, useContext, useEffect, useImperativeHandle, useState} from 'react'; import System from '@/lib/models/System'; import {AlertContext} from "@/context/AlertContext"; import {BookContext} from '@/context/BookContext'; import {SessionContext} from "@/context/SessionContext"; import {GuideLine, GuideLineAI} from "@/lib/models/Book"; import TexteAreaInput from "@/components/form/TexteAreaInput"; import InputField from "@/components/form/InputField"; import TextInput from "@/components/form/TextInput"; import SelectBox from "@/components/form/SelectBox"; import { advancedDialogueTypes, advancedNarrativePersons, beginnerDialogueTypes, beginnerNarrativePersons, intermediateDialogueTypes, intermediateNarrativePersons, langues, verbalTime } from "@/lib/models/Story"; import {useTranslations} from "next-intl"; import {LangContext} from "@/context/LangContext"; import OfflineContext, {OfflineContextType} from "@/context/OfflineContext"; import {LocalSyncQueueContext, LocalSyncQueueContextProps} from "@/context/SyncQueueContext"; import {BooksSyncContext, BooksSyncContextProps} from "@/context/BooksSyncContext"; import {SyncedBook} from "@/lib/models/SyncedBook"; function GuideLineSetting(props: any, ref: any) { const t = useTranslations(); const {lang} = useContext(LangContext); const {isCurrentlyOffline} = useContext(OfflineContext); const {addToQueue} = useContext(LocalSyncQueueContext); const {localSyncedBooks} = useContext(BooksSyncContext); const {book} = useContext(BookContext); const {session} = useContext(SessionContext); const userToken: string = session?.accessToken ? session?.accessToken : ''; const {errorMessage, successMessage} = useContext(AlertContext); const bookId = book?.bookId as string; const [activeTab, setActiveTab] = useState('personal'); const authorLevel: string = session.user?.writingLevel?.toString() ?? '1'; 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(''); const [plotSummary, setPlotSummary] = useState(''); const [narrativeType, setNarrativeType] = useState(''); const [verbTense, setVerbTense] = useState(''); const [dialogueType, setDialogueType] = useState(''); const [toneAtmosphere, setToneAtmosphere] = useState(''); const [language, setLanguage] = useState(''); useEffect((): void => { if (activeTab === 'personal') { getGuideLine().then(); } else { getAIGuideLine().then(); } }, [activeTab]); useImperativeHandle(ref, () => { { if (activeTab === 'personal') { return { handleSave: savePersonal }; } else { return { handleSave: saveQuillSense }; } } }); async function getAIGuideLine(): Promise { try { let response: GuideLineAI; if (isCurrentlyOffline()) { response = await window.electron.invoke('db:book:guideline:ai:get', {id: bookId}); } else { if (book?.localBook) { response = await window.electron.invoke('db:book:guideline:ai:get', {id: bookId}); } else { response = await System.authGetQueryToServer(`book/ai/guideline`, userToken, lang, {id: bookId}); } } if (response) { setPlotSummary(response.globalResume); setVerbTense(response.verbeTense?.toString() || ''); setNarrativeType(response.narrativeType?.toString() || ''); setDialogueType(response.dialogueType?.toString() || ''); setToneAtmosphere(response.atmosphere); setLanguage(response.langue?.toString() || ''); setThemes(response.themes); } } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t("guideLineSetting.errorUnknown")); } } } async function getGuideLine(): Promise { try { let response: GuideLine; if (isCurrentlyOffline()) { response = await window.electron.invoke('db:book:guideline:get', {id: bookId}); } else { if (book?.localBook) { response = await window.electron.invoke('db:book:guideline:get', {id: bookId}); } else { response = await System.authGetQueryToServer( `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; const guidelineData = { bookId: bookId, tone: tone, atmosphere: atmosphere, writingStyle: writingStyle, themes: themes, symbolism: symbolism, motifs: motifs, narrativeVoice: narrativeVoice, pacing: pacing, intendedAudience: intendedAudience, keyMessages: keyMessages, }; if (isCurrentlyOffline() || book?.localBook) { response = await window.electron.invoke('db:book:guideline:update', guidelineData); } else { response = await System.authPostToServer( 'book/guide-line', guidelineData, userToken, lang, ); if (localSyncedBooks.find((syncedBook: SyncedBook): boolean => syncedBook.id === bookId)) { addToQueue('db:book:guideline:update', guidelineData); } } 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")); } } } async function saveQuillSense(): Promise { try { let response: boolean; const aiGuidelineData = { bookId: bookId, plotSummary: plotSummary, verbTense: verbTense, narrativeType: narrativeType, dialogueType: dialogueType, toneAtmosphere: toneAtmosphere, language: language, themes: themes, }; if (isCurrentlyOffline() || book?.localBook) { response = await window.electron.invoke('db:book:guideline:ai:update', aiGuidelineData); } else { response = await System.authPostToServer( 'quillsense/book/guide-line', aiGuidelineData, userToken, lang, ); if (localSyncedBooks.find((syncedBook: SyncedBook): boolean => syncedBook.id === bookId)) { addToQueue('db:book:guideline:ai:update', aiGuidelineData); } } if (response) { successMessage(t("guideLineSetting.saveSuccess")); } else { errorMessage(t("guideLineSetting.saveError")); } } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t("guideLineSetting.errorUnknown")); } } } return (
{activeTab === 'personal' && (
) => setTone(e.target.value)} placeholder={t("guideLineSetting.tonePlaceholder")} /> }/>
) => 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")} /> }/>
)} {activeTab === 'quillsense' && (
): void => setPlotSummary(e.target.value)} placeholder={t("guideLineSetting.plotSummaryPlaceholder")} /> }/>
): void => setToneAtmosphere(e.target.value)} placeholder={t("guideLineSetting.toneAtmospherePlaceholder")} /> }/>
) => setThemes(e.target.value)} placeholder={t("guideLineSetting.themesPlaceholderQuill")} /> }/>
): void => setVerbTense(event.target.value)} data={verbalTime} placeholder={t("guideLineSetting.verbTensePlaceholder")} /> }/>
): void => { setNarrativeType(event.target.value) }} placeholder={t("guideLineSetting.narrativeTypePlaceholder")}/> }/>
) => { setDialogueType(event.target.value) }} placeholder={t("guideLineSetting.dialogueTypePlaceholder")}/> }/>
) => { setLanguage(event.target.value) }} placeholder={t("guideLineSetting.languagePlaceholder")}/> }/>
)}
); } export default forwardRef(GuideLineSetting);