import React, { useMemo, useState } from 'react'; import { FlatList, RefreshControl, ScrollView, StyleSheet, Text, View } from 'react-native'; import { useRouter } from 'expo-router'; import { useQuery } from '@tanstack/react-query'; import { api, DocCategory } from '@/api'; import { useT } from '@/i18n'; import { AppBar } from '@/components/AppBar'; import { Chip, EmptyState, Loading } from '@/components/ui'; import { DocumentRow } from '@/components/domain'; import { DocWithProperty, fetchAllDocuments } from '@/lib/allDocuments'; import { daysUntil } from '@/lib/format'; import { colors, fontSize, spacing } from '@/theme'; type Filter = 'all' | 'expiring' | 'expired'; export default function ExpiringScreen() { const router = useRouter(); const t = useT(); const [filter, setFilter] = useState('all'); const docsQuery = useQuery({ queryKey: ['all-documents'], queryFn: fetchAllDocuments }); const catsQuery = useQuery({ queryKey: ['categories'], queryFn: () => api.reference.categories() }); const catName = (slug: string) => (catsQuery.data as DocCategory[] | undefined)?.find((c) => c.slug === slug)?.name ?? slug; // Only documents that actually need attention, soonest deadline first. const attention = useMemo(() => { const docs: DocWithProperty[] = docsQuery.data ?? []; return docs .filter((d) => d.expiryStatus === 'expiring' || d.expiryStatus === 'expired') .sort((a, b) => (daysUntil(a.expiryDate) ?? 0) - (daysUntil(b.expiryDate) ?? 0)); }, [docsQuery.data]); const counts = useMemo( () => ({ all: attention.length, expiring: attention.filter((d) => d.expiryStatus === 'expiring').length, expired: attention.filter((d) => d.expiryStatus === 'expired').length, }), [attention], ); const visible = filter === 'all' ? attention : attention.filter((d) => d.expiryStatus === filter); return ( setFilter('all')} /> setFilter('expiring')} /> setFilter('expired')} /> {docsQuery.isLoading ? ( ) : ( String(d.id)} contentContainerStyle={styles.list} refreshControl={ docsQuery.refetch()} tintColor={colors.teal600} /> } renderItem={({ item }) => ( router.push(`/document/${item.id}?propertyId=${item.propertyId}`)} /> )} ListEmptyComponent={ } /> )} ); } const styles = StyleSheet.create({ chips: { gap: 8, paddingHorizontal: spacing[4], paddingVertical: spacing[2] }, list: { padding: spacing[4], paddingTop: spacing[2], paddingBottom: spacing[9] }, });