import React, { useMemo, useState } from 'react'; import { Input, Icon } from '@akinon/next/components'; import { detectCardType, getCardIcon, getCvcLength } from '../utils/card-utils'; import { getCappedRewardTotal } from '../utils/reward-utils'; import type { CardListProps } from '../types/custom-render.types'; import MasterpassSecurityInfo from './masterpass-security-info'; const CardList: React.FC = ({ cards, onCardSelect, selectedCard, onRemove, removingCardId, cvc = '', onCvcChange, cvcRequired = false, availableRewards = [], selectedRewards = [], isLoadingRewards = false, onOpenRewardModal, rewardCurrency, rewardPayableAmount, texts }) => { const [localCvc, setLocalCvc] = useState(cvc); const handleCvcChange = (value: string) => { const numericValue = value.replace(/\D/g, '').slice(0, 4); setLocalCvc(numericValue); onCvcChange?.(numericValue); }; const orderedCards = useMemo(() => { if (!selectedCard) return cards; const idx = cards.findIndex( (c) => c.uniqueCardNumber === selectedCard.uniqueCardNumber ); if (idx <= 0) return cards; const reordered = [...cards]; const [picked] = reordered.splice(idx, 1); reordered.unshift(picked); return reordered; }, [cards, selectedCard]); return (
{orderedCards.map((card) => { const isSelected = selectedCard?.uniqueCardNumber === card.uniqueCardNumber; const expectedCvcLength = getCvcLength(detectCardType(card.cardBin)); return (
onCardSelect(card)} >
{/* Selection Indicator - Moved to beginning */}
{isSelected && (
)}
{card.cardType}
{card.maskedCardNumber}
{card.cardAlias}
{card.cardType} {card.isDefaultCard && ( {texts.defaultCardText} )} {card.expireSoon && ( {texts.expiresSoonText} )}
{onRemove && ( )}
{isSelected && (isLoadingRewards || availableRewards.length > 0) && (
e.stopPropagation()} >

{texts.rewardOpenButtonText}

{selectedRewards.length > 0 ? (

{(texts.rewardSelectedSummaryText || '').replace( '{count}', String(selectedRewards.length) )} {' ยท '} {getCappedRewardTotal( selectedRewards, rewardPayableAmount ).toFixed(2)}{' '} {(rewardCurrency || '').toUpperCase()}

) : (

{(texts.rewardAvailableSummaryText || '').replace( '{count}', String(availableRewards.length) )}

)}
)} {isSelected && cvcRequired && (
e.stopPropagation()} >
) => handleCvcChange(e.target.value) } maxLength={expectedCvcLength} className="w-32" />

{texts.cvcCardHelpText ?.replace('{length}', expectedCvcLength.toString()) .replace( '{side}', expectedCvcLength === 4 ? texts.cvcFrontText : texts.cvcBackText )}

{texts.secureCardText}
)}
); })}
); }; export default CardList;