import React, { useState } from "react"; import { View, Text, TouchableOpacity, Alert } from "react-native"; import { tw, ConfirmationDialog, MyText, MyFlatList, useMarkDataFetchers, usePagination, ImageViewerURI } from "common-ui"; import { trpc } from "@/src/trpc-client"; export default function Complaints() { const { currentPage, pageSize, PaginationComponent } = usePagination(5); // 5 complaints per page for testing const { data, isLoading, error, refetch } = trpc.admin.complaint.getAll.useQuery({ page: currentPage, limit: pageSize, }); const resolveComplaint = trpc.admin.complaint.resolve.useMutation(); useMarkDataFetchers(() => { refetch(); }); const [dialogOpen, setDialogOpen] = useState(false); const [selectedComplaintId, setSelectedComplaintId] = useState(null); const complaints = data?.complaints || []; const totalCount = data?.totalCount || 0; const handleMarkResolved = (id: number) => { setSelectedComplaintId(id); setDialogOpen(true); }; const handleConfirmResolve = (response?: string) => { if (!selectedComplaintId) return; resolveComplaint.mutate( { id: String(selectedComplaintId), response }, { onSuccess: () => { Alert.alert("Success", "Complaint marked as resolved"); refetch(); setDialogOpen(false); setSelectedComplaintId(null); }, onError: (error: any) => { Alert.alert( "Error", error.message || "Failed to resolve complaint" ); setDialogOpen(false); setSelectedComplaintId(null); }, } ); }; if (isLoading) { return ( Loading complaints... ); } if (error) { return ( Error loading complaints ); } return ( item.id.toString()} renderItem={({ item }) => ( Complaint #{item.id} {item.text} {item.images && item.images.length > 0 && ( Attached Images: {item.images.map((imageUri: string, index: number) => ( ))} )} Alert.alert("User Page", "User page coming soon") } > {item.userName} | {item.orderId && ( Alert.alert("Order Page", "Order page coming soon") } > Order #{item.orderId} )} Status: {item.status} {item.status === "pending" && ( handleMarkResolved(item.id)} style={tw`mt-2 bg-blue-500 p-3 rounded-lg shadow-md`} > Mark as Resolved )} )} ListEmptyComponent={ No complaints found } /> { setDialogOpen(false); setSelectedComplaintId(null); }} title="Mark as Resolved" message="Add admin notes for this resolution:" confirmText="Resolve" cancelText="Cancel" /> ); }