import React, {ChangeEvent, useContext, useEffect, useState} from "react"; import {SessionContext} from "@/context/SessionContext"; import {BookContext} from "@/context/BookContext"; import {ChapterContext} from "@/context/ChapterContext"; import {AlertContext} from "@/context/AlertContext"; import {AIInspire, InspirationAIIdea} from "@/lib/models/QuillSense"; import System from "@/lib/models/System"; import InputField from "@/components/form/InputField"; import TextInput from "@/components/form/TextInput"; import {faArrowRight, faLightbulb, faLink, faLock} from "@fortawesome/free-solid-svg-icons"; import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {useTranslations} from "next-intl"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {EditorContext} from "@/context/EditorContext"; import {AIUsageContext, AIUsageContextProps} from "@/context/AIUsageContext"; export default function InspireMe({hasKey}: { hasKey: boolean }) { const t = useTranslations(); const {session} = useContext(SessionContext); const {editor} = useContext(EditorContext); const {book} = useContext(BookContext); const {chapter} = useContext(ChapterContext); const {errorMessage} = useContext(AlertContext); const {lang} = useContext(LangContext); const {setTotalCredits, setTotalPrice} = useContext(AIUsageContext); const [prompt, setPrompt] = useState(''); const [hideHelp, setHideHelp] = useState(true); const [loading, setLoading] = useState(false); const [inspirations, setInspirations] = useState([]); useEffect((): void => { if (prompt.trim().length > 0) { setHideHelp(true); } else { setHideHelp(false); } }, [prompt]); async function handleInspireMe(): Promise { if (prompt.trim() === '') { errorMessage(t("inspireMe.emptyPromptError")); return; } setLoading(true); setInspirations([]); try { let content: string = ''; if (editor) { try { content = editor.getHTML(); content = System.htmlToText(content); } catch (e: unknown) { if (e instanceof Error) { errorMessage('Erreur lors de la récupération du contenu.'); console.error('Erreur lors de la récupération du contenu.'); } else { errorMessage('Erreur inconnue lors de la récupération du contenu.') console.error('Erreur inconnue lors de la récupération du contenu.'); } setLoading(false); return; } } if (!book?.bookId) { errorMessage('Aucun livre sélectionné.'); setLoading(false); return; } if (chapter?.chapterOrder === undefined) { errorMessage('Aucun chapitre sélectionné.'); setLoading(false); return; } const inspire: AIInspire = await System.authPostToServer( `quillsense/inspire`, { prompt: prompt, bookId: book.bookId, chapterOrder: chapter.chapterOrder, currentContent: content, }, session.accessToken, lang ) if (inspire.useYourKey) { setTotalPrice((prevState: number): number => prevState + inspire.totalPrice) } else { setTotalCredits(inspire.totalPrice) } setInspirations(inspire.data.ideas); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(`Une erreur inconnue est survenue lors de la génération.`); } } finally { setLoading(false); } } if (!hasKey) { return (

Accès requis

Un abonnement de niveau de base de QuillSense ou une clé API OpenAI est requis pour activer le mode "Inspire-moi".

); } return (
) => setPrompt(e.target.value)} placeholder={t("inspireMe.inputPlaceholder")} /> } icon={faLightbulb} fieldName={t("inspireMe.fieldName")} actionLabel={t("inspireMe.actionLabel")} actionIcon={faLightbulb} action={async () => handleInspireMe()} />
{loading && (

{t("inspireMe.loading")}

)} {!loading && inspirations.length > 0 && (

{t("inspireMe.resultHeading")}

{inspirations.map((idea, index) => (

{idea.idea}

{t("inspireMe.justificationHeading")}

{idea.reason}

{t("inspireMe.linkHeading")}
{idea.relatedTo}
))}
)} {!loading && inspirations.length === 0 && (

{t("inspireMe.emptyHeading")}

{t("inspireMe.emptyDescription")}

)}
); }