import { Ionicons } from "@expo/vector-icons"; import { useState } from "react"; import { Modal, Pressable, ScrollView, Text, TextInput, View, } from "react-native"; import { useCreateDebt } from "@/src/hooks/useDebts"; import { useHouseholdMembers } from "@/src/hooks/useHouseholdMembers"; import { useAuthStore } from "@/src/stores/auth.store"; import { useTranslation } from "react-i18next"; import { ModalHeader } from "@/src/components/ui/ModalHeader"; import { Numpad } from "@/src/components/ui/Numpad"; import { handleNumpadKey, parseAmountStr } from "@/src/utils/numpad"; type Props = { visible: boolean; onClose: () => void; }; export function AddDebtModal({ visible, onClose }: Props) { const [label, setLabel] = useState(""); const [amountStr, setAmountStr] = useState("0"); const [notes, setNotes] = useState(""); // creditor: internal member OR free text const [creditorUserId, setCreditorUserId] = useState(null); const [creditorText, setCreditorText] = useState(""); const [showMemberPicker, setShowMemberPicker] = useState(false); const { mutate: createDebt, isPending } = useCreateDebt(); const { data: membersData } = useHouseholdMembers(); const myUserId = useAuthStore((s) => s.user?.id); const { t } = useTranslation(); // Only other members (not myself) const otherMembers = (membersData?.members ?? []).filter((m) => m.userId !== myUserId); const selectedMember = otherMembers.find((m) => m.userId === creditorUserId) ?? null; function handleNumpad(key: string) { setAmountStr((prev) => handleNumpadKey(prev, key)); } function handleSave() { const amount = parseAmountStr(amountStr); if (!label.trim() || !amount || amount <= 0) return; createDebt( { label: label.trim(), creditorUserId: creditorUserId ?? undefined, creditor: !creditorUserId && creditorText.trim() ? creditorText.trim() : undefined, totalAmount: amount, notes: notes.trim() || undefined, }, { onSuccess: resetAndClose }, ); } function resetAndClose() { setLabel(""); setAmountStr("0"); setNotes(""); setCreditorUserId(null); setCreditorText(""); setShowMemberPicker(false); onClose(); } const canSave = label.trim().length > 0 && parseAmountStr(amountStr) > 0; return ( {/* Header */} {/* Amount display */} € {amountStr} {t('debts.totalAmount')} {/* Fields */} {t('debts.labelRequired')} {/* Creditor picker */} {t('debts.iOweMoneyTo')} {/* Member select row */} {otherMembers.length > 0 && ( setShowMemberPicker((v) => !v)} className="flex-row items-center bg-gray-50 border border-gray-200 rounded-xl px-4 py-3 mb-2" > {selectedMember ? selectedMember.name : t('debts.selectMember')} {selectedMember ? ( { e.stopPropagation(); setCreditorUserId(null); }} hitSlop={8} > ) : ( )} )} {/* Member dropdown */} {showMemberPicker && ( {otherMembers.map((m) => ( { setCreditorUserId(m.userId); setCreditorText(""); setShowMemberPicker(false); }} className="flex-row items-center px-4 py-3 active:bg-gray-50" style={{ borderBottomWidth: 1, borderBottomColor: "#f3f4f6" }} > {m.name.charAt(0).toUpperCase()} {m.name} {creditorUserId === m.userId && ( )} ))} )} {/* Free-text fallback (only when no member selected) */} {!creditorUserId && ( )} {t('debts.noteOptional')} {/* Numpad */} ); }