import { useQuery } from '@tanstack/react-query'; import { FolderKanban, Layers3, Search } from 'lucide-react-native'; import { useCallback, useMemo, useState } from 'react'; import { FlatList, RefreshControl, Text, TextInput, View } from 'react-native'; import { ListCard } from '@/src/components/list-card'; import { ScreenShell } from '@/src/components/screen-shell'; import { useDebouncedValue } from '@/src/hooks/use-debounced-value'; import { listGroups } from '@/src/services/admin'; export default function GroupsScreen() { const [searchText, setSearchText] = useState(''); const keyword = useDebouncedValue(searchText.trim(), 300); const groupsQuery = useQuery({ queryKey: ['groups', keyword], queryFn: () => listGroups(keyword), }); const items = groupsQuery.data?.items ?? []; const errorMessage = groupsQuery.error instanceof Error ? groupsQuery.error.message : ''; const listHeader = useMemo( () => ( ), [] ); const renderItem = useCallback( ({ item: group }: { item: (typeof items)[number] }) => ( 账号数 {group.account_count ?? 0} · {group.is_exclusive ? '独占分组' : '共享分组'} ), [] ); const emptyState = useMemo( () => , [errorMessage] ); return ( 查看分组与调度归属。} variant="minimal" scroll={false} > `${item.id}`} showsVerticalScrollIndicator={false} refreshControl={ void groupsQuery.refetch()} tintColor="#1d5f55" />} ListHeaderComponent={listHeader} ListEmptyComponent={emptyState} ItemSeparatorComponent={() => } keyboardShouldPersistTaps="handled" removeClippedSubviews initialNumToRender={8} maxToRenderPerBatch={8} windowSize={5} /> ); }