'use client'; import { useState, useEffect } from 'react'; import { Box, Tabs, Tab, Card, CardContent, Avatar, Typography, Grid, Chip, Paper, } from '@mui/material'; import { useSelector, useDispatch } from 'react-redux'; import { childrenSelectors, selectViewMode, selectSelectedChild, selectChild, Child, } from '@/store/slices/childrenSlice'; import { RootState } from '@/store/store'; import { Restaurant, Hotel, BabyChangingStation, MedicalServices, } from '@mui/icons-material'; interface DashboardMetrics { feedingCount: number; sleepDuration: number; diaperCount: number; medicationCount: number; } interface DynamicChildDashboardProps { childMetrics: Record; onChildSelect: (childId: string) => void; } export default function DynamicChildDashboard({ childMetrics, onChildSelect, }: DynamicChildDashboardProps) { const dispatch = useDispatch(); const children = useSelector((state: RootState) => childrenSelectors.selectAll(state)); const viewMode = useSelector(selectViewMode); const selectedChild = useSelector(selectSelectedChild); // Initialize selectedTab with first available child ID const [selectedTab, setSelectedTab] = useState(() => { if (selectedChild?.id) return selectedChild.id; if (children.length > 0) return children[0].id; return ''; }); // Initialize selected tab useEffect(() => { if (selectedChild?.id && selectedTab !== selectedChild.id) { setSelectedTab(selectedChild.id); } else if (!selectedTab && children.length > 0) { const firstChildId = children[0].id; setSelectedTab(firstChildId); dispatch(selectChild(firstChildId)); onChildSelect(firstChildId); } }, [selectedChild, children, dispatch, onChildSelect, selectedTab]); const handleTabChange = (_event: React.SyntheticEvent, newValue: string) => { setSelectedTab(newValue); dispatch(selectChild(newValue)); onChildSelect(newValue); }; const handleCardClick = (childId: string) => { setSelectedTab(childId); dispatch(selectChild(childId)); onChildSelect(childId); }; const formatSleepHours = (minutes: number) => { const hours = Math.floor(minutes / 60); const mins = minutes % 60; if (hours > 0 && mins > 0) { return `${hours}h ${mins}m`; } else if (hours > 0) { return `${hours}h`; } else { return `${mins}m`; } }; const renderMetrics = (child: Child, isCompact: boolean = false) => { const metrics = childMetrics[child.id] || { feedingCount: 0, sleepDuration: 0, diaperCount: 0, medicationCount: 0, }; if (isCompact) { return ( } label={`${metrics.feedingCount} feeds`} size="small" variant="outlined" /> } label={formatSleepHours(metrics.sleepDuration)} size="small" variant="outlined" /> } label={`${metrics.diaperCount} diapers`} size="small" variant="outlined" /> {metrics.medicationCount > 0 && ( } label={`${metrics.medicationCount} meds`} size="small" variant="outlined" /> )} ); } return ( {metrics.feedingCount} Feedings {formatSleepHours(metrics.sleepDuration)} Sleep {metrics.diaperCount} Diapers {metrics.medicationCount} Medications ); }; // Tab view for 1-3 children if (viewMode === 'tabs') { // Don't render tabs if no children or no valid selectedTab if (children.length === 0 || !selectedTab) { return null; } return ( {children.map((child) => ( {child.name[0]} {child.name} {child.nickname && ( {child.nickname} )} } sx={{ textTransform: 'none', minHeight: 64, }} /> ))} {children.map((child) => ( ))} ); } // Card view for 4+ children return ( Select a child to view details {children.map((child) => ( handleCardClick(child.id)} > {child.name[0]} {child.name} {child.nickname && ( {child.nickname} )} {renderMetrics(child, true)} ))} {/* Show detailed metrics for selected child */} {selectedTab && ( {children.find(c => c.id === selectedTab)?.name}'s Today {renderMetrics(children.find(c => c.id === selectedTab)!, false)} )} ); }