import { useMemo, useState } from 'react'; import { Alert, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; import { useQuery } from '@tanstack/react-query'; import * as Print from 'expo-print'; import * as Sharing from 'expo-sharing'; import { useTranslation } from 'react-i18next'; import { fetchShoppingList } from '@/src/api/meal-plan.api'; import { Button } from '@/src/components/Button'; import { ErrorView } from '@/src/components/ErrorView'; import { Screen } from '@/src/components/Screen'; import { useAppearance } from '@/src/context/AppearanceContext'; import { addDays, formatDisplayDate, weekRange } from '@/src/utils/date'; import { buildShoppingListHtml, formatShoppingQuantity } from '@/src/utils/pdfExport'; export default function ShoppingScreen() { const { t, i18n } = useTranslation(); const { colors } = useAppearance(); const [weekAnchor, setWeekAnchor] = useState(() => weekRange().from); const { from, to } = useMemo(() => weekRange(weekAnchor), [weekAnchor]); const [checked, setChecked] = useState>({}); const [exporting, setExporting] = useState(false); const listQuery = useQuery({ queryKey: ['shopping-list', from, to], queryFn: () => fetchShoppingList(from, to), }); async function handleExportPdf() { const items = listQuery.data ?? []; if (items.length === 0) { Alert.alert(t('errors.pdfNothingToExport')); return; } setExporting(true); try { const html = buildShoppingListHtml( items, t('pdf.shoppingList'), t('pdf.generatedOn', { date: new Date().toLocaleDateString(), count: items.length }), t('pdf.toTaste'), ); const { uri } = await Print.printToFileAsync({ html }); if (await Sharing.isAvailableAsync()) { await Sharing.shareAsync(uri, { UTI: '.pdf', mimeType: 'application/pdf' }); } } catch { Alert.alert(t('errors.pdfGenerateFailed')); } finally { setExporting(false); } } return ( setWeekAnchor(addDays(from, -7))} style={[styles.navBtn, { borderColor: colors.border, backgroundColor: colors.surface }]} > {formatDisplayDate(from, i18n.language)} – {formatDisplayDate(to, i18n.language)} setWeekAnchor(addDays(from, 7))} style={[styles.navBtn, { borderColor: colors.border, backgroundColor: colors.surface }]} >