import React, { useState } from 'react'; import { View, Alert, Modal } from 'react-native'; import { useRouter } from 'expo-router'; import { AppContainer, MyText, tw, useMarkDataFetchers, MyFlatList, MyTouchableOpacity } from 'common-ui'; import { trpc } from '@/src/trpc-client'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import AddressForm from '@/src/components/AddressForm'; interface Address { id: number; name: string; phone: string; addressLine1: string; addressLine2: string | null; city: string; state: string; pincode: string; isDefault: boolean; } function AddressCard({ address, onEdit, onDelete, onSetDefault, isDeleting }: { address: Address; onEdit: (address: Address) => void; onDelete: (id: number) => void; onSetDefault: (id: number) => void; isDeleting?: boolean; }) { const formatAddress = (addr: Address) => { return `${addr.addressLine1}${addr.addressLine2 ? `, ${addr.addressLine2}` : ''}, ${addr.city}, ${addr.state} - ${addr.pincode}`; }; return ( {address.name} {address.isDefault && ( Default )} 📞 {address.phone} 📍 {formatAddress(address)} {!address.isDefault && ( onSetDefault(address.id)} > Set Default )} onEdit(address)} > Edit onDelete(address.id)} disabled={isDeleting} > {isDeleting ? 'Deleting...' : 'Delete'} ); } export default function Addresses() { const [modalVisible, setModalVisible] = useState(false); const [editingAddress, setEditingAddress] = useState
(null); const { data, isLoading, error, refetch } = trpc.user.address.getUserAddresses.useQuery(); useMarkDataFetchers(() => { refetch(); }); const addresses = data?.data || []; const updateAddressMutation = trpc.user.address.updateAddress.useMutation(); const deleteAddressMutation = trpc.user.address.deleteAddress.useMutation(); const handleAddAddress = () => { setEditingAddress(null); setModalVisible(true); }; const handleEditAddress = (address: Address) => { setEditingAddress(address); setModalVisible(true); }; const handleDeleteAddress = (id: number) => { Alert.alert( 'Delete Address', 'Are you sure you want to delete this address?', [ { text: 'Cancel', style: 'cancel' }, { text: 'Delete', style: 'destructive', onPress: () => { deleteAddressMutation.mutate({ id }, { onSuccess: () => { refetch(); Alert.alert('Success', 'Address deleted successfully'); }, onError: (error) => { Alert.alert('Error', error.message || 'Failed to delete address'); } }); } } ] ); }; const handleSetDefault = (id: number) => { // Update the address to be default const addressToUpdate = addresses.find(addr => addr.id === id); if (addressToUpdate) { updateAddressMutation.mutate({ id: addressToUpdate.id, name: addressToUpdate.name, phone: addressToUpdate.phone, addressLine1: addressToUpdate.addressLine1, addressLine2: addressToUpdate.addressLine2 || undefined, city: addressToUpdate.city, state: addressToUpdate.state, pincode: addressToUpdate.pincode, isDefault: true, }, { onSuccess: () => { refetch(); Alert.alert('Success', 'Default address updated'); }, onError: (error) => { Alert.alert('Error', error.message || 'Failed to update default address'); } }); } }; const handleAddressSubmit = () => { setModalVisible(false); setEditingAddress(null); refetch(); }; if (isLoading) { return ( Loading addresses... ); } if (error) { return ( Failed to load addresses. Please try again. refetch()} > Retry ); } return ( <> ( )} keyExtractor={(item) => item.id.toString()} ListHeaderComponent={() => ( My Addresses )} ListEmptyComponent={() => ( No addresses found Add your first delivery address Add Address )} contentContainerStyle={tw`p-4`} showsVerticalScrollIndicator={false} /> setModalVisible(false)} > {editingAddress ? 'Edit Address' : 'Add Address'} setModalVisible(false)} style={tw`p-1`} > ); }