'use client' import { useState, useEffect } from 'react' import { Globe, X, Copy, Check, Loader2, ExternalLink } from 'lucide-react' import { useLanguage } from '@/lib/i18n' import { toast } from 'sonner' import { cn } from '@/lib/utils' import { copyTextToClipboard } from '@/lib/editor/copy-text-to-clipboard' interface PublishDialogProps { open: boolean onClose: () => void noteId: string noteTitle: string isPublic: boolean publicSlug: string | null } export function PublishDialog({ open, onClose, noteId, noteTitle, isPublic: initialPublic, publicSlug }: PublishDialogProps) { const { t } = useLanguage() const [isPublic, setIsPublic] = useState(initialPublic) const [slug, setSlug] = useState(publicSlug) const [loading, setLoading] = useState(false) const [copied, setCopied] = useState(false) useEffect(() => { setIsPublic(initialPublic); setSlug(publicSlug) }, [initialPublic, publicSlug]) if (!open) return null const publicUrl = slug ? `${window.location.origin}/p/${slug}` : '' const handlePublish = async () => { setLoading(true) try { const res = await fetch('/api/notes/publish', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ noteId, action: 'publish' }), }) const data = await res.json() if (res.ok && data.slug) { setIsPublic(true) setSlug(data.slug) if (data.moderation === 'flagged') { toast.success(t('richTextEditor.publishSuccess') || 'Note publiée !', { description: '⚠️ Un modérateur examinera le contenu sous peu.', }) } else { toast.success(t('richTextEditor.publishSuccess') || 'Note publiée !') } } else if (data.error === 'blocked') { toast.error(t('richTextEditor.publishBlocked') || 'Publication refusée', { description: data.reason || 'Le contenu ne respecte pas les règles de publication.', duration: 6000, }) } else { toast.error(data.error || 'Erreur') } } catch { toast.error('Erreur') } finally { setLoading(false) } } const handleUnpublish = async () => { setLoading(true) try { const res = await fetch('/api/notes/publish', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ noteId, action: 'unpublish' }), }) if (res.ok) { setIsPublic(false) setSlug(null) toast.success(t('richTextEditor.unpublishSuccess') || 'Note dépubliée') } else { toast.error('Erreur') } } catch { toast.error('Erreur') } finally { setLoading(false) } } const copyLink = async () => { const ok = await copyTextToClipboard(publicUrl) if (ok) { setCopied(true); setTimeout(() => setCopied(false), 2000); toast.success('Lien copié !') } } return (
e.stopPropagation()}>

{t('richTextEditor.publishTitle') || 'Publication publique'}

{t('richTextEditor.publishDesc') || 'Publiez cette note sur une URL publique. Tout le monde avec le lien pourra la lire.'}

{isPublic && slug ? (
{t('richTextEditor.publishLive') || 'En ligne'}
{publicUrl}
) : ( )}
) }