@withpotter/pages-admin 0.13.0-next.124 → 0.13.0-next.59

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.
Files changed (260) hide show
  1. package/dist/admin/_money/cash-postings.js +3 -20
  2. package/dist/admin/_money/cash-postings.js.map +1 -1
  3. package/dist/admin/_money/cash.module.css +0 -10
  4. package/dist/admin/_money/finder-format.js +0 -1
  5. package/dist/admin/_money/finder-format.js.map +1 -1
  6. package/dist/admin/_money/format.js +0 -1
  7. package/dist/admin/_money/format.js.map +1 -1
  8. package/dist/admin/_overview/activation-panel.js +6 -6
  9. package/dist/admin/_overview/activation-panel.js.map +1 -1
  10. package/dist/admin/_overview/attention-groups.js +8 -8
  11. package/dist/admin/_overview/attention-groups.js.map +1 -1
  12. package/dist/admin/_overview/attention-panel.js +33 -37
  13. package/dist/admin/_overview/attention-panel.js.map +1 -1
  14. package/dist/admin/_overview/attention.module.css +3 -0
  15. package/dist/admin/_overview/control-room.js +13 -41
  16. package/dist/admin/_overview/control-room.js.map +1 -1
  17. package/dist/admin/_overview/kpi-row.js +7 -7
  18. package/dist/admin/_overview/kpi-row.js.map +1 -1
  19. package/dist/admin/_overview/leaders-panel.js +1 -1
  20. package/dist/admin/_overview/leaders-panel.js.map +1 -1
  21. package/dist/admin/_overview/overdue-outstanding.js +1 -2
  22. package/dist/admin/_overview/overdue-outstanding.js.map +1 -1
  23. package/dist/admin/_overview/portfolio-panel.js +5 -5
  24. package/dist/admin/_overview/portfolio-panel.js.map +1 -1
  25. package/dist/admin/_overview/position-panel.js +12 -8
  26. package/dist/admin/_overview/position-panel.js.map +1 -1
  27. package/dist/admin/_pos/pos-figures.js +5 -18
  28. package/dist/admin/_pos/pos-figures.js.map +1 -1
  29. package/dist/admin/_pos/pos-rules.js +0 -2
  30. package/dist/admin/_pos/pos-rules.js.map +1 -1
  31. package/dist/admin/_pos/pos-words.js +1 -6
  32. package/dist/admin/_pos/pos-words.js.map +1 -1
  33. package/dist/admin/_pos/use-pos.js +1 -70
  34. package/dist/admin/_pos/use-pos.js.map +1 -1
  35. package/dist/admin/_shell/nav-config.js +3 -3
  36. package/dist/admin/_shell/nav-config.js.map +1 -1
  37. package/dist/admin/_shell/nav-filter.js +2 -4
  38. package/dist/admin/_shell/nav-filter.js.map +1 -1
  39. package/dist/admin/_shell/nav-row.js +2 -5
  40. package/dist/admin/_shell/nav-row.js.map +1 -1
  41. package/dist/admin/_shell/sidebar-footer.js +0 -20
  42. package/dist/admin/_shell/sidebar-footer.js.map +1 -1
  43. package/dist/admin/_shell/sidebar-footer.module.css +0 -17
  44. package/dist/admin/_shell/sidebar.js +15 -25
  45. package/dist/admin/_shell/sidebar.js.map +1 -1
  46. package/dist/admin/_shell/sidebar.module.css +0 -69
  47. package/dist/admin/_shell/use-fluid-hover.js +6 -37
  48. package/dist/admin/_shell/use-fluid-hover.js.map +1 -1
  49. package/dist/admin/_ui/admin.css +0 -7
  50. package/dist/admin/_ui/data-table.js +1 -1
  51. package/dist/admin/_ui/data-table.js.map +1 -1
  52. package/dist/admin/_ui/list-card.js +1 -1
  53. package/dist/admin/_ui/list-card.js.map +1 -1
  54. package/dist/admin/_ui/list-card.module.css +16 -2
  55. package/dist/admin/_ui/money-view.js +0 -1
  56. package/dist/admin/_ui/money-view.js.map +1 -1
  57. package/dist/admin/_ui/page-header.js +4 -31
  58. package/dist/admin/_ui/page-header.js.map +1 -1
  59. package/dist/admin/_ui/panel.module.css +10 -0
  60. package/dist/admin/_ui/stat-card.js +2 -11
  61. package/dist/admin/_ui/stat-card.js.map +1 -1
  62. package/dist/admin/_ui/trend.js +2 -2
  63. package/dist/admin/_ui/trend.js.map +1 -1
  64. package/dist/admin/accounts/account-panel.js +6 -49
  65. package/dist/admin/accounts/account-panel.js.map +1 -1
  66. package/dist/admin/accounts/account-panel.module.css +0 -73
  67. package/dist/admin/accounts/account-row.js +2 -11
  68. package/dist/admin/accounts/account-row.js.map +1 -1
  69. package/dist/admin/accounts/account-vitals.js +13 -15
  70. package/dist/admin/accounts/account-vitals.js.map +1 -1
  71. package/dist/admin/accounts/accounts-table.js +8 -39
  72. package/dist/admin/accounts/accounts-table.js.map +1 -1
  73. package/dist/admin/accounts/accounts-workspace.js +2 -2
  74. package/dist/admin/accounts/accounts-workspace.js.map +1 -1
  75. package/dist/admin/accounts/owner-session.js +6 -0
  76. package/dist/admin/accounts/owner-session.js.map +1 -1
  77. package/dist/admin/accounts/rows.module.css +0 -17
  78. package/dist/admin/audit/status-pill.js +0 -6
  79. package/dist/admin/audit/status-pill.js.map +1 -1
  80. package/dist/admin/audit/status-pill.module.css +0 -4
  81. package/dist/admin/commerce/commerce-overview.js +2 -2
  82. package/dist/admin/commerce/commerce-overview.js.map +1 -1
  83. package/dist/admin/commerce/merchant-meta.js +0 -1
  84. package/dist/admin/commerce/merchant-meta.js.map +1 -1
  85. package/dist/admin/commerce/merchant-view.js +2 -2
  86. package/dist/admin/commerce/merchant-view.js.map +1 -1
  87. package/dist/admin/feedback/prompt-operations.module.css +2 -0
  88. package/dist/admin/feedback/prompt-preview.module.css +2 -0
  89. package/dist/admin/hooks.js +1 -57
  90. package/dist/admin/hooks.js.map +1 -1
  91. package/dist/admin/layout.js +2 -8
  92. package/dist/admin/layout.js.map +1 -1
  93. package/dist/admin/page.js +8 -28
  94. package/dist/admin/page.js.map +1 -1
  95. package/dist/admin/payout-tiers/_tier-dialog.js +21 -31
  96. package/dist/admin/payout-tiers/_tier-dialog.js.map +1 -1
  97. package/dist/admin/payout-tiers/tier-preview-result.js +9 -10
  98. package/dist/admin/payout-tiers/tier-preview-result.js.map +1 -1
  99. package/dist/admin/payout-tiers/tiers-table.js +7 -6
  100. package/dist/admin/payout-tiers/tiers-table.js.map +1 -1
  101. package/dist/admin/payout-tiers/tiers-workspace.js +2 -2
  102. package/dist/admin/payout-tiers/tiers-workspace.js.map +1 -1
  103. package/dist/admin/pos/pos-workspace.js +2 -6
  104. package/dist/admin/pos/pos-workspace.js.map +1 -1
  105. package/dist/admin/pos/shifts-tab.js +9 -16
  106. package/dist/admin/pos/shifts-tab.js.map +1 -1
  107. package/dist/admin/revenue/cohort-panel.js +6 -6
  108. package/dist/admin/revenue/cohort-panel.js.map +1 -1
  109. package/dist/admin/revenue/health-panel.js +21 -22
  110. package/dist/admin/revenue/health-panel.js.map +1 -1
  111. package/dist/admin/revenue/plan-mix-panel.js +3 -3
  112. package/dist/admin/revenue/plan-mix-panel.js.map +1 -1
  113. package/dist/admin/revenue/quality-panel.js +19 -19
  114. package/dist/admin/revenue/quality-panel.js.map +1 -1
  115. package/dist/admin/revenue/revenue-kpis.js +50 -111
  116. package/dist/admin/revenue/revenue-kpis.js.map +1 -1
  117. package/dist/admin/revenue/revenue-overview.js +46 -39
  118. package/dist/admin/revenue/revenue-overview.js.map +1 -1
  119. package/dist/admin/revenue/revenue-retention.js +13 -17
  120. package/dist/admin/revenue/revenue-retention.js.map +1 -1
  121. package/dist/admin/revenue/revenue-workspace.js +6 -53
  122. package/dist/admin/revenue/revenue-workspace.js.map +1 -1
  123. package/dist/admin/revenue/subscriptions-panel.js +14 -14
  124. package/dist/admin/revenue/subscriptions-panel.js.map +1 -1
  125. package/dist/admin/revenue/top-tenants-panel.js +4 -4
  126. package/dist/admin/revenue/top-tenants-panel.js.map +1 -1
  127. package/dist/admin/settings/account-tab.js +25 -1
  128. package/dist/admin/settings/account-tab.js.map +1 -1
  129. package/dist/admin/settings/general-tab.js +2 -2
  130. package/dist/admin/settings/general-tab.js.map +1 -1
  131. package/dist/admin/settings/system-status-card.js +30 -0
  132. package/dist/admin/settings/system-status-card.js.map +1 -0
  133. package/dist/admin/support/queue-card.module.css +4 -1
  134. package/dist/admin/tenants/[id]/commerce/format.js +1 -2
  135. package/dist/admin/tenants/[id]/commerce/format.js.map +1 -1
  136. package/dist/admin/tenants/[id]/commerce/recent-orders.js +1 -1
  137. package/dist/admin/tenants/[id]/commerce/recent-orders.js.map +1 -1
  138. package/dist/admin/tenants/[id]/page.js +10 -37
  139. package/dist/admin/tenants/[id]/page.js.map +1 -1
  140. package/dist/admin/tenants/[id]/tenant-layout.module.css +4 -1
  141. package/dist/admin/tenants/[id]/tenant-overview.js +2 -3
  142. package/dist/admin/tenants/[id]/tenant-overview.js.map +1 -1
  143. package/dist/admin/tenants/[id]/tenant-overview.module.css +1 -1
  144. package/dist/admin/tenants/[id]/tenant-pos.js +16 -64
  145. package/dist/admin/tenants/[id]/tenant-pos.js.map +1 -1
  146. package/dist/admin/tenants/[id]/tenant-wallet-card.js +2 -3
  147. package/dist/admin/tenants/[id]/tenant-wallet-card.js.map +1 -1
  148. package/dist/admin/tenants/[id]/verification/document-viewer.js +52 -3
  149. package/dist/admin/tenants/[id]/verification/document-viewer.js.map +1 -1
  150. package/dist/admin/tenants/[id]/verification/document-viewer.module.css +0 -51
  151. package/dist/admin/tenants/[id]/verification/tenant-verification.js +0 -10
  152. package/dist/admin/tenants/[id]/verification/tenant-verification.js.map +1 -1
  153. package/dist/admin/tenants/tenant-list-row.js +1 -2
  154. package/dist/admin/tenants/tenant-list-row.js.map +1 -1
  155. package/dist/admin/tenants/tenants-table.js +2 -3
  156. package/dist/admin/tenants/tenants-table.js.map +1 -1
  157. package/dist/admin/tenants/tenants-workspace.js +2 -2
  158. package/dist/admin/tenants/tenants-workspace.js.map +1 -1
  159. package/dist/admin/verification/verification-page.js +3 -19
  160. package/dist/admin/verification/verification-page.js.map +1 -1
  161. package/dist/admin/verification/verification.module.css +0 -10
  162. package/dist/admin/verification/waiting-case-actions.js +68 -0
  163. package/dist/admin/verification/waiting-case-actions.js.map +1 -0
  164. package/dist/admin/verification/waiting-cases.js +48 -66
  165. package/dist/admin/verification/waiting-cases.js.map +1 -1
  166. package/package.json +5 -5
  167. package/dist/admin/_pos/olive-balance.js +0 -40
  168. package/dist/admin/_pos/olive-balance.js.map +0 -1
  169. package/dist/admin/_pos/olive-state.js +0 -23
  170. package/dist/admin/_pos/olive-state.js.map +0 -1
  171. package/dist/admin/_pos/payments-model.js +0 -55
  172. package/dist/admin/_pos/payments-model.js.map +0 -1
  173. package/dist/admin/_pos/tenant-operators.js +0 -63
  174. package/dist/admin/_pos/tenant-operators.js.map +0 -1
  175. package/dist/admin/_pos/tenant-outlets.js +0 -77
  176. package/dist/admin/_pos/tenant-outlets.js.map +0 -1
  177. package/dist/admin/_pos/tenant-pos-figures.js +0 -82
  178. package/dist/admin/_pos/tenant-pos-figures.js.map +0 -1
  179. package/dist/admin/_pos/tenant-requests.js +0 -64
  180. package/dist/admin/_pos/tenant-requests.js.map +0 -1
  181. package/dist/admin/_pos/tenant-transactions.js +0 -145
  182. package/dist/admin/_pos/tenant-transactions.js.map +0 -1
  183. package/dist/admin/_shell/nav-fold.js +0 -14
  184. package/dist/admin/_shell/nav-fold.js.map +0 -1
  185. package/dist/admin/_shell/nav-group.js +0 -78
  186. package/dist/admin/_shell/nav-group.js.map +0 -1
  187. package/dist/admin/_shell/use-open-groups.js +0 -64
  188. package/dist/admin/_shell/use-open-groups.js.map +0 -1
  189. package/dist/admin/_ui/page-header.module.css +0 -45
  190. package/dist/admin/accounts/account-sessions.js +0 -70
  191. package/dist/admin/accounts/account-sessions.js.map +0 -1
  192. package/dist/admin/accounts/account-sessions.module.css +0 -55
  193. package/dist/admin/accounts/account-stage-filter.js +0 -29
  194. package/dist/admin/accounts/account-stage-filter.js.map +0 -1
  195. package/dist/admin/accounts/account-stage.js +0 -81
  196. package/dist/admin/accounts/account-stage.js.map +0 -1
  197. package/dist/admin/accounts/hint.js +0 -12
  198. package/dist/admin/accounts/hint.js.map +0 -1
  199. package/dist/admin/payout-tiers/requirement-labels.js +0 -70
  200. package/dist/admin/payout-tiers/requirement-labels.js.map +0 -1
  201. package/dist/admin/pos/transactions-tab.js +0 -214
  202. package/dist/admin/pos/transactions-tab.js.map +0 -1
  203. package/dist/admin/revenue/channel-panel.js +0 -49
  204. package/dist/admin/revenue/channel-panel.js.map +0 -1
  205. package/dist/admin/revenue/channel-rows.js +0 -17
  206. package/dist/admin/revenue/channel-rows.js.map +0 -1
  207. package/dist/admin/revenue/download-button.js +0 -40
  208. package/dist/admin/revenue/download-button.js.map +0 -1
  209. package/dist/admin/revenue/earnings/earnings-colors.js +0 -25
  210. package/dist/admin/revenue/earnings/earnings-colors.js.map +0 -1
  211. package/dist/admin/revenue/earnings/earnings-legend.js +0 -75
  212. package/dist/admin/revenue/earnings/earnings-legend.js.map +0 -1
  213. package/dist/admin/revenue/earnings/earnings-summary.js +0 -308
  214. package/dist/admin/revenue/earnings/earnings-summary.js.map +0 -1
  215. package/dist/admin/revenue/earnings/earnings-table.js +0 -143
  216. package/dist/admin/revenue/earnings/earnings-table.js.map +0 -1
  217. package/dist/admin/revenue/earnings/earnings.module.css +0 -201
  218. package/dist/admin/revenue/earnings/use-earnings.js +0 -27
  219. package/dist/admin/revenue/earnings/use-earnings.js.map +0 -1
  220. package/dist/admin/revenue/ledger-model.js +0 -104
  221. package/dist/admin/revenue/ledger-model.js.map +0 -1
  222. package/dist/admin/revenue/ledger.module.css +0 -144
  223. package/dist/admin/revenue/merchant-headline.js +0 -37
  224. package/dist/admin/revenue/merchant-headline.js.map +0 -1
  225. package/dist/admin/revenue/merchant-payments-view.js +0 -234
  226. package/dist/admin/revenue/merchant-payments-view.js.map +0 -1
  227. package/dist/admin/revenue/method-cards.js +0 -40
  228. package/dist/admin/revenue/method-cards.js.map +0 -1
  229. package/dist/admin/revenue/payment-drawer.js +0 -53
  230. package/dist/admin/revenue/payment-drawer.js.map +0 -1
  231. package/dist/admin/revenue/plan-lines.js +0 -36
  232. package/dist/admin/revenue/plan-lines.js.map +0 -1
  233. package/dist/admin/revenue/plan-payment-drawer.js +0 -42
  234. package/dist/admin/revenue/plan-payment-drawer.js.map +0 -1
  235. package/dist/admin/revenue/plans-panel.js +0 -48
  236. package/dist/admin/revenue/plans-panel.js.map +0 -1
  237. package/dist/admin/revenue/platform-fees.js +0 -9
  238. package/dist/admin/revenue/platform-fees.js.map +0 -1
  239. package/dist/admin/revenue/print-summary-button.js +0 -27
  240. package/dist/admin/revenue/print-summary-button.js.map +0 -1
  241. package/dist/admin/revenue/subscriptions-view.js +0 -213
  242. package/dist/admin/revenue/subscriptions-view.js.map +0 -1
  243. package/dist/admin/revenue/summary-download.js +0 -38
  244. package/dist/admin/revenue/summary-download.js.map +0 -1
  245. package/dist/admin/revenue/summary-print.js +0 -82
  246. package/dist/admin/revenue/summary-print.js.map +0 -1
  247. package/dist/admin/revenue/summary-rows.js +0 -44
  248. package/dist/admin/revenue/summary-rows.js.map +0 -1
  249. package/dist/admin/revenue/url-filters.js +0 -36
  250. package/dist/admin/revenue/url-filters.js.map +0 -1
  251. package/dist/admin/revenue/use-url-filters.js +0 -24
  252. package/dist/admin/revenue/use-url-filters.js.map +0 -1
  253. package/dist/admin/tenants/[id]/use-tenant-wallet.js +0 -23
  254. package/dist/admin/tenants/[id]/use-tenant-wallet.js.map +0 -1
  255. package/dist/admin/tenants/[id]/verification/document-file.js +0 -78
  256. package/dist/admin/tenants/[id]/verification/document-file.js.map +0 -1
  257. package/dist/admin/tenants/[id]/verification/sent-files.js +0 -33
  258. package/dist/admin/tenants/[id]/verification/sent-files.js.map +0 -1
  259. package/dist/admin/verification/preview-dialog.js +0 -111
  260. package/dist/admin/verification/preview-dialog.js.map +0 -1
