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)} />}
);
}