import { permissions } from "@mrp/shared"; import type { CrmRecordDetailDto } from "@mrp/shared/dist/crm/types.js"; import { useEffect, useState } from "react"; import { Link, useParams } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { CrmStatusBadge } from "./CrmStatusBadge"; import { type CrmEntity, crmConfigs } from "./config"; interface CrmDetailPageProps { entity: CrmEntity; } export function CrmDetailPage({ entity }: CrmDetailPageProps) { const { token, user } = useAuth(); const { customerId, vendorId } = useParams(); const recordId = entity === "customer" ? customerId : vendorId; const config = crmConfigs[entity]; const [record, setRecord] = useState(null); const [status, setStatus] = useState(`Loading ${config.singularLabel.toLowerCase()}...`); const canManage = user?.permissions.includes(permissions.crmWrite) ?? false; useEffect(() => { if (!token || !recordId) { return; } const loadRecord = entity === "customer" ? api.getCustomer(token, recordId) : api.getVendor(token, recordId); loadRecord .then((nextRecord) => { setRecord(nextRecord); setStatus(`${config.singularLabel} record loaded.`); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : `Unable to load ${config.singularLabel.toLowerCase()}.`; setStatus(message); }); }, [config.singularLabel, entity, recordId, token]); if (!record) { return
{status}
; } return (

CRM Detail

{record.name}

{config.singularLabel} record last updated {new Date(record.updatedAt).toLocaleString()}.

Back to {config.collectionLabel.toLowerCase()} {canManage ? ( Edit {config.singularLabel.toLowerCase()} ) : null}

Contact

Email
{record.email}
Phone
{record.phone}
Address
{[record.addressLine1, record.addressLine2, `${record.city}, ${record.state} ${record.postalCode}`, record.country] .filter(Boolean) .join("\n")}

Notes

{record.notes || "No internal notes recorded for this account yet."}

Created {new Date(record.createdAt).toLocaleDateString()}
); }