"use client";
import { FileCheck, Send } from "lucide-react";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Button } from "@/components/ui/button";
import { ApiError } from "@/lib/api-client";
import {
getIntegration,
sendEprescription,
submitInsuranceClaim,
} from "@/lib/integrations";
import { notify } from "@/lib/toast";
// Renders only when the e-prescribing integration is enabled. Transmits the
// prescription as an NCPDP SCRIPT NewRx to the configured pharmacy gateway.
export function SendToPharmacyButton({ rxId }: { rxId: string }) {
const { t } = useTranslation();
const [enabled, setEnabled] = useState(false);
const [sending, setSending] = useState(false);
useEffect(() => {
let active = true;
getIntegration("eprescribe").then(
(c) => active && setEnabled(Boolean(c?.enabled)),
);
return () => {
active = false;
};
}, []);
if (!enabled) return null;
const send = async () => {
setSending(true);
try {
await sendEprescription(rxId);
notify.success(
t("integrations.eRx.sentTitle"),
t("integrations.eRx.sentBody"),
);
} catch (err) {
notify.error(
t("integrations.eRx.failedTitle"),
err instanceof ApiError ? err.message : t("integrations.eRx.failedBody"),
);
} finally {
setSending(false);
}
};
return (
);
}
// Renders only when the claims integration is enabled. Submits an X12 837P claim
// for the invoice to the configured clearinghouse and reports the remittance.
export function SubmitClaimButton({ invoiceId }: { invoiceId: string }) {
const { t } = useTranslation();
const [enabled, setEnabled] = useState(false);
const [submitting, setSubmitting] = useState(false);
useEffect(() => {
let active = true;
getIntegration("claims").then(
(c) => active && setEnabled(Boolean(c?.enabled)),
);
return () => {
active = false;
};
}, []);
if (!enabled) return null;
const submit = async () => {
setSubmitting(true);
try {
const result = await submitInsuranceClaim(invoiceId);
notify.success(
t("integrations.claims.submittedTitle"),
t("integrations.claims.submittedBody", {
status: result.claimStatus,
}),
);
} catch (err) {
notify.error(
t("integrations.claims.failedTitle"),
err instanceof ApiError
? err.message
: t("integrations.claims.failedBody"),
);
} finally {
setSubmitting(false);
}
};
return (
);
}