import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { ChevronLeft, ShieldCheck, TestTubeDiagonal } from 'lucide-react-native'; import { router, useLocalSearchParams } from 'expo-router'; import { Pressable, Text, View } from 'react-native'; import { DetailRow } from '@/src/components/detail-row'; import { LineTrendChart } from '@/src/components/line-trend-chart'; import { ListCard } from '@/src/components/list-card'; import { formatDisplayTime, formatTokenValue } from '@/src/lib/formatters'; import { ScreenShell } from '@/src/components/screen-shell'; import { getAccount, getAccountTodayStats, getDashboardTrend, refreshAccount, setAccountSchedulable, testAccount } from '@/src/services/admin'; function getDateRange() { const end = new Date(); const start = new Date(); start.setDate(end.getDate() - 6); const toDate = (value: Date) => value.toISOString().slice(0, 10); return { start_date: toDate(start), end_date: toDate(end), }; } export default function AccountDetailScreen() { const { id } = useLocalSearchParams<{ id: string }>(); const accountId = Number(id); const queryClient = useQueryClient(); const range = getDateRange(); const accountQuery = useQuery({ queryKey: ['account', accountId], queryFn: () => getAccount(accountId), enabled: Number.isFinite(accountId), }); const todayStatsQuery = useQuery({ queryKey: ['account-today-stats', accountId], queryFn: () => getAccountTodayStats(accountId), enabled: Number.isFinite(accountId), }); const trendQuery = useQuery({ queryKey: ['account-trend', accountId, range.start_date, range.end_date], queryFn: () => getDashboardTrend({ ...range, granularity: 'day', account_id: accountId }), enabled: Number.isFinite(accountId), }); const refreshMutation = useMutation({ mutationFn: () => refreshAccount(accountId), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['account', accountId] }), }); const schedulableMutation = useMutation({ mutationFn: (schedulable: boolean) => setAccountSchedulable(accountId, schedulable), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['account', accountId] }); queryClient.invalidateQueries({ queryKey: ['accounts'] }); }, }); const account = accountQuery.data; const todayStats = todayStatsQuery.data; const trendPoints = (trendQuery.data?.trend ?? []).map((item) => ({ label: item.date.slice(5), value: item.total_tokens, })); const isRefreshing = accountQuery.isRefetching || todayStatsQuery.isRefetching || trendQuery.isRefetching; function handleRefresh() { void Promise.all([accountQuery.refetch(), todayStatsQuery.refetch(), trendQuery.refetch()]); } return ( router.back()}> } > {trendPoints.length > 1 ? ( ) : null} testAccount(accountId).catch(() => undefined)}> 测试账号 refreshMutation.mutate()}> {refreshMutation.isPending ? '刷新中...' : '刷新凭据'} schedulableMutation.mutate(!account?.schedulable)} > {schedulableMutation.isPending ? '提交中...' : account?.schedulable ? '暂停调度' : '恢复调度'} ); }