Skip to content

Commit 795f96f

Browse files
Thales-Chagasclaude
andcommitted
Aba Conta: renomeia e adiciona "Limpar dados" (pessoal/empresarial)
- Nav "Minha Conta" -> "Conta". - Zona de perigo na aba Conta: escolhe o espaco (Pessoal ou Empresarial) e apaga TODOS os dados dele (lancamentos, metas, clientes, fornecedores, centros) com confirmacao em 2 passos. Categorias voltam ao padrao. Reusa o auto-save (local + nuvem). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 6bee797 commit 795f96f

1 file changed

Lines changed: 90 additions & 3 deletions

File tree

src/App.jsx

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
];
26572657
const 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

Comments
 (0)