diff --git a/client/src/components/CguModal.tsx b/client/src/components/CguModal.tsx index 620dbea..6640dbe 100644 --- a/client/src/components/CguModal.tsx +++ b/client/src/components/CguModal.tsx @@ -9,7 +9,11 @@ interface CguModalProps { export default function CguModal({ onAccepted }: CguModalProps) { const [checked, setChecked] = useState(false); const acceptMutation = trpc.cgu.accept.useMutation({ - onSuccess: () => onAccepted(), + onSuccess: () => { + // Marquer l'acceptation pour cette session (réinitialisé à chaque fermeture de navigateur) + sessionStorage.setItem("sonum_cgu_accepted", "1"); + onAccepted(); + }, }); return ( diff --git a/client/src/components/RattacherSolutionModal.tsx b/client/src/components/RattacherSolutionModal.tsx index 1022bd2..236bacb 100644 --- a/client/src/components/RattacherSolutionModal.tsx +++ b/client/src/components/RattacherSolutionModal.tsx @@ -68,7 +68,7 @@ export default function RattacherSolutionModal({ etablissementId, etablissementN } const sol = await createSolutionMutation.mutateAsync({ nom: newSolutionNom, editeurId }); const editeurNom = editeursQuery.data?.find(e => e.id === editeurId)?.nom ?? newEditeurNom; - setSelectedSolution({ id: Number(sol), nom: newSolutionNom, editeurNom }); + setSelectedSolution({ id: sol as number, nom: newSolutionNom, editeurNom }); setStep(2); }; diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx index c4693a2..cfa31fc 100644 --- a/client/src/pages/Home.tsx +++ b/client/src/pages/Home.tsx @@ -46,10 +46,15 @@ export default function Home() { }; const cguQuery = trpc.cgu.status.useQuery(undefined, { enabled: isAuthenticated }); + // La CGU doit être acceptée à chaque nouvelle session (sessionStorage vidé à la fermeture du navigateur) + const [sessionCguAccepted, setSessionCguAccepted] = useState(() => + typeof window !== "undefined" && sessionStorage.getItem("sonum_cgu_accepted") === "1" + ); const blocsQuery = trpc.referentiel.blocsFonctionnels.useQuery(); const editeursQuery = trpc.referentiel.editeurs.useQuery(); const solutionsQuery = trpc.referentiel.solutions.useQuery({ search: searchText.length >= 2 ? searchText : undefined }); - const searchQuery = trpc.etablissements.search.useQuery(filters, { enabled: isAuthenticated && (cguQuery.data?.accepted ?? false) }); + const cguFullyAccepted = sessionCguAccepted && (cguQuery.data?.accepted ?? false); + const searchQuery = trpc.etablissements.search.useQuery(filters, { enabled: isAuthenticated && cguFullyAccepted }); const tracabiliteUtils = trpc.useUtils(); const recordConsultation = trpc.tracabilite.enregistrerConsultation.useMutation(); @@ -95,10 +100,10 @@ export default function Home() { ); } - if (!cguQuery.data?.accepted) { + if (!cguFullyAccepted) { return ( - cguQuery.refetch()} /> + { setSessionCguAccepted(true); cguQuery.refetch(); }} /> ); } diff --git a/server/db.ts b/server/db.ts index cdd4261..49bef8f 100644 --- a/server/db.ts +++ b/server/db.ts @@ -138,7 +138,9 @@ export async function createSolution(nom: string, editeurId: number, blocFonctio const db = await getDb(); if (!db) return null; const result = await db.insert(solutions).values({ nom, editeurId, blocFonctionnelId: blocFonctionnelId ?? null, estValide }); - return result[0]; + // result[0] est un ResultSetHeader MySQL, on retourne l'insertId directement + const insertId = (result[0] as any).insertId as number; + return insertId; } // ─── Établissements ─────────────────────────────────────────────────────────── diff --git a/server/routers.ts b/server/routers.ts index 84ae77a..811d441 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -108,8 +108,11 @@ export const appRouter = router({ return { success: true }; }), status: protectedProcedure.query(({ ctx }) => ({ + // La CGU doit être acceptée à chaque session (pas seulement la première fois) + // On retourne toujours les données réelles mais le frontend gère la session accepted: ctx.user.cguAccepted, acceptedAt: ctx.user.cguAcceptedAt, + userId: ctx.user.id, })), }),