// ───────────────────────────────────────────────────────────── // ABA HÁBITOS — Tracker semanal editorial // Grade 7 dias × 5 hábitos. Toque para marcar. // Persistente em localStorage. // ───────────────────────────────────────────────────────────── const { useState, useEffect } = React; // ── HÁBITOS PADRÃO ─────────────────────────────────────────── // EDITAR: se quiser trocar/adicionar hábito, mexer aqui // label = nome curto que aparece na GRADE (pra caber sem quebrar feio) // resumo = nome completo que aparece no RESUMO de baixo (cai pro label se vazio) const HABITOS_DEFAULT = [ { id: "oracao", label: "Oração / Meditação", resumo: "Oração / Meditação" }, { id: "treino", label: "Treinos", resumo: "Treinos de força" }, { id: "estudo", label: "Estudar / Trabalhar", resumo: "Estudar / Trabalhar" }, { id: "sol", label: "Sol", resumo: "Sol 30 minutos" }, { id: "suple", label: "Suplementos / Manipulados", resumo: "Suplementos / Manipulados" }, { id: "agua", label: "Água", resumo: "Água" }, { id: "cardio", label: "Cardio", resumo: "Cardio 35 minutos" }, { id: "ajudar", label: "Ajudar alguém", resumo: "Ajudar alguém" }, { id: "sono", label: "Sono", resumo: "Sono 7 a 9 horas" }, ]; const DIAS_SEMANA = ["DOM","SEG","TER","QUA","QUI","SEX","SÁB"]; // Dom a Sáb // pega o DOMINGO da semana atual no formato YYYY-MM-DD (semana começa no domingo) function getMondayISO(d = new Date()) { const x = new Date(d); const day = x.getDay(); // 0=dom, 1=seg ... 6=sáb x.setDate(x.getDate() - day); // recua até o domingo x.setHours(0,0,0,0); return x.toISOString().slice(0,10); } function addDaysISO(iso, n) { const d = new Date(iso + "T00:00:00"); d.setDate(d.getDate() + n); return d.toISOString().slice(0,10); } function HabitosScreen({ t, onBack, onIniciarAnalise }) { // estado: { 'YYYY-MM-DD': ['sono','treino'] } const [data, setData] = useState(() => { try { return JSON.parse(localStorage.getItem("habitos_v1") || "{}"); } catch { return {}; } }); useEffect(() => { localStorage.setItem("habitos_v1", JSON.stringify(data)); }, [data]); const [weekStart, setWeekStart] = useState(() => getMondayISO()); // gaveta do tracker de hábitos (fechada por padrão) const [trackerOpen, setTrackerOpen] = useState(false); const dias = Array.from({ length: 7 }, (_, i) => addDaysISO(weekStart, i)); const hoje = new Date().toISOString().slice(0, 10); const isDone = (dia, hab) => (data[dia] || []).includes(hab); const toggle = (dia, hab) => { setData((d) => { const arr = d[dia] || []; const next = arr.includes(hab) ? arr.filter(x => x !== hab) : [...arr, hab]; return { ...d, [dia]: next }; }); }; // hábitos ativos/inativos — o usuário liga/desliga o que NÃO faz parte da rotina dele const [inativos, setInativos] = useState(() => { try { return new Set(JSON.parse(localStorage.getItem("habitos_inativos_v1") || "[]")); } catch { return new Set(); } }); useEffect(() => { localStorage.setItem("habitos_inativos_v1", JSON.stringify([...inativos])); }, [inativos]); const isAtivo = (id) => !inativos.has(id); const toggleAtivo = (id) => setInativos((prev) => { const n = new Set(prev); if (n.has(id)) n.delete(id); else n.add(id); return n; }); // resumo semanal (contagem simples de marcações na semana exibida) const totaisSemana = HABITOS_DEFAULT.map((h) => ({ ...h, ativo: isAtivo(h.id), done: dias.filter(d => isDone(d, h.id)).length, })); const ativosCount = totaisSemana.filter(x => x.ativo).length; const totalCelulas = ativosCount * 7; const feitas = totaisSemana.filter(x => x.ativo).reduce((s, x) => s + x.done, 0); const pct = totalCelulas ? Math.round((feitas / totalCelulas) * 100) : 0; // navegação semanal const prevWeek = () => setWeekStart((w) => addDaysISO(w, -7)); const nextWeek = () => setWeekStart((w) => addDaysISO(w, 7)); const goToday = () => setWeekStart(getMondayISO()); // label da semana const fmt = (iso) => { const d = new Date(iso + "T00:00:00"); return `${String(d.getDate()).padStart(2,"0")}/${String(d.getMonth()+1).padStart(2,"0")}`; }; const weekLabel = `${fmt(dias[0])} a ${fmt(dias[6])}`; return (
Estes são meus hábitos diários. Não sei se é segunda ou domingo, apenas sigo minha vida.
Toque para marcar o que você também cumpre!