/** * Activity tab - streaming statistics and charts * Query keys include selectedServerId for proper cache isolation per media server */ import { useState } from 'react'; import { View, ScrollView, RefreshControl } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useQuery } from '@tanstack/react-query'; import { api } from '@/lib/api'; import { useMediaServer } from '@/providers/MediaServerProvider'; import { colors } from '@/lib/theme'; import { Text } from '@/components/ui/text'; import { Card } from '@/components/ui/card'; import { PeriodSelector, type StatsPeriod } from '@/components/ui/period-selector'; import { PlaysChart, PlatformChart, DayOfWeekChart, HourOfDayChart, QualityChart, } from '@/components/charts'; function ChartSection({ title, children, }: { title: string; children: React.ReactNode; }) { return ( {title} {children} ); } export default function ActivityScreen() { const [period, setPeriod] = useState('month'); const { selectedServerId } = useMediaServer(); // Fetch all stats data with selected period - query keys include selectedServerId for cache isolation const { data: playsData, refetch: refetchPlays, isRefetching: isRefetchingPlays, } = useQuery({ queryKey: ['stats', 'plays', period, selectedServerId], queryFn: () => api.stats.plays({ period, serverId: selectedServerId ?? undefined }), }); const { data: dayOfWeekData, refetch: refetchDayOfWeek } = useQuery({ queryKey: ['stats', 'dayOfWeek', period, selectedServerId], queryFn: () => api.stats.playsByDayOfWeek({ period, serverId: selectedServerId ?? undefined }), }); const { data: hourOfDayData, refetch: refetchHourOfDay } = useQuery({ queryKey: ['stats', 'hourOfDay', period, selectedServerId], queryFn: () => api.stats.playsByHourOfDay({ period, serverId: selectedServerId ?? undefined }), }); const { data: platformsData, refetch: refetchPlatforms } = useQuery({ queryKey: ['stats', 'platforms', period, selectedServerId], queryFn: () => api.stats.platforms({ period, serverId: selectedServerId ?? undefined }), }); const { data: qualityData, refetch: refetchQuality } = useQuery({ queryKey: ['stats', 'quality', period, selectedServerId], queryFn: () => api.stats.quality({ period, serverId: selectedServerId ?? undefined }), }); const handleRefresh = () => { void refetchPlays(); void refetchDayOfWeek(); void refetchHourOfDay(); void refetchPlatforms(); void refetchQuality(); }; // Period labels for display const periodLabels: Record = { week: 'Last 7 Days', month: 'Last 30 Days', year: 'Last Year', }; return ( } > {/* Header with Period Selector */} Activity {periodLabels[period]} {/* Plays Over Time */} {/* Day of Week & Hour of Day in a row on larger screens */} By Day By Hour {/* Platform Breakdown */} {/* Quality Breakdown */} {qualityData ? ( ) : ( Loading... )} ); }