diff --git a/src/entities/report/api.ts b/src/entities/report/api.ts index 520fcc9..fc6b9bf 100644 --- a/src/entities/report/api.ts +++ b/src/entities/report/api.ts @@ -42,3 +42,18 @@ export function correctEo(payload: CorrectEoPayload): Promise { timeoutMs: CORRECTION_TIMEOUT_MS, }) } + +const IDEES_TIMEOUT_MS = 15_000 + +/** + * Récupère 5 suggestions d'idées DeepSeek pour prolonger la rédaction en cours. + * Endpoint : `POST /sujets/idees`. Tâche G5. + * Contraintes backend : sujet_consigne non vide + contenu_partiel ≥ 30 mots. + */ +export function getIdees(consigne: string, contenu: string): Promise { + return apiFetch<{ idees: string[] }>('/sujets/idees', { + method: 'POST', + body: { sujet_consigne: consigne, contenu_partiel: contenu }, + timeoutMs: IDEES_TIMEOUT_MS, + }).then((res) => res.idees) +} diff --git a/src/features/simulations/hooks/useIdees.ts b/src/features/simulations/hooks/useIdees.ts new file mode 100644 index 0000000..d0cd75a --- /dev/null +++ b/src/features/simulations/hooks/useIdees.ts @@ -0,0 +1,33 @@ +/** + * Hook — suggestions d'idées DeepSeek pour prolonger une rédaction en cours. + * + * Tâche G5 : mutation sur POST /sujets/idees. Retourne les idées, l'état + * de chargement, l'erreur API et un `reset()` pour vider le cache de la + * mutation (appelé à la fermeture du modal côté composant). + * + * Règle H : aucune logique métier — la garde `hasAccess(plan, 'tips')` + * est appliquée dans SimulationForm (UX), jamais ici. + */ + +import { useMutation } from '@tanstack/react-query' +import { getIdees } from '@/entities/report/api' +import type { ApiError } from '@/shared/types/api' + +interface FetchIdeesVariables { + consigne: string + contenu: string +} + +export function useIdees() { + const mutation = useMutation({ + mutationFn: ({ consigne, contenu }) => getIdees(consigne, contenu), + }) + + return { + idees: mutation.data ?? null, + isLoading: mutation.isPending, + error: mutation.error as ApiError | null, + fetchIdees: (variables: FetchIdeesVariables) => mutation.mutate(variables), + reset: mutation.reset, + } +}