import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import React from "react"; import { formatDateToHumanReadable } from "@/utils/dateUtils"; import { ClaimFileMeta, ClaimWithServiceLines } from "@repo/db/types"; import { FileText, Paperclip } from "lucide-react"; import { safeParseMissingTeeth, splitTeeth, ToothChip, toStatusLabel, } from "./tooth-ui"; type ClaimViewModalProps = { isOpen: boolean; onOpenChange: (open: boolean) => void; onClose: () => void; claim: ClaimWithServiceLines | null; onEditClaim: (claim: ClaimWithServiceLines) => void; }; export default function ClaimViewModal({ isOpen, onOpenChange, onClose, claim, onEditClaim, }: ClaimViewModalProps) { // Normalizer: supports both ClaimFile[] and nested-create shape { create: ClaimFile[] } const getClaimFilesArray = ( c: ClaimWithServiceLines | null ): ClaimFileMeta[] => { if (!c) return []; // If it's already a plain array (runtime from Prisma include), return it const maybeFiles = (c as any).claimFiles; if (!maybeFiles) return []; if (Array.isArray(maybeFiles)) { // ensure each item has filename field (best-effort) return maybeFiles.map((f: any) => ({ id: f?.id, filename: String(f?.filename ?? ""), mimeType: f?.mimeType ?? f?.mime ?? null, })); } // Nested-create shape: { create: [...] } if (maybeFiles && Array.isArray(maybeFiles.create)) { return maybeFiles.create.map((f: any) => ({ id: f?.id, filename: String(f?.filename ?? ""), mimeType: f?.mimeType ?? f?.mime ?? null, })); } // No recognized shape -> empty return []; }; const claimFiles = getClaimFilesArray(claim); return ( Claim Details Detailed view of the selected claim. {claim && (
{claim.patientName.charAt(0)}

{claim.patientName}

Claim ID: {claim.id?.toString().padStart(4, "0")}

Claim No: {claim.claimNumber || "—"}

Basic Information

Date of Birth:{" "} {formatDateToHumanReadable(claim.dateOfBirth)}

Service Date:{" "} {formatDateToHumanReadable(claim.serviceDate)}

Status:{" "} {claim?.status ? claim.status.charAt(0).toUpperCase() + claim.status.slice(1).toLowerCase() : "Unknown"}

Insurance Details

Claim Number:{" "} {claim.claimNumber || "—"}

Insurance Provider:{" "} {claim.insuranceProvider || "N/A"}

Member ID:{" "} {claim.memberId}

Remarks:{" "} {claim.remarks || "N/A"}

{/* Metadata */}

Timestamps

Created At:{" "} {formatDateToHumanReadable(claim.createdAt)}

Updated At:{" "} {formatDateToHumanReadable(claim.updatedAt)}

{claim.staff && (

Assigned Staff

Name:{" "} {claim.staff.name}

Role:{" "} {claim.staff.role}

{claim.staff.email && (

Email:{" "} {claim.staff.email}

)} {claim.staff.phone && (

Phone:{" "} {claim.staff.phone}

)}
)}

Service Lines

{claim.serviceLines.length > 0 ? ( <> {claim.serviceLines.map((line, index) => (

Procedure Code:{" "} {line.procedureCode}

Procedure Date:{" "} {formatDateToHumanReadable(line.procedureDate)}

{line.quad && (

Quad:{" "} {line.quad}

)} {line.arch && (

Arch:{" "} {line.arch}

)} {line.toothNumber && (

Tooth Number:{" "} {line.toothNumber}

)} {line.toothSurface && (

Tooth Surface: {" "} {line.toothSurface}

)}

Billed Amount:{" "} ${Number(line.totalBilled).toFixed(2)}

))}
Total Billed Amount: $ {claim.serviceLines .reduce( (total, line) => total + Number(line.totalBilled || 0), 0 ) .toFixed(2)}
) : (

No service lines available.

)}
{/* Missing Teeth */}

Missing Teeth

Status:{" "} {toStatusLabel((claim as any).missingTeethStatus)}

{/* Only show details when the user chose "Specify Missing" */} {(claim as any).missingTeethStatus === "Yes_missing" && (() => { const map = safeParseMissingTeeth( (claim as any).missingTeeth ); const { permanent, primary } = splitTeeth(map); const hasAny = permanent.length > 0 || primary.length > 0; if (!hasAny) { return (

No specific teeth marked as missing.

); } return (
{permanent.length > 0 && (
Permanent
{permanent.map((t) => ( ))}
)} {primary.length > 0 && (
Primary
{primary.map((t) => ( ))}
)}
); })()} {(claim as any).missingTeethStatus === "endentulous" && (

Patient is edentulous.

)}
{/* Claim Files (metadata) */}

Attached Files

{claimFiles.length > 0 ? (
    {claimFiles.map((f) => (
  • {f.filename}
    {f.mimeType || "unknown"}
  • ))}
) : (

No files attached.

)}
)}
); }