import { Ionicons } from "@expo/vector-icons"; import { useState } from "react"; import { ActivityIndicator, Alert, Modal, Pressable, Text, TextInput, View, FlatList, } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useRouter } from "expo-router"; import { useTranslation } from "react-i18next"; import { useTransferLineItems, useCreateTransferLineItem, useDeleteTransferLineItem, type TransferLineItem, } from "@/src/hooks/useFixedCosts"; import { ModalHeader } from "@/src/components/ui/ModalHeader"; import { Numpad } from "@/src/components/ui/Numpad"; import { formatEur } from "@/src/utils/format"; import { handleNumpadKey, parseAmountStr } from "@/src/utils/numpad"; function AddModal({ onClose }: { onClose: () => void }) { const [label, setLabel] = useState(""); const [amountStr, setAmountStr] = useState("0"); const { mutate: create, isPending } = useCreateTransferLineItem(); const { t } = useTranslation(); function handleNumpad(key: string) { setAmountStr((prev) => handleNumpadKey(prev, key)); } function handleSave() { const amount = parseAmountStr(amountStr); if (!label.trim() || !amount || amount <= 0) return; create({ label: label.trim(), amount }, { onSuccess: onClose }); } const canSave = label.trim().length > 0 && parseAmountStr(amountStr) > 0; return ( € {amountStr} {t('transferItems.monthlyFixedAmount')} {t('transferItems.labelRequired')} ); } export default function TransferLineItemsScreen() { const insets = useSafeAreaInsets(); const router = useRouter(); const { t } = useTranslation(); const { data: items = [], isLoading } = useTransferLineItems(); const { mutate: deleteItem } = useDeleteTransferLineItem(); const [showAdd, setShowAdd] = useState(false); const total = items.reduce((sum, i) => sum + i.amount, 0); function handleDelete(item: TransferLineItem) { Alert.alert( t('transferItems.removeTitle'), t('transferItems.removeMessage', { label: item.label }), [ { text: t('common.cancel'), style: "cancel" }, { text: t('transferItems.remove'), style: "destructive", onPress: () => deleteItem(item.id) }, ], ); } return ( router.push("/(app)/settings")} className="mr-3 p-1"> {t('transferItems.title')} setShowAdd(true)} className="flex-row items-center gap-1 px-3 py-1.5 rounded-full" style={{ backgroundColor: "#dbeafe" }} > {t('transferItems.new')} {t('transferItems.hint')} {isLoading ? ( ) : ( item.id} renderItem={({ item }) => ( {item.label} {t('common.monthly')} {formatEur(item.amount, false)} handleDelete(item)} hitSlop={8} className="p-1"> )} ListEmptyComponent={ {t('transferItems.empty')} } ListFooterComponent={ items.length > 0 ? ( {t('transferItems.totalMonthly')} {formatEur(total, false)} ) : null } contentContainerStyle={{ paddingBottom: insets.bottom + 24 }} /> )} {showAdd && setShowAdd(false)} />} ); }