import { useState, useEffect } from 'react'; import { api } from '../utils/api.js'; import { useToast } from '../contexts/ToastContext.jsx'; export default function BrandingModal({ onClose }) { const toast = useToast(); const [settings, setSettings] = useState({}); const [appName, setAppName] = useState(''); const [loading, setLoading] = useState(false); const [resetting, setResetting] = useState(false); const [showResetConfirm, setShowResetConfirm] = useState(false); useEffect(() => { api.getSettings().then(({ settings }) => { setSettings(settings); setAppName(settings.app_name || 'jama'); }).catch(() => {}); }, []); const notifySidebarRefresh = () => window.dispatchEvent(new Event('jama:settings-changed')); const handleSaveName = async () => { if (!appName.trim()) return; setLoading(true); try { await api.updateAppName(appName.trim()); setSettings(prev => ({ ...prev, app_name: appName.trim() })); toast('App name updated', 'success'); notifySidebarRefresh(); } catch (e) { toast(e.message, 'error'); } finally { setLoading(false); } }; const handleLogoUpload = async (e) => { const file = e.target.files?.[0]; if (!file) return; if (file.size > 1024 * 1024) return toast('Logo must be less than 1MB', 'error'); try { const { logoUrl } = await api.uploadLogo(file); setSettings(prev => ({ ...prev, logo_url: logoUrl })); toast('Logo updated', 'success'); notifySidebarRefresh(); } catch (e) { toast(e.message, 'error'); } }; const handleReset = async () => { setResetting(true); try { await api.resetSettings(); const { settings: fresh } = await api.getSettings(); setSettings(fresh); setAppName(fresh.app_name || 'jama'); toast('Settings reset to defaults', 'success'); notifySidebarRefresh(); setShowResetConfirm(false); } catch (e) { toast(e.message, 'error'); } finally { setResetting(false); } }; return (
Square format, max 1MB. Used in sidebar, login page and browser tab.
This will reset the app name and logo to their install defaults. This cannot be undone.