import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { api } from '../api/client'; import { useAuth } from '../contexts/AuthContext'; import { useToast } from '../contexts/ToastContext'; import { useOverlayLogo } from '../hooks/useOverlayLogo'; import { isOverlayColour, type OverlayBranding } from '../utils/overlayBranding'; export function OverlayBrandingControls({ value, onChange, onBusyChange }: { value: OverlayBranding; onChange: (value: OverlayBranding) => void; onBusyChange?: (busy: boolean) => void; }) { const { t } = useTranslation(); const { showToast } = useToast(); const { authEnabled, hasPermission } = useAuth(); const canEdit = !authEnabled || hasPermission('settings:update'); const [busy, setBusy] = useState(false); const [draft, setDraft] = useState({ from: value.from || '#00ae42', to: value.to || '#00ae42' }); const logo = useOverlayLogo(true, null, value.logoRevision); const saveLogo = async (file: File | null) => { setBusy(true); onBusyChange?.(true); try { if (file) await api.uploadOverlayLogo(file); else await api.deleteOverlayLogo(); onChange({ ...value, logo: file !== null, logoRevision: value.logoRevision + 1 }); } catch (error) { showToast(error instanceof Error ? error.message : t('streamOverlay.branding.failed'), 'error'); } finally { setBusy(false); onBusyChange?.(false); } }; const setColour = (key: 'from' | 'to', colour: string) => { setDraft((current) => ({ ...current, [key]: colour })); if (isOverlayColour(colour)) { onChange({ ...value, from: value.from || '#00ae42', to: value.to || '#00ae42', [key]: colour }); } }; return
; }