@openrails/billing-ui 0.249.0 → 0.251.0
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/CHANGELOG.md +33 -0
- package/README.md +32 -14
- package/dist/account/account-billing.d.ts +2 -2
- package/dist/account/cancel-dialog.d.ts +2 -2
- package/dist/account/change-card-dialog.d.ts +2 -2
- package/dist/account/payment-history.d.ts +2 -2
- package/dist/account/payment-methods-panel.d.ts +2 -2
- package/dist/account/section.d.ts +2 -2
- package/dist/account/subscriptions-panel.d.ts +2 -2
- package/dist/admin/context.d.ts +2 -2
- package/dist/admin/lib/queries.d.ts +1 -1
- package/dist/admin/messages.d.ts +3 -3
- package/dist/admin/pages/catalog/psp-links.d.ts +1 -1
- package/dist/admin/theme.d.ts +2 -2
- package/dist/admin/types.d.ts +2 -2
- package/dist/{admin-attempts-lAoW-Urd.js → admin-attempts-DxRHTODq.js} +8 -8
- package/dist/{admin-attempts-lAoW-Urd.js.map → admin-attempts-DxRHTODq.js.map} +1 -1
- package/dist/{admin-auth-DQGHtt0j.js → admin-auth-CiuZ-Hlm.js} +2 -2
- package/dist/{admin-auth-DQGHtt0j.js.map → admin-auth-CiuZ-Hlm.js.map} +1 -1
- package/dist/{admin-badge-DR5-1qd8.js → admin-badge-VCGbnfiN.js} +2 -2
- package/dist/{admin-badge-DR5-1qd8.js.map → admin-badge-VCGbnfiN.js.map} +1 -1
- package/dist/{admin-button-CTL3DgOt.js → admin-button-Oip73Plq.js} +2 -2
- package/dist/{admin-button-CTL3DgOt.js.map → admin-button-Oip73Plq.js.map} +1 -1
- package/dist/{admin-capabilities-BuigAgtm.js → admin-capabilities-BGv7oG8v.js} +2 -2
- package/dist/{admin-capabilities-BuigAgtm.js.map → admin-capabilities-BGv7oG8v.js.map} +1 -1
- package/dist/{admin-card-bzAks3-3.js → admin-card-DGbi6ZHZ.js} +2 -2
- package/dist/{admin-card-bzAks3-3.js.map → admin-card-DGbi6ZHZ.js.map} +1 -1
- package/dist/{admin-catalog-CK6CM9I2.js → admin-catalog-3pPEAuDY.js} +19 -19
- package/dist/{admin-catalog-CK6CM9I2.js.map → admin-catalog-3pPEAuDY.js.map} +1 -1
- package/dist/{admin-customers-D8u5gq3M.js → admin-customers-cnKMEV4q.js} +6 -6
- package/dist/{admin-customers-D8u5gq3M.js.map → admin-customers-cnKMEV4q.js.map} +1 -1
- package/dist/{admin-dashboard-DqqFjOzq.js → admin-dashboard-DfSsUyo-.js} +14 -14
- package/dist/{admin-dashboard-DqqFjOzq.js.map → admin-dashboard-DfSsUyo-.js.map} +1 -1
- package/dist/{admin-data-table-qfXLOFmN.js → admin-data-table-CgeWv__T.js} +6 -6
- package/dist/{admin-data-table-qfXLOFmN.js.map → admin-data-table-CgeWv__T.js.map} +1 -1
- package/dist/{admin-detail-X82kR2f7.js → admin-detail-BATuJjVs.js} +12 -12
- package/dist/{admin-detail-X82kR2f7.js.map → admin-detail-BATuJjVs.js.map} +1 -1
- package/dist/{admin-detail-DUAJQg8G.js → admin-detail-Cq59e14B.js} +15 -15
- package/dist/{admin-detail-DUAJQg8G.js.map → admin-detail-Cq59e14B.js.map} +1 -1
- package/dist/{admin-detail-BHe51ma9.js → admin-detail-DG-YaHhS.js} +11 -11
- package/dist/{admin-detail-BHe51ma9.js.map → admin-detail-DG-YaHhS.js.map} +1 -1
- package/dist/{admin-detail-CGOyqs7s.js → admin-detail-Dc7rU4mM.js} +15 -15
- package/dist/{admin-detail-CGOyqs7s.js.map → admin-detail-Dc7rU4mM.js.map} +1 -1
- package/dist/{admin-dialog-BjuKI5Hp.js → admin-dialog-Ffx95AIT.js} +3 -3
- package/dist/{admin-dialog-BjuKI5Hp.js.map → admin-dialog-Ffx95AIT.js.map} +1 -1
- package/dist/{admin-dom-uMmZzRvU.js → admin-dom-lnNSQ7ke.js} +4 -4
- package/dist/{admin-dom-uMmZzRvU.js.map → admin-dom-lnNSQ7ke.js.map} +1 -1
- package/dist/{admin-dropdown-menu-BW1D_h6s.js → admin-dropdown-menu-CCiW4-oz.js} +2 -2
- package/dist/{admin-dropdown-menu-BW1D_h6s.js.map → admin-dropdown-menu-CCiW4-oz.js.map} +1 -1
- package/dist/{admin-fact-card-DO_fHosg.js → admin-fact-card-D6mZgxpN.js} +2 -2
- package/dist/{admin-fact-card-DO_fHosg.js.map → admin-fact-card-D6mZgxpN.js.map} +1 -1
- package/dist/{admin-health-B4jN2LwR.js → admin-health-CvJX9prw.js} +13 -13
- package/dist/{admin-health-B4jN2LwR.js.map → admin-health-CvJX9prw.js.map} +1 -1
- package/dist/{admin-input-CcfQfJFN.js → admin-input-DO5lvCLL.js} +2 -2
- package/dist/{admin-input-CcfQfJFN.js.map → admin-input-DO5lvCLL.js.map} +1 -1
- package/dist/{admin-label-BiEN5cjb.js → admin-label-BzJpr3lg.js} +2 -2
- package/dist/{admin-label-BiEN5cjb.js.map → admin-label-BzJpr3lg.js.map} +1 -1
- package/dist/{admin-linked-table-row-BsaUruCN.js → admin-linked-table-row-5vFb6rXY.js} +4 -4
- package/dist/{admin-linked-table-row-BsaUruCN.js.map → admin-linked-table-row-5vFb6rXY.js.map} +1 -1
- package/dist/{admin-metering-COFcSPQy.js → admin-metering-BksTFRRP.js} +14 -14
- package/dist/{admin-metering-COFcSPQy.js.map → admin-metering-BksTFRRP.js.map} +1 -1
- package/dist/{admin-ops-B3mcr76u.js → admin-ops-Ch2-BmUp.js} +11 -11
- package/dist/{admin-ops-B3mcr76u.js.map → admin-ops-Ch2-BmUp.js.map} +1 -1
- package/dist/{admin-orders-dxC99Idl.js → admin-orders-8XzHf7b-.js} +8 -8
- package/dist/{admin-orders-dxC99Idl.js.map → admin-orders-8XzHf7b-.js.map} +1 -1
- package/dist/{admin-payments-Bs7HSfP0.js → admin-payments-pNLNIU0X.js} +9 -9
- package/dist/{admin-payments-Bs7HSfP0.js.map → admin-payments-pNLNIU0X.js.map} +1 -1
- package/dist/{admin-price-detail-DRquxpA9.js → admin-price-detail-BeGDPxKX.js} +11 -11
- package/dist/admin-price-detail-BeGDPxKX.js.map +1 -0
- package/dist/{admin-price-wizard-CI7K-2Nz.js → admin-price-wizard-ferZSTfO.js} +7 -7
- package/dist/{admin-price-wizard-CI7K-2Nz.js.map → admin-price-wizard-ferZSTfO.js.map} +1 -1
- package/dist/{admin-range-picker-Dr2M1EZr.js → admin-range-picker-DaIvC1oC.js} +5 -5
- package/dist/{admin-range-picker-Dr2M1EZr.js.map → admin-range-picker-DaIvC1oC.js.map} +1 -1
- package/dist/{admin-reports-CywKLiSA.js → admin-reports-CA-cnNur.js} +8 -8
- package/dist/{admin-reports-CywKLiSA.js.map → admin-reports-CA-cnNur.js.map} +1 -1
- package/dist/{admin-select-DBgprVW6.js → admin-select-CUXvh6j1.js} +2 -2
- package/dist/{admin-select-DBgprVW6.js.map → admin-select-CUXvh6j1.js.map} +1 -1
- package/dist/{admin-settings-Bmoy95uO.js → admin-settings-C6eWFkDn.js} +16 -16
- package/dist/{admin-settings-Bmoy95uO.js.map → admin-settings-C6eWFkDn.js.map} +1 -1
- package/dist/{admin-skeleton-DsM7crYi.js → admin-skeleton-DEY3Q8Dg.js} +2 -2
- package/dist/{admin-skeleton-DsM7crYi.js.map → admin-skeleton-DEY3Q8Dg.js.map} +1 -1
- package/dist/{admin-status-badge-BFPgo71d.js → admin-status-badge-CwqIU8tK.js} +2 -2
- package/dist/{admin-status-badge-BFPgo71d.js.map → admin-status-badge-CwqIU8tK.js.map} +1 -1
- package/dist/{admin-subscriptions-CLYc_HEV.js → admin-subscriptions-lJG_EzMe.js} +9 -9
- package/dist/{admin-subscriptions-CLYc_HEV.js.map → admin-subscriptions-lJG_EzMe.js.map} +1 -1
- package/dist/{admin-switch-BJUxLCsa.js → admin-switch-S4g_ppaU.js} +2 -2
- package/dist/{admin-switch-BJUxLCsa.js.map → admin-switch-S4g_ppaU.js.map} +1 -1
- package/dist/{admin-table-CH9TrXJf.js → admin-table-CWhiCb9d.js} +2 -2
- package/dist/{admin-table-CH9TrXJf.js.map → admin-table-CWhiCb9d.js.map} +1 -1
- package/dist/{admin-tabs-528FJMjt.js → admin-tabs-Cjm5a6UJ.js} +2 -2
- package/dist/{admin-tabs-528FJMjt.js.map → admin-tabs-Cjm5a6UJ.js.map} +1 -1
- package/dist/{admin-textarea-DEz38RaI.js → admin-textarea-DK1Fq31x.js} +2 -2
- package/dist/{admin-textarea-DEz38RaI.js.map → admin-textarea-DK1Fq31x.js.map} +1 -1
- package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js → admin-typed-confirm-dialog-BloZvFPA.js} +6 -6
- package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js.map → admin-typed-confirm-dialog-BloZvFPA.js.map} +1 -1
- package/dist/{admin-utils-BK4Vh1o_.js → admin-utils-DnVY5fYd.js} +3 -3
- package/dist/admin-utils-DnVY5fYd.js.map +1 -0
- package/dist/{admin-widget-viz-Da48c-Zf.js → admin-widget-viz-RCkxUspL.js} +8 -8
- package/dist/{admin-widget-viz-Da48c-Zf.js.map → admin-widget-viz-RCkxUspL.js.map} +1 -1
- package/dist/admin.js +31 -31
- package/dist/admin.js.map +1 -1
- package/dist/appearance.d.ts +7 -7
- package/dist/buy-button.d.ts +3 -3
- package/dist/cart.d.ts +4 -4
- package/dist/client/client.d.ts +4 -4
- package/dist/client/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/routes.d.ts +6 -6
- package/dist/client/generated/wire.d.ts +38 -40
- package/dist/client/types.d.ts +18 -17
- package/dist/{client-rFrCMrkn.js → client-imFR1UCe.js} +91 -92
- package/dist/client-imFR1UCe.js.map +1 -0
- package/dist/client.js +2 -2
- package/dist/embedded-payment.d.ts +25 -0
- package/dist/hooks-C9JkHcRt.js +553 -0
- package/dist/hooks-C9JkHcRt.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +768 -735
- package/dist/index.js.map +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +1 -1
- package/dist/locales/en.js +1 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +1 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/modal.d.ts +8 -8
- package/dist/{order-checkout.d.ts → order-payment.d.ts} +4 -4
- package/dist/product-list.d.ts +3 -3
- package/dist/psp.d.ts +2 -2
- package/dist/react/config.d.ts +12 -3
- package/dist/react/provider.d.ts +17 -4
- package/dist/react.js +1 -1
- package/dist/save-payment-method.d.ts +2 -2
- package/dist/scope-context.d.ts +4 -4
- package/dist/scope.d.ts +2 -2
- package/dist/tokenized-card-form.d.ts +2 -2
- package/docs/payment-form-contract.md +3 -3
- package/package.json +2 -2
- package/dist/admin-price-detail-DRquxpA9.js.map +0 -1
- package/dist/admin-utils-BK4Vh1o_.js.map +0 -1
- package/dist/client-rFrCMrkn.js.map +0 -1
- package/dist/embedded-checkout.d.ts +0 -25
- package/dist/hooks-B1TffejB.js +0 -537
- package/dist/hooks-B1TffejB.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-detail-CGOyqs7s.js","names":[],"sources":["../src/admin/pages/customers/invoice-profile.tsx","../src/admin/pages/customers/default-card-badges.tsx","../src/admin/pages/customers/credit-form.ts","../src/admin/pages/customers/credits.tsx","../src/admin/pages/customers/grant-duration.ts","../src/admin/pages/customers/detail.tsx"],"sourcesContent":["import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport { useState } from \"react\"\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\"\nimport { Link } from \"#orck/admin/router\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\n\nimport type { InvoiceProfile } from \"#orck/client/generated/wire\"\nimport {\n invoiceProfileValues,\n invoiceProfileRequest,\n type ProfileFormValues,\n} from \"./invoice-profile-model\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nexport function CustomerInvoiceProfileSection({\n customerId,\n}: {\n customerId: string\n}) {\n const { orderQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const query = useQuery(orderQueries.profile(customerId))\n return (\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Invoice profile\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <Link\n className=\"text-sm underline\"\n to={`/orders?customer_id=${customerId}&origin=usage`}\n >\n <AdminMessage id={\"View customer usage orders\"} />\n </Link>\n {query.isPending ? (\n <p>\n <AdminMessage id={\"Loading invoice profile…\"} />\n </p>\n ) : query.error ? (\n <p role=\"alert\" className=\"text-destructive\">\n {query.error.message}\n </p>\n ) : (\n <InvoiceProfileEditor\n key={customerId}\n customerId={customerId}\n profile={query.data}\n readOnly={!canUpdate}\n />\n )}\n </CardContent>\n </Card>\n )\n}\n// A customer without a profile edits an empty one; saving creates it.\nexport function InvoiceProfileEditor({\n customerId,\n profile,\n readOnly = false,\n}: {\n customerId: string\n profile: InvoiceProfile | null\n // readOnly shows the profile to staff who may not change it.\n readOnly?: boolean\n}) {\n const { id: adminId, text: adminText } = useAdminUI()\n\n const { invoiceProfileMutation } = useAdminServices()\n\n const [values, setValues] = useState(() => invoiceProfileValues(profile))\n const [error, setError] = useState<string | null>(null)\n const [saved, setSaved] = useState(false)\n const client = useQueryClient(),\n mutation = useMutation(invoiceProfileMutation(client, customerId))\n const update = (patch: Partial<ProfileFormValues>) => {\n setValues((old) => ({ ...old, ...patch }))\n setSaved(false)\n }\n async function save() {\n setError(null)\n setSaved(false)\n try {\n await mutation.mutateAsync(invoiceProfileRequest(values, profile))\n setSaved(true)\n } catch (failure) {\n setError(\n failure instanceof Error\n ? failure.message\n : \"Invoice profile update failed.\"\n )\n }\n }\n return (\n <form\n className=\"mt-4 space-y-4\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!mutation.isPending) void save()\n }}\n >\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage\n id={\n \"Terms and billing facts for future usage orders. Billed orders keep their original snapshots. Tax details are recorded; no tax is calculated.\"\n }\n />\n </p>\n <fieldset disabled={readOnly || mutation.isPending} className=\"space-y-4\">\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <Label htmlFor={adminId(\"invoice-profile-terms\")}>\n <AdminMessage id={\"Payment terms (days)\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-terms\")}\n type=\"number\"\n min={0}\n step={1}\n value={values.terms}\n onChange={(e) => update({ terms: e.target.value })}\n />\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-method\")}>\n <AdminMessage id={\"Collection method\"} />\n </Label>\n <select\n id={adminId(\"invoice-profile-method\")}\n className=\"h-9 w-full rounded-md border bg-background px-2\"\n value={values.method}\n onChange={(e) =>\n update({\n method: e.target.value as ProfileFormValues[\"method\"],\n })\n }\n >\n <option value=\"charge_automatically\">\n <AdminMessage id={\"Saved payment method\"} />\n </option>\n <option value=\"send_invoice\">\n <AdminMessage id={\"Manual remittance\"} />\n </option>\n </select>\n </div>\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-po\")}>\n <AdminMessage id={\"Purchase order\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-po\")}\n value={values.po}\n onChange={(e) => update({ po: e.target.value })}\n />\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-memo\")}>\n <AdminMessage id={\"Invoice memo\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-memo\")}\n value={values.memo}\n onChange={(e) => update({ memo: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n <AdminMessage id={\"Billing contacts\"} />\n </p>\n {values.contacts.map((contact, i) => (\n <div key={i} className=\"flex gap-2\">\n <Input\n aria-label={`Contact ${i + 1} name`}\n placeholder={adminText(\"Name\")}\n value={contact.name}\n onChange={(e) =>\n update({\n contacts: values.contacts.map((c, index) =>\n index === i ? { ...c, name: e.target.value } : c\n ),\n })\n }\n />\n <Input\n aria-label={`Contact ${i + 1} email`}\n type=\"email\"\n placeholder={adminText(\"Email\")}\n value={contact.email}\n onChange={(e) =>\n update({\n contacts: values.contacts.map((c, index) =>\n index === i ? { ...c, email: e.target.value } : c\n ),\n })\n }\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n aria-label={`Remove contact ${i + 1}`}\n onClick={() =>\n update({\n contacts: values.contacts.filter((_, index) => index !== i),\n })\n }\n >\n <AdminMessage id={\"Remove\"} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() =>\n update({\n contacts: [...values.contacts, { name: \"\", email: \"\" }],\n })\n }\n >\n <AdminMessage id={\"Add contact\"} />\n </Button>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n <AdminMessage id={\"Tax details\"} />\n </p>\n {values.tax.map((row, i) => (\n <div key={i} className=\"flex gap-2\">\n <Input\n aria-label={`Tax detail ${i + 1} name`}\n placeholder={adminText(\"Name, such as tax_id\")}\n value={row.key}\n onChange={(e) =>\n update({\n tax: values.tax.map((r, index) =>\n index === i ? { ...r, key: e.target.value } : r\n ),\n })\n }\n />\n <Input\n aria-label={`Tax detail ${i + 1} value`}\n placeholder={adminText(\"Value\")}\n value={row.value}\n onChange={(e) =>\n update({\n tax: values.tax.map((r, index) =>\n index === i ? { ...r, value: e.target.value } : r\n ),\n })\n }\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n aria-label={`Remove tax detail ${i + 1}`}\n onClick={() =>\n update({ tax: values.tax.filter((_, index) => index !== i) })\n }\n >\n <AdminMessage id={\"Remove\"} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() =>\n update({ tax: [...values.tax, { key: \"\", value: \"\" }] })\n }\n >\n <AdminMessage id={\"Add tax detail\"} />\n </Button>\n </div>\n </fieldset>\n {error && (\n <p role=\"alert\" className=\"text-destructive\">\n {error}\n </p>\n )}\n {saved && (\n <p role=\"status\" className=\"text-sm\">\n <AdminMessage\n id={\"Invoice profile saved. Billed orders were not changed.\"}\n />\n </p>\n )}\n {!readOnly && (\n <Button type=\"submit\" disabled={mutation.isPending}>\n {mutation.isPending ? \"Saving…\" : \"Save invoice profile\"}\n </Button>\n )}\n </form>\n )\n}\n","import { AdminMessage } from \"#orck/admin/ui-context\"\nimport { Badge } from \"#orck/admin/components/ui/badge\"\n\n// The currencies the card is the customer's default for: it pays their\n// usage orders there and every subscription without a card of its own.\nexport function DefaultCardBadges({\n currencies = [],\n}: {\n currencies?: string[]\n}) {\n return (\n <>\n {currencies.map((currency) => (\n <Badge key={currency} variant=\"secondary\" className=\"mt-1 mr-1\">\n <AdminMessage id={\"Default · \"} />\n {currency}\n </Badge>\n ))}\n </>\n )\n}\n","import type {\n CreditGrant,\n CreditGrantInput,\n} from \"#orck/admin/lib/api/credit-types\"\nimport { amountFromInput } from \"#orck/admin/lib/format\"\n\nexport function creditGrantInput(\n input: {\n amount: string\n decimals: number\n currency: string\n expires: string\n description: string\n sourceID: string\n },\n now = Date.now()\n): CreditGrantInput {\n const amount = amountFromInput(input.amount, input.decimals)\n if (amount === null || BigInt(amount) <= 0n)\n throw new Error(\n `Enter a positive amount with at most ${input.decimals} decimal places, within the supported range.`\n )\n const currency = input.currency.trim()\n if (!currency) throw new Error(\"Select a currency.\")\n let expires: string | undefined\n if (input.expires) {\n const time = new Date(input.expires).getTime()\n if (!Number.isFinite(time) || time <= now)\n throw new Error(\"Expiry must be a valid future date.\")\n expires = new Date(time).toISOString()\n }\n return {\n amount,\n currency,\n source: \"admin\",\n source_id: input.sourceID,\n expires_at: expires,\n description: input.description.trim() || undefined,\n }\n}\n\nexport function canRevokeCredit(grant: CreditGrant): boolean {\n return (\n (grant.state === \"active\" || grant.state === \"scheduled\") &&\n /^\\d+$/.test(grant.remaining_amount) &&\n BigInt(grant.remaining_amount) > 0n\n )\n}\n\nexport function creditRevokeInput(grant: CreditGrant, reason: string) {\n if (!canRevokeCredit(grant))\n throw new Error(\"This grant has no remaining credit to revoke.\")\n reason = reason.trim()\n if (!reason || reason.length > 500)\n throw new Error(\"Enter a reason of up to 500 characters.\")\n return { grant: grant.id, reason }\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport * as React from \"react\"\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\"\n\nimport { useAuth } from \"#orck/admin/lib/auth\"\n\nimport type { CreditGrant } from \"#orck/admin/lib/api/credit-types\"\nimport {\n currencyScale,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport {\n canRevokeCredit,\n creditGrantInput,\n creditRevokeInput,\n} from \"./credit-form\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nconst errorText = (error: unknown) =>\n error instanceof Error ? error.message : \"The request failed. Try again.\"\n\nexport function CustomerCreditSupportSection({\n customerId,\n currencies,\n}: {\n customerId: string\n currencies: string[]\n}) {\n const { activeMerchant } = useAuth()\n const merchant = activeMerchant?.slug ?? \"\"\n return (\n <CreditSupport\n key={`${merchant}:${customerId}`}\n merchant={merchant}\n customer={customerId}\n initialCurrency={currencies[0] ?? \"USD\"}\n />\n )\n}\n\nfunction CreditSupport({\n merchant,\n customer,\n initialCurrency,\n}: {\n merchant: string\n customer: string\n initialCurrency: string\n}) {\n const { id: adminId, text: adminText } = useAdminUI()\n\n const { creditQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const [currency, setCurrency] = React.useState(initialCurrency)\n const [currencyInput, setCurrencyInput] = React.useState(initialCurrency)\n const grantPages = useCursorPages(currency, 25)\n const ledgerPages = useCursorPages(currency, 25)\n const [granting, setGranting] = React.useState(false)\n const [revokeGrant, setRevokeGrant] = React.useState<CreditGrant | null>(null)\n const grants = useQuery(\n creditQueries.grants(\n merchant,\n customer,\n currency,\n grantPages.size,\n grantPages.cursor\n )\n )\n const ledger = useQuery(\n creditQueries.transactions(\n merchant,\n customer,\n currency,\n ledgerPages.size,\n ledgerPages.cursor\n )\n )\n const decimals = currencyScale(currency)\n\n return (\n <Card>\n <CardHeader className=\"gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Credits\"} />\n </CardTitle>\n {canUpdate && (\n <Button\n size=\"sm\"\n disabled={decimals === undefined}\n onClick={() => setGranting(true)}\n >\n <AdminMessage id={\"Grant credit\"} />\n </Button>\n )}\n </div>\n <form\n className=\"flex max-w-sm items-end gap-2\"\n onSubmit={(event) => {\n event.preventDefault()\n const value = currencyInput.trim()\n if (value) setCurrency(value.toUpperCase())\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"credit-currency\")}>\n <AdminMessage id={\"Currency\"} />\n </Label>\n <Input\n id={adminId(\"credit-currency\")}\n value={currencyInput}\n onChange={(e) => setCurrencyInput(e.target.value)}\n placeholder={adminText(\"USD\")}\n />\n </div>\n <Button type=\"submit\" variant=\"outline\" size=\"sm\">\n <AdminMessage id={\"View\"} />\n </Button>\n </form>\n {decimals === undefined && (\n <p className=\"text-xs text-muted-foreground\">\n {currency}\n <AdminMessage id={\" is not a supported currency.\"} />\n </p>\n )}\n </CardHeader>\n <CardContent className=\"grid gap-6\">\n <section aria-label={adminText(\"Credit grants\")}>\n <h3 className=\"mb-2 text-sm font-medium\">\n <AdminMessage id={\"Grants · \"} />\n {currency}\n </h3>\n {grants.isPending ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading grants…\"} />\n </p>\n ) : grants.error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {errorText(grants.error)}\n </p>\n ) : !grants.data?.data.length ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No credit grants in this currency.\"} />\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n <AdminMessage id={\"Grant\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Original\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Remaining\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Spent\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Expired\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Revoked\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"State\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Expires\"} />\n </TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {grants.data.data.map((grant) => (\n <TableRow key={grant.id}>\n <TableCell>\n <span title={grant.id}>{shortId(grant.id)}</span>\n <div className=\"text-xs text-muted-foreground\">\n {formatDate(grant.created_at)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {grant.description ?? grant.source_type}\n </div>\n </TableCell>\n {[\n grant.amount,\n grant.remaining_amount,\n grant.spent_amount,\n grant.expired_amount,\n grant.revoked_amount,\n ].map((amount, index) => (\n <TableCell key={index} className=\"tabular-nums\">\n {formatNativeAmount(amount, grant.currency)}\n </TableCell>\n ))}\n <TableCell>{grant.state}</TableCell>\n <TableCell>\n {grant.expires_at\n ? formatDate(grant.expires_at)\n : \"No expiry\"}\n </TableCell>\n <TableCell>\n {canUpdate && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={!canRevokeCredit(grant)}\n onClick={() => setRevokeGrant(grant)}\n >\n <AdminMessage id={\"Revoke\"} />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n <CursorPager\n pages={grantPages}\n rows={grants.data?.data?.length ?? 0}\n nextCursor={grants.data?.next_cursor}\n busy={grants.isFetching}\n />\n </section>\n <section aria-label={adminText(\"Credit transaction ledger\")}>\n <h3 className=\"mb-2 text-sm font-medium\">\n <AdminMessage id={\"Transaction ledger · \"} />\n {currency}\n </h3>\n {ledger.isPending ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading transactions…\"} />\n </p>\n ) : ledger.error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {errorText(ledger.error)}\n </p>\n ) : !ledger.data?.data.length ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No transactions in this currency.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n <AdminMessage id={\"Date\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Type\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Amount\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Source\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {ledger.data.data.map((tx) => (\n <TableRow key={tx.id}>\n <TableCell title={tx.id}>\n {formatDate(tx.created_at)}\n </TableCell>\n <TableCell>{tx.type.replaceAll(\"_\", \" \")}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatNativeAmount(tx.amount, tx.currency)}\n </TableCell>\n <TableCell>{tx.source || \"—\"}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={ledgerPages}\n rows={ledger.data?.data?.length ?? 0}\n nextCursor={ledger.data?.next_cursor}\n busy={ledger.isFetching}\n />\n </section>\n </CardContent>\n {granting && decimals !== undefined && (\n <GrantCreditDialog\n merchant={merchant}\n customer={customer}\n currency={currency}\n decimals={decimals}\n onClose={() => setGranting(false)}\n />\n )}\n {revokeGrant && (\n <RevokeCreditDialog\n merchant={merchant}\n customer={customer}\n grant={revokeGrant}\n onClose={() => setRevokeGrant(null)}\n />\n )}\n </Card>\n )\n}\n\nfunction GrantCreditDialog({\n merchant,\n customer,\n currency,\n decimals,\n onClose,\n}: {\n merchant: string\n customer: string\n currency: string\n decimals: number\n onClose: () => void\n}) {\n const { toast, creditMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const client = useQueryClient()\n const mutation = useMutation(\n creditMutations.grant(client, merchant, customer)\n )\n const [amount, setAmount] = React.useState(\"\")\n const [expires, setExpires] = React.useState(\"\")\n const [description, setDescription] = React.useState(\"\")\n const [sourceID] = React.useState(() => crypto.randomUUID())\n const [error, setError] = React.useState(\"\")\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !mutation.isPending) onClose()\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Grant credit\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage id={\"Add credit in \"} />\n {currency}\n <AdminMessage id={\" to this customer.\"} />\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"grid gap-4\"\n onSubmit={async (e) => {\n e.preventDefault()\n setError(\"\")\n try {\n const body = creditGrantInput({\n amount,\n currency,\n decimals,\n expires,\n description,\n sourceID,\n })\n await mutation.mutateAsync(body)\n toast.success(\"Credit granted\")\n onClose()\n } catch (error) {\n setError(errorText(error))\n }\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-amount\")}>\n <AdminMessage id={\"Amount (\"} />\n {currency})\n </Label>\n <Input\n id={adminId(\"grant-amount\")}\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n autoFocus\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-expiry\")}>\n <AdminMessage id={\"Expires (optional)\"} />\n </Label>\n <Input\n id={adminId(\"grant-expiry\")}\n type=\"datetime-local\"\n value={expires}\n onChange={(e) => setExpires(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-description\")}>\n <AdminMessage id={\"Description (optional)\"} />\n </Label>\n <Input\n id={adminId(\"grant-description\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n maxLength={500}\n />\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={mutation.isPending}\n onClick={onClose}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button type=\"submit\" disabled={mutation.isPending}>\n {mutation.isPending ? \"Granting…\" : \"Grant credit\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction RevokeCreditDialog({\n merchant,\n customer,\n grant,\n onClose,\n}: {\n merchant: string\n customer: string\n grant: CreditGrant\n onClose: () => void\n}) {\n const { toast, creditMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const client = useQueryClient()\n const mutation = useMutation(\n creditMutations.revoke(client, merchant, customer)\n )\n const [reason, setReason] = React.useState(\"\")\n const [error, setError] = React.useState(\"\")\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !mutation.isPending) onClose()\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Revoke remaining credit\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage id={\"Revoke the unspent remainder of\"} />{\" \"}\n {formatNativeAmount(grant.remaining_amount, grant.currency)}\n <AdminMessage\n id={\n \". Active holds may prevent revocation. Payment refunds are managed separately.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"grid gap-4\"\n onSubmit={async (e) => {\n e.preventDefault()\n setError(\"\")\n try {\n const result = await mutation.mutateAsync(\n creditRevokeInput(grant, reason)\n )\n toast.success(\n result.replayed\n ? \"Credit was already revoked\"\n : `${formatNativeAmount(result.revoked_amount, result.currency)} revoked`\n )\n onClose()\n } catch (error) {\n setError(errorText(error))\n }\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"revoke-reason\")}>\n <AdminMessage id={\"Reason\"} />\n </Label>\n <Input\n id={adminId(\"revoke-reason\")}\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n maxLength={500}\n autoFocus\n />\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={mutation.isPending}\n onClick={onClose}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n type=\"submit\"\n variant=\"destructive\"\n disabled={!canRevokeCredit(grant) || mutation.isPending}\n >\n {mutation.isPending ? \"Revoking…\" : \"Revoke credit\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","// How long a product-access grant lasts: a preset number of days (added after\n// any access the customer already has), until a date, or forever.\n\n// MAX_GRANT_HOURS is the longest grant the API takes: the most hours a Go\n// time.Duration holds.\nexport const MAX_GRANT_HOURS = 2_562_047\n\nexport const GRANT_DURATIONS = [\n { value: \"1\", label: \"1 day\", days: 1 },\n { value: \"7\", label: \"7 days\", days: 7 },\n { value: \"30\", label: \"30 days\", days: 30 },\n { value: \"365\", label: \"365 days\", days: 365 },\n { value: \"until\", label: \"Until a date\" },\n { value: \"never\", label: \"Never expires\" },\n] as const\n\nexport type GrantDuration = (typeof GRANT_DURATIONS)[number][\"value\"]\n\nexport const DEFAULT_GRANT_DURATION: GrantDuration = \"30\"\n\nexport type GrantTerm = { hours: number } | { endsAt: string } | object\n\nconst today = (now: Date) => now.toISOString().slice(0, 10)\n\n// grantTerm is what the grant request carries for a choice. A date ends the\n// grant at the close of that UTC day, sent as an instant.\nexport function grantTerm(\n choice: GrantDuration,\n until: string,\n now = new Date()\n): GrantTerm | null {\n if (choice === \"never\") return {}\n if (choice === \"until\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(until) || until < today(now)) return null\n const end = new Date(`${until}T00:00:00Z`)\n end.setUTCDate(end.getUTCDate() + 1)\n return { endsAt: end.toISOString() }\n }\n const preset = GRANT_DURATIONS.find((d) => d.value === choice)\n return preset && \"days\" in preset ? { hours: preset.days * 24 } : null\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminContext, useAdminServices } from \"#orck/admin/context\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Add01Icon,\n ArrowLeft01Icon,\n Delete02Icon,\n} from \"@hugeicons/core-free-icons\"\nimport * as React from \"react\"\nimport { Link, useNavigate, useParams } from \"#orck/admin/router\"\n\nimport { useForm } from \"@tanstack/react-form\"\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\"\n\nimport { FormFieldErrors } from \"#orck/admin/components/form-field-errors\"\nimport { LinkedTableRow } from \"#orck/admin/components/linked-table-row\"\nimport { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Badge } from \"#orck/admin/components/ui/badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"#orck/admin/components/ui/select\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport {\n formatCard,\n formatCardExpiry,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\nimport type { CustomerContact } from \"#orck/client/generated/wire\"\n\nimport { DIALOG_FORM } from \"#orck/admin/lib/dialog-width\"\n\nimport { CustomerInvoiceProfileSection } from \"./invoice-profile\"\nimport { DefaultCardBadges } from \"./default-card-badges\"\nimport { CustomerCreditSupportSection } from \"./credits\"\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport {\n DEFAULT_GRANT_DURATION,\n GRANT_DURATIONS,\n grantTerm,\n type GrantDuration,\n} from \"./grant-duration\"\nimport { dunningSummary } from \"#orck/admin/pages/subscriptions/dunning\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nexport function CustomerDetailPage() {\n const { text: adminText } = useAdminUI()\n\n const { props: host } = useAdminContext()\n const { adminQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const { customerId = \"\" } = useParams()\n const navigate = useNavigate()\n const { data: customer, isPending: loading } = useQuery(\n adminQueries.customer(customerId)\n )\n\n if (loading)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading…\"} />\n </p>\n )\n if (!customer)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Customer not found.\"} />\n </p>\n )\n\n return (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigate(-1)}\n aria-label={adminText(\"Back\")}\n >\n <HugeiconsIcon icon={ArrowLeft01Icon} className=\"size-4\" />\n </Button>\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-base font-semibold\">\n {customer.contact?.name || customer.contact?.email || \"Customer\"}\n </h2>\n <p className=\"truncate text-xs text-muted-foreground\">\n {customer.id}\n <AdminMessage id={\" · since \"} />\n {formatDate(customer.created_at)}\n <AdminMessage id={\" · last seen\"} />{\" \"}\n {formatDate(customer.last_seen_at)}\n </p>\n </div>\n {canUpdate && (\n <div className=\"ml-auto flex gap-2\">\n <GrantProductAccessDialog customerId={customerId} />\n </div>\n )}\n </div>\n\n <CustomerContactCard contact={customer.contact} />\n {host.userHref && (\n <a className=\"underline\" href={host.userHref(customer.id)}>\n <AdminMessage id={\"View user account\"} />\n </a>\n )}\n {host.customerPanels?.(customer)}\n\n {customer.balances.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {customer.balances.map((b) => (\n <Card key={b.currency}>\n <CardHeader className=\"pb-1\">\n <CardTitle className=\"text-xs font-normal text-muted-foreground uppercase\">\n {b.currency}\n <AdminMessage id={\" balance\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-lg font-semibold\">\n {formatNativeAmount(b.balance_amount, b.currency)}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n <AdminMessage id={\"held \"} />\n {formatNativeAmount(b.held_amount, b.currency)}\n <AdminMessage id={\" · owed\"} />{\" \"}\n {formatNativeAmount(b.owed_amount, b.currency)}\n </p>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {customer.balances.some((b) => BigInt(b.owed_amount) > 0n) && (\n <p className=\"text-sm\">\n <Link\n className=\"underline-offset-2 hover:underline\"\n to={`/orders?customer_id=${customer.id}&origin=usage&overdue=true`}\n >\n <AdminMessage id={\"Overdue usage orders\"} />\n </Link>\n </p>\n )}\n\n <CustomerCreditSupportSection\n customerId={customerId}\n currencies={customer.balances.map((balance) => balance.currency)}\n />\n <CustomerInvoiceProfileSection customerId={customerId} />\n\n <div className=\"grid gap-4 lg:grid-cols-3 lg:items-start\">\n <div className=\"grid gap-4 lg:col-span-2\">\n <CustomerSubscriptions customerId={customerId} />\n <CustomerPayments customerId={customerId} />\n <CustomerPaymentMethods customerId={customerId} />\n </div>\n <div className=\"grid gap-4\">\n <CustomerEntitlements customerId={customerId} />\n <CustomerProductAccess customerId={customerId} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction CustomerSubscriptions({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerSubscriptions(customerId, pages.size, pages.cursor)\n )\n const subscriptions = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Subscriptions\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {subscriptions.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No subscriptions.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Subscription\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Status\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Rail\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Period ends\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Dunning\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {subscriptions.map((s) => (\n <LinkedTableRow key={s.id} to={`/subscriptions/${s.id}`}>\n <TableCell>\n <Link\n className=\"text-xs underline-offset-2 hover:underline\"\n to={`/subscriptions/${s.id}`}\n >\n {shortId(s.id, 13)}\n </Link>\n </TableCell>\n <TableCell>\n <StatusBadge status={s.status} />\n </TableCell>\n <TableCell>{s.rail}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatDate(s.current_period_ends_at)}\n </TableCell>\n <TableCell className=\"text-xs\">\n {s.dunning ? dunningSummary(s.dunning) : \"—\"}\n </TableCell>\n </LinkedTableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerPayments({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerPayments(customerId, pages.size, pages.cursor)\n )\n const payments = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Payments\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {payments.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No payments.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Payment\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Status\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Amount\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Kind\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Rail\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Purchased\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.map((p) => (\n <LinkedTableRow key={p.id} to={`/payments/${p.id}`}>\n <TableCell>\n <Link\n className=\"text-xs underline-offset-2 hover:underline\"\n to={`/payments/${p.id}`}\n >\n {shortId(p.id, 13)}\n </Link>\n </TableCell>\n <TableCell>\n <StatusBadge status={p.status} />\n </TableCell>\n <TableCell className=\"tabular-nums\">\n {formatNativeAmount(p.amount, p.currency)}\n </TableCell>\n <TableCell>{p.kind}</TableCell>\n <TableCell>{p.rail ?? p.channel}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatDate(p.created_at)}\n </TableCell>\n </LinkedTableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerPaymentMethods({ customerId }: { customerId: string }) {\n const { adminQueries, queryKeys } = useAdminServices()\n\n const queryClient = useQueryClient()\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerPaymentMethodsPage(\n customerId,\n pages.size,\n pages.cursor\n )\n )\n const methods = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Payment methods\"} />\n </CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n void queryClient.invalidateQueries({\n queryKey: [...queryKeys.customer(customerId), \"payment-methods\"],\n })\n }\n >\n <AdminMessage id={\"Refresh payment methods\"} />\n </Button>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {methods.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No payment methods on file.\"} />\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-3\">\n {methods.map((pm) => (\n <div key={pm.id} className=\"rounded-md border p-3 text-sm\">\n <p className=\"font-medium\">{formatCard(pm.card)}</p>\n <p className=\"text-xs text-muted-foreground\">\n {pm.rail}\n <AdminMessage id={\" · exp \"} />\n {formatCardExpiry(pm.card)}\n </p>\n <DefaultCardBadges currencies={pm.default_currencies ?? []} />\n {pm.health.expiry_status &&\n pm.health.expiry_status !== \"valid\" && (\n <Badge\n variant=\"secondary\"\n className=\"bg-held-surface text-held mt-1\"\n >\n {pm.health.expiry_status}\n </Badge>\n )}\n </div>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerEntitlements({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerEntitlements(customerId, pages.size, pages.cursor)\n )\n const keys = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Entitlements\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <p className=\"text-xs text-muted-foreground\">\n <AdminMessage\n id={\"The keys of the products this customer holds now.\"}\n />\n </p>\n {keys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No entitlements.\"} />\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {keys.map((e) => (\n <Badge key={e.entitlement} variant=\"secondary\">\n {e.entitlement}\n </Badge>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerProductAccess({ customerId }: { customerId: string }) {\n const { text: adminText } = useAdminUI()\n\n const { adminQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerProductAccess(customerId, pages.size, pages.cursor)\n )\n const grants = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Product access\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {grants.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No product access.\"} />\n </p>\n ) : (\n <div className=\"grid gap-4\">\n {grants.map((g) => (\n <div key={g.id} className=\"flex min-w-0 items-start gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <p className=\"truncate text-sm font-medium\">\n {g.product_name || shortId(g.product_id, 13)}\n </p>\n <StatusBadge status={g.status} />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {g.source_type === \"grant\"\n ? `Granted (${g.grant_reason ?? \"staff\"})${g.note ? `: ${g.note}` : \"\"}`\n : g.source_type}\n </p>\n <p className=\"text-xs text-muted-foreground tabular-nums\">\n {g.ends_at\n ? `Ends ${formatDate(g.ends_at)}`\n : \"No end date\"}\n </p>\n </div>\n {canUpdate && (\n <RevokeProductAccessButton\n customerId={customerId}\n grantId={g.id}\n label={adminText(\"Revoke product access\")}\n />\n )}\n </div>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction RevokeProductAccessButton({\n customerId,\n grantId,\n label,\n}: {\n customerId: string\n grantId: string\n label: string\n}) {\n const { toast, toastApiError, adminMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const queryClient = useQueryClient()\n const revoke = useMutation(\n adminMutations.revokeCustomerProductAccess(queryClient, customerId)\n )\n const [open, setOpen] = React.useState(false)\n const [reason, setReason] = React.useState(\"\")\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger\n render={\n <Button variant=\"ghost\" size=\"icon\" aria-label={label}>\n <HugeiconsIcon\n icon={Delete02Icon}\n className=\"size-4 text-destructive\"\n />\n </Button>\n }\n />\n <DialogContent className={DIALOG_FORM}>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Take the product back\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage\n id={\n \"The customer loses its entitlements now. The grant stays on record with your reason.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={adminId(\"revoke-access-reason\")}>\n <AdminMessage id={\"Reason\"} />\n </Label>\n <Input\n id={adminId(\"revoke-access-reason\")}\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n maxLength={500}\n />\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!reason.trim() || revoke.isPending}\n onClick={async () => {\n try {\n await revoke.mutateAsync({ grantId, reason: reason.trim() })\n toast.success(\"Product access revoked\")\n setOpen(false)\n } catch (err) {\n toastApiError(err, label)\n }\n }}\n >\n {revoke.isPending ? \"Revoking…\" : \"Revoke\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function GrantProductAccessDialog({\n customerId,\n}: {\n customerId: string\n}) {\n const { toast, toastApiError, adminMutations, adminQueries } =\n useAdminServices()\n\n const { id: adminId, text: adminText } = useAdminUI()\n\n const [open, setOpen] = React.useState(false)\n const queryClient = useQueryClient()\n const grant = useMutation(\n adminMutations.grantCustomerProductAccess(queryClient, customerId)\n )\n const { data: products } = useQuery({\n ...adminQueries.allProducts(),\n enabled: open,\n })\n const form = useForm({\n defaultValues: {\n productId: \"\",\n duration: DEFAULT_GRANT_DURATION as GrantDuration,\n until: \"\",\n note: \"\",\n },\n onSubmit: async ({ value }) => {\n const term = grantTerm(value.duration, value.until)\n if (!term) return\n try {\n await grant.mutateAsync({\n productId: value.productId,\n ...term,\n note: value.note.trim() || undefined,\n })\n toast.success(\"Product access granted\")\n handleOpenChange(false)\n } catch (err) {\n toastApiError(err, \"Grant product access\")\n }\n },\n })\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n if (!next) {\n form.reset()\n grant.reset()\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogTrigger\n render={\n <Button variant=\"outline\" size=\"sm\">\n <HugeiconsIcon icon={Add01Icon} className=\"size-4\" />\n <AdminMessage id={\" Product access\"} />\n </Button>\n }\n />\n <DialogContent className={DIALOG_FORM}>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Grant product access\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage\n id={\n \"Give this customer one of your products without a payment. They hold its keys while the grant lasts, including keys you add to the product later.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n event.stopPropagation()\n void form.handleSubmit()\n }}\n className=\"grid gap-4\"\n >\n <div className=\"grid gap-3\">\n <form.Field\n name=\"productId\"\n validators={{\n onChange: ({ value }) => (value ? undefined : \"Pick a product\"),\n }}\n >\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-product\")}>\n <AdminMessage id={\"Product\"} />\n </Label>\n <Select\n value={field.state.value}\n onValueChange={(value) => field.handleChange(value ?? \"\")}\n >\n <SelectTrigger\n className=\"w-full\"\n id={adminId(\"pa-product\")}\n aria-invalid={field.state.meta.errors.length > 0}\n >\n <SelectValue placeholder={adminText(\"Pick a product\")} />\n </SelectTrigger>\n <SelectContent>\n {(products?.data ?? []).map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.display_name} ({p.key})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormFieldErrors errors={field.state.meta.errors} />\n </div>\n )}\n </form.Field>\n <form.Field name=\"duration\">\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-duration\")}>\n <AdminMessage id={\"How long it lasts\"} />\n </Label>\n <p className=\"text-[13px] text-muted-foreground\">\n <AdminMessage\n id={\"Days are added after any access they already have.\"}\n />\n </p>\n <Select\n items={GRANT_DURATIONS.map((d) => ({\n value: d.value,\n label: d.label,\n }))}\n value={field.state.value}\n onValueChange={(value) => {\n if (value) field.handleChange(value as GrantDuration)\n }}\n >\n <SelectTrigger\n className=\"w-full\"\n id={adminId(\"pa-duration\")}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {GRANT_DURATIONS.map((d) => (\n <SelectItem key={d.value} value={d.value}>\n {d.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </form.Field>\n <form.Subscribe selector={(state) => state.values.duration}>\n {(duration) =>\n duration === \"until\" ? (\n <form.Field\n name=\"until\"\n validators={{\n onChange: ({ value }) =>\n grantTerm(\"until\", value)\n ? undefined\n : \"Pick today or a later date\",\n }}\n >\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-until\")}>\n <AdminMessage id={\"Last day (UTC)\"} />\n </Label>\n <Input\n id={adminId(\"pa-until\")}\n type=\"date\"\n min={new Date().toISOString().slice(0, 10)}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(event) =>\n field.handleChange(event.target.value)\n }\n aria-invalid={field.state.meta.errors.length > 0}\n />\n <FormFieldErrors errors={field.state.meta.errors} />\n </div>\n )}\n </form.Field>\n ) : null\n }\n </form.Subscribe>\n <form.Field name=\"note\">\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-note\")}>\n <AdminMessage id={\"Note\"} />\n </Label>\n <Input\n id={adminId(\"pa-note\")}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(event) => field.handleChange(event.target.value)}\n placeholder={adminText(\"Why it was granted\")}\n />\n </div>\n )}\n </form.Field>\n </div>\n <DialogFooter>\n <form.Subscribe\n selector={(state) =>\n [\n state.values.productId,\n state.canSubmit,\n state.isSubmitting,\n grantTerm(state.values.duration, state.values.until) !== null,\n ] as const\n }\n >\n {([productId, canSubmit, isSubmitting, termValid]) => (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isSubmitting}\n onClick={() => handleOpenChange(false)}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n type=\"submit\"\n disabled={\n !productId || !canSubmit || isSubmitting || !termValid\n }\n >\n {isSubmitting ? \"Granting…\" : \"Grant access\"}\n </Button>\n </>\n )}\n </form.Subscribe>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\n// CustomerContactCard is who the customer is, from the merchant's directory:\n// read live, or the copy its SCIM provisioning keeps.\nfunction CustomerContactCard({ contact }: { contact: CustomerContact | null }) {\n return (\n <Card>\n <CardHeader className=\"pb-1\">\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Contact\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"text-sm\">\n {!contact ? (\n <p className=\"text-muted-foreground\">\n <AdminMessage\n id={\"Your directory holds no contact for this customer.\"}\n />\n </p>\n ) : (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1\">\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Email\"} />\n </dt>\n <dd className=\"truncate\">{contact.email ?? \"—\"}</dd>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Name\"} />\n </dt>\n <dd className=\"truncate\">{contact.name ?? \"—\"}</dd>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Username\"} />\n </dt>\n <dd className=\"truncate\">{contact.username ?? \"—\"}</dd>\n {contact.active !== null && (\n <>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Directory\"} />\n </dt>\n <dd>\n <Badge variant={contact.active ? \"secondary\" : \"outline\"}>\n {contact.active ? \"Active\" : \"Deactivated\"}\n </Badge>\n </dd>\n </>\n )}\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Synced\"} />\n </dt>\n <dd className=\"tabular-nums\">\n {contact.synced_at ? formatDate(contact.synced_at) : \"Live\"}\n </dd>\n </dl>\n )}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-detail-Dc7rU4mM.js","names":[],"sources":["../src/admin/pages/customers/invoice-profile.tsx","../src/admin/pages/customers/default-card-badges.tsx","../src/admin/pages/customers/credit-form.ts","../src/admin/pages/customers/credits.tsx","../src/admin/pages/customers/grant-duration.ts","../src/admin/pages/customers/detail.tsx"],"sourcesContent":["import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport { useState } from \"react\"\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\"\nimport { Link } from \"#orck/admin/router\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\n\nimport type { InvoiceProfile } from \"#orck/client/generated/wire\"\nimport {\n invoiceProfileValues,\n invoiceProfileRequest,\n type ProfileFormValues,\n} from \"./invoice-profile-model\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nexport function CustomerInvoiceProfileSection({\n customerId,\n}: {\n customerId: string\n}) {\n const { orderQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const query = useQuery(orderQueries.profile(customerId))\n return (\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Invoice profile\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <Link\n className=\"text-sm underline\"\n to={`/orders?customer_id=${customerId}&origin=usage`}\n >\n <AdminMessage id={\"View customer usage orders\"} />\n </Link>\n {query.isPending ? (\n <p>\n <AdminMessage id={\"Loading invoice profile…\"} />\n </p>\n ) : query.error ? (\n <p role=\"alert\" className=\"text-destructive\">\n {query.error.message}\n </p>\n ) : (\n <InvoiceProfileEditor\n key={customerId}\n customerId={customerId}\n profile={query.data}\n readOnly={!canUpdate}\n />\n )}\n </CardContent>\n </Card>\n )\n}\n// A customer without a profile edits an empty one; saving creates it.\nexport function InvoiceProfileEditor({\n customerId,\n profile,\n readOnly = false,\n}: {\n customerId: string\n profile: InvoiceProfile | null\n // readOnly shows the profile to staff who may not change it.\n readOnly?: boolean\n}) {\n const { id: adminId, text: adminText } = useAdminUI()\n\n const { invoiceProfileMutation } = useAdminServices()\n\n const [values, setValues] = useState(() => invoiceProfileValues(profile))\n const [error, setError] = useState<string | null>(null)\n const [saved, setSaved] = useState(false)\n const client = useQueryClient(),\n mutation = useMutation(invoiceProfileMutation(client, customerId))\n const update = (patch: Partial<ProfileFormValues>) => {\n setValues((old) => ({ ...old, ...patch }))\n setSaved(false)\n }\n async function save() {\n setError(null)\n setSaved(false)\n try {\n await mutation.mutateAsync(invoiceProfileRequest(values, profile))\n setSaved(true)\n } catch (failure) {\n setError(\n failure instanceof Error\n ? failure.message\n : \"Invoice profile update failed.\"\n )\n }\n }\n return (\n <form\n className=\"mt-4 space-y-4\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!mutation.isPending) void save()\n }}\n >\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage\n id={\n \"Terms and billing facts for future usage orders. Billed orders keep their original snapshots. Tax details are recorded; no tax is calculated.\"\n }\n />\n </p>\n <fieldset disabled={readOnly || mutation.isPending} className=\"space-y-4\">\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <Label htmlFor={adminId(\"invoice-profile-terms\")}>\n <AdminMessage id={\"Payment terms (days)\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-terms\")}\n type=\"number\"\n min={0}\n step={1}\n value={values.terms}\n onChange={(e) => update({ terms: e.target.value })}\n />\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-method\")}>\n <AdminMessage id={\"Collection method\"} />\n </Label>\n <select\n id={adminId(\"invoice-profile-method\")}\n className=\"h-9 w-full rounded-md border bg-background px-2\"\n value={values.method}\n onChange={(e) =>\n update({\n method: e.target.value as ProfileFormValues[\"method\"],\n })\n }\n >\n <option value=\"charge_automatically\">\n <AdminMessage id={\"Saved payment method\"} />\n </option>\n <option value=\"send_invoice\">\n <AdminMessage id={\"Manual remittance\"} />\n </option>\n </select>\n </div>\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-po\")}>\n <AdminMessage id={\"Purchase order\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-po\")}\n value={values.po}\n onChange={(e) => update({ po: e.target.value })}\n />\n </div>\n <div>\n <Label htmlFor={adminId(\"invoice-profile-memo\")}>\n <AdminMessage id={\"Invoice memo\"} />\n </Label>\n <Input\n id={adminId(\"invoice-profile-memo\")}\n value={values.memo}\n onChange={(e) => update({ memo: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n <AdminMessage id={\"Billing contacts\"} />\n </p>\n {values.contacts.map((contact, i) => (\n <div key={i} className=\"flex gap-2\">\n <Input\n aria-label={`Contact ${i + 1} name`}\n placeholder={adminText(\"Name\")}\n value={contact.name}\n onChange={(e) =>\n update({\n contacts: values.contacts.map((c, index) =>\n index === i ? { ...c, name: e.target.value } : c\n ),\n })\n }\n />\n <Input\n aria-label={`Contact ${i + 1} email`}\n type=\"email\"\n placeholder={adminText(\"Email\")}\n value={contact.email}\n onChange={(e) =>\n update({\n contacts: values.contacts.map((c, index) =>\n index === i ? { ...c, email: e.target.value } : c\n ),\n })\n }\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n aria-label={`Remove contact ${i + 1}`}\n onClick={() =>\n update({\n contacts: values.contacts.filter((_, index) => index !== i),\n })\n }\n >\n <AdminMessage id={\"Remove\"} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() =>\n update({\n contacts: [...values.contacts, { name: \"\", email: \"\" }],\n })\n }\n >\n <AdminMessage id={\"Add contact\"} />\n </Button>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n <AdminMessage id={\"Tax details\"} />\n </p>\n {values.tax.map((row, i) => (\n <div key={i} className=\"flex gap-2\">\n <Input\n aria-label={`Tax detail ${i + 1} name`}\n placeholder={adminText(\"Name, such as tax_id\")}\n value={row.key}\n onChange={(e) =>\n update({\n tax: values.tax.map((r, index) =>\n index === i ? { ...r, key: e.target.value } : r\n ),\n })\n }\n />\n <Input\n aria-label={`Tax detail ${i + 1} value`}\n placeholder={adminText(\"Value\")}\n value={row.value}\n onChange={(e) =>\n update({\n tax: values.tax.map((r, index) =>\n index === i ? { ...r, value: e.target.value } : r\n ),\n })\n }\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n aria-label={`Remove tax detail ${i + 1}`}\n onClick={() =>\n update({ tax: values.tax.filter((_, index) => index !== i) })\n }\n >\n <AdminMessage id={\"Remove\"} />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() =>\n update({ tax: [...values.tax, { key: \"\", value: \"\" }] })\n }\n >\n <AdminMessage id={\"Add tax detail\"} />\n </Button>\n </div>\n </fieldset>\n {error && (\n <p role=\"alert\" className=\"text-destructive\">\n {error}\n </p>\n )}\n {saved && (\n <p role=\"status\" className=\"text-sm\">\n <AdminMessage\n id={\"Invoice profile saved. Billed orders were not changed.\"}\n />\n </p>\n )}\n {!readOnly && (\n <Button type=\"submit\" disabled={mutation.isPending}>\n {mutation.isPending ? \"Saving…\" : \"Save invoice profile\"}\n </Button>\n )}\n </form>\n )\n}\n","import { AdminMessage } from \"#orck/admin/ui-context\"\nimport { Badge } from \"#orck/admin/components/ui/badge\"\n\n// The currencies the card is the customer's default for: it pays their\n// usage orders there and every subscription without a card of its own.\nexport function DefaultCardBadges({\n currencies = [],\n}: {\n currencies?: string[]\n}) {\n return (\n <>\n {currencies.map((currency) => (\n <Badge key={currency} variant=\"secondary\" className=\"mt-1 mr-1\">\n <AdminMessage id={\"Default · \"} />\n {currency}\n </Badge>\n ))}\n </>\n )\n}\n","import type {\n CreditGrant,\n CreditGrantInput,\n} from \"#orck/admin/lib/api/credit-types\"\nimport { amountFromInput } from \"#orck/admin/lib/format\"\n\nexport function creditGrantInput(\n input: {\n amount: string\n decimals: number\n currency: string\n expires: string\n description: string\n sourceID: string\n },\n now = Date.now()\n): CreditGrantInput {\n const amount = amountFromInput(input.amount, input.decimals)\n if (amount === null || BigInt(amount) <= 0n)\n throw new Error(\n `Enter a positive amount with at most ${input.decimals} decimal places, within the supported range.`\n )\n const currency = input.currency.trim()\n if (!currency) throw new Error(\"Select a currency.\")\n let expires: string | undefined\n if (input.expires) {\n const time = new Date(input.expires).getTime()\n if (!Number.isFinite(time) || time <= now)\n throw new Error(\"Expiry must be a valid future date.\")\n expires = new Date(time).toISOString()\n }\n return {\n amount,\n currency,\n source: \"admin\",\n source_id: input.sourceID,\n expires_at: expires,\n description: input.description.trim() || undefined,\n }\n}\n\nexport function canRevokeCredit(grant: CreditGrant): boolean {\n return (\n (grant.state === \"active\" || grant.state === \"scheduled\") &&\n /^\\d+$/.test(grant.remaining_amount) &&\n BigInt(grant.remaining_amount) > 0n\n )\n}\n\nexport function creditRevokeInput(grant: CreditGrant, reason: string) {\n if (!canRevokeCredit(grant))\n throw new Error(\"This grant has no remaining credit to revoke.\")\n reason = reason.trim()\n if (!reason || reason.length > 500)\n throw new Error(\"Enter a reason of up to 500 characters.\")\n return { grant: grant.id, reason }\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport * as React from \"react\"\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\"\n\nimport { useAuth } from \"#orck/admin/lib/auth\"\n\nimport type { CreditGrant } from \"#orck/admin/lib/api/credit-types\"\nimport {\n currencyScale,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport {\n canRevokeCredit,\n creditGrantInput,\n creditRevokeInput,\n} from \"./credit-form\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nconst errorText = (error: unknown) =>\n error instanceof Error ? error.message : \"The request failed. Try again.\"\n\nexport function CustomerCreditSupportSection({\n customerId,\n currencies,\n}: {\n customerId: string\n currencies: string[]\n}) {\n const { activeMerchant } = useAuth()\n const merchant = activeMerchant?.slug ?? \"\"\n return (\n <CreditSupport\n key={`${merchant}:${customerId}`}\n merchant={merchant}\n customer={customerId}\n initialCurrency={currencies[0] ?? \"USD\"}\n />\n )\n}\n\nfunction CreditSupport({\n merchant,\n customer,\n initialCurrency,\n}: {\n merchant: string\n customer: string\n initialCurrency: string\n}) {\n const { id: adminId, text: adminText } = useAdminUI()\n\n const { creditQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const [currency, setCurrency] = React.useState(initialCurrency)\n const [currencyInput, setCurrencyInput] = React.useState(initialCurrency)\n const grantPages = useCursorPages(currency, 25)\n const ledgerPages = useCursorPages(currency, 25)\n const [granting, setGranting] = React.useState(false)\n const [revokeGrant, setRevokeGrant] = React.useState<CreditGrant | null>(null)\n const grants = useQuery(\n creditQueries.grants(\n merchant,\n customer,\n currency,\n grantPages.size,\n grantPages.cursor\n )\n )\n const ledger = useQuery(\n creditQueries.transactions(\n merchant,\n customer,\n currency,\n ledgerPages.size,\n ledgerPages.cursor\n )\n )\n const decimals = currencyScale(currency)\n\n return (\n <Card>\n <CardHeader className=\"gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Credits\"} />\n </CardTitle>\n {canUpdate && (\n <Button\n size=\"sm\"\n disabled={decimals === undefined}\n onClick={() => setGranting(true)}\n >\n <AdminMessage id={\"Grant credit\"} />\n </Button>\n )}\n </div>\n <form\n className=\"flex max-w-sm items-end gap-2\"\n onSubmit={(event) => {\n event.preventDefault()\n const value = currencyInput.trim()\n if (value) setCurrency(value.toUpperCase())\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"credit-currency\")}>\n <AdminMessage id={\"Currency\"} />\n </Label>\n <Input\n id={adminId(\"credit-currency\")}\n value={currencyInput}\n onChange={(e) => setCurrencyInput(e.target.value)}\n placeholder={adminText(\"USD\")}\n />\n </div>\n <Button type=\"submit\" variant=\"outline\" size=\"sm\">\n <AdminMessage id={\"View\"} />\n </Button>\n </form>\n {decimals === undefined && (\n <p className=\"text-xs text-muted-foreground\">\n {currency}\n <AdminMessage id={\" is not a supported currency.\"} />\n </p>\n )}\n </CardHeader>\n <CardContent className=\"grid gap-6\">\n <section aria-label={adminText(\"Credit grants\")}>\n <h3 className=\"mb-2 text-sm font-medium\">\n <AdminMessage id={\"Grants · \"} />\n {currency}\n </h3>\n {grants.isPending ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading grants…\"} />\n </p>\n ) : grants.error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {errorText(grants.error)}\n </p>\n ) : !grants.data?.data.length ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No credit grants in this currency.\"} />\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n <AdminMessage id={\"Grant\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Original\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Remaining\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Spent\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Expired\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Revoked\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"State\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Expires\"} />\n </TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {grants.data.data.map((grant) => (\n <TableRow key={grant.id}>\n <TableCell>\n <span title={grant.id}>{shortId(grant.id)}</span>\n <div className=\"text-xs text-muted-foreground\">\n {formatDate(grant.created_at)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {grant.description ?? grant.source_type}\n </div>\n </TableCell>\n {[\n grant.amount,\n grant.remaining_amount,\n grant.spent_amount,\n grant.expired_amount,\n grant.revoked_amount,\n ].map((amount, index) => (\n <TableCell key={index} className=\"tabular-nums\">\n {formatNativeAmount(amount, grant.currency)}\n </TableCell>\n ))}\n <TableCell>{grant.state}</TableCell>\n <TableCell>\n {grant.expires_at\n ? formatDate(grant.expires_at)\n : \"No expiry\"}\n </TableCell>\n <TableCell>\n {canUpdate && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={!canRevokeCredit(grant)}\n onClick={() => setRevokeGrant(grant)}\n >\n <AdminMessage id={\"Revoke\"} />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n <CursorPager\n pages={grantPages}\n rows={grants.data?.data?.length ?? 0}\n nextCursor={grants.data?.next_cursor}\n busy={grants.isFetching}\n />\n </section>\n <section aria-label={adminText(\"Credit transaction ledger\")}>\n <h3 className=\"mb-2 text-sm font-medium\">\n <AdminMessage id={\"Transaction ledger · \"} />\n {currency}\n </h3>\n {ledger.isPending ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading transactions…\"} />\n </p>\n ) : ledger.error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {errorText(ledger.error)}\n </p>\n ) : !ledger.data?.data.length ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No transactions in this currency.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n <AdminMessage id={\"Date\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Type\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Amount\"} />\n </TableHead>\n <TableHead>\n <AdminMessage id={\"Source\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {ledger.data.data.map((tx) => (\n <TableRow key={tx.id}>\n <TableCell title={tx.id}>\n {formatDate(tx.created_at)}\n </TableCell>\n <TableCell>{tx.type.replaceAll(\"_\", \" \")}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatNativeAmount(tx.amount, tx.currency)}\n </TableCell>\n <TableCell>{tx.source || \"—\"}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={ledgerPages}\n rows={ledger.data?.data?.length ?? 0}\n nextCursor={ledger.data?.next_cursor}\n busy={ledger.isFetching}\n />\n </section>\n </CardContent>\n {granting && decimals !== undefined && (\n <GrantCreditDialog\n merchant={merchant}\n customer={customer}\n currency={currency}\n decimals={decimals}\n onClose={() => setGranting(false)}\n />\n )}\n {revokeGrant && (\n <RevokeCreditDialog\n merchant={merchant}\n customer={customer}\n grant={revokeGrant}\n onClose={() => setRevokeGrant(null)}\n />\n )}\n </Card>\n )\n}\n\nfunction GrantCreditDialog({\n merchant,\n customer,\n currency,\n decimals,\n onClose,\n}: {\n merchant: string\n customer: string\n currency: string\n decimals: number\n onClose: () => void\n}) {\n const { toast, creditMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const client = useQueryClient()\n const mutation = useMutation(\n creditMutations.grant(client, merchant, customer)\n )\n const [amount, setAmount] = React.useState(\"\")\n const [expires, setExpires] = React.useState(\"\")\n const [description, setDescription] = React.useState(\"\")\n const [sourceID] = React.useState(() => crypto.randomUUID())\n const [error, setError] = React.useState(\"\")\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !mutation.isPending) onClose()\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Grant credit\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage id={\"Add credit in \"} />\n {currency}\n <AdminMessage id={\" to this customer.\"} />\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"grid gap-4\"\n onSubmit={async (e) => {\n e.preventDefault()\n setError(\"\")\n try {\n const body = creditGrantInput({\n amount,\n currency,\n decimals,\n expires,\n description,\n sourceID,\n })\n await mutation.mutateAsync(body)\n toast.success(\"Credit granted\")\n onClose()\n } catch (error) {\n setError(errorText(error))\n }\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-amount\")}>\n <AdminMessage id={\"Amount (\"} />\n {currency})\n </Label>\n <Input\n id={adminId(\"grant-amount\")}\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n autoFocus\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-expiry\")}>\n <AdminMessage id={\"Expires (optional)\"} />\n </Label>\n <Input\n id={adminId(\"grant-expiry\")}\n type=\"datetime-local\"\n value={expires}\n onChange={(e) => setExpires(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"grant-description\")}>\n <AdminMessage id={\"Description (optional)\"} />\n </Label>\n <Input\n id={adminId(\"grant-description\")}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n maxLength={500}\n />\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={mutation.isPending}\n onClick={onClose}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button type=\"submit\" disabled={mutation.isPending}>\n {mutation.isPending ? \"Granting…\" : \"Grant credit\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction RevokeCreditDialog({\n merchant,\n customer,\n grant,\n onClose,\n}: {\n merchant: string\n customer: string\n grant: CreditGrant\n onClose: () => void\n}) {\n const { toast, creditMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const client = useQueryClient()\n const mutation = useMutation(\n creditMutations.revoke(client, merchant, customer)\n )\n const [reason, setReason] = React.useState(\"\")\n const [error, setError] = React.useState(\"\")\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !mutation.isPending) onClose()\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Revoke remaining credit\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage id={\"Revoke the unspent remainder of\"} />{\" \"}\n {formatNativeAmount(grant.remaining_amount, grant.currency)}\n <AdminMessage\n id={\n \". Active holds may prevent revocation. Payment refunds are managed separately.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"grid gap-4\"\n onSubmit={async (e) => {\n e.preventDefault()\n setError(\"\")\n try {\n const result = await mutation.mutateAsync(\n creditRevokeInput(grant, reason)\n )\n toast.success(\n result.replayed\n ? \"Credit was already revoked\"\n : `${formatNativeAmount(result.revoked_amount, result.currency)} revoked`\n )\n onClose()\n } catch (error) {\n setError(errorText(error))\n }\n }}\n >\n <div className=\"grid gap-1\">\n <Label htmlFor={adminId(\"revoke-reason\")}>\n <AdminMessage id={\"Reason\"} />\n </Label>\n <Input\n id={adminId(\"revoke-reason\")}\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n maxLength={500}\n autoFocus\n />\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={mutation.isPending}\n onClick={onClose}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n type=\"submit\"\n variant=\"destructive\"\n disabled={!canRevokeCredit(grant) || mutation.isPending}\n >\n {mutation.isPending ? \"Revoking…\" : \"Revoke credit\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","// How long a product-access grant lasts: a preset number of days (added after\n// any access the customer already has), until a date, or forever.\n\n// MAX_GRANT_HOURS is the longest grant the API takes: the most hours a Go\n// time.Duration holds.\nexport const MAX_GRANT_HOURS = 2_562_047\n\nexport const GRANT_DURATIONS = [\n { value: \"1\", label: \"1 day\", days: 1 },\n { value: \"7\", label: \"7 days\", days: 7 },\n { value: \"30\", label: \"30 days\", days: 30 },\n { value: \"365\", label: \"365 days\", days: 365 },\n { value: \"until\", label: \"Until a date\" },\n { value: \"never\", label: \"Never expires\" },\n] as const\n\nexport type GrantDuration = (typeof GRANT_DURATIONS)[number][\"value\"]\n\nexport const DEFAULT_GRANT_DURATION: GrantDuration = \"30\"\n\nexport type GrantTerm = { hours: number } | { endsAt: string } | object\n\nconst today = (now: Date) => now.toISOString().slice(0, 10)\n\n// grantTerm is what the grant request carries for a choice. A date ends the\n// grant at the close of that UTC day, sent as an instant.\nexport function grantTerm(\n choice: GrantDuration,\n until: string,\n now = new Date()\n): GrantTerm | null {\n if (choice === \"never\") return {}\n if (choice === \"until\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(until) || until < today(now)) return null\n const end = new Date(`${until}T00:00:00Z`)\n end.setUTCDate(end.getUTCDate() + 1)\n return { endsAt: end.toISOString() }\n }\n const preset = GRANT_DURATIONS.find((d) => d.value === choice)\n return preset && \"days\" in preset ? { hours: preset.days * 24 } : null\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminContext, useAdminServices } from \"#orck/admin/context\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Add01Icon,\n ArrowLeft01Icon,\n Delete02Icon,\n} from \"@hugeicons/core-free-icons\"\nimport * as React from \"react\"\nimport { Link, useNavigate, useParams } from \"#orck/admin/router\"\n\nimport { useForm } from \"@tanstack/react-form\"\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\"\n\nimport { FormFieldErrors } from \"#orck/admin/components/form-field-errors\"\nimport { LinkedTableRow } from \"#orck/admin/components/linked-table-row\"\nimport { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Badge } from \"#orck/admin/components/ui/badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"#orck/admin/components/ui/select\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport {\n formatCard,\n formatCardExpiry,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\nimport type { CustomerContact } from \"#orck/client/generated/wire\"\n\nimport { DIALOG_FORM } from \"#orck/admin/lib/dialog-width\"\n\nimport { CustomerInvoiceProfileSection } from \"./invoice-profile\"\nimport { DefaultCardBadges } from \"./default-card-badges\"\nimport { CustomerCreditSupportSection } from \"./credits\"\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport {\n DEFAULT_GRANT_DURATION,\n GRANT_DURATIONS,\n grantTerm,\n type GrantDuration,\n} from \"./grant-duration\"\nimport { dunningSummary } from \"#orck/admin/pages/subscriptions/dunning\"\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\n\nexport function CustomerDetailPage() {\n const { text: adminText } = useAdminUI()\n\n const { props: host } = useAdminContext()\n const { adminQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const { customerId = \"\" } = useParams()\n const navigate = useNavigate()\n const { data: customer, isPending: loading } = useQuery(\n adminQueries.customer(customerId)\n )\n\n if (loading)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading…\"} />\n </p>\n )\n if (!customer)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Customer not found.\"} />\n </p>\n )\n\n return (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigate(-1)}\n aria-label={adminText(\"Back\")}\n >\n <HugeiconsIcon icon={ArrowLeft01Icon} className=\"size-4\" />\n </Button>\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-base font-semibold\">\n {customer.contact?.name || customer.contact?.email || \"Customer\"}\n </h2>\n <p className=\"truncate text-xs text-muted-foreground\">\n {customer.id}\n <AdminMessage id={\" · since \"} />\n {formatDate(customer.created_at)}\n <AdminMessage id={\" · last seen\"} />{\" \"}\n {formatDate(customer.last_seen_at)}\n </p>\n </div>\n {canUpdate && (\n <div className=\"ml-auto flex gap-2\">\n <GrantProductAccessDialog customerId={customerId} />\n </div>\n )}\n </div>\n\n <CustomerContactCard contact={customer.contact} />\n {host.userHref && (\n <a className=\"underline\" href={host.userHref(customer.id)}>\n <AdminMessage id={\"View user account\"} />\n </a>\n )}\n {host.customerPanels?.(customer)}\n\n {customer.balances.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {customer.balances.map((b) => (\n <Card key={b.currency}>\n <CardHeader className=\"pb-1\">\n <CardTitle className=\"text-xs font-normal text-muted-foreground uppercase\">\n {b.currency}\n <AdminMessage id={\" balance\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-lg font-semibold\">\n {formatNativeAmount(b.balance_amount, b.currency)}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n <AdminMessage id={\"held \"} />\n {formatNativeAmount(b.held_amount, b.currency)}\n <AdminMessage id={\" · owed\"} />{\" \"}\n {formatNativeAmount(b.owed_amount, b.currency)}\n </p>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {customer.balances.some((b) => BigInt(b.owed_amount) > 0n) && (\n <p className=\"text-sm\">\n <Link\n className=\"underline-offset-2 hover:underline\"\n to={`/orders?customer_id=${customer.id}&origin=usage&overdue=true`}\n >\n <AdminMessage id={\"Overdue usage orders\"} />\n </Link>\n </p>\n )}\n\n <CustomerCreditSupportSection\n customerId={customerId}\n currencies={customer.balances.map((balance) => balance.currency)}\n />\n <CustomerInvoiceProfileSection customerId={customerId} />\n\n <div className=\"grid gap-4 lg:grid-cols-3 lg:items-start\">\n <div className=\"grid gap-4 lg:col-span-2\">\n <CustomerSubscriptions customerId={customerId} />\n <CustomerPayments customerId={customerId} />\n <CustomerPaymentMethods customerId={customerId} />\n </div>\n <div className=\"grid gap-4\">\n <CustomerEntitlements customerId={customerId} />\n <CustomerProductAccess customerId={customerId} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction CustomerSubscriptions({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerSubscriptions(customerId, pages.size, pages.cursor)\n )\n const subscriptions = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Subscriptions\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {subscriptions.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No subscriptions.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Subscription\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Status\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Rail\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Period ends\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Dunning\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {subscriptions.map((s) => (\n <LinkedTableRow key={s.id} to={`/subscriptions/${s.id}`}>\n <TableCell>\n <Link\n className=\"text-xs underline-offset-2 hover:underline\"\n to={`/subscriptions/${s.id}`}\n >\n {shortId(s.id, 13)}\n </Link>\n </TableCell>\n <TableCell>\n <StatusBadge status={s.status} />\n </TableCell>\n <TableCell>{s.rail}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatDate(s.current_period_ends_at)}\n </TableCell>\n <TableCell className=\"text-xs\">\n {s.dunning ? dunningSummary(s.dunning) : \"—\"}\n </TableCell>\n </LinkedTableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerPayments({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerPayments(customerId, pages.size, pages.cursor)\n )\n const payments = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Payments\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {payments.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No payments.\"} />\n </p>\n ) : (\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Payment\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Status\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Amount\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Kind\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Rail\"} />\n </TableHead>\n <TableHead className=\"text-muted-foreground\">\n <AdminMessage id={\"Purchased\"} />\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.map((p) => (\n <LinkedTableRow key={p.id} to={`/payments/${p.id}`}>\n <TableCell>\n <Link\n className=\"text-xs underline-offset-2 hover:underline\"\n to={`/payments/${p.id}`}\n >\n {shortId(p.id, 13)}\n </Link>\n </TableCell>\n <TableCell>\n <StatusBadge status={p.status} />\n </TableCell>\n <TableCell className=\"tabular-nums\">\n {formatNativeAmount(p.amount, p.currency)}\n </TableCell>\n <TableCell>{p.kind}</TableCell>\n <TableCell>{p.rail ?? p.channel}</TableCell>\n <TableCell className=\"tabular-nums\">\n {formatDate(p.created_at)}\n </TableCell>\n </LinkedTableRow>\n ))}\n </TableBody>\n </Table>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerPaymentMethods({ customerId }: { customerId: string }) {\n const { adminQueries, queryKeys } = useAdminServices()\n\n const queryClient = useQueryClient()\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerPaymentMethodsPage(\n customerId,\n pages.size,\n pages.cursor\n )\n )\n const methods = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Payment methods\"} />\n </CardTitle>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n void queryClient.invalidateQueries({\n queryKey: [...queryKeys.customer(customerId), \"payment-methods\"],\n })\n }\n >\n <AdminMessage id={\"Refresh payment methods\"} />\n </Button>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {methods.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No payment methods on file.\"} />\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-3\">\n {methods.map((pm) => (\n <div key={pm.id} className=\"rounded-md border p-3 text-sm\">\n <p className=\"font-medium\">{formatCard(pm.card)}</p>\n <p className=\"text-xs text-muted-foreground\">\n {pm.rail}\n <AdminMessage id={\" · exp \"} />\n {formatCardExpiry(pm.card)}\n </p>\n <DefaultCardBadges currencies={pm.default_currencies ?? []} />\n {pm.health.expiry_status &&\n pm.health.expiry_status !== \"valid\" && (\n <Badge\n variant=\"secondary\"\n className=\"bg-held-surface text-held mt-1\"\n >\n {pm.health.expiry_status}\n </Badge>\n )}\n </div>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerEntitlements({ customerId }: { customerId: string }) {\n const { adminQueries } = useAdminServices()\n\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerEntitlements(customerId, pages.size, pages.cursor)\n )\n const keys = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Entitlements\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <p className=\"text-xs text-muted-foreground\">\n <AdminMessage\n id={\"The keys of the products this customer holds now.\"}\n />\n </p>\n {keys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No entitlements.\"} />\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {keys.map((e) => (\n <Badge key={e.entitlement} variant=\"secondary\">\n {e.entitlement}\n </Badge>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction CustomerProductAccess({ customerId }: { customerId: string }) {\n const { text: adminText } = useAdminUI()\n\n const { adminQueries } = useAdminServices()\n\n const canUpdate = useAdminUpdates()\n const pages = useCursorPages(customerId, 25)\n const { data, isFetching } = useQuery(\n adminQueries.customerProductAccess(customerId, pages.size, pages.cursor)\n )\n const grants = data?.data ?? []\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Product access\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n {grants.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"No product access.\"} />\n </p>\n ) : (\n <div className=\"grid gap-4\">\n {grants.map((g) => (\n <div key={g.id} className=\"flex min-w-0 items-start gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <p className=\"truncate text-sm font-medium\">\n {g.product_name || shortId(g.product_id, 13)}\n </p>\n <StatusBadge status={g.status} />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {g.source_type === \"grant\"\n ? `Granted (${g.grant_reason ?? \"staff\"})${g.note ? `: ${g.note}` : \"\"}`\n : g.source_type}\n </p>\n <p className=\"text-xs text-muted-foreground tabular-nums\">\n {g.ends_at\n ? `Ends ${formatDate(g.ends_at)}`\n : \"No end date\"}\n </p>\n </div>\n {canUpdate && (\n <RevokeProductAccessButton\n customerId={customerId}\n grantId={g.id}\n label={adminText(\"Revoke product access\")}\n />\n )}\n </div>\n ))}\n </div>\n )}\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </CardContent>\n </Card>\n )\n}\n\nfunction RevokeProductAccessButton({\n customerId,\n grantId,\n label,\n}: {\n customerId: string\n grantId: string\n label: string\n}) {\n const { toast, toastApiError, adminMutations } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const queryClient = useQueryClient()\n const revoke = useMutation(\n adminMutations.revokeCustomerProductAccess(queryClient, customerId)\n )\n const [open, setOpen] = React.useState(false)\n const [reason, setReason] = React.useState(\"\")\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger\n render={\n <Button variant=\"ghost\" size=\"icon\" aria-label={label}>\n <HugeiconsIcon\n icon={Delete02Icon}\n className=\"size-4 text-destructive\"\n />\n </Button>\n }\n />\n <DialogContent className={DIALOG_FORM}>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Take the product back\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage\n id={\n \"The customer loses its entitlements now. The grant stays on record with your reason.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={adminId(\"revoke-access-reason\")}>\n <AdminMessage id={\"Reason\"} />\n </Label>\n <Input\n id={adminId(\"revoke-access-reason\")}\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n maxLength={500}\n />\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!reason.trim() || revoke.isPending}\n onClick={async () => {\n try {\n await revoke.mutateAsync({ grantId, reason: reason.trim() })\n toast.success(\"Product access revoked\")\n setOpen(false)\n } catch (err) {\n toastApiError(err, label)\n }\n }}\n >\n {revoke.isPending ? \"Revoking…\" : \"Revoke\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function GrantProductAccessDialog({\n customerId,\n}: {\n customerId: string\n}) {\n const { toast, toastApiError, adminMutations, adminQueries } =\n useAdminServices()\n\n const { id: adminId, text: adminText } = useAdminUI()\n\n const [open, setOpen] = React.useState(false)\n const queryClient = useQueryClient()\n const grant = useMutation(\n adminMutations.grantCustomerProductAccess(queryClient, customerId)\n )\n const { data: products } = useQuery({\n ...adminQueries.allProducts(),\n enabled: open,\n })\n const form = useForm({\n defaultValues: {\n productId: \"\",\n duration: DEFAULT_GRANT_DURATION as GrantDuration,\n until: \"\",\n note: \"\",\n },\n onSubmit: async ({ value }) => {\n const term = grantTerm(value.duration, value.until)\n if (!term) return\n try {\n await grant.mutateAsync({\n productId: value.productId,\n ...term,\n note: value.note.trim() || undefined,\n })\n toast.success(\"Product access granted\")\n handleOpenChange(false)\n } catch (err) {\n toastApiError(err, \"Grant product access\")\n }\n },\n })\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n if (!next) {\n form.reset()\n grant.reset()\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogTrigger\n render={\n <Button variant=\"outline\" size=\"sm\">\n <HugeiconsIcon icon={Add01Icon} className=\"size-4\" />\n <AdminMessage id={\" Product access\"} />\n </Button>\n }\n />\n <DialogContent className={DIALOG_FORM}>\n <DialogHeader>\n <DialogTitle>\n <AdminMessage id={\"Grant product access\"} />\n </DialogTitle>\n <DialogDescription>\n <AdminMessage\n id={\n \"Give this customer one of your products without a payment. They hold its keys while the grant lasts, including keys you add to the product later.\"\n }\n />\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n event.stopPropagation()\n void form.handleSubmit()\n }}\n className=\"grid gap-4\"\n >\n <div className=\"grid gap-3\">\n <form.Field\n name=\"productId\"\n validators={{\n onChange: ({ value }) => (value ? undefined : \"Pick a product\"),\n }}\n >\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-product\")}>\n <AdminMessage id={\"Product\"} />\n </Label>\n <Select\n value={field.state.value}\n onValueChange={(value) => field.handleChange(value ?? \"\")}\n >\n <SelectTrigger\n className=\"w-full\"\n id={adminId(\"pa-product\")}\n aria-invalid={field.state.meta.errors.length > 0}\n >\n <SelectValue placeholder={adminText(\"Pick a product\")} />\n </SelectTrigger>\n <SelectContent>\n {(products?.data ?? []).map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.display_name} ({p.key})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormFieldErrors errors={field.state.meta.errors} />\n </div>\n )}\n </form.Field>\n <form.Field name=\"duration\">\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-duration\")}>\n <AdminMessage id={\"How long it lasts\"} />\n </Label>\n <p className=\"text-[13px] text-muted-foreground\">\n <AdminMessage\n id={\"Days are added after any access they already have.\"}\n />\n </p>\n <Select\n items={GRANT_DURATIONS.map((d) => ({\n value: d.value,\n label: d.label,\n }))}\n value={field.state.value}\n onValueChange={(value) => {\n if (value) field.handleChange(value as GrantDuration)\n }}\n >\n <SelectTrigger\n className=\"w-full\"\n id={adminId(\"pa-duration\")}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {GRANT_DURATIONS.map((d) => (\n <SelectItem key={d.value} value={d.value}>\n {d.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </form.Field>\n <form.Subscribe selector={(state) => state.values.duration}>\n {(duration) =>\n duration === \"until\" ? (\n <form.Field\n name=\"until\"\n validators={{\n onChange: ({ value }) =>\n grantTerm(\"until\", value)\n ? undefined\n : \"Pick today or a later date\",\n }}\n >\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-until\")}>\n <AdminMessage id={\"Last day (UTC)\"} />\n </Label>\n <Input\n id={adminId(\"pa-until\")}\n type=\"date\"\n min={new Date().toISOString().slice(0, 10)}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(event) =>\n field.handleChange(event.target.value)\n }\n aria-invalid={field.state.meta.errors.length > 0}\n />\n <FormFieldErrors errors={field.state.meta.errors} />\n </div>\n )}\n </form.Field>\n ) : null\n }\n </form.Subscribe>\n <form.Field name=\"note\">\n {(field) => (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={adminId(\"pa-note\")}>\n <AdminMessage id={\"Note\"} />\n </Label>\n <Input\n id={adminId(\"pa-note\")}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(event) => field.handleChange(event.target.value)}\n placeholder={adminText(\"Why it was granted\")}\n />\n </div>\n )}\n </form.Field>\n </div>\n <DialogFooter>\n <form.Subscribe\n selector={(state) =>\n [\n state.values.productId,\n state.canSubmit,\n state.isSubmitting,\n grantTerm(state.values.duration, state.values.until) !== null,\n ] as const\n }\n >\n {([productId, canSubmit, isSubmitting, termValid]) => (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isSubmitting}\n onClick={() => handleOpenChange(false)}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n type=\"submit\"\n disabled={\n !productId || !canSubmit || isSubmitting || !termValid\n }\n >\n {isSubmitting ? \"Granting…\" : \"Grant access\"}\n </Button>\n </>\n )}\n </form.Subscribe>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\n// CustomerContactCard is who the customer is, from the merchant's directory:\n// read live, or the copy its SCIM provisioning keeps.\nfunction CustomerContactCard({ contact }: { contact: CustomerContact | null }) {\n return (\n <Card>\n <CardHeader className=\"pb-1\">\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Contact\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"text-sm\">\n {!contact ? (\n <p className=\"text-muted-foreground\">\n <AdminMessage\n id={\"Your directory holds no contact for this customer.\"}\n />\n </p>\n ) : (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1\">\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Email\"} />\n </dt>\n <dd className=\"truncate\">{contact.email ?? \"—\"}</dd>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Name\"} />\n </dt>\n <dd className=\"truncate\">{contact.name ?? \"—\"}</dd>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Username\"} />\n </dt>\n <dd className=\"truncate\">{contact.username ?? \"—\"}</dd>\n {contact.active !== null && (\n <>\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Directory\"} />\n </dt>\n <dd>\n <Badge variant={contact.active ? \"secondary\" : \"outline\"}>\n {contact.active ? \"Active\" : \"Deactivated\"}\n </Badge>\n </dd>\n </>\n )}\n <dt className=\"text-muted-foreground\">\n <AdminMessage id={\"Synced\"} />\n </dt>\n <dd className=\"tabular-nums\">\n {contact.synced_at ? formatDate(contact.synced_at) : \"Live\"}\n </dd>\n </dl>\n )}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as e, t, w as n } from "./admin-utils-
|
|
2
|
-
import { t as r } from "./admin-button-
|
|
1
|
+
import { f as e, t, w as n } from "./admin-utils-DnVY5fYd.js";
|
|
2
|
+
import { t as r } from "./admin-button-Oip73Plq.js";
|
|
3
3
|
import "react";
|
|
4
4
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
5
|
import { XIcon as o } from "lucide-react";
|
|
@@ -85,4 +85,4 @@ function g({ className: e, ...n }) {
|
|
|
85
85
|
//#endregion
|
|
86
86
|
export { p as a, m as i, f as n, h as o, g as r, l as s, c as t };
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=admin-dialog-
|
|
88
|
+
//# sourceMappingURL=admin-dialog-Ffx95AIT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-dialog-
|
|
1
|
+
{"version":3,"file":"admin-dialog-Ffx95AIT.js","names":[],"sources":["../src/admin/components/ui/dialog.tsx"],"sourcesContent":["\"use client\"\nimport { AdminMessage } from \"#orck/admin/ui-context\"\nimport { useAdminContext } from \"#orck/admin/context\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n return (\n <DialogPrimitive.Portal\n container={useAdminContext().portal}\n data-slot=\"dialog-portal\"\n {...props}\n />\n )\n}\n\nfunction DialogClose({ ...props }: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 data-closed:animate-out data-closed:fade-out-0 data-open:animate-in data-open:fade-in-0 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon />\n <span className=\"sr-only\">\n <AdminMessage id={\"Close\"} />\n </span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close render={<Button variant=\"outline\" />}>\n <AdminMessage id={\"Close\"} />\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"mappings":";;;;;;;AAWA,SAAS,EAAO,EAAE,GAAG,KAAqC;CACxD,OAAO,kBAAC,EAAgB,MAAjB;EAAsB,aAAU;EAAS,GAAI;CAAQ,CAAA;AAC9D;AAEA,SAAS,EAAc,EAAE,GAAG,KAAwC;CAClE,OAAO,kBAAC,EAAgB,SAAjB;EAAyB,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACzE;AAEA,SAAS,EAAa,EAAE,GAAG,KAAuC;CAChE,OACE,kBAAC,EAAgB,QAAjB;EACE,WAAW,EAAgB,CAAC,CAAC;EAC7B,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAMA,SAAS,EAAc,EACrB,cACA,GAAG,KAC8B;CACjC,OACE,kBAAC,EAAgB,UAAjB;EACE,aAAU;EACV,WAAW,EACT,yLACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAc,EACrB,cACA,aACA,qBAAkB,IAClB,GAAG,KAGF;CACD,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,CAAgB,CAAA,GAChB,kBAAC,EAAgB,OAAjB;EACE,aAAU;EACV,WAAW,EACT,0WACA,CACF;EACA,GAAI;EANN,UAAA,CAQG,GACA,KACC,kBAAC,EAAgB,OAAjB;GACE,aAAU;GACV,QACE,kBAAC,GAAD;IACE,SAAQ;IACR,WAAU;IACV,MAAK;GACN,CAAA;GAPL,UAAA,CAUE,kBAAC,GAAD,CAAQ,CAAA,GACR,kBAAC,QAAD;IAAM,WAAU;IACd,UAAA,kBAAC,GAAD,EAAc,IAAI,QAAU,CAAA;GACxB,CAAA,CACe;EAEJ,CAAA,CAAA;CACX,CAAA,CAAA,EAAA,CAAA;AAElB;AAEA,SAAS,EAAa,EAAE,cAAW,GAAG,KAAsC;CAC1E,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EAAG,uBAAuB,CAAS;EAC9C,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAa,EACpB,cACA,qBAAkB,IAClB,aACA,GAAG,KAGF;CACD,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EACT,4GACA,CACF;EACA,GAAI;EANN,UAAA,CAQG,GACA,KACC,kBAAC,EAAgB,OAAjB;GAAuB,QAAQ,kBAAC,GAAD,EAAQ,SAAQ,UAAW,CAAA;GACxD,UAAA,kBAAC,GAAD,EAAc,IAAI,QAAU,CAAA;EACP,CAAA,CAEtB;;AAET;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAsC;CACzE,OACE,kBAAC,EAAgB,OAAjB;EACE,aAAU;EACV,WAAW,EACT,mDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAkB,EACzB,cACA,GAAG,KACiC;CACpC,OACE,kBAAC,EAAgB,aAAjB;EACE,aAAU;EACV,WAAW,EACT,sGACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { E as e, l as t, o as n, w as r } from "./admin-utils-
|
|
2
|
-
import { t as i } from "./admin-button-
|
|
3
|
-
import { a, i as o, n as s, r as c, t as l } from "./admin-select-
|
|
1
|
+
import { E as e, l as t, o as n, w as r } from "./admin-utils-DnVY5fYd.js";
|
|
2
|
+
import { t as i } from "./admin-button-Oip73Plq.js";
|
|
3
|
+
import { a, i as o, n as s, r as c, t as l } from "./admin-select-CUXvh6j1.js";
|
|
4
4
|
import * as u from "react";
|
|
5
5
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
6
6
|
import { HugeiconsIcon as p } from "@hugeicons/react";
|
|
@@ -146,4 +146,4 @@ function S(e) {
|
|
|
146
146
|
//#endregion
|
|
147
147
|
export { b as i, x as n, y as r, S as t };
|
|
148
148
|
|
|
149
|
-
//# sourceMappingURL=admin-dom-
|
|
149
|
+
//# sourceMappingURL=admin-dom-lnNSQ7ke.js.map
|