'use client' /** * Couverture sous le titre (full-page). * - Affichée uniquement si une image de couverture est **explicite** (pas auto depuis le corps). * - Permet de retirer la couverture sans supprimer les images du contenu. * - Permet de choisir parmi les images de la note (corps + galerie). */ import { useState } from 'react' import { ImageIcon, X, Check, Images } from 'lucide-react' import { useLanguage } from '@/lib/i18n' import { cn } from '@/lib/utils' interface NoteCoverHeroProps { /** URL de couverture explicite (note.images[0]), null = pas de couverture */ coverUrl: string | null /** Candidats (images du contenu + galerie) pour le sélecteur */ candidates: string[] readOnly?: boolean title?: string onSetCover: (url: string) => void onClearCover: () => void } export function NoteCoverHero({ coverUrl, candidates, readOnly, title, onSetCover, onClearCover, }: NoteCoverHeroProps) { const { t } = useLanguage() const [pickerOpen, setPickerOpen] = useState(false) const uniqueCandidates = Array.from(new Set(candidates.filter(Boolean))) const hasCover = Boolean(coverUrl) const canPick = !readOnly && uniqueCandidates.length > 0 // Rien à montrer : pas de cover et pas de candidats (ou lecture seule sans cover) if (!hasCover && (readOnly || uniqueCandidates.length === 0)) { return null } // Pas de cover mais des images dans la note → barre discrète pour en choisir une if (!hasCover && canPick) { return (
{t('notes.coverNoneHint') || 'Aucune image de couverture — choisissez une image de la note ou laissez vide.'}
{pickerOpen && ( { onSetCover(url) setPickerOpen(false) }} onClose={() => setPickerOpen(false)} t={t} /> )}
) } if (!hasCover || !coverUrl) return null return (
{title {!readOnly && (
{uniqueCandidates.length > 1 && ( )}
)} {pickerOpen && !readOnly && (
{ onSetCover(url) setPickerOpen(false) }} onClose={() => setPickerOpen(false)} t={t} dark />
)}
) } function CoverPicker({ candidates, selected, onSelect, onClose, t, dark, }: { candidates: string[] selected: string | null onSelect: (url: string) => void onClose: () => void t: (key: string) => string dark?: boolean }) { return (

{t('notes.coverPickLabel') || 'Image de couverture'}

{candidates.map((url) => { const isSelected = selected === url return ( ) })}
) }