'use client'; import { useState, useEffect } from 'react'; import { Box, Typography, Tabs, Tab, Select, MenuItem, FormControl, InputLabel, CircularProgress, Alert, Grid, } from '@mui/material'; import { Timeline, TrendingUp, Assessment } from '@mui/icons-material'; import { childrenApi, Child } from '@/lib/api/children'; import { analyticsApi, PatternInsights, PredictionInsights } from '@/lib/api/analytics'; import { InsightsDashboard } from './InsightsDashboard'; import PredictionsCard from './PredictionsCard'; import GrowthSpurtAlert from './GrowthSpurtAlert'; import { motion } from 'framer-motion'; import { useAuth } from '@/lib/auth/AuthContext'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } export function UnifiedInsightsDashboard() { const { user } = useAuth(); const [children, setChildren] = useState([]); const [selectedChildId, setSelectedChildId] = useState(''); const [tabValue, setTabValue] = useState(0); const [loading, setLoading] = useState(true); const [insights, setInsights] = useState(null); const [predictions, setPredictions] = useState(null); const [insightsLoading, setInsightsLoading] = useState(false); const [predictionsLoading, setPredictionsLoading] = useState(false); const [days, setDays] = useState(7); const [error, setError] = useState(''); const familyId = user?.families?.[0]?.familyId; useEffect(() => { if (familyId) { loadChildren(); } }, [familyId]); useEffect(() => { if (selectedChildId && children.length > 0) { // Validate that selectedChildId belongs to current user's children const childExists = children.some(child => child.id === selectedChildId); if (childExists) { loadInsights(); loadPredictions(); } else { // Invalid child ID - reset to first child console.warn('[UnifiedInsightsDashboard] Selected child not found in user\'s children, resetting'); setSelectedChildId(children[0].id); setError('Selected child not found. Showing data for your first child.'); } } }, [selectedChildId, days, children]); const loadChildren = async () => { if (!familyId) { setLoading(false); setError('No family found'); return; } try { console.log('[UnifiedInsightsDashboard] Loading children for familyId:', familyId); const data = await childrenApi.getChildren(familyId); console.log('[UnifiedInsightsDashboard] Loaded children:', data); setChildren(data); // Only set selectedChildId if we don't have one or if it's not in the new list if (data.length > 0) { const existingChildStillValid = data.some(child => child.id === selectedChildId); if (!selectedChildId || !existingChildStillValid) { setSelectedChildId(data[0].id); } } setError(''); } catch (error) { console.error('[UnifiedInsightsDashboard] Failed to load children:', error); setError('Failed to load children'); } finally { setLoading(false); } }; const loadInsights = async () => { if (!selectedChildId) return; setInsightsLoading(true); try { const data = await analyticsApi.getInsights(selectedChildId, days); setInsights(data); } catch (error) { console.error('Failed to load insights:', error); } finally { setInsightsLoading(false); } }; const loadPredictions = async () => { if (!selectedChildId) return; setPredictionsLoading(true); try { const data = await analyticsApi.getPredictions(selectedChildId); setPredictions(data); } catch (error) { console.error('Failed to load predictions:', error); } finally { setPredictionsLoading(false); } }; if (loading) { return ( ); } if (children.length === 0) { return ( Add a child to your family to view insights and predictions. ); } return ( {/* Header */} Insights & Predictions AI-powered insights, patterns, and predictions for your child {/* Error Alert */} {error && ( setError('')}> {error} )} {/* Child Selector */} {children.length > 1 && ( Child )} {/* Growth Spurt Alert */} {insights?.growthSpurt && } {/* Tabs */} setTabValue(newValue)}> } iconPosition="start" /> } iconPosition="start" /> {/* Tab Panels */} {/* Insights tab shows the existing InsightsDashboard */} {/* Predictions tab */} ); }