import { useEffect, useState } from 'react'; import { ApiError } from '@/api'; import { MESSAGE_MAX_LENGTH } from '@/api/schema'; import { Btn } from '@/components/ui'; import { cx } from '@/lib/cx'; import { messageDateLabel } from '@/lib/slotTimeline'; import { useNowMinutes } from '@/lib/useNowMinutes'; import { t } from '@/i18n'; /** * Saisie d'un message montré aux bénévoles — celui de l'organisation * (coordination, `ConfigMessage`) ou celui d'un poste (référent, * `MobileLeadPage`). Enregistré sur demande ; vider le champ retire le * message. */ export function MessageEditor({ value, updatedAt, placeholder, saving, error, onSave, dark = false, }: { value: string | null; updatedAt: string | null; placeholder: string; saving: boolean; error: unknown; onSave: (text: string) => Promise; /** Sur fond sombre (en-tête de l'écran référent). */ dark?: boolean; }) { const [draft, setDraft] = useState(value ?? ''); const [saved, setSaved] = useState(false); const now = useNowMinutes(); // Le message enregistré change (autre poste choisi, autre appareil) : // le brouillon repart de lui. useEffect(() => setDraft(value ?? ''), [value]); const dirty = draft.trim() !== (value ?? ''); const tooLong = draft.length > MESSAGE_MAX_LENGTH; return (