diff --git a/components/book/settings/quillsense/QuillSenseSetting.tsx b/components/book/settings/quillsense/QuillSenseSetting.tsx new file mode 100644 index 0000000..2412813 --- /dev/null +++ b/components/book/settings/quillsense/QuillSenseSetting.tsx @@ -0,0 +1,130 @@ +'use client' +import React, {ChangeEvent, forwardRef, useContext, useEffect, useImperativeHandle, useState} from "react"; +import {BookContext} from "@/context/BookContext"; +import {SessionContext} from "@/context/SessionContext"; +import {AlertContext} from "@/context/AlertContext"; +import {LangContext} from "@/context/LangContext"; +import System from "@/lib/models/System"; +import {QuillSenseSettingsProps} from "@/lib/models/QuillSenseSettings"; +import {useTranslations} from "next-intl"; +import ToggleSwitch from "@/components/form/ToggleSwitch"; +import TexteAreaInput from "@/components/form/TexteAreaInput"; +import InputField from "@/components/form/InputField"; +import {faMagicWandSparkles, faToggleOn} from "@fortawesome/free-solid-svg-icons"; + +const QuillSenseSetting = forwardRef(function QuillSenseSetting(props, ref) { + const t = useTranslations(); + const {book, setBook} = useContext(BookContext); + const {session} = useContext(SessionContext); + const {errorMessage, successMessage} = useContext(AlertContext); + const {lang} = useContext(LangContext); + + const [quillsenseEnabled, setQuillsenseEnabled] = useState(true); + const [advancedPrompt, setAdvancedPrompt] = useState(''); + const [isLoading, setIsLoading] = useState(true); + + useImperativeHandle(ref, () => ({ + handleSave + })); + + useEffect((): void => { + if (book?.bookId) { + fetchQuillSenseSettings(); + } + }, [book?.bookId]); + + async function fetchQuillSenseSettings(): Promise { + try { + setIsLoading(true); + const settings: QuillSenseSettingsProps = await System.authGetQueryToServer( + 'book/quillsense-settings', + session.accessToken, + lang, + {bookId: book?.bookId} + ); + setQuillsenseEnabled(settings.quillsenseEnabled); + setAdvancedPrompt(settings.advancedPrompt ?? ''); + } catch (e: unknown) { + if (e instanceof Error) { + errorMessage(e.message); + } + } finally { + setIsLoading(false); + } + } + + async function handleSave(): Promise { + try { + const updateResult: boolean = await System.authPutToServer( + 'book/quillsense-settings', + { + bookId: book?.bookId, + quillsenseEnabled: quillsenseEnabled, + advancedPrompt: advancedPrompt + }, + session.accessToken, + lang + ); + if (updateResult) { + successMessage(t('quillsenseSetting.saveSuccess')); + // Mettre a jour le contexte du livre + if (setBook && book) { + setBook({...book, quillsenseEnabled: quillsenseEnabled}); + } + } else { + errorMessage(t('quillsenseSetting.saveError')); + } + } catch (e: unknown) { + if (e instanceof Error) { + errorMessage(e.message); + } + } + } + + if (isLoading) { + return ( +
+
+
+ ); + } + + return ( +
+
+ setQuillsenseEnabled(checked)} + /> + } + /> +

+ {t('quillsenseSetting.enableDescription')} +

+
+ +
+ ): void => setAdvancedPrompt(e.target.value)} + placeholder={t('quillsenseSetting.advancedPromptPlaceholder')} + /> + } + /> +

+ {t('quillsenseSetting.advancedPromptDescription')} +

+
+
+ ); +}); + +export default QuillSenseSetting; diff --git a/components/form/ToggleSwitch.tsx b/components/form/ToggleSwitch.tsx new file mode 100644 index 0000000..e263ae6 --- /dev/null +++ b/components/form/ToggleSwitch.tsx @@ -0,0 +1,59 @@ +'use client'; + +import {Dispatch, SetStateAction} from 'react'; + +interface ToggleSwitchProps { + enabled: boolean; + setEnabled: Dispatch>; + label?: string; + description?: string; + disabled?: boolean; +} + +export default function ToggleSwitch({ + enabled, + setEnabled, + label, + description, + disabled = false +}: ToggleSwitchProps) { + function handleToggle(): void { + if (!disabled) { + setEnabled(!enabled); + } + } + + return ( +
+
+ {label && ( + {label} + )} + {description && ( + {description} + )} +
+ +
+ ); +} diff --git a/lib/models/QuillSenseSettings.ts b/lib/models/QuillSenseSettings.ts new file mode 100644 index 0000000..dcf3e51 --- /dev/null +++ b/lib/models/QuillSenseSettings.ts @@ -0,0 +1,4 @@ +export interface QuillSenseSettingsProps { + quillsenseEnabled: boolean; + advancedPrompt: string | null; +}