import { useState, useMemo, useCallback } from "react"; import { createFileRoute, Link } from "@tanstack/react-router"; import { Search, Plus, Pencil, Trash2, Truck } from "lucide-react"; import { GridTable } from "#/components/GridTable"; import type { GridTableColumn } from "#/components/GridTable"; import { useListDistributors, useRemoveDistributor, trpc, } from "shared-react"; interface DistributorRow { id: number; agency: string; contact: string; mobile: string; address: string | null; } function makeColumns( onDelete: (row: DistributorRow) => void, ): GridTableColumn[] { return [ { id: "agency", header: "Agency Name", cell: ({ row }) => ( {row.agency} ), }, { id: "contact", header: "Contact Person", cell: ({ row }) => ( {row.contact} ), }, { id: "mobile", header: "Contact Mobile", cell: ({ row }) => ( {row.mobile} ), }, { id: "address", header: "Address", cell: ({ row }) => ( {row.address || "—"} ), }, { id: "actions", header: "Actions", size: 90, cell: ({ row }) => (
), }, ]; } export const Route = createFileRoute("/distributors/")({ component: DistributorsIndexPage, staticData: { title: "Distributors", subtitle: "Manage product distributors & agencies", }, }); function DistributorsIndexPage() { const [searchQuery, setSearchQuery] = useState(""); const { data: distributors, isLoading, error } = useListDistributors(); const removeMutation = useRemoveDistributor(); const utils = trpc.useUtils(); const handleDelete = useCallback( (row: DistributorRow) => { if (!confirm(`Delete ${row.agency}?`)) return; removeMutation.mutate( { id: row.id }, { onSuccess: () => utils.distributor.list.invalidate(), }, ); }, [removeMutation, utils], ); const columns = useMemo(() => makeColumns(handleDelete), [handleDelete]); const filtered = useMemo(() => { const q = searchQuery.toLowerCase().trim(); if (!q) return distributors ?? []; return (distributors ?? []).filter((d) => { return ( d.agency.toLowerCase().includes(q) || d.contact.toLowerCase().includes(q) || d.mobile.includes(q) ); }); }, [searchQuery, distributors]); if (isLoading) { return (
Loading distributors...
); } if (error) { return (
Failed to load distributors.
); } return (
setSearchQuery(e.target.value)} placeholder="Search distributors..." className="bg-transparent border-none outline-none text-sm text-slate-900 w-full placeholder:text-slate-400" />
Add Distributor

No distributors found

{searchQuery ? "No distributors match your search. Try a different term." : "Add your first distributor to get started."}

} /> ); }