'use client'; import { useState, useEffect, useCallback } from 'react'; import { Box, Typography, Paper, List, ListItem, ListItemIcon, ListItemText, Chip, CircularProgress, Snackbar, Alert, } from '@mui/material'; import { Restaurant, Hotel, BabyChangingStation, MedicalServices, EmojiEvents, Note, } from '@mui/icons-material'; import { AppShell } from '@/components/layouts/AppShell/AppShell'; import { ProtectedRoute } from '@/components/common/ProtectedRoute'; import { useAuth } from '@/lib/auth/AuthContext'; import { childrenApi, Child } from '@/lib/api/children'; import { trackingApi, Activity } from '@/lib/api/tracking'; import { useLocalizedDate } from '@/hooks/useLocalizedDate'; import { useRealTimeActivities } from '@/hooks/useWebSocket'; const activityIcons: Record = { feeding: , sleep: , diaper: , medication: , milestone: , note: , }; const activityColors: Record = { feeding: '#FFB6C1', sleep: '#B6D7FF', diaper: '#FFE4B5', medication: '#FFB8B8', milestone: '#FFD700', note: '#E0E0E0', }; export default function ActivitiesPage() { const { user } = useAuth(); const { format } = useLocalizedDate(); const [children, setChildren] = useState([]); const [selectedChild, setSelectedChild] = useState(null); const [activities, setActivities] = useState([]); const [loading, setLoading] = useState(true); const [notification, setNotification] = useState(null); const familyId = user?.families?.[0]?.familyId; // Real-time activity handlers const handleActivityCreated = useCallback((activity: Activity) => { console.log('[ActivitiesPage] Real-time activity created:', activity); setActivities((prev) => [activity, ...prev]); setNotification('New activity added by family member'); }, []); const handleActivityUpdated = useCallback((activity: Activity) => { console.log('[ActivitiesPage] Real-time activity updated:', activity); setActivities((prev) => prev.map((a) => (a.id === activity.id ? activity : a)) ); setNotification('Activity updated by family member'); }, []); const handleActivityDeleted = useCallback((data: { activityId: string }) => { console.log('[ActivitiesPage] Real-time activity deleted:', data); setActivities((prev) => prev.filter((a) => a.id !== data.activityId)); setNotification('Activity deleted by family member'); }, []); // Subscribe to real-time updates useRealTimeActivities( handleActivityCreated, handleActivityUpdated, handleActivityDeleted ); useEffect(() => { const loadData = async () => { if (!familyId) { setLoading(false); return; } try { const childrenData = await childrenApi.getChildren(familyId); setChildren(childrenData); if (childrenData.length > 0) { const firstChild = childrenData[0]; setSelectedChild(firstChild); // Load activities for the last 7 days const endDate = format(new Date(), 'yyyy-MM-dd'); const startDate = format( new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), 'yyyy-MM-dd' ); const activitiesData = await trackingApi.getActivities( firstChild.id, undefined, startDate, endDate ); setActivities(activitiesData); } } catch (error) { console.error('[ActivitiesPage] Failed to load data:', error); } finally { setLoading(false); } }; loadData(); }, [familyId]); const formatActivityTime = (timestamp: string) => { const date = new Date(timestamp); const today = new Date(); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); const isToday = date.toDateString() === today.toDateString(); const isYesterday = date.toDateString() === yesterday.toDateString(); if (isToday) { return `Today at ${format(date, 'h:mm a')}`; } else if (isYesterday) { return `Yesterday at ${format(date, 'h:mm a')}`; } else { return format(date, 'MMM d, h:mm a'); } }; const getActivityDescription = (activity: Activity) => { switch (activity.type) { case 'feeding': return activity.data?.amount ? `${activity.data.amount} ${activity.data.unit || 'oz'}` : 'Feeding'; case 'sleep': if (activity.data?.endedAt) { const duration = Math.floor( (new Date(activity.data.endedAt).getTime() - new Date(activity.timestamp).getTime()) / 60000 ); const hours = Math.floor(duration / 60); const mins = duration % 60; return hours > 0 ? `${hours}h ${mins}m` : `${mins}m`; } return 'Sleep'; case 'diaper': return activity.data?.type || 'Diaper change'; case 'medication': return activity.data?.name || 'Medication'; default: return activity.type; } }; return ( Recent Activities {loading ? ( ) : activities.length === 0 ? ( No activities recorded yet ) : ( {activities.map((activity, index) => ( {activityIcons[activity.type] || } {getActivityDescription(activity)} } secondary={ {formatActivityTime(activity.timestamp)} {activity.notes && ( {activity.notes} )} } /> ))} )} {/* Real-time update notification */} setNotification(null)} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} > setNotification(null)} severity="info" sx={{ width: '100%' }} > {notification} ); }