import React from "react"; import { View, Text, ScrollView, TouchableOpacity, FlatList, } from "react-native"; import { Button } from "~/components/ui/button"; import { LucideCreditCard, LucidePlus, LucideTrash } from "lucide-react-native"; import { ROUTES } from "~/lib/routes"; import { router } from "expo-router"; import { useAuthWithProfile } from "~/lib/hooks/useAuthWithProfile"; import { useUserWallet } from "~/lib/hooks/useUserWallet"; import { CreditCard } from "~/lib/services/walletService"; import TopBar from "~/components/ui/topBar"; import { ApplePayIcon, CreditDebitCardIcon, GooglePayIcon, } from "~/components/ui/icons"; import ScreenWrapper from "~/components/ui/ScreenWrapper"; import { Input } from "~/components/ui/input"; import ModalToast from "~/components/ui/toast"; import { useTranslation } from "react-i18next"; import PermissionAlertModal from "~/components/ui/permissionAlertModal"; // Individual Card Component const CardItem = ({ card, onRemove, }: { card: CreditCard; onRemove: (card: CreditCard) => void; }) => { const getCardColor = (cardType: string) => { switch (cardType?.toLowerCase()) { case "visa": return "bg-blue-50"; case "mastercard": return "bg-green-50"; case "american express": return "bg-green-50"; case "discover": return "bg-orange-50"; default: return "bg-gray-50"; } }; const handleRemovePress = (card: CreditCard) => { setSelectedCard(card); setRemoveModalVisible(true); }; const handleRemove = () => { onRemove(card); }; return ( {card.cardType || "Card"} {card.cardNumber} Expires {card.expiryDate} ); }; export default function ListCard() { const { user } = useAuthWithProfile(); const { wallet, loading, error, removeCreditCard } = useUserWallet(user); const [searchQuery, setSearchQuery] = React.useState(""); const { t } = useTranslation(); const [toastVisible, setToastVisible] = React.useState(false); const [toastTitle, setToastTitle] = React.useState(""); const [toastDescription, setToastDescription] = React.useState< string | undefined >(undefined); const [toastVariant, setToastVariant] = React.useState< "success" | "error" | "warning" | "info" >("info"); const toastTimeoutRef = React.useRef | null>( null ); const [removeModalVisible, setRemoveModalVisible] = React.useState(false); const [selectedCard, setSelectedCard] = React.useState( null ); const showToast = ( title: string, description?: string, variant: "success" | "error" | "warning" | "info" = "info" ) => { if (toastTimeoutRef.current) { clearTimeout(toastTimeoutRef.current); } setToastTitle(title); setToastDescription(description); setToastVariant(variant); setToastVisible(true); toastTimeoutRef.current = setTimeout(() => { setToastVisible(false); toastTimeoutRef.current = null; }, 2500); }; React.useEffect(() => { return () => { if (toastTimeoutRef.current) { clearTimeout(toastTimeoutRef.current); } }; }, []); const handleRemoveCard = async (cardId: string) => { try { await removeCreditCard(cardId); showToast( t("cards.toastRemoveSuccessTitle"), t("cards.toastRemoveSuccess"), "success" ); } catch (error) { showToast( t("cards.toastRemoveErrorTitle"), t("cards.toastRemoveError"), "error" ); } }; const renderCards = () => { if (loading) { return ( {t("cardmang.loading")} ); } if (error) { return ( {t("cardmang.errorTitle")} {error} ); } if (!wallet?.cards || wallet.cards.length === 0) { return ( {t("cardmang.emptyTitle")} {t("cardmang.emptySubtitle")} ); } return ( item.id + String(index)} scrollEnabled={false} ItemSeparatorComponent={() => } renderItem={({ item }) => ( )} /> ); }; return ( {t("cardmang.title")} {t("cardmang.subtitle")} {/* Add Card Button */} {/* Cards List */} {t("cardmang.paymentOptionsTitle")} {renderCards()} { if (selectedCard) { await handleRemoveCard(selectedCard.id); } setRemoveModalVisible(false); setSelectedCard(null); }} onSecondary={() => { setRemoveModalVisible(false); setSelectedCard(null); }} /> ); }