@@ -2652,7 +2652,7 @@ const NAV_PESSOAL = [
26522652 { id : "metas" , label : "Metas" , icon : Target } ,
26532653 { id : "categorias" , label : "Categorias" , icon : Tags } ,
26542654 { id : "relatorios" , label : "Relatórios" , icon : FileText } ,
2655- { id : "conta" , label : "Minha Conta" , icon : User } ,
2655+ { id : "conta" , label : "Conta" , icon : User } ,
26562656] ;
26572657const NAV_EMPRESA = [
26582658 { id : "dashboard" , label : "Dashboard" , icon : LayoutDashboard } ,
@@ -2666,16 +2666,24 @@ const NAV_EMPRESA = [
26662666 { id : "metas" , label : "Metas" , icon : Target } ,
26672667 { id : "categorias" , label : "Categorias" , icon : Tags } ,
26682668 { id : "relatorios" , label : "Relatórios" , icon : FileText } ,
2669- { id : "conta" , label : "Minha Conta" , icon : User } ,
2669+ { id : "conta" , label : "Conta" , icon : User } ,
26702670] ;
26712671
26722672// Aba "Minha Conta": mostra quem está logado, ONDE os dados ficam (nuvem x
26732673// aparelho) e o status do Telegram. Ajuda a entender por que o saldo pode
26742674// parecer diferente entre o computador e o celular.
2675- function PaginaConta ( { login, sessao, userId, onConectarTelegram, onSair } ) {
2675+ function PaginaConta ( { login, sessao, userId, onConectarTelegram, onLimparDados , onSair, showToast } ) {
26762676 const email = sessao ?. user ?. email || null ;
26772677 const naNuvem = ! ! sessao ;
26782678 const [ tg , setTg ] = useState ( undefined ) ; // undefined=carregando | null=não | obj=sim
2679+ const [ alvoLimpar , setAlvoLimpar ] = useState ( "pessoal" ) ; // qual espaço limpar
2680+ const [ confirmandoLimpar , setConfirmandoLimpar ] = useState ( false ) ;
2681+
2682+ function limpar ( ) {
2683+ onLimparDados ?. ( alvoLimpar ) ;
2684+ setConfirmandoLimpar ( false ) ;
2685+ showToast ?. ( `Dados ${ alvoLimpar === "empresarial" ? "empresariais" : "pessoais" } apagados.` ) ;
2686+ }
26792687
26802688 useEffect ( ( ) => {
26812689 let vivo = true ;
@@ -2767,6 +2775,76 @@ function PaginaConta({ login, sessao, userId, onConectarTelegram, onSair }) {
27672775 </ div >
27682776 </ div >
27692777
2778+ { /* Zona de perigo — limpar dados de um espaço */ }
2779+ < div className = "rounded-2xl border border-red-200 bg-white p-5 dark:border-red-900/60 dark:bg-slate-900" >
2780+ < h3 className = "flex items-center gap-2 text-sm font-bold text-red-600 dark:text-red-400" >
2781+ < Trash2 size = { 16 } /> Limpar dados
2782+ </ h3 >
2783+ < p className = "mt-1 text-sm text-slate-500 dark:text-slate-400" >
2784+ Apaga < b > todos</ b > os dados do espaço escolhido (lançamentos, metas, clientes,
2785+ fornecedores e centros de custo). As categorias voltam ao padrão. < b > Não dá pra desfazer.</ b >
2786+ </ p >
2787+
2788+ { /* escolher o espaço */ }
2789+ < div className = "mt-4 flex gap-2" >
2790+ { [
2791+ { id : "pessoal" , label : "Pessoal" , icon : User } ,
2792+ { id : "empresarial" , label : "Empresarial" , icon : Briefcase } ,
2793+ ] . map ( ( o ) => {
2794+ const ativo = alvoLimpar === o . id ;
2795+ return (
2796+ < button
2797+ key = { o . id }
2798+ onClick = { ( ) => {
2799+ setAlvoLimpar ( o . id ) ;
2800+ setConfirmandoLimpar ( false ) ;
2801+ } }
2802+ className = {
2803+ "flex flex-1 items-center justify-center gap-2 rounded-xl border px-3 py-2 text-sm font-medium transition " +
2804+ ( ativo
2805+ ? "border-red-400 bg-red-50 text-red-700 dark:border-red-700 dark:bg-red-950/50 dark:text-red-300"
2806+ : "border-slate-200 text-slate-500 hover:bg-slate-50 dark:border-slate-700 dark:text-slate-400 dark:hover:bg-slate-800" )
2807+ }
2808+ >
2809+ < o . icon size = { 15 } /> { o . label }
2810+ </ button >
2811+ ) ;
2812+ } ) }
2813+ </ div >
2814+
2815+ { /* ação + confirmação */ }
2816+ { ! confirmandoLimpar ? (
2817+ < button
2818+ onClick = { ( ) => setConfirmandoLimpar ( true ) }
2819+ className = "mt-3 flex w-full items-center justify-center gap-2 rounded-xl border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-400 dark:hover:bg-red-950/40"
2820+ >
2821+ < Trash2 size = { 15 } /> Limpar dados { alvoLimpar === "empresarial" ? "empresariais" : "pessoais" }
2822+ </ button >
2823+ ) : (
2824+ < div className = "mt-3 space-y-3 rounded-xl border border-red-300 bg-red-50 p-4 dark:border-red-800 dark:bg-red-950/40" >
2825+ < p className = "flex items-start gap-2 text-sm font-medium text-red-700 dark:text-red-300" >
2826+ < AlertTriangle size = { 16 } className = "mt-0.5 shrink-0" />
2827+ Tem certeza? Isso vai apagar < b > todos</ b > os dados{ " " }
2828+ < b > { alvoLimpar === "empresarial" ? "Empresariais" : "Pessoais" } </ b > de forma permanente.
2829+ </ p >
2830+ < div className = "flex gap-2" >
2831+ < button
2832+ onClick = { ( ) => setConfirmandoLimpar ( false ) }
2833+ className = "flex-1 rounded-xl border border-slate-300 px-4 py-2 text-sm font-medium text-slate-600 transition hover:bg-white dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-800"
2834+ >
2835+ Cancelar
2836+ </ button >
2837+ < button
2838+ onClick = { limpar }
2839+ className = "flex-1 rounded-xl bg-red-600 px-4 py-2 text-sm font-semibold text-white transition hover:bg-red-700"
2840+ >
2841+ Sim, apagar tudo
2842+ </ button >
2843+ </ div >
2844+ </ div >
2845+ ) }
2846+ </ div >
2847+
27702848 { onSair && (
27712849 < button
27722850 onClick = { onSair }
@@ -3078,6 +3156,13 @@ export default function App() {
30783156 setData ( ( prev ) => ( { ...prev , [ modo ] : fn ( prev [ modo ] ) } ) ) ;
30793157 }
30803158
3159+ // Apaga TODOS os dados de um espaço (pessoal OU empresarial) e devolve as
3160+ // categorias ao padrão. O auto-save cuida do resto (backup local + nuvem).
3161+ function limparEspaco ( modoAlvo ) {
3162+ dirtyRef . current = true ;
3163+ setData ( ( prev ) => ( { ...prev , [ modoAlvo ] : espacoVazio ( modoAlvo ) } ) ) ;
3164+ }
3165+
30813166 const acoesTransacao = {
30823167 salvar : ( t ) =>
30833168 atualizarEspaco ( ( esp ) => ( {
@@ -3709,7 +3794,9 @@ export default function App() {
37093794 sessao = { sessao }
37103795 userId = { userId }
37113796 onConectarTelegram = { ( ) => setMostrarTelegram ( true ) }
3797+ onLimparDados = { limparEspaco }
37123798 onSair = { sair }
3799+ showToast = { showToast }
37133800 />
37143801 ) }
37153802 </ >
0 commit comments