@withpotter/pages-admin 0.13.0-next.124 → 0.13.0-next.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/_money/cash-postings.js +3 -20
- package/dist/admin/_money/cash-postings.js.map +1 -1
- package/dist/admin/_money/cash.module.css +0 -10
- package/dist/admin/_money/finder-format.js +0 -1
- package/dist/admin/_money/finder-format.js.map +1 -1
- package/dist/admin/_money/format.js +0 -1
- package/dist/admin/_money/format.js.map +1 -1
- package/dist/admin/_overview/activation-panel.js +6 -6
- package/dist/admin/_overview/activation-panel.js.map +1 -1
- package/dist/admin/_overview/attention-groups.js +8 -8
- package/dist/admin/_overview/attention-groups.js.map +1 -1
- package/dist/admin/_overview/attention-panel.js +33 -37
- package/dist/admin/_overview/attention-panel.js.map +1 -1
- package/dist/admin/_overview/attention.module.css +3 -0
- package/dist/admin/_overview/control-room.js +13 -41
- package/dist/admin/_overview/control-room.js.map +1 -1
- package/dist/admin/_overview/kpi-row.js +7 -7
- package/dist/admin/_overview/kpi-row.js.map +1 -1
- package/dist/admin/_overview/leaders-panel.js +1 -1
- package/dist/admin/_overview/leaders-panel.js.map +1 -1
- package/dist/admin/_overview/overdue-outstanding.js +1 -2
- package/dist/admin/_overview/overdue-outstanding.js.map +1 -1
- package/dist/admin/_overview/portfolio-panel.js +5 -5
- package/dist/admin/_overview/portfolio-panel.js.map +1 -1
- package/dist/admin/_overview/position-panel.js +12 -8
- package/dist/admin/_overview/position-panel.js.map +1 -1
- package/dist/admin/_pos/pos-figures.js +5 -18
- package/dist/admin/_pos/pos-figures.js.map +1 -1
- package/dist/admin/_pos/pos-rules.js +0 -2
- package/dist/admin/_pos/pos-rules.js.map +1 -1
- package/dist/admin/_pos/pos-words.js +1 -6
- package/dist/admin/_pos/pos-words.js.map +1 -1
- package/dist/admin/_pos/use-pos.js +1 -70
- package/dist/admin/_pos/use-pos.js.map +1 -1
- package/dist/admin/_shell/nav-config.js +3 -3
- package/dist/admin/_shell/nav-config.js.map +1 -1
- package/dist/admin/_shell/nav-filter.js +2 -4
- package/dist/admin/_shell/nav-filter.js.map +1 -1
- package/dist/admin/_shell/nav-row.js +2 -5
- package/dist/admin/_shell/nav-row.js.map +1 -1
- package/dist/admin/_shell/sidebar-footer.js +0 -20
- package/dist/admin/_shell/sidebar-footer.js.map +1 -1
- package/dist/admin/_shell/sidebar-footer.module.css +0 -17
- package/dist/admin/_shell/sidebar.js +15 -25
- package/dist/admin/_shell/sidebar.js.map +1 -1
- package/dist/admin/_shell/sidebar.module.css +0 -69
- package/dist/admin/_shell/use-fluid-hover.js +6 -37
- package/dist/admin/_shell/use-fluid-hover.js.map +1 -1
- package/dist/admin/_ui/admin.css +0 -7
- package/dist/admin/_ui/data-table.js +1 -1
- package/dist/admin/_ui/data-table.js.map +1 -1
- package/dist/admin/_ui/list-card.js +1 -1
- package/dist/admin/_ui/list-card.js.map +1 -1
- package/dist/admin/_ui/list-card.module.css +16 -2
- package/dist/admin/_ui/money-view.js +0 -1
- package/dist/admin/_ui/money-view.js.map +1 -1
- package/dist/admin/_ui/page-header.js +4 -31
- package/dist/admin/_ui/page-header.js.map +1 -1
- package/dist/admin/_ui/panel.module.css +10 -0
- package/dist/admin/_ui/stat-card.js +2 -11
- package/dist/admin/_ui/stat-card.js.map +1 -1
- package/dist/admin/_ui/trend.js +2 -2
- package/dist/admin/_ui/trend.js.map +1 -1
- package/dist/admin/_ui/workspace-tab.js +1 -11
- package/dist/admin/_ui/workspace-tab.js.map +1 -1
- package/dist/admin/accounts/account-panel.js +6 -49
- package/dist/admin/accounts/account-panel.js.map +1 -1
- package/dist/admin/accounts/account-panel.module.css +0 -73
- package/dist/admin/accounts/account-row.js +2 -11
- package/dist/admin/accounts/account-row.js.map +1 -1
- package/dist/admin/accounts/account-vitals.js +13 -15
- package/dist/admin/accounts/account-vitals.js.map +1 -1
- package/dist/admin/accounts/accounts-table.js +8 -39
- package/dist/admin/accounts/accounts-table.js.map +1 -1
- package/dist/admin/accounts/accounts-workspace.js +2 -2
- package/dist/admin/accounts/accounts-workspace.js.map +1 -1
- package/dist/admin/accounts/owner-session.js +6 -0
- package/dist/admin/accounts/owner-session.js.map +1 -1
- package/dist/admin/accounts/rows.module.css +0 -17
- package/dist/admin/audit/status-pill.js +0 -6
- package/dist/admin/audit/status-pill.js.map +1 -1
- package/dist/admin/audit/status-pill.module.css +0 -4
- package/dist/admin/commerce/commerce-overview.js +2 -2
- package/dist/admin/commerce/commerce-overview.js.map +1 -1
- package/dist/admin/commerce/merchant-meta.js +0 -1
- package/dist/admin/commerce/merchant-meta.js.map +1 -1
- package/dist/admin/commerce/merchant-view.js +2 -2
- package/dist/admin/commerce/merchant-view.js.map +1 -1
- package/dist/admin/feedback/prompt-operations.module.css +2 -0
- package/dist/admin/feedback/prompt-preview.module.css +2 -0
- package/dist/admin/hooks.js +1 -57
- package/dist/admin/hooks.js.map +1 -1
- package/dist/admin/layout.js +2 -8
- package/dist/admin/layout.js.map +1 -1
- package/dist/admin/page.js +8 -28
- package/dist/admin/page.js.map +1 -1
- package/dist/admin/payout-tiers/_tier-dialog.js +21 -31
- package/dist/admin/payout-tiers/_tier-dialog.js.map +1 -1
- package/dist/admin/payout-tiers/tier-preview-result.js +9 -10
- package/dist/admin/payout-tiers/tier-preview-result.js.map +1 -1
- package/dist/admin/payout-tiers/tiers-table.js +17 -40
- package/dist/admin/payout-tiers/tiers-table.js.map +1 -1
- package/dist/admin/payout-tiers/tiers-workspace.js +17 -20
- package/dist/admin/payout-tiers/tiers-workspace.js.map +1 -1
- package/dist/admin/pos/pos-workspace.js +2 -6
- package/dist/admin/pos/pos-workspace.js.map +1 -1
- package/dist/admin/pos/shifts-tab.js +9 -16
- package/dist/admin/pos/shifts-tab.js.map +1 -1
- package/dist/admin/revenue/cohort-panel.js +6 -6
- package/dist/admin/revenue/cohort-panel.js.map +1 -1
- package/dist/admin/revenue/health-panel.js +21 -22
- package/dist/admin/revenue/health-panel.js.map +1 -1
- package/dist/admin/revenue/plan-mix-panel.js +3 -3
- package/dist/admin/revenue/plan-mix-panel.js.map +1 -1
- package/dist/admin/revenue/quality-panel.js +19 -19
- package/dist/admin/revenue/quality-panel.js.map +1 -1
- package/dist/admin/revenue/revenue-kpis.js +50 -111
- package/dist/admin/revenue/revenue-kpis.js.map +1 -1
- package/dist/admin/revenue/revenue-overview.js +46 -39
- package/dist/admin/revenue/revenue-overview.js.map +1 -1
- package/dist/admin/revenue/revenue-retention.js +13 -17
- package/dist/admin/revenue/revenue-retention.js.map +1 -1
- package/dist/admin/revenue/revenue-workspace.js +6 -53
- package/dist/admin/revenue/revenue-workspace.js.map +1 -1
- package/dist/admin/revenue/subscriptions-panel.js +14 -14
- package/dist/admin/revenue/subscriptions-panel.js.map +1 -1
- package/dist/admin/revenue/top-tenants-panel.js +4 -4
- package/dist/admin/revenue/top-tenants-panel.js.map +1 -1
- package/dist/admin/settings/account-tab.js +25 -1
- package/dist/admin/settings/account-tab.js.map +1 -1
- package/dist/admin/settings/general-tab.js +2 -2
- package/dist/admin/settings/general-tab.js.map +1 -1
- package/dist/admin/settings/system-status-card.js +30 -0
- package/dist/admin/settings/system-status-card.js.map +1 -0
- package/dist/admin/support/queue-card.module.css +4 -1
- package/dist/admin/tenants/[id]/commerce/format.js +1 -2
- package/dist/admin/tenants/[id]/commerce/format.js.map +1 -1
- package/dist/admin/tenants/[id]/commerce/recent-orders.js +1 -1
- package/dist/admin/tenants/[id]/commerce/recent-orders.js.map +1 -1
- package/dist/admin/tenants/[id]/page.js +10 -37
- package/dist/admin/tenants/[id]/page.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-layout.module.css +4 -1
- package/dist/admin/tenants/[id]/tenant-overview.js +2 -3
- package/dist/admin/tenants/[id]/tenant-overview.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-overview.module.css +1 -1
- package/dist/admin/tenants/[id]/tenant-pos.js +16 -64
- package/dist/admin/tenants/[id]/tenant-pos.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-wallet-card.js +2 -3
- package/dist/admin/tenants/[id]/tenant-wallet-card.js.map +1 -1
- package/dist/admin/tenants/[id]/verification/document-viewer.js +52 -3
- package/dist/admin/tenants/[id]/verification/document-viewer.js.map +1 -1
- package/dist/admin/tenants/[id]/verification/document-viewer.module.css +0 -51
- package/dist/admin/tenants/[id]/verification/tenant-verification.js +0 -10
- package/dist/admin/tenants/[id]/verification/tenant-verification.js.map +1 -1
- package/dist/admin/tenants/tenant-list-row.js +1 -2
- package/dist/admin/tenants/tenant-list-row.js.map +1 -1
- package/dist/admin/tenants/tenants-table.js +2 -3
- package/dist/admin/tenants/tenants-table.js.map +1 -1
- package/dist/admin/tenants/tenants-workspace.js +2 -2
- package/dist/admin/tenants/tenants-workspace.js.map +1 -1
- package/dist/admin/verification/verification-page.js +3 -19
- package/dist/admin/verification/verification-page.js.map +1 -1
- package/dist/admin/verification/verification.module.css +0 -10
- package/dist/admin/verification/waiting-case-actions.js +68 -0
- package/dist/admin/verification/waiting-case-actions.js.map +1 -0
- package/dist/admin/verification/waiting-cases.js +48 -66
- package/dist/admin/verification/waiting-cases.js.map +1 -1
- package/package.json +5 -5
- package/dist/admin/_pos/olive-balance.js +0 -40
- package/dist/admin/_pos/olive-balance.js.map +0 -1
- package/dist/admin/_pos/olive-state.js +0 -23
- package/dist/admin/_pos/olive-state.js.map +0 -1
- package/dist/admin/_pos/payments-model.js +0 -55
- package/dist/admin/_pos/payments-model.js.map +0 -1
- package/dist/admin/_pos/tenant-operators.js +0 -63
- package/dist/admin/_pos/tenant-operators.js.map +0 -1
- package/dist/admin/_pos/tenant-outlets.js +0 -77
- package/dist/admin/_pos/tenant-outlets.js.map +0 -1
- package/dist/admin/_pos/tenant-pos-figures.js +0 -82
- package/dist/admin/_pos/tenant-pos-figures.js.map +0 -1
- package/dist/admin/_pos/tenant-requests.js +0 -64
- package/dist/admin/_pos/tenant-requests.js.map +0 -1
- package/dist/admin/_pos/tenant-transactions.js +0 -145
- package/dist/admin/_pos/tenant-transactions.js.map +0 -1
- package/dist/admin/_shell/nav-fold.js +0 -14
- package/dist/admin/_shell/nav-fold.js.map +0 -1
- package/dist/admin/_shell/nav-group.js +0 -78
- package/dist/admin/_shell/nav-group.js.map +0 -1
- package/dist/admin/_shell/use-open-groups.js +0 -64
- package/dist/admin/_shell/use-open-groups.js.map +0 -1
- package/dist/admin/_ui/page-header.module.css +0 -45
- package/dist/admin/accounts/account-sessions.js +0 -70
- package/dist/admin/accounts/account-sessions.js.map +0 -1
- package/dist/admin/accounts/account-sessions.module.css +0 -55
- package/dist/admin/accounts/account-stage-filter.js +0 -29
- package/dist/admin/accounts/account-stage-filter.js.map +0 -1
- package/dist/admin/accounts/account-stage.js +0 -81
- package/dist/admin/accounts/account-stage.js.map +0 -1
- package/dist/admin/accounts/hint.js +0 -12
- package/dist/admin/accounts/hint.js.map +0 -1
- package/dist/admin/payout-tiers/requirement-labels.js +0 -70
- package/dist/admin/payout-tiers/requirement-labels.js.map +0 -1
- package/dist/admin/pos/transactions-tab.js +0 -214
- package/dist/admin/pos/transactions-tab.js.map +0 -1
- package/dist/admin/revenue/channel-panel.js +0 -49
- package/dist/admin/revenue/channel-panel.js.map +0 -1
- package/dist/admin/revenue/channel-rows.js +0 -17
- package/dist/admin/revenue/channel-rows.js.map +0 -1
- package/dist/admin/revenue/download-button.js +0 -40
- package/dist/admin/revenue/download-button.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-colors.js +0 -25
- package/dist/admin/revenue/earnings/earnings-colors.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-legend.js +0 -75
- package/dist/admin/revenue/earnings/earnings-legend.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-summary.js +0 -308
- package/dist/admin/revenue/earnings/earnings-summary.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-table.js +0 -143
- package/dist/admin/revenue/earnings/earnings-table.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings.module.css +0 -201
- package/dist/admin/revenue/earnings/use-earnings.js +0 -27
- package/dist/admin/revenue/earnings/use-earnings.js.map +0 -1
- package/dist/admin/revenue/ledger-model.js +0 -104
- package/dist/admin/revenue/ledger-model.js.map +0 -1
- package/dist/admin/revenue/ledger.module.css +0 -144
- package/dist/admin/revenue/merchant-headline.js +0 -37
- package/dist/admin/revenue/merchant-headline.js.map +0 -1
- package/dist/admin/revenue/merchant-payments-view.js +0 -234
- package/dist/admin/revenue/merchant-payments-view.js.map +0 -1
- package/dist/admin/revenue/method-cards.js +0 -40
- package/dist/admin/revenue/method-cards.js.map +0 -1
- package/dist/admin/revenue/payment-drawer.js +0 -53
- package/dist/admin/revenue/payment-drawer.js.map +0 -1
- package/dist/admin/revenue/plan-lines.js +0 -36
- package/dist/admin/revenue/plan-lines.js.map +0 -1
- package/dist/admin/revenue/plan-payment-drawer.js +0 -42
- package/dist/admin/revenue/plan-payment-drawer.js.map +0 -1
- package/dist/admin/revenue/plans-panel.js +0 -48
- package/dist/admin/revenue/plans-panel.js.map +0 -1
- package/dist/admin/revenue/platform-fees.js +0 -9
- package/dist/admin/revenue/platform-fees.js.map +0 -1
- package/dist/admin/revenue/print-summary-button.js +0 -27
- package/dist/admin/revenue/print-summary-button.js.map +0 -1
- package/dist/admin/revenue/subscriptions-view.js +0 -213
- package/dist/admin/revenue/subscriptions-view.js.map +0 -1
- package/dist/admin/revenue/summary-download.js +0 -38
- package/dist/admin/revenue/summary-download.js.map +0 -1
- package/dist/admin/revenue/summary-print.js +0 -82
- package/dist/admin/revenue/summary-print.js.map +0 -1
- package/dist/admin/revenue/summary-rows.js +0 -44
- package/dist/admin/revenue/summary-rows.js.map +0 -1
- package/dist/admin/revenue/url-filters.js +0 -36
- package/dist/admin/revenue/url-filters.js.map +0 -1
- package/dist/admin/revenue/use-url-filters.js +0 -24
- package/dist/admin/revenue/use-url-filters.js.map +0 -1
- package/dist/admin/tenants/[id]/use-tenant-wallet.js +0 -23
- package/dist/admin/tenants/[id]/use-tenant-wallet.js.map +0 -1
- package/dist/admin/tenants/[id]/verification/document-file.js +0 -78
- package/dist/admin/tenants/[id]/verification/document-file.js.map +0 -1
- package/dist/admin/tenants/[id]/verification/sent-files.js +0 -33
- package/dist/admin/tenants/[id]/verification/sent-files.js.map +0 -1
- package/dist/admin/verification/preview-dialog.js +0 -111
- package/dist/admin/verification/preview-dialog.js.map +0 -1
package/dist/admin/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/hooks.ts"],"sourcesContent":["'use client';\n\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { platformAdminApi, type LedgerFilters } from '@withpotter/lib/admin-api';\nimport type { TenantListParams } from '@withpotter/lib/admin-tenants-query';\nimport type { AccountStage } from '@withpotter/lib/admin-account-types';\n\nexport function useAdminSession(enabled = true) {\n return useQuery({\n queryKey: ['platform-admin', 'session'],\n queryFn: () => platformAdminApi.me(),\n enabled,\n retry: false,\n staleTime: 60_000,\n });\n}\n\nexport function usePlatformOverview() {\n return useQuery({\n queryKey: ['platform-admin', 'overview'],\n queryFn: () => platformAdminApi.overview(),\n });\n}\n\nexport function usePlatformCockpit(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'cockpit', range],\n queryFn: () => platformAdminApi.cockpit(range),\n });\n}\n\nexport function usePlatformRevenue(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', range],\n queryFn: () => platformAdminApi.revenue(range),\n });\n}\n\n/**\n * How customers paid, per channel. Not every box can say: where the route is\n * absent the query fails once (no retry) and `data` stays undefined, which the\n * panels read as \"nothing to show\".\n */\nexport function useGatewayChannels(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'gateway-channels', range],\n queryFn: () => platformAdminApi.gatewayChannels(range),\n retry: false,\n staleTime: 60_000,\n });\n}\n\n/**\n * Revenue's Merchant payments view. A box without the route answers 404; the\n * view reads that as \"not available here\", never as a failure to retry.\n */\nexport function useMerchantPayments(filters: LedgerFilters) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', 'merchant-payments', filters],\n queryFn: () => platformAdminApi.merchantPayments(filters),\n retry: false,\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n });\n}\n\n/** Revenue's Subscriptions view: every plan payment merchants made to Olive. */\nexport function useSubscriptionPayments(filters: LedgerFilters) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', 'subscription-payments', filters],\n queryFn: () => platformAdminApi.subscriptionPayments(filters),\n retry: false,\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n });\n}\n\n/** Revenue's Merchants view: what each merchant received and how customers paid them. */\nexport function useMerchantRevenue(filters: LedgerFilters) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', 'merchants', filters],\n queryFn: () => platformAdminApi.merchantRevenue(filters),\n retry: false,\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n });\n}\n\n/** The merchants that took payments in the window, for the merchant picker. */\nexport function useMerchantOptions(range: { startDate?: string; endDate?: string }) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', 'merchant-options', range],\n queryFn: () => platformAdminApi.merchantOptions(range),\n retry: false,\n staleTime: 60_000,\n });\n}\n\nexport function usePlatformTenantsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenants-analytics', range],\n queryFn: () => platformAdminApi.tenantsAnalytics(range),\n });\n}\n\nexport function usePlatformTenants(params: TenantListParams) {\n return useQuery({\n queryKey: ['platform-admin', 'tenants', params],\n queryFn: () => platformAdminApi.tenants(params),\n });\n}\n\nexport function usePlatformTenant(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant', id, range],\n queryFn: () => platformAdminApi.tenant(id, range),\n enabled: !!id,\n });\n}\n\nexport function useTenantAnalytics(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-analytics', id, range],\n queryFn: () => platformAdminApi.tenantAnalytics(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantFinance(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-finance', id, range],\n queryFn: () => platformAdminApi.tenantFinance(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantTransactions(\n id: string,\n params: {\n status?: string;\n type?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-transactions', id, params],\n queryFn: () => platformAdminApi.tenantTransactions(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantCustomers(\n id: string,\n params: {\n search?: string;\n type?: string;\n status?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-customers', id, params],\n queryFn: () => platformAdminApi.tenantCustomers(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantProducts(\n id: string,\n params: { type?: string; search?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-products', id, params],\n queryFn: () => platformAdminApi.tenantProducts(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantProductInsights(\n id: string,\n range: { startDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-product-insights', id, range],\n queryFn: () => platformAdminApi.tenantProductInsights(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantCustomerInsights(\n id: string,\n range: { startDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-customer-insights', id, range],\n queryFn: () => platformAdminApi.tenantCustomerInsights(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantInvoices(\n id: string,\n params: {\n status?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-invoices', id, params],\n queryFn: () => platformAdminApi.tenantInvoices(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantLoyalty(id: string, enabled = true) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-loyalty', id],\n queryFn: () => platformAdminApi.tenantLoyalty(id),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantDiscounts(\n id: string,\n params: {\n status?: string;\n discountType?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-discounts', id, params],\n queryFn: () => platformAdminApi.tenantDiscounts(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantSettlements(\n id: string,\n params: {\n page?: number;\n limit?: number;\n startDate?: string;\n endDate?: string;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-settlements', id, params],\n queryFn: () => platformAdminApi.tenantSettlements(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantSubscriptions(\n id: string,\n params: {\n status?: string;\n planId?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-subscriptions', id, params],\n queryFn: () => platformAdminApi.tenantSubscriptions(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function usePlatformAccounts(params: {\n page?: number;\n pageSize?: number;\n search?: string;\n joinedFrom?: string;\n joinedTo?: string;\n stage?: AccountStage;\n}) {\n return useQuery({\n queryKey: ['platform-admin', 'accounts', params],\n queryFn: () => platformAdminApi.accounts(params),\n });\n}\n\nexport function usePlatformAccountsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'accounts-analytics', range],\n queryFn: () => platformAdminApi.accountsAnalytics(range),\n });\n}\n\nexport function usePlatformAdmins() {\n return useQuery({\n queryKey: ['platform-admin', 'admins'],\n queryFn: () => platformAdminApi.admins(),\n });\n}\n\nexport function usePlatformAdminsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'admins-analytics', range],\n queryFn: () => platformAdminApi.adminsAnalytics(range),\n });\n}\n\nexport function useAdminPermissions() {\n return useQuery({\n queryKey: ['platform-admin', 'admin-permissions'],\n queryFn: () => platformAdminApi.adminPermissions(),\n staleTime: 5 * 60_000,\n });\n}\n\nexport function useAdminRoles() {\n return useQuery({\n queryKey: ['platform-admin', 'roles'],\n queryFn: () => platformAdminApi.roles(),\n });\n}\n\nexport function useAccountSessions(id: string | null) {\n return useQuery({\n queryKey: ['platform-admin', 'account-sessions', id],\n queryFn: () => platformAdminApi.accountSessions(id!),\n enabled: !!id,\n });\n}\n\nexport function useAccountTenants(id: string | null) {\n return useQuery({\n queryKey: ['platform-admin', 'account-tenants', id],\n queryFn: () => platformAdminApi.accountTenants(id!),\n enabled: !!id,\n });\n}\n\nexport function usePlatformAudit(\n params: {\n page?: number;\n pageSize?: number;\n search?: string;\n action?: string;\n adminEmail?: string;\n from?: string;\n to?: string;\n } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'audit', params],\n queryFn: () => platformAdminApi.audit(params),\n });\n}\n\nexport function usePlatformAuditAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'audit-analytics', range],\n queryFn: () => platformAdminApi.auditAnalytics(range),\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/admin/hooks.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { platformAdminApi } from '@withpotter/lib/admin-api';\nimport type { TenantListParams } from '@withpotter/lib/admin-tenants-query';\n\nexport function useAdminSession(enabled = true) {\n return useQuery({\n queryKey: ['platform-admin', 'session'],\n queryFn: () => platformAdminApi.me(),\n enabled,\n retry: false,\n staleTime: 60_000,\n });\n}\n\nexport function usePlatformOverview() {\n return useQuery({\n queryKey: ['platform-admin', 'overview'],\n queryFn: () => platformAdminApi.overview(),\n });\n}\n\nexport function usePlatformCockpit(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'cockpit', range],\n queryFn: () => platformAdminApi.cockpit(range),\n });\n}\n\nexport function usePlatformRevenue(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'revenue', range],\n queryFn: () => platformAdminApi.revenue(range),\n });\n}\n\nexport function usePlatformTenantsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenants-analytics', range],\n queryFn: () => platformAdminApi.tenantsAnalytics(range),\n });\n}\n\nexport function usePlatformTenants(params: TenantListParams) {\n return useQuery({\n queryKey: ['platform-admin', 'tenants', params],\n queryFn: () => platformAdminApi.tenants(params),\n });\n}\n\nexport function usePlatformTenant(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant', id, range],\n queryFn: () => platformAdminApi.tenant(id, range),\n enabled: !!id,\n });\n}\n\nexport function useTenantAnalytics(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-analytics', id, range],\n queryFn: () => platformAdminApi.tenantAnalytics(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantFinance(\n id: string,\n range: { startDate?: string; endDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-finance', id, range],\n queryFn: () => platformAdminApi.tenantFinance(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantTransactions(\n id: string,\n params: {\n status?: string;\n type?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-transactions', id, params],\n queryFn: () => platformAdminApi.tenantTransactions(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantCustomers(\n id: string,\n params: {\n search?: string;\n type?: string;\n status?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-customers', id, params],\n queryFn: () => platformAdminApi.tenantCustomers(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantProducts(\n id: string,\n params: { type?: string; search?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-products', id, params],\n queryFn: () => platformAdminApi.tenantProducts(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantProductInsights(\n id: string,\n range: { startDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-product-insights', id, range],\n queryFn: () => platformAdminApi.tenantProductInsights(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantCustomerInsights(\n id: string,\n range: { startDate?: string } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-customer-insights', id, range],\n queryFn: () => platformAdminApi.tenantCustomerInsights(id, range),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantInvoices(\n id: string,\n params: {\n status?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-invoices', id, params],\n queryFn: () => platformAdminApi.tenantInvoices(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantLoyalty(id: string, enabled = true) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-loyalty', id],\n queryFn: () => platformAdminApi.tenantLoyalty(id),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantDiscounts(\n id: string,\n params: {\n status?: string;\n discountType?: string;\n search?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-discounts', id, params],\n queryFn: () => platformAdminApi.tenantDiscounts(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantSettlements(\n id: string,\n params: {\n page?: number;\n limit?: number;\n startDate?: string;\n endDate?: string;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-settlements', id, params],\n queryFn: () => platformAdminApi.tenantSettlements(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function useTenantSubscriptions(\n id: string,\n params: {\n status?: string;\n planId?: string;\n page?: number;\n limit?: number;\n } = {},\n enabled = true,\n) {\n return useQuery({\n queryKey: ['platform-admin', 'tenant-subscriptions', id, params],\n queryFn: () => platformAdminApi.tenantSubscriptions(id, params),\n enabled: !!id && enabled,\n });\n}\n\nexport function usePlatformAccounts(params: {\n page?: number;\n pageSize?: number;\n search?: string;\n joinedFrom?: string;\n joinedTo?: string;\n}) {\n return useQuery({\n queryKey: ['platform-admin', 'accounts', params],\n queryFn: () => platformAdminApi.accounts(params),\n });\n}\n\nexport function usePlatformAccountsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'accounts-analytics', range],\n queryFn: () => platformAdminApi.accountsAnalytics(range),\n });\n}\n\nexport function usePlatformAdmins() {\n return useQuery({\n queryKey: ['platform-admin', 'admins'],\n queryFn: () => platformAdminApi.admins(),\n });\n}\n\nexport function usePlatformAdminsAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'admins-analytics', range],\n queryFn: () => platformAdminApi.adminsAnalytics(range),\n });\n}\n\nexport function useAdminPermissions() {\n return useQuery({\n queryKey: ['platform-admin', 'admin-permissions'],\n queryFn: () => platformAdminApi.adminPermissions(),\n staleTime: 5 * 60_000,\n });\n}\n\nexport function useAdminRoles() {\n return useQuery({\n queryKey: ['platform-admin', 'roles'],\n queryFn: () => platformAdminApi.roles(),\n });\n}\n\nexport function useAccountTenants(id: string | null) {\n return useQuery({\n queryKey: ['platform-admin', 'account-tenants', id],\n queryFn: () => platformAdminApi.accountTenants(id!),\n enabled: !!id,\n });\n}\n\nexport function usePlatformAudit(\n params: {\n page?: number;\n pageSize?: number;\n search?: string;\n action?: string;\n adminEmail?: string;\n from?: string;\n to?: string;\n } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'audit', params],\n queryFn: () => platformAdminApi.audit(params),\n });\n}\n\nexport function usePlatformAuditAnalytics(\n range: { startDate?: string; endDate?: string } = {},\n) {\n return useQuery({\n queryKey: ['platform-admin', 'audit-analytics', range],\n queryFn: () => platformAdminApi.auditAnalytics(range),\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/admin/layout.js
CHANGED
|
@@ -32,9 +32,7 @@ function AdminLayout({
|
|
|
32
32
|
children,
|
|
33
33
|
modules = NO_MODULES,
|
|
34
34
|
additions = NO_ADDITIONS,
|
|
35
|
-
brand
|
|
36
|
-
badges,
|
|
37
|
-
footerActions
|
|
35
|
+
brand
|
|
38
36
|
}) {
|
|
39
37
|
const pathname = usePathname();
|
|
40
38
|
const router = useRouter();
|
|
@@ -90,11 +88,7 @@ function AdminLayout({
|
|
|
90
88
|
collapsed: prefs.rail,
|
|
91
89
|
email: session.email ?? "",
|
|
92
90
|
role: session.role,
|
|
93
|
-
|
|
94
|
-
(action) => !action.superadmin || session.role === "superadmin"
|
|
95
|
-
),
|
|
96
|
-
onSearch: prefs.openPalette,
|
|
97
|
-
badges
|
|
91
|
+
onSearch: prefs.openPalette
|
|
98
92
|
}
|
|
99
93
|
),
|
|
100
94
|
!prefs.narrow && /* @__PURE__ */ jsx(
|
package/dist/admin/layout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect
|
|
1
|
+
{"version":3,"sources":["../../src/admin/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect } from 'react';\nimport { MotionConfig } from 'motion/react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { useAdminSession } from './hooks';\nimport { InboxAlerts } from './_inbox/nav-badge';\nimport { CommandPalette } from './_shell/command-palette';\nimport { PRODUCT_FEEDBACK_NAV, type NavAddition } from './_shell/nav-config';\nimport { canAccess, visibleGroups } from './_shell/nav-filter';\nimport { moduleOn, type AdminModules } from './_shell/nav-modules';\nimport { AdminModulesProvider } from './_shell/modules-context';\nimport { SeamToggle } from './_shell/seam-toggle';\nimport { SectionTabs } from './_shell/section-tabs';\nimport { Sidebar } from './_shell/sidebar';\nimport { Topbar } from './_shell/topbar';\nimport { AdminBrandProvider, type AdminBrand } from './_shell/admin-brand';\nimport { useShellPrefs } from './_shell/use-shell-prefs';\nimport { ShellSkeleton } from './_shell/shell-skeleton';\nimport { useAdminQueryDefaults } from './_shell/use-admin-query-defaults';\nimport { PageTransition } from './_fx';\nimport { LiveAnnouncer, useApplyPreferences, useStartPage } from './_settings';\nimport styles from './_shell/frame.module.css';\nimport './_ui/admin.css';\nimport './_ui/motion.css';\nimport './_ui/preferences.css';\nimport './_ui/tint.css';\n\nexport type { AdminModule, AdminModules } from './_shell/nav-modules';\nexport type { NavAddition, NavItem } from './_shell/nav-config';\nexport type { AdminBrand } from './_shell/admin-brand';\n\nconst AUTH_ROUTES = ['/admin/login', '/admin/change-password'];\n\nconst NO_MODULES: AdminModules = {};\nconst NO_ADDITIONS: NavAddition[] = [];\n\n/**\n * The Box admin shell. A host turns on the Box modules its engine serves\n * (`modules`), adds its own pages into the menu's groups (`additions`) and\n * shows its own logo and mark (`brand`). A module that is off is not listed anywhere.\n */\nexport default function AdminLayout({\n children,\n modules = NO_MODULES,\n additions = NO_ADDITIONS,\n brand,\n}: {\n children: React.ReactNode;\n modules?: AdminModules;\n additions?: NavAddition[];\n brand?: AdminBrand;\n}) {\n const pathname = usePathname();\n const router = useRouter();\n const isAuthRoute = AUTH_ROUTES.includes(pathname);\n const { data: session, isLoading, isError } = useAdminSession(!isAuthRoute);\n const prefs = useShellPrefs();\n const { shellProps, reducedMotion } = useApplyPreferences();\n const ready = !isAuthRoute && !!session && !session.mustChangePassword;\n const allowed = useCallback(\n (href: string) =>\n !!session &&\n visibleGroups(session, modules, additions).some((g) =>\n g.items.some((item) => item.href === href),\n ),\n [session, modules, additions],\n );\n\n useAdminQueryDefaults();\n useStartPage(pathname, ready, allowed);\n\n useEffect(() => {\n if (isAuthRoute || isLoading) return;\n\n if (isError) {\n // Back to this page after signing in.\n const back = encodeURIComponent(pathname + window.location.search);\n router.replace(`/admin/login?redirect=${back}`);\n } else if (session?.mustChangePassword) {\n router.replace('/admin/change-password');\n }\n }, [isAuthRoute, isLoading, isError, session, router]);\n\n if (isAuthRoute) {\n return <AdminBrandProvider value={brand}>{children}</AdminBrandProvider>;\n }\n\n if (isLoading) return <ShellSkeleton />;\n\n if (isError || !session || session.mustChangePassword) return null;\n\n const groups = visibleGroups(session, modules, additions);\n const canSupport = groups.some((g) =>\n g.items.some(({ href }) => href === '/admin/support'),\n );\n // The bell and the inbox counts read Product feedback (and Support when\n // this admin has it), so they run only where feedback is served.\n const showInbox = moduleOn(modules, 'feedback');\n const feedbackTabs = PRODUCT_FEEDBACK_NAV.filter(canAccess(session)).filter(\n (tab) => moduleOn(modules, tab.module),\n );\n // One tab left is no choice, so the strip only shows with two or more.\n const showFeedbackTabs =\n showInbox &&\n feedbackTabs.length > 1 &&\n feedbackTabs.some(({ href }) => pathname.startsWith(href));\n\n return (\n <AdminBrandProvider value={brand}>\n <AdminModulesProvider value={modules}>\n <MotionConfig reducedMotion={reducedMotion}>\n <div\n className={`adm-shell ${styles.shell}`}\n data-collapsed={prefs.rail}\n {...shellProps}\n >\n <Sidebar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n collapsed={prefs.rail}\n email={session.email ?? ''}\n role={session.role}\n onSearch={prefs.openPalette}\n />\n {!prefs.narrow && (\n <SeamToggle\n collapsed={prefs.collapsed}\n onToggle={prefs.toggleCollapsed}\n />\n )}\n <div className={styles.column}>\n <Topbar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n showInbox={showInbox}\n />\n <main\n className={`adm-main ${styles.main}`}\n data-full={pathname.startsWith('/admin/support') || undefined}\n >\n {showFeedbackTabs && (\n <SectionTabs\n items={feedbackTabs}\n pathname={pathname}\n label=\"Product feedback\"\n />\n )}\n <PageTransition routeKey={pathname}>{children}</PageTransition>\n </main>\n </div>\n {showInbox && (\n <InboxAlerts canSupport={canSupport} pathname={pathname} />\n )}\n <CommandPalette\n groups={groups}\n open={prefs.paletteOpen}\n onClose={prefs.closePalette}\n />\n <LiveAnnouncer />\n </div>\n </MotionConfig>\n </AdminModulesProvider>\n </AdminBrandProvider>\n );\n}\n"],"mappings":";AAqFW,cAsDG,YAtDH;AAnFX,SAAS,aAAa,iBAAiB;AACvC,SAAS,oBAAoB;AAC7B,SAAS,aAAa,iBAAiB;AACvC,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,4BAA8C;AACvD,SAAS,WAAW,qBAAqB;AACzC,SAAS,gBAAmC;AAC5C,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,0BAA2C;AACpD,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,eAAe,qBAAqB,oBAAoB;AACjE,OAAO,YAAY;AACnB,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AAMP,MAAM,cAAc,CAAC,gBAAgB,wBAAwB;AAE7D,MAAM,aAA2B,CAAC;AAClC,MAAM,eAA8B,CAAC;AAOtB,SAAR,YAA6B;AAAA,EAClC;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AACF,GAKG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,YAAY,SAAS,QAAQ;AACjD,QAAM,EAAE,MAAM,SAAS,WAAW,QAAQ,IAAI,gBAAgB,CAAC,WAAW;AAC1E,QAAM,QAAQ,cAAc;AAC5B,QAAM,EAAE,YAAY,cAAc,IAAI,oBAAoB;AAC1D,QAAM,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,QAAQ;AACpD,QAAM,UAAU;AAAA,IACd,CAAC,SACC,CAAC,CAAC,WACF,cAAc,SAAS,SAAS,SAAS,EAAE;AAAA,MAAK,CAAC,MAC/C,EAAE,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAAA,IAC3C;AAAA,IACF,CAAC,SAAS,SAAS,SAAS;AAAA,EAC9B;AAEA,wBAAsB;AACtB,eAAa,UAAU,OAAO,OAAO;AAErC,YAAU,MAAM;AACd,QAAI,eAAe,UAAW;AAE9B,QAAI,SAAS;AAEX,YAAM,OAAO,mBAAmB,WAAW,OAAO,SAAS,MAAM;AACjE,aAAO,QAAQ,yBAAyB,IAAI,EAAE;AAAA,IAChD,WAAW,SAAS,oBAAoB;AACtC,aAAO,QAAQ,wBAAwB;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,SAAS,SAAS,MAAM,CAAC;AAErD,MAAI,aAAa;AACf,WAAO,oBAAC,sBAAmB,OAAO,OAAQ,UAAS;AAAA,EACrD;AAEA,MAAI,UAAW,QAAO,oBAAC,iBAAc;AAErC,MAAI,WAAW,CAAC,WAAW,QAAQ,mBAAoB,QAAO;AAE9D,QAAM,SAAS,cAAc,SAAS,SAAS,SAAS;AACxD,QAAM,aAAa,OAAO;AAAA,IAAK,CAAC,MAC9B,EAAE,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,gBAAgB;AAAA,EACtD;AAGA,QAAM,YAAY,SAAS,SAAS,UAAU;AAC9C,QAAM,eAAe,qBAAqB,OAAO,UAAU,OAAO,CAAC,EAAE;AAAA,IACnE,CAAC,QAAQ,SAAS,SAAS,IAAI,MAAM;AAAA,EACvC;AAEA,QAAM,mBACJ,aACA,aAAa,SAAS,KACtB,aAAa,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,WAAW,IAAI,CAAC;AAE3D,SACE,oBAAC,sBAAmB,OAAO,OACzB,8BAAC,wBAAqB,OAAO,SAC3B,8BAAC,gBAAa,eACZ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,aAAa,OAAO,KAAK;AAAA,MACpC,kBAAgB,MAAM;AAAA,MACrB,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,MAAM;AAAA,YACjB,OAAO,QAAQ,SAAS;AAAA,YACxB,MAAM,QAAQ;AAAA,YACd,UAAU,MAAM;AAAA;AAAA,QAClB;AAAA,QACC,CAAC,MAAM,UACN;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,UAAU,MAAM;AAAA;AAAA,QAClB;AAAA,QAEF,qBAAC,SAAI,WAAW,OAAO,QACrB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,YAAY,OAAO,IAAI;AAAA,cAClC,aAAW,SAAS,WAAW,gBAAgB,KAAK;AAAA,cAEnD;AAAA,oCACC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP;AAAA,oBACA,OAAM;AAAA;AAAA,gBACR;AAAA,gBAEF,oBAAC,kBAAe,UAAU,UAAW,UAAS;AAAA;AAAA;AAAA,UAChD;AAAA,WACF;AAAA,QACC,aACC,oBAAC,eAAY,YAAwB,UAAoB;AAAA,QAE3D;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA;AAAA,QACjB;AAAA,QACA,oBAAC,iBAAc;AAAA;AAAA;AAAA,EACjB,GACF,GACF,GACF;AAEJ;","names":[]}
|
package/dist/admin/page.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
useCurrencyParam,
|
|
20
20
|
usePersistedDateRange
|
|
21
21
|
} from "./_ui";
|
|
22
|
-
import {
|
|
22
|
+
import { usePlatformCockpit } from "./hooks";
|
|
23
23
|
import { ActivationPanel } from "./_overview/activation-panel";
|
|
24
24
|
import { AttentionPanel } from "./_overview/attention-panel";
|
|
25
25
|
import { ControlRoom } from "./_overview/control-room";
|
|
@@ -27,7 +27,6 @@ import { KpiRow } from "./_overview/kpi-row";
|
|
|
27
27
|
import { LeadersPanel } from "./_overview/leaders-panel";
|
|
28
28
|
import { PortfolioPanel } from "./_overview/portfolio-panel";
|
|
29
29
|
import { PositionPanel } from "./_overview/position-panel";
|
|
30
|
-
import { ChannelPanel } from "./revenue/channel-panel";
|
|
31
30
|
function AdminIndexPage() {
|
|
32
31
|
const {
|
|
33
32
|
rangeKey,
|
|
@@ -46,10 +45,6 @@ function AdminIndexPage() {
|
|
|
46
45
|
startDate: range.startDate,
|
|
47
46
|
endDate: range.endDate
|
|
48
47
|
});
|
|
49
|
-
const channels = useGatewayChannels({
|
|
50
|
-
startDate: range.startDate,
|
|
51
|
-
endDate: range.endDate
|
|
52
|
-
});
|
|
53
48
|
const currencies = useMemo(
|
|
54
49
|
() => cockpit.data?.currencies ?? [],
|
|
55
50
|
[cockpit.data]
|
|
@@ -62,12 +57,12 @@ function AdminIndexPage() {
|
|
|
62
57
|
const gmvTrend = useMemo(() => toTrend(series, "gmv"), [series]);
|
|
63
58
|
const ordersTrend = useMemo(() => toTrend(series, "orders"), [series]);
|
|
64
59
|
if (cockpit.isLoading) {
|
|
65
|
-
return /* @__PURE__ */ jsx(AdmLoading, { label: "Loading
|
|
60
|
+
return /* @__PURE__ */ jsx(AdmLoading, { label: "Loading platform operations" });
|
|
66
61
|
}
|
|
67
62
|
if (cockpit.isError || !cockpit.data) {
|
|
68
63
|
return /* @__PURE__ */ jsxs("div", { className: "adm-panel", role: "alert", children: [
|
|
69
|
-
/* @__PURE__ */ jsx("strong", { children: "
|
|
70
|
-
/* @__PURE__ */ jsx("p", { className: "mb-0 mt-2 text-sm text-[var(--text-secondary)]", children: "
|
|
64
|
+
/* @__PURE__ */ jsx("strong", { children: "Platform operations could not be loaded." }),
|
|
65
|
+
/* @__PURE__ */ jsx("p", { className: "mb-0 mt-2 text-sm text-[var(--text-secondary)]", children: "The range-aware admin API did not return the operating summary." }),
|
|
71
66
|
/* @__PURE__ */ jsx(
|
|
72
67
|
"button",
|
|
73
68
|
{
|
|
@@ -87,8 +82,8 @@ function AdminIndexPage() {
|
|
|
87
82
|
/* @__PURE__ */ jsx(
|
|
88
83
|
PageHeader,
|
|
89
84
|
{
|
|
90
|
-
title: "
|
|
91
|
-
description: "
|
|
85
|
+
title: "Platform operations",
|
|
86
|
+
description: "Merchant growth, money movement and exceptions to review.",
|
|
92
87
|
actions: /* @__PURE__ */ jsxs("div", { className: "adm-toolbar", children: [
|
|
93
88
|
/* @__PURE__ */ jsx(
|
|
94
89
|
CurrencyFilter,
|
|
@@ -111,14 +106,7 @@ function AdminIndexPage() {
|
|
|
111
106
|
] })
|
|
112
107
|
}
|
|
113
108
|
),
|
|
114
|
-
/* @__PURE__ */ jsx(
|
|
115
|
-
ControlRoom,
|
|
116
|
-
{
|
|
117
|
-
attention: data.attention,
|
|
118
|
-
currency,
|
|
119
|
-
totals: data.totals
|
|
120
|
-
}
|
|
121
|
-
),
|
|
109
|
+
/* @__PURE__ */ jsx(ControlRoom, { attention: data.attention, currency }),
|
|
122
110
|
/* @__PURE__ */ jsx(
|
|
123
111
|
KpiRow,
|
|
124
112
|
{
|
|
@@ -130,7 +118,7 @@ function AdminIndexPage() {
|
|
|
130
118
|
}
|
|
131
119
|
),
|
|
132
120
|
/* @__PURE__ */ jsxs("div", { className: "adm-grid", children: [
|
|
133
|
-
/* @__PURE__ */ jsx("div", { className: "adm-span-8", children: /* @__PURE__ */ jsx(Panel, { title: "
|
|
121
|
+
/* @__PURE__ */ jsx("div", { className: "adm-span-8", children: /* @__PURE__ */ jsx(Panel, { title: "Processing volume", caption, children: focus ? /* @__PURE__ */ jsx(
|
|
134
122
|
GmvOrdersChart,
|
|
135
123
|
{
|
|
136
124
|
gmvTrend,
|
|
@@ -144,14 +132,6 @@ function AdminIndexPage() {
|
|
|
144
132
|
) : /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)]", children: PICK_CURRENCY }) }) }),
|
|
145
133
|
/* @__PURE__ */ jsx("div", { className: "adm-span-4", children: /* @__PURE__ */ jsx(PositionPanel, { data, currency }) })
|
|
146
134
|
] }),
|
|
147
|
-
channels.data && channels.data.byChannel.length > 0 && /* @__PURE__ */ jsx("div", { className: "adm-grid", children: /* @__PURE__ */ jsx("div", { className: "adm-span-12", children: /* @__PURE__ */ jsx(
|
|
148
|
-
ChannelPanel,
|
|
149
|
-
{
|
|
150
|
-
totals: channels.data.byChannel,
|
|
151
|
-
focus,
|
|
152
|
-
caption
|
|
153
|
-
}
|
|
154
|
-
) }) }),
|
|
155
135
|
/* @__PURE__ */ jsx("div", { className: "adm-grid", children: /* @__PURE__ */ jsx("div", { className: "adm-span-12", children: /* @__PURE__ */ jsx(ActivationPanel, { activation: data.activation }) }) }),
|
|
156
136
|
/* @__PURE__ */ jsxs("div", { className: "adm-grid", children: [
|
|
157
137
|
/* @__PURE__ */ jsx("div", { className: "adm-span-4", children: /* @__PURE__ */ jsx(AttentionPanel, { attention: data.attention }) }),
|
package/dist/admin/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/page.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport {\n AdmLoading,\n CurrencyFilter,\n GmvOrdersChart,\n PICK_CURRENCY,\n PageHeader,\n Panel,\n PeriodSelector,\n periodPhrase,\n customRange,\n focusCurrency,\n moneyIn,\n rangeFromKey,\n rowFor,\n toTrend,\n useCurrencyParam,\n usePersistedDateRange,\n} from './_ui';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/admin/page.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport {\n AdmLoading,\n CurrencyFilter,\n GmvOrdersChart,\n PICK_CURRENCY,\n PageHeader,\n Panel,\n PeriodSelector,\n periodPhrase,\n customRange,\n focusCurrency,\n moneyIn,\n rangeFromKey,\n rowFor,\n toTrend,\n useCurrencyParam,\n usePersistedDateRange,\n} from './_ui';\nimport { usePlatformCockpit } from './hooks';\nimport { ActivationPanel } from './_overview/activation-panel';\nimport { AttentionPanel } from './_overview/attention-panel';\nimport { ControlRoom } from './_overview/control-room';\nimport { KpiRow } from './_overview/kpi-row';\nimport { LeadersPanel } from './_overview/leaders-panel';\nimport { PortfolioPanel } from './_overview/portfolio-panel';\nimport { PositionPanel } from './_overview/position-panel';\n\nexport default function AdminIndexPage() {\n const {\n rangeKey,\n setRangeKey,\n customStart,\n customEnd,\n onCustomChange,\n compare,\n } = usePersistedDateRange();\n // Money comes back once per currency; `?currency=` narrows it to one.\n const [currency, setCurrency] = useCurrencyParam();\n const range = useMemo(\n () =>\n rangeKey === 'custom'\n ? customRange(customStart, customEnd)\n : rangeFromKey(rangeKey),\n [customEnd, customStart, rangeKey],\n );\n const cockpit = usePlatformCockpit({\n startDate: range.startDate,\n endDate: range.endDate,\n });\n const currencies = useMemo(\n () => cockpit.data?.currencies ?? [],\n [cockpit.data],\n );\n // A chart can only draw one currency: the filter's, or the only one.\n const focus = focusCurrency(currencies, currency);\n const series = useMemo(\n () =>\n rowFor(cockpit.data?.trend.performanceSeriesByCurrency, focus)?.series,\n [cockpit.data, focus],\n );\n const gmvTrend = useMemo(() => toTrend(series, 'gmv'), [series]);\n const ordersTrend = useMemo(() => toTrend(series, 'orders'), [series]);\n\n if (cockpit.isLoading) {\n return <AdmLoading label=\"Loading platform operations\" />;\n }\n\n if (cockpit.isError || !cockpit.data) {\n return (\n <div className=\"adm-panel\" role=\"alert\">\n <strong>Platform operations could not be loaded.</strong>\n <p className=\"mb-0 mt-2 text-sm text-[var(--text-secondary)]\">\n The range-aware admin API did not return the operating summary.\n </p>\n <button\n type=\"button\"\n className=\"mt-4 text-sm font-semibold text-[var(--accent-primary)]\"\n onClick={() => void cockpit.refetch()}\n >\n Try again\n </button>\n </div>\n );\n }\n\n const data = cockpit.data;\n const span = periodPhrase(range);\n const period = `${span[0].toUpperCase()}${span.slice(1)}`;\n const caption = focus ? `${period} · ${focus}` : period;\n\n return (\n <div>\n <PageHeader\n title=\"Platform operations\"\n description=\"Merchant growth, money movement and exceptions to review.\"\n actions={\n <div className=\"adm-toolbar\">\n <CurrencyFilter\n value={currency}\n onChange={setCurrency}\n currencies={currencies}\n />\n <PeriodSelector\n value={rangeKey}\n onChange={setRangeKey}\n customStart={customStart}\n customEnd={customEnd}\n onCustomChange={onCustomChange}\n />\n </div>\n }\n />\n\n <ControlRoom attention={data.attention} currency={currency} />\n\n <KpiRow\n data={data}\n currency={currency}\n focus={focus}\n compare={compare}\n caption={caption}\n />\n\n <div className=\"adm-grid\">\n <div className=\"adm-span-8\">\n <Panel title=\"Processing volume\" caption={caption}>\n {focus ? (\n <GmvOrdersChart\n gmvTrend={gmvTrend}\n ordersTrend={ordersTrend}\n previousGmvTrend={[]}\n previousOrdersTrend={[]}\n compare={false}\n span={span}\n money={moneyIn(focus)}\n />\n ) : (\n <p className=\"text-sm text-[var(--text-secondary)]\">\n {PICK_CURRENCY}\n </p>\n )}\n </Panel>\n </div>\n <div className=\"adm-span-4\">\n <PositionPanel data={data} currency={currency} />\n </div>\n </div>\n\n <div className=\"adm-grid\">\n <div className=\"adm-span-12\">\n <ActivationPanel activation={data.activation} />\n </div>\n </div>\n\n <div className=\"adm-grid\">\n <div className=\"adm-span-4\">\n <AttentionPanel attention={data.attention} />\n </div>\n <div className=\"adm-span-4\">\n <LeadersPanel\n tenants={rowFor(data.topTenantsByCurrency, focus)?.tenants ?? []}\n focus={focus}\n caption={focus ? `${span} · ${focus}` : span}\n />\n </div>\n <div className=\"adm-span-4\">\n <PortfolioPanel\n statuses={data.statusBreakdown}\n industries={data.industryBreakdown}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -7,7 +7,6 @@ import { Banner } from "@withpotter/ui-kit/banner";
|
|
|
7
7
|
import { Input } from "@withpotter/ui-kit/input";
|
|
8
8
|
import { Checkbox } from "@withpotter/ui-kit/checkbox";
|
|
9
9
|
import { Field } from "@withpotter/ui-kit/field";
|
|
10
|
-
import { requirementGroupLabel, requirementLabel } from "./requirement-labels";
|
|
11
10
|
import { formatMinor, parseMajorToMinor } from "@withpotter/lib/money-minor";
|
|
12
11
|
import {
|
|
13
12
|
TIER_REQUIREMENTS
|
|
@@ -54,15 +53,15 @@ function TierDialog({
|
|
|
54
53
|
const dailyMaximumMinor = parseMajorToMinor(daily, code);
|
|
55
54
|
const monthlyMaximumMinor = monthly ? parseMajorToMinor(monthly, code) : null;
|
|
56
55
|
if (!key.trim() || !label.trim())
|
|
57
|
-
return setFormError("
|
|
56
|
+
return setFormError("Key and label are required.");
|
|
58
57
|
if (!minimumMinor || !maximumMinor || !dailyMaximumMinor)
|
|
59
58
|
return setFormError(
|
|
60
|
-
"
|
|
59
|
+
"Minimum, maximum and daily limit must be valid amounts."
|
|
61
60
|
);
|
|
62
61
|
if (monthly && !monthlyMaximumMinor)
|
|
63
|
-
return setFormError("The monthly limit
|
|
62
|
+
return setFormError("The monthly limit is not a valid amount.");
|
|
64
63
|
if (!/^\d+$/.test(position))
|
|
65
|
-
return setFormError("
|
|
64
|
+
return setFormError("Position must be a whole number.");
|
|
66
65
|
onSave({
|
|
67
66
|
key: key.trim(),
|
|
68
67
|
currency: code,
|
|
@@ -80,7 +79,7 @@ function TierDialog({
|
|
|
80
79
|
FormDialog,
|
|
81
80
|
{
|
|
82
81
|
title: tier ? "Edit tier" : "New payout tier",
|
|
83
|
-
description: "
|
|
82
|
+
description: "Limits a business gets once it has passed every listed verification.",
|
|
84
83
|
size: "lg",
|
|
85
84
|
onClose,
|
|
86
85
|
footer: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -90,24 +89,15 @@ function TierDialog({
|
|
|
90
89
|
children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
91
90
|
(formError || error) && /* @__PURE__ */ jsx(Banner, { tone: "error", children: formError ?? error }),
|
|
92
91
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
|
|
93
|
-
/* @__PURE__ */ jsx(
|
|
94
|
-
|
|
92
|
+
/* @__PURE__ */ jsx(Field, { label: "Key", htmlFor: "t-key", required: true, children: /* @__PURE__ */ jsx(
|
|
93
|
+
Input,
|
|
95
94
|
{
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
hint: "A unique code for this level, for example starter.",
|
|
100
|
-
children: /* @__PURE__ */ jsx(
|
|
101
|
-
Input,
|
|
102
|
-
{
|
|
103
|
-
id: "t-key",
|
|
104
|
-
value: key,
|
|
105
|
-
onChange: (e) => setKey(e.target.value)
|
|
106
|
-
}
|
|
107
|
-
)
|
|
95
|
+
id: "t-key",
|
|
96
|
+
value: key,
|
|
97
|
+
onChange: (e) => setKey(e.target.value)
|
|
108
98
|
}
|
|
109
|
-
),
|
|
110
|
-
/* @__PURE__ */ jsx(Field, { label: "
|
|
99
|
+
) }),
|
|
100
|
+
/* @__PURE__ */ jsx(Field, { label: "Label", htmlFor: "t-label", required: true, children: /* @__PURE__ */ jsx(
|
|
111
101
|
Input,
|
|
112
102
|
{
|
|
113
103
|
id: "t-label",
|
|
@@ -127,9 +117,9 @@ function TierDialog({
|
|
|
127
117
|
/* @__PURE__ */ jsx(
|
|
128
118
|
Field,
|
|
129
119
|
{
|
|
130
|
-
label: "
|
|
120
|
+
label: "Position",
|
|
131
121
|
htmlFor: "t-pos",
|
|
132
|
-
hint: "
|
|
122
|
+
hint: "Higher tiers are chosen first when a business qualifies for several.",
|
|
133
123
|
children: /* @__PURE__ */ jsx(
|
|
134
124
|
Input,
|
|
135
125
|
{
|
|
@@ -141,7 +131,7 @@ function TierDialog({
|
|
|
141
131
|
)
|
|
142
132
|
}
|
|
143
133
|
),
|
|
144
|
-
/* @__PURE__ */ jsx(Field, { label: "
|
|
134
|
+
/* @__PURE__ */ jsx(Field, { label: "Per-transfer minimum", htmlFor: "t-min", required: true, children: /* @__PURE__ */ jsx(
|
|
145
135
|
Input,
|
|
146
136
|
{
|
|
147
137
|
id: "t-min",
|
|
@@ -150,7 +140,7 @@ function TierDialog({
|
|
|
150
140
|
onChange: (e) => setMin(e.target.value)
|
|
151
141
|
}
|
|
152
142
|
) }),
|
|
153
|
-
/* @__PURE__ */ jsx(Field, { label: "
|
|
143
|
+
/* @__PURE__ */ jsx(Field, { label: "Per-transfer maximum", htmlFor: "t-max", required: true, children: /* @__PURE__ */ jsx(
|
|
154
144
|
Input,
|
|
155
145
|
{
|
|
156
146
|
id: "t-max",
|
|
@@ -159,7 +149,7 @@ function TierDialog({
|
|
|
159
149
|
onChange: (e) => setMax(e.target.value)
|
|
160
150
|
}
|
|
161
151
|
) }),
|
|
162
|
-
/* @__PURE__ */ jsx(Field, { label: "Daily
|
|
152
|
+
/* @__PURE__ */ jsx(Field, { label: "Daily total", htmlFor: "t-day", required: true, children: /* @__PURE__ */ jsx(
|
|
163
153
|
Input,
|
|
164
154
|
{
|
|
165
155
|
id: "t-day",
|
|
@@ -168,7 +158,7 @@ function TierDialog({
|
|
|
168
158
|
onChange: (e) => setDaily(e.target.value)
|
|
169
159
|
}
|
|
170
160
|
) }),
|
|
171
|
-
/* @__PURE__ */ jsx(Field, { label: "Monthly
|
|
161
|
+
/* @__PURE__ */ jsx(Field, { label: "Monthly total", htmlFor: "t-mon", hint: "Optional.", children: /* @__PURE__ */ jsx(
|
|
172
162
|
Input,
|
|
173
163
|
{
|
|
174
164
|
id: "t-mon",
|
|
@@ -180,16 +170,16 @@ function TierDialog({
|
|
|
180
170
|
] }),
|
|
181
171
|
/* @__PURE__ */ jsxs("fieldset", { className: "space-y-2", children: [
|
|
182
172
|
/* @__PURE__ */ jsxs("legend", { className: "text-sm font-medium text-[var(--text-secondary)]", children: [
|
|
183
|
-
"
|
|
173
|
+
"Required verifications (",
|
|
184
174
|
requirements.length,
|
|
185
175
|
")"
|
|
186
176
|
] }),
|
|
187
177
|
/* @__PURE__ */ jsx("div", { className: "max-h-56 space-y-3 overflow-y-auto rounded-md border border-[var(--border-default)] p-3", children: Object.entries(TIER_REQUIREMENTS).map(([group, ops]) => /* @__PURE__ */ jsxs("div", { children: [
|
|
188
|
-
/* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-medium text-[var(--text-tertiary)]", children:
|
|
178
|
+
/* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-medium text-[var(--text-tertiary)]", children: group }),
|
|
189
179
|
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-x-4 gap-y-1", children: ops.map((op) => /* @__PURE__ */ jsx(
|
|
190
180
|
Checkbox,
|
|
191
181
|
{
|
|
192
|
-
label:
|
|
182
|
+
label: op,
|
|
193
183
|
checked: requirements.includes(op),
|
|
194
184
|
onChange: () => toggle(op)
|
|
195
185
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/payout-tiers/_tier-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { FormDialog } from '@withpotter/ui-kit/form-dialog';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { Banner } from '@withpotter/ui-kit/banner';\nimport { Input } from '@withpotter/ui-kit/input';\nimport { Checkbox } from '@withpotter/ui-kit/checkbox';\nimport { Field } from '@withpotter/ui-kit/field';\nimport { requirementGroupLabel, requirementLabel } from './requirement-labels';\nimport { formatMinor, parseMajorToMinor } from '@withpotter/lib/money-minor';\nimport {\n TIER_REQUIREMENTS,\n type PayoutTier,\n type PayoutTierInput,\n} from '@withpotter/lib/admin-money-api';\n\n/** Minor units back to what a person types: \"150000\" NGN is \"1500\". */\nfunction toMajor(minor: string, currency: string): string {\n return formatMinor(minor, currency).replace(/[^\\d.]/g, '');\n}\n\nexport function TierDialog({\n tier,\n saving,\n error,\n onSave,\n onClose,\n}: {\n tier: PayoutTier | null;\n saving: boolean;\n error: string | null;\n onSave: (body: PayoutTierInput) => void;\n onClose: () => void;\n}) {\n const [key, setKey] = useState(tier?.key ?? '');\n const [currency, setCurrency] = useState(tier?.currency ?? 'NGN');\n const [label, setLabel] = useState(tier?.label ?? '');\n const [position, setPosition] = useState(String(tier?.position ?? 0));\n const [requirements, setRequirements] = useState<string[]>(\n tier?.requirements ?? [],\n );\n const [min, setMin] = useState(\n tier ? toMajor(tier.minimumMinor, tier.currency) : '',\n );\n const [max, setMax] = useState(\n tier ? toMajor(tier.maximumMinor, tier.currency) : '',\n );\n const [daily, setDaily] = useState(\n tier ? toMajor(tier.dailyMaximumMinor, tier.currency) : '',\n );\n const [monthly, setMonthly] = useState(\n tier?.monthlyMaximumMinor\n ? toMajor(tier.monthlyMaximumMinor, tier.currency)\n : '',\n );\n const [enabled, setEnabled] = useState(tier?.enabled ?? true);\n const [formError, setFormError] = useState<string | null>(null);\n\n const toggle = (r: string) =>\n setRequirements((c) =>\n c.includes(r) ? c.filter((x) => x !== r) : [...c, r],\n );\n\n const submit = () => {\n setFormError(null);\n const code = currency.trim().toUpperCase();\n const minimumMinor = parseMajorToMinor(min, code);\n const maximumMinor = parseMajorToMinor(max, code);\n const dailyMaximumMinor = parseMajorToMinor(daily, code);\n const monthlyMaximumMinor = monthly\n ? parseMajorToMinor(monthly, code)\n : null;\n if (!key.trim() || !label.trim())\n return setFormError('Short name and display name are required.');\n if (!minimumMinor || !maximumMinor || !dailyMaximumMinor)\n return setFormError(\n 'The smallest transfer, largest transfer and daily limit must be valid amounts.',\n );\n if (monthly && !monthlyMaximumMinor)\n return setFormError('The monthly limit must be a valid amount.');\n if (!/^\\d+$/.test(position))\n return setFormError('Priority must be a whole number.');\n onSave({\n key: key.trim(),\n currency: code,\n label: label.trim(),\n position: Number(position),\n requirements,\n minimumMinor,\n maximumMinor,\n dailyMaximumMinor,\n monthlyMaximumMinor,\n enabled,\n });\n };\n\n return (\n <FormDialog\n title={tier ? 'Edit tier' : 'New payout tier'}\n description=\"The sending limits a merchant gets once they have completed every check listed below.\"\n size=\"lg\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button onClick={submit} loading={saving}>\n {tier ? 'Save tier' : 'Create tier'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-4\">\n {(formError || error) && (\n <Banner tone=\"error\">{formError ?? error}</Banner>\n )}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field\n label=\"Short name\"\n htmlFor=\"t-key\"\n required\n hint=\"A unique code for this level, for example starter.\"\n >\n <Input\n id=\"t-key\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n />\n </Field>\n <Field label=\"Display name\" htmlFor=\"t-label\" required>\n <Input\n id=\"t-label\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n />\n </Field>\n <Field label=\"Currency\" htmlFor=\"t-cur\" required>\n <Input\n id=\"t-cur\"\n value={currency}\n maxLength={3}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </Field>\n <Field\n label=\"Priority\"\n htmlFor=\"t-pos\"\n hint=\"If a merchant qualifies for several levels, the one with the higher number is used.\"\n >\n <Input\n id=\"t-pos\"\n inputMode=\"numeric\"\n value={position}\n onChange={(e) => setPosition(e.target.value)}\n />\n </Field>\n <Field label=\"Smallest single transfer\" htmlFor=\"t-min\" required>\n <Input\n id=\"t-min\"\n inputMode=\"decimal\"\n value={min}\n onChange={(e) => setMin(e.target.value)}\n />\n </Field>\n <Field label=\"Largest single transfer\" htmlFor=\"t-max\" required>\n <Input\n id=\"t-max\"\n inputMode=\"decimal\"\n value={max}\n onChange={(e) => setMax(e.target.value)}\n />\n </Field>\n <Field label=\"Daily limit\" htmlFor=\"t-day\" required>\n <Input\n id=\"t-day\"\n inputMode=\"decimal\"\n value={daily}\n onChange={(e) => setDaily(e.target.value)}\n />\n </Field>\n <Field label=\"Monthly limit\" htmlFor=\"t-mon\" hint=\"Optional.\">\n <Input\n id=\"t-mon\"\n inputMode=\"decimal\"\n value={monthly}\n onChange={(e) => setMonthly(e.target.value)}\n />\n </Field>\n </div>\n\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium text-[var(--text-secondary)]\">\n Checks a merchant must complete ({requirements.length})\n </legend>\n <div className=\"max-h-56 space-y-3 overflow-y-auto rounded-md border border-[var(--border-default)] p-3\">\n {Object.entries(TIER_REQUIREMENTS).map(([group, ops]) => (\n <div key={group}>\n <p className=\"mb-1 text-xs font-medium text-[var(--text-tertiary)]\">\n {requirementGroupLabel(group)}\n </p>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {ops.map((op) => (\n <Checkbox\n key={op}\n label={requirementLabel(op)}\n checked={requirements.includes(op)}\n onChange={() => toggle(op)}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n </fieldset>\n\n <Checkbox\n label=\"Enabled\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n </div>\n </FormDialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/payout-tiers/_tier-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { FormDialog } from '@withpotter/ui-kit/form-dialog';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { Banner } from '@withpotter/ui-kit/banner';\nimport { Input } from '@withpotter/ui-kit/input';\nimport { Checkbox } from '@withpotter/ui-kit/checkbox';\nimport { Field } from '@withpotter/ui-kit/field';\nimport { formatMinor, parseMajorToMinor } from '@withpotter/lib/money-minor';\nimport {\n TIER_REQUIREMENTS,\n type PayoutTier,\n type PayoutTierInput,\n} from '@withpotter/lib/admin-money-api';\n\n/** Minor units back to what a person types: \"150000\" NGN is \"1500\". */\nfunction toMajor(minor: string, currency: string): string {\n return formatMinor(minor, currency).replace(/[^\\d.]/g, '');\n}\n\nexport function TierDialog({\n tier,\n saving,\n error,\n onSave,\n onClose,\n}: {\n tier: PayoutTier | null;\n saving: boolean;\n error: string | null;\n onSave: (body: PayoutTierInput) => void;\n onClose: () => void;\n}) {\n const [key, setKey] = useState(tier?.key ?? '');\n const [currency, setCurrency] = useState(tier?.currency ?? 'NGN');\n const [label, setLabel] = useState(tier?.label ?? '');\n const [position, setPosition] = useState(String(tier?.position ?? 0));\n const [requirements, setRequirements] = useState<string[]>(\n tier?.requirements ?? [],\n );\n const [min, setMin] = useState(\n tier ? toMajor(tier.minimumMinor, tier.currency) : '',\n );\n const [max, setMax] = useState(\n tier ? toMajor(tier.maximumMinor, tier.currency) : '',\n );\n const [daily, setDaily] = useState(\n tier ? toMajor(tier.dailyMaximumMinor, tier.currency) : '',\n );\n const [monthly, setMonthly] = useState(\n tier?.monthlyMaximumMinor\n ? toMajor(tier.monthlyMaximumMinor, tier.currency)\n : '',\n );\n const [enabled, setEnabled] = useState(tier?.enabled ?? true);\n const [formError, setFormError] = useState<string | null>(null);\n\n const toggle = (r: string) =>\n setRequirements((c) =>\n c.includes(r) ? c.filter((x) => x !== r) : [...c, r],\n );\n\n const submit = () => {\n setFormError(null);\n const code = currency.trim().toUpperCase();\n const minimumMinor = parseMajorToMinor(min, code);\n const maximumMinor = parseMajorToMinor(max, code);\n const dailyMaximumMinor = parseMajorToMinor(daily, code);\n const monthlyMaximumMinor = monthly\n ? parseMajorToMinor(monthly, code)\n : null;\n if (!key.trim() || !label.trim())\n return setFormError('Key and label are required.');\n if (!minimumMinor || !maximumMinor || !dailyMaximumMinor)\n return setFormError(\n 'Minimum, maximum and daily limit must be valid amounts.',\n );\n if (monthly && !monthlyMaximumMinor)\n return setFormError('The monthly limit is not a valid amount.');\n if (!/^\\d+$/.test(position))\n return setFormError('Position must be a whole number.');\n onSave({\n key: key.trim(),\n currency: code,\n label: label.trim(),\n position: Number(position),\n requirements,\n minimumMinor,\n maximumMinor,\n dailyMaximumMinor,\n monthlyMaximumMinor,\n enabled,\n });\n };\n\n return (\n <FormDialog\n title={tier ? 'Edit tier' : 'New payout tier'}\n description=\"Limits a business gets once it has passed every listed verification.\"\n size=\"lg\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n <Button onClick={submit} loading={saving}>\n {tier ? 'Save tier' : 'Create tier'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-4\">\n {(formError || error) && (\n <Banner tone=\"error\">{formError ?? error}</Banner>\n )}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field label=\"Key\" htmlFor=\"t-key\" required>\n <Input\n id=\"t-key\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n />\n </Field>\n <Field label=\"Label\" htmlFor=\"t-label\" required>\n <Input\n id=\"t-label\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n />\n </Field>\n <Field label=\"Currency\" htmlFor=\"t-cur\" required>\n <Input\n id=\"t-cur\"\n value={currency}\n maxLength={3}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </Field>\n <Field\n label=\"Position\"\n htmlFor=\"t-pos\"\n hint=\"Higher tiers are chosen first when a business qualifies for several.\"\n >\n <Input\n id=\"t-pos\"\n inputMode=\"numeric\"\n value={position}\n onChange={(e) => setPosition(e.target.value)}\n />\n </Field>\n <Field label=\"Per-transfer minimum\" htmlFor=\"t-min\" required>\n <Input\n id=\"t-min\"\n inputMode=\"decimal\"\n value={min}\n onChange={(e) => setMin(e.target.value)}\n />\n </Field>\n <Field label=\"Per-transfer maximum\" htmlFor=\"t-max\" required>\n <Input\n id=\"t-max\"\n inputMode=\"decimal\"\n value={max}\n onChange={(e) => setMax(e.target.value)}\n />\n </Field>\n <Field label=\"Daily total\" htmlFor=\"t-day\" required>\n <Input\n id=\"t-day\"\n inputMode=\"decimal\"\n value={daily}\n onChange={(e) => setDaily(e.target.value)}\n />\n </Field>\n <Field label=\"Monthly total\" htmlFor=\"t-mon\" hint=\"Optional.\">\n <Input\n id=\"t-mon\"\n inputMode=\"decimal\"\n value={monthly}\n onChange={(e) => setMonthly(e.target.value)}\n />\n </Field>\n </div>\n\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium text-[var(--text-secondary)]\">\n Required verifications ({requirements.length})\n </legend>\n <div className=\"max-h-56 space-y-3 overflow-y-auto rounded-md border border-[var(--border-default)] p-3\">\n {Object.entries(TIER_REQUIREMENTS).map(([group, ops]) => (\n <div key={group}>\n <p className=\"mb-1 text-xs font-medium text-[var(--text-tertiary)]\">\n {group}\n </p>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {ops.map((op) => (\n <Checkbox\n key={op}\n label={op}\n checked={requirements.includes(op)}\n onChange={() => toggle(op)}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n </fieldset>\n\n <Checkbox\n label=\"Enabled\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n </div>\n </FormDialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -11,16 +11,15 @@ import {
|
|
|
11
11
|
import { StatusBadge } from "@withpotter/components/shared/status-badge";
|
|
12
12
|
import { limitLines, requirementRows } from "./tier-preview";
|
|
13
13
|
import styles from "../_money/ledger.module.css";
|
|
14
|
-
import { requirementLabel } from "./requirement-labels";
|
|
15
14
|
function TierPreviewResult({ preview }) {
|
|
16
15
|
const { tier } = preview;
|
|
17
16
|
const rows = requirementRows(preview);
|
|
18
17
|
return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 16 }, children: [
|
|
19
18
|
/* @__PURE__ */ jsxs(Card, { children: [
|
|
20
|
-
/* @__PURE__ */ jsx("h3", { className: styles.chosenName, children: tier ? `
|
|
19
|
+
/* @__PURE__ */ jsx("h3", { className: styles.chosenName, children: tier ? `Lands on ${tier.label} in ${preview.currency}` : `No ${preview.currency} tier qualifies yet` }),
|
|
21
20
|
tier ? /* @__PURE__ */ jsxs(FactList, { className: "mt-4", children: [
|
|
22
|
-
/* @__PURE__ */ jsx(Fact, { label: "
|
|
23
|
-
/* @__PURE__ */ jsx(Fact, { label: "
|
|
21
|
+
/* @__PURE__ */ jsx(Fact, { label: "Tier", value: `${tier.label} (${tier.key})` }),
|
|
22
|
+
/* @__PURE__ */ jsx(Fact, { label: "Position", value: String(tier.position) }),
|
|
24
23
|
limitLines(tier).map(([label, value]) => /* @__PURE__ */ jsx(Fact, { label, value }, label)),
|
|
25
24
|
/* @__PURE__ */ jsx(
|
|
26
25
|
Fact,
|
|
@@ -29,23 +28,23 @@ function TierPreviewResult({ preview }) {
|
|
|
29
28
|
value: tier.enabled ? "Enabled" : "Disabled"
|
|
30
29
|
}
|
|
31
30
|
)
|
|
32
|
-
] }) : /* @__PURE__ */ jsx("p", { className: styles.quiet, children: "
|
|
31
|
+
] }) : /* @__PURE__ */ jsx("p", { className: styles.quiet, children: "With no tier, this business resolves to verification required." })
|
|
33
32
|
] }),
|
|
34
33
|
/* @__PURE__ */ jsx(
|
|
35
34
|
TableShell,
|
|
36
35
|
{
|
|
37
36
|
minWidth: 0,
|
|
38
37
|
head: /* @__PURE__ */ jsxs("tr", { children: [
|
|
39
|
-
/* @__PURE__ */ jsx(Th, { children: "
|
|
40
|
-
/* @__PURE__ */ jsx(Th, { children: "
|
|
38
|
+
/* @__PURE__ */ jsx(Th, { children: "Requirement" }),
|
|
39
|
+
/* @__PURE__ */ jsx(Th, { children: "State" })
|
|
41
40
|
] }),
|
|
42
41
|
children: rows.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: 2, className: styles.quiet, children: "Nothing verified and nothing required." }) }) : rows.map((r) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
43
|
-
/* @__PURE__ */ jsx("td", { children:
|
|
44
|
-
/* @__PURE__ */ jsx("td", { children: r.met ? /* @__PURE__ */ jsx(StatusBadge, { status: "completed", label: "
|
|
42
|
+
/* @__PURE__ */ jsx("td", { children: r.name }),
|
|
43
|
+
/* @__PURE__ */ jsx("td", { children: r.met ? /* @__PURE__ */ jsx(StatusBadge, { status: "completed", label: "Met" }) : /* @__PURE__ */ jsx(
|
|
45
44
|
StatusBadge,
|
|
46
45
|
{
|
|
47
46
|
status: "action_required",
|
|
48
|
-
label: "
|
|
47
|
+
label: "Missing for the next tier"
|
|
49
48
|
}
|
|
50
49
|
) })
|
|
51
50
|
] }, r.name))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/payout-tiers/tier-preview-result.tsx"],"sourcesContent":["'use client';\n\nimport {\n Card,\n Fact,\n FactList,\n TableRow,\n TableShell,\n Th,\n} from '@withpotter/ui-kit';\nimport { StatusBadge } from '@withpotter/components/shared/status-badge';\nimport type { PayoutTierPreview } from '@withpotter/lib/admin-money-api';\nimport { limitLines, requirementRows } from './tier-preview';\nimport styles from '../_money/ledger.module.css';\
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/payout-tiers/tier-preview-result.tsx"],"sourcesContent":["'use client';\n\nimport {\n Card,\n Fact,\n FactList,\n TableRow,\n TableShell,\n Th,\n} from '@withpotter/ui-kit';\nimport { StatusBadge } from '@withpotter/components/shared/status-badge';\nimport type { PayoutTierPreview } from '@withpotter/lib/admin-money-api';\nimport { limitLines, requirementRows } from './tier-preview';\nimport styles from '../_money/ledger.module.css';\n\n/**\n * What the preview answered: the tier the business lands on with its\n * limits, then every requirement it names, met or still missing.\n */\nexport function TierPreviewResult({ preview }: { preview: PayoutTierPreview }) {\n const { tier } = preview;\n const rows = requirementRows(preview);\n\n return (\n <div style={{ display: 'grid', gap: 16 }}>\n <Card>\n <h3 className={styles.chosenName}>\n {tier\n ? `Lands on ${tier.label} in ${preview.currency}`\n : `No ${preview.currency} tier qualifies yet`}\n </h3>\n {tier ? (\n <FactList className=\"mt-4\">\n <Fact label=\"Tier\" value={`${tier.label} (${tier.key})`} />\n <Fact label=\"Position\" value={String(tier.position)} />\n {limitLines(tier).map(([label, value]) => (\n <Fact key={label} label={label} value={value} />\n ))}\n <Fact\n label=\"Status\"\n value={tier.enabled ? 'Enabled' : 'Disabled'}\n />\n </FactList>\n ) : (\n <p className={styles.quiet}>\n With no tier, this business resolves to verification required.\n </p>\n )}\n </Card>\n <TableShell\n minWidth={0}\n head={\n <tr>\n <Th>Requirement</Th>\n <Th>State</Th>\n </tr>\n }\n >\n {rows.length === 0 ? (\n <tr>\n <td colSpan={2} className={styles.quiet}>\n Nothing verified and nothing required.\n </td>\n </tr>\n ) : (\n rows.map((r) => (\n <TableRow key={r.name}>\n <td>{r.name}</td>\n <td>\n {r.met ? (\n <StatusBadge status=\"completed\" label=\"Met\" />\n ) : (\n <StatusBadge\n status=\"action_required\"\n label=\"Missing for the next tier\"\n />\n )}\n </td>\n </TableRow>\n ))\n )}\n </TableShell>\n </div>\n );\n}\n"],"mappings":";AA0BQ,cAME,YANF;AAxBR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAE5B,SAAS,YAAY,uBAAuB;AAC5C,OAAO,YAAY;AAMZ,SAAS,kBAAkB,EAAE,QAAQ,GAAmC;AAC7E,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,gBAAgB,OAAO;AAEpC,SACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,GACrC;AAAA,yBAAC,QACC;AAAA,0BAAC,QAAG,WAAW,OAAO,YACnB,iBACG,YAAY,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAC7C,MAAM,QAAQ,QAAQ,uBAC5B;AAAA,MACC,OACC,qBAAC,YAAS,WAAU,QAClB;AAAA,4BAAC,QAAK,OAAM,QAAO,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK;AAAA,QACzD,oBAAC,QAAK,OAAM,YAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AAAA,QACpD,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,MAClC,oBAAC,QAAiB,OAAc,SAArB,KAAmC,CAC/C;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAO,KAAK,UAAU,YAAY;AAAA;AAAA,QACpC;AAAA,SACF,IAEA,oBAAC,OAAE,WAAW,OAAO,OAAO,4EAE5B;AAAA,OAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,MACE,qBAAC,QACC;AAAA,8BAAC,MAAG,yBAAW;AAAA,UACf,oBAAC,MAAG,mBAAK;AAAA,WACX;AAAA,QAGD,eAAK,WAAW,IACf,oBAAC,QACC,8BAAC,QAAG,SAAS,GAAG,WAAW,OAAO,OAAO,oDAEzC,GACF,IAEA,KAAK,IAAI,CAAC,MACR,qBAAC,YACC;AAAA,8BAAC,QAAI,YAAE,MAAK;AAAA,UACZ,oBAAC,QACE,YAAE,MACD,oBAAC,eAAY,QAAO,aAAY,OAAM,OAAM,IAE5C;AAAA,YAAC;AAAA;AAAA,cACC,QAAO;AAAA,cACP,OAAM;AAAA;AAAA,UACR,GAEJ;AAAA,aAXa,EAAE,IAYjB,CACD;AAAA;AAAA,IAEL;AAAA,KACF;AAEJ;","names":[]}
|