/** * Dashboard tab - overview of streaming activity * Query keys include selectedServerId for proper cache isolation per media server */ import { View, ScrollView, RefreshControl } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { useQuery } from '@tanstack/react-query'; import { Ionicons } from '@expo/vector-icons'; import { api } from '@/lib/api'; import { useMediaServer } from '@/providers/MediaServerProvider'; import { useServerStatistics } from '@/hooks/useServerStatistics'; import { StreamMap } from '@/components/map/StreamMap'; import { NowPlayingCard } from '@/components/sessions'; import { ServerResourceCard } from '@/components/server/ServerResourceCard'; import { Text } from '@/components/ui/text'; import { Card } from '@/components/ui/card'; import { colors } from '@/lib/theme'; /** * Compact stat pill for dashboard summary bar */ function StatPill({ icon, value, unit, color = colors.text.secondary.dark, }: { icon: keyof typeof Ionicons.glyphMap; value: string | number; unit?: string; color?: string; }) { return ( {value} {unit && ( {unit} )} ); } export default function DashboardScreen() { const router = useRouter(); const { selectedServerId, selectedServer } = useMediaServer(); const { data: stats, refetch, isRefetching, } = useQuery({ queryKey: ['dashboard', 'stats', selectedServerId], queryFn: () => api.stats.dashboard(selectedServerId ?? undefined), }); const { data: activeSessions } = useQuery({ queryKey: ['sessions', 'active', selectedServerId], queryFn: () => api.sessions.active(selectedServerId ?? undefined), staleTime: 1000 * 15, // 15 seconds - match web refetchInterval: 1000 * 30, // 30 seconds - fallback if WebSocket events missed }); // Only show server resources for Plex servers const isPlexServer = selectedServer?.type === 'plex'; // Poll server statistics only when dashboard is visible and we have a Plex server const { latest: serverResources, isLoadingData: resourcesLoading, error: resourcesError, } = useServerStatistics(selectedServerId ?? undefined, isPlexServer); return ( } > {/* Today's Stats Bar */} {stats && ( TODAY 0 ? colors.warning : colors.text.muted.dark} /> )} {/* Now Playing - Active Streams */} Now Playing {activeSessions && activeSessions.length > 0 && ( {activeSessions.length} {activeSessions.length === 1 ? 'stream' : 'streams'} )} {activeSessions && activeSessions.length > 0 ? ( {activeSessions.map((session) => ( router.push(`/session/${session.id}` as never)} /> ))} ) : ( No active streams Streams will appear here when users start watching )} {/* Stream Map - only show when there are active streams */} {activeSessions && activeSessions.length > 0 && ( Stream Locations )} {/* Server Resources - only show if Plex server is active */} {isPlexServer && ( Server Resources )} ); }