// 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 (
{ if(e.target===e.currentTarget) cancel(); }}>
{/* LEFT */}
Website Settings
Church Name set('name',e.target.value)} />
Upload Church Logo
Welcome Background Image
Users & Access
Theme Color
{themes.map(t=>(
pickTheme(t.id)}> {t.swatches.map((c,n)=>)}
))}
{(themes.find(t=>t.id===draft.themeId)||{}).name}
Slides
set('slidesName',e.target.value)} placeholder="Presentation title" />
{(draft.slideImages && draft.slideImages.length>0) ? (
{draft.slideImages.map((s,i)=>(
{s.name} {i+1}
))}
{draft.slideImages.length} slide{draft.slideImages.length>1?'s':''} uploaded
) : (
Upload slide images (PNG/JPG, multiple allowed). They appear in the Slides tab with play controls. Tip: export your PowerPoint/Canva slides as images.
)}
Youtube Account
User Name set('ytUser',e.target.value)} placeholder="account@gmail.com" />
Password set('ytPass',e.target.value)} placeholder={'\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022'} />
Sign in from the Hymns tab. Once this browser is signed into the account, a Premium account plays hymns ad-free.
{/* RIGHT — Hymns editor */}
Hymns
Title
Youtube Links
{draft.hymns.map((h,i)=>( setHymn(i,'title',e.target.value)} /> setHymn(i,'url',e.target.value)} /> ))}
{/* FOOTER */}
); } window.SettingsModal = SettingsModal;