import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {apiPost} from '@/lib/api/client'; import {ChangeEvent, JSX, useContext, useState} from "react"; import InputField from "@/components/form/InputField"; import {Languages, Search} from "lucide-react"; import TextInput from "@/components/form/TextInput"; import {LangContext, LangContextProps} from "@/context/LangContext"; import {useTranslations} from '@/lib/i18n'; import {AIVerbConjugation, ConjugationResponse, ConjugationTenses} from "@/lib/types/quillsense"; import {AIUsageContext, AIUsageContextProps} from "@/context/AIUsageContext"; import EmptyState from "@/components/ui/EmptyState"; import PulseLoader from "@/components/ui/PulseLoader"; import LockCard from "@/components/ui/LockCard"; export default function Conjugator({hasKey}: { hasKey: boolean }): JSX.Element { const {session}: SessionContextProps = useContext(SessionContext); const {errorMessage}: AlertContextProps = useContext(AlertContext); const {lang}: LangContextProps = useContext(LangContext); const t = useTranslations(); const {setTotalCredits, setTotalPrice}: AIUsageContextProps = useContext(AIUsageContext); const [verbToConjugate, setVerbToConjugate] = useState(''); const [inProgress, setInProgress] = useState(false); const [conjugationResponse, setConjugationResponse] = useState(null); async function handleConjugation(): Promise { if (verbToConjugate.trim() === '') { return; } setInProgress(true); try { const response: AIVerbConjugation = await apiPost( `quillsense/verb-conjugation`, {verb: verbToConjugate}, session.accessToken, lang ); if (!response) { errorMessage(t("conjugator.error.noResponse")); return; } if (response.useYourKey) { setTotalPrice((prevState: number): number => prevState + response.totalPrice) } else { setTotalCredits(response.totalPrice) } setConjugationResponse(response.data); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t("conjugator.error.unknown")); } } finally { setInProgress(false); } } function renderConjugationTable(tense: string, conjugations: ConjugationTenses[string]): JSX.Element { if (typeof conjugations === 'string') { return (
{conjugations}
); } if (typeof conjugations === 'object' && conjugations !== null) { const hasPersonConjugations: string | undefined = conjugations.firstPersonSingular || conjugations.secondPersonSingular || conjugations.thirdPersonSingular || conjugations.firstPersonPlural || conjugations.secondPersonPlural || conjugations.thirdPersonPlural; if (hasPersonConjugations) { return (

{tense}

{conjugations.firstPersonSingular && (
{t('conjugator.persons.je')} {conjugations.firstPersonSingular}
)} {conjugations.firstPersonPlural && (
{t('conjugator.persons.nous')} {conjugations.firstPersonPlural}
)} {conjugations.secondPersonSingular && (
{t('conjugator.persons.tu')} {conjugations.secondPersonSingular}
)} {conjugations.secondPersonPlural && (
{t('conjugator.persons.vous')} {conjugations.secondPersonPlural}
)} {conjugations.thirdPersonSingular && (
{t('conjugator.persons.il')} {conjugations.thirdPersonSingular}
)} {conjugations.thirdPersonPlural && (
{t('conjugator.persons.ils')} {conjugations.thirdPersonPlural}
)}
); } } return
; } function renderMode(mode: string, tenses: ConjugationTenses): JSX.Element { if (mode === 'infinitif' || mode === 'participe') { return (

{mode}

{Object.entries(tenses).map(([tense, conjugation]: [string, string | ConjugationTenses[string]]): JSX.Element => (

{tense}

{typeof conjugation === 'string' ? conjugation : ''}
))}
); } return (

{mode}

{Object.entries(tenses).map(([tense, conjugations]: [string, ConjugationTenses[string]]): JSX.Element => renderConjugationTable(tense, conjugations) )}
); } if (!hasKey) { return ; } return (
): void => setVerbToConjugate(e.target.value)} placeholder={t('conjugator.input.placeholder')} /> } icon={Languages} fieldName={t('conjugator.input.label')} actionLabel={t('conjugator.input.action')} actionIcon={Search} action={async (): Promise => handleConjugation()} />
{inProgress && ( )} {!inProgress && conjugationResponse && (

{verbToConjugate}

{Object.entries(conjugationResponse.conjugations).map(([mode, tenses]: [string, ConjugationTenses]): JSX.Element => renderMode(mode, tenses) )}
)} {!inProgress && !conjugationResponse && ( )}
); }