import { View, Text, StyleSheet, ScrollView, RefreshControl, Image } from "react-native"; import { useUser } from "@clerk/clerk-expo"; import { LinearGradient } from "expo-linear-gradient"; import { useState, useCallback, useEffect } from "react"; import AsyncStorage from '@react-native-async-storage/async-storage'; import { theme } from "../../styles/theme"; import { ActivityWidget } from "../../components/ActivityWidget"; import { QuickActionGrid } from "../../components/QuickActionGrid"; import { TrackMealModal } from "../../components/TrackMealModal"; import { AddWaterModal } from "../../components/AddWaterModal"; import { HydrationWidget } from "../../components/HydrationWidget"; import { ScanFoodModal } from "../../components/ScanFoodModal"; import { Ionicons } from "@expo/vector-icons"; export default function HomeScreen() { const { user } = useUser(); const [refreshing, setRefreshing] = useState(false); const [trackMealModalVisible, setTrackMealModalVisible] = useState(false); const [addWaterModalVisible, setAddWaterModalVisible] = useState(false); const [scanFoodModalVisible, setScanFoodModalVisible] = useState(false); const [calories, setCalories] = useState(0); const [waterIntake, setWaterIntake] = useState(0); const onRefresh = useCallback(() => { setRefreshing(true); setTimeout(() => { setRefreshing(false); }, 2000); }, []); const getGreeting = () => { const hour = new Date().getHours(); if (hour < 12) return "Good Morning"; if (hour < 18) return "Good Afternoon"; return "Good Evening"; }; const handleSaveMeal = (meal: { type: string; name: string; calories: number }) => { setCalories(prev => prev + meal.calories); setTrackMealModalVisible(false); }; const handleAddWater = (amount: number) => { setWaterIntake(prev => prev + amount); setAddWaterModalVisible(false); }; const handleResetCalories = () => { setCalories(0); }; const handleResetWater = () => { setWaterIntake(0); }; const handleAddScannedFood = (scannedCalories: number) => { setCalories(prev => prev + scannedCalories); setScanFoodModalVisible(false); }; const resetAllCounters = async () => { setCalories(0); setWaterIntake(0); const today = new Date().toDateString(); await AsyncStorage.setItem('lastResetDate', today); }; // Check for midnight reset useEffect(() => { const checkAndResetIfNeeded = async () => { const lastResetDate = await AsyncStorage.getItem('lastResetDate'); const today = new Date().toDateString(); if (lastResetDate !== today) { await resetAllCounters(); } }; checkAndResetIfNeeded(); // Calculate time until midnight const now = new Date(); const midnight = new Date(); midnight.setHours(24, 0, 0, 0); const timeUntilMidnight = midnight.getTime() - now.getTime(); // Set timer for midnight reset const midnightTimer = setTimeout(async () => { await resetAllCounters(); // Set up daily interval after first midnight const dailyInterval = setInterval(async () => { await resetAllCounters(); }, 24 * 60 * 60 * 1000); // 24 hours return () => clearInterval(dailyInterval); }, timeUntilMidnight); return () => clearTimeout(midnightTimer); }, []); return ( } > {/* Header Section */} {getGreeting()}, {user?.firstName || "Athlete"} {user?.imageUrl ? ( ) : ( )} {/* Activity Widget */} {/* Hydration Widget */} {/* Quick Actions */} setTrackMealModalVisible(true)} onAddWaterPress={() => setAddWaterModalVisible(true)} onScanFoodPress={() => setScanFoodModalVisible(true)} /> setTrackMealModalVisible(false)} onSave={handleSaveMeal} onResetData={handleResetCalories} /> setAddWaterModalVisible(false)} onAdd={handleAddWater} onResetData={handleResetWater} /> setScanFoodModalVisible(false)} onAddFood={handleAddScannedFood} /> {/* Recent Activity Section */} Recent Activity See All Upper Body Power Today, 10:00 AM 45m Morning Cardio Yesterday, 7:30 AM 30m {/* Bottom Spacer for Tab Bar */} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: theme.colors.background, }, scrollContent: { paddingTop: 60, }, header: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingHorizontal: 24, marginBottom: 32, }, greeting: { fontSize: 16, color: theme.colors.gray600, fontWeight: "500", marginBottom: 4, }, name: { fontSize: 32, fontWeight: "800", color: theme.colors.gray900, letterSpacing: -0.5, }, avatarContainer: { shadowColor: "#000", shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.1, shadowRadius: 12, elevation: 5, }, avatar: { width: 56, height: 56, borderRadius: 20, borderWidth: 2, borderColor: "#fff", }, placeholderAvatar: { width: 56, height: 56, borderRadius: 20, backgroundColor: theme.colors.primary, justifyContent: "center", alignItems: "center", borderWidth: 2, borderColor: "#fff", }, section: { paddingHorizontal: 20, marginBottom: 24, }, sectionHeader: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", marginBottom: 16, }, sectionTitle: { fontSize: 18, fontWeight: "700", color: theme.colors.gray900, }, seeAll: { fontSize: 14, color: theme.colors.primary, fontWeight: "600", }, activityCard: { gap: 12, }, recentItem: { flexDirection: "row", alignItems: "center", padding: 16, borderRadius: 20, backgroundColor: "#fff", borderWidth: 1, borderColor: "rgba(255, 255, 255, 0.6)", }, recentIconContainer: { marginRight: 16, }, recentIcon: { width: 48, height: 48, borderRadius: 16, justifyContent: "center", alignItems: "center", }, recentInfo: { flex: 1, }, recentTitle: { fontSize: 16, fontWeight: "600", color: theme.colors.gray900, marginBottom: 4, }, recentSubtitle: { fontSize: 12, color: theme.colors.gray500, }, recentValue: { fontSize: 14, fontWeight: "600", color: theme.colors.gray900, }, });