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