// Settings modal — Website Settings + Slides + YouTube Account (left), Hymns editor (right). function SettingsModal({ config, themes, onSave, onClose, accounts, setAccounts, currentUser }){ const [draft, setDraft] = React.useState(()=>JSON.parse(JSON.stringify(config))); const set = (k,v)=> setDraft(d=>({ ...d, [k]:v })); // live theme preview; revert on cancel function pickTheme(id){ set('themeId', id); const t = themes.find(x=>x.id===id); if(t) window.applyTheme(t); } function cancel(){ const t = themes.find(x=>x.id===config.themeId); if(t) window.applyTheme(t); onClose(); } function clearAll(){ setDraft(d=>({ ...d, name:'', logo:'', welcomeBg:'', admins:'', users:'', slidesName:'', slideImages:[], ytUser:'', ytPass:'', hymns: d.hymns.map(h=>({ title:h.title, url:'' })) })); } function fileName(e, key){ const f = e.target.files && e.target.files[0]; if(f) set(key, f.name); } function setHymn(i, field, val){ setDraft(d=>{ const h = d.hymns.map(x=>({...x})); h[i][field]=val; return { ...d, hymns:h }; }); } function addHymn(){ setDraft(d=>({ ...d, hymns:[...d.hymns, { title:'New Hymn', url:'' }] })); } function removeHymn(i){ setDraft(d=>({ ...d, hymns: d.hymns.filter((_,n)=>n!==i) })); } function onSlidesPick(e){ const files = Array.from(e.target.files || []); if(!files.length) return; Promise.all(files.map(f => new Promise(res => { const r = new FileReader(); r.onload = () => res({ name: f.name, url: r.result }); r.readAsDataURL(f); }))).then(imgs => { setDraft(d => ({ ...d, slideImages: [...(d.slideImages||[]), ...imgs], slidesName: d.slidesName || files[0].name.replace(/\.[^.]+$/, '') })); }); e.target.value = ''; } function removeSlide(i){ setDraft(d => ({ ...d, slideImages: (d.slideImages||[]).filter((_,n)=>n!==i) })); } function clearSlides(){ setDraft(d => ({ ...d, slideImages: [] })); } return (