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"; 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")}

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

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.oralCavityArea && (

Oral Cavity Area: {" "} {line.oralCavityArea}

)} {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.

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

Attached Files

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

No files attached.

)}
)}
); }