import React from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; import { useQueryClient } from "@tanstack/react-query"; import { useSubmitIdea, useListIdeas, useGetIdeaStats, useGetSynthesis, getListIdeasQueryKey, getGetIdeaStatsQueryKey, } from "@workspace/api-client-react"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Textarea } from "@/components/ui/textarea"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Loader2, PenTool, CheckCircle2, Info, AlertCircle, TrendingUp, Users, Scale, Share2, Printer, Copy, } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; const submitIdeaSchema = z.object({ content: z.string() .min(10, "Votre contribution doit faire au moins 10 caractères.") .max(1000, "Merci de rester sous 1 000 caractères."), author: z.string().max(100).optional(), }); type SubmitIdeaValues = z.infer; const VALEURS = [ { source: "DUDH — Art. 1 (ONU, 1948)", texte: "Tous les êtres humains naissent libres et égaux en dignité et en droits.", }, { source: "DUDH — Art. 19", texte: "Tout individu a droit à la liberté d'opinion et d'expression.", }, { source: "DUDH — Art. 20", texte: "Tout appel à la haine nationale, raciale ou religieuse constituant une incitation à la discrimination, à l'hostilité ou à la violence est interdit par la loi.", }, { source: "PIDCP — Art. 20 (ONU, 1966)", texte: "Tout appel à la haine nationale, raciale ou religieuse qui constitue une incitation à la discrimination, à l'hostilité ou à la violence est interdit par la loi.", }, { source: "CEDH — Art. 10 (Conseil de l'Europe, 1950)", texte: "Toute personne a droit à la liberté d'expression, sous réserve des restrictions nécessaires à la protection des droits d'autrui.", }, { source: "CEDH — Art. 17", texte: "Aucune disposition de la Convention ne peut être interprétée comme impliquant le droit de se livrer à une activité visant à la destruction des droits reconnus.", }, { source: "Charte des droits fondamentaux de l'UE — Art. 1 (2000)", texte: "La dignité humaine est inviolable. Elle doit être respectée et protégée.", }, ]; export default function Home() { const queryClient = useQueryClient(); const { toast } = useToast(); const [submitResult, setSubmitResult] = React.useState<{ success: boolean; message: string; reason?: string; } | null>(null); const submitIdea = useSubmitIdea(); const { data: ideas, isLoading: isLoadingIdeas } = useListIdeas(); const { data: stats } = useGetIdeaStats(); const { data: synthesis, isLoading: isLoadingSynthesis } = useGetSynthesis({ query: { refetchInterval: 15000 }, }); const handleShare = () => { if (!synthesis?.text) return; const date = format(new Date(), "d MMMM yyyy 'à' HH:mm", { locale: fr }); const nb = synthesis.ideaCount ?? 0; const shareText = `La Voix du Peuple — Synthèse citoyenne\nGénérée le ${date}\n\n${synthesis.text}\n\n(${nb} contribution${nb !== 1 ? "s" : ""} intégrée${nb !== 1 ? "s" : ""})\n\nhttps://lavoixdupeuple.fr`; if (navigator.share) { navigator.share({ title: "La Voix du Peuple — Synthèse", text: shareText }); } else { navigator.clipboard.writeText(shareText).then(() => { toast({ description: "Texte copié dans le presse-papier ✓" }); }); } }; const handlePrint = () => { if (!synthesis?.text) return; const date = format(new Date(), "d MMMM yyyy 'à' HH:mm", { locale: fr }); const nb = synthesis.ideaCount ?? 0; const safe = (s: string) => s.replace(/&/g, "&").replace(//g, ">"); const html = ` La Voix du Peuple — Synthèse

La Voix du Peuple — Synthèse citoyenne

Générée le ${safe(date)}  ·  ${nb} contribution${nb !== 1 ? "s" : ""} intégrée${nb !== 1 ? "s" : ""}
${safe(synthesis.text)}
`; const w = window.open("", "_blank"); if (w) { w.document.write(html); w.document.close(); w.onload = () => w.print(); } }; const form = useForm({ resolver: zodResolver(submitIdeaSchema), defaultValues: { content: "", author: "" }, }); const onSubmit = (data: SubmitIdeaValues) => { setSubmitResult(null); submitIdea.mutate({ data }, { onSuccess: (result) => { if (result.accepted) { setSubmitResult({ success: true, message: "Votre contribution a été ajoutée à la synthèse.", }); form.reset(); } else { setSubmitResult({ success: false, message: "Cette contribution n'a pas pu être intégrée : elle n'est pas compatible avec le cadre de modération de cette plateforme.", reason: result.reason ?? undefined, }); } queryClient.invalidateQueries({ queryKey: getListIdeasQueryKey() }); queryClient.invalidateQueries({ queryKey: getGetIdeaStatsQueryKey() }); }, onError: () => { setSubmitResult({ success: false, message: "Une erreur est survenue lors de l'envoi. Veuillez réessayer.", }); }, }); }; return ( <> {/* Bandeau d'introduction */}

La Voix du Peuple recueille vos propositions et les synthétise en un résumé clair, destiné à être transmis à vos élus. Exprimez-vous librement — chaque contribution est modérée selon le droit international des droits humains, puis intégrée au résumé collectif affiché à droite.

{/* Colonne gauche : formulaire + fil des idées */}

Vos propositions

Quelle mesure souhaiteriez-vous voir portée par vos représentants ?

( Votre idée