import { useEffect, useState } from "react"; import { useMutation } from "@tanstack/react-query"; import { TopAppBar } from "@/components/layout/top-app-bar"; import { Sidebar } from "@/components/layout/sidebar"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { CalendarIcon, CheckCircle, LoaderCircleIcon } from "lucide-react"; import { PatientUncheckedCreateInputObjectSchema } from "@repo/db/usedSchemas"; import { useAuth } from "@/hooks/use-auth"; import { useToast } from "@/hooks/use-toast"; import { z } from "zod"; import { PatientTable } from "@/components/patients/patient-table"; import { format } from "date-fns"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { useAppDispatch, useAppSelector } from "@/redux/hooks"; import { setTaskStatus, clearTaskStatus, } from "@/redux/slices/seleniumEligibilityCheckTaskSlice"; import { SeleniumTaskBanner } from "@/components/claims/selenium-task-banner"; import { formatLocalDate, parseLocalDate } from "@/utils/dateUtils"; const PatientSchema = ( PatientUncheckedCreateInputObjectSchema as unknown as z.ZodObject ).omit({ appointments: true, }); type Patient = z.infer; const insertPatientSchema = ( PatientUncheckedCreateInputObjectSchema as unknown as z.ZodObject ).omit({ id: true, createdAt: true, userId: true, }); type InsertPatient = z.infer; export default function InsuranceEligibilityPage() { const { user } = useAuth(); const { toast } = useToast(); const dispatch = useAppDispatch(); const { status, message, show } = useAppSelector( (state) => state.seleniumEligibilityCheckTask ); const [selectedPatient, setSelectedPatient] = useState(null); const [currentTablePage, setCurrentTablePage] = useState(null); const [currentTableSearchTerm, setCurrentTableSearchTerm] = useState< string | null >(null); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const toggleMobileMenu = () => { setIsMobileMenuOpen(!isMobileMenuOpen); }; // Insurance eligibility check form fields const [memberId, setMemberId] = useState(""); const [dateOfBirth, setDateOfBirth] = useState(); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [isCheckingEligibility, setIsCheckingEligibility] = useState(false); // Populate fields from selected patient useEffect(() => { if (selectedPatient) { setMemberId(selectedPatient.insuranceId ?? ""); setFirstName(selectedPatient.firstName ?? ""); setLastName(selectedPatient.lastName ?? ""); const dob = typeof selectedPatient.dateOfBirth === "string" ? parseLocalDate(selectedPatient.dateOfBirth) : selectedPatient.dateOfBirth; setDateOfBirth(dob); } else { setMemberId(""); setFirstName(""); setLastName(""); setDateOfBirth(undefined); } }, [selectedPatient]); // Add patient mutation const addPatientMutation = useMutation({ mutationFn: async (patient: InsertPatient) => { const res = await apiRequest("POST", "/api/patients/", patient); return res.json(); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["patients"] }); toast({ title: "Success", description: "Patient added successfully!", variant: "default", }); }, onError: (error: any) => { const msg = error.message; if (msg === "A patient with this insurance ID already exists.") { toast({ title: "Patient already exists", description: msg, variant: "destructive", }); } else { toast({ title: "Error", description: `Failed to add patient: ${msg}`, variant: "destructive", }); } }, }); // handle selenium const handleSelenium = async () => { const formattedDob = dateOfBirth ? formatLocalDate(dateOfBirth) : ""; const data = { memberId, dateOfBirth: formattedDob, insuranceSiteKey: "MH", }; try { dispatch( setTaskStatus({ status: "pending", message: "Sending Data to Selenium...", }) ); const response = await apiRequest( "POST", "/api/insuranceEligibility/check", { data: JSON.stringify(data) } ); const result = await response.json(); if (result.error) throw new Error(result.error); dispatch( setTaskStatus({ status: "success", message: "Patient status is updated, and its eligibility pdf is uploaded at Document Page.", }) ); toast({ title: "Selenium service done.", description: "Your Patient Eligibility is fetched and updated, Kindly search through the patient.", variant: "default", }); } catch (error: any) { dispatch( setTaskStatus({ status: "error", message: error.message || "Selenium submission failed", }) ); toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive", }); } }; const handleAddPatient = async () => { const newPatient: InsertPatient = { firstName, lastName, dateOfBirth: dateOfBirth, gender: "", phone: "", userId: user?.id ?? 1, status: "active", insuranceId: memberId, }; await addPatientMutation.mutateAsync(newPatient); }; // Handle insurance provider button clicks const handleMHButton = async () => { // Form Fields check if (!memberId || !dateOfBirth || !firstName) { toast({ title: "Missing Fields", description: "Please fill in all the required fields: Member ID, Date of Birth, First Name.", variant: "destructive", }); return; } setIsCheckingEligibility(true); // Adding patient if same patient exists then it will skip. try { if (!selectedPatient) { await handleAddPatient(); } await handleSelenium(); await queryClient.invalidateQueries({ queryKey: [ "patients", { page: currentTablePage ?? 1, search: currentTableSearchTerm ?? "recent", }, ], }); } finally { setIsCheckingEligibility(false); } }; return (
dispatch(clearTaskStatus())} />
{/* Header */}

Insurance Eligibility

Check insurance eligibility and view patient information

{/* Insurance Eligibility Check Form */} Check Insurance Eligibility
setMemberId(e.target.value)} />
date > new Date()} />
setFirstName(e.target.value)} />
setLastName(e.target.value)} />
{/* Patients Table */} Patient Records Select Patients and Check Their Eligibility
); }