feat(simulations): getIdees API + hook useIdees (G5)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hermann_Kitio 2026-04-21 03:09:01 +03:00
parent 555dac17e2
commit 67eb3411c5
2 changed files with 48 additions and 0 deletions

View file

@ -42,3 +42,18 @@ export function correctEo(payload: CorrectEoPayload): Promise<Report> {
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<string[]> {
return apiFetch<{ idees: string[] }>('/sujets/idees', {
method: 'POST',
body: { sujet_consigne: consigne, contenu_partiel: contenu },
timeoutMs: IDEES_TIMEOUT_MS,
}).then((res) => res.idees)
}

View file

@ -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<string[], ApiError, FetchIdeesVariables>({
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,
}
}