// Grape Elevate — Settings screen function Settings({ t, lang }) { const [section, setSection] = React.useState('account'); const [notif, setNotif] = React.useState({ dm: true, weekly: true, team: false }); const [acct, setAcct] = React.useState({ name: 'Fabiano Studio', email: 'fabiano@grape.app', handle: '@fabiano.studio' }); const [saved, setSaved] = React.useState(false); const [integrations, setIntegrations] = React.useState({ Instagram: 'on', WhatsApp: 'off', Mailchimp: 'off', Zapier: 'on', 'Google Sheets': 'off', Webhook: 'off', }); const [integOpen, setIntegOpen] = React.useState(null); // name of integration or null const [toast, setToast] = React.useState(null); const showToast = (m) => { setToast(m); setTimeout(() => setToast(null), 1800); }; const sections = [ { k: 'account', label: t('set.account'), icon: }, { k: 'notif', label: t('set.notif'), icon: }, { k: 'integ', label: t('set.integ'), icon: }, { k: 'billing', label: t('set.billing'), icon: }, { k: 'team', label: t('set.team'), icon: }, { k: 'danger', label: t('set.danger'), icon: }, ]; const save = () => { setSaved(true); setTimeout(() => setSaved(false), 1600); }; return ( <>

{t('set.title')}

{t('set.subtitle')}

