import React, { useState } from 'react'; import { View, TouchableOpacity, Dimensions, ActivityIndicator, RefreshControl, Alert } from 'react-native'; import { Image } from 'expo-image'; import { useRouter } from 'expo-router'; import { MaterialIcons, Feather } from '@expo/vector-icons'; import { MyText, tw, MyButton, useMarkDataFetchers } from 'common-ui'; import MyFlatList from 'common-ui/src/components/flat-list'; import { trpc } from '@/src/trpc-client'; import { LinearGradient } from 'expo-linear-gradient'; import Animated, { FadeInDown, FadeInUp } from 'react-native-reanimated'; const { width: screenWidth } = Dimensions.get('window'); interface StoreItemProps { item: any; index: number; isEditMode: boolean; onEdit: (storeId: number) => void; onDelete: (storeId: number) => void; } const StoreItem: React.FC = ({ item, index, isEditMode, onEdit, onDelete }) => { const CARD_MARGIN = 8; const cardWidth = (screenWidth - 32 - CARD_MARGIN * 2) / 2; return ( {/* Delete Button - Only visible in edit mode */} {isEditMode && ( onDelete(item.id)} style={tw`absolute top-2 right-2 z-10 bg-red-500 p-2 rounded-full shadow-lg`} > )} onEdit(item.id)} style={tw`flex-1`} disabled={isEditMode} // Disable navigation in edit mode > {/* Image Section - Portrait oriented */} {item.imageUrl ? ( ) : ( )} {/* Status Dot */} {/* Content Section */} {item.name} ID: #{item.id} {item.createdAt ? new Date(item.createdAt).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) : 'N/A'} {/* Action Footer */} View Details ); }; export default function Stores() { const router = useRouter(); const [isEditMode, setIsEditMode] = useState(false); const { data: storesData, isLoading, error, refetch } = trpc.admin.store.getStores.useQuery(); const { mutate: deleteStore, mutateAsync: deleteStoreAsync} = trpc.admin.store.deleteStore.useMutation(); useMarkDataFetchers(() => { refetch(); }); const stores = storesData?.stores || []; const handleEdit = (storeId: number) => { router.push({ pathname: '/edit-store', params: { id: storeId } }); }; const handleDelete = (storeId: number) => { Alert.alert( "Delete Store", "Are you sure you want to delete this store? This action cannot be undone. All products will be unassigned from this store.", [ { text: "Cancel", style: "cancel" }, { text: "Delete", style: "destructive", onPress: async () => { try { await deleteStoreAsync({ storeId }); refetch(); Alert.alert("Success", "Store deleted successfully"); } catch (error: any) { Alert.alert("Error", error.message || "Failed to delete store"); } } } ] ); }; const CARD_MARGIN = 8; const cardWidth = (screenWidth - 32 - CARD_MARGIN * 2) / 2; if (isLoading) { return ( Loading stores... ); } if (error) { return ( Oops! We couldn't load the stores. Please try again. refetch()} style={tw`bg-red-500 px-8 py-3 rounded-xl`}> Retry ); } return ( item.id.toString()} renderItem={({ item, index }) => } numColumns={2} columnWrapperStyle={tw`justify-start`} contentContainerStyle={tw`p-2 pb-24`} refreshControl={} ListHeaderComponent={ Stores Manage your outlets setIsEditMode(!isEditMode)} style={tw`bg-white border border-gray-200 px-4 py-2 rounded-full shadow-sm mr-2`} > {isEditMode ? 'Done' : 'Edit'} {stores.length} Locations } ListEmptyComponent={ No stores found Get started by adding your first store location. } /> {/* Floating Action Button for Adding New Store */} router.push('/add-store' as any)} > ); }