import { ScrollView, View, Text, TouchableOpacity, RefreshControl, } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import { router, useFocusEffect } from "expo-router"; import { useCallback } from "react"; import { MaterialIcons } from "@expo/vector-icons"; import { useCodexUsage } from "@/hooks/useCodexUsage"; import { useClaudeUsage } from "@/hooks/useClaudeUsage"; import { ServiceStatusCard } from "@/components/ServiceStatusCard"; import { windowLabel } from "@/lib/timeUtils"; export default function DashboardTab() { const codex = useCodexUsage(); const claude = useClaudeUsage(); useFocusEffect( useCallback(() => { codex.reload(); claude.reload(); }, []) ); const isRefreshing = codex.status === "loading" || claude.status === "loading"; const handleRefresh = () => { codex.refresh(); claude.refresh(); }; const codexRows = codex.usage ? [ { label: `Primary (${windowLabel(codex.usage.rate_limit.primary_window.limit_window_seconds)})`, percent: codex.usage.rate_limit.primary_window.used_percent, resetAtSeconds: codex.usage.rate_limit.primary_window.reset_at, }, { label: `Secondary (${windowLabel(codex.usage.rate_limit.secondary_window.limit_window_seconds)})`, percent: codex.usage.rate_limit.secondary_window.used_percent, resetAtSeconds: codex.usage.rate_limit.secondary_window.reset_at, }, ] : undefined; const claudeRows = claude.usage ? [ { label: "5-hour window", percent: claude.usage.five_hour.utilization, resetAtISO: claude.usage.five_hour.resets_at, }, { label: "7-day window", percent: claude.usage.seven_day.utilization, resetAtISO: claude.usage.seven_day.resets_at, }, ] : undefined; return ( } > {/* Header */} Codexbar AI usage monitor {/* Codex card */} router.navigate("/(tabs)/codex")} footer={ codex.usage && !codex.usage.credits.unlimited && codex.usage.credits.has_credits ? ( ${Number(codex.usage.credits.balance).toFixed(2)} credits remaining ) : codex.usage?.credits.unlimited ? ( Unlimited credits ) : null } /> {/* Claude card */} router.navigate("/(tabs)/claude")} /> ); }