{section === 'account' && (

{t('set.account')}

setAcct({ ...acct, name: e.target.value })} />
setAcct({ ...acct, email: e.target.value })} />
setAcct({ ...acct, handle: e.target.value })} style={{ flex: 1 }} /> conectada
{saved &&
✓ Alterações salvas
}
)} {section === 'notif' && (

{t('set.notif')}

{[ { k: 'dm', l: t('set.notif.dm'), d: t('set.notif.dmDesc') }, { k: 'weekly', l: t('set.notif.weekly'), d: t('set.notif.weeklyDesc') }, { k: 'team', l: t('set.notif.team'), d: t('set.notif.teamDesc') }, ].map((row) => (
{row.l}
{row.d}
))}
)} {section === 'integ' && (

{t('set.integ')}

{[ { name: 'Instagram', desc: integrations.Instagram === 'on' ? 'Conta principal conectada' : 'Responda DMs, comentários e stories', emoji: '📷', color: 'var(--coral)' }, { name: 'WhatsApp', desc: 'Encaminhe leads quentes pro WhatsApp', emoji: '💬', color: 'var(--green)' }, { name: 'Mailchimp', desc: 'Crie listas a partir de leads', emoji: '📧', color: 'var(--sun)' }, { name: 'Zapier', desc: '5000+ apps via Zapier', emoji: '⚡', color: 'var(--cyan)' }, { name: 'Google Sheets', desc: 'Exporte leads automaticamente', emoji: '📊', color: 'var(--grape)' }, { name: 'Webhook', desc: 'POST personalizado pra qualquer URL', emoji: '🔗', color: 'var(--text-mute)' }, ].map((it) => { const on = integrations[it.name] === 'on'; return (
{it.emoji}
{it.name} {on && on}
{it.desc}
); })}
setIntegOpen(null)} onConnect={(name) => { setIntegrations((m) => ({ ...m, [name]: 'on' })); showToast(`${name} conectado 🎉`); }} onDisconnect={(name) => { setIntegrations((m) => ({ ...m, [name]: 'off' })); showToast(`${name} desconectado`); }} onSave={(name) => showToast(`${name}: configurações salvas`)} /> {toast &&
{toast}
}
)} {section === 'billing' && (

{t('set.billing')}

{t('set.plan.current')}
Grape Free
1.000 contatos · automações ilimitadas · 1 conta
R$ 0/mês
{[ { name: 'Starter', price: '29', desc: '5.000 contatos', feats: ['Inbox unificada', '1 conta Instagram', 'Suporte por e-mail'] }, { name: 'Pro', price: '79', desc: '25.000 contatos', popular: true, feats: ['Tudo do Starter', 'IA assistente', 'Equipe (3 lugares)', 'Webhooks'] }, { name: 'Business', price: '199', desc: 'Contatos ilimitados', feats: ['Tudo do Pro', 'Suporte prioritário', 'White-label', 'SLA 99.9%'] }, ].map((p) => (
{p.popular && ★ Recomendado}

{p.name}

R${p.price}/mês
{p.desc}
    {p.feats.map((f) =>
  • {f}
  • )}
))}

Todos os planos com 14 dias grátis. Cancele quando quiser.

)} {section === 'team' && (

{t('set.team')}

Convide colegas para responder DMs e editar fluxos.

{[ { n: 'Fabiano', e: 'fabiano@grape.app', role: 'Owner', hue: 285 }, { n: 'Bruna Tavares', e: 'bruna@grape.app', role: 'Editor', hue: 30 }, { n: 'Caio Mendes', e: 'caio@grape.app', role: 'Atendimento', hue: 200 }, ].map((m) => (
{m.n}
{m.e}
{m.role}
))}
)} {section === 'danger' && (

{t('set.danger')}

{t('set.delete')}
Apaga todas as automações, conversas e dados. Não pode ser desfeito.
)}
); } const setStyles = ` .set-shell { display: grid; grid-template-columns: 220px 1fr; gap: 18px; } @media (max-width: 900px) { .set-shell { grid-template-columns: 1fr; } } .set-nav { display: flex; flex-direction: column; gap: 2px; padding: 8px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow-card); height: fit-content; position: sticky; top: 24px; } .set-nav-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: 8px; background: transparent; border: 0; color: var(--text-soft); font-weight: 500; font-size: 13px; cursor: pointer; text-align: left; transition: background 120ms, color 120ms; } .set-nav-item:hover { background: var(--surface-2); color: var(--text); } .set-nav-item.active { background: color-mix(in oklch, var(--grape) 14%, var(--surface)); color: var(--text); box-shadow: inset 0 0 0 1px color-mix(in oklch, var(--grape) 25%, transparent); } .set-nav-item.danger { color: color-mix(in oklch, var(--coral) 80%, var(--text-soft)); margin-top: auto; } .set-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 24px; box-shadow: var(--shadow-card); display: flex; flex-direction: column; gap: 14px; } .set-card h3 { margin: 0 0 6px; font-size: 18px; letter-spacing: -0.01em; font-weight: 700; } .set-card .btn-primary { align-self: flex-start; } .set-field { display: flex; flex-direction: column; gap: 6px; max-width: 480px; } .set-field label { font-size: 12.5px; font-weight: 600; color: var(--text-soft); } .set-field .input { font-family: inherit; } .set-toggle-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 14px 0; border-top: 1px solid var(--line); } .set-toggle-row:first-of-type { border-top: 0; padding-top: 0; } .integ-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } @media (max-width: 800px) { .integ-grid { grid-template-columns: 1fr; } } .integ-card { display: flex; align-items: center; gap: 12px; padding: 12px; border: 1px solid var(--line); border-radius: 12px; background: var(--surface-2); } .integ-emoji { width: 40px; height: 40px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 20px; } .plan-current { display: flex; justify-content: space-between; align-items: flex-end; padding: 18px; border-radius: var(--radius); background: linear-gradient(135deg, color-mix(in oklch, var(--grape) 12%, var(--surface-2)) 0%, color-mix(in oklch, var(--cyan) 10%, var(--surface-2)) 100%); border: 1px solid var(--line); } .plan-name { font-size: 24px; font-weight: 800; letter-spacing: -0.02em; } .plan-price b { font-size: 24px; font-weight: 800; } .plan-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } @media (max-width: 900px) { .plan-grid { grid-template-columns: 1fr; } } .plan-card { padding: 18px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); display: flex; flex-direction: column; gap: 8px; position: relative; } .plan-card.popular { border-color: var(--grape); box-shadow: 0 0 0 4px color-mix(in oklch, var(--grape) 16%, transparent); } .plan-card h4 { margin: 0; font-size: 17px; font-weight: 700; } .plan-amount { display: flex; align-items: baseline; gap: 2px; } .plan-amount b { font-size: 32px; font-weight: 800; letter-spacing: -0.02em; } .plan-currency { font-size: 13px; color: var(--text-mute); } .plan-feats { list-style: none; padding: 0; margin: 6px 0; display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--text-soft); } .plan-feats li { display: flex; align-items: center; gap: 8px; } .plan-feats svg { color: var(--green); flex-shrink: 0; } .plan-card > .btn { margin-top: auto; } .plan-card .pill-pop { position: absolute; top: -10px; right: 14px; } .team-list { display: flex; flex-direction: column; gap: 6px; } .team-row { display: flex; align-items: center; gap: 12px; padding: 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-2); } .danger-card { border-color: color-mix(in oklch, var(--coral) 30%, var(--line)); } .danger-row { display: flex; justify-content: space-between; align-items: center; padding: 14px; border: 1px dashed color-mix(in oklch, var(--coral) 35%, transparent); border-radius: 12px; background: color-mix(in oklch, var(--coral) 6%, transparent); gap: 12px; } `; window.Settings = Settings;