import React, { useState } from "react";
import { saveAs } from 'file-saver';
import jsPDF from 'jspdf';
import 'jspdf-autotable';
import './App.css'; // For extra custom styles like fonts, textures
export default function App() {
const [currentPage, setCurrentPage] = useState("Home");
// ================= PROFILES =================
const [profiles, setProfiles] = useState({ adults: [], kids: [], pets: [] });
// ================= CALENDAR =================
const [calendarEvents, setCalendarEvents] = useState([]);
// ================= DAILY PLANNER =================
const [dailyTasks, setDailyTasks] = useState([]);
// ================= CHORES & REWARDS =================
const [chores, setChores] = useState([]);
const [rewards, setRewards] = useState([]);
// ================= MEALS & SHOPPING =================
const [meals, setMeals] = useState({ weeklyPlan: [], allMeals: [] });
// ================= MUSIC =================
const [playlists, setPlaylists] = useState([]);
// ================= TAROT =================
const [tarotHistory, setTarotHistory] = useState([]);
// ================= POTTY TRAINING =================
const [pottyData, setPottyData] = useState({ entries: [], points: 0 });
const [pottyRewards, setPottyRewards] = useState([]);
// ================= BABY CARE =================
const [babyData, setBabyData] = useState({
feedings: [],
diapers: [],
baths: [],
pumping: [],
milkStorage: { fridge: 0, freezer: 0 },
symptoms: []
});
// ================= EXPORT FUNCTIONS =================
const exportCSV = (data, filename) => {
if (!data || data.length === 0) return;
const csvRows = [];
const headers = Object.keys(data[0]);
csvRows.push(headers.join(','));
data.forEach(row => csvRows.push(headers.map(h => `\"${row[h]}\"`).join(',')));
const csvData = new Blob([csvRows.join('\n')], { type: 'text/csv' });
saveAs(csvData, `${filename}.csv`);
};
const exportPDF = (data, filename) => {
if (!data || data.length === 0) return;
const doc = new jsPDF();
const headers = [Object.keys(data[0])];
const rows = data.map(row => Object.values(row));
doc.autoTable({ head: headers, body: rows, styles: { font: 'times', fontSize: 10 }, headStyles: { fillColor: [220, 220, 220] } });
doc.save(`${filename}.pdf`);
};
// ================= GALLERY BUTTONS =================
const galleryButtons = [
{ name: "Profiles", page: "ProfilesPage", color: "bg-indigo-800/80" },
{ name: "Calendar", page: "CalendarPage", color: "bg-green-800/80" },
{ name: "Birthday Tree", page: "BirthdayTreePage", color: "bg-yellow-800/80" },
{ name: "Chores & Rewards", page: "ChorePage", color: "bg-purple-800/80" },
{ name: "Meals & Shopping", page: "MealPage", color: "bg-orange-800/80" },
{ name: "Weekly Notes", page: "WeeklyPage", color: "bg-pink-800/80" },
{ name: "Music", page: "MusicPage", color: "bg-blue-800/80" },
{ name: "Tarot", page: "TarotPage", color: "bg-red-800/80" },
{ name: "Potty & Baby", page: "BabyPottyPage", color: "bg-teal-800/80" },
];
return (
{/* ================= DATE/TIME DISPLAY ================= */}
{new Date().toLocaleString("en-US", { dateStyle: "full", timeStyle: "short" })}
{/* ================= GALLERY BUTTONS ================= */}
{galleryButtons.map((btn) => (
setCurrentPage(btn.page)}
className={`${btn.color} cursor-pointer p-8 rounded-2xl hover:scale-110 transition-transform transform shadow-xl shadow-black/50 text-center text-2xl font-bold backdrop-blur-sm border border-white/20`}
>
{btn.name}
))}
{/* ================= PAGE RENDER ================= */}
{currentPage === "BabyPottyPage" && (
)}
{/* Placeholder for other pages */}
);
}
// ================= BABY & POTTY PAGE =================
function BabyPottyPage({ pottyData, setPottyData, babyData, setBabyData, exportCSV, exportPDF }) {
// ======= POTTY FUNCTIONS =======
const addPottyEntry = (type, success) => {
const pointsChange = success ? 1 : -1;
const entry = { type, success, time: new Date().toLocaleTimeString(), pointsChange };
setPottyData(prev => ({ entries: [entry, ...prev.entries], points: prev.points + pointsChange }));
};
// ======= BABY FUNCTIONS =======
const addFeeding = (method, amount) => {
const time = new Date().toLocaleTimeString();
setBabyData(prev => ({ ...prev, feedings: [...prev.feedings, { method, amount, time }], milkStorage: method === 'bottle' ? { fridge: prev.milkStorage.fridge - amount, freezer: prev.milkStorage.freezer } : prev.milkStorage }));
};
const addDiaper = (type) => { const time = new Date().toLocaleTimeString(); setBabyData(prev => ({ ...prev, diapers: [...prev.diapers, { type, time }] })); };
const addBath = () => { const time = new Date().toLocaleTimeString(); setBabyData(prev => ({ ...prev, baths: [...prev.baths, { time }] })); };
const addPumping = (side, amount) => { const time = new Date().toLocaleTimeString(); setBabyData(prev => ({ ...prev, pumping: [...prev.pumping, { side, amount, time }], milkStorage: { fridge: prev.milkStorage.fridge + amount, freezer: prev.milkStorage.freezer } })); };
const addSymptom = (description, duration) => { const time = new Date().toLocaleTimeString(); setBabyData(prev => ({ ...prev, symptoms: [...prev.symptoms, { description, duration, time }] })); };
return (
Potty Training Tracker
Total Points: {pottyData.points}
Baby Care Tracker
);
}