import React, { useState, useEffect } from 'react'; import { View, Text, TouchableOpacity, ScrollView } from 'react-native'; import { tw, BottomDialog } from 'common-ui'; import { useQueryClient } from '@tanstack/react-query'; import AddressForm from '@/src/components/AddressForm'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { trpc } from '@/src/trpc-client'; interface AddressSelectorProps { selectedAddress: number | null; onAddressSelect: (addressId: number) => void; } const CheckoutAddressSelector: React.FC = ({ selectedAddress, onAddressSelect, }) => { const [showAddAddress, setShowAddAddress] = useState(false); const queryClient = useQueryClient(); const { data: addresses } = trpc.user.address.getUserAddresses.useQuery(); // Sort addresses with selected first, then default, then others const sortedAddresses = React.useMemo(() => { if (!addresses?.data) return []; return [...addresses.data].sort((a, b) => { // Selected address comes first if (selectedAddress === a.id && selectedAddress !== b.id) return -1; if (selectedAddress === b.id && selectedAddress !== a.id) return 1; // Then default address (if not already selected) if (a.isDefault && !b.isDefault) return -1; if (!a.isDefault && b.isDefault) return 1; // Maintain stable sort by id for other addresses return a.id - b.id; }); }, [addresses?.data, selectedAddress]); // Auto-select default address when addresses are loaded and none is selected useEffect(() => { if (sortedAddresses.length > 0 && selectedAddress === null) { const defaultAddress = sortedAddresses.find(addr => addr.isDefault); if (defaultAddress) { onAddressSelect(defaultAddress.id); } } }, [sortedAddresses, selectedAddress, onAddressSelect]); return ( <> Delivery Address setShowAddAddress(true)}> + Add New {(!sortedAddresses || sortedAddresses.length === 0) ? ( No addresses found setShowAddAddress(true)} style={tw`mt-3 bg-brand500 px-4 py-2 rounded-lg`}> Add Address ) : ( {sortedAddresses.map((address) => ( onAddressSelect(address.id)} style={tw`w-72 p-4 mr-3 bg-gray-50 rounded-xl border-2 ${selectedAddress === address.id ? 'border-brand500 bg-blue-50' : 'border-gray-200' } shadow-sm`} > {address.name} {selectedAddress === address.id && ( )} {address.addressLine1}{address.addressLine2 ? `, ${address.addressLine2}` : ''} {address.city}, {address.state} - {address.pincode} Phone: {address.phone} ))} )} setShowAddAddress(false)}> { setShowAddAddress(false); queryClient.invalidateQueries(); }} /> ); }; export default CheckoutAddressSelector;