import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { formatDateToHumanReadable } from "@/utils/dateUtils"; import React, { useState } from "react"; import { ClaimStatus, ClaimWithServiceLines } from "@repo/db/types"; import { safeParseMissingTeeth, splitTeeth, ToothChip, toStatusLabel, } from "./tooth-ui"; type ClaimEditModalProps = { isOpen: boolean; onOpenChange: (open: boolean) => void; onClose: () => void; claim: ClaimWithServiceLines | null; onSave: (updatedClaim: ClaimWithServiceLines) => void; }; export default function ClaimEditModal({ isOpen, onOpenChange, onClose, claim, onSave, }: ClaimEditModalProps) { const [status, setStatus] = useState( claim?.status ?? ("PENDING" as ClaimStatus) ); if (!claim) return null; const handleSave = () => { const updatedClaim: ClaimWithServiceLines = { ...claim, status, }; onSave(updatedClaim); onOpenChange(false); }; return ( Edit Claim Status Update the status of the claim.
{/* Patient Details */}
{claim.patientName.charAt(0)}

{claim.patientName}

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

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

{/* Basic Info */}

Basic Information

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

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

Status:

Insurance Details

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

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

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

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

{/* Timestamps */}

Timestamps

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

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

{/* Staff Info */} {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 */}

Service Lines

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

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) => { const billed = line.totalBilled ? parseFloat(line.totalBilled as any) : 0; return total + billed; }, 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.

)}
{/* Actions */}
); }