'use client' import React, {ChangeEvent, forwardRef, useContext, useEffect, useImperativeHandle, useState} from "react"; import {BookContext, BookContextProps} from "@/context/BookContext"; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {apiGet, apiPost, apiPut} from "@/lib/api/client"; import {QuillSenseSettingsProps} from "@/lib/types/quillsense"; import {GuideLineAI} from "@/lib/types/book"; import {useTranslations} from '@/lib/i18n'; import TextAreaInput from "@/components/form/TextAreaInput"; import TextInput from "@/components/form/TextInput"; import SelectBox from "@/components/form/SelectBox"; import InputField from "@/components/form/InputField"; import PulseLoader from '@/components/ui/PulseLoader'; import {SettingRef} from "@/lib/types/settings"; import { advancedDialogueTypes, advancedNarrativePersons, beginnerDialogueTypes, beginnerNarrativePersons, intermediateDialogueTypes, intermediateNarrativePersons, langues, verbalTime } from "@/lib/constants/story"; type QuillSenseTab = 'ghostwriter' | 'guideline'; interface QuillSenseSettingProps { toolEnabled?: boolean; } const QuillSenseSetting = forwardRef(function QuillSenseSetting({toolEnabled}: QuillSenseSettingProps, ref: React.ForwardedRef): React.JSX.Element | null { const t = useTranslations(); const {book}: BookContextProps = useContext(BookContext); const {session}: SessionContextProps = useContext(SessionContext); const {errorMessage, successMessage}: AlertContextProps = useContext(AlertContext); const {lang}: LangContextProps = useContext(LangContext); const bookId: string = book?.bookId ?? ''; const userToken: string = session?.accessToken ?? ''; const authorLevel: string = session.user?.writingLevel?.toString() ?? '1'; const [activeTab, setActiveTab] = useState('ghostwriter'); const [isLoading, setIsLoading] = useState(true); // GhostWriter state const [advancedPrompt, setAdvancedPrompt] = useState(''); // Guideline AI state const [plotSummary, setPlotSummary] = useState(''); const [narrativeType, setNarrativeType] = useState(''); const [verbTense, setVerbTense] = useState(''); const [dialogueType, setDialogueType] = useState(''); const [toneAtmosphere, setToneAtmosphere] = useState(''); const [language, setLanguage] = useState(''); const [themes, setThemes] = useState(''); useImperativeHandle(ref, (): SettingRef => ({ handleSave: activeTab === 'ghostwriter' ? handleSaveGhostWriter : handleSaveGuideline })); useEffect((): void => { if (book?.bookId) { fetchQuillSenseSettings(); } }, [book?.bookId]); useEffect((): void => { if (activeTab === 'guideline' && !isLoading) { fetchAIGuideline(); } }, [activeTab]); async function fetchQuillSenseSettings(): Promise { try { setIsLoading(true); const settings: QuillSenseSettingsProps = await apiGet( 'book/quillsense-settings', session.accessToken, lang, {bookId: book?.bookId} ); setAdvancedPrompt(settings.advancedPrompt ?? ''); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t('quillsenseSetting.unknownError')); } } finally { setIsLoading(false); } } async function fetchAIGuideline(): Promise { try { const response: GuideLineAI = await apiGet(`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 handleSaveGhostWriter(): Promise { try { const updateResult: boolean = await apiPut( 'book/quillsense-settings', { bookId: book?.bookId, advancedPrompt: advancedPrompt }, session.accessToken, lang ); if (updateResult) { successMessage(t('quillsenseSetting.saveSuccess')); } else { errorMessage(t('quillsenseSetting.saveError')); } } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t('quillsenseSetting.unknownError')); } } } async function handleSaveGuideline(): Promise { try { const response: boolean = await apiPost( 'quillsense/book/guide-line', { bookId: bookId, plotSummary: plotSummary, verbTense: verbTense, narrativeType: narrativeType, dialogueType: dialogueType, toneAtmosphere: toneAtmosphere, language: language, themes: themes, }, userToken, lang, ); 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")); } } } if (isLoading) { return ; } if (!toolEnabled) { return null; } return (
{activeTab === 'ghostwriter' && (
): void => setAdvancedPrompt(e.target.value)} placeholder={t('quillsenseSetting.advancedPromptPlaceholder')} /> } />

{t('quillsenseSetting.advancedPromptDescription')}

)} {activeTab === 'guideline' && (
): void => setPlotSummary(e.target.value)} placeholder={t("guideLineSetting.plotSummaryPlaceholder")} /> }/> ): void => setToneAtmosphere(e.target.value)} placeholder={t("guideLineSetting.toneAtmospherePlaceholder")} /> }/> ): void => 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 QuillSenseSetting;