import React, {JSX, useContext, useState} from "react"; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import {AISynonyms, SynonymAI, SynonymsAIResponse} from "@/lib/types/quillsense"; import {apiPost} from '@/lib/api/client'; import {ArrowLeftRight, Search} from "lucide-react"; import {useTranslations} from '@/lib/i18n'; import {LangContext, LangContextProps} from "@/context/LangContext"; import SearchInputWithSelect from "@/components/form/SearchInputWithSelect"; 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 Synonyms({hasKey}: { hasKey: boolean }): JSX.Element { const t = useTranslations(); const {session}: SessionContextProps = useContext(SessionContext); const {lang}: LangContextProps = useContext(LangContext); const {errorMessage}: AlertContextProps = useContext(AlertContext); const {setTotalCredits, setTotalPrice}: AIUsageContextProps = useContext(AIUsageContext); const [type, setType] = useState('synonymes') const [wordToCheck, setWordToCheck] = useState('') const [inProgress, setInProgress] = useState(false); const [aiResponse, setAiResponse] = useState(null) async function handleSearch(): Promise { if (wordToCheck.trim() === '') { errorMessage(t("synonyms.enterWordError")); return; } setInProgress(true); try { const response: AISynonyms = await apiPost(`quillsense/synonyms`, { word: wordToCheck, type: type }, session.accessToken, lang); if (!response) { errorMessage(t("synonyms.errorNoResponse")); return; } if (response.useYourKey) { setTotalPrice((prevState: number): number => prevState + response.totalPrice) } else { setTotalCredits(response.totalPrice) } setAiResponse(response.data); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t("synonyms.errorUnknown")); } } finally { setInProgress(false); } } if (!hasKey) { return ; } return (
): void => { if (e.key === 'Enter') { handleSearch(); } }} />
{inProgress && ( )} {!inProgress && aiResponse && aiResponse.words.length > 0 && (

{type === 'synonymes' ? t("synonyms.resultSynonyms", {word: wordToCheck}) : t("synonyms.resultAntonyms", {word: wordToCheck})}

{aiResponse.words.map((item: SynonymAI, index: number): React.JSX.Element => (
{item.word}
{item.context}
))}
)} {!inProgress && (!aiResponse || aiResponse.words.length === 0) && ( )}
); }