@mindbill/react 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +21 -3
- package/dist/index.js +162 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -62,6 +62,15 @@ type BillReviewAttachment = {
|
|
|
62
62
|
addedAt?: string;
|
|
63
63
|
contentUrl?: string;
|
|
64
64
|
};
|
|
65
|
+
type BillReviewPayer = {
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
hasElectronic?: boolean;
|
|
69
|
+
states?: string[];
|
|
70
|
+
};
|
|
71
|
+
type BillReviewFeatures = {
|
|
72
|
+
authorizationNumber?: boolean;
|
|
73
|
+
};
|
|
65
74
|
type BillReviewData = {
|
|
66
75
|
bill: {
|
|
67
76
|
id: string;
|
|
@@ -94,6 +103,7 @@ type BillReviewData = {
|
|
|
94
103
|
employer?: string;
|
|
95
104
|
doi?: string;
|
|
96
105
|
claimsAdminId?: string;
|
|
106
|
+
claimsAdminName?: string;
|
|
97
107
|
};
|
|
98
108
|
options?: {
|
|
99
109
|
billingProviders?: BillReviewBillingProvider[];
|
|
@@ -102,6 +112,7 @@ type BillReviewData = {
|
|
|
102
112
|
};
|
|
103
113
|
};
|
|
104
114
|
type BillReviewSaveInput = {
|
|
115
|
+
claimsAdminId: string;
|
|
105
116
|
dos: string;
|
|
106
117
|
dosEnd?: string | null;
|
|
107
118
|
authorizationNumber?: string | null;
|
|
@@ -126,12 +137,16 @@ type BillReviewFormProps = {
|
|
|
126
137
|
onAddAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<void>;
|
|
127
138
|
onRemoveAttachment: (attachmentId: string) => Promise<void>;
|
|
128
139
|
onOpenAttachment?: (attachment: BillReviewAttachment) => void;
|
|
140
|
+
onSearchClaimsAdministrators?: (query: string) => Promise<BillReviewPayer[]>;
|
|
129
141
|
className?: string;
|
|
130
142
|
style?: CSSProperties;
|
|
131
143
|
appearance?: MindBillAppearance;
|
|
144
|
+
features?: BillReviewFeatures;
|
|
132
145
|
disabled?: boolean;
|
|
133
146
|
};
|
|
134
147
|
type BillReviewDraft = {
|
|
148
|
+
claimsAdminId: string;
|
|
149
|
+
claimsAdminName: string;
|
|
135
150
|
dos: string;
|
|
136
151
|
dosEnd: string;
|
|
137
152
|
authorizationNumber: string;
|
|
@@ -141,7 +156,7 @@ type BillReviewDraft = {
|
|
|
141
156
|
lineItems: BillReviewLineItem[];
|
|
142
157
|
};
|
|
143
158
|
declare function buildBillReviewSaveInput(draft: BillReviewDraft): BillReviewSaveInput;
|
|
144
|
-
declare function BillReviewForm({ data, onSave, onSubmit, onAddAttachment, onRemoveAttachment, onOpenAttachment, className, style, appearance, disabled, }: BillReviewFormProps): ReactElement;
|
|
159
|
+
declare function BillReviewForm({ data, onSave, onSubmit, onAddAttachment, onRemoveAttachment, onOpenAttachment, onSearchClaimsAdministrators, className, style, appearance, features, disabled, }: BillReviewFormProps): ReactElement;
|
|
145
160
|
type BillStatusSummaryProps = {
|
|
146
161
|
status: string;
|
|
147
162
|
submittedAt?: string | null;
|
|
@@ -292,6 +307,7 @@ type BillLifecycleClientOptions = {
|
|
|
292
307
|
};
|
|
293
308
|
type BillLifecycleClient = {
|
|
294
309
|
getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;
|
|
310
|
+
searchClaimsAdministrators: (query: string) => Promise<BillReviewPayer[]>;
|
|
295
311
|
saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;
|
|
296
312
|
submitBill: (input: BillReviewSaveInput, route: BillSubmissionRoute) => Promise<BillLifecycleData>;
|
|
297
313
|
addAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<BillLifecycleData>;
|
|
@@ -321,6 +337,7 @@ type UseBillLifecycleResult = {
|
|
|
321
337
|
isRefreshing: boolean;
|
|
322
338
|
isMutating: boolean;
|
|
323
339
|
refresh: () => Promise<void>;
|
|
340
|
+
searchClaimsAdministrators: BillLifecycleClient["searchClaimsAdministrators"];
|
|
324
341
|
saveReview: BillLifecycleClient["saveReview"];
|
|
325
342
|
submitBill: BillLifecycleClient["submitBill"];
|
|
326
343
|
addAttachment: BillLifecycleClient["addAttachment"];
|
|
@@ -341,13 +358,14 @@ declare function createBillLifecycleClient({ billId, sessionEndpoint, getSession
|
|
|
341
358
|
declare function useBillLifecycle({ billId: providedBillId, sessionEndpoint, getSession, apiBaseUrl, refreshInterval, enabled, initialData, onBillIdChange, fetch: fetchOverride, }: UseBillLifecycleOptions): UseBillLifecycleResult;
|
|
342
359
|
type ConnectedBillLifecycleProps = UseBillLifecycleOptions & {
|
|
343
360
|
appearance?: MindBillAppearance;
|
|
361
|
+
features?: BillReviewFeatures;
|
|
344
362
|
className?: string;
|
|
345
363
|
style?: CSSProperties;
|
|
346
364
|
loadingFallback?: ReactNode;
|
|
347
365
|
errorFallback?: (error: Error, retry: () => Promise<void>) => ReactNode;
|
|
348
366
|
onChanged?: (data: BillLifecycleData) => void;
|
|
349
367
|
};
|
|
350
|
-
declare function ConnectedBillLifecycle({ appearance, className, style, loadingFallback, errorFallback, onChanged, ...options }: ConnectedBillLifecycleProps): ReactElement;
|
|
368
|
+
declare function ConnectedBillLifecycle({ appearance, features, className, style, loadingFallback, errorFallback, onChanged, ...options }: ConnectedBillLifecycleProps): ReactElement;
|
|
351
369
|
|
|
352
370
|
type MindBillWidgetProps = {
|
|
353
371
|
sessionToken: string;
|
|
@@ -369,4 +387,4 @@ declare const HostedBillFromReport: typeof MindBillBillFromReport;
|
|
|
369
387
|
declare const HostedCollections: typeof MindBillCollections;
|
|
370
388
|
declare const HostedOnboarding: typeof MindBillOnboarding;
|
|
371
389
|
|
|
372
|
-
export { type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewDraft, BillReviewForm, type BillReviewFormProps, type BillReviewLineItem, type BillReviewLocation, type BillReviewSaveInput, type BillStatusAction, type BillStatusClient, type BillStatusClientOptions, type BillStatusData, type BillStatusSession, type BillStatusSessionProvider, type BillStatusSessionRequest, BillStatusSummary, type BillStatusSummaryProps, type BillSubmissionRoute, type CloseBillInput, ConnectedBillLifecycle, type ConnectedBillLifecycleProps, ConnectedBillStatus, type ConnectedBillStatusProps, HostedBillFromReport, HostedBillReview, HostedBillTimeline, HostedCollections, HostedOnboarding, MindBillBillFromReport, MindBillBillReview, MindBillBillTimeline, MindBillCollections, MindBillOnboarding, type MindBillWidgetProps, type PostBillPaymentInput, type SubmitSecondReviewInput, type UseBillLifecycleOptions, type UseBillLifecycleResult, type UseBillStatusOptions, type UseBillStatusResult, buildBillReviewSaveInput, createBillLifecycleClient, createBillStatusClient, useBillLifecycle, useBillStatus };
|
|
390
|
+
export { type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewDraft, type BillReviewFeatures, BillReviewForm, type BillReviewFormProps, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, type BillStatusAction, type BillStatusClient, type BillStatusClientOptions, type BillStatusData, type BillStatusSession, type BillStatusSessionProvider, type BillStatusSessionRequest, BillStatusSummary, type BillStatusSummaryProps, type BillSubmissionRoute, type CloseBillInput, ConnectedBillLifecycle, type ConnectedBillLifecycleProps, ConnectedBillStatus, type ConnectedBillStatusProps, HostedBillFromReport, HostedBillReview, HostedBillTimeline, HostedCollections, HostedOnboarding, MindBillBillFromReport, MindBillBillReview, MindBillBillTimeline, MindBillCollections, MindBillOnboarding, type MindBillWidgetProps, type PostBillPaymentInput, type SubmitSecondReviewInput, type UseBillLifecycleOptions, type UseBillLifecycleResult, type UseBillStatusOptions, type UseBillStatusResult, buildBillReviewSaveInput, createBillLifecycleClient, createBillStatusClient, useBillLifecycle, useBillStatus };
|
package/dist/index.js
CHANGED
|
@@ -45,6 +45,8 @@ function withoutId(value) {
|
|
|
45
45
|
function toDraft(data) {
|
|
46
46
|
const snapshot = data.bill.billingSnapshot;
|
|
47
47
|
return {
|
|
48
|
+
claimsAdminId: data.injury.claimsAdminId || "",
|
|
49
|
+
claimsAdminName: data.injury.claimsAdminName || "",
|
|
48
50
|
dos: data.bill.dos || "",
|
|
49
51
|
dosEnd: data.bill.dosEnd || "",
|
|
50
52
|
authorizationNumber: data.bill.authorizationNumber || "",
|
|
@@ -59,6 +61,7 @@ function toDraft(data) {
|
|
|
59
61
|
}
|
|
60
62
|
function buildBillReviewSaveInput(draft) {
|
|
61
63
|
return {
|
|
64
|
+
claimsAdminId: draft.claimsAdminId,
|
|
62
65
|
dos: draft.dos,
|
|
63
66
|
dosEnd: draft.dosEnd || null,
|
|
64
67
|
authorizationNumber: draft.authorizationNumber.trim() || null,
|
|
@@ -126,12 +129,19 @@ function BillReviewForm({
|
|
|
126
129
|
onAddAttachment,
|
|
127
130
|
onRemoveAttachment,
|
|
128
131
|
onOpenAttachment,
|
|
132
|
+
onSearchClaimsAdministrators,
|
|
129
133
|
className,
|
|
130
134
|
style,
|
|
131
135
|
appearance,
|
|
136
|
+
features,
|
|
132
137
|
disabled = false
|
|
133
138
|
}) {
|
|
134
139
|
const [draft, setDraft] = useState(() => toDraft(data));
|
|
140
|
+
const [payerQuery, setPayerQuery] = useState(
|
|
141
|
+
() => data.injury.claimsAdminName || ""
|
|
142
|
+
);
|
|
143
|
+
const [payerResults, setPayerResults] = useState([]);
|
|
144
|
+
const [payerBusy, setPayerBusy] = useState(false);
|
|
135
145
|
const [route, setRoute] = useState("ebill");
|
|
136
146
|
const [file, setFile] = useState(null);
|
|
137
147
|
const [documentType, setDocumentType] = useState("other");
|
|
@@ -139,11 +149,42 @@ function BillReviewForm({
|
|
|
139
149
|
const [error, setError] = useState("");
|
|
140
150
|
const [notice, setNotice] = useState("");
|
|
141
151
|
const routeName = useId();
|
|
152
|
+
const payerListId = useId();
|
|
142
153
|
const editable = data.bill.status === "incomplete" && !disabled;
|
|
143
|
-
useEffect(() =>
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
setDraft(toDraft(data));
|
|
156
|
+
setPayerQuery(data.injury.claimsAdminName || "");
|
|
157
|
+
}, [data]);
|
|
158
|
+
useEffect(() => {
|
|
159
|
+
if (!onSearchClaimsAdministrators || payerQuery.trim().length < 2) {
|
|
160
|
+
setPayerResults([]);
|
|
161
|
+
setPayerBusy(false);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
let current = true;
|
|
165
|
+
const timer = window.setTimeout(() => {
|
|
166
|
+
setPayerBusy(true);
|
|
167
|
+
void onSearchClaimsAdministrators(payerQuery.trim()).then((results) => {
|
|
168
|
+
if (current) setPayerResults(results);
|
|
169
|
+
}).catch((cause) => {
|
|
170
|
+
if (current) {
|
|
171
|
+
setPayerResults([]);
|
|
172
|
+
setError(
|
|
173
|
+
cause instanceof Error ? cause.message : "Claims administrator search is unavailable."
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}).finally(() => {
|
|
177
|
+
if (current) setPayerBusy(false);
|
|
178
|
+
});
|
|
179
|
+
}, 200);
|
|
180
|
+
return () => {
|
|
181
|
+
current = false;
|
|
182
|
+
window.clearTimeout(timer);
|
|
183
|
+
};
|
|
184
|
+
}, [onSearchClaimsAdministrators, payerQuery]);
|
|
144
185
|
const canSubmit = useMemo(
|
|
145
186
|
() => Boolean(
|
|
146
|
-
draft.dos && draft.billingProvider.name.trim() && draft.billingProvider.taxId.trim() && draft.billingProvider.npi.trim() && draft.clinician.name.trim() && draft.clinician.npi.trim() && draft.location.name.trim() && draft.location.street.trim() && draft.location.city.trim() && draft.location.state.trim() && draft.location.zip.trim() && draft.lineItems.length && draft.lineItems.every((line) => line.code.trim() && line.units > 0)
|
|
187
|
+
draft.dos && draft.claimsAdminId && draft.billingProvider.name.trim() && draft.billingProvider.taxId.trim() && draft.billingProvider.npi.trim() && draft.clinician.name.trim() && draft.clinician.npi.trim() && draft.location.name.trim() && draft.location.street.trim() && draft.location.city.trim() && draft.location.state.trim() && draft.location.zip.trim() && draft.lineItems.length && draft.lineItems.every((line) => line.code.trim() && line.units > 0)
|
|
147
188
|
),
|
|
148
189
|
[draft]
|
|
149
190
|
);
|
|
@@ -168,7 +209,7 @@ function BillReviewForm({
|
|
|
168
209
|
setNotice(action === "save" ? "Changes saved." : "Bill submitted.");
|
|
169
210
|
} catch (cause) {
|
|
170
211
|
setError(
|
|
171
|
-
cause instanceof Error ? cause.message : "
|
|
212
|
+
cause instanceof Error ? cause.message : "The billing request could not be completed."
|
|
172
213
|
);
|
|
173
214
|
} finally {
|
|
174
215
|
setBusy("");
|
|
@@ -238,15 +279,70 @@ function BillReviewForm({
|
|
|
238
279
|
/* @__PURE__ */ jsx("dd", { children: data.injury.doi || "\u2014" })
|
|
239
280
|
] })
|
|
240
281
|
] }),
|
|
282
|
+
/* @__PURE__ */ jsxs("section", { className: sectionClass, children: [
|
|
283
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-native-section-head", children: [
|
|
284
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
285
|
+
/* @__PURE__ */ jsx("h3", { children: "Claims administrator" }),
|
|
286
|
+
/* @__PURE__ */ jsx("p", { children: "Select the carrier or administrator that should receive this bill." })
|
|
287
|
+
] }),
|
|
288
|
+
draft.claimsAdminId ? /* @__PURE__ */ jsx("span", { children: "Selected" }) : /* @__PURE__ */ jsx("span", { children: "Required" })
|
|
289
|
+
] }),
|
|
290
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-native-payer-picker", children: [
|
|
291
|
+
/* @__PURE__ */ jsxs("label", { className: "mb-native-field", children: [
|
|
292
|
+
/* @__PURE__ */ jsx("span", { children: "Insurance company or claims administrator" }),
|
|
293
|
+
/* @__PURE__ */ jsx(
|
|
294
|
+
"input",
|
|
295
|
+
{
|
|
296
|
+
role: "combobox",
|
|
297
|
+
"aria-autocomplete": "list",
|
|
298
|
+
"aria-controls": payerListId,
|
|
299
|
+
"aria-expanded": payerResults.length > 0,
|
|
300
|
+
value: payerQuery,
|
|
301
|
+
disabled: !editable,
|
|
302
|
+
placeholder: "Search by payer or administrator name",
|
|
303
|
+
onChange: (event) => {
|
|
304
|
+
const value = event.target.value;
|
|
305
|
+
setPayerQuery(value);
|
|
306
|
+
setDraft((current) => ({
|
|
307
|
+
...current,
|
|
308
|
+
...value === current.claimsAdminName ? {} : { claimsAdminId: "", claimsAdminName: "" }
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
] }),
|
|
314
|
+
payerBusy ? /* @__PURE__ */ jsx("span", { className: "mb-native-payer-help", children: "Searching\u2026" }) : null,
|
|
315
|
+
!payerBusy && payerQuery.trim().length > 1 && payerResults.length === 0 && !draft.claimsAdminId ? /* @__PURE__ */ jsx("span", { className: "mb-native-payer-help", children: "No matching administrator selected yet." }) : null,
|
|
316
|
+
payerResults.length > 0 ? /* @__PURE__ */ jsx("ul", { id: payerListId, className: "mb-native-payer-results", role: "listbox", children: payerResults.map((payer) => /* @__PURE__ */ jsx("li", { role: "option", "aria-selected": payer.id === draft.claimsAdminId, children: /* @__PURE__ */ jsxs(
|
|
317
|
+
"button",
|
|
318
|
+
{
|
|
319
|
+
type: "button",
|
|
320
|
+
onClick: () => {
|
|
321
|
+
setDraft((current) => ({
|
|
322
|
+
...current,
|
|
323
|
+
claimsAdminId: payer.id,
|
|
324
|
+
claimsAdminName: payer.name
|
|
325
|
+
}));
|
|
326
|
+
setPayerQuery(payer.name);
|
|
327
|
+
setPayerResults([]);
|
|
328
|
+
},
|
|
329
|
+
children: [
|
|
330
|
+
/* @__PURE__ */ jsx("strong", { children: payer.name }),
|
|
331
|
+
/* @__PURE__ */ jsx("span", { children: payer.hasElectronic ? "Electronic billing available" : "Billing route confirmed after review" })
|
|
332
|
+
]
|
|
333
|
+
}
|
|
334
|
+
) }, payer.id)) }) : null
|
|
335
|
+
] })
|
|
336
|
+
] }),
|
|
241
337
|
/* @__PURE__ */ jsxs("section", { className: sectionClass, children: [
|
|
242
338
|
/* @__PURE__ */ jsx("div", { className: "mb-native-section-head", children: /* @__PURE__ */ jsxs("div", { children: [
|
|
243
339
|
/* @__PURE__ */ jsx("h3", { children: "Claim and service" }),
|
|
244
340
|
/* @__PURE__ */ jsx("p", { children: "These values print on the bill." })
|
|
245
341
|
] }) }),
|
|
246
|
-
/* @__PURE__ */ jsxs("div", { className:
|
|
342
|
+
/* @__PURE__ */ jsxs("div", { className: `mb-native-grid ${features?.authorizationNumber === false ? "two" : "three"}`, children: [
|
|
247
343
|
/* @__PURE__ */ jsx(Field, { label: "Date of service", type: "date", required: true, value: draft.dos, onChange: (dos) => setDraft((current) => ({ ...current, dos })) }),
|
|
248
344
|
/* @__PURE__ */ jsx(Field, { label: "End date", type: "date", optional: true, value: draft.dosEnd, onChange: (dosEnd) => setDraft((current) => ({ ...current, dosEnd })) }),
|
|
249
|
-
/* @__PURE__ */ jsx(Field, { label: "Authorization number", optional: true, value: draft.authorizationNumber, onChange: (authorizationNumber) => setDraft((current) => ({ ...current, authorizationNumber })) })
|
|
345
|
+
features?.authorizationNumber === false ? null : /* @__PURE__ */ jsx(Field, { label: "Authorization number", optional: true, value: draft.authorizationNumber, onChange: (authorizationNumber) => setDraft((current) => ({ ...current, authorizationNumber })) })
|
|
250
346
|
] })
|
|
251
347
|
] }),
|
|
252
348
|
/* @__PURE__ */ jsxs("section", { className: sectionClass, children: [
|
|
@@ -260,7 +356,7 @@ function BillReviewForm({
|
|
|
260
356
|
/* @__PURE__ */ jsxs("div", { className: "mb-native-grid three", children: [
|
|
261
357
|
/* @__PURE__ */ jsx(Field, { label: "Practice name", required: true, value: draft.billingProvider.name, onChange: (value) => updateBillingProvider("name", value) }),
|
|
262
358
|
/* @__PURE__ */ jsx(Field, { label: "Tax ID", required: true, value: draft.billingProvider.taxId, onChange: (value) => updateBillingProvider("taxId", value) }),
|
|
263
|
-
/* @__PURE__ */ jsx(Field, { label: "
|
|
359
|
+
/* @__PURE__ */ jsx(Field, { label: "Billing NPI", required: true, value: draft.billingProvider.npi, onChange: (value) => updateBillingProvider("npi", value) }),
|
|
264
360
|
/* @__PURE__ */ jsx(Field, { label: "Phone", optional: true, value: draft.billingProvider.phone || "", onChange: (value) => updateBillingProvider("phone", value) }),
|
|
265
361
|
/* @__PURE__ */ jsx(Field, { label: "Billing street", required: true, value: draft.billingProvider.billingStreet || "", onChange: (value) => updateBillingProvider("billingStreet", value) }),
|
|
266
362
|
/* @__PURE__ */ jsx(Field, { label: "City", required: true, value: draft.billingProvider.billingCity || "", onChange: (value) => updateBillingProvider("billingCity", value) }),
|
|
@@ -306,7 +402,7 @@ function BillReviewForm({
|
|
|
306
402
|
/* @__PURE__ */ jsxs("div", { className: "mb-native-section-head", children: [
|
|
307
403
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
308
404
|
/* @__PURE__ */ jsx("h3", { children: "Procedure lines" }),
|
|
309
|
-
/* @__PURE__ */ jsx("p", { children: "
|
|
405
|
+
/* @__PURE__ */ jsx("p", { children: "The allowed amount is recalculated when changes are saved." })
|
|
310
406
|
] }),
|
|
311
407
|
/* @__PURE__ */ jsx("button", { type: "button", className: "mb-native-button quiet", disabled: !editable, onClick: () => setDraft((current) => ({ ...current, lineItems: [...current.lineItems, { code: "", modifiers: [], units: 1, charge: 0 }] })), children: "+ Add line" })
|
|
312
408
|
] }),
|
|
@@ -362,7 +458,7 @@ function BillReviewForm({
|
|
|
362
458
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
363
459
|
/* @__PURE__ */ jsx("span", { className: "mb-native-eyebrow", children: "Delivery" }),
|
|
364
460
|
/* @__PURE__ */ jsx("h3", { children: "Submit this bill" }),
|
|
365
|
-
/* @__PURE__ */ jsx("p", { children: "
|
|
461
|
+
/* @__PURE__ */ jsx("p", { children: "After submission, status, payments, denials, and resubmissions stay available here." })
|
|
366
462
|
] }),
|
|
367
463
|
/* @__PURE__ */ jsxs("fieldset", { children: [
|
|
368
464
|
/* @__PURE__ */ jsx("legend", { children: "Send via" }),
|
|
@@ -415,6 +511,16 @@ var NATIVE_BILL_REVIEW_STYLES = `
|
|
|
415
511
|
.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}
|
|
416
512
|
.mb-native-review,.mb-native-status{--mb-accent:#238dbd;--mb-accent-dark:#176f98;--mb-text:#203743;--mb-muted:#657982;--mb-border:#dbe6ea;--mb-soft:#f3f8fa;--mb-surface:#fff;color:var(--mb-text);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}.mb-native-review *,.mb-native-status *{box-sizing:border-box}.mb-native-review{display:grid;gap:16px}.mb-native-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;padding:6px 2px}.mb-native-heading h2,.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{margin:3px 0 2px;line-height:1.2}.mb-native-heading h2{font-size:25px}.mb-native-heading p,.mb-native-section p,.mb-native-submit p,.mb-native-status p{margin:0;color:var(--mb-muted)}.mb-native-eyebrow{color:#59727d;font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.mb-native-total{display:flex;align-items:center;gap:18px}.mb-native-total span,.mb-native-section-head>span{border-radius:999px;background:var(--mb-soft);color:#58717c;font-size:11px;font-weight:800;padding:6px 10px;text-transform:capitalize}.mb-native-total strong{font-size:24px}.mb-native-summary{display:grid;grid-template-columns:repeat(4,1fr);margin:0;border:1px solid var(--mb-border);border-radius:12px;background:var(--mb-surface);overflow:hidden}.mb-native-summary div{padding:17px 20px;border-right:1px solid var(--mb-border)}.mb-native-summary div:last-child{border:0}.mb-native-summary dt,.mb-native-allowed span{color:#647982;font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.mb-native-summary dd{margin:5px 0 0;font-weight:750}.mb-native-section{padding:20px;border:1px solid var(--mb-border);border-radius:14px;background:var(--mb-surface);box-shadow:0 8px 24px rgba(28,58,72,.04)}.mb-native-section-head{display:flex;align-items:start;justify-content:space-between;gap:16px;margin-bottom:17px}.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{font-size:19px}.mb-native-grid{display:grid;gap:14px}.mb-native-grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.mb-native-field{display:grid;gap:6px;min-width:0;color:var(--mb-text);font-size:12px;font-weight:750}.mb-native-field small{color:var(--mb-muted);font-size:inherit;font-weight:500}.mb-native-field input,.mb-native-attach select,.mb-native-attach input{width:100%;min-height:43px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);font:inherit;padding:10px 12px}.mb-native-field input:focus,.mb-native-attach select:focus,.mb-native-attach input:focus{border-color:var(--mb-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--mb-accent) 14%,transparent);outline:0}.mb-native-lines{display:grid;gap:10px}.mb-native-line{display:grid;grid-template-columns:1.1fr 1.1fr 110px 120px 28px;align-items:end;gap:12px;padding:13px;background:var(--mb-soft);border:1px solid #e3edf0;border-radius:10px}.mb-native-allowed{display:grid;gap:5px;padding:0 8px 11px;text-align:right}.mb-native-allowed strong{font-size:16px}.mb-native-remove{border:0;background:transparent;color:#667d86;cursor:pointer;font-size:20px;padding:7px}.mb-native-note{padding:13px 15px;border:1px solid #bdd9e4;border-radius:9px;background:#f2f9fc;color:#526d78}.mb-native-note strong{color:var(--mb-text);margin-right:12px}.mb-native-documents{list-style:none;margin:14px 0;padding:0}.mb-native-documents li{display:grid;grid-template-columns:42px 1fr auto 28px;align-items:center;gap:12px;padding:12px 4px;border-bottom:1px solid var(--mb-border)}.mb-native-documents li>div{display:grid}.mb-native-documents li span{color:var(--mb-muted);font-size:12px}.mb-native-file{display:grid;place-items:center;width:40px;height:40px;border-radius:8px;background:#eaf5f9;color:var(--mb-accent)!important;font-size:11px!important;font-weight:850}.mb-native-attach{display:grid;grid-template-columns:1fr 230px minmax(220px,1fr) auto;align-items:end;gap:12px;padding:15px;border-radius:10px;background:var(--mb-soft)}.mb-native-attach>div{display:grid;gap:3px}.mb-native-attach span{color:var(--mb-muted);font-size:12px}.mb-native-button{min-height:40px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);cursor:pointer;font:inherit;font-weight:750;padding:9px 14px}.mb-native-button.primary{border-color:var(--mb-accent);background:var(--mb-accent);color:#fff}.mb-native-button.primary:hover{background:var(--mb-accent-dark)}.mb-native-button.secondary{background:#fff}.mb-native-button.quiet{min-height:auto;background:var(--mb-soft);padding:7px 11px}.mb-native-button:disabled,.mb-native-remove:disabled{cursor:not-allowed;opacity:.5}.mb-native-submit{display:grid;grid-template-columns:1fr auto;align-items:end;gap:18px;padding:22px;border:1px solid #bcd8e2;border-radius:14px;background:linear-gradient(135deg,#f3fafc,#eaf6fa)}.mb-native-submit fieldset{display:flex;gap:6px;margin:0;padding:0;border:0}.mb-native-submit legend{position:absolute;width:1px;height:1px;overflow:hidden}.mb-native-submit fieldset label{display:flex;align-items:center;gap:6px;padding:9px 11px;border:1px solid #c9dce3;border-radius:8px;background:#fff;font-weight:700}.mb-native-actions{display:flex;justify-content:flex-end;gap:10px;grid-column:1/-1}.mb-native-message{grid-column:1/-1;padding:10px 12px;border-radius:8px}.mb-native-message.error{background:#fff0ef;color:#9d3029}.mb-native-message.success{background:#edf9f2;color:#217449}.mb-native-status{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px;border:1px solid var(--mb-border);border-radius:12px;background:#fff}.mb-native-status h3{text-transform:capitalize}.mb-native-status dl{display:flex;margin:0}.mb-native-status dl div{min-width:110px;padding:0 18px;border-left:1px solid var(--mb-border)}.mb-native-status dt{color:var(--mb-muted);font-size:11px}.mb-native-status dd{margin:4px 0 0;font-size:17px;font-weight:800}@media(max-width:900px){.mb-native-grid.three{grid-template-columns:repeat(2,minmax(0,1fr))}.mb-native-summary{grid-template-columns:repeat(2,1fr)}.mb-native-summary div:nth-child(2){border-right:0}.mb-native-summary div:nth-child(-n+2){border-bottom:1px solid var(--mb-border)}.mb-native-line{grid-template-columns:1fr 1fr 90px}.mb-native-allowed{align-self:center}.mb-native-attach{grid-template-columns:1fr 1fr}.mb-native-submit{grid-template-columns:1fr}.mb-native-submit fieldset,.mb-native-actions{grid-column:1}.mb-native-actions{justify-content:start}}@media(max-width:620px){.mb-native-heading,.mb-native-total,.mb-native-status{align-items:start;flex-direction:column}.mb-native-grid.three,.mb-native-summary,.mb-native-line,.mb-native-attach{grid-template-columns:1fr}.mb-native-summary div,.mb-native-summary div:nth-child(2){border-right:0;border-bottom:1px solid var(--mb-border)}.mb-native-line{align-items:stretch}.mb-native-allowed{text-align:left}.mb-native-submit fieldset{display:grid;grid-template-columns:1fr 1fr}.mb-native-status dl{width:100%}.mb-native-status dl div{min-width:0;flex:1;padding:0 10px}.mb-native-status dl div:first-child{padding-left:0;border-left:0}}
|
|
417
513
|
.mb-native-status-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.mb-native-status-copy{min-width:150px}.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}
|
|
514
|
+
.mb-native-review{padding:clamp(16px,2vw,24px)}
|
|
515
|
+
.mb-native-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
516
|
+
.mb-native-payer-picker{position:relative;max-width:760px}
|
|
517
|
+
.mb-native-payer-help{display:block;margin-top:7px;color:var(--mb-muted);font-size:12px}
|
|
518
|
+
.mb-native-payer-results{position:absolute;z-index:5;top:calc(100% + 6px);right:0;left:0;max-height:280px;overflow:auto;list-style:none;margin:0;padding:6px;border:1px solid var(--mb-border);border-radius:10px;background:var(--mb-surface);box-shadow:0 16px 40px rgba(28,58,72,.16)}
|
|
519
|
+
.mb-native-payer-results li{margin:0;padding:0}
|
|
520
|
+
.mb-native-payer-results button{display:grid;width:100%;gap:2px;padding:11px 12px;border:0;border-radius:7px;background:transparent;color:var(--mb-text);font:inherit;text-align:left;cursor:pointer}
|
|
521
|
+
.mb-native-payer-results button:hover,.mb-native-payer-results button:focus{background:var(--mb-soft);outline:0}
|
|
522
|
+
.mb-native-payer-results span{color:var(--mb-muted);font-size:12px}
|
|
523
|
+
@media(max-width:620px){.mb-native-review{padding:12px}.mb-native-grid.two{grid-template-columns:1fr}}
|
|
418
524
|
`;
|
|
419
525
|
|
|
420
526
|
// src/connected-bill-status.tsx
|
|
@@ -701,14 +807,14 @@ function isSessionFresh2(session) {
|
|
|
701
807
|
}
|
|
702
808
|
function normalizeSession2(value) {
|
|
703
809
|
if (!value || typeof value !== "object") {
|
|
704
|
-
throw new Error("The
|
|
810
|
+
throw new Error("The billing session endpoint returned an invalid response.");
|
|
705
811
|
}
|
|
706
812
|
const candidate = value;
|
|
707
813
|
const nested = candidate.session ?? candidate.data;
|
|
708
814
|
const session = nested && typeof nested === "object" ? nested : candidate;
|
|
709
815
|
if (typeof session.token !== "string" || session.token.length < 8) {
|
|
710
816
|
throw new Error(
|
|
711
|
-
"The
|
|
817
|
+
"The billing session endpoint did not return a browser session token."
|
|
712
818
|
);
|
|
713
819
|
}
|
|
714
820
|
return {
|
|
@@ -719,11 +825,11 @@ function normalizeSession2(value) {
|
|
|
719
825
|
}
|
|
720
826
|
function normalizeLifecycle(value) {
|
|
721
827
|
if (!value || typeof value !== "object") {
|
|
722
|
-
throw new Error("
|
|
828
|
+
throw new Error("The billing service returned an invalid bill lifecycle.");
|
|
723
829
|
}
|
|
724
830
|
const data = value;
|
|
725
831
|
if (!data.bill || !data.patient || !data.injury || !data.lifecycle || !Array.isArray(data.lifecycle.actions) || !Array.isArray(data.eors)) {
|
|
726
|
-
throw new Error("
|
|
832
|
+
throw new Error("The billing service returned an invalid bill lifecycle.");
|
|
727
833
|
}
|
|
728
834
|
return data;
|
|
729
835
|
}
|
|
@@ -759,7 +865,7 @@ function createBillLifecycleClient({
|
|
|
759
865
|
if (!response.ok) {
|
|
760
866
|
throw await responseError2(
|
|
761
867
|
response,
|
|
762
|
-
"
|
|
868
|
+
"The billing session could not be created."
|
|
763
869
|
);
|
|
764
870
|
}
|
|
765
871
|
return response.json();
|
|
@@ -800,6 +906,34 @@ function createBillLifecycleClient({
|
|
|
800
906
|
const body = await response.json();
|
|
801
907
|
return normalizeLifecycle(body.data);
|
|
802
908
|
};
|
|
909
|
+
const searchClaimsAdministrators = async (query) => {
|
|
910
|
+
const response = await request(
|
|
911
|
+
`/embed/api/bill-review/payers?q=${encodeURIComponent(query)}`
|
|
912
|
+
);
|
|
913
|
+
if (!response.ok) {
|
|
914
|
+
throw await responseError2(
|
|
915
|
+
response,
|
|
916
|
+
"Claims administrator search is unavailable."
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
const body = await response.json();
|
|
920
|
+
if (!Array.isArray(body.results)) {
|
|
921
|
+
throw new Error("Claims administrator search returned an invalid response.");
|
|
922
|
+
}
|
|
923
|
+
return body.results.flatMap((value) => {
|
|
924
|
+
if (!value || typeof value !== "object") return [];
|
|
925
|
+
const payer = value;
|
|
926
|
+
if (typeof payer.id !== "string" || typeof payer.name !== "string") {
|
|
927
|
+
return [];
|
|
928
|
+
}
|
|
929
|
+
return [{
|
|
930
|
+
id: payer.id,
|
|
931
|
+
name: payer.name,
|
|
932
|
+
...typeof payer.hasElectronic === "boolean" ? { hasElectronic: payer.hasElectronic } : {},
|
|
933
|
+
...Array.isArray(payer.states) ? { states: payer.states.filter((state) => typeof state === "string") } : {}
|
|
934
|
+
}];
|
|
935
|
+
});
|
|
936
|
+
};
|
|
803
937
|
const mutation = async (path, init, fallback) => {
|
|
804
938
|
const headers = new Headers(init.headers);
|
|
805
939
|
headers.set("idempotency-key", idempotencyKey());
|
|
@@ -838,6 +972,7 @@ function createBillLifecycleClient({
|
|
|
838
972
|
sessionRequest = null;
|
|
839
973
|
},
|
|
840
974
|
getLifecycle: loadLifecycle,
|
|
975
|
+
searchClaimsAdministrators,
|
|
841
976
|
saveReview,
|
|
842
977
|
async submitBill(input, route) {
|
|
843
978
|
await saveReview(input);
|
|
@@ -915,7 +1050,7 @@ function createBillLifecycleClient({
|
|
|
915
1050
|
);
|
|
916
1051
|
const body = await response.json();
|
|
917
1052
|
if (typeof body.replacementBillId !== "string") {
|
|
918
|
-
throw new Error("
|
|
1053
|
+
throw new Error("The billing service did not return the correction bill ID.");
|
|
919
1054
|
}
|
|
920
1055
|
return {
|
|
921
1056
|
replacementBillId: body.replacementBillId,
|
|
@@ -1008,7 +1143,7 @@ function useBillLifecycle({
|
|
|
1008
1143
|
if (mounted.current) setData(next);
|
|
1009
1144
|
return next;
|
|
1010
1145
|
} catch (cause) {
|
|
1011
|
-
const nextError = cause instanceof Error ? cause : new Error("
|
|
1146
|
+
const nextError = cause instanceof Error ? cause : new Error("The billing service could not complete this request.");
|
|
1012
1147
|
if (mounted.current) setError(nextError);
|
|
1013
1148
|
throw nextError;
|
|
1014
1149
|
} finally {
|
|
@@ -1019,6 +1154,10 @@ function useBillLifecycle({
|
|
|
1019
1154
|
(input) => mutate(() => client.saveReview(input)),
|
|
1020
1155
|
[client, mutate]
|
|
1021
1156
|
);
|
|
1157
|
+
const searchClaimsAdministrators = useCallback2(
|
|
1158
|
+
(query) => client.searchClaimsAdministrators(query),
|
|
1159
|
+
[client]
|
|
1160
|
+
);
|
|
1022
1161
|
const submitBill = useCallback2(
|
|
1023
1162
|
(input, route) => mutate(() => client.submitBill(input, route)),
|
|
1024
1163
|
[client, mutate]
|
|
@@ -1075,6 +1214,7 @@ function useBillLifecycle({
|
|
|
1075
1214
|
isRefreshing,
|
|
1076
1215
|
isMutating,
|
|
1077
1216
|
refresh,
|
|
1217
|
+
searchClaimsAdministrators,
|
|
1078
1218
|
saveReview,
|
|
1079
1219
|
submitBill,
|
|
1080
1220
|
addAttachment,
|
|
@@ -1131,6 +1271,7 @@ function SupportingDocumentControl({
|
|
|
1131
1271
|
}
|
|
1132
1272
|
function ConnectedBillLifecycle({
|
|
1133
1273
|
appearance,
|
|
1274
|
+
features,
|
|
1134
1275
|
className,
|
|
1135
1276
|
style,
|
|
1136
1277
|
loadingFallback,
|
|
@@ -1217,7 +1358,9 @@ function ConnectedBillLifecycle({
|
|
|
1217
1358
|
{
|
|
1218
1359
|
data,
|
|
1219
1360
|
...appearance ? { appearance } : {},
|
|
1361
|
+
...features ? { features } : {},
|
|
1220
1362
|
disabled: lifecycle.isMutating,
|
|
1363
|
+
onSearchClaimsAdministrators: lifecycle.searchClaimsAdministrators,
|
|
1221
1364
|
onSave: lifecycle.saveReview,
|
|
1222
1365
|
onSubmit: async (input, route) => {
|
|
1223
1366
|
await complete("Bill submitted.", () => lifecycle.submitBill(input, route));
|
|
@@ -1250,7 +1393,7 @@ function ConnectedBillLifecycle({
|
|
|
1250
1393
|
"Bill #",
|
|
1251
1394
|
data.bill.billNumber
|
|
1252
1395
|
] }),
|
|
1253
|
-
/* @__PURE__ */ jsx3("span", { children: lifecycle.isRefreshing ? "Refreshing\u2026" : "
|
|
1396
|
+
/* @__PURE__ */ jsx3("span", { children: lifecycle.isRefreshing ? "Refreshing\u2026" : "Status and actions update automatically." })
|
|
1254
1397
|
] }),
|
|
1255
1398
|
/* @__PURE__ */ jsxs3("div", { className: "mb-lifecycle-toolbar-actions", children: [
|
|
1256
1399
|
has("view_eor") ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mb-lifecycle-button secondary", onClick: () => document.getElementById(`mb-eors-${data.bill.id}`)?.scrollIntoView({ behavior: "smooth", block: "center" }), children: "View EOR" }) : null,
|
|
@@ -1284,7 +1427,7 @@ function ConnectedBillLifecycle({
|
|
|
1284
1427
|
panel === "correction" ? /* @__PURE__ */ jsxs3("section", { className: "mb-lifecycle-panel", children: [
|
|
1285
1428
|
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1286
1429
|
/* @__PURE__ */ jsx3("h3", { children: "Correct and resubmit" }),
|
|
1287
|
-
/* @__PURE__ */ jsx3("p", { children: "
|
|
1430
|
+
/* @__PURE__ */ jsx3("p", { children: "A new correction draft will preserve this rejected bill in history. Review the copied values before submitting." })
|
|
1288
1431
|
] }),
|
|
1289
1432
|
/* @__PURE__ */ jsxs3("div", { className: "mb-lifecycle-panel-actions", children: [
|
|
1290
1433
|
/* @__PURE__ */ jsx3("button", { type: "button", className: "mb-lifecycle-button secondary", onClick: () => setPanel(""), children: "Cancel" }),
|
|
@@ -1294,7 +1437,7 @@ function ConnectedBillLifecycle({
|
|
|
1294
1437
|
panel === "second_review" ? /* @__PURE__ */ jsxs3("section", { className: "mb-lifecycle-panel wide", children: [
|
|
1295
1438
|
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1296
1439
|
/* @__PURE__ */ jsx3("h3", { children: "Submit Second Review" }),
|
|
1297
|
-
/* @__PURE__ */ jsx3("p", { children: "State why payment is disputed, confirm the payer control number, and choose the supporting documents
|
|
1440
|
+
/* @__PURE__ */ jsx3("p", { children: "State why payment is disputed, confirm the payer control number, and choose the supporting documents to send." })
|
|
1298
1441
|
] }),
|
|
1299
1442
|
/* @__PURE__ */ jsxs3("div", { className: "mb-lifecycle-fields two", children: [
|
|
1300
1443
|
/* @__PURE__ */ jsxs3("label", { children: [
|
|
@@ -1351,7 +1494,7 @@ function ConnectedBillLifecycle({
|
|
|
1351
1494
|
panel === "payment" ? /* @__PURE__ */ jsxs3("section", { className: "mb-lifecycle-panel", children: [
|
|
1352
1495
|
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1353
1496
|
/* @__PURE__ */ jsx3("h3", { children: "Post payment" }),
|
|
1354
|
-
/* @__PURE__ */ jsx3("p", { children: "Record funds shown on the EOR.
|
|
1497
|
+
/* @__PURE__ */ jsx3("p", { children: "Record funds shown on the EOR. The balance updates and the bill closes automatically when configured." })
|
|
1355
1498
|
] }),
|
|
1356
1499
|
/* @__PURE__ */ jsxs3("div", { className: "mb-lifecycle-fields two", children: [
|
|
1357
1500
|
/* @__PURE__ */ jsxs3("label", { children: [
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/native-bill-review.tsx","../src/connected-bill-status.tsx","../src/connected-bill-lifecycle.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@mindbill/embed\";\nimport type { CSSProperties, ReactElement } from \"react\";\nimport { createElement, useEffect, useRef } from \"react\";\nimport type {\n MindBillAppearance,\n MindBillErrorDetail,\n MindBillEventDetail,\n} from \"@mindbill/embed\";\n\nexport type MindBillWidgetProps = {\n sessionToken: string;\n embedUrl: string;\n appearance?: MindBillAppearance;\n className?: string;\n style?: CSSProperties;\n onMindBill?: (event: CustomEvent<MindBillEventDetail>) => void;\n onMindBillError?: (event: CustomEvent<MindBillErrorDetail>) => void;\n};\n\nfunction widget(tagName: string, props: MindBillWidgetProps): ReactElement {\n const ref = useRef<HTMLElement | null>(null);\n const { onMindBill, onMindBillError } = props;\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const handleEvent = (event: Event) =>\n onMindBill?.(event as CustomEvent<MindBillEventDetail>);\n const handleError = (event: Event) =>\n onMindBillError?.(event as CustomEvent<MindBillErrorDetail>);\n element.addEventListener(\"mindbill\", handleEvent);\n element.addEventListener(\"mindbill-error\", handleError);\n return () => {\n element.removeEventListener(\"mindbill\", handleEvent);\n element.removeEventListener(\"mindbill-error\", handleError);\n };\n }, [onMindBill, onMindBillError]);\n\n return createElement(tagName, {\n ref,\n \"session-token\": props.sessionToken,\n \"embed-url\": props.embedUrl,\n theme: props.appearance?.theme,\n \"accent-color\": props.appearance?.accentColor,\n \"background-color\": props.appearance?.backgroundColor,\n \"surface-color\": props.appearance?.surfaceColor,\n \"text-color\": props.appearance?.textColor,\n \"muted-color\": props.appearance?.mutedColor,\n \"border-color\": props.appearance?.borderColor,\n \"font-family\": props.appearance?.fontFamily,\n \"border-radius\": props.appearance?.borderRadius,\n locale: props.appearance?.locale,\n class: props.className,\n style: props.style,\n });\n}\n\nexport function MindBillBillTimeline(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-bill-timeline\", props);\n}\nexport function MindBillBillReview(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-bill-review\", props);\n}\nexport function MindBillBillFromReport(\n props: MindBillWidgetProps,\n): ReactElement {\n return widget(\"mindbill-bill-from-report\", props);\n}\nexport function MindBillCollections(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-collections\", props);\n}\nexport function MindBillOnboarding(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-onboarding\", props);\n}\n\nexport const HostedBillTimeline = MindBillBillTimeline;\nexport const HostedBillReview = MindBillBillReview;\nexport const HostedBillFromReport = MindBillBillFromReport;\nexport const HostedCollections = MindBillCollections;\nexport const HostedOnboarding = MindBillOnboarding;\n\nexport type {\n MindBillAppearance,\n MindBillErrorDetail,\n MindBillEventDetail,\n} from \"@mindbill/embed\";\n\nexport {\n BillReviewForm,\n BillStatusSummary,\n buildBillReviewSaveInput,\n} from \"./native-bill-review\";\nexport type {\n BillReviewAttachment,\n BillReviewBillingProvider,\n BillReviewClinician,\n BillReviewData,\n BillReviewDocumentType,\n BillReviewDraft,\n BillReviewFormProps,\n BillReviewLineItem,\n BillReviewLocation,\n BillReviewSaveInput,\n BillStatusSummaryProps,\n BillStatusAction,\n BillSubmissionRoute,\n} from \"./native-bill-review\";\n\nexport {\n ConnectedBillStatus,\n createBillStatusClient,\n useBillStatus,\n} from \"./connected-bill-status\";\n\nexport {\n ConnectedBillLifecycle,\n createBillLifecycleClient,\n useBillLifecycle,\n} from \"./connected-bill-lifecycle\";\nexport type {\n BillEorDocument,\n BillLifecycleAction,\n BillLifecycleActionId,\n BillLifecycleClient,\n BillLifecycleClientOptions,\n BillLifecycleData,\n BillLifecycleSession,\n BillLifecycleSessionProvider,\n BillLifecycleSessionRequest,\n CloseBillInput,\n ConnectedBillLifecycleProps,\n PostBillPaymentInput,\n SubmitSecondReviewInput,\n UseBillLifecycleOptions,\n UseBillLifecycleResult,\n} from \"./connected-bill-lifecycle\";\nexport type {\n BillStatusClient,\n BillStatusClientOptions,\n BillStatusData,\n BillStatusSession,\n BillStatusSessionProvider,\n BillStatusSessionRequest,\n ConnectedBillStatusProps,\n UseBillStatusOptions,\n UseBillStatusResult,\n} from \"./connected-bill-status\";\n","\"use client\";\n\nimport type { MindBillAppearance } from \"@mindbill/embed\";\nimport type { CSSProperties, FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n id?: string;\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n id?: string;\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n id?: string;\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n dos: string;\n dosEnd?: string | null;\n placeOfServiceId?: string;\n authorizationNumber?: string | null;\n billingProviderId?: string;\n renderingProviderId?: string;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: { name: string; dob?: string };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n claimsAdminId?: string;\n };\n options?: {\n billingProviders?: BillReviewBillingProvider[];\n renderingProviders?: BillReviewClinician[];\n locations?: BillReviewLocation[];\n };\n};\n\nexport type BillReviewSaveInput = {\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProviderId?: string;\n billingProvider?: Omit<BillReviewBillingProvider, \"id\">;\n renderingProviderId?: string;\n renderingProvider?: Omit<BillReviewClinician, \"id\">;\n placeOfServiceId?: string;\n placeOfService?: Omit<BillReviewLocation, \"id\">;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n }>;\n};\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\n\nexport type BillReviewFormProps = {\n data: BillReviewData;\n onSave: (input: BillReviewSaveInput) => Promise<BillReviewData | void>;\n onSubmit: (\n input: BillReviewSaveInput,\n route: BillSubmissionRoute,\n ) => Promise<void>;\n onAddAttachment: (\n file: File,\n documentType: BillReviewDocumentType,\n description?: string,\n ) => Promise<void>;\n onRemoveAttachment: (attachmentId: string) => Promise<void>;\n onOpenAttachment?: (attachment: BillReviewAttachment) => void;\n className?: string;\n style?: CSSProperties;\n appearance?: MindBillAppearance;\n disabled?: boolean;\n};\n\nexport type BillReviewDraft = {\n dos: string;\n dosEnd: string;\n authorizationNumber: string;\n billingProvider: BillReviewBillingProvider;\n clinician: BillReviewClinician;\n location: BillReviewLocation;\n lineItems: BillReviewLineItem[];\n};\n\nconst EMPTY_BILLING_PROVIDER: BillReviewBillingProvider = {\n name: \"\",\n taxId: \"\",\n npi: \"\",\n billType: \"Professional\",\n};\nconst EMPTY_CLINICIAN: BillReviewClinician = {\n name: \"\",\n specialty: \"\",\n npi: \"\",\n};\nconst EMPTY_LOCATION: BillReviewLocation = {\n name: \"\",\n street: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n posCode: \"11\",\n};\n\nconst DOCUMENT_LABELS: Record<BillReviewDocumentType, string> = {\n final_report: \"Final medical-legal report\",\n letter_of_attestation: \"Letter of attestation\",\n proof_of_service: \"Proof of service\",\n form_122: \"DWC Form 122\",\n return_to_work_voucher: \"Return-to-work voucher\",\n w9: \"W-9\",\n medical_records: \"Medical records\",\n appeal: \"Appeal or review support\",\n other: \"Other supporting document\",\n};\n\nfunction withoutId<T extends { id?: string }>(value: T): Omit<T, \"id\"> {\n const result = { ...value };\n delete result.id;\n return result;\n}\n\nfunction toDraft(data: BillReviewData): BillReviewDraft {\n const snapshot = data.bill.billingSnapshot;\n return {\n dos: data.bill.dos || \"\",\n dosEnd: data.bill.dosEnd || \"\",\n authorizationNumber: data.bill.authorizationNumber || \"\",\n billingProvider: {\n ...EMPTY_BILLING_PROVIDER,\n ...(snapshot?.billingProvider ?? {}),\n },\n clinician: { ...EMPTY_CLINICIAN, ...(snapshot?.renderingProvider ?? {}) },\n location: { ...EMPTY_LOCATION, ...(snapshot?.placeOfService ?? {}) },\n lineItems: data.bill.lineItems.map((line) => ({ ...line })),\n };\n}\n\nexport function buildBillReviewSaveInput(\n draft: BillReviewDraft,\n): BillReviewSaveInput {\n return {\n dos: draft.dos,\n dosEnd: draft.dosEnd || null,\n authorizationNumber: draft.authorizationNumber.trim() || null,\n ...(draft.billingProvider.id\n ? { billingProviderId: draft.billingProvider.id }\n : {}),\n billingProvider: withoutId(draft.billingProvider),\n ...(draft.clinician.id\n ? { renderingProviderId: draft.clinician.id }\n : {}),\n renderingProvider: withoutId(draft.clinician),\n ...(draft.location.id ? { placeOfServiceId: draft.location.id } : {}),\n placeOfService: withoutId(draft.location),\n lineItems: draft.lineItems.map(({ id, code, modifiers, units }) => ({\n ...(id ? { id } : {}),\n code: code.trim().toUpperCase(),\n modifiers,\n units,\n })),\n };\n}\n\nfunction money(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\nfunction appearanceStyle(\n appearance: MindBillAppearance | undefined,\n style: CSSProperties | undefined,\n): CSSProperties {\n return {\n ...(appearance?.accentColor\n ? { \"--mb-accent\": appearance.accentColor }\n : {}),\n ...(appearance?.textColor ? { \"--mb-text\": appearance.textColor } : {}),\n ...(appearance?.mutedColor\n ? { \"--mb-muted\": appearance.mutedColor }\n : {}),\n ...(appearance?.borderColor\n ? { \"--mb-border\": appearance.borderColor }\n : {}),\n ...(appearance?.backgroundColor\n ? { \"--mb-soft\": appearance.backgroundColor }\n : {}),\n ...(appearance?.surfaceColor\n ? { \"--mb-surface\": appearance.surfaceColor }\n : {}),\n ...(appearance?.fontFamily\n ? { \"--mb-font\": appearance.fontFamily }\n : {}),\n ...style,\n } as CSSProperties;\n}\n\nfunction Field({\n label,\n value,\n onChange,\n type = \"text\",\n optional,\n required,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n type?: string;\n optional?: boolean;\n required?: boolean;\n}): ReactElement {\n return (\n <label className=\"mb-native-field\">\n <span>\n {label} {optional ? <small>Optional</small> : null}\n </span>\n <input\n type={type}\n value={value}\n required={required}\n onChange={(event) => onChange(event.target.value)}\n />\n </label>\n );\n}\n\nexport function BillReviewForm({\n data,\n onSave,\n onSubmit,\n onAddAttachment,\n onRemoveAttachment,\n onOpenAttachment,\n className,\n style,\n appearance,\n disabled = false,\n}: BillReviewFormProps): ReactElement {\n const [draft, setDraft] = useState(() => toDraft(data));\n const [route, setRoute] = useState<BillSubmissionRoute>(\"ebill\");\n const [file, setFile] = useState<File | null>(null);\n const [documentType, setDocumentType] =\n useState<BillReviewDocumentType>(\"other\");\n const [busy, setBusy] = useState<\"save\" | \"submit\" | \"attachment\" | \"\">(\"\");\n const [error, setError] = useState(\"\");\n const [notice, setNotice] = useState(\"\");\n const routeName = useId();\n const editable = data.bill.status === \"incomplete\" && !disabled;\n\n useEffect(() => setDraft(toDraft(data)), [data]);\n\n const canSubmit = useMemo(\n () =>\n Boolean(\n draft.dos &&\n draft.billingProvider.name.trim() &&\n draft.billingProvider.taxId.trim() &&\n draft.billingProvider.npi.trim() &&\n draft.clinician.name.trim() &&\n draft.clinician.npi.trim() &&\n draft.location.name.trim() &&\n draft.location.street.trim() &&\n draft.location.city.trim() &&\n draft.location.state.trim() &&\n draft.location.zip.trim() &&\n draft.lineItems.length &&\n draft.lineItems.every((line) => line.code.trim() && line.units > 0),\n ),\n [draft],\n );\n\n const updateBillingProvider = <K extends keyof BillReviewBillingProvider>(\n key: K,\n value: BillReviewBillingProvider[K],\n ) =>\n setDraft((current) => ({\n ...current,\n billingProvider: { ...current.billingProvider, [key]: value },\n }));\n const updateClinician = <K extends keyof BillReviewClinician>(\n key: K,\n value: BillReviewClinician[K],\n ) =>\n setDraft((current) => ({\n ...current,\n clinician: { ...current.clinician, [key]: value },\n }));\n const updateLocation = <K extends keyof BillReviewLocation>(\n key: K,\n value: BillReviewLocation[K],\n ) =>\n setDraft((current) => ({\n ...current,\n location: { ...current.location, [key]: value },\n }));\n\n async function run(action: \"save\" | \"submit\", task: () => Promise<void>) {\n setBusy(action);\n setError(\"\");\n setNotice(\"\");\n try {\n await task();\n setNotice(action === \"save\" ? \"Changes saved.\" : \"Bill submitted.\");\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"MindBill could not complete this request.\",\n );\n } finally {\n setBusy(\"\");\n }\n }\n\n const handleSave = (event: FormEvent) => {\n event.preventDefault();\n void run(\"save\", async () => {\n const updated = await onSave(buildBillReviewSaveInput(draft));\n if (updated) setDraft(toDraft(updated));\n });\n };\n\n const handleSubmit = () =>\n run(\"submit\", () => onSubmit(buildBillReviewSaveInput(draft), route));\n\n const attach = async () => {\n if (!file) return;\n setBusy(\"attachment\");\n setError(\"\");\n try {\n await onAddAttachment(file, documentType, DOCUMENT_LABELS[documentType]);\n setFile(null);\n setDocumentType(\"other\");\n setNotice(\"Document added to the payer packet.\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Document could not be attached.\");\n } finally {\n setBusy(\"\");\n }\n };\n\n const sectionClass = \"mb-native-section\";\n return (\n <form\n className={[\"mb-native-review\", className].filter(Boolean).join(\" \")}\n style={appearanceStyle(appearance, style)}\n onSubmit={handleSave}\n >\n <style>{NATIVE_BILL_REVIEW_STYLES}</style>\n <header className=\"mb-native-heading\">\n <div>\n <span className=\"mb-native-eyebrow\">Billing review</span>\n <h2>Bill #{data.bill.billNumber}</h2>\n <p>Review the prefilled claim and payer packet, then submit.</p>\n </div>\n <div className=\"mb-native-total\">\n <span>{data.bill.status}</span>\n <strong>{money(data.bill.totalCharge)}</strong>\n </div>\n </header>\n\n <dl className=\"mb-native-summary\">\n <div><dt>Patient</dt><dd>{data.patient.name || \"—\"}</dd></div>\n <div><dt>Claim</dt><dd>{data.injury.claimNumber || \"—\"}</dd></div>\n <div><dt>Employer</dt><dd>{data.injury.employer || \"—\"}</dd></div>\n <div><dt>Date of injury</dt><dd>{data.injury.doi || \"—\"}</dd></div>\n </dl>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Claim and service</h3><p>These values print on the bill.</p></div></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Date of service\" type=\"date\" required value={draft.dos} onChange={(dos) => setDraft((current) => ({ ...current, dos }))} />\n <Field label=\"End date\" type=\"date\" optional value={draft.dosEnd} onChange={(dosEnd) => setDraft((current) => ({ ...current, dosEnd }))} />\n <Field label=\"Authorization number\" optional value={draft.authorizationNumber} onChange={(authorizationNumber) => setDraft((current) => ({ ...current, authorizationNumber }))} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Billing practice</h3><p>Payee identity and billing address for this claim.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Practice name\" required value={draft.billingProvider.name} onChange={(value) => updateBillingProvider(\"name\", value)} />\n <Field label=\"Tax ID\" required value={draft.billingProvider.taxId} onChange={(value) => updateBillingProvider(\"taxId\", value)} />\n <Field label=\"Group NPI\" required value={draft.billingProvider.npi} onChange={(value) => updateBillingProvider(\"npi\", value)} />\n <Field label=\"Phone\" optional value={draft.billingProvider.phone || \"\"} onChange={(value) => updateBillingProvider(\"phone\", value)} />\n <Field label=\"Billing street\" required value={draft.billingProvider.billingStreet || \"\"} onChange={(value) => updateBillingProvider(\"billingStreet\", value)} />\n <Field label=\"City\" required value={draft.billingProvider.billingCity || \"\"} onChange={(value) => updateBillingProvider(\"billingCity\", value)} />\n <Field label=\"State\" required value={draft.billingProvider.billingState || \"\"} onChange={(value) => updateBillingProvider(\"billingState\", value)} />\n <Field label=\"ZIP\" required value={draft.billingProvider.billingZip || \"\"} onChange={(value) => updateBillingProvider(\"billingZip\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Clinician</h3><p>Provider identity printed on the claim.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Clinician name\" required value={draft.clinician.name} onChange={(value) => updateClinician(\"name\", value)} />\n <Field label=\"Specialty\" value={draft.clinician.specialty} onChange={(value) => updateClinician(\"specialty\", value)} />\n <Field label=\"NPI\" required value={draft.clinician.npi} onChange={(value) => updateClinician(\"npi\", value)} />\n <Field label=\"Taxonomy\" optional value={draft.clinician.taxonomy || \"\"} onChange={(value) => updateClinician(\"taxonomy\", value)} />\n <Field label=\"License number\" optional value={draft.clinician.licenseNumber || \"\"} onChange={(value) => updateClinician(\"licenseNumber\", value)} />\n <Field label=\"License state\" optional value={draft.clinician.licenseState || \"\"} onChange={(value) => updateClinician(\"licenseState\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Service location</h3><p>The exact place of service for this bill.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Location name\" required value={draft.location.name} onChange={(value) => updateLocation(\"name\", value)} />\n <Field label=\"Street\" required value={draft.location.street} onChange={(value) => updateLocation(\"street\", value)} />\n <Field label=\"City\" required value={draft.location.city} onChange={(value) => updateLocation(\"city\", value)} />\n <Field label=\"State\" required value={draft.location.state} onChange={(value) => updateLocation(\"state\", value)} />\n <Field label=\"ZIP\" required value={draft.location.zip} onChange={(value) => updateLocation(\"zip\", value)} />\n <Field label=\"Place of service code\" required value={draft.location.posCode || \"11\"} onChange={(value) => updateLocation(\"posCode\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Procedure lines</h3><p>MindBill recalculates the allowed amount when changes are saved.</p></div><button type=\"button\" className=\"mb-native-button quiet\" disabled={!editable} onClick={() => setDraft((current) => ({ ...current, lineItems: [...current.lineItems, { code: \"\", modifiers: [], units: 1, charge: 0 }] }))}>+ Add line</button></div>\n <div className=\"mb-native-lines\">\n {draft.lineItems.map((line, index) => (\n <div className=\"mb-native-line\" key={line.id || index}>\n <Field label=\"Procedure\" required value={line.code} onChange={(value) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, code: value } : item) }))} />\n <Field label=\"Modifiers\" value={line.modifiers.join(\", \")} onChange={(value) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, modifiers: value.split(\",\").map((part) => part.trim()).filter(Boolean) } : item) }))} />\n <label className=\"mb-native-field\"><span>Units</span><input type=\"number\" min=\"1\" required value={line.units} onChange={(event) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, units: Number(event.target.value) } : item) }))} /></label>\n <div className=\"mb-native-allowed\"><span>Allowed</span><strong>{money(line.charge)}</strong></div>\n <button type=\"button\" className=\"mb-native-remove\" aria-label={`Remove ${line.code || \"procedure\"}`} disabled={!editable || draft.lineItems.length === 1} onClick={() => setDraft((current) => ({ ...current, lineItems: current.lineItems.filter((_, itemIndex) => itemIndex !== index) }))}>×</button>\n </div>\n ))}\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Payer billing packet</h3><p>Review exactly what will be sent with this bill.</p></div><span>{data.bill.attachments.length} files</span></div>\n <div className=\"mb-native-note\"><strong>Separate from attorney report service.</strong> Final reports, proof of service, and required billing forms may be preselected. Medical records are never silently attached.</div>\n <ul className=\"mb-native-documents\">\n {data.bill.attachments.map((attachment) => (\n <li key={attachment.id}>\n <span className=\"mb-native-file\">PDF</span>\n <div><strong>{attachment.filename}</strong><span>{DOCUMENT_LABELS[attachment.documentType as BillReviewDocumentType] || attachment.description || \"Supporting document\"}</span></div>\n {onOpenAttachment ? <button type=\"button\" className=\"mb-native-button quiet\" onClick={() => onOpenAttachment(attachment)}>View</button> : null}\n <button type=\"button\" className=\"mb-native-remove\" disabled={!editable || busy === \"attachment\"} aria-label={`Remove ${attachment.filename}`} onClick={() => void onRemoveAttachment(attachment.id).catch((cause) => setError(cause instanceof Error ? cause.message : \"Document could not be removed.\"))}>×</button>\n </li>\n ))}\n </ul>\n <div className=\"mb-native-attach\">\n <div><strong>Add supporting PDF</strong><span>Choose any additional document intentionally. Up to 25 MB.</span></div>\n <select aria-label=\"Document type\" value={documentType} disabled={!editable} onChange={(event) => setDocumentType(event.target.value as BillReviewDocumentType)}>{Object.entries(DOCUMENT_LABELS).map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select>\n <input aria-label=\"Choose supporting PDF\" type=\"file\" accept=\"application/pdf,.pdf\" disabled={!editable} onChange={(event) => setFile(event.target.files?.[0] || null)} />\n <button className=\"mb-native-button secondary\" type=\"button\" disabled={!editable || !file || busy === \"attachment\"} onClick={() => void attach()}>{busy === \"attachment\" ? \"Attaching…\" : \"Attach document\"}</button>\n </div>\n </section>\n\n <section className=\"mb-native-submit\">\n <div><span className=\"mb-native-eyebrow\">Delivery</span><h3>Submit this bill</h3><p>MindBill will send the claim and own status, payment, denial, and resubmission.</p></div>\n <fieldset><legend>Send via</legend>{([\"ebill\", \"fax\", \"mail\", \"email\"] as const).map((value) => <label key={value}><input type=\"radio\" name={routeName} value={value} checked={route === value} onChange={() => setRoute(value)} />{value === \"ebill\" ? \"E-bill\" : value.charAt(0).toUpperCase() + value.slice(1)}</label>)}</fieldset>\n {error ? <div className=\"mb-native-message error\" role=\"alert\">{error}</div> : null}\n {notice ? <div className=\"mb-native-message success\" role=\"status\">{notice}</div> : null}\n <div className=\"mb-native-actions\">\n <button className=\"mb-native-button secondary\" type=\"submit\" disabled={!editable || busy !== \"\"}>{busy === \"save\" ? \"Saving…\" : \"Save changes\"}</button>\n <button className=\"mb-native-button primary\" type=\"button\" disabled={!editable || !canSubmit || busy !== \"\"} onClick={() => void handleSubmit()}>{busy === \"submit\" ? \"Submitting…\" : \"Submit bill\"}</button>\n </div>\n </section>\n </form>\n );\n}\n\nexport type BillStatusSummaryProps = {\n status: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n actions?: BillStatusAction[];\n className?: string;\n style?: CSSProperties;\n appearance?: MindBillAppearance;\n};\n\nexport type BillStatusAction = {\n id: string;\n label: string;\n onClick: () => void;\n primary?: boolean;\n disabled?: boolean;\n};\n\nexport function BillStatusSummary({ status, submittedAt, agingDays, updatedAt, totalCharge, totalPaid, balanceDue, actions = [], className, style, appearance }: BillStatusSummaryProps): ReactElement {\n return <section className={[\"mb-native-status\", className].filter(Boolean).join(\" \")} style={appearanceStyle(appearance, style)}>\n <style>{NATIVE_BILL_REVIEW_STYLES}</style>\n <div className=\"mb-native-status-copy\"><span className=\"mb-native-eyebrow\">Bill status</span><h3>{status.replaceAll(\"_\", \" \")}</h3><p>{submittedAt ? `Submitted ${new Date(submittedAt).toLocaleDateString()}` : \"Not submitted\"}{agingDays == null ? \"\" : ` · ${agingDays} day${agingDays === 1 ? \"\" : \"s\"} old`}{updatedAt ? ` · Updated ${new Date(updatedAt).toLocaleDateString()}` : \"\"}</p></div>\n <dl><div><dt>Charged</dt><dd>{money(totalCharge)}</dd></div><div><dt>Paid</dt><dd>{money(totalPaid)}</dd></div><div><dt>Balance</dt><dd>{money(balanceDue)}</dd></div></dl>\n {actions.length ? <div className=\"mb-native-status-actions\">{actions.map((action) => <button key={action.id} type=\"button\" className={`mb-native-button ${action.primary ? \"primary\" : \"secondary\"}`} disabled={action.disabled} onClick={action.onClick}>{action.label}</button>)}</div> : null}\n </section>;\n}\n\nconst NATIVE_BILL_REVIEW_STYLES = `\n.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}\n.mb-native-review,.mb-native-status{--mb-accent:#238dbd;--mb-accent-dark:#176f98;--mb-text:#203743;--mb-muted:#657982;--mb-border:#dbe6ea;--mb-soft:#f3f8fa;--mb-surface:#fff;color:var(--mb-text);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}.mb-native-review *,.mb-native-status *{box-sizing:border-box}.mb-native-review{display:grid;gap:16px}.mb-native-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;padding:6px 2px}.mb-native-heading h2,.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{margin:3px 0 2px;line-height:1.2}.mb-native-heading h2{font-size:25px}.mb-native-heading p,.mb-native-section p,.mb-native-submit p,.mb-native-status p{margin:0;color:var(--mb-muted)}.mb-native-eyebrow{color:#59727d;font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.mb-native-total{display:flex;align-items:center;gap:18px}.mb-native-total span,.mb-native-section-head>span{border-radius:999px;background:var(--mb-soft);color:#58717c;font-size:11px;font-weight:800;padding:6px 10px;text-transform:capitalize}.mb-native-total strong{font-size:24px}.mb-native-summary{display:grid;grid-template-columns:repeat(4,1fr);margin:0;border:1px solid var(--mb-border);border-radius:12px;background:var(--mb-surface);overflow:hidden}.mb-native-summary div{padding:17px 20px;border-right:1px solid var(--mb-border)}.mb-native-summary div:last-child{border:0}.mb-native-summary dt,.mb-native-allowed span{color:#647982;font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.mb-native-summary dd{margin:5px 0 0;font-weight:750}.mb-native-section{padding:20px;border:1px solid var(--mb-border);border-radius:14px;background:var(--mb-surface);box-shadow:0 8px 24px rgba(28,58,72,.04)}.mb-native-section-head{display:flex;align-items:start;justify-content:space-between;gap:16px;margin-bottom:17px}.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{font-size:19px}.mb-native-grid{display:grid;gap:14px}.mb-native-grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.mb-native-field{display:grid;gap:6px;min-width:0;color:var(--mb-text);font-size:12px;font-weight:750}.mb-native-field small{color:var(--mb-muted);font-size:inherit;font-weight:500}.mb-native-field input,.mb-native-attach select,.mb-native-attach input{width:100%;min-height:43px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);font:inherit;padding:10px 12px}.mb-native-field input:focus,.mb-native-attach select:focus,.mb-native-attach input:focus{border-color:var(--mb-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--mb-accent) 14%,transparent);outline:0}.mb-native-lines{display:grid;gap:10px}.mb-native-line{display:grid;grid-template-columns:1.1fr 1.1fr 110px 120px 28px;align-items:end;gap:12px;padding:13px;background:var(--mb-soft);border:1px solid #e3edf0;border-radius:10px}.mb-native-allowed{display:grid;gap:5px;padding:0 8px 11px;text-align:right}.mb-native-allowed strong{font-size:16px}.mb-native-remove{border:0;background:transparent;color:#667d86;cursor:pointer;font-size:20px;padding:7px}.mb-native-note{padding:13px 15px;border:1px solid #bdd9e4;border-radius:9px;background:#f2f9fc;color:#526d78}.mb-native-note strong{color:var(--mb-text);margin-right:12px}.mb-native-documents{list-style:none;margin:14px 0;padding:0}.mb-native-documents li{display:grid;grid-template-columns:42px 1fr auto 28px;align-items:center;gap:12px;padding:12px 4px;border-bottom:1px solid var(--mb-border)}.mb-native-documents li>div{display:grid}.mb-native-documents li span{color:var(--mb-muted);font-size:12px}.mb-native-file{display:grid;place-items:center;width:40px;height:40px;border-radius:8px;background:#eaf5f9;color:var(--mb-accent)!important;font-size:11px!important;font-weight:850}.mb-native-attach{display:grid;grid-template-columns:1fr 230px minmax(220px,1fr) auto;align-items:end;gap:12px;padding:15px;border-radius:10px;background:var(--mb-soft)}.mb-native-attach>div{display:grid;gap:3px}.mb-native-attach span{color:var(--mb-muted);font-size:12px}.mb-native-button{min-height:40px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);cursor:pointer;font:inherit;font-weight:750;padding:9px 14px}.mb-native-button.primary{border-color:var(--mb-accent);background:var(--mb-accent);color:#fff}.mb-native-button.primary:hover{background:var(--mb-accent-dark)}.mb-native-button.secondary{background:#fff}.mb-native-button.quiet{min-height:auto;background:var(--mb-soft);padding:7px 11px}.mb-native-button:disabled,.mb-native-remove:disabled{cursor:not-allowed;opacity:.5}.mb-native-submit{display:grid;grid-template-columns:1fr auto;align-items:end;gap:18px;padding:22px;border:1px solid #bcd8e2;border-radius:14px;background:linear-gradient(135deg,#f3fafc,#eaf6fa)}.mb-native-submit fieldset{display:flex;gap:6px;margin:0;padding:0;border:0}.mb-native-submit legend{position:absolute;width:1px;height:1px;overflow:hidden}.mb-native-submit fieldset label{display:flex;align-items:center;gap:6px;padding:9px 11px;border:1px solid #c9dce3;border-radius:8px;background:#fff;font-weight:700}.mb-native-actions{display:flex;justify-content:flex-end;gap:10px;grid-column:1/-1}.mb-native-message{grid-column:1/-1;padding:10px 12px;border-radius:8px}.mb-native-message.error{background:#fff0ef;color:#9d3029}.mb-native-message.success{background:#edf9f2;color:#217449}.mb-native-status{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px;border:1px solid var(--mb-border);border-radius:12px;background:#fff}.mb-native-status h3{text-transform:capitalize}.mb-native-status dl{display:flex;margin:0}.mb-native-status dl div{min-width:110px;padding:0 18px;border-left:1px solid var(--mb-border)}.mb-native-status dt{color:var(--mb-muted);font-size:11px}.mb-native-status dd{margin:4px 0 0;font-size:17px;font-weight:800}@media(max-width:900px){.mb-native-grid.three{grid-template-columns:repeat(2,minmax(0,1fr))}.mb-native-summary{grid-template-columns:repeat(2,1fr)}.mb-native-summary div:nth-child(2){border-right:0}.mb-native-summary div:nth-child(-n+2){border-bottom:1px solid var(--mb-border)}.mb-native-line{grid-template-columns:1fr 1fr 90px}.mb-native-allowed{align-self:center}.mb-native-attach{grid-template-columns:1fr 1fr}.mb-native-submit{grid-template-columns:1fr}.mb-native-submit fieldset,.mb-native-actions{grid-column:1}.mb-native-actions{justify-content:start}}@media(max-width:620px){.mb-native-heading,.mb-native-total,.mb-native-status{align-items:start;flex-direction:column}.mb-native-grid.three,.mb-native-summary,.mb-native-line,.mb-native-attach{grid-template-columns:1fr}.mb-native-summary div,.mb-native-summary div:nth-child(2){border-right:0;border-bottom:1px solid var(--mb-border)}.mb-native-line{align-items:stretch}.mb-native-allowed{text-align:left}.mb-native-submit fieldset{display:grid;grid-template-columns:1fr 1fr}.mb-native-status dl{width:100%}.mb-native-status dl div{min-width:0;flex:1;padding:0 10px}.mb-native-status dl div:first-child{padding-left:0;border-left:0}}\n.mb-native-status-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.mb-native-status-copy{min-width:150px}.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}\n`;\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n BillStatusSummary,\n type BillStatusSummaryProps,\n} from \"./native-bill-review\";\n\nconst DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nconst DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/status-session\";\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\nexport type BillStatusData = {\n billId: string;\n state: string;\n nativeStatus: string;\n submittedAt: string | null;\n agingDays: number | null;\n updatedAt: string | null;\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n};\n\nexport type BillStatusSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillStatusSessionRequest = {\n billId: string;\n signal: AbortSignal;\n};\n\nexport type BillStatusSessionProvider = (\n request: BillStatusSessionRequest,\n) => Promise<BillStatusSession>;\n\nexport type BillStatusClientOptions = {\n billId: string;\n /** Same-origin route that mints a short-lived, bill-scoped browser session. */\n sessionEndpoint?: string;\n /** Advanced escape hatch for non-HTTP session exchange. */\n getSession?: BillStatusSessionProvider;\n apiBaseUrl?: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type BillStatusClient = {\n getStatus: (signal?: AbortSignal) => Promise<BillStatusData>;\n clearSession: () => void;\n};\n\nexport type UseBillStatusOptions = BillStatusClientOptions & {\n refreshInterval?: number;\n enabled?: boolean;\n initialData?: BillStatusData | null;\n};\n\nexport type UseBillStatusResult = {\n data: BillStatusData | null;\n error: Error | null;\n isLoading: boolean;\n isRefreshing: boolean;\n refresh: () => Promise<void>;\n};\n\nasync function responseError(\n response: Response,\n fallback: string,\n): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; error?: unknown }).detail\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillStatusSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillStatusSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The MindBill session endpoint returned an invalid response.\");\n }\n const candidate = value as {\n token?: unknown;\n expiresAt?: unknown;\n apiBaseUrl?: unknown;\n session?: unknown;\n data?: unknown;\n };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\"\n ? nested as typeof candidate\n : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The MindBill session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\"\n ? { expiresAt: session.expiresAt }\n : {}),\n ...(typeof session.apiBaseUrl === \"string\"\n ? { apiBaseUrl: session.apiBaseUrl }\n : {}),\n };\n}\n\nfunction normalizeStatus(value: unknown, billId: string): BillStatusData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"MindBill returned an invalid bill status.\");\n }\n const status = value as Partial<BillStatusData>;\n const amounts = [status.totalCharge, status.totalPaid, status.balanceDue];\n if (\n typeof status.state !== \"string\"\n || amounts.some(\n (amount) => typeof amount !== \"number\" || !Number.isFinite(amount),\n )\n ) {\n throw new Error(\"MindBill returned an invalid bill status.\");\n }\n return {\n billId: typeof status.billId === \"string\" ? status.billId : billId,\n state: status.state,\n nativeStatus: typeof status.nativeStatus === \"string\"\n ? status.nativeStatus\n : status.state,\n submittedAt: typeof status.submittedAt === \"string\"\n ? status.submittedAt\n : null,\n agingDays: typeof status.agingDays === \"number\" ? status.agingDays : null,\n updatedAt: typeof status.updatedAt === \"string\" ? status.updatedAt : null,\n totalCharge: status.totalCharge as number,\n totalPaid: status.totalPaid as number,\n balanceDue: status.balanceDue as number,\n };\n}\n\n/**\n * Browser-safe status client used by useBillStatus. It exchanges the user's\n * authenticated same-origin session for a short-lived MindBill token, then\n * reads status directly from MindBill. It never accepts a Partner API key.\n */\nexport function createBillStatusClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillStatusClientOptions): BillStatusClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") {\n throw new Error(\"A Fetch API implementation is required.\");\n }\n let session: BillStatusSession | null = null;\n let sessionRequest: Promise<BillStatusSession> | null = null;\n\n const mintSession = async (\n signal: AbortSignal,\n force = false,\n ): Promise<BillStatusSession> => {\n if (!force && isSessionFresh(session)) return session as BillStatusSession;\n if (!force && sessionRequest) return sessionRequest;\n\n const pending = getSession\n ? getSession({ billId, signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ billId }),\n signal,\n }).then(async (response) => {\n if (!response.ok) {\n throw await responseError(\n response,\n \"MindBill browser session could not be created.\",\n );\n }\n return response.json();\n });\n\n const request = Promise.resolve(pending)\n .then(normalizeSession)\n .then((nextSession) => {\n session = nextSession;\n return nextSession;\n })\n .finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const requestStatus = async (\n browserSession: BillStatusSession,\n signal: AbortSignal,\n ): Promise<Response> => {\n const baseUrl = (browserSession.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n return fetcher(`${baseUrl}/embed/api/bill-timeline`, {\n headers: { authorization: `Bearer ${browserSession.token}` },\n signal,\n });\n };\n\n return {\n clearSession() {\n session = null;\n sessionRequest = null;\n },\n async getStatus(providedSignal) {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n let response = await requestStatus(browserSession, signal);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await requestStatus(browserSession, signal);\n }\n if (!response.ok) {\n throw await responseError(response, \"Bill status could not be loaded.\");\n }\n const body = await response.json() as { data?: unknown };\n return normalizeStatus(body.data, billId);\n },\n };\n}\n\nexport function useBillStatus({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n refreshInterval = DEFAULT_REFRESH_INTERVAL,\n enabled = true,\n initialData = null,\n fetch: fetchOverride,\n}: UseBillStatusOptions): UseBillStatusResult {\n const client = useMemo(() => createBillStatusClient({\n billId,\n sessionEndpoint,\n ...(getSession ? { getSession } : {}),\n apiBaseUrl,\n ...(fetchOverride ? { fetch: fetchOverride } : {}),\n }), [apiBaseUrl, billId, fetchOverride, getSession, sessionEndpoint]);\n const [data, setData] = useState<BillStatusData | null>(initialData);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(enabled && !initialData);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const dataRef = useRef<BillStatusData | null>(initialData);\n const initialDataRef = useRef<BillStatusData | null>(initialData);\n initialDataRef.current = initialData;\n const activeControllerRef = useRef<AbortController | null>(null);\n const requestSequence = useRef(0);\n\n useEffect(() => {\n const seed = initialDataRef.current;\n dataRef.current = seed;\n setData(seed);\n setError(null);\n setIsLoading(enabled && !seed);\n activeControllerRef.current?.abort();\n return () => activeControllerRef.current?.abort();\n }, [client, enabled]);\n\n const load = useCallback(async () => {\n if (!enabled || !billId) return;\n const sequence = ++requestSequence.current;\n activeControllerRef.current?.abort();\n const controller = new AbortController();\n activeControllerRef.current = controller;\n if (dataRef.current) setIsRefreshing(true);\n else setIsLoading(true);\n setError(null);\n\n try {\n const nextData = await client.getStatus(controller.signal);\n if (!controller.signal.aborted && sequence === requestSequence.current) {\n dataRef.current = nextData;\n setData(nextData);\n }\n } catch (cause) {\n if (controller.signal.aborted) return;\n if (sequence === requestSequence.current) {\n setError(\n cause instanceof Error\n ? cause\n : new Error(\"Bill status could not be loaded.\"),\n );\n }\n } finally {\n if (activeControllerRef.current === controller) {\n activeControllerRef.current = null;\n }\n if (!controller.signal.aborted && sequence === requestSequence.current) {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }\n }, [billId, client, enabled]);\n\n useEffect(() => {\n if (enabled) void load();\n }, [enabled, load]);\n\n useEffect(() => {\n if (!enabled || refreshInterval <= 0) return;\n const timer = window.setInterval(() => void load(), refreshInterval);\n const onFocus = () => void load();\n const onVisibility = () => {\n if (document.visibilityState === \"visible\") void load();\n };\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.clearInterval(timer);\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [enabled, load, refreshInterval]);\n\n return { data, error, isLoading, isRefreshing, refresh: load };\n}\n\nexport type ConnectedBillStatusProps = UseBillStatusOptions & {\n actions?: BillStatusSummaryProps[\"actions\"];\n appearance?: BillStatusSummaryProps[\"appearance\"];\n className?: string;\n style?: BillStatusSummaryProps[\"style\"];\n loadingFallback?: ReactNode;\n errorFallback?: (error: Error, retry: () => Promise<void>) => ReactNode;\n};\n\nexport function ConnectedBillStatus({\n actions,\n appearance,\n className,\n style,\n loadingFallback,\n errorFallback,\n ...options\n}: ConnectedBillStatusProps): ReactElement | null {\n const status = useBillStatus(options);\n if (status.isLoading && !status.data) {\n return <>{loadingFallback ?? <div role=\"status\">Loading bill status…</div>}</>;\n }\n if (status.error && !status.data) {\n return <>{errorFallback?.(status.error, status.refresh) ?? (\n <div role=\"alert\">\n {status.error.message}{\" \"}\n <button type=\"button\" onClick={() => void status.refresh()}>Retry</button>\n </div>\n )}</>;\n }\n if (!status.data) return null;\n return <BillStatusSummary\n status={status.data.state}\n submittedAt={status.data.submittedAt}\n agingDays={status.data.agingDays}\n updatedAt={status.data.updatedAt}\n totalCharge={status.data.totalCharge}\n totalPaid={status.data.totalPaid}\n balanceDue={status.data.balanceDue}\n {...(actions ? { actions } : {})}\n {...(appearance ? { appearance } : {})}\n {...(className ? { className } : {})}\n {...(style ? { style } : {})}\n />;\n}\n","\"use client\";\n\nimport type { MindBillAppearance } from \"@mindbill/embed\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n BillReviewForm,\n BillStatusSummary,\n type BillReviewAttachment,\n type BillReviewData,\n type BillReviewDocumentType,\n type BillReviewSaveInput,\n type BillSubmissionRoute,\n} from \"./native-bill-review\";\n\nconst DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nconst DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/bill-session\";\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\nexport type BillLifecycleActionId =\n | \"edit_and_submit\"\n | \"correct_and_resubmit\"\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n billId: string;\n component: \"bill-review\";\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BillLifecycleClientOptions = {\n billId: string;\n /** Same-origin server route that mints a short-lived, bill-scoped session. */\n sessionEndpoint?: string | undefined;\n /** Advanced escape hatch for a custom session exchange. */\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\nexport type BillLifecycleClient = {\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;\n submitBill: (\n input: BillReviewSaveInput,\n route: BillSubmissionRoute,\n ) => Promise<BillLifecycleData>;\n addAttachment: (\n file: File,\n documentType: BillReviewDocumentType,\n description?: string,\n ) => Promise<BillLifecycleData>;\n removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (\n input: SubmitSecondReviewInput,\n ) => Promise<BillLifecycleData>;\n startCorrection: () => Promise<{\n replacementBillId: string;\n data: BillLifecycleData;\n }>;\n clearSession: () => void;\n};\n\nexport type UseBillLifecycleOptions = BillLifecycleClientOptions & {\n refreshInterval?: number;\n enabled?: boolean;\n initialData?: BillLifecycleData | null;\n onBillIdChange?: (\n billId: string,\n previousBillId: string,\n ) => void | Promise<void>;\n};\n\nexport type UseBillLifecycleResult = {\n billId: string;\n data: BillLifecycleData | null;\n error: Error | null;\n isLoading: boolean;\n isRefreshing: boolean;\n isMutating: boolean;\n refresh: () => Promise<void>;\n saveReview: BillLifecycleClient[\"saveReview\"];\n submitBill: BillLifecycleClient[\"submitBill\"];\n addAttachment: BillLifecycleClient[\"addAttachment\"];\n removeAttachment: BillLifecycleClient[\"removeAttachment\"];\n openAttachment: (attachment: BillReviewAttachment) => Promise<void>;\n openEor: (document: BillEorDocument) => Promise<void>;\n closeBill: BillLifecycleClient[\"closeBill\"];\n postPayment: BillLifecycleClient[\"postPayment\"];\n submitSecondReview: BillLifecycleClient[\"submitSecondReview\"];\n startCorrection: () => Promise<BillLifecycleData>;\n};\n\nasync function responseError(\n response: Response,\n fallback: string,\n): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The MindBill session endpoint returned an invalid response.\");\n }\n const candidate = value as {\n token?: unknown;\n expiresAt?: unknown;\n apiBaseUrl?: unknown;\n session?: unknown;\n data?: unknown;\n };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\"\n ? nested as typeof candidate\n : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\n \"The MindBill session endpoint did not return a browser session token.\",\n );\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\"\n ? { expiresAt: session.expiresAt }\n : {}),\n ...(typeof session.apiBaseUrl === \"string\"\n ? { apiBaseUrl: session.apiBaseUrl }\n : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"MindBill returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (\n !data.bill\n || !data.patient\n || !data.injury\n || !data.lifecycle\n || !Array.isArray(data.lifecycle.actions)\n || !Array.isArray(data.eors)\n ) {\n throw new Error(\"MindBill returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Browser-safe client for the complete bill lifecycle. The only long-lived\n * secret remains on the partner server; this client uses a short-lived,\n * origin-bound session scoped to one bill.\n */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") {\n throw new Error(\"A Fetch API implementation is required.\");\n }\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n\n const mintSession = async (\n signal: AbortSignal,\n force = false,\n ): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ billId, component: \"bill-review\", signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ billId, component: \"bill-review\" }),\n signal,\n }).then(async (response) => {\n if (!response.ok) {\n throw await responseError(\n response,\n \"MindBill browser session could not be created.\",\n );\n }\n return response.json();\n });\n const request = Promise.resolve(pending)\n .then(normalizeSession)\n .then((nextSession) => {\n session = nextSession;\n return nextSession;\n })\n .finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (\n path: string,\n init: RequestInit = {},\n providedSignal?: AbortSignal,\n ): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(\"/embed/api/bill-lifecycle\", {}, signal);\n if (!response.ok) {\n throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n }\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const mutation = async (\n path: string,\n init: RequestInit,\n fallback: string,\n ) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n\n const action = async (\n input: Record<string, unknown>,\n fallback: string,\n ): Promise<BillLifecycleData> => {\n const response = await mutation(\n \"/embed/api/bill-lifecycle/actions\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n },\n fallback,\n );\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const saveReview = async (\n input: BillReviewSaveInput,\n ): Promise<BillLifecycleData> => {\n await mutation(\n \"/embed/api/bill-review\",\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n },\n \"Bill changes could not be saved.\",\n );\n return loadLifecycle();\n };\n\n return {\n clearSession() {\n session = null;\n sessionRequest = null;\n },\n getLifecycle: loadLifecycle,\n saveReview,\n async submitBill(input, route) {\n await saveReview(input);\n await mutation(\n \"/embed/api/bill-review/submit\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ route }),\n },\n \"Bill could not be submitted.\",\n );\n return loadLifecycle();\n },\n async addAttachment(file, documentType, description) {\n const body = new FormData();\n body.set(\"file\", file);\n body.set(\"documentType\", documentType);\n if (description) body.set(\"description\", description);\n await mutation(\n \"/embed/api/bill-review/attachments\",\n { method: \"POST\", body },\n \"Document could not be attached.\",\n );\n return loadLifecycle();\n },\n async removeAttachment(attachmentId) {\n await mutation(\n `/embed/api/bill-review/attachments/${encodeURIComponent(attachmentId)}`,\n { method: \"DELETE\" },\n \"Document could not be removed.\",\n );\n return loadLifecycle();\n },\n async getAttachment(attachmentId) {\n const response = await request(\n `/embed/api/bill-review/attachments/${encodeURIComponent(attachmentId)}`,\n );\n if (!response.ok) {\n throw await responseError(response, \"Document could not be opened.\");\n }\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(\n `/embed/api/bill-lifecycle/eor/${encodeURIComponent(documentId)}`,\n );\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n closeBill(input) {\n return action({ action: \"close\", ...input }, \"Bill could not be closed.\");\n },\n postPayment(input) {\n return action(\n { action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" },\n \"Payment could not be posted.\",\n );\n },\n submitSecondReview(input) {\n return action(\n { action: \"second_review\", ...input },\n \"Second Review could not be submitted.\",\n );\n },\n async startCorrection() {\n const response = await mutation(\n \"/embed/api/bill-lifecycle/actions\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"start_correction\" }),\n },\n \"Correction draft could not be created.\",\n );\n const body = await response.json() as {\n replacementBillId?: unknown;\n data?: unknown;\n };\n if (typeof body.replacementBillId !== \"string\") {\n throw new Error(\"MindBill did not return the correction bill ID.\");\n }\n return {\n replacementBillId: body.replacementBillId,\n data: normalizeLifecycle(body.data),\n };\n },\n };\n}\n\nfunction openPdf(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.download = filename;\n link.click();\n window.setTimeout(() => URL.revokeObjectURL(url), 60_000);\n}\n\nexport function useBillLifecycle({\n billId: providedBillId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n refreshInterval = DEFAULT_REFRESH_INTERVAL,\n enabled = true,\n initialData = null,\n onBillIdChange,\n fetch: fetchOverride,\n}: UseBillLifecycleOptions): UseBillLifecycleResult {\n const [billId, setBillId] = useState(providedBillId);\n const [data, setData] = useState<BillLifecycleData | null>(initialData);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(enabled && !initialData);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [isMutating, setIsMutating] = useState(false);\n const mounted = useRef(true);\n\n useEffect(() => {\n setBillId(providedBillId);\n setData(initialData);\n setError(null);\n }, [initialData, providedBillId]);\n\n const client = useMemo(() => createBillLifecycleClient({\n billId,\n sessionEndpoint,\n getSession,\n apiBaseUrl,\n fetch: fetchOverride,\n }), [apiBaseUrl, billId, fetchOverride, getSession, sessionEndpoint]);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n client.clearSession();\n };\n }, [client]);\n\n const refresh = useCallback(async () => {\n if (!enabled) return;\n setIsRefreshing(true);\n try {\n const next = await client.getLifecycle();\n if (!mounted.current) return;\n setData(next);\n setError(null);\n } catch (cause) {\n if (!mounted.current) return;\n setError(cause instanceof Error ? cause : new Error(\"Bill could not be loaded.\"));\n } finally {\n if (mounted.current) {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }\n }, [client, enabled]);\n\n useEffect(() => {\n if (!enabled) return;\n void refresh();\n const interval = refreshInterval > 0\n ? window.setInterval(() => void refresh(), refreshInterval)\n : null;\n const onFocus = () => void refresh();\n window.addEventListener(\"focus\", onFocus);\n return () => {\n if (interval) window.clearInterval(interval);\n window.removeEventListener(\"focus\", onFocus);\n };\n }, [enabled, refresh, refreshInterval]);\n\n const mutate = useCallback(async <T extends BillLifecycleData,>(\n task: () => Promise<T>,\n ): Promise<T> => {\n setIsMutating(true);\n setError(null);\n try {\n const next = await task();\n if (mounted.current) setData(next);\n return next;\n } catch (cause) {\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"MindBill could not complete this request.\");\n if (mounted.current) setError(nextError);\n throw nextError;\n } finally {\n if (mounted.current) setIsMutating(false);\n }\n }, []);\n\n const saveReview = useCallback(\n (input: BillReviewSaveInput) => mutate(() => client.saveReview(input)),\n [client, mutate],\n );\n const submitBill = useCallback(\n (input: BillReviewSaveInput, route: BillSubmissionRoute) =>\n mutate(() => client.submitBill(input, route)),\n [client, mutate],\n );\n const addAttachment = useCallback(\n (file: File, type: BillReviewDocumentType, description?: string) =>\n mutate(() => client.addAttachment(file, type, description)),\n [client, mutate],\n );\n const removeAttachment = useCallback(\n (attachmentId: string) => mutate(() => client.removeAttachment(attachmentId)),\n [client, mutate],\n );\n const closeBill = useCallback(\n (input: CloseBillInput) => mutate(() => client.closeBill(input)),\n [client, mutate],\n );\n const postPayment = useCallback(\n (input: PostBillPaymentInput) => mutate(() => client.postPayment(input)),\n [client, mutate],\n );\n const submitSecondReview = useCallback(\n (input: SubmitSecondReviewInput) =>\n mutate(() => client.submitSecondReview(input)),\n [client, mutate],\n );\n const startCorrection = useCallback(async () => {\n setIsMutating(true);\n setError(null);\n try {\n const result = await client.startCorrection();\n const previousBillId = billId;\n await onBillIdChange?.(result.replacementBillId, previousBillId);\n setBillId(result.replacementBillId);\n setData(result.data);\n return result.data;\n } catch (cause) {\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"Correction draft could not be created.\");\n setError(nextError);\n throw nextError;\n } finally {\n setIsMutating(false);\n }\n }, [billId, client, onBillIdChange]);\n const openAttachment = useCallback(async (attachment: BillReviewAttachment) => {\n openPdf(await client.getAttachment(attachment.id), attachment.filename);\n }, [client]);\n const openEor = useCallback(async (document: BillEorDocument) => {\n openPdf(await client.getEor(document.id), document.filename);\n }, [client]);\n\n return {\n billId,\n data,\n error,\n isLoading,\n isRefreshing,\n isMutating,\n refresh,\n saveReview,\n submitBill,\n addAttachment,\n removeAttachment,\n openAttachment,\n openEor,\n closeBill,\n postPayment,\n submitSecondReview,\n startCorrection,\n };\n}\n\nexport type ConnectedBillLifecycleProps = UseBillLifecycleOptions & {\n appearance?: MindBillAppearance;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: (error: Error, retry: () => Promise<void>) => ReactNode;\n onChanged?: (data: BillLifecycleData) => void;\n};\n\ntype Panel = \"\" | \"correction\" | \"second_review\" | \"payment\" | \"close\";\n\nfunction dateInputValue(): string {\n const now = new Date();\n const offset = now.getTimezoneOffset() * 60_000;\n return new Date(now.getTime() - offset).toISOString().slice(0, 10);\n}\n\nfunction appearanceStyle(\n appearance: MindBillAppearance | undefined,\n style: CSSProperties | undefined,\n): CSSProperties {\n return {\n ...(appearance?.accentColor ? { \"--mb-accent\": appearance.accentColor } : {}),\n ...(appearance?.textColor ? { \"--mb-text\": appearance.textColor } : {}),\n ...(appearance?.mutedColor ? { \"--mb-muted\": appearance.mutedColor } : {}),\n ...(appearance?.borderColor ? { \"--mb-border\": appearance.borderColor } : {}),\n ...(appearance?.backgroundColor ? { \"--mb-soft\": appearance.backgroundColor } : {}),\n ...(appearance?.surfaceColor ? { \"--mb-surface\": appearance.surfaceColor } : {}),\n ...(appearance?.fontFamily ? { \"--mb-font\": appearance.fontFamily } : {}),\n ...style,\n } as CSSProperties;\n}\n\nfunction SupportingDocumentControl({\n disabled,\n onAdd,\n}: {\n disabled: boolean;\n onAdd: (\n file: File,\n type: BillReviewDocumentType,\n description?: string,\n ) => Promise<unknown>;\n}): ReactElement {\n const [file, setFile] = useState<File | null>(null);\n const [type, setType] = useState<BillReviewDocumentType>(\"appeal\");\n const [busy, setBusy] = useState(false);\n return <div className=\"mb-lifecycle-upload\">\n <select aria-label=\"Supporting document type\" value={type} disabled={disabled || busy} onChange={(event) => setType(event.target.value as BillReviewDocumentType)}>\n <option value=\"appeal\">Second Review support</option>\n <option value=\"final_report\">Final report</option>\n <option value=\"proof_of_service\">Proof of service</option>\n <option value=\"letter_of_attestation\">Letter of attestation</option>\n <option value=\"form_122\">DWC Form 122</option>\n <option value=\"w9\">W-9</option>\n <option value=\"other\">Other supporting document</option>\n </select>\n <input aria-label=\"Choose supporting PDF\" type=\"file\" accept=\"application/pdf,.pdf\" disabled={disabled || busy} onChange={(event) => setFile(event.target.files?.[0] ?? null)} />\n <button type=\"button\" className=\"mb-lifecycle-button secondary\" disabled={disabled || busy || !file} onClick={() => {\n if (!file) return;\n setBusy(true);\n void onAdd(file, type)\n .then(() => setFile(null))\n .catch(() => undefined)\n .finally(() => setBusy(false));\n }}>{busy ? \"Attaching…\" : \"Attach PDF\"}</button>\n </div>;\n}\n\nexport function ConnectedBillLifecycle({\n appearance,\n className,\n style,\n loadingFallback,\n errorFallback,\n onChanged,\n ...options\n}: ConnectedBillLifecycleProps): ReactElement {\n const lifecycle = useBillLifecycle(options);\n const { data } = lifecycle;\n const [panel, setPanel] = useState<Panel>(\"\");\n const [notice, setNotice] = useState(\"\");\n const [closeReason, setCloseReason] = useState(\"\");\n const [payment, setPayment] = useState<PostBillPaymentInput>({\n amount: 0,\n method: \"check\",\n checkNumber: \"\",\n depositDate: dateInputValue(),\n note: \"\",\n });\n const [review, setReview] = useState<SubmitSecondReviewInput>({\n reason: \"\",\n payerClaimControlNumber: \"\",\n disputedAmount: undefined,\n attachmentIds: [],\n route: \"ebill\",\n });\n const lastData = useRef<BillLifecycleData | null>(null);\n\n useEffect(() => {\n if (!data || data === lastData.current) return;\n lastData.current = data;\n onChanged?.(data);\n setPayment((current) => ({\n ...current,\n amount: current.amount > 0 ? current.amount : data.bill.balanceDue,\n }));\n setReview((current) => ({\n ...current,\n disputedAmount: current.disputedAmount ?? data.bill.balanceDue,\n attachmentIds: current.attachmentIds.length\n ? current.attachmentIds.filter((id) => data.bill.attachments.some((doc) => doc.id === id))\n : data.bill.attachments.map((doc) => doc.id),\n }));\n }, [data, onChanged]);\n\n if (lifecycle.isLoading && !data) {\n return <>{loadingFallback ?? <div className=\"mb-lifecycle-loading\">Loading billing…</div>}</>;\n }\n if (!data) {\n const error = lifecycle.error ?? new Error(\"Bill could not be loaded.\");\n return <>{errorFallback?.(error, lifecycle.refresh) ?? <div className=\"mb-lifecycle-error\" role=\"alert\"><strong>Billing is unavailable.</strong><span>{error.message}</span><button type=\"button\" onClick={() => void lifecycle.refresh()}>Try again</button></div>}</>;\n }\n\n const actionMap = new Map(data.lifecycle.actions.map((action) => [action.id, action]));\n const has = (id: BillLifecycleActionId) => actionMap.get(id);\n const selectPanel = (next: Panel) => {\n setNotice(\"\");\n setPanel((current) => current === next ? \"\" : next);\n };\n const complete = async (message: string, task: () => Promise<unknown>) => {\n setNotice(\"\");\n try {\n await task();\n setPanel(\"\");\n setNotice(message);\n } catch {\n // The hook keeps the actionable error visible in this component.\n }\n };\n const actionButtons = data.lifecycle.actions\n .filter((action) => action.id !== \"edit_and_submit\" && action.id !== \"view_eor\" && action.id !== \"independent_bill_review\")\n .map((action) => ({\n ...action,\n onClick: () => {\n if (!action.enabled) return;\n if (action.id === \"correct_and_resubmit\") selectPanel(\"correction\");\n if (action.id === \"second_review\") selectPanel(\"second_review\");\n if (action.id === \"post_payment\") selectPanel(\"payment\");\n if (action.id === \"close\") selectPanel(\"close\");\n },\n disabled: !action.enabled || lifecycle.isMutating,\n }));\n\n const canEditAndSubmit = Boolean(has(\"edit_and_submit\"));\n\n return <section className={[\"mb-connected-lifecycle\", className].filter(Boolean).join(\" \")} style={appearanceStyle(appearance, style)}>\n <style>{CONNECTED_LIFECYCLE_STYLES}</style>\n {canEditAndSubmit\n ? <BillReviewForm\n data={data}\n {...(appearance ? { appearance } : {})}\n disabled={lifecycle.isMutating}\n onSave={lifecycle.saveReview}\n onSubmit={async (input, route) => { await complete(\"Bill submitted.\", () => lifecycle.submitBill(input, route)); }}\n onAddAttachment={async (file, type, description) => { await lifecycle.addAttachment(file, type, description); }}\n onRemoveAttachment={async (attachmentId) => { await lifecycle.removeAttachment(attachmentId); }}\n onOpenAttachment={(attachment) => void lifecycle.openAttachment(attachment).catch(() => undefined)}\n />\n : <BillStatusSummary\n status={data.lifecycle.state}\n submittedAt={data.lifecycle.submittedAt ?? null}\n agingDays={data.lifecycle.agingDays ?? null}\n updatedAt={data.lifecycle.updatedAt ?? null}\n totalCharge={data.bill.totalCharge}\n totalPaid={data.bill.totalPaid}\n balanceDue={data.bill.balanceDue}\n actions={actionButtons}\n {...(appearance ? { appearance } : {})}\n />}\n\n <div className=\"mb-lifecycle-toolbar\">\n <div>\n <strong>Bill #{data.bill.billNumber}</strong>\n <span>{lifecycle.isRefreshing ? \"Refreshing…\" : \"MindBill manages this lifecycle.\"}</span>\n </div>\n <div className=\"mb-lifecycle-toolbar-actions\">\n {has(\"view_eor\") ? <button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => document.getElementById(`mb-eors-${data.bill.id}`)?.scrollIntoView({ behavior: \"smooth\", block: \"center\" })}>View EOR</button> : null}\n {canEditAndSubmit && has(\"close\") ? <button type=\"button\" className=\"mb-lifecycle-button quiet\" onClick={() => selectPanel(\"close\")}>Close bill</button> : null}\n </div>\n </div>\n\n {data.eors.length ? <section className=\"mb-lifecycle-card\" id={`mb-eors-${data.bill.id}`}>\n <header><div><h3>Explanation of Review</h3><p>Review the payer response and original PDF before posting payment.</p></div><span>{data.eors.length} PDF{data.eors.length === 1 ? \"\" : \"s\"}</span></header>\n <ul className=\"mb-lifecycle-documents\">{data.eors.map((eor) => <li key={eor.id}><div><strong>{eor.filename}</strong><span>{eor.description || `Added ${new Date(eor.addedAt).toLocaleDateString()}`}</span></div><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => void lifecycle.openEor(eor).catch(() => undefined)}>View PDF</button></li>)}</ul>\n </section> : null}\n\n {has(\"independent_bill_review\") ? <div className=\"mb-lifecycle-info\"><strong>{has(\"independent_bill_review\")?.label}</strong><span>{has(\"independent_bill_review\")?.reason}</span></div> : null}\n\n {panel === \"correction\" ? <section className=\"mb-lifecycle-panel\">\n <div><h3>Correct and resubmit</h3><p>MindBill will create a new correction draft and preserve this rejected bill in history. Review the copied values before submitting.</p></div>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating} onClick={() => void complete(\"Correction draft created.\", lifecycle.startCorrection)}>{lifecycle.isMutating ? \"Creating…\" : \"Create correction draft\"}</button></div>\n </section> : null}\n\n {panel === \"second_review\" ? <section className=\"mb-lifecycle-panel wide\">\n <div><h3>Submit Second Review</h3><p>State why payment is disputed, confirm the payer control number, and choose the supporting documents MindBill should send.</p></div>\n <div className=\"mb-lifecycle-fields two\">\n <label><span>Reason for Second Review</span><textarea required value={review.reason} onChange={(event) => setReview((current) => ({ ...current, reason: event.target.value }))} /></label>\n <div className=\"mb-lifecycle-fields\">\n <label><span>Payer claim control number</span><input required value={review.payerClaimControlNumber} onChange={(event) => setReview((current) => ({ ...current, payerClaimControlNumber: event.target.value }))} /></label>\n <label><span>Disputed amount</span><input type=\"number\" min=\"0.01\" step=\"0.01\" value={review.disputedAmount ?? \"\"} onChange={(event) => setReview((current) => ({ ...current, disputedAmount: event.target.value ? Number(event.target.value) : undefined }))} /></label>\n <label><span>Send via</span><select value={review.route} onChange={(event) => setReview((current) => ({ ...current, route: event.target.value as BillSubmissionRoute }))}><option value=\"ebill\">E-bill</option><option value=\"fax\">Fax</option><option value=\"mail\">Mail</option><option value=\"email\">Email</option></select></label>\n </div>\n </div>\n <fieldset className=\"mb-lifecycle-packet\"><legend>Supporting packet</legend>{data.bill.attachments.map((attachment) => <label key={attachment.id}><input type=\"checkbox\" checked={review.attachmentIds.includes(attachment.id)} onChange={(event) => setReview((current) => ({ ...current, attachmentIds: event.target.checked ? [...current.attachmentIds, attachment.id] : current.attachmentIds.filter((id) => id !== attachment.id) }))} /><span><strong>{attachment.filename}</strong><small>{attachment.description || attachment.documentType}</small></span><button type=\"button\" onClick={() => void lifecycle.openAttachment(attachment).catch(() => undefined)}>View</button><button type=\"button\" aria-label={`Remove ${attachment.filename}`} onClick={() => void lifecycle.removeAttachment(attachment.id).catch(() => undefined)}>×</button></label>)}</fieldset>\n <SupportingDocumentControl disabled={lifecycle.isMutating} onAdd={async (file, type, description) => {\n const next = await lifecycle.addAttachment(file, type, description);\n setReview((current) => ({\n ...current,\n attachmentIds: Array.from(new Set([\n ...current.attachmentIds,\n ...next.bill.attachments.map((attachment) => attachment.id),\n ])),\n }));\n }} />\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating || !review.reason.trim() || !review.payerClaimControlNumber.trim()} onClick={() => void complete(\"Second Review submitted.\", () => lifecycle.submitSecondReview(review))}>{lifecycle.isMutating ? \"Submitting…\" : \"Submit Second Review\"}</button></div>\n </section> : null}\n\n {panel === \"payment\" ? <section className=\"mb-lifecycle-panel\">\n <div><h3>Post payment</h3><p>Record funds shown on the EOR. MindBill updates the balance and closes the bill automatically when configured.</p></div>\n <div className=\"mb-lifecycle-fields two\">\n <label><span>Amount</span><input type=\"number\" min=\"0.01\" max={data.bill.balanceDue} step=\"0.01\" required value={payment.amount || \"\"} onChange={(event) => setPayment((current) => ({ ...current, amount: Number(event.target.value) }))} /></label>\n <label><span>Method</span><select value={payment.method} onChange={(event) => setPayment((current) => ({ ...current, method: event.target.value as \"check\" | \"eft\" }))}><option value=\"check\">Check</option><option value=\"eft\">EFT</option></select></label>\n <label><span>{payment.method === \"check\" ? \"Check number\" : \"EFT reference\"}</span><input value={payment.checkNumber} onChange={(event) => setPayment((current) => ({ ...current, checkNumber: event.target.value }))} /></label>\n <label><span>Deposit date</span><input type=\"date\" required value={payment.depositDate} onChange={(event) => setPayment((current) => ({ ...current, depositDate: event.target.value }))} /></label>\n <label className=\"full\"><span>Note <small>Optional</small></span><input value={payment.note} onChange={(event) => setPayment((current) => ({ ...current, note: event.target.value }))} /></label>\n </div>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating || payment.amount <= 0 || payment.amount > data.bill.balanceDue || !payment.depositDate} onClick={() => void complete(\"Payment posted.\", () => lifecycle.postPayment(payment))}>{lifecycle.isMutating ? \"Posting…\" : \"Post payment\"}</button></div>\n </section> : null}\n\n {panel === \"close\" ? <section className=\"mb-lifecycle-panel danger\">\n <div><h3>Close bill</h3><p>Closing removes this bill from active A/R. Any remaining balance will be written off and the original lifecycle is preserved.</p></div>\n <label><span>Reason for closing</span><textarea required value={closeReason} onChange={(event) => setCloseReason(event.target.value)} /></label>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button danger\" disabled={lifecycle.isMutating || !closeReason.trim()} onClick={() => void complete(\"Bill closed.\", () => lifecycle.closeBill({ reason: closeReason }))}>{lifecycle.isMutating ? \"Closing…\" : \"Close bill\"}</button></div>\n </section> : null}\n\n {notice ? <div className=\"mb-lifecycle-message success\" role=\"status\">{notice}</div> : null}\n {lifecycle.error ? <div className=\"mb-lifecycle-message error\" role=\"alert\">{lifecycle.error.message}</div> : null}\n </section>;\n}\n\nconst CONNECTED_LIFECYCLE_STYLES = `\n.mb-connected-lifecycle{--mb-accent:#238dbd;--mb-text:#203743;--mb-muted:#657982;--mb-border:#dbe6ea;--mb-soft:#f3f8fa;--mb-surface:#fff;display:grid;gap:14px;color:var(--mb-text);font:14px/1.45 var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}.mb-connected-lifecycle *{box-sizing:border-box}.mb-lifecycle-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 14px;border:1px solid var(--mb-border);border-radius:10px;background:var(--mb-surface)}.mb-lifecycle-toolbar>div:first-child{display:grid;gap:2px}.mb-lifecycle-toolbar span,.mb-lifecycle-card p,.mb-lifecycle-panel p,.mb-lifecycle-info span{color:var(--mb-muted)}.mb-lifecycle-toolbar-actions,.mb-lifecycle-panel-actions{display:flex;justify-content:flex-end;gap:8px}.mb-lifecycle-button{min-height:38px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);cursor:pointer;font:inherit;font-weight:750;padding:8px 13px}.mb-lifecycle-button.primary{border-color:var(--mb-accent);background:var(--mb-accent);color:#fff}.mb-lifecycle-button.quiet{border-color:transparent;background:transparent;color:var(--mb-muted)}.mb-lifecycle-button.danger{border-color:#b63d35;background:#b63d35;color:#fff}.mb-lifecycle-button:disabled{cursor:not-allowed;opacity:.5}.mb-lifecycle-card,.mb-lifecycle-panel{padding:18px;border:1px solid var(--mb-border);border-radius:12px;background:var(--mb-surface)}.mb-lifecycle-card header{display:flex;align-items:start;justify-content:space-between;gap:16px}.mb-lifecycle-card h3,.mb-lifecycle-panel h3{margin:0;font-size:18px}.mb-lifecycle-card p,.mb-lifecycle-panel p{margin:3px 0 0}.mb-lifecycle-card header>span{padding:5px 8px;border-radius:999px;background:var(--mb-soft);color:var(--mb-muted);font-size:11px;font-weight:800;text-transform:uppercase}.mb-lifecycle-documents{list-style:none;margin:12px 0 0;padding:0}.mb-lifecycle-documents li{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:11px 0;border-top:1px solid var(--mb-border)}.mb-lifecycle-documents li>div{display:grid}.mb-lifecycle-documents span{color:var(--mb-muted);font-size:12px}.mb-lifecycle-info{display:grid;gap:3px;padding:13px 15px;border:1px solid #cddfe5;border-radius:10px;background:var(--mb-soft)}.mb-lifecycle-panel{display:grid;gap:16px;box-shadow:0 14px 38px rgba(30,56,68,.08)}.mb-lifecycle-panel.danger{border-color:#ecc5c2}.mb-lifecycle-panel label{display:grid;gap:6px;font-size:12px;font-weight:750}.mb-lifecycle-panel label small{color:var(--mb-muted);font-size:inherit;font-weight:500}.mb-lifecycle-panel input,.mb-lifecycle-panel select,.mb-lifecycle-panel textarea,.mb-lifecycle-upload input,.mb-lifecycle-upload select{width:100%;min-height:42px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);font:inherit;padding:9px 11px}.mb-lifecycle-panel textarea{min-height:100px;resize:vertical}.mb-lifecycle-fields{display:grid;gap:12px}.mb-lifecycle-fields.two{grid-template-columns:repeat(2,minmax(0,1fr))}.mb-lifecycle-fields .full{grid-column:1/-1}.mb-lifecycle-packet{display:grid;gap:0;margin:0;padding:0;border:0}.mb-lifecycle-packet legend{margin-bottom:7px;font-size:12px;font-weight:800}.mb-lifecycle-packet>label{display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:10px;padding:10px 2px;border-top:1px solid var(--mb-border)}.mb-lifecycle-packet>label>input{width:16px;min-height:16px}.mb-lifecycle-packet>label>span{display:grid}.mb-lifecycle-packet button{border:0;background:transparent;color:var(--mb-accent);cursor:pointer;font:inherit}.mb-lifecycle-upload{display:grid;grid-template-columns:220px 1fr auto;align-items:end;gap:10px;padding:12px;border-radius:9px;background:var(--mb-soft)}.mb-lifecycle-message,.mb-lifecycle-error,.mb-lifecycle-loading{padding:12px 14px;border-radius:9px}.mb-lifecycle-message.success{background:#edf9f2;color:#217449}.mb-lifecycle-message.error,.mb-lifecycle-error{background:#fff0ef;color:#9d3029}.mb-lifecycle-error{display:flex;align-items:center;gap:12px}.mb-lifecycle-error span{flex:1}.mb-lifecycle-error button{border:1px solid currentColor;border-radius:7px;background:transparent;color:inherit;padding:7px 10px}@media(max-width:760px){.mb-lifecycle-toolbar,.mb-lifecycle-card header{align-items:stretch;flex-direction:column}.mb-lifecycle-toolbar-actions,.mb-lifecycle-panel-actions{justify-content:start}.mb-lifecycle-fields.two,.mb-lifecycle-upload{grid-template-columns:1fr}.mb-lifecycle-documents li{align-items:start}.mb-lifecycle-packet>label{grid-template-columns:auto 1fr auto}}\n`;\n"],"mappings":"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","names":["useEffect","useRef","useEffect","useMemo","useState","jsx","jsxs","useMemo","useState","useEffect","useCallback","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","DEFAULT_API_BASE_URL","DEFAULT_SESSION_ENDPOINT","DEFAULT_REFRESH_INTERVAL","responseError","isSessionFresh","normalizeSession","request","useState","useRef","useEffect","useMemo","useCallback","document","appearanceStyle","useRef","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/native-bill-review.tsx","../src/connected-bill-status.tsx","../src/connected-bill-lifecycle.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@mindbill/embed\";\nimport type { CSSProperties, ReactElement } from \"react\";\nimport { createElement, useEffect, useRef } from \"react\";\nimport type {\n MindBillAppearance,\n MindBillErrorDetail,\n MindBillEventDetail,\n} from \"@mindbill/embed\";\n\nexport type MindBillWidgetProps = {\n sessionToken: string;\n embedUrl: string;\n appearance?: MindBillAppearance;\n className?: string;\n style?: CSSProperties;\n onMindBill?: (event: CustomEvent<MindBillEventDetail>) => void;\n onMindBillError?: (event: CustomEvent<MindBillErrorDetail>) => void;\n};\n\nfunction widget(tagName: string, props: MindBillWidgetProps): ReactElement {\n const ref = useRef<HTMLElement | null>(null);\n const { onMindBill, onMindBillError } = props;\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const handleEvent = (event: Event) =>\n onMindBill?.(event as CustomEvent<MindBillEventDetail>);\n const handleError = (event: Event) =>\n onMindBillError?.(event as CustomEvent<MindBillErrorDetail>);\n element.addEventListener(\"mindbill\", handleEvent);\n element.addEventListener(\"mindbill-error\", handleError);\n return () => {\n element.removeEventListener(\"mindbill\", handleEvent);\n element.removeEventListener(\"mindbill-error\", handleError);\n };\n }, [onMindBill, onMindBillError]);\n\n return createElement(tagName, {\n ref,\n \"session-token\": props.sessionToken,\n \"embed-url\": props.embedUrl,\n theme: props.appearance?.theme,\n \"accent-color\": props.appearance?.accentColor,\n \"background-color\": props.appearance?.backgroundColor,\n \"surface-color\": props.appearance?.surfaceColor,\n \"text-color\": props.appearance?.textColor,\n \"muted-color\": props.appearance?.mutedColor,\n \"border-color\": props.appearance?.borderColor,\n \"font-family\": props.appearance?.fontFamily,\n \"border-radius\": props.appearance?.borderRadius,\n locale: props.appearance?.locale,\n class: props.className,\n style: props.style,\n });\n}\n\nexport function MindBillBillTimeline(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-bill-timeline\", props);\n}\nexport function MindBillBillReview(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-bill-review\", props);\n}\nexport function MindBillBillFromReport(\n props: MindBillWidgetProps,\n): ReactElement {\n return widget(\"mindbill-bill-from-report\", props);\n}\nexport function MindBillCollections(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-collections\", props);\n}\nexport function MindBillOnboarding(props: MindBillWidgetProps): ReactElement {\n return widget(\"mindbill-onboarding\", props);\n}\n\nexport const HostedBillTimeline = MindBillBillTimeline;\nexport const HostedBillReview = MindBillBillReview;\nexport const HostedBillFromReport = MindBillBillFromReport;\nexport const HostedCollections = MindBillCollections;\nexport const HostedOnboarding = MindBillOnboarding;\n\nexport type {\n MindBillAppearance,\n MindBillErrorDetail,\n MindBillEventDetail,\n} from \"@mindbill/embed\";\n\nexport {\n BillReviewForm,\n BillStatusSummary,\n buildBillReviewSaveInput,\n} from \"./native-bill-review\";\nexport type {\n BillReviewAttachment,\n BillReviewBillingProvider,\n BillReviewClinician,\n BillReviewData,\n BillReviewDocumentType,\n BillReviewDraft,\n BillReviewFormProps,\n BillReviewFeatures,\n BillReviewLineItem,\n BillReviewLocation,\n BillReviewPayer,\n BillReviewSaveInput,\n BillStatusSummaryProps,\n BillStatusAction,\n BillSubmissionRoute,\n} from \"./native-bill-review\";\n\nexport {\n ConnectedBillStatus,\n createBillStatusClient,\n useBillStatus,\n} from \"./connected-bill-status\";\n\nexport {\n ConnectedBillLifecycle,\n createBillLifecycleClient,\n useBillLifecycle,\n} from \"./connected-bill-lifecycle\";\nexport type {\n BillEorDocument,\n BillLifecycleAction,\n BillLifecycleActionId,\n BillLifecycleClient,\n BillLifecycleClientOptions,\n BillLifecycleData,\n BillLifecycleSession,\n BillLifecycleSessionProvider,\n BillLifecycleSessionRequest,\n CloseBillInput,\n ConnectedBillLifecycleProps,\n PostBillPaymentInput,\n SubmitSecondReviewInput,\n UseBillLifecycleOptions,\n UseBillLifecycleResult,\n} from \"./connected-bill-lifecycle\";\nexport type {\n BillStatusClient,\n BillStatusClientOptions,\n BillStatusData,\n BillStatusSession,\n BillStatusSessionProvider,\n BillStatusSessionRequest,\n ConnectedBillStatusProps,\n UseBillStatusOptions,\n UseBillStatusResult,\n} from \"./connected-bill-status\";\n","\"use client\";\n\nimport type { MindBillAppearance } from \"@mindbill/embed\";\nimport type { CSSProperties, FormEvent, ReactElement } from \"react\";\nimport { useEffect, useId, useMemo, useState } from \"react\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n id?: string;\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n id?: string;\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n id?: string;\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewPayer = {\n id: string;\n name: string;\n hasElectronic?: boolean;\n states?: string[];\n};\n\nexport type BillReviewFeatures = {\n authorizationNumber?: boolean;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n dos: string;\n dosEnd?: string | null;\n placeOfServiceId?: string;\n authorizationNumber?: string | null;\n billingProviderId?: string;\n renderingProviderId?: string;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: { name: string; dob?: string };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n claimsAdminId?: string;\n claimsAdminName?: string;\n };\n options?: {\n billingProviders?: BillReviewBillingProvider[];\n renderingProviders?: BillReviewClinician[];\n locations?: BillReviewLocation[];\n };\n};\n\nexport type BillReviewSaveInput = {\n claimsAdminId: string;\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProviderId?: string;\n billingProvider?: Omit<BillReviewBillingProvider, \"id\">;\n renderingProviderId?: string;\n renderingProvider?: Omit<BillReviewClinician, \"id\">;\n placeOfServiceId?: string;\n placeOfService?: Omit<BillReviewLocation, \"id\">;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n }>;\n};\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\n\nexport type BillReviewFormProps = {\n data: BillReviewData;\n onSave: (input: BillReviewSaveInput) => Promise<BillReviewData | void>;\n onSubmit: (\n input: BillReviewSaveInput,\n route: BillSubmissionRoute,\n ) => Promise<void>;\n onAddAttachment: (\n file: File,\n documentType: BillReviewDocumentType,\n description?: string,\n ) => Promise<void>;\n onRemoveAttachment: (attachmentId: string) => Promise<void>;\n onOpenAttachment?: (attachment: BillReviewAttachment) => void;\n onSearchClaimsAdministrators?: (\n query: string,\n ) => Promise<BillReviewPayer[]>;\n className?: string;\n style?: CSSProperties;\n appearance?: MindBillAppearance;\n features?: BillReviewFeatures;\n disabled?: boolean;\n};\n\nexport type BillReviewDraft = {\n claimsAdminId: string;\n claimsAdminName: string;\n dos: string;\n dosEnd: string;\n authorizationNumber: string;\n billingProvider: BillReviewBillingProvider;\n clinician: BillReviewClinician;\n location: BillReviewLocation;\n lineItems: BillReviewLineItem[];\n};\n\nconst EMPTY_BILLING_PROVIDER: BillReviewBillingProvider = {\n name: \"\",\n taxId: \"\",\n npi: \"\",\n billType: \"Professional\",\n};\nconst EMPTY_CLINICIAN: BillReviewClinician = {\n name: \"\",\n specialty: \"\",\n npi: \"\",\n};\nconst EMPTY_LOCATION: BillReviewLocation = {\n name: \"\",\n street: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n posCode: \"11\",\n};\n\nconst DOCUMENT_LABELS: Record<BillReviewDocumentType, string> = {\n final_report: \"Final medical-legal report\",\n letter_of_attestation: \"Letter of attestation\",\n proof_of_service: \"Proof of service\",\n form_122: \"DWC Form 122\",\n return_to_work_voucher: \"Return-to-work voucher\",\n w9: \"W-9\",\n medical_records: \"Medical records\",\n appeal: \"Appeal or review support\",\n other: \"Other supporting document\",\n};\n\nfunction withoutId<T extends { id?: string }>(value: T): Omit<T, \"id\"> {\n const result = { ...value };\n delete result.id;\n return result;\n}\n\nfunction toDraft(data: BillReviewData): BillReviewDraft {\n const snapshot = data.bill.billingSnapshot;\n return {\n claimsAdminId: data.injury.claimsAdminId || \"\",\n claimsAdminName: data.injury.claimsAdminName || \"\",\n dos: data.bill.dos || \"\",\n dosEnd: data.bill.dosEnd || \"\",\n authorizationNumber: data.bill.authorizationNumber || \"\",\n billingProvider: {\n ...EMPTY_BILLING_PROVIDER,\n ...(snapshot?.billingProvider ?? {}),\n },\n clinician: { ...EMPTY_CLINICIAN, ...(snapshot?.renderingProvider ?? {}) },\n location: { ...EMPTY_LOCATION, ...(snapshot?.placeOfService ?? {}) },\n lineItems: data.bill.lineItems.map((line) => ({ ...line })),\n };\n}\n\nexport function buildBillReviewSaveInput(\n draft: BillReviewDraft,\n): BillReviewSaveInput {\n return {\n claimsAdminId: draft.claimsAdminId,\n dos: draft.dos,\n dosEnd: draft.dosEnd || null,\n authorizationNumber: draft.authorizationNumber.trim() || null,\n ...(draft.billingProvider.id\n ? { billingProviderId: draft.billingProvider.id }\n : {}),\n billingProvider: withoutId(draft.billingProvider),\n ...(draft.clinician.id\n ? { renderingProviderId: draft.clinician.id }\n : {}),\n renderingProvider: withoutId(draft.clinician),\n ...(draft.location.id ? { placeOfServiceId: draft.location.id } : {}),\n placeOfService: withoutId(draft.location),\n lineItems: draft.lineItems.map(({ id, code, modifiers, units }) => ({\n ...(id ? { id } : {}),\n code: code.trim().toUpperCase(),\n modifiers,\n units,\n })),\n };\n}\n\nfunction money(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\nfunction appearanceStyle(\n appearance: MindBillAppearance | undefined,\n style: CSSProperties | undefined,\n): CSSProperties {\n return {\n ...(appearance?.accentColor\n ? { \"--mb-accent\": appearance.accentColor }\n : {}),\n ...(appearance?.textColor ? { \"--mb-text\": appearance.textColor } : {}),\n ...(appearance?.mutedColor\n ? { \"--mb-muted\": appearance.mutedColor }\n : {}),\n ...(appearance?.borderColor\n ? { \"--mb-border\": appearance.borderColor }\n : {}),\n ...(appearance?.backgroundColor\n ? { \"--mb-soft\": appearance.backgroundColor }\n : {}),\n ...(appearance?.surfaceColor\n ? { \"--mb-surface\": appearance.surfaceColor }\n : {}),\n ...(appearance?.fontFamily\n ? { \"--mb-font\": appearance.fontFamily }\n : {}),\n ...style,\n } as CSSProperties;\n}\n\nfunction Field({\n label,\n value,\n onChange,\n type = \"text\",\n optional,\n required,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n type?: string;\n optional?: boolean;\n required?: boolean;\n}): ReactElement {\n return (\n <label className=\"mb-native-field\">\n <span>\n {label} {optional ? <small>Optional</small> : null}\n </span>\n <input\n type={type}\n value={value}\n required={required}\n onChange={(event) => onChange(event.target.value)}\n />\n </label>\n );\n}\n\nexport function BillReviewForm({\n data,\n onSave,\n onSubmit,\n onAddAttachment,\n onRemoveAttachment,\n onOpenAttachment,\n onSearchClaimsAdministrators,\n className,\n style,\n appearance,\n features,\n disabled = false,\n}: BillReviewFormProps): ReactElement {\n const [draft, setDraft] = useState(() => toDraft(data));\n const [payerQuery, setPayerQuery] = useState(\n () => data.injury.claimsAdminName || \"\",\n );\n const [payerResults, setPayerResults] = useState<BillReviewPayer[]>([]);\n const [payerBusy, setPayerBusy] = useState(false);\n const [route, setRoute] = useState<BillSubmissionRoute>(\"ebill\");\n const [file, setFile] = useState<File | null>(null);\n const [documentType, setDocumentType] =\n useState<BillReviewDocumentType>(\"other\");\n const [busy, setBusy] = useState<\"save\" | \"submit\" | \"attachment\" | \"\">(\"\");\n const [error, setError] = useState(\"\");\n const [notice, setNotice] = useState(\"\");\n const routeName = useId();\n const payerListId = useId();\n const editable = data.bill.status === \"incomplete\" && !disabled;\n\n useEffect(() => {\n setDraft(toDraft(data));\n setPayerQuery(data.injury.claimsAdminName || \"\");\n }, [data]);\n\n useEffect(() => {\n if (!onSearchClaimsAdministrators || payerQuery.trim().length < 2) {\n setPayerResults([]);\n setPayerBusy(false);\n return;\n }\n let current = true;\n const timer = window.setTimeout(() => {\n setPayerBusy(true);\n void onSearchClaimsAdministrators(payerQuery.trim())\n .then((results) => {\n if (current) setPayerResults(results);\n })\n .catch((cause) => {\n if (current) {\n setPayerResults([]);\n setError(\n cause instanceof Error\n ? cause.message\n : \"Claims administrator search is unavailable.\",\n );\n }\n })\n .finally(() => {\n if (current) setPayerBusy(false);\n });\n }, 200);\n return () => {\n current = false;\n window.clearTimeout(timer);\n };\n }, [onSearchClaimsAdministrators, payerQuery]);\n\n const canSubmit = useMemo(\n () =>\n Boolean(\n draft.dos &&\n draft.claimsAdminId &&\n draft.billingProvider.name.trim() &&\n draft.billingProvider.taxId.trim() &&\n draft.billingProvider.npi.trim() &&\n draft.clinician.name.trim() &&\n draft.clinician.npi.trim() &&\n draft.location.name.trim() &&\n draft.location.street.trim() &&\n draft.location.city.trim() &&\n draft.location.state.trim() &&\n draft.location.zip.trim() &&\n draft.lineItems.length &&\n draft.lineItems.every((line) => line.code.trim() && line.units > 0),\n ),\n [draft],\n );\n\n const updateBillingProvider = <K extends keyof BillReviewBillingProvider>(\n key: K,\n value: BillReviewBillingProvider[K],\n ) =>\n setDraft((current) => ({\n ...current,\n billingProvider: { ...current.billingProvider, [key]: value },\n }));\n const updateClinician = <K extends keyof BillReviewClinician>(\n key: K,\n value: BillReviewClinician[K],\n ) =>\n setDraft((current) => ({\n ...current,\n clinician: { ...current.clinician, [key]: value },\n }));\n const updateLocation = <K extends keyof BillReviewLocation>(\n key: K,\n value: BillReviewLocation[K],\n ) =>\n setDraft((current) => ({\n ...current,\n location: { ...current.location, [key]: value },\n }));\n\n async function run(action: \"save\" | \"submit\", task: () => Promise<void>) {\n setBusy(action);\n setError(\"\");\n setNotice(\"\");\n try {\n await task();\n setNotice(action === \"save\" ? \"Changes saved.\" : \"Bill submitted.\");\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"The billing request could not be completed.\",\n );\n } finally {\n setBusy(\"\");\n }\n }\n\n const handleSave = (event: FormEvent) => {\n event.preventDefault();\n void run(\"save\", async () => {\n const updated = await onSave(buildBillReviewSaveInput(draft));\n if (updated) setDraft(toDraft(updated));\n });\n };\n\n const handleSubmit = () =>\n run(\"submit\", () => onSubmit(buildBillReviewSaveInput(draft), route));\n\n const attach = async () => {\n if (!file) return;\n setBusy(\"attachment\");\n setError(\"\");\n try {\n await onAddAttachment(file, documentType, DOCUMENT_LABELS[documentType]);\n setFile(null);\n setDocumentType(\"other\");\n setNotice(\"Document added to the payer packet.\");\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Document could not be attached.\");\n } finally {\n setBusy(\"\");\n }\n };\n\n const sectionClass = \"mb-native-section\";\n return (\n <form\n className={[\"mb-native-review\", className].filter(Boolean).join(\" \")}\n style={appearanceStyle(appearance, style)}\n onSubmit={handleSave}\n >\n <style>{NATIVE_BILL_REVIEW_STYLES}</style>\n <header className=\"mb-native-heading\">\n <div>\n <span className=\"mb-native-eyebrow\">Billing review</span>\n <h2>Bill #{data.bill.billNumber}</h2>\n <p>Review the prefilled claim and payer packet, then submit.</p>\n </div>\n <div className=\"mb-native-total\">\n <span>{data.bill.status}</span>\n <strong>{money(data.bill.totalCharge)}</strong>\n </div>\n </header>\n\n <dl className=\"mb-native-summary\">\n <div><dt>Patient</dt><dd>{data.patient.name || \"—\"}</dd></div>\n <div><dt>Claim</dt><dd>{data.injury.claimNumber || \"—\"}</dd></div>\n <div><dt>Employer</dt><dd>{data.injury.employer || \"—\"}</dd></div>\n <div><dt>Date of injury</dt><dd>{data.injury.doi || \"—\"}</dd></div>\n </dl>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\">\n <div>\n <h3>Claims administrator</h3>\n <p>Select the carrier or administrator that should receive this bill.</p>\n </div>\n {draft.claimsAdminId ? <span>Selected</span> : <span>Required</span>}\n </div>\n <div className=\"mb-native-payer-picker\">\n <label className=\"mb-native-field\">\n <span>Insurance company or claims administrator</span>\n <input\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-controls={payerListId}\n aria-expanded={payerResults.length > 0}\n value={payerQuery}\n disabled={!editable}\n placeholder=\"Search by payer or administrator name\"\n onChange={(event) => {\n const value = event.target.value;\n setPayerQuery(value);\n setDraft((current) => ({\n ...current,\n ...(value === current.claimsAdminName\n ? {}\n : { claimsAdminId: \"\", claimsAdminName: \"\" }),\n }));\n }}\n />\n </label>\n {payerBusy ? <span className=\"mb-native-payer-help\">Searching…</span> : null}\n {!payerBusy && payerQuery.trim().length > 1 && payerResults.length === 0 && !draft.claimsAdminId ? (\n <span className=\"mb-native-payer-help\">No matching administrator selected yet.</span>\n ) : null}\n {payerResults.length > 0 ? (\n <ul id={payerListId} className=\"mb-native-payer-results\" role=\"listbox\">\n {payerResults.map((payer) => (\n <li key={payer.id} role=\"option\" aria-selected={payer.id === draft.claimsAdminId}>\n <button\n type=\"button\"\n onClick={() => {\n setDraft((current) => ({\n ...current,\n claimsAdminId: payer.id,\n claimsAdminName: payer.name,\n }));\n setPayerQuery(payer.name);\n setPayerResults([]);\n }}\n >\n <strong>{payer.name}</strong>\n <span>{payer.hasElectronic ? \"Electronic billing available\" : \"Billing route confirmed after review\"}</span>\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Claim and service</h3><p>These values print on the bill.</p></div></div>\n <div className={`mb-native-grid ${features?.authorizationNumber === false ? \"two\" : \"three\"}`}>\n <Field label=\"Date of service\" type=\"date\" required value={draft.dos} onChange={(dos) => setDraft((current) => ({ ...current, dos }))} />\n <Field label=\"End date\" type=\"date\" optional value={draft.dosEnd} onChange={(dosEnd) => setDraft((current) => ({ ...current, dosEnd }))} />\n {features?.authorizationNumber === false ? null : <Field label=\"Authorization number\" optional value={draft.authorizationNumber} onChange={(authorizationNumber) => setDraft((current) => ({ ...current, authorizationNumber }))} />}\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Billing practice</h3><p>Payee identity and billing address for this claim.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Practice name\" required value={draft.billingProvider.name} onChange={(value) => updateBillingProvider(\"name\", value)} />\n <Field label=\"Tax ID\" required value={draft.billingProvider.taxId} onChange={(value) => updateBillingProvider(\"taxId\", value)} />\n <Field label=\"Billing NPI\" required value={draft.billingProvider.npi} onChange={(value) => updateBillingProvider(\"npi\", value)} />\n <Field label=\"Phone\" optional value={draft.billingProvider.phone || \"\"} onChange={(value) => updateBillingProvider(\"phone\", value)} />\n <Field label=\"Billing street\" required value={draft.billingProvider.billingStreet || \"\"} onChange={(value) => updateBillingProvider(\"billingStreet\", value)} />\n <Field label=\"City\" required value={draft.billingProvider.billingCity || \"\"} onChange={(value) => updateBillingProvider(\"billingCity\", value)} />\n <Field label=\"State\" required value={draft.billingProvider.billingState || \"\"} onChange={(value) => updateBillingProvider(\"billingState\", value)} />\n <Field label=\"ZIP\" required value={draft.billingProvider.billingZip || \"\"} onChange={(value) => updateBillingProvider(\"billingZip\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Clinician</h3><p>Provider identity printed on the claim.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Clinician name\" required value={draft.clinician.name} onChange={(value) => updateClinician(\"name\", value)} />\n <Field label=\"Specialty\" value={draft.clinician.specialty} onChange={(value) => updateClinician(\"specialty\", value)} />\n <Field label=\"NPI\" required value={draft.clinician.npi} onChange={(value) => updateClinician(\"npi\", value)} />\n <Field label=\"Taxonomy\" optional value={draft.clinician.taxonomy || \"\"} onChange={(value) => updateClinician(\"taxonomy\", value)} />\n <Field label=\"License number\" optional value={draft.clinician.licenseNumber || \"\"} onChange={(value) => updateClinician(\"licenseNumber\", value)} />\n <Field label=\"License state\" optional value={draft.clinician.licenseState || \"\"} onChange={(value) => updateClinician(\"licenseState\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Service location</h3><p>The exact place of service for this bill.</p></div><span>Prefilled</span></div>\n <div className=\"mb-native-grid three\">\n <Field label=\"Location name\" required value={draft.location.name} onChange={(value) => updateLocation(\"name\", value)} />\n <Field label=\"Street\" required value={draft.location.street} onChange={(value) => updateLocation(\"street\", value)} />\n <Field label=\"City\" required value={draft.location.city} onChange={(value) => updateLocation(\"city\", value)} />\n <Field label=\"State\" required value={draft.location.state} onChange={(value) => updateLocation(\"state\", value)} />\n <Field label=\"ZIP\" required value={draft.location.zip} onChange={(value) => updateLocation(\"zip\", value)} />\n <Field label=\"Place of service code\" required value={draft.location.posCode || \"11\"} onChange={(value) => updateLocation(\"posCode\", value)} />\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Procedure lines</h3><p>The allowed amount is recalculated when changes are saved.</p></div><button type=\"button\" className=\"mb-native-button quiet\" disabled={!editable} onClick={() => setDraft((current) => ({ ...current, lineItems: [...current.lineItems, { code: \"\", modifiers: [], units: 1, charge: 0 }] }))}>+ Add line</button></div>\n <div className=\"mb-native-lines\">\n {draft.lineItems.map((line, index) => (\n <div className=\"mb-native-line\" key={line.id || index}>\n <Field label=\"Procedure\" required value={line.code} onChange={(value) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, code: value } : item) }))} />\n <Field label=\"Modifiers\" value={line.modifiers.join(\", \")} onChange={(value) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, modifiers: value.split(\",\").map((part) => part.trim()).filter(Boolean) } : item) }))} />\n <label className=\"mb-native-field\"><span>Units</span><input type=\"number\" min=\"1\" required value={line.units} onChange={(event) => setDraft((current) => ({ ...current, lineItems: current.lineItems.map((item, itemIndex) => itemIndex === index ? { ...item, units: Number(event.target.value) } : item) }))} /></label>\n <div className=\"mb-native-allowed\"><span>Allowed</span><strong>{money(line.charge)}</strong></div>\n <button type=\"button\" className=\"mb-native-remove\" aria-label={`Remove ${line.code || \"procedure\"}`} disabled={!editable || draft.lineItems.length === 1} onClick={() => setDraft((current) => ({ ...current, lineItems: current.lineItems.filter((_, itemIndex) => itemIndex !== index) }))}>×</button>\n </div>\n ))}\n </div>\n </section>\n\n <section className={sectionClass}>\n <div className=\"mb-native-section-head\"><div><h3>Payer billing packet</h3><p>Review exactly what will be sent with this bill.</p></div><span>{data.bill.attachments.length} files</span></div>\n <div className=\"mb-native-note\"><strong>Separate from attorney report service.</strong> Final reports, proof of service, and required billing forms may be preselected. Medical records are never silently attached.</div>\n <ul className=\"mb-native-documents\">\n {data.bill.attachments.map((attachment) => (\n <li key={attachment.id}>\n <span className=\"mb-native-file\">PDF</span>\n <div><strong>{attachment.filename}</strong><span>{DOCUMENT_LABELS[attachment.documentType as BillReviewDocumentType] || attachment.description || \"Supporting document\"}</span></div>\n {onOpenAttachment ? <button type=\"button\" className=\"mb-native-button quiet\" onClick={() => onOpenAttachment(attachment)}>View</button> : null}\n <button type=\"button\" className=\"mb-native-remove\" disabled={!editable || busy === \"attachment\"} aria-label={`Remove ${attachment.filename}`} onClick={() => void onRemoveAttachment(attachment.id).catch((cause) => setError(cause instanceof Error ? cause.message : \"Document could not be removed.\"))}>×</button>\n </li>\n ))}\n </ul>\n <div className=\"mb-native-attach\">\n <div><strong>Add supporting PDF</strong><span>Choose any additional document intentionally. Up to 25 MB.</span></div>\n <select aria-label=\"Document type\" value={documentType} disabled={!editable} onChange={(event) => setDocumentType(event.target.value as BillReviewDocumentType)}>{Object.entries(DOCUMENT_LABELS).map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select>\n <input aria-label=\"Choose supporting PDF\" type=\"file\" accept=\"application/pdf,.pdf\" disabled={!editable} onChange={(event) => setFile(event.target.files?.[0] || null)} />\n <button className=\"mb-native-button secondary\" type=\"button\" disabled={!editable || !file || busy === \"attachment\"} onClick={() => void attach()}>{busy === \"attachment\" ? \"Attaching…\" : \"Attach document\"}</button>\n </div>\n </section>\n\n <section className=\"mb-native-submit\">\n <div><span className=\"mb-native-eyebrow\">Delivery</span><h3>Submit this bill</h3><p>After submission, status, payments, denials, and resubmissions stay available here.</p></div>\n <fieldset><legend>Send via</legend>{([\"ebill\", \"fax\", \"mail\", \"email\"] as const).map((value) => <label key={value}><input type=\"radio\" name={routeName} value={value} checked={route === value} onChange={() => setRoute(value)} />{value === \"ebill\" ? \"E-bill\" : value.charAt(0).toUpperCase() + value.slice(1)}</label>)}</fieldset>\n {error ? <div className=\"mb-native-message error\" role=\"alert\">{error}</div> : null}\n {notice ? <div className=\"mb-native-message success\" role=\"status\">{notice}</div> : null}\n <div className=\"mb-native-actions\">\n <button className=\"mb-native-button secondary\" type=\"submit\" disabled={!editable || busy !== \"\"}>{busy === \"save\" ? \"Saving…\" : \"Save changes\"}</button>\n <button className=\"mb-native-button primary\" type=\"button\" disabled={!editable || !canSubmit || busy !== \"\"} onClick={() => void handleSubmit()}>{busy === \"submit\" ? \"Submitting…\" : \"Submit bill\"}</button>\n </div>\n </section>\n </form>\n );\n}\n\nexport type BillStatusSummaryProps = {\n status: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n actions?: BillStatusAction[];\n className?: string;\n style?: CSSProperties;\n appearance?: MindBillAppearance;\n};\n\nexport type BillStatusAction = {\n id: string;\n label: string;\n onClick: () => void;\n primary?: boolean;\n disabled?: boolean;\n};\n\nexport function BillStatusSummary({ status, submittedAt, agingDays, updatedAt, totalCharge, totalPaid, balanceDue, actions = [], className, style, appearance }: BillStatusSummaryProps): ReactElement {\n return <section className={[\"mb-native-status\", className].filter(Boolean).join(\" \")} style={appearanceStyle(appearance, style)}>\n <style>{NATIVE_BILL_REVIEW_STYLES}</style>\n <div className=\"mb-native-status-copy\"><span className=\"mb-native-eyebrow\">Bill status</span><h3>{status.replaceAll(\"_\", \" \")}</h3><p>{submittedAt ? `Submitted ${new Date(submittedAt).toLocaleDateString()}` : \"Not submitted\"}{agingDays == null ? \"\" : ` · ${agingDays} day${agingDays === 1 ? \"\" : \"s\"} old`}{updatedAt ? ` · Updated ${new Date(updatedAt).toLocaleDateString()}` : \"\"}</p></div>\n <dl><div><dt>Charged</dt><dd>{money(totalCharge)}</dd></div><div><dt>Paid</dt><dd>{money(totalPaid)}</dd></div><div><dt>Balance</dt><dd>{money(balanceDue)}</dd></div></dl>\n {actions.length ? <div className=\"mb-native-status-actions\">{actions.map((action) => <button key={action.id} type=\"button\" className={`mb-native-button ${action.primary ? \"primary\" : \"secondary\"}`} disabled={action.disabled} onClick={action.onClick}>{action.label}</button>)}</div> : null}\n </section>;\n}\n\nconst NATIVE_BILL_REVIEW_STYLES = `\n.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}\n.mb-native-review,.mb-native-status{--mb-accent:#238dbd;--mb-accent-dark:#176f98;--mb-text:#203743;--mb-muted:#657982;--mb-border:#dbe6ea;--mb-soft:#f3f8fa;--mb-surface:#fff;color:var(--mb-text);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}.mb-native-review *,.mb-native-status *{box-sizing:border-box}.mb-native-review{display:grid;gap:16px}.mb-native-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;padding:6px 2px}.mb-native-heading h2,.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{margin:3px 0 2px;line-height:1.2}.mb-native-heading h2{font-size:25px}.mb-native-heading p,.mb-native-section p,.mb-native-submit p,.mb-native-status p{margin:0;color:var(--mb-muted)}.mb-native-eyebrow{color:#59727d;font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.mb-native-total{display:flex;align-items:center;gap:18px}.mb-native-total span,.mb-native-section-head>span{border-radius:999px;background:var(--mb-soft);color:#58717c;font-size:11px;font-weight:800;padding:6px 10px;text-transform:capitalize}.mb-native-total strong{font-size:24px}.mb-native-summary{display:grid;grid-template-columns:repeat(4,1fr);margin:0;border:1px solid var(--mb-border);border-radius:12px;background:var(--mb-surface);overflow:hidden}.mb-native-summary div{padding:17px 20px;border-right:1px solid var(--mb-border)}.mb-native-summary div:last-child{border:0}.mb-native-summary dt,.mb-native-allowed span{color:#647982;font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.mb-native-summary dd{margin:5px 0 0;font-weight:750}.mb-native-section{padding:20px;border:1px solid var(--mb-border);border-radius:14px;background:var(--mb-surface);box-shadow:0 8px 24px rgba(28,58,72,.04)}.mb-native-section-head{display:flex;align-items:start;justify-content:space-between;gap:16px;margin-bottom:17px}.mb-native-section h3,.mb-native-submit h3,.mb-native-status h3{font-size:19px}.mb-native-grid{display:grid;gap:14px}.mb-native-grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.mb-native-field{display:grid;gap:6px;min-width:0;color:var(--mb-text);font-size:12px;font-weight:750}.mb-native-field small{color:var(--mb-muted);font-size:inherit;font-weight:500}.mb-native-field input,.mb-native-attach select,.mb-native-attach input{width:100%;min-height:43px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);font:inherit;padding:10px 12px}.mb-native-field input:focus,.mb-native-attach select:focus,.mb-native-attach input:focus{border-color:var(--mb-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--mb-accent) 14%,transparent);outline:0}.mb-native-lines{display:grid;gap:10px}.mb-native-line{display:grid;grid-template-columns:1.1fr 1.1fr 110px 120px 28px;align-items:end;gap:12px;padding:13px;background:var(--mb-soft);border:1px solid #e3edf0;border-radius:10px}.mb-native-allowed{display:grid;gap:5px;padding:0 8px 11px;text-align:right}.mb-native-allowed strong{font-size:16px}.mb-native-remove{border:0;background:transparent;color:#667d86;cursor:pointer;font-size:20px;padding:7px}.mb-native-note{padding:13px 15px;border:1px solid #bdd9e4;border-radius:9px;background:#f2f9fc;color:#526d78}.mb-native-note strong{color:var(--mb-text);margin-right:12px}.mb-native-documents{list-style:none;margin:14px 0;padding:0}.mb-native-documents li{display:grid;grid-template-columns:42px 1fr auto 28px;align-items:center;gap:12px;padding:12px 4px;border-bottom:1px solid var(--mb-border)}.mb-native-documents li>div{display:grid}.mb-native-documents li span{color:var(--mb-muted);font-size:12px}.mb-native-file{display:grid;place-items:center;width:40px;height:40px;border-radius:8px;background:#eaf5f9;color:var(--mb-accent)!important;font-size:11px!important;font-weight:850}.mb-native-attach{display:grid;grid-template-columns:1fr 230px minmax(220px,1fr) auto;align-items:end;gap:12px;padding:15px;border-radius:10px;background:var(--mb-soft)}.mb-native-attach>div{display:grid;gap:3px}.mb-native-attach span{color:var(--mb-muted);font-size:12px}.mb-native-button{min-height:40px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);cursor:pointer;font:inherit;font-weight:750;padding:9px 14px}.mb-native-button.primary{border-color:var(--mb-accent);background:var(--mb-accent);color:#fff}.mb-native-button.primary:hover{background:var(--mb-accent-dark)}.mb-native-button.secondary{background:#fff}.mb-native-button.quiet{min-height:auto;background:var(--mb-soft);padding:7px 11px}.mb-native-button:disabled,.mb-native-remove:disabled{cursor:not-allowed;opacity:.5}.mb-native-submit{display:grid;grid-template-columns:1fr auto;align-items:end;gap:18px;padding:22px;border:1px solid #bcd8e2;border-radius:14px;background:linear-gradient(135deg,#f3fafc,#eaf6fa)}.mb-native-submit fieldset{display:flex;gap:6px;margin:0;padding:0;border:0}.mb-native-submit legend{position:absolute;width:1px;height:1px;overflow:hidden}.mb-native-submit fieldset label{display:flex;align-items:center;gap:6px;padding:9px 11px;border:1px solid #c9dce3;border-radius:8px;background:#fff;font-weight:700}.mb-native-actions{display:flex;justify-content:flex-end;gap:10px;grid-column:1/-1}.mb-native-message{grid-column:1/-1;padding:10px 12px;border-radius:8px}.mb-native-message.error{background:#fff0ef;color:#9d3029}.mb-native-message.success{background:#edf9f2;color:#217449}.mb-native-status{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px;border:1px solid var(--mb-border);border-radius:12px;background:#fff}.mb-native-status h3{text-transform:capitalize}.mb-native-status dl{display:flex;margin:0}.mb-native-status dl div{min-width:110px;padding:0 18px;border-left:1px solid var(--mb-border)}.mb-native-status dt{color:var(--mb-muted);font-size:11px}.mb-native-status dd{margin:4px 0 0;font-size:17px;font-weight:800}@media(max-width:900px){.mb-native-grid.three{grid-template-columns:repeat(2,minmax(0,1fr))}.mb-native-summary{grid-template-columns:repeat(2,1fr)}.mb-native-summary div:nth-child(2){border-right:0}.mb-native-summary div:nth-child(-n+2){border-bottom:1px solid var(--mb-border)}.mb-native-line{grid-template-columns:1fr 1fr 90px}.mb-native-allowed{align-self:center}.mb-native-attach{grid-template-columns:1fr 1fr}.mb-native-submit{grid-template-columns:1fr}.mb-native-submit fieldset,.mb-native-actions{grid-column:1}.mb-native-actions{justify-content:start}}@media(max-width:620px){.mb-native-heading,.mb-native-total,.mb-native-status{align-items:start;flex-direction:column}.mb-native-grid.three,.mb-native-summary,.mb-native-line,.mb-native-attach{grid-template-columns:1fr}.mb-native-summary div,.mb-native-summary div:nth-child(2){border-right:0;border-bottom:1px solid var(--mb-border)}.mb-native-line{align-items:stretch}.mb-native-allowed{text-align:left}.mb-native-submit fieldset{display:grid;grid-template-columns:1fr 1fr}.mb-native-status dl{width:100%}.mb-native-status dl div{min-width:0;flex:1;padding:0 10px}.mb-native-status dl div:first-child{padding-left:0;border-left:0}}\n.mb-native-status-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.mb-native-status-copy{min-width:150px}.mb-native-review,.mb-native-status{font-family:var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}\n.mb-native-review{padding:clamp(16px,2vw,24px)}\n.mb-native-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}\n.mb-native-payer-picker{position:relative;max-width:760px}\n.mb-native-payer-help{display:block;margin-top:7px;color:var(--mb-muted);font-size:12px}\n.mb-native-payer-results{position:absolute;z-index:5;top:calc(100% + 6px);right:0;left:0;max-height:280px;overflow:auto;list-style:none;margin:0;padding:6px;border:1px solid var(--mb-border);border-radius:10px;background:var(--mb-surface);box-shadow:0 16px 40px rgba(28,58,72,.16)}\n.mb-native-payer-results li{margin:0;padding:0}\n.mb-native-payer-results button{display:grid;width:100%;gap:2px;padding:11px 12px;border:0;border-radius:7px;background:transparent;color:var(--mb-text);font:inherit;text-align:left;cursor:pointer}\n.mb-native-payer-results button:hover,.mb-native-payer-results button:focus{background:var(--mb-soft);outline:0}\n.mb-native-payer-results span{color:var(--mb-muted);font-size:12px}\n@media(max-width:620px){.mb-native-review{padding:12px}.mb-native-grid.two{grid-template-columns:1fr}}\n`;\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n BillStatusSummary,\n type BillStatusSummaryProps,\n} from \"./native-bill-review\";\n\nconst DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nconst DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/status-session\";\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\nexport type BillStatusData = {\n billId: string;\n state: string;\n nativeStatus: string;\n submittedAt: string | null;\n agingDays: number | null;\n updatedAt: string | null;\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n};\n\nexport type BillStatusSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillStatusSessionRequest = {\n billId: string;\n signal: AbortSignal;\n};\n\nexport type BillStatusSessionProvider = (\n request: BillStatusSessionRequest,\n) => Promise<BillStatusSession>;\n\nexport type BillStatusClientOptions = {\n billId: string;\n /** Same-origin route that mints a short-lived, bill-scoped browser session. */\n sessionEndpoint?: string;\n /** Advanced escape hatch for non-HTTP session exchange. */\n getSession?: BillStatusSessionProvider;\n apiBaseUrl?: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type BillStatusClient = {\n getStatus: (signal?: AbortSignal) => Promise<BillStatusData>;\n clearSession: () => void;\n};\n\nexport type UseBillStatusOptions = BillStatusClientOptions & {\n refreshInterval?: number;\n enabled?: boolean;\n initialData?: BillStatusData | null;\n};\n\nexport type UseBillStatusResult = {\n data: BillStatusData | null;\n error: Error | null;\n isLoading: boolean;\n isRefreshing: boolean;\n refresh: () => Promise<void>;\n};\n\nasync function responseError(\n response: Response,\n fallback: string,\n): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; error?: unknown }).detail\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillStatusSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillStatusSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The MindBill session endpoint returned an invalid response.\");\n }\n const candidate = value as {\n token?: unknown;\n expiresAt?: unknown;\n apiBaseUrl?: unknown;\n session?: unknown;\n data?: unknown;\n };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\"\n ? nested as typeof candidate\n : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The MindBill session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\"\n ? { expiresAt: session.expiresAt }\n : {}),\n ...(typeof session.apiBaseUrl === \"string\"\n ? { apiBaseUrl: session.apiBaseUrl }\n : {}),\n };\n}\n\nfunction normalizeStatus(value: unknown, billId: string): BillStatusData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"MindBill returned an invalid bill status.\");\n }\n const status = value as Partial<BillStatusData>;\n const amounts = [status.totalCharge, status.totalPaid, status.balanceDue];\n if (\n typeof status.state !== \"string\"\n || amounts.some(\n (amount) => typeof amount !== \"number\" || !Number.isFinite(amount),\n )\n ) {\n throw new Error(\"MindBill returned an invalid bill status.\");\n }\n return {\n billId: typeof status.billId === \"string\" ? status.billId : billId,\n state: status.state,\n nativeStatus: typeof status.nativeStatus === \"string\"\n ? status.nativeStatus\n : status.state,\n submittedAt: typeof status.submittedAt === \"string\"\n ? status.submittedAt\n : null,\n agingDays: typeof status.agingDays === \"number\" ? status.agingDays : null,\n updatedAt: typeof status.updatedAt === \"string\" ? status.updatedAt : null,\n totalCharge: status.totalCharge as number,\n totalPaid: status.totalPaid as number,\n balanceDue: status.balanceDue as number,\n };\n}\n\n/**\n * Browser-safe status client used by useBillStatus. It exchanges the user's\n * authenticated same-origin session for a short-lived MindBill token, then\n * reads status directly from MindBill. It never accepts a Partner API key.\n */\nexport function createBillStatusClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillStatusClientOptions): BillStatusClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") {\n throw new Error(\"A Fetch API implementation is required.\");\n }\n let session: BillStatusSession | null = null;\n let sessionRequest: Promise<BillStatusSession> | null = null;\n\n const mintSession = async (\n signal: AbortSignal,\n force = false,\n ): Promise<BillStatusSession> => {\n if (!force && isSessionFresh(session)) return session as BillStatusSession;\n if (!force && sessionRequest) return sessionRequest;\n\n const pending = getSession\n ? getSession({ billId, signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ billId }),\n signal,\n }).then(async (response) => {\n if (!response.ok) {\n throw await responseError(\n response,\n \"MindBill browser session could not be created.\",\n );\n }\n return response.json();\n });\n\n const request = Promise.resolve(pending)\n .then(normalizeSession)\n .then((nextSession) => {\n session = nextSession;\n return nextSession;\n })\n .finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const requestStatus = async (\n browserSession: BillStatusSession,\n signal: AbortSignal,\n ): Promise<Response> => {\n const baseUrl = (browserSession.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n return fetcher(`${baseUrl}/embed/api/bill-timeline`, {\n headers: { authorization: `Bearer ${browserSession.token}` },\n signal,\n });\n };\n\n return {\n clearSession() {\n session = null;\n sessionRequest = null;\n },\n async getStatus(providedSignal) {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n let response = await requestStatus(browserSession, signal);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await requestStatus(browserSession, signal);\n }\n if (!response.ok) {\n throw await responseError(response, \"Bill status could not be loaded.\");\n }\n const body = await response.json() as { data?: unknown };\n return normalizeStatus(body.data, billId);\n },\n };\n}\n\nexport function useBillStatus({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n refreshInterval = DEFAULT_REFRESH_INTERVAL,\n enabled = true,\n initialData = null,\n fetch: fetchOverride,\n}: UseBillStatusOptions): UseBillStatusResult {\n const client = useMemo(() => createBillStatusClient({\n billId,\n sessionEndpoint,\n ...(getSession ? { getSession } : {}),\n apiBaseUrl,\n ...(fetchOverride ? { fetch: fetchOverride } : {}),\n }), [apiBaseUrl, billId, fetchOverride, getSession, sessionEndpoint]);\n const [data, setData] = useState<BillStatusData | null>(initialData);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(enabled && !initialData);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const dataRef = useRef<BillStatusData | null>(initialData);\n const initialDataRef = useRef<BillStatusData | null>(initialData);\n initialDataRef.current = initialData;\n const activeControllerRef = useRef<AbortController | null>(null);\n const requestSequence = useRef(0);\n\n useEffect(() => {\n const seed = initialDataRef.current;\n dataRef.current = seed;\n setData(seed);\n setError(null);\n setIsLoading(enabled && !seed);\n activeControllerRef.current?.abort();\n return () => activeControllerRef.current?.abort();\n }, [client, enabled]);\n\n const load = useCallback(async () => {\n if (!enabled || !billId) return;\n const sequence = ++requestSequence.current;\n activeControllerRef.current?.abort();\n const controller = new AbortController();\n activeControllerRef.current = controller;\n if (dataRef.current) setIsRefreshing(true);\n else setIsLoading(true);\n setError(null);\n\n try {\n const nextData = await client.getStatus(controller.signal);\n if (!controller.signal.aborted && sequence === requestSequence.current) {\n dataRef.current = nextData;\n setData(nextData);\n }\n } catch (cause) {\n if (controller.signal.aborted) return;\n if (sequence === requestSequence.current) {\n setError(\n cause instanceof Error\n ? cause\n : new Error(\"Bill status could not be loaded.\"),\n );\n }\n } finally {\n if (activeControllerRef.current === controller) {\n activeControllerRef.current = null;\n }\n if (!controller.signal.aborted && sequence === requestSequence.current) {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }\n }, [billId, client, enabled]);\n\n useEffect(() => {\n if (enabled) void load();\n }, [enabled, load]);\n\n useEffect(() => {\n if (!enabled || refreshInterval <= 0) return;\n const timer = window.setInterval(() => void load(), refreshInterval);\n const onFocus = () => void load();\n const onVisibility = () => {\n if (document.visibilityState === \"visible\") void load();\n };\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.clearInterval(timer);\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [enabled, load, refreshInterval]);\n\n return { data, error, isLoading, isRefreshing, refresh: load };\n}\n\nexport type ConnectedBillStatusProps = UseBillStatusOptions & {\n actions?: BillStatusSummaryProps[\"actions\"];\n appearance?: BillStatusSummaryProps[\"appearance\"];\n className?: string;\n style?: BillStatusSummaryProps[\"style\"];\n loadingFallback?: ReactNode;\n errorFallback?: (error: Error, retry: () => Promise<void>) => ReactNode;\n};\n\nexport function ConnectedBillStatus({\n actions,\n appearance,\n className,\n style,\n loadingFallback,\n errorFallback,\n ...options\n}: ConnectedBillStatusProps): ReactElement | null {\n const status = useBillStatus(options);\n if (status.isLoading && !status.data) {\n return <>{loadingFallback ?? <div role=\"status\">Loading bill status…</div>}</>;\n }\n if (status.error && !status.data) {\n return <>{errorFallback?.(status.error, status.refresh) ?? (\n <div role=\"alert\">\n {status.error.message}{\" \"}\n <button type=\"button\" onClick={() => void status.refresh()}>Retry</button>\n </div>\n )}</>;\n }\n if (!status.data) return null;\n return <BillStatusSummary\n status={status.data.state}\n submittedAt={status.data.submittedAt}\n agingDays={status.data.agingDays}\n updatedAt={status.data.updatedAt}\n totalCharge={status.data.totalCharge}\n totalPaid={status.data.totalPaid}\n balanceDue={status.data.balanceDue}\n {...(actions ? { actions } : {})}\n {...(appearance ? { appearance } : {})}\n {...(className ? { className } : {})}\n {...(style ? { style } : {})}\n />;\n}\n","\"use client\";\n\nimport type { MindBillAppearance } from \"@mindbill/embed\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n BillReviewForm,\n BillStatusSummary,\n type BillReviewAttachment,\n type BillReviewData,\n type BillReviewDocumentType,\n type BillReviewFeatures,\n type BillReviewPayer,\n type BillReviewSaveInput,\n type BillSubmissionRoute,\n} from \"./native-bill-review\";\n\nconst DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nconst DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/bill-session\";\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\nexport type BillLifecycleActionId =\n | \"edit_and_submit\"\n | \"correct_and_resubmit\"\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n billId: string;\n component: \"bill-review\";\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BillLifecycleClientOptions = {\n billId: string;\n /** Same-origin server route that mints a short-lived, bill-scoped session. */\n sessionEndpoint?: string | undefined;\n /** Advanced escape hatch for a custom session exchange. */\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\nexport type BillLifecycleClient = {\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n searchClaimsAdministrators: (query: string) => Promise<BillReviewPayer[]>;\n saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;\n submitBill: (\n input: BillReviewSaveInput,\n route: BillSubmissionRoute,\n ) => Promise<BillLifecycleData>;\n addAttachment: (\n file: File,\n documentType: BillReviewDocumentType,\n description?: string,\n ) => Promise<BillLifecycleData>;\n removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (\n input: SubmitSecondReviewInput,\n ) => Promise<BillLifecycleData>;\n startCorrection: () => Promise<{\n replacementBillId: string;\n data: BillLifecycleData;\n }>;\n clearSession: () => void;\n};\n\nexport type UseBillLifecycleOptions = BillLifecycleClientOptions & {\n refreshInterval?: number;\n enabled?: boolean;\n initialData?: BillLifecycleData | null;\n onBillIdChange?: (\n billId: string,\n previousBillId: string,\n ) => void | Promise<void>;\n};\n\nexport type UseBillLifecycleResult = {\n billId: string;\n data: BillLifecycleData | null;\n error: Error | null;\n isLoading: boolean;\n isRefreshing: boolean;\n isMutating: boolean;\n refresh: () => Promise<void>;\n searchClaimsAdministrators: BillLifecycleClient[\"searchClaimsAdministrators\"];\n saveReview: BillLifecycleClient[\"saveReview\"];\n submitBill: BillLifecycleClient[\"submitBill\"];\n addAttachment: BillLifecycleClient[\"addAttachment\"];\n removeAttachment: BillLifecycleClient[\"removeAttachment\"];\n openAttachment: (attachment: BillReviewAttachment) => Promise<void>;\n openEor: (document: BillEorDocument) => Promise<void>;\n closeBill: BillLifecycleClient[\"closeBill\"];\n postPayment: BillLifecycleClient[\"postPayment\"];\n submitSecondReview: BillLifecycleClient[\"submitSecondReview\"];\n startCorrection: () => Promise<BillLifecycleData>;\n};\n\nasync function responseError(\n response: Response,\n fallback: string,\n): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing session endpoint returned an invalid response.\");\n }\n const candidate = value as {\n token?: unknown;\n expiresAt?: unknown;\n apiBaseUrl?: unknown;\n session?: unknown;\n data?: unknown;\n };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\"\n ? nested as typeof candidate\n : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\n \"The billing session endpoint did not return a browser session token.\",\n );\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\"\n ? { expiresAt: session.expiresAt }\n : {}),\n ...(typeof session.apiBaseUrl === \"string\"\n ? { apiBaseUrl: session.apiBaseUrl }\n : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (\n !data.bill\n || !data.patient\n || !data.injury\n || !data.lifecycle\n || !Array.isArray(data.lifecycle.actions)\n || !Array.isArray(data.eors)\n ) {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Browser-safe client for the complete bill lifecycle. The only long-lived\n * secret remains on the partner server; this client uses a short-lived,\n * origin-bound session scoped to one bill.\n */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") {\n throw new Error(\"A Fetch API implementation is required.\");\n }\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n\n const mintSession = async (\n signal: AbortSignal,\n force = false,\n ): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ billId, component: \"bill-review\", signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ billId, component: \"bill-review\" }),\n signal,\n }).then(async (response) => {\n if (!response.ok) {\n throw await responseError(\n response,\n \"The billing session could not be created.\",\n );\n }\n return response.json();\n });\n const request = Promise.resolve(pending)\n .then(normalizeSession)\n .then((nextSession) => {\n session = nextSession;\n return nextSession;\n })\n .finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (\n path: string,\n init: RequestInit = {},\n providedSignal?: AbortSignal,\n ): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(\"/embed/api/bill-lifecycle\", {}, signal);\n if (!response.ok) {\n throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n }\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const searchClaimsAdministrators = async (\n query: string,\n ): Promise<BillReviewPayer[]> => {\n const response = await request(\n `/embed/api/bill-review/payers?q=${encodeURIComponent(query)}`,\n );\n if (!response.ok) {\n throw await responseError(\n response,\n \"Claims administrator search is unavailable.\",\n );\n }\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) {\n throw new Error(\"Claims administrator search returned an invalid response.\");\n }\n return body.results.flatMap((value): BillReviewPayer[] => {\n if (!value || typeof value !== \"object\") return [];\n const payer = value as Partial<BillReviewPayer>;\n if (typeof payer.id !== \"string\" || typeof payer.name !== \"string\") {\n return [];\n }\n return [{\n id: payer.id,\n name: payer.name,\n ...(typeof payer.hasElectronic === \"boolean\"\n ? { hasElectronic: payer.hasElectronic }\n : {}),\n ...(Array.isArray(payer.states)\n ? { states: payer.states.filter((state): state is string => typeof state === \"string\") }\n : {}),\n }];\n });\n };\n\n const mutation = async (\n path: string,\n init: RequestInit,\n fallback: string,\n ) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n\n const action = async (\n input: Record<string, unknown>,\n fallback: string,\n ): Promise<BillLifecycleData> => {\n const response = await mutation(\n \"/embed/api/bill-lifecycle/actions\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n },\n fallback,\n );\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const saveReview = async (\n input: BillReviewSaveInput,\n ): Promise<BillLifecycleData> => {\n await mutation(\n \"/embed/api/bill-review\",\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n },\n \"Bill changes could not be saved.\",\n );\n return loadLifecycle();\n };\n\n return {\n clearSession() {\n session = null;\n sessionRequest = null;\n },\n getLifecycle: loadLifecycle,\n searchClaimsAdministrators,\n saveReview,\n async submitBill(input, route) {\n await saveReview(input);\n await mutation(\n \"/embed/api/bill-review/submit\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ route }),\n },\n \"Bill could not be submitted.\",\n );\n return loadLifecycle();\n },\n async addAttachment(file, documentType, description) {\n const body = new FormData();\n body.set(\"file\", file);\n body.set(\"documentType\", documentType);\n if (description) body.set(\"description\", description);\n await mutation(\n \"/embed/api/bill-review/attachments\",\n { method: \"POST\", body },\n \"Document could not be attached.\",\n );\n return loadLifecycle();\n },\n async removeAttachment(attachmentId) {\n await mutation(\n `/embed/api/bill-review/attachments/${encodeURIComponent(attachmentId)}`,\n { method: \"DELETE\" },\n \"Document could not be removed.\",\n );\n return loadLifecycle();\n },\n async getAttachment(attachmentId) {\n const response = await request(\n `/embed/api/bill-review/attachments/${encodeURIComponent(attachmentId)}`,\n );\n if (!response.ok) {\n throw await responseError(response, \"Document could not be opened.\");\n }\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(\n `/embed/api/bill-lifecycle/eor/${encodeURIComponent(documentId)}`,\n );\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n closeBill(input) {\n return action({ action: \"close\", ...input }, \"Bill could not be closed.\");\n },\n postPayment(input) {\n return action(\n { action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" },\n \"Payment could not be posted.\",\n );\n },\n submitSecondReview(input) {\n return action(\n { action: \"second_review\", ...input },\n \"Second Review could not be submitted.\",\n );\n },\n async startCorrection() {\n const response = await mutation(\n \"/embed/api/bill-lifecycle/actions\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"start_correction\" }),\n },\n \"Correction draft could not be created.\",\n );\n const body = await response.json() as {\n replacementBillId?: unknown;\n data?: unknown;\n };\n if (typeof body.replacementBillId !== \"string\") {\n throw new Error(\"The billing service did not return the correction bill ID.\");\n }\n return {\n replacementBillId: body.replacementBillId,\n data: normalizeLifecycle(body.data),\n };\n },\n };\n}\n\nfunction openPdf(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.download = filename;\n link.click();\n window.setTimeout(() => URL.revokeObjectURL(url), 60_000);\n}\n\nexport function useBillLifecycle({\n billId: providedBillId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n refreshInterval = DEFAULT_REFRESH_INTERVAL,\n enabled = true,\n initialData = null,\n onBillIdChange,\n fetch: fetchOverride,\n}: UseBillLifecycleOptions): UseBillLifecycleResult {\n const [billId, setBillId] = useState(providedBillId);\n const [data, setData] = useState<BillLifecycleData | null>(initialData);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(enabled && !initialData);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [isMutating, setIsMutating] = useState(false);\n const mounted = useRef(true);\n\n useEffect(() => {\n setBillId(providedBillId);\n setData(initialData);\n setError(null);\n }, [initialData, providedBillId]);\n\n const client = useMemo(() => createBillLifecycleClient({\n billId,\n sessionEndpoint,\n getSession,\n apiBaseUrl,\n fetch: fetchOverride,\n }), [apiBaseUrl, billId, fetchOverride, getSession, sessionEndpoint]);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n client.clearSession();\n };\n }, [client]);\n\n const refresh = useCallback(async () => {\n if (!enabled) return;\n setIsRefreshing(true);\n try {\n const next = await client.getLifecycle();\n if (!mounted.current) return;\n setData(next);\n setError(null);\n } catch (cause) {\n if (!mounted.current) return;\n setError(cause instanceof Error ? cause : new Error(\"Bill could not be loaded.\"));\n } finally {\n if (mounted.current) {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }\n }, [client, enabled]);\n\n useEffect(() => {\n if (!enabled) return;\n void refresh();\n const interval = refreshInterval > 0\n ? window.setInterval(() => void refresh(), refreshInterval)\n : null;\n const onFocus = () => void refresh();\n window.addEventListener(\"focus\", onFocus);\n return () => {\n if (interval) window.clearInterval(interval);\n window.removeEventListener(\"focus\", onFocus);\n };\n }, [enabled, refresh, refreshInterval]);\n\n const mutate = useCallback(async <T extends BillLifecycleData,>(\n task: () => Promise<T>,\n ): Promise<T> => {\n setIsMutating(true);\n setError(null);\n try {\n const next = await task();\n if (mounted.current) setData(next);\n return next;\n } catch (cause) {\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"The billing service could not complete this request.\");\n if (mounted.current) setError(nextError);\n throw nextError;\n } finally {\n if (mounted.current) setIsMutating(false);\n }\n }, []);\n\n const saveReview = useCallback(\n (input: BillReviewSaveInput) => mutate(() => client.saveReview(input)),\n [client, mutate],\n );\n const searchClaimsAdministrators = useCallback(\n (query: string) => client.searchClaimsAdministrators(query),\n [client],\n );\n const submitBill = useCallback(\n (input: BillReviewSaveInput, route: BillSubmissionRoute) =>\n mutate(() => client.submitBill(input, route)),\n [client, mutate],\n );\n const addAttachment = useCallback(\n (file: File, type: BillReviewDocumentType, description?: string) =>\n mutate(() => client.addAttachment(file, type, description)),\n [client, mutate],\n );\n const removeAttachment = useCallback(\n (attachmentId: string) => mutate(() => client.removeAttachment(attachmentId)),\n [client, mutate],\n );\n const closeBill = useCallback(\n (input: CloseBillInput) => mutate(() => client.closeBill(input)),\n [client, mutate],\n );\n const postPayment = useCallback(\n (input: PostBillPaymentInput) => mutate(() => client.postPayment(input)),\n [client, mutate],\n );\n const submitSecondReview = useCallback(\n (input: SubmitSecondReviewInput) =>\n mutate(() => client.submitSecondReview(input)),\n [client, mutate],\n );\n const startCorrection = useCallback(async () => {\n setIsMutating(true);\n setError(null);\n try {\n const result = await client.startCorrection();\n const previousBillId = billId;\n await onBillIdChange?.(result.replacementBillId, previousBillId);\n setBillId(result.replacementBillId);\n setData(result.data);\n return result.data;\n } catch (cause) {\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"Correction draft could not be created.\");\n setError(nextError);\n throw nextError;\n } finally {\n setIsMutating(false);\n }\n }, [billId, client, onBillIdChange]);\n const openAttachment = useCallback(async (attachment: BillReviewAttachment) => {\n openPdf(await client.getAttachment(attachment.id), attachment.filename);\n }, [client]);\n const openEor = useCallback(async (document: BillEorDocument) => {\n openPdf(await client.getEor(document.id), document.filename);\n }, [client]);\n\n return {\n billId,\n data,\n error,\n isLoading,\n isRefreshing,\n isMutating,\n refresh,\n searchClaimsAdministrators,\n saveReview,\n submitBill,\n addAttachment,\n removeAttachment,\n openAttachment,\n openEor,\n closeBill,\n postPayment,\n submitSecondReview,\n startCorrection,\n };\n}\n\nexport type ConnectedBillLifecycleProps = UseBillLifecycleOptions & {\n appearance?: MindBillAppearance;\n features?: BillReviewFeatures;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: (error: Error, retry: () => Promise<void>) => ReactNode;\n onChanged?: (data: BillLifecycleData) => void;\n};\n\ntype Panel = \"\" | \"correction\" | \"second_review\" | \"payment\" | \"close\";\n\nfunction dateInputValue(): string {\n const now = new Date();\n const offset = now.getTimezoneOffset() * 60_000;\n return new Date(now.getTime() - offset).toISOString().slice(0, 10);\n}\n\nfunction appearanceStyle(\n appearance: MindBillAppearance | undefined,\n style: CSSProperties | undefined,\n): CSSProperties {\n return {\n ...(appearance?.accentColor ? { \"--mb-accent\": appearance.accentColor } : {}),\n ...(appearance?.textColor ? { \"--mb-text\": appearance.textColor } : {}),\n ...(appearance?.mutedColor ? { \"--mb-muted\": appearance.mutedColor } : {}),\n ...(appearance?.borderColor ? { \"--mb-border\": appearance.borderColor } : {}),\n ...(appearance?.backgroundColor ? { \"--mb-soft\": appearance.backgroundColor } : {}),\n ...(appearance?.surfaceColor ? { \"--mb-surface\": appearance.surfaceColor } : {}),\n ...(appearance?.fontFamily ? { \"--mb-font\": appearance.fontFamily } : {}),\n ...style,\n } as CSSProperties;\n}\n\nfunction SupportingDocumentControl({\n disabled,\n onAdd,\n}: {\n disabled: boolean;\n onAdd: (\n file: File,\n type: BillReviewDocumentType,\n description?: string,\n ) => Promise<unknown>;\n}): ReactElement {\n const [file, setFile] = useState<File | null>(null);\n const [type, setType] = useState<BillReviewDocumentType>(\"appeal\");\n const [busy, setBusy] = useState(false);\n return <div className=\"mb-lifecycle-upload\">\n <select aria-label=\"Supporting document type\" value={type} disabled={disabled || busy} onChange={(event) => setType(event.target.value as BillReviewDocumentType)}>\n <option value=\"appeal\">Second Review support</option>\n <option value=\"final_report\">Final report</option>\n <option value=\"proof_of_service\">Proof of service</option>\n <option value=\"letter_of_attestation\">Letter of attestation</option>\n <option value=\"form_122\">DWC Form 122</option>\n <option value=\"w9\">W-9</option>\n <option value=\"other\">Other supporting document</option>\n </select>\n <input aria-label=\"Choose supporting PDF\" type=\"file\" accept=\"application/pdf,.pdf\" disabled={disabled || busy} onChange={(event) => setFile(event.target.files?.[0] ?? null)} />\n <button type=\"button\" className=\"mb-lifecycle-button secondary\" disabled={disabled || busy || !file} onClick={() => {\n if (!file) return;\n setBusy(true);\n void onAdd(file, type)\n .then(() => setFile(null))\n .catch(() => undefined)\n .finally(() => setBusy(false));\n }}>{busy ? \"Attaching…\" : \"Attach PDF\"}</button>\n </div>;\n}\n\nexport function ConnectedBillLifecycle({\n appearance,\n features,\n className,\n style,\n loadingFallback,\n errorFallback,\n onChanged,\n ...options\n}: ConnectedBillLifecycleProps): ReactElement {\n const lifecycle = useBillLifecycle(options);\n const { data } = lifecycle;\n const [panel, setPanel] = useState<Panel>(\"\");\n const [notice, setNotice] = useState(\"\");\n const [closeReason, setCloseReason] = useState(\"\");\n const [payment, setPayment] = useState<PostBillPaymentInput>({\n amount: 0,\n method: \"check\",\n checkNumber: \"\",\n depositDate: dateInputValue(),\n note: \"\",\n });\n const [review, setReview] = useState<SubmitSecondReviewInput>({\n reason: \"\",\n payerClaimControlNumber: \"\",\n disputedAmount: undefined,\n attachmentIds: [],\n route: \"ebill\",\n });\n const lastData = useRef<BillLifecycleData | null>(null);\n\n useEffect(() => {\n if (!data || data === lastData.current) return;\n lastData.current = data;\n onChanged?.(data);\n setPayment((current) => ({\n ...current,\n amount: current.amount > 0 ? current.amount : data.bill.balanceDue,\n }));\n setReview((current) => ({\n ...current,\n disputedAmount: current.disputedAmount ?? data.bill.balanceDue,\n attachmentIds: current.attachmentIds.length\n ? current.attachmentIds.filter((id) => data.bill.attachments.some((doc) => doc.id === id))\n : data.bill.attachments.map((doc) => doc.id),\n }));\n }, [data, onChanged]);\n\n if (lifecycle.isLoading && !data) {\n return <>{loadingFallback ?? <div className=\"mb-lifecycle-loading\">Loading billing…</div>}</>;\n }\n if (!data) {\n const error = lifecycle.error ?? new Error(\"Bill could not be loaded.\");\n return <>{errorFallback?.(error, lifecycle.refresh) ?? <div className=\"mb-lifecycle-error\" role=\"alert\"><strong>Billing is unavailable.</strong><span>{error.message}</span><button type=\"button\" onClick={() => void lifecycle.refresh()}>Try again</button></div>}</>;\n }\n\n const actionMap = new Map(data.lifecycle.actions.map((action) => [action.id, action]));\n const has = (id: BillLifecycleActionId) => actionMap.get(id);\n const selectPanel = (next: Panel) => {\n setNotice(\"\");\n setPanel((current) => current === next ? \"\" : next);\n };\n const complete = async (message: string, task: () => Promise<unknown>) => {\n setNotice(\"\");\n try {\n await task();\n setPanel(\"\");\n setNotice(message);\n } catch {\n // The hook keeps the actionable error visible in this component.\n }\n };\n const actionButtons = data.lifecycle.actions\n .filter((action) => action.id !== \"edit_and_submit\" && action.id !== \"view_eor\" && action.id !== \"independent_bill_review\")\n .map((action) => ({\n ...action,\n onClick: () => {\n if (!action.enabled) return;\n if (action.id === \"correct_and_resubmit\") selectPanel(\"correction\");\n if (action.id === \"second_review\") selectPanel(\"second_review\");\n if (action.id === \"post_payment\") selectPanel(\"payment\");\n if (action.id === \"close\") selectPanel(\"close\");\n },\n disabled: !action.enabled || lifecycle.isMutating,\n }));\n\n const canEditAndSubmit = Boolean(has(\"edit_and_submit\"));\n\n return <section className={[\"mb-connected-lifecycle\", className].filter(Boolean).join(\" \")} style={appearanceStyle(appearance, style)}>\n <style>{CONNECTED_LIFECYCLE_STYLES}</style>\n {canEditAndSubmit\n ? <BillReviewForm\n data={data}\n {...(appearance ? { appearance } : {})}\n {...(features ? { features } : {})}\n disabled={lifecycle.isMutating}\n onSearchClaimsAdministrators={lifecycle.searchClaimsAdministrators}\n onSave={lifecycle.saveReview}\n onSubmit={async (input, route) => { await complete(\"Bill submitted.\", () => lifecycle.submitBill(input, route)); }}\n onAddAttachment={async (file, type, description) => { await lifecycle.addAttachment(file, type, description); }}\n onRemoveAttachment={async (attachmentId) => { await lifecycle.removeAttachment(attachmentId); }}\n onOpenAttachment={(attachment) => void lifecycle.openAttachment(attachment).catch(() => undefined)}\n />\n : <BillStatusSummary\n status={data.lifecycle.state}\n submittedAt={data.lifecycle.submittedAt ?? null}\n agingDays={data.lifecycle.agingDays ?? null}\n updatedAt={data.lifecycle.updatedAt ?? null}\n totalCharge={data.bill.totalCharge}\n totalPaid={data.bill.totalPaid}\n balanceDue={data.bill.balanceDue}\n actions={actionButtons}\n {...(appearance ? { appearance } : {})}\n />}\n\n <div className=\"mb-lifecycle-toolbar\">\n <div>\n <strong>Bill #{data.bill.billNumber}</strong>\n <span>{lifecycle.isRefreshing ? \"Refreshing…\" : \"Status and actions update automatically.\"}</span>\n </div>\n <div className=\"mb-lifecycle-toolbar-actions\">\n {has(\"view_eor\") ? <button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => document.getElementById(`mb-eors-${data.bill.id}`)?.scrollIntoView({ behavior: \"smooth\", block: \"center\" })}>View EOR</button> : null}\n {canEditAndSubmit && has(\"close\") ? <button type=\"button\" className=\"mb-lifecycle-button quiet\" onClick={() => selectPanel(\"close\")}>Close bill</button> : null}\n </div>\n </div>\n\n {data.eors.length ? <section className=\"mb-lifecycle-card\" id={`mb-eors-${data.bill.id}`}>\n <header><div><h3>Explanation of Review</h3><p>Review the payer response and original PDF before posting payment.</p></div><span>{data.eors.length} PDF{data.eors.length === 1 ? \"\" : \"s\"}</span></header>\n <ul className=\"mb-lifecycle-documents\">{data.eors.map((eor) => <li key={eor.id}><div><strong>{eor.filename}</strong><span>{eor.description || `Added ${new Date(eor.addedAt).toLocaleDateString()}`}</span></div><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => void lifecycle.openEor(eor).catch(() => undefined)}>View PDF</button></li>)}</ul>\n </section> : null}\n\n {has(\"independent_bill_review\") ? <div className=\"mb-lifecycle-info\"><strong>{has(\"independent_bill_review\")?.label}</strong><span>{has(\"independent_bill_review\")?.reason}</span></div> : null}\n\n {panel === \"correction\" ? <section className=\"mb-lifecycle-panel\">\n <div><h3>Correct and resubmit</h3><p>A new correction draft will preserve this rejected bill in history. Review the copied values before submitting.</p></div>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating} onClick={() => void complete(\"Correction draft created.\", lifecycle.startCorrection)}>{lifecycle.isMutating ? \"Creating…\" : \"Create correction draft\"}</button></div>\n </section> : null}\n\n {panel === \"second_review\" ? <section className=\"mb-lifecycle-panel wide\">\n <div><h3>Submit Second Review</h3><p>State why payment is disputed, confirm the payer control number, and choose the supporting documents to send.</p></div>\n <div className=\"mb-lifecycle-fields two\">\n <label><span>Reason for Second Review</span><textarea required value={review.reason} onChange={(event) => setReview((current) => ({ ...current, reason: event.target.value }))} /></label>\n <div className=\"mb-lifecycle-fields\">\n <label><span>Payer claim control number</span><input required value={review.payerClaimControlNumber} onChange={(event) => setReview((current) => ({ ...current, payerClaimControlNumber: event.target.value }))} /></label>\n <label><span>Disputed amount</span><input type=\"number\" min=\"0.01\" step=\"0.01\" value={review.disputedAmount ?? \"\"} onChange={(event) => setReview((current) => ({ ...current, disputedAmount: event.target.value ? Number(event.target.value) : undefined }))} /></label>\n <label><span>Send via</span><select value={review.route} onChange={(event) => setReview((current) => ({ ...current, route: event.target.value as BillSubmissionRoute }))}><option value=\"ebill\">E-bill</option><option value=\"fax\">Fax</option><option value=\"mail\">Mail</option><option value=\"email\">Email</option></select></label>\n </div>\n </div>\n <fieldset className=\"mb-lifecycle-packet\"><legend>Supporting packet</legend>{data.bill.attachments.map((attachment) => <label key={attachment.id}><input type=\"checkbox\" checked={review.attachmentIds.includes(attachment.id)} onChange={(event) => setReview((current) => ({ ...current, attachmentIds: event.target.checked ? [...current.attachmentIds, attachment.id] : current.attachmentIds.filter((id) => id !== attachment.id) }))} /><span><strong>{attachment.filename}</strong><small>{attachment.description || attachment.documentType}</small></span><button type=\"button\" onClick={() => void lifecycle.openAttachment(attachment).catch(() => undefined)}>View</button><button type=\"button\" aria-label={`Remove ${attachment.filename}`} onClick={() => void lifecycle.removeAttachment(attachment.id).catch(() => undefined)}>×</button></label>)}</fieldset>\n <SupportingDocumentControl disabled={lifecycle.isMutating} onAdd={async (file, type, description) => {\n const next = await lifecycle.addAttachment(file, type, description);\n setReview((current) => ({\n ...current,\n attachmentIds: Array.from(new Set([\n ...current.attachmentIds,\n ...next.bill.attachments.map((attachment) => attachment.id),\n ])),\n }));\n }} />\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating || !review.reason.trim() || !review.payerClaimControlNumber.trim()} onClick={() => void complete(\"Second Review submitted.\", () => lifecycle.submitSecondReview(review))}>{lifecycle.isMutating ? \"Submitting…\" : \"Submit Second Review\"}</button></div>\n </section> : null}\n\n {panel === \"payment\" ? <section className=\"mb-lifecycle-panel\">\n <div><h3>Post payment</h3><p>Record funds shown on the EOR. The balance updates and the bill closes automatically when configured.</p></div>\n <div className=\"mb-lifecycle-fields two\">\n <label><span>Amount</span><input type=\"number\" min=\"0.01\" max={data.bill.balanceDue} step=\"0.01\" required value={payment.amount || \"\"} onChange={(event) => setPayment((current) => ({ ...current, amount: Number(event.target.value) }))} /></label>\n <label><span>Method</span><select value={payment.method} onChange={(event) => setPayment((current) => ({ ...current, method: event.target.value as \"check\" | \"eft\" }))}><option value=\"check\">Check</option><option value=\"eft\">EFT</option></select></label>\n <label><span>{payment.method === \"check\" ? \"Check number\" : \"EFT reference\"}</span><input value={payment.checkNumber} onChange={(event) => setPayment((current) => ({ ...current, checkNumber: event.target.value }))} /></label>\n <label><span>Deposit date</span><input type=\"date\" required value={payment.depositDate} onChange={(event) => setPayment((current) => ({ ...current, depositDate: event.target.value }))} /></label>\n <label className=\"full\"><span>Note <small>Optional</small></span><input value={payment.note} onChange={(event) => setPayment((current) => ({ ...current, note: event.target.value }))} /></label>\n </div>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button primary\" disabled={lifecycle.isMutating || payment.amount <= 0 || payment.amount > data.bill.balanceDue || !payment.depositDate} onClick={() => void complete(\"Payment posted.\", () => lifecycle.postPayment(payment))}>{lifecycle.isMutating ? \"Posting…\" : \"Post payment\"}</button></div>\n </section> : null}\n\n {panel === \"close\" ? <section className=\"mb-lifecycle-panel danger\">\n <div><h3>Close bill</h3><p>Closing removes this bill from active A/R. Any remaining balance will be written off and the original lifecycle is preserved.</p></div>\n <label><span>Reason for closing</span><textarea required value={closeReason} onChange={(event) => setCloseReason(event.target.value)} /></label>\n <div className=\"mb-lifecycle-panel-actions\"><button type=\"button\" className=\"mb-lifecycle-button secondary\" onClick={() => setPanel(\"\")}>Cancel</button><button type=\"button\" className=\"mb-lifecycle-button danger\" disabled={lifecycle.isMutating || !closeReason.trim()} onClick={() => void complete(\"Bill closed.\", () => lifecycle.closeBill({ reason: closeReason }))}>{lifecycle.isMutating ? \"Closing…\" : \"Close bill\"}</button></div>\n </section> : null}\n\n {notice ? <div className=\"mb-lifecycle-message success\" role=\"status\">{notice}</div> : null}\n {lifecycle.error ? <div className=\"mb-lifecycle-message error\" role=\"alert\">{lifecycle.error.message}</div> : null}\n </section>;\n}\n\nconst CONNECTED_LIFECYCLE_STYLES = `\n.mb-connected-lifecycle{--mb-accent:#238dbd;--mb-text:#203743;--mb-muted:#657982;--mb-border:#dbe6ea;--mb-soft:#f3f8fa;--mb-surface:#fff;display:grid;gap:14px;color:var(--mb-text);font:14px/1.45 var(--mb-font,Inter,ui-sans-serif,system-ui,sans-serif)}.mb-connected-lifecycle *{box-sizing:border-box}.mb-lifecycle-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 14px;border:1px solid var(--mb-border);border-radius:10px;background:var(--mb-surface)}.mb-lifecycle-toolbar>div:first-child{display:grid;gap:2px}.mb-lifecycle-toolbar span,.mb-lifecycle-card p,.mb-lifecycle-panel p,.mb-lifecycle-info span{color:var(--mb-muted)}.mb-lifecycle-toolbar-actions,.mb-lifecycle-panel-actions{display:flex;justify-content:flex-end;gap:8px}.mb-lifecycle-button{min-height:38px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);cursor:pointer;font:inherit;font-weight:750;padding:8px 13px}.mb-lifecycle-button.primary{border-color:var(--mb-accent);background:var(--mb-accent);color:#fff}.mb-lifecycle-button.quiet{border-color:transparent;background:transparent;color:var(--mb-muted)}.mb-lifecycle-button.danger{border-color:#b63d35;background:#b63d35;color:#fff}.mb-lifecycle-button:disabled{cursor:not-allowed;opacity:.5}.mb-lifecycle-card,.mb-lifecycle-panel{padding:18px;border:1px solid var(--mb-border);border-radius:12px;background:var(--mb-surface)}.mb-lifecycle-card header{display:flex;align-items:start;justify-content:space-between;gap:16px}.mb-lifecycle-card h3,.mb-lifecycle-panel h3{margin:0;font-size:18px}.mb-lifecycle-card p,.mb-lifecycle-panel p{margin:3px 0 0}.mb-lifecycle-card header>span{padding:5px 8px;border-radius:999px;background:var(--mb-soft);color:var(--mb-muted);font-size:11px;font-weight:800;text-transform:uppercase}.mb-lifecycle-documents{list-style:none;margin:12px 0 0;padding:0}.mb-lifecycle-documents li{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:11px 0;border-top:1px solid var(--mb-border)}.mb-lifecycle-documents li>div{display:grid}.mb-lifecycle-documents span{color:var(--mb-muted);font-size:12px}.mb-lifecycle-info{display:grid;gap:3px;padding:13px 15px;border:1px solid #cddfe5;border-radius:10px;background:var(--mb-soft)}.mb-lifecycle-panel{display:grid;gap:16px;box-shadow:0 14px 38px rgba(30,56,68,.08)}.mb-lifecycle-panel.danger{border-color:#ecc5c2}.mb-lifecycle-panel label{display:grid;gap:6px;font-size:12px;font-weight:750}.mb-lifecycle-panel label small{color:var(--mb-muted);font-size:inherit;font-weight:500}.mb-lifecycle-panel input,.mb-lifecycle-panel select,.mb-lifecycle-panel textarea,.mb-lifecycle-upload input,.mb-lifecycle-upload select{width:100%;min-height:42px;border:1px solid var(--mb-border);border-radius:8px;background:#fff;color:var(--mb-text);font:inherit;padding:9px 11px}.mb-lifecycle-panel textarea{min-height:100px;resize:vertical}.mb-lifecycle-fields{display:grid;gap:12px}.mb-lifecycle-fields.two{grid-template-columns:repeat(2,minmax(0,1fr))}.mb-lifecycle-fields .full{grid-column:1/-1}.mb-lifecycle-packet{display:grid;gap:0;margin:0;padding:0;border:0}.mb-lifecycle-packet legend{margin-bottom:7px;font-size:12px;font-weight:800}.mb-lifecycle-packet>label{display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:10px;padding:10px 2px;border-top:1px solid var(--mb-border)}.mb-lifecycle-packet>label>input{width:16px;min-height:16px}.mb-lifecycle-packet>label>span{display:grid}.mb-lifecycle-packet button{border:0;background:transparent;color:var(--mb-accent);cursor:pointer;font:inherit}.mb-lifecycle-upload{display:grid;grid-template-columns:220px 1fr auto;align-items:end;gap:10px;padding:12px;border-radius:9px;background:var(--mb-soft)}.mb-lifecycle-message,.mb-lifecycle-error,.mb-lifecycle-loading{padding:12px 14px;border-radius:9px}.mb-lifecycle-message.success{background:#edf9f2;color:#217449}.mb-lifecycle-message.error,.mb-lifecycle-error{background:#fff0ef;color:#9d3029}.mb-lifecycle-error{display:flex;align-items:center;gap:12px}.mb-lifecycle-error span{flex:1}.mb-lifecycle-error button{border:1px solid currentColor;border-radius:7px;background:transparent;color:inherit;padding:7px 10px}@media(max-width:760px){.mb-lifecycle-toolbar,.mb-lifecycle-card header{align-items:stretch;flex-direction:column}.mb-lifecycle-toolbar-actions,.mb-lifecycle-panel-actions{justify-content:start}.mb-lifecycle-fields.two,.mb-lifecycle-upload{grid-template-columns:1fr}.mb-lifecycle-documents li{align-items:start}.mb-lifecycle-packet>label{grid-template-columns:auto 1fr auto}}\n`;\n"],"mappings":"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","names":["useEffect","useRef","useEffect","useMemo","useState","jsx","jsxs","useMemo","useState","useEffect","useCallback","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","DEFAULT_API_BASE_URL","DEFAULT_SESSION_ENDPOINT","DEFAULT_REFRESH_INTERVAL","responseError","isSessionFresh","normalizeSession","request","useState","useRef","useEffect","useMemo","useCallback","document","appearanceStyle","useRef","useEffect"]}
|