'use client' import { useState, useEffect, useRef } from 'react' import { Presentation, X } from 'lucide-react' import { useLanguage } from '@/lib/i18n' import { toast } from 'sonner' import { useRouter } from 'next/navigation' const THEMES = [ 'auto', 'Architectural SaaS', 'Midnight Cathedral', 'Aurora Borealis', 'Tokyo Neon', 'Sunlit Gallery', 'Clinical Precision', 'Venture Pitch', 'Forest Floor', 'Steel & Glass', 'Cyberpunk Terminal', 'Editorial Ink', 'Coastal Morning', 'Paper Studio', ] const PURPOSES = [ { value: 'auto', key: 'ai.generate.purposeAuto' }, { value: 'course', key: 'ai.generate.purposeCourse' }, { value: 'board', key: 'ai.generate.purposeBoard' }, { value: 'project', key: 'ai.generate.purposeProject' }, { value: 'strategy', key: 'ai.generate.purposeStrategy' }, { value: 'pitch', key: 'ai.generate.purposePitch' }, { value: 'summary', key: 'ai.generate.purposeSummary' }, ] const STATUS_KEYS = [ 'notebook.slidesStatus1', 'notebook.slidesStatus2', 'notebook.slidesStatus3', 'notebook.slidesStatus4', ] export function NotebookSlidesDialog({ notebookId, notebookName, onClose, }: { notebookId: string notebookName: string onClose: () => void }) { const { t, language } = useLanguage() const router = useRouter() const [loading, setLoading] = useState(false) const [theme, setTheme] = useState('auto') const [purpose, setPurpose] = useState('auto') const [progress, setProgress] = useState(0) const timerRef = useRef>(null) useEffect(() => { return () => { if (timerRef.current) clearInterval(timerRef.current) } }, []) const handleGenerate = async () => { setLoading(true) setProgress(0) let elapsed = 0 timerRef.current = setInterval(() => { elapsed += 0.6 setProgress(() => { const target = 85 * (1 - Math.exp(-elapsed / 15)) return Math.min(target, 85) }) }, 600) try { const res = await fetch('/api/ai/notebook-slides', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ notebookId, theme, purpose, language: language === 'fr' ? 'fr' : 'en', }), }) const data = await res.json() if (timerRef.current) clearInterval(timerRef.current) setProgress(100) if (!res.ok) { toast.error( data.errorKey === 'ai.featureLocked' ? (t('ai.featureLocked') || 'Plan requis') : (data.error || 'Erreur'), ) } else if (data.success && data.canvasId) { window.dispatchEvent(new Event('ai-usage-changed')) toast.success(t('notebook.slidesReady') || `Présentation générée (${data.slideCount} slides)`) setTimeout(() => { router.push(`/lab?canvas=${data.canvasId}`) onClose() }, 400) } else { toast.error(data.errorKey ? t(data.errorKey) : (data.error || 'Erreur lors de la génération')) } } catch (e: any) { if (timerRef.current) clearInterval(timerRef.current) toast.error(e.message || 'Erreur') } finally { setLoading(false) } } const statusIdx = Math.min(Math.floor(progress / 22), STATUS_KEYS.length - 1) return (
e.stopPropagation()} >

{t('notebook.slides') || 'Présentation'}

{!loading && ( <>

{t('notebook.slidesDescription') || `Génère une présentation à partir des notes du carnet « ${notebookName} ».`}

{t('ai.generate.theme') || 'Thème'}
{t('ai.generate.purpose') || 'Type de deck'}
)} {loading && (
{t(STATUS_KEYS[statusIdx])} {Math.round(progress)}%
{STATUS_KEYS.map((_, i) => (
))}

{t('notebook.slidesGeneratingHint') || 'Outline + rédaction des slides'}

)}
) }