import { PayerSearchCombobox } from "@samplehc/ui/components"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { X } from "lucide-react"; function MultiplePayerSelection() { const [selectedPayers, setSelectedPayers] = useState([]); const handleAddPayer = (payer) => { if (payer && !selectedPayers.find(p => p.stediId === payer.stediId)) { setSelectedPayers([...selectedPayers, payer]); } }; const handleRemovePayer = (payerId) => { setSelectedPayers(selectedPayers.filter(p => p.stediId !== payerId)); }; return ( <div className="space-y-4"> <div> <label className="block text-sm font-medium mb-2"> Add Insurance Providers </label> <PayerSearchCombobox onSelect={handleAddPayer} placeholder="Search and add payers..." /> </div> {selectedPayers.length > 0 && ( <div className="space-y-2"> <h3 className="text-sm font-medium">Selected Payers:</h3> {selectedPayers.map((payer) => ( <div key={payer.stediId} className="flex items-center justify-between p-3 bg-muted rounded-md" > <div> <span className="font-medium">{payer.displayName}</span> <span className="text-sm text-muted-foreground ml-2"> ({payer.primaryPayerId}) </span> </div> <Button variant="ghost" size="sm" onClick={() => handleRemovePayer(payer.stediId)} > <X className="h-4 w-4" /> </Button> </div> ))} </div> )} </div> ); }
Searchable combobox for finding healthcare payers with autocomplete and alias support
import { PayerSearchCombobox } from "@samplehc/ui/components"; import { useState } from "react"; function PayerSelection() { const [selectedPayer, setSelectedPayer] = useState(null); return ( <div className="space-y-4"> <PayerSearchCombobox placeholder="Search for insurance provider..." onSelect={setSelectedPayer} value={selectedPayer} /> {selectedPayer && ( <div className="p-4 bg-muted rounded-md"> <h3 className="font-semibold">{selectedPayer.displayName}</h3> <p className="text-sm text-muted-foreground"> Payer ID: {selectedPayer.primaryPayerId} </p> </div> )} </div> ); }
onSelect?: (item: PayerSearchItem | null) => void
usePayerSearch
import { usePayerSearch } from "@samplehc/ui/components"; import { useState } from "react"; import { useDebounce } from "@samplehc/ui"; function CustomPayerSearch() { const [query, setQuery] = useState(""); const debouncedQuery = useDebounce(query, 250); const { data: searchResults, isLoading, error } = usePayerSearch( debouncedQuery, { enabled: debouncedQuery.length >= 2 } ); return ( <div className="space-y-4"> <input type="text" placeholder="Search payers..." value={query} onChange={(e) => setQuery(e.target.value)} className="w-full p-2 border rounded" /> {isLoading && <p>Searching...</p>} {error && ( <p className="text-red-500"> Search failed: {error.message} </p> )} {searchResults && ( <div className="space-y-2"> {searchResults.map((payer) => ( <div key={payer.stediId} className="p-3 border rounded"> <h3 className="font-semibold">{payer.displayName}</h3> <p className="text-sm text-gray-600"> ID: {payer.primaryPayerId} </p> {payer.aliases.length > 0 && ( <p className="text-xs text-gray-500"> Also known as: {payer.aliases.join(", ")} </p> )} </div> ))} </div> )} </div> ); }
import { PayerSearchCombobox } from "@samplehc/ui/components"; import { useState } from "react"; import { Button } from "@/components/ui/button"; function ValidatedPayerForm() { const [selectedPayer, setSelectedPayer] = useState(null); const [error, setError] = useState(""); const validatePayer = (payer) => { if (!payer) { setError("Please select an insurance provider"); return false; } // Custom validation logic if (!payer.primaryPayerId) { setError("Selected payer has invalid configuration"); return false; } setError(""); return true; }; const handleSubmit = () => { if (validatePayer(selectedPayer)) { console.log("Valid payer selected:", selectedPayer); // Proceed with form submission } }; return ( <div className="space-y-4"> <div> <label className="block text-sm font-medium mb-2"> Primary Insurance Provider * </label> <PayerSearchCombobox onSelect={(payer) => { setSelectedPayer(payer); if (payer) setError(""); // Clear error when selection made }} value={selectedPayer} required className={error ? "border-red-500" : ""} /> {error && ( <p className="text-sm text-red-500 mt-1">{error}</p> )} </div> <Button onClick={handleSubmit} disabled={!selectedPayer} > Continue </Button> </div> ); }
// Automatic retry for temporary network issues { retry: (failureCount, error) => { // Don't retry authentication errors if (error.message.includes("Authentication")) { return false; } return failureCount < 2; } }
<PayerSearchCombobox className="w-full border-2 border-primary" // Applies custom styling to the trigger element />