// ============================================================
// JuFlow — Configurações
// ============================================================
const { useState: useStCF } = React;
const UCF = window.JFUtils;
const Configuracoes = ({ addToast }) => {
const [tab, setTab] = useStCF('empresa');
const [empresa, setEmpresa] = useStCF({
nome: 'Studio JuFlow', cnpj: '12.345.678/0001-90',
email: 'contato@juflow.com', telefone: '(11) 3000-0000',
endereco: 'Rua das Flores, 123, Jardins, São Paulo - SP',
descricao: 'Estúdio de bem-estar e estética com foco em resultados e experiência premium.',
});
const [horarios, setHorarios] = useStCF({
0: { open:false, start:'09:00', end:'17:00' },
1: { open:true, start:'08:00', end:'19:00' },
2: { open:true, start:'08:00', end:'19:00' },
3: { open:true, start:'08:00', end:'19:00' },
4: { open:true, start:'08:00', end:'19:00' },
5: { open:true, start:'08:00', end:'19:00' },
6: { open:true, start:'09:00', end:'17:00' },
});
const [cores, setCores] = useStCF({ primary:'#0A1F44', accent:'#FF6B35' });
const [lembretes, setLembretes] = useStCF({ whatsapp24h:true, whatsapp1h:false, email24h:true });
const [categories, setCategories] = useStCF(['Massagem','Estética','Fisioterapia','Nutrição','Fitness','Beleza','Podologia']);
const [catModal, setCatModal] = useStCF({ open:false, mode:'create', original:'', value:'' });
const [catConfirm, setCatConfirm] = useStCF({ open:false, name:'' });
const DAYS = ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'];
const USERS = [
{ id:1, name:'Admin Demo', email:'demo@juflow.com', role:'Admin', status:'active' },
{ id:2, name:'Dra. Ana Beatriz', email:'ana@clinica.com', role:'Profissional', status:'active' },
{ id:3, name:'Carla Mendes', email:'carla@clinica.com', role:'Profissional', status:'active' },
{ id:4, name:'Recepcionista', email:'recepcao@clinica.com', role:'Recepção', status:'active' },
];
const openCreateCat = () => setCatModal({ open:true, mode:'create', original:'', value:'' });
const openEditCat = (name) => setCatModal({ open:true, mode:'edit', original:name, value:name });
const closeCatModal = () => setCatModal(m => ({ ...m, open:false }));
const saveCat = () => {
const v = catModal.value.trim();
if (!v) { addToast('Informe um nome para a categoria.', 'warning'); return; }
if (catModal.mode === 'create') {
if (categories.some(c => c.toLowerCase() === v.toLowerCase())) {
addToast('Já existe uma categoria com esse nome.', 'warning'); return;
}
setCategories(cs => [...cs, v]);
addToast(`Categoria "${v}" adicionada!`, 'success');
} else {
if (v !== catModal.original && categories.some(c => c.toLowerCase() === v.toLowerCase())) {
addToast('Já existe uma categoria com esse nome.', 'warning'); return;
}
setCategories(cs => cs.map(c => c === catModal.original ? v : c));
addToast(`Categoria atualizada para "${v}".`, 'success');
}
closeCatModal();
};
const askDeleteCat = (name) => setCatConfirm({ open:true, name });
const confirmDeleteCat = () => {
setCategories(cs => cs.filter(c => c !== catConfirm.name));
addToast(`Categoria "${catConfirm.name}" excluída.`, 'success');
};
const setHorario = (day, key, val) => setHorarios(h => ({ ...h, [day]: { ...h[day], [key]: val } }));
const setEmpresaField = (k, v) => setEmpresa(e => ({ ...e, [k]: v }));
const handleSave = () => addToast('Configurações salvas com sucesso!', 'success');
return (
{tab === 'empresa' && (
)}
{tab === 'horarios' && (
Horário de Funcionamento
{DAYS.map((day, i) => (
setHorario(i,'open',!horarios[i].open)}
style={{ width:38, height:20, borderRadius:10, background:horarios[i].open?'#FF6B35':'#D1D5DB', position:'relative', cursor:'pointer', transition:'background .2s', flexShrink:0 }}
>
{day}
{horarios[i].open ? (
setHorario(i,'start',e.target.value)} style={{ padding:'5px 8px', borderRadius:6, border:'1px solid #E2E8F0', fontSize:12, color:'#0A1F44', outline:'none' }} />
até
setHorario(i,'end',e.target.value)} style={{ padding:'5px 8px', borderRadius:6, border:'1px solid #E2E8F0', fontSize:12, color:'#0A1F44', outline:'none' }} />
) : (
Fechado
)}
))}
Salvar Horários
)}
{tab === 'usuarios' && (
Usuários do Sistema
addToast('Convite enviado!','success')}>Convidar usuário
{['Usuário','E-mail','Perfil','Status','Ações'].map(h=>(
{h}
))}
{USERS.map((u,i) => (
{u.email}
{u.role}
addToast('Edição em breve!','info')}>Editar
))}
)}
{tab === 'aparencia' && (
Personalização Visual
{[
{ label:'Cor Primária', key:'primary', presets:['#0A1F44','#1E3A5F','#064E3B','#312E81','#7C2D12'] },
{ label:'Cor de Acento', key:'accent', presets:['#FF6B35','#F59E0B','#10B981','#3B82F6','#8B5CF6'] },
].map(({label,key,presets}) => (
{label}
{presets.map(c => (
setCores(co=>({...co,[key]:c}))} style={{
width:32, height:32, borderRadius:8, background:c, border:`3px solid ${cores[key]===c?'#0A1F44':'transparent'}`,
cursor:'pointer', boxShadow:'0 2px 6px rgba(0,0,0,.2)', transition:'transform .15s',
}}
onMouseEnter={e=>e.currentTarget.style.transform='scale(1.15)'}
onMouseLeave={e=>e.currentTarget.style.transform='scale(1)'}
/>
))}
setCores(co=>({...co,[key]:e.target.value}))} style={{ width:32, height:32, borderRadius:8, border:'1px solid #E2E8F0', cursor:'pointer', padding:2 }} />
))}
{/* Preview */}
Preview
Botão Primário
Botão de Acento
Texto Primário
Link de Destaque
Aplicar Aparência
)}
{tab === 'lembretes' && (
Lembretes Automáticos
{[
{ key:'whatsapp24h', label:'WhatsApp — 24h antes', desc:'Enviar mensagem de lembrete um dia antes do atendimento', icon:'MessageCircle', color:'#25D366' },
{ key:'whatsapp1h', label:'WhatsApp — 1h antes', desc:'Enviar mensagem de lembrete uma hora antes do atendimento', icon:'MessageCircle', color:'#25D366' },
{ key:'email24h', label:'E-mail — 24h antes', desc:'Enviar e-mail de confirmação um dia antes do atendimento', icon:'Mail', color:'#0891B2' },
].map(item => (
setLembretes(l=>({...l,[item.key]:!l[item.key]}))}
style={{ width:42,height:22,borderRadius:11,background:lembretes[item.key]?'#FF6B35':'#D1D5DB',position:'relative',cursor:'pointer',transition:'background .2s',flexShrink:0 }}
>
))}
Salvar Configurações
)}
{tab === 'categorias' && (
Categorias de Serviço
{categories.map(cat => (
{cat}
({window.JF.SERVICES.filter(s=>s.category===cat).length} serviços)
openEditCat(cat)} style={{ width:30,height:30,borderRadius:8,border:'1px solid #E2E8F0',background:'#fff',cursor:'pointer',display:'flex',alignItems:'center',justifyContent:'center',transition:'all .15s' }}
onMouseEnter={e=>{ e.currentTarget.style.background='#EFF6FF'; e.currentTarget.style.borderColor='#3B82F6'; }}
onMouseLeave={e=>{ e.currentTarget.style.background='#fff'; e.currentTarget.style.borderColor='#E2E8F0'; }}
>
askDeleteCat(cat)} style={{ width:30,height:30,borderRadius:8,border:'1px solid #E2E8F0',background:'#fff',cursor:'pointer',display:'flex',alignItems:'center',justifyContent:'center',transition:'all .15s' }}
onMouseEnter={e=>{ e.currentTarget.style.background='#FEF2F2'; e.currentTarget.style.borderColor='#EF4444'; }}
onMouseLeave={e=>{ e.currentTarget.style.background='#fff'; e.currentTarget.style.borderColor='#E2E8F0'; }}
>
))}
{categories.length === 0 && (
Nenhuma categoria cadastrada.
)}
Nova Categoria
Cancelar
Salvar
>}
>
setCatModal(m => ({ ...m, value: v }))}
icon="Tag"
autoFocus
onKeyDown={e => { if (e.key === 'Enter') saveCat(); }}
/>
setCatConfirm(c => ({ ...c, open:false }))}
onConfirm={confirmDeleteCat}
title="Excluir categoria"
message={`Tem certeza que deseja excluir a categoria "${catConfirm.name}"? Os serviços associados não serão removidos, mas ficarão sem categoria.`}
confirmLabel="Excluir"
danger
/>
)}
);
};
Object.assign(window, { Configuracoes });