import React, { useState } from 'react'; import { View, ScrollView, TouchableOpacity, Alert, Dimensions, Share } from 'react-native'; import { theme, AppContainer, MyText, tw, useManualRefresh, useMarkDataFetchers, MyTouchableOpacity } from 'common-ui'; import { trpc, trpcClient } from '../../../src/trpc-client'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { Ionicons } from "@expo/vector-icons"; import dayjs from "dayjs"; import { LinearGradient } from "expo-linear-gradient"; import { useRouter } from 'expo-router'; import VendorSnippetForm from '../../../components/VendorSnippetForm'; import SnippetOrdersView from '../../../components/SnippetOrdersView'; import { SnippetMenu } from '../../../components/SnippetMenu'; interface VendorSnippet { id: number; snippetCode: string; slotId: number; productIds: number[]; validTill: string | null; createdAt: string; accessUrl: string; slot?: { id: number; deliveryTime: string; freezeTime: string; isActive: boolean; deliverySequence?: unknown; }; } const SnippetItem = ({ snippet, onEdit, onDelete, onViewOrders, index }: { snippet: VendorSnippet; onEdit: (snippet: VendorSnippet) => void; onDelete: (id: number) => void; onViewOrders: (snippetCode: string) => void; index: number; }) => { const isExpired = snippet.validTill && dayjs(snippet.validTill).isBefore(dayjs()); const handleCopyLink = async () => { try { await Share.share({ message: snippet.accessUrl, }); } catch (error) { Alert.alert('Error', 'Failed to share link'); } }; return ( {/* Top Header: ID & Status */} Identifier {snippet.snippetCode} {isExpired ? 'Expired' : 'Active'} {/* Middle: Delivery Banner */} {snippet.slot?.deliveryTime ? dayjs(snippet.slot.deliveryTime).format('ddd, MMM DD') : 'Schedule Pending'} Time: {snippet.slot?.deliveryTime ? dayjs(snippet.slot.deliveryTime).format('hh:mm A') : 'N/A'} {snippet.validTill && ( Expires {dayjs(snippet.validTill).format('MMM DD')} )} {/* Stats & Actions */} {snippet.productIds.length} Items Share router.push(`/(drawer)/slots/slot-details?slotId=${snippet.slotId}`)} onPress={() => {}} activeOpacity={0.7} style={tw`flex-row items-center`} > View Slot ); }; export default function VendorSnippets() { // const { data: snippets, isLoading, error, refetch } = useVendorSnippets(); const { data: snippets, isLoading, error, refetch } = trpc.admin.vendorSnippets.getAll.useQuery(); const createSnippet = trpc.admin.vendorSnippets.create.useMutation(); const updateSnippet = trpc.admin.vendorSnippets.update.useMutation(); const deleteSnippet = trpc.admin.vendorSnippets.delete.useMutation(); // const createSnippet = useCreateVendorSnippet(); // const updateSnippet = useUpdateVendorSnippet(); // const deleteSnippet = useDeleteVendorSnippet(); const router = useRouter(); const [showCreateForm, setShowCreateForm] = useState(false); const [editingSnippet, setEditingSnippet] = useState(null); const [showOrdersView, setShowOrdersView] = useState(false); const [ordersData, setOrdersData] = useState(null); useManualRefresh(refetch); useMarkDataFetchers(() => { refetch(); }); const handleCreate = () => { setShowCreateForm(true); setEditingSnippet(null); }; const handleEdit = (snippet: VendorSnippet) => { setEditingSnippet(snippet); setShowCreateForm(true); }; const handleDelete = (id: number) => { deleteSnippet.mutate({ id }, { onSuccess: () => { refetch(); } }); }; const handleViewOrders = async (snippetCode: string) => { try { const result = await trpcClient.admin.vendorSnippets.getOrdersBySnippet.query({ snippetCode }); if (result.success) { setOrdersData({ orders: result.data, snippetCode: snippetCode, }); setShowOrdersView(true); } else { Alert.alert('Error', 'Failed to fetch orders'); } } catch (error: any) { Alert.alert('Error', error.message || 'Failed to fetch orders'); } }; if (isLoading) { return ( Loading vendor snippets... ); } if (error) { return ( Error loading snippets ); } if (showOrdersView && ordersData) { return ( { setShowOrdersView(false); setOrdersData(null); }} /> ); } if (showCreateForm) { return ( { setShowCreateForm(false); setEditingSnippet(null); }} onSuccess={() => { setShowCreateForm(false); setEditingSnippet(null); refetch(); }} /> ); } return ( {snippets && snippets.length === 0 ? ( No Snippets Yet Start by creating your first vendor identifier using the button below. ) : ( snippets?.map((snippet, index) => ( {index < snippets.length - 1 && ( )} )) )} {/* Global Floating Action Button */} ); }