import { permissions } from "@mrp/shared"; import type { CrmRecordStatus, CrmRecordSummaryDto } from "@mrp/shared/dist/crm/types.js"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { CrmStatusBadge } from "./CrmStatusBadge"; import { crmStatusFilters, type CrmEntity, crmConfigs } from "./config"; interface CrmListPageProps { entity: CrmEntity; } export function CrmListPage({ entity }: CrmListPageProps) { const { token, user } = useAuth(); const config = crmConfigs[entity]; const [records, setRecords] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [stateFilter, setStateFilter] = useState(""); const [statusFilter, setStatusFilter] = useState<"ALL" | CrmRecordStatus>("ALL"); const [status, setStatus] = useState(`Loading ${config.collectionLabel.toLowerCase()}...`); const canManage = user?.permissions.includes(permissions.crmWrite) ?? false; useEffect(() => { if (!token) { return; } const filters = { q: searchTerm.trim() || undefined, state: stateFilter.trim() || undefined, status: statusFilter === "ALL" ? undefined : statusFilter, }; const loadRecords = entity === "customer" ? api.getCustomers(token, filters) : api.getVendors(token, filters); loadRecords .then((nextRecords) => { setRecords(nextRecords); setStatus(`${nextRecords.length} ${config.collectionLabel.toLowerCase()} matched the current filters.`); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : `Unable to load ${config.collectionLabel.toLowerCase()}.`; setStatus(message); }); }, [config.collectionLabel, entity, searchTerm, stateFilter, statusFilter, token]); return (

CRM

{config.collectionLabel}

Operational contact records, shipping addresses, and account context for active {config.collectionLabel.toLowerCase()}.

{canManage ? ( New {config.singularLabel.toLowerCase()} ) : null}
{status}
{records.length === 0 ? (
{config.emptyMessage}
) : (
{records.map((record) => ( ))}
Name Status Email Phone Location Updated
{record.name} {record.email} {record.phone} {record.city}, {record.state}, {record.country} {new Date(record.updatedAt).toLocaleDateString()}
)}
); }