import React, { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { apiRequest } from "@/lib/queryClient"; import { Button } from "../ui/button"; import { Edit, Delete, Plus, ChevronUp, ChevronDown } from "lucide-react"; import { DeleteConfirmationDialog } from "../ui/deleteDialog"; import { NpiProviderForm } from "./npiProviderForm"; type NpiProvider = { id: number; npiNumber: string; providerName: string; sortOrder: number; }; export function NpiProviderTable() { const queryClient = useQueryClient(); const [currentPage, setCurrentPage] = useState(1); const [modalOpen, setModalOpen] = useState(false); const [editingProvider, setEditingProvider] = useState(null); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [providerToDelete, setProviderToDelete] = useState(null); const providersPerPage = 5; const { data: providers = [], isLoading, error } = useQuery({ queryKey: ["/api/npiProviders/"], queryFn: async () => { const res = await apiRequest("GET", "/api/npiProviders/"); if (!res.ok) throw new Error("Failed to fetch NPI providers"); return res.json() as Promise; }, }); const reorderMutation = useMutation({ mutationFn: async (orderedIds: number[]) => { const res = await apiRequest("POST", "/api/npiProviders/reorder", { orderedIds }); if (!res.ok) throw new Error("Failed to reorder NPI providers"); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/npiProviders/"] }); }, }); const deleteMutation = useMutation({ mutationFn: async (provider: NpiProvider) => { const res = await apiRequest("DELETE", `/api/npiProviders/${provider.id}`); if (!res.ok) throw new Error("Failed to delete NPI provider"); return true; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/npiProviders/"] }); }, }); const handleMove = (index: number, direction: "up" | "down") => { const swapIndex = direction === "up" ? index - 1 : index + 1; if (swapIndex < 0 || swapIndex >= providers.length) return; const newOrder = [...providers]; [newOrder[index], newOrder[swapIndex]] = [newOrder[swapIndex]!, newOrder[index]!]; reorderMutation.mutate(newOrder.map((p) => p.id)); }; const handleDeleteClick = (provider: NpiProvider) => { setProviderToDelete(provider); setIsDeleteDialogOpen(true); }; const handleConfirmDelete = () => { if (!providerToDelete) return; deleteMutation.mutate(providerToDelete, { onSuccess: () => { setIsDeleteDialogOpen(false); setProviderToDelete(null); }, }); }; const indexOfLast = currentPage * providersPerPage; const indexOfFirst = indexOfLast - providersPerPage; const currentProviders = providers.slice(indexOfFirst, indexOfLast); const totalPages = Math.ceil(providers.length / providersPerPage); return (

NPI Providers

{isLoading ? ( ) : error ? ( ) : currentProviders.length === 0 ? ( ) : ( currentProviders.map((provider, pageIndex) => { const globalIndex = indexOfFirst + pageIndex; const isDefault = globalIndex === 0; return ( ); }) )}
Provider # NPI Number Provider Name
Loading NPI providers...
Error loading NPI providers
No NPI providers found.
Provider #{globalIndex + 1} {isDefault && ( default )} {provider.npiNumber} {provider.providerName}
{providers.length > providersPerPage && (
)} {modalOpen && ( setModalOpen(false)} /> )} setIsDeleteDialogOpen(false)} entityName={providerToDelete?.providerName} />
); }