@@ -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":[]}
@@ -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
- footerActions: footerActions?.filter(
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(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/admin/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, type ComponentType } 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 type { FooterAction } from './_shell/sidebar-footer';\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';\nexport type { FooterAction } from './_shell/sidebar-footer';\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 * `badges` puts a host's own count beside a menu item: a component per item href that renders one\n * `span`, shown in the same slot as the Support count.\n */\nexport default function AdminLayout({\n children,\n modules = NO_MODULES,\n additions = NO_ADDITIONS,\n brand,\n badges,\n footerActions,\n}: {\n children: React.ReactNode;\n modules?: AdminModules;\n additions?: NavAddition[];\n brand?: AdminBrand;\n badges?: Record<string, ComponentType>;\n /** Icons a host adds to the sidebar's foot, beside the theme switch. */\n footerActions?: FooterAction[];\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 footerActions={footerActions?.filter(\n (action) => !action.superadmin || session.role === 'superadmin',\n )}\n onSearch={prefs.openPalette}\n badges={badges}\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":"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","names":[]}
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":"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","names":[]}
@@ -19,7 +19,7 @@ import {
19
19
  useCurrencyParam,
20
20
  usePersistedDateRange
21
21
  } from "./_ui";
22
- import { useGatewayChannels, usePlatformCockpit } from "./hooks";
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 overview" });
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: "We couldn't load the overview." }),
70
- /* @__PURE__ */ jsx("p", { className: "mb-0 mt-2 text-sm text-[var(--text-secondary)]", children: "Something went wrong while fetching the numbers. Please try again." }),
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: "Overview",
91
- description: "How merchants are growing, how much money is moving, and what needs your attention.",
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: "Sales over time", caption, children: focus ? /* @__PURE__ */ jsx(
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 }) }),
@@ -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 { useGatewayChannels, 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';\nimport { ChannelPanel } from './revenue/channel-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 channels = useGatewayChannels({\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 overview\" />;\n }\n\n if (cockpit.isError || !cockpit.data) {\n return (\n <div className=\"adm-panel\" role=\"alert\">\n <strong>We couldn&apos;t load the overview.</strong>\n <p className=\"mb-0 mt-2 text-sm text-[var(--text-secondary)]\">\n Something went wrong while fetching the numbers. Please try again.\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=\"Overview\"\n description=\"How merchants are growing, how much money is moving, and what needs your attention.\"\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\n attention={data.attention}\n currency={currency}\n totals={data.totals}\n />\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=\"Sales over time\" 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 {channels.data && channels.data.byChannel.length > 0 && (\n <div className=\"adm-grid\">\n <div className=\"adm-span-12\">\n <ChannelPanel\n totals={channels.data.byChannel}\n focus={focus}\n caption={caption}\n />\n </div>\n </div>\n )}\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":[]}
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("Short name and display name are required.");
56
+ return setFormError("Key and label are required.");
58
57
  if (!minimumMinor || !maximumMinor || !dailyMaximumMinor)
59
58
  return setFormError(
60
- "The smallest transfer, largest transfer and daily limit must be valid amounts."
59
+ "Minimum, maximum and daily limit must be valid amounts."
61
60
  );
62
61
  if (monthly && !monthlyMaximumMinor)
63
- return setFormError("The monthly limit must be a valid amount.");
62
+ return setFormError("The monthly limit is not a valid amount.");
64
63
  if (!/^\d+$/.test(position))
65
- return setFormError("Priority must be a whole number.");
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: "The sending limits a merchant gets once they have completed every check listed below.",
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
- Field,
92
+ /* @__PURE__ */ jsx(Field, { label: "Key", htmlFor: "t-key", required: true, children: /* @__PURE__ */ jsx(
93
+ Input,
95
94
  {
96
- label: "Short name",
97
- htmlFor: "t-key",
98
- required: true,
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: "Display name", htmlFor: "t-label", required: true, children: /* @__PURE__ */ jsx(
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: "Priority",
120
+ label: "Position",
131
121
  htmlFor: "t-pos",
132
- hint: "If a merchant qualifies for several levels, the one with the higher number is used.",
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: "Smallest single transfer", htmlFor: "t-min", required: true, children: /* @__PURE__ */ jsx(
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: "Largest single transfer", htmlFor: "t-max", required: true, children: /* @__PURE__ */ jsx(
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 limit", htmlFor: "t-day", required: true, children: /* @__PURE__ */ jsx(
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 limit", htmlFor: "t-mon", hint: "Optional.", children: /* @__PURE__ */ jsx(
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
- "Checks a merchant must complete (",
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: requirementGroupLabel(group) }),
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: requirementLabel(op),
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 ? `Gets the ${tier.label} level in ${preview.currency}` : `No ${preview.currency} level fits yet` }),
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: "Level", value: tier.label }),
23
- /* @__PURE__ */ jsx(Fact, { label: "Priority", value: String(tier.position) }),
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: "This merchant has to verify their identity before they can send money out." })
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: "Check" }),
40
- /* @__PURE__ */ jsx(Th, { children: "Result" })
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: requirementLabel(r.name) }),
44
- /* @__PURE__ */ jsx("td", { children: r.met ? /* @__PURE__ */ jsx(StatusBadge, { status: "completed", label: "Done" }) : /* @__PURE__ */ jsx(
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: "Still needed for the next level"
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';\nimport { requirementLabel } from './requirement-labels';\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 ? `Gets the ${tier.label} level in ${preview.currency}`\n : `No ${preview.currency} level fits yet`}\n </h3>\n {tier ? (\n <FactList className=\"mt-4\">\n <Fact label=\"Level\" value={tier.label} />\n <Fact label=\"Priority\" 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 This merchant has to verify their identity before they can send money out.\n </p>\n )}\n </Card>\n <TableShell\n minWidth={0}\n head={\n <tr>\n <Th>Check</Th>\n <Th>Result</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>{requirementLabel(r.name)}</td>\n <td>\n {r.met ? (\n <StatusBadge status=\"completed\" label=\"Done\" />\n ) : (\n <StatusBadge\n status=\"action_required\"\n label=\"Still needed for the next level\"\n />\n )}\n </td>\n </TableRow>\n ))\n )}\n </TableShell>\n </div>\n );\n}\n"],"mappings":";AA2BQ,cAME,YANF;AAzBR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAE5B,SAAS,YAAY,uBAAuB;AAC5C,OAAO,YAAY;AACnB,SAAS,wBAAwB;AAM1B,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,aAAa,QAAQ,QAAQ,KACnD,MAAM,QAAQ,QAAQ,mBAC5B;AAAA,MACC,OACC,qBAAC,YAAS,WAAU,QAClB;AAAA,4BAAC,QAAK,OAAM,SAAQ,OAAO,KAAK,OAAO;AAAA,QACvC,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,wFAE5B;AAAA,OAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,MACE,qBAAC,QACC;AAAA,8BAAC,MAAG,mBAAK;AAAA,UACT,oBAAC,MAAG,oBAAM;AAAA,WACZ;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,2BAAiB,EAAE,IAAI,GAAE;AAAA,UAC9B,oBAAC,QACE,YAAE,MACD,oBAAC,eAAY,QAAO,aAAY,OAAM,QAAO,IAE7C;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":[]}
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":[]}