@withpotter/pages-admin 0.13.0-next.96 → 0.13.0-next.98
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/hooks.js +21 -1
- package/dist/admin/hooks.js.map +1 -1
- package/dist/admin/revenue/download-button.js +40 -0
- package/dist/admin/revenue/download-button.js.map +1 -0
- package/dist/admin/revenue/ledger-model.js +84 -0
- package/dist/admin/revenue/ledger-model.js.map +1 -0
- package/dist/admin/revenue/ledger.module.css +101 -0
- package/dist/admin/revenue/merchant-payments-view.js +231 -0
- package/dist/admin/revenue/merchant-payments-view.js.map +1 -0
- package/dist/admin/revenue/method-cards.js +32 -0
- package/dist/admin/revenue/method-cards.js.map +1 -0
- package/dist/admin/revenue/revenue-kpis.js +13 -13
- package/dist/admin/revenue/revenue-kpis.js.map +1 -1
- package/dist/admin/revenue/revenue-overview.js +19 -2
- package/dist/admin/revenue/revenue-overview.js.map +1 -1
- package/dist/admin/revenue/revenue-workspace.js +31 -2
- package/dist/admin/revenue/revenue-workspace.js.map +1 -1
- package/dist/admin/revenue/subscriptions-view.js +188 -0
- package/dist/admin/revenue/subscriptions-view.js.map +1 -0
- package/dist/admin/tenants/[id]/page.js +6 -1
- package/dist/admin/tenants/[id]/page.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/admin/tenants/%5Bid%5D/page.tsx"],"sourcesContent":["'use client';\n\nimport { use, useState, useMemo, type ReactNode } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { Badge } from '@withpotter/ui-kit';\nimport {\n platformAdminApi,\n type TenantActivityOrder,\n type DashboardStats,\n type AdminFinanceAnalytics,\n type Transaction,\n type TenantCustomer,\n type TenantProduct,\n type TenantInvoice,\n type TenantDiscount,\n type TenantSettlement,\n type TenantBankAccount,\n type TenantSubscription,\n type ProductInsights,\n type CustomerInsights,\n type SellerRow,\n type SpenderRow,\n} from '@withpotter/lib/admin-api';\nimport { SubaccountsPanel } from './subaccounts-panel';\nimport { ActivityColumns } from './tenant-activity-feed';\nimport { TenantHeader, tenantTabs, type TenantTab } from './tenant-header';\nimport { useAdminModules } from '../../_shell/modules-context';\nimport { moduleOn } from '../../_shell/nav-modules';\nimport { TenantOverview } from './tenant-overview';\nimport { TenantPeoplePanel } from './tenant-people-panel';\nimport { TenantWalletCard } from './tenant-wallet-card';\nimport { useTenantWallet } from './use-tenant-wallet';\nimport { LedgerCurrencyFilter, MerchantLedger } from './merchant-ledger';\nimport { TenantSupport } from './tenant-support';\nimport { TenantVerification } from './verification/tenant-verification';\nimport { TenantPos } from './tenant-pos';\nimport { MerchantCommerce } from './commerce';\nimport {\n usePlatformTenant,\n useTenantAnalytics,\n useTenantFinance,\n useTenantTransactions,\n useTenantCustomers,\n useTenantProducts,\n useTenantProductInsights,\n useTenantCustomerInsights,\n useTenantInvoices,\n useTenantLoyalty,\n useTenantDiscounts,\n useTenantSettlements,\n useTenantSubscriptions,\n} from '../../hooks';\nimport {\n tableStyles,\n AdmLoading,\n Filters,\n FilterSearch,\n FilterSelect as AdmFilterSelect,\n PeriodSelector,\n customRange,\n periodPhrase,\n rangeFromKey,\n usePersistedDateRange,\n type DateRange,\n useTabParam,\n CurrencyFilter,\n byCurrency,\n currenciesIn,\n useCurrencyParam,\n MoneyLines,\n PICK_CURRENCY,\n focusCurrency,\n rowFor,\n shownRows,\n} from '../../_ui';\nimport { GrowthChart } from '../../growth-chart';\n\n// ---------------------------------------------------------------------------\n// formatting\n// ---------------------------------------------------------------------------\n\nfunction moneyCur(n: number, currency: string): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currencyDisplay: 'narrowSymbol',\n currency,\n maximumFractionDigits: 0,\n }).format(n);\n } catch {\n return `${currency} ${n.toFixed(0)}`;\n }\n}\n\n/**\n * The one currency the listed invoices share, or null when they are mixed or\n * there are none. The totals carry no currency of their own, so the rows name\n * it, and the caller falls back to naira.\n */\nfunction sharedCurrency(rows: Array<{ currency: string }>): string | null {\n const codes = new Set(rows.map((r: { currency: string }) => r.currency));\n return codes.size === 1 ? [...codes][0] || null : null;\n}\n\nfunction num(n: number): string {\n return new Intl.NumberFormat('en-US').format(n ?? 0);\n}\n\nfunction pct(n: number): string {\n return `${(n ?? 0).toFixed(1)}%`;\n}\n\nfunction duration(seconds: number): string {\n if (!seconds || seconds < 1) return '0s';\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return m > 0 ? `${m}m ${s}s` : `${s}s`;\n}\n\nfunction compactDate(s: string | null): string {\n if (!s) return '—';\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\n// ---------------------------------------------------------------------------\n// date range\n// ---------------------------------------------------------------------------\n\nfunction SegToggle<T extends string>({\n value,\n options,\n onChange,\n}: {\n value: T;\n options: Array<{ key: T; label: string }>;\n onChange: (k: T) => void;\n}) {\n // The console's segmented strip: the chosen part tinted, never solid.\n return (\n <div role=\"group\" className=\"adm-segments\">\n {options.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className=\"adm-segment\"\n onClick={() => onChange(opt.key)}\n aria-pressed={opt.key === value}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n\n/** Sub-sections inside the grouped tabs. */\nconst SUBTABS = {\n wallet: [\n { key: 'money', label: 'Money health' },\n { key: 'finance', label: 'Balances & finance' },\n ],\n payments: [\n { key: 'invoices', label: 'Invoices' },\n { key: 'subscriptions', label: 'Subscriptions' },\n ],\n withdrawals: [{ key: 'settlements', label: 'Payouts & bank accounts' }],\n commerce: [\n { key: 'commerce', label: 'Commerce' },\n { key: 'analytics', label: 'Sales' },\n { key: 'customers', label: 'Customers' },\n { key: 'products', label: 'Products' },\n { key: 'discounts', label: 'Discounts' },\n { key: 'loyalty', label: 'Loyalty' },\n ],\n} as const;\n\ntype GroupTab = keyof typeof SUBTABS;\ntype SubTab = (typeof SUBTABS)[GroupTab][number]['key'];\n\n// ---------------------------------------------------------------------------\n// page\n// ---------------------------------------------------------------------------\n\nexport default function TenantDetailPage({\n params,\n}: {\n params: Promise<{ id: string }>;\n}) {\n const { id } = use(params);\n // The tab lives in `?tab=`, so a deep link opens it (payout problems,\n // merchant finder) and Back from a case in Support returns to the tab it\n // was opened from. Clicks replace the entry rather than adding one.\n const modules = useAdminModules();\n // Every tab this Box serves; the first is the one a bare URL opens.\n const tabKeys = useMemo(\n () => tenantTabs(modules).map((t) => t.key as TenantTab),\n [modules],\n );\n const [tab, setTab] = useTabParam<TenantTab>(tabKeys);\n // Money health reads the merchant's wallet ledger, served with Wallets.\n const walletLedger = moduleOn(modules, 'wallets');\n const [sub, setSub] = useState<Record<GroupTab, SubTab>>({\n wallet: walletLedger ? 'money' : 'finance',\n payments: 'invoices',\n withdrawals: 'settlements',\n commerce: 'commerce',\n });\n const { rangeKey, setRangeKey, customStart, customEnd, onCustomChange } =\n usePersistedDateRange();\n const range = useMemo(\n () =>\n rangeKey === 'custom'\n ? customRange(customStart, customEnd)\n : rangeFromKey(rangeKey),\n [rangeKey, customStart, customEnd],\n );\n const [shown, setShown] = useCurrencyParam();\n const { data, isLoading, isError } = usePlatformTenant(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n // The tenant detail has no wallet of its own; the ledger is the source.\n const { wallet, walletNote } = useTenantWallet(\n id,\n walletLedger,\n data?.wallet,\n );\n const queryClient = useQueryClient();\n const statusMutation = useMutation({\n mutationFn: (status: string) =>\n platformAdminApi.setTenantStatus(id, status as never),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: ['platform-admin', 'tenant', id],\n });\n queryClient.invalidateQueries({\n queryKey: ['platform-admin', 'tenants'],\n });\n },\n });\n\n if (isError) {\n return <p style={{ color: 'var(--error)' }}>Failed to load tenant.</p>;\n }\n\n if (isLoading || !data) return <AdmLoading label=\"Loading tenant…\" />;\n\n // Same wallet Money shows, under the shape every card here already reads.\n const view: typeof data = { ...data, wallet };\n\n const currency = data.currency ?? 'NGN';\n // Every figure on this record comes back once per currency: sales, the\n // wallet, recent orders and finance. One control narrows them all.\n const currencyControl = (\n <CurrencyFilter\n value={shown}\n onChange={setShown}\n currencies={currenciesIn(\n data.currencies,\n view.wallet?.balances.map((b) => b.currency),\n data.recentOrders.map((o) => o.currency),\n )}\n />\n );\n const group = tab in SUBTABS ? (tab as GroupTab) : null;\n const current = group ? sub[group] : null;\n const periodControl = (\n <PeriodSelector\n value={rangeKey}\n onChange={setRangeKey}\n customStart={customStart}\n customEnd={customEnd}\n onCustomChange={onCustomChange}\n />\n );\n\n return (\n <div>\n <TenantHeader\n data={data}\n tab={tab}\n onTab={setTab}\n onStatus={(status) => statusMutation.mutate(status)}\n statusPending={statusMutation.isPending}\n />\n\n {tab === 'overview' && (\n <TenantOverview\n data={view}\n walletNote={walletNote}\n periodLabel={periodPhrase(range)}\n periodControl={periodControl}\n recentOrders={\n <ActivityTable\n orders={byCurrency(data.recentOrders, shown, (o) => o.currency)}\n isLoading={false}\n empty={shown ? `No recent ${shown} orders.` : undefined}\n />\n }\n onTab={setTab}\n currency={shown}\n currencyControl={currencyControl}\n />\n )}\n {tab === 'overview' && (\n <div id=\"tenant-team\" style={{ marginTop: 'var(--adm-gap)' }}>\n <TenantPeoplePanel data={data} />\n </div>\n )}\n {tab === 'verification' && <TenantVerification tenantId={id} />}\n {tab === 'support' && <TenantSupport tenantId={id} />}\n {tab === 'pos' && <TenantPos tenantId={id} />}\n {tab === 'audit' && <ActivityColumns entries={data.activity ?? []} />}\n\n {group && current && (\n <>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 16,\n }}\n >\n {SUBTABS[group].filter((o) => walletLedger || o.key !== 'money')\n .length > 1 ? (\n <SegToggle<SubTab>\n value={current}\n options={SUBTABS[group].filter(\n (o) => walletLedger || o.key !== 'money',\n )}\n onChange={(key) => setSub((s) => ({ ...s, [group]: key }))}\n />\n ) : (\n <span />\n )}\n <div className=\"adm-toolbar\">\n {group === 'wallet' && current !== 'money' && currencyControl}\n {current === 'money' ? (\n <LedgerCurrencyFilter\n tenantId={id}\n value={shown}\n onChange={setShown}\n />\n ) : (\n periodControl\n )}\n </div>\n </div>\n {group === 'wallet' && current !== 'money' && (\n <TenantWalletCard\n data={view}\n currency={shown}\n walletNote={walletNote}\n />\n )}\n {current === 'money' && (\n <MerchantLedger\n tenantId={id}\n business={data.businessName}\n currency={shown}\n onCurrency={setShown}\n />\n )}\n {current === 'settlements' && (\n <SettlementsTab id={id} range={range} />\n )}\n {current === 'finance' && (\n <FinanceTab id={id} range={range} currency={shown} />\n )}\n {current === 'commerce' && (\n <MerchantCommerce tenantId={id} currency={currency} range={range} />\n )}\n {current === 'analytics' && <AnalyticsTab id={id} range={range} />}\n {current === 'customers' && (\n <CustomersTab id={id} currency={currency} range={range} />\n )}\n {current === 'products' && (\n <ProductsTab id={id} currency={currency} range={range} />\n )}\n {current === 'discounts' && <DiscountsTab id={id} />}\n {current === 'loyalty' && <LoyaltyTab id={id} />}\n {current === 'invoices' && <InvoicesTab id={id} />}\n {current === 'subscriptions' && <SubscriptionsTab id={id} />}\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Analytics tab\n// ---------------------------------------------------------------------------\n\ntype StatItem = {\n label: string;\n value: ReactNode;\n /** Plain-language explanation of what this metric means, shown on hover. */\n hint?: string;\n};\n\n/**\n * Wraps a label so that hovering (or focusing) the label itself reveals a\n * plain-language explanation of the adjacent data point. No separate icon —\n * the element is its own trigger. Used to annotate every metric, breakdown\n * row and key/value stat.\n */\nfunction HintLabel({ label, hint }: { label: ReactNode; hint?: string }) {\n if (!hint) return <>{label}</>;\n return (\n <span className=\"adm-hint\" tabIndex={0} role=\"note\" aria-label={hint}>\n {label}\n <span className=\"adm-hint-bubble\" role=\"tooltip\">\n {hint}\n </span>\n </span>\n );\n}\n\n/**\n * Shared left-column summary list used by every sub-data tab. Vertical\n * label / value rows inside a single panel — this is the standard\n * \"summary\" surface that pairs with a wide detail column on the right.\n */\nfunction StatsListPanel({ items }: { items: StatItem[] }) {\n return (\n <div className=\"adm-panel\" style={{ padding: '4px 0' }}>\n {items.map((s, i) => (\n <div\n key={s.label}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '12px 16px',\n borderBottom:\n i < items.length - 1 ? '1px solid var(--border-subtle)' : 'none',\n }}\n >\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 10,\n fontSize: 13,\n color: 'var(--text-secondary)',\n }}\n >\n <HintLabel label={s.label} hint={s.hint} />\n </span>\n <span\n style={{\n fontSize: 18,\n fontWeight: 600,\n color: 'var(--text-primary)',\n }}\n >\n {s.value}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n/** Standard two-column scaffold: narrow summary column + wide detail column. */\nfunction SubDataLayout({\n summary,\n detail,\n}: {\n summary: ReactNode;\n detail: ReactNode;\n}) {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 300px) minmax(0, 1fr)',\n gap: 16,\n alignItems: 'start',\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {summary}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {detail}\n </div>\n </div>\n );\n}\n\nfunction AnalyticsTab({ id, range }: { id: string; range: DateRange }) {\n const { data, isLoading, isError } = useTenantAnalytics(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n const [srcTab, setSrcTab] = useState<'traffic' | 'devices'>('traffic');\n const [crTab, setCrTab] = useState<'customers' | 'reviews'>('customers');\n\n if (isError) {\n return <EmptyPanel>Failed to load analytics for this tenant.</EmptyPanel>;\n }\n if (isLoading || !data) {\n return <AdmLoading label=\"Loading analytics…\" />;\n }\n\n const a: DashboardStats = data;\n const series = a.visitorsTimeSeries?.length\n ? a.visitorsTimeSeries\n : a.sessionsTimeSeries;\n\n const statItems: StatItem[] = [\n {\n label: 'Page views',\n value: num(a.overview.totalPageViews),\n hint: 'Total number of pages loaded across the storefront in the selected period. One visitor can generate many page views.',\n },\n {\n label: 'Unique visitors',\n value: num(a.overview.uniqueVisitors),\n hint: 'Distinct people who visited the storefront, de-duplicated by device. Reloads and repeat visits in the period count once.',\n },\n {\n label: 'Sessions',\n value: num(a.overview.totalSessions),\n hint: 'Number of browsing sessions. A session is a continuous visit that ends after ~30 minutes of inactivity.',\n },\n {\n label: 'Avg session',\n value: duration(a.overview.averageSessionDuration),\n hint: 'Average time a visitor spends per session. Longer sessions usually indicate more engaged shoppers.',\n },\n {\n label: 'Bounce rate',\n value: pct(a.overview.bounceRate),\n hint: 'Share of sessions that left after viewing a single page without interacting. Lower is better.',\n },\n {\n label: 'Conversion',\n value: pct(a.sales.conversionRate),\n hint: 'Percentage of sessions that resulted in a completed purchase. The core measure of storefront effectiveness.',\n },\n ];\n\n return (\n <>\n {/* Stats list (left) + trend & funnel (right) */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 300px) minmax(0, 1fr)',\n gap: 16,\n alignItems: 'start',\n }}\n >\n {/* left column: stats list + channels tabbed card */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <StatsListPanel items={statItems} />\n\n <div className=\"adm-panel\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <div className=\"adm-panel-title\" style={{ marginBottom: 0 }}>\n Channels\n </div>\n <SegToggle\n value={srcTab}\n onChange={setSrcTab}\n options={[\n { key: 'traffic', label: 'Traffic' },\n { key: 'devices', label: 'Devices' },\n ]}\n />\n </div>\n {srcTab === 'traffic' ? (\n a.trafficSources?.length ? (\n a.trafficSources.map((s) => (\n <BarRow\n key={s.source}\n label={s.source || 'direct'}\n value={`${num(s.sessions)} · ${pct(s.percentage)}`}\n fraction={s.percentage / 100}\n hint={`Sessions arriving via ${s.source || 'direct'} — ${pct(s.percentage)} of all traffic in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No source data.</EmptyInline>\n )\n ) : a.devices?.length ? (\n a.devices.map((d) => (\n <BarRow\n key={d.device}\n label={d.device}\n value={`${num(d.sessions)} · ${pct(d.percentage)}`}\n fraction={d.percentage / 100}\n hint={`Sessions on ${d.device} devices — ${pct(d.percentage)} of all traffic in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No device data.</EmptyInline>\n )}\n </div>\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Conversion funnel</div>\n <FunnelBar\n label=\"Product views\"\n value={a.funnel.productViews}\n max={a.funnel.productViews}\n hint=\"Number of times shoppers viewed a product page — the top of the purchase funnel.\"\n />\n <FunnelBar\n label=\"Add to cart\"\n value={a.funnel.addToCart}\n max={a.funnel.productViews}\n rate={a.funnel.viewToCartRate}\n hint=\"Sessions that added an item to cart. The percentage is the view-to-cart conversion rate.\"\n />\n <FunnelBar\n label=\"Checkout\"\n value={a.funnel.checkoutStart}\n max={a.funnel.productViews}\n rate={a.funnel.cartToCheckoutRate}\n hint=\"Sessions that started checkout. The percentage is the cart-to-checkout conversion rate.\"\n />\n <FunnelBar\n label=\"Purchase\"\n value={a.funnel.purchase}\n max={a.funnel.productViews}\n rate={a.funnel.checkoutToPurchaseRate}\n hint=\"Sessions that completed a purchase. The percentage is the checkout-to-purchase conversion rate.\"\n last\n />\n </div>\n </div>\n\n {/* right column: visitors trend + top pages */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Visitors trend</div>\n {series?.length ? (\n <GrowthChart\n data={series.map((p) => ({ date: p.date, count: p.value }))}\n />\n ) : (\n <EmptyInline>No traffic recorded in this window.</EmptyInline>\n )}\n </div>\n\n <div>\n {a.topPages?.length ? (\n <div className=\"adm-table-card\">\n <div\n className=\"adm-panel-title\"\n style={{ margin: 0, padding: '16px 20px 12px' }}\n >\n Top pages\n </div>\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Page</th>\n <th style={tableStyles.th}>Views</th>\n <th style={tableStyles.th}>Unique visitors</th>\n </tr>\n </thead>\n <tbody>\n {a.topPages.slice(0, 12).map((p) => (\n <tr key={p.pageUrl}>\n <td style={tableStyles.cell}>{p.pageUrl || '/'}</td>\n <td style={tableStyles.cell}>{num(p.views)}</td>\n <td style={tableStyles.cellMuted}>\n {num(p.uniqueVisitors)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Top pages</div>\n <EmptyInline>No page views recorded yet.</EmptyInline>\n </div>\n )}\n </div>\n\n {/* Orders (left) + customers/reviews tabbed (right) */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: 16,\n alignItems: 'stretch',\n }}\n >\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Orders</div>\n <KeyRow label=\"Total\" value={num(a.orderStats.total)} />\n <KeyRow label=\"Completed\" value={num(a.orderStats.completed)} />\n <KeyRow label=\"Processing\" value={num(a.orderStats.processing)} />\n <KeyRow label=\"Pending\" value={num(a.orderStats.pending)} />\n <KeyRow\n label=\"Refunded\"\n value={num(a.orderStats.refunded)}\n last\n />\n </div>\n\n <div className=\"adm-panel\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <div className=\"adm-panel-title\" style={{ marginBottom: 0 }}>\n {crTab === 'customers' ? 'Customers' : 'Reviews'}\n </div>\n <SegToggle\n value={crTab}\n onChange={setCrTab}\n options={[\n { key: 'customers', label: 'Customers' },\n { key: 'reviews', label: 'Reviews' },\n ]}\n />\n </div>\n {crTab === 'customers' ? (\n <>\n <KeyRow\n label=\"Total\"\n value={num(a.customerStats.totalCustomers)}\n />\n <KeyRow\n label=\"Registered\"\n value={num(a.customerStats.registered)}\n />\n <KeyRow\n label=\"Subscribers\"\n value={num(a.customerStats.subscribers)}\n />\n <KeyRow label=\"Leads\" value={num(a.customerStats.leads)} />\n <KeyRow\n label=\"Guests\"\n value={num(a.customerStats.guests)}\n last\n />\n </>\n ) : (\n <>\n <KeyRow\n label=\"Average rating\"\n value={`${a.reviewStats.averageRating.toFixed(1)} ★`}\n />\n <KeyRow\n label=\"Approved\"\n value={num(a.reviewStats.totalApproved)}\n />\n <KeyRow\n label=\"Pending\"\n value={num(a.reviewStats.pendingCount)}\n />\n <KeyRow\n label=\"Response rate\"\n value={pct(a.reviewStats.responseRate)}\n last\n />\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Client errors */}\n {a.clientErrors?.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div className=\"adm-panel-title\" style={{ marginBottom: 12 }}>\n Client errors\n </div>\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Message</th>\n <th style={tableStyles.th}>Page</th>\n <th style={tableStyles.th}>Count</th>\n <th style={tableStyles.th}>Last seen</th>\n </tr>\n </thead>\n <tbody>\n {a.clientErrors.slice(0, 10).map((e, i) => (\n <tr key={`${e.pageUrl}-${i}`}>\n <td style={tableStyles.cell}>{e.message}</td>\n <td style={tableStyles.cell}>{e.pageUrl || '/'}</td>\n <td style={tableStyles.cell}>{num(e.count)}</td>\n <td style={tableStyles.cellMuted}>\n {new Date(e.lastSeen).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Finance tab\n// ---------------------------------------------------------------------------\n\nfunction FinanceTab({\n id,\n range,\n currency,\n}: {\n id: string;\n range: DateRange;\n /** The currency filter's choice; '' shows every currency. */\n currency: string;\n}) {\n const { data, isLoading, isError } = useTenantFinance(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n const [txnSearch, setTxnSearch] = useState('');\n const [txnType, setTxnType] = useState('');\n const { data: txns } = useTenantTransactions(id, {\n limit: 15,\n search: txnSearch || undefined,\n type: txnType || undefined,\n });\n\n if (isError) {\n return (\n <EmptyPanel>Failed to load finance data for this tenant.</EmptyPanel>\n );\n }\n if (isLoading || !data) {\n return <AdmLoading label=\"Loading finance…\" />;\n }\n\n const f: AdminFinanceAnalytics = data;\n // Money comes back once per currency and is never added across them; the\n // breakdown and the trend draw one currency, the filter's or the only one.\n const rows = f.summary.byCurrency;\n const focus = focusCurrency(f.summary.currencies ?? [], currency);\n const breakdown = rowFor(f.revenueByType?.byCurrency, focus)?.breakdown;\n const trend = rowFor(f.chart?.byCurrency, focus)?.data;\n const shown = shownRows(rows, currency);\n const count = (pick: (r: (typeof shown)[number]) => number, all: number) =>\n rows && currency ? shown.reduce((n, r) => n + pick(r), 0) : all;\n const lines = (amount: (r: NonNullable<typeof rows>[number]) => number) => (\n <MoneyLines rows={rows} currency={currency} amount={amount} />\n );\n\n const statItems: StatItem[] = [\n {\n label: 'Total revenue',\n value: lines((r) => r.totalRevenue),\n hint: 'Gross money collected from all successful transactions in this window, before platform and processing fees.',\n },\n {\n label: 'Fees',\n value: lines((r) => r.totalFees),\n hint: 'Total platform and payment-processing fees deducted from gross revenue over this window.',\n },\n {\n label: 'Net revenue',\n value: lines((r) => r.netRevenue),\n hint: 'What the tenant actually keeps: total revenue minus all fees. This is the amount eligible for payout.',\n },\n {\n label: 'Transactions',\n value: num(count((r) => r.transactionCount, f.summary.transactionCount)),\n hint: 'Count of all payment attempts in this window, including successful, pending, failed and refunded ones.',\n },\n {\n label: 'Avg value',\n value: lines((r) => r.averageTransactionValue),\n hint: 'Average amount per successful transaction (total revenue ÷ successful transactions).',\n },\n {\n label: 'Successful',\n value: num(count((r) => r.successfulCount, f.summary.successfulCount)),\n hint: 'Number of transactions that were fully captured and paid in this window.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Transaction status</div>\n <KeyRow\n label=\"Successful\"\n value={num(f.summary.successfulCount)}\n hint=\"Payments captured in full — money has been received.\"\n />\n <KeyRow\n label=\"Pending\"\n value={num(f.summary.pendingCount)}\n hint=\"Payments initiated but not yet confirmed by the processor.\"\n />\n <KeyRow\n label=\"Failed\"\n value={num(f.summary.failedCount)}\n hint=\"Payment attempts that were declined or errored and collected no money.\"\n />\n <KeyRow\n label=\"Refunded\"\n value={num(f.summary.refundedCount)}\n hint=\"Previously successful payments that were later returned to the customer.\"\n last\n />\n </div>\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Revenue by type{focus ? ` · ${focus}` : ''}\n </div>\n {!focus && f.summary.currencies?.length ? (\n <EmptyInline>{PICK_CURRENCY}</EmptyInline>\n ) : breakdown?.length ? (\n breakdown.map((b) => (\n <BarRow\n key={b.type}\n label={b.type}\n value={`${moneyCur(b.total, focus ?? '')} · ${pct(b.percentage)}`}\n fraction={b.percentage / 100}\n hint={`Revenue from ${b.type} sources — ${pct(b.percentage)} of total revenue in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No revenue breakdown.</EmptyInline>\n )}\n </div>\n </>\n }\n detail={\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Revenue trend{focus ? ` · ${focus}` : ''}\n </div>\n {!focus && f.summary.currencies?.length ? (\n <EmptyInline>{PICK_CURRENCY}</EmptyInline>\n ) : trend?.length ? (\n <GrowthChart\n data={trend.map((p) => ({\n date: p.date,\n count: p.total,\n }))}\n />\n ) : (\n <EmptyInline>No revenue in this window.</EmptyInline>\n )}\n </div>\n\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 12,\n flexWrap: 'wrap',\n }}\n >\n <div className=\"adm-panel-title\" style={{ margin: 0 }}>\n Transactions\n </div>\n <Filters label=\"Filter transactions\">\n <SearchInput\n value={txnSearch}\n onChange={setTxnSearch}\n placeholder=\"Search reference / customer…\"\n />\n <FilterSelect\n value={txnType}\n onChange={setTxnType}\n options={[\n { value: '', label: 'All sources' },\n { value: 'order', label: 'Order' },\n { value: 'invoice', label: 'Invoice' },\n { value: 'booking', label: 'Booking' },\n { value: 'membership', label: 'Membership' },\n { value: 'subscription', label: 'Subscription' },\n { value: 'deposit', label: 'Deposit' },\n { value: 'tip', label: 'Tip' },\n { value: 'refund', label: 'Refund' },\n { value: 'payout', label: 'Payout' },\n ]}\n />\n </Filters>\n </div>\n <TransactionsTable\n rows={txns?.transactions ?? f.recentTransactions}\n />\n </div>\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Customers tab\n// ---------------------------------------------------------------------------\n\n/** Compact panel listing top-spending customers. */\nfunction SpenderList({\n rows,\n currency,\n}: {\n rows: SpenderRow[];\n currency: string;\n}) {\n const max = Math.max(...rows.map((r) => r.totalSpent), 1);\n return (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Top spenders</div>\n {rows.length === 0 ? (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '8px 0',\n }}\n >\n No paying customers yet.\n </div>\n ) : (\n rows.map((r) => (\n <div key={r.id} style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 12,\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span\n style={{\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {r.name ?? r.email}\n </span>\n <span\n style={{ color: 'var(--text-secondary)', whiteSpace: 'nowrap' }}\n >\n {moneyCur(r.totalSpent, currency)} · {num(r.totalOrders)} orders\n </span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(2, (r.totalSpent / max) * 100)}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n ))\n )}\n </div>\n );\n}\n\nfunction CustomersTab({\n id,\n currency,\n range,\n}: {\n id: string;\n currency: string;\n range: DateRange;\n}) {\n const [search, setSearch] = useState('');\n const [type, setType] = useState('');\n const { data, isLoading, isError } = useTenantCustomers(id, {\n search: search || undefined,\n type: type || undefined,\n limit: 50,\n });\n const { data: insights } = useTenantCustomerInsights(id, {\n startDate: range.startDate,\n });\n if (isError) return <EmptyPanel>Failed to load customers.</EmptyPanel>;\n const rows: TenantCustomer[] = data?.members ?? [];\n const cur = insights?.currency ?? currency;\n\n const statItems: StatItem[] = insights\n ? [\n {\n label: 'Customers',\n value: num(insights.totalCustomers),\n hint: 'All-time count of customer records for this tenant, including registered, subscribers, leads and guests.',\n },\n {\n label: 'New · 30 days',\n value: num(insights.newCustomers30d),\n hint: 'Customers who first appeared in the last 30 days. This is a fixed 30-day metric and does not follow the range selector.',\n },\n {\n label: 'Paying',\n value: num(insights.payingCustomers),\n hint: 'Customers who have completed at least one paid order. The rest are leads, subscribers or guests.',\n },\n {\n label: 'Lifetime value',\n value: moneyCur(insights.lifetimeValue, cur),\n hint: 'Total amount paying customers have spent over their entire history with this tenant (all-time, not windowed).',\n },\n {\n label: 'Avg order value',\n value: moneyCur(insights.avgOrderValue, cur),\n hint: 'Average amount per paid order across all customers (lifetime spend ÷ total paid orders).',\n },\n {\n label: 'Repeat rate',\n value: pct(insights.repeatRate),\n hint: 'Share of paying customers who have placed more than one order. Higher means stronger retention.',\n },\n ]\n : [];\n\n return (\n <SubDataLayout\n summary={\n <>\n {insights && <StatsListPanel items={statItems} />}\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Acquisition source</div>\n {insights.bySource.length ? (\n insights.bySource.map((s) => (\n <BarRow\n key={s.label}\n label={s.label}\n value={num(s.count)}\n fraction={\n insights.totalCustomers > 0\n ? s.count / insights.totalCustomers\n : 0\n }\n hint={`Customers first attributed to ${s.label}. Bar width is this source's share of all customers.`}\n />\n ))\n ) : (\n <EmptyInline>No source data yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Segments</div>\n {insights.byType.length ? (\n insights.byType.map((s) => (\n <BarRow\n key={s.label}\n label={s.label}\n value={num(s.count)}\n fraction={\n insights.totalCustomers > 0\n ? s.count / insights.totalCustomers\n : 0\n }\n hint={`Number of ${s.label} customers. Bar width is this segment's share of the total customer base.`}\n />\n ))\n ) : (\n <EmptyInline>No segment data yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Retention</div>\n <KeyRow\n label=\"Repeat customers\"\n value={num(insights.repeatCustomers)}\n hint=\"Customers who have placed more than one paid order.\"\n />\n <KeyRow\n label=\"Dormant · 60d+\"\n value={num(insights.dormantCustomers)}\n hint=\"Paying customers with no order in the last 60 days — candidates for win-back campaigns.\"\n />\n <KeyRow\n label=\"Avg orders / customer\"\n value={insights.avgOrdersPerCustomer.toFixed(1)}\n hint=\"Average number of paid orders per paying customer over their lifetime.\"\n />\n <KeyRow\n label=\"Marketing opt-in\"\n value={pct(insights.marketingOptInRate)}\n hint=\"Share of customers who consented to marketing communications.\"\n last\n />\n </div>\n </>\n )}\n </>\n }\n detail={\n <>\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n New customers · {periodPhrase(range)}\n </div>\n <GrowthChart\n data={insights.signupsSeries}\n emptyLabel=\"No new customers in the selected period\"\n />\n </div>\n <SpenderList rows={insights.topSpenders} currency={cur} />\n </>\n )}\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search name / email…\"\n filter={{\n value: type,\n onChange: setType,\n options: [\n { value: '', label: 'All types' },\n { value: 'registered', label: 'Registered' },\n { value: 'subscriber', label: 'Subscriber' },\n { value: 'lead', label: 'Lead' },\n { value: 'guest', label: 'Guest' },\n ],\n }}\n />\n {isLoading ? (\n <AdmLoading label=\"Loading customers…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No customers match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Orders</th>\n <th style={tableStyles.th}>Spent</th>\n <th style={tableStyles.th}>Last order</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((c) => (\n <tr key={c.id}>\n <td style={tableStyles.cell}>\n <div style={{ fontWeight: 600 }}>{c.name ?? '—'}</div>\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {c.email}\n </div>\n </td>\n <td style={tableStyles.cell}>\n <span style={{ textTransform: 'capitalize' }}>\n {c.type}\n </span>\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n c.status === 'active' ? 'success' : 'secondary'\n }\n >\n {c.status}\n </Badge>\n </td>\n <td style={tableStyles.cell}>{num(c.totalOrders)}</td>\n <td style={tableStyles.cell}>\n {moneyCur(c.totalSpent, currency)}\n </td>\n <td style={tableStyles.cellMuted}>\n {c.lastOrderAt\n ? new Date(c.lastOrderAt).toLocaleDateString()\n : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Products tab\n// ---------------------------------------------------------------------------\n\nconst PRODUCT_TYPE_LABELS: Record<string, string> = {\n product: 'Products',\n event: 'Events',\n booking: 'Bookings',\n subscription: 'Subscriptions',\n membership: 'Memberships',\n 'digital-file': 'Digital files',\n};\n\n/** Compact panel listing a ranked set of sellers (best / worst). */\nfunction SellerList({\n title,\n rows,\n currency,\n emptyLabel,\n}: {\n title: string;\n rows: SellerRow[];\n currency: string;\n emptyLabel: string;\n}) {\n const max = Math.max(...rows.map((r) => r.units), 1);\n return (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">{title}</div>\n {rows.length === 0 ? (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '8px 0',\n }}\n >\n {emptyLabel}\n </div>\n ) : (\n rows.map((r) => (\n <div key={r.id} style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 12,\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span\n style={{\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {r.title}\n </span>\n <span\n style={{ color: 'var(--text-secondary)', whiteSpace: 'nowrap' }}\n >\n {num(r.units)} sold · {moneyCur(r.revenue, currency)}\n </span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(2, (r.units / max) * 100)}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n ))\n )}\n </div>\n );\n}\n\nfunction ProductsTab({\n id,\n currency,\n range,\n}: {\n id: string;\n currency: string;\n range: DateRange;\n}) {\n const [search, setSearch] = useState('');\n const [type, setType] = useState('');\n const { data, isLoading, isError } = useTenantProducts(id, {\n search: search || undefined,\n type: type || undefined,\n });\n const { data: insights } = useTenantProductInsights(id, {\n startDate: range.startDate,\n });\n if (isError) return <EmptyPanel>Failed to load catalog.</EmptyPanel>;\n const items: TenantProduct[] = data?.items ?? [];\n const cur = insights?.currency ?? currency;\n\n const statItems: StatItem[] = insights\n ? [\n {\n label: 'Catalog items',\n value: num(insights.totalProducts),\n hint: 'Total number of products, events, bookings and other sellable items in the catalog.',\n },\n {\n label: 'Active',\n value: num(insights.activeProducts),\n hint: 'Items currently published and available for purchase on the storefront.',\n },\n {\n label: 'Catalog value',\n value: moneyCur(insights.catalogValue, cur),\n hint: 'Combined list price of every catalog item — the total retail value on offer, not inventory on hand.',\n },\n {\n label: 'Inventory value',\n value: moneyCur(insights.inventoryValue, cur),\n hint: 'Retail value of stock currently on hand (price × quantity in stock) for trackable items.',\n },\n {\n label: 'Units sold',\n value: num(insights.totalUnitsSold),\n hint: 'Total quantity sold across paid orders in the selected period.',\n },\n {\n label: 'Avg price',\n value: moneyCur(insights.avgPrice, cur),\n hint: 'Average list price across all catalog items.',\n },\n ]\n : [\n {\n label: 'Catalog items',\n value: num(data?.stats.total ?? 0),\n hint: 'Total number of items in the catalog.',\n },\n {\n label: 'Active',\n value: num(data?.stats.active ?? 0),\n hint: 'Items currently published and available for purchase.',\n },\n {\n label: 'Featured',\n value: num(data?.stats.featured ?? 0),\n hint: 'Items flagged as featured and given prominent placement on the storefront.',\n },\n {\n label: 'Low stock',\n value: num(data?.stats.lowStock ?? 0),\n hint: 'Items at or below their low-stock threshold and at risk of selling out.',\n },\n {\n label: 'Out of stock',\n value: num(data?.stats.outOfStock ?? 0),\n hint: 'Items with zero inventory that cannot currently be purchased.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Inventory health</div>\n <KeyRow\n label=\"Featured\"\n value={num(insights.featuredProducts)}\n hint=\"Items flagged as featured for prominent storefront placement.\"\n />\n <KeyRow\n label=\"Low stock\"\n value={num(insights.lowStock)}\n hint=\"Items at or below their low-stock threshold and at risk of selling out.\"\n />\n <KeyRow\n label=\"Out of stock\"\n value={num(insights.outOfStock)}\n hint=\"Items with zero inventory that cannot currently be purchased.\"\n />\n <KeyRow\n label=\"At-risk value\"\n value={moneyCur(insights.inventoryAtRiskValue, cur)}\n hint=\"Retail value of low- and out-of-stock items — potential sales at risk from stockouts.\"\n last\n />\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Category mix</div>\n {insights.categories.length ? (\n insights.categories.map((c) => (\n <BarRow\n key={c.category}\n label={c.category}\n value={`${num(c.count)} · ${moneyCur(c.value, cur)}`}\n fraction={\n insights.catalogValue > 0\n ? c.value / insights.catalogValue\n : 0\n }\n hint={`${num(c.count)} items in ${c.category}. Bar width is this category's share of total catalog value.`}\n />\n ))\n ) : (\n <EmptyInline>No categories yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Featured performance</div>\n <KeyRow\n label=\"Featured items\"\n value={num(insights.featuredProducts)}\n hint=\"Number of items currently flagged as featured.\"\n />\n <KeyRow\n label=\"Featured units sold\"\n value={num(insights.featuredSellThrough.featuredUnits)}\n hint=\"Units sold from featured items in the selected period — measures whether featuring drives sales.\"\n />\n <KeyRow\n label=\"Non-featured units\"\n value={num(insights.featuredSellThrough.nonFeaturedUnits)}\n hint=\"Units sold from items that were not featured, for comparison.\"\n last\n />\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Catalog snapshot</div>\n <KeyRow\n label=\"Catalog sold\"\n value={pct(insights.pctEverSold)}\n hint=\"Share of catalog items that have sold at least one unit, ever.\"\n />\n <KeyRow\n label=\"Never sold\"\n value={num(insights.deadStock)}\n hint=\"Items that have never recorded a sale — dead stock to review or retire.\"\n />\n <KeyRow\n label=\"Newest\"\n value={insights.newestProduct?.title ?? '—'}\n hint=\"The most recently created catalog item.\"\n />\n <KeyRow\n label=\"Last updated\"\n value={compactDate(\n insights.lastUpdatedProduct?.updatedAt ?? null,\n )}\n hint=\"When any catalog item was last edited — a signal of how actively the catalog is maintained.\"\n last\n />\n </div>\n </>\n )}\n </>\n }\n detail={\n <>\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Units sold · {periodPhrase(range)}\n </div>\n <GrowthChart\n data={insights.unitsSeries}\n emptyLabel=\"No sales in the selected period\"\n />\n </div>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',\n gap: 16,\n }}\n >\n <SellerList\n title=\"Best sellers\"\n rows={insights.bestSellers}\n currency={cur}\n emptyLabel=\"No paid sales yet.\"\n />\n <SellerList\n title=\"Slowest movers\"\n rows={insights.worstSellers}\n currency={cur}\n emptyLabel=\"No paid sales yet.\"\n />\n </div>\n </>\n )}\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search title…\"\n filter={{\n value: type,\n onChange: setType,\n options: [\n { value: '', label: 'All types' },\n { value: 'product', label: 'Products' },\n { value: 'event', label: 'Events' },\n { value: 'booking', label: 'Bookings' },\n { value: 'subscription', label: 'Subscriptions' },\n { value: 'membership', label: 'Memberships' },\n { value: 'digital-file', label: 'Digital files' },\n ],\n }}\n />\n\n {isLoading ? (\n <AdmLoading label=\"Loading catalog…\" />\n ) : items.length === 0 ? (\n <EmptyPanel>No catalog items match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Title</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Price</th>\n <th style={tableStyles.th}>Inventory</th>\n <th style={tableStyles.th}>Status</th>\n </tr>\n </thead>\n <tbody>\n {items.map((p) => (\n <tr key={p.id}>\n <td style={tableStyles.cell}>\n <div style={{ fontWeight: 600 }}>{p.title}</div>\n {p.category && (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {p.category}\n </div>\n )}\n </td>\n <td style={tableStyles.cellMuted}>\n {PRODUCT_TYPE_LABELS[p.type] ?? p.type}\n </td>\n <td style={tableStyles.cell}>\n {p.price != null\n ? moneyCur(p.price, p.currency ?? currency)\n : '—'}\n </td>\n <td style={tableStyles.cellMuted}>\n {p.trackInventory\n ? num((p.quantity ?? 0) - (p.reserved ?? 0))\n : '∞'}\n </td>\n <td style={tableStyles.cell}>\n <Badge variant={p.isActive ? 'success' : 'secondary'}>\n {p.isActive ? 'active' : 'inactive'}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Invoices tab\n// ---------------------------------------------------------------------------\n\nfunction InvoicesTab({ id }: { id: string }) {\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantInvoices(id, {\n search: search || undefined,\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load invoices.</EmptyPanel>;\n const rows: TenantInvoice[] = data?.invoices ?? [];\n const s = data?.stats;\n // Naira unless the listed invoices all name another currency.\n const invoiceCurrency = sharedCurrency(rows) ?? 'NGN';\n const invoiceMoney = (n: number): string => moneyCur(n, invoiceCurrency);\n\n const statItems: StatItem[] = [\n {\n label: 'Revenue',\n value: invoiceMoney(s?.totalRevenue ?? 0),\n hint: 'Total amount collected from invoices that have been paid.',\n },\n {\n label: 'Outstanding',\n value: invoiceMoney(s?.totalOutstanding ?? 0),\n hint: 'Amount still owed across sent and overdue invoices that have not been paid.',\n },\n {\n label: 'Paid',\n value: num(s?.paid ?? 0),\n hint: 'Number of invoices settled in full.',\n },\n {\n label: 'Sent',\n value: num(s?.sent ?? 0),\n hint: 'Invoices issued to customers and awaiting payment.',\n },\n {\n label: 'Overdue',\n value: num(s?.overdue ?? 0),\n hint: 'Sent invoices past their due date and still unpaid.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <>\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search invoice / customer…\"\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'draft', label: 'Draft' },\n { value: 'sent', label: 'Sent' },\n { value: 'paid', label: 'Paid' },\n { value: 'overdue', label: 'Overdue' },\n { value: 'cancelled', label: 'Cancelled' },\n ],\n }}\n />\n\n {isLoading ? (\n <AdmLoading label=\"Loading invoices…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No invoices match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Invoice</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Total</th>\n <th style={tableStyles.th}>Due</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Created</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((inv) => (\n <tr key={inv.id}>\n <td style={tableStyles.cell}>#{inv.invoiceNumber}</td>\n <td style={tableStyles.cell}>\n {inv.customerName ?? inv.customerEmail ?? '—'}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(inv.total, inv.currency)}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(inv.amountDue, inv.currency)}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n inv.status === 'paid'\n ? 'success'\n : inv.status === 'overdue'\n ? 'secondary'\n : 'info'\n }\n >\n {inv.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(inv.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loyalty tab\n// ---------------------------------------------------------------------------\n\nfunction LoyaltyTab({ id }: { id: string }) {\n const { data, isLoading, isError } = useTenantLoyalty(id);\n if (isError) return <EmptyPanel>Failed to load loyalty program.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading loyalty…\" />;\n const { program, stats } = data;\n\n const statItems: StatItem[] = [\n {\n label: 'Members',\n value: num(stats.totalMembers),\n hint: 'Total customers enrolled in the loyalty program.',\n },\n {\n label: 'Active members',\n value: num(stats.activeMembers),\n hint: 'Members who have earned or redeemed points recently.',\n },\n {\n label: 'Points issued',\n value: num(stats.totalPointsIssued),\n hint: 'All loyalty points ever awarded to members.',\n },\n {\n label: 'Points redeemed',\n value: num(stats.totalPointsRedeemed),\n hint: 'Points members have spent on rewards. The difference from issued points is the outstanding liability.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Program</div>\n {program ? (\n <>\n <KeyRow\n label=\"Name\"\n value={program.name}\n hint=\"The customer-facing name of the loyalty program.\"\n />\n <KeyRow\n label=\"Points unit\"\n value={program.pointsName}\n hint=\"What members' points are called (e.g. points, stars, coins).\"\n />\n <KeyRow\n label=\"Earn rate\"\n value={`${program.pointsPerCurrency} pts / unit`}\n hint=\"How many points a member earns per unit of currency spent.\"\n />\n <KeyRow\n label=\"Redeem rate\"\n value={`${program.currencyPerPoint} / pt`}\n hint=\"How much each point is worth when redeemed against a purchase.\"\n />\n <KeyRow\n label=\"Status\"\n value={program.isActive ? 'active' : 'inactive'}\n hint=\"Whether the program is currently running and accruing points.\"\n last\n />\n </>\n ) : (\n <EmptyInline>\n No loyalty program configured for this tenant.\n </EmptyInline>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Discounts tab\n// ---------------------------------------------------------------------------\n\nfunction DiscountsTab({ id }: { id: string }) {\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantDiscounts(id, {\n search: search || undefined,\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load discounts.</EmptyPanel>;\n const rows: TenantDiscount[] = data?.discounts ?? [];\n return (\n <>\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search code / name…\"\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'scheduled', label: 'Scheduled' },\n { value: 'expired', label: 'Expired' },\n { value: 'disabled', label: 'Disabled' },\n ],\n }}\n />\n {isLoading ? (\n <AdmLoading label=\"Loading discounts…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No discounts match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Code</th>\n <th style={tableStyles.th}>Name</th>\n <th style={tableStyles.th}>Value</th>\n <th style={tableStyles.th}>Usage</th>\n <th style={tableStyles.th}>Status</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((d) => (\n <tr key={d.id}>\n <td style={tableStyles.cell}>{d.code}</td>\n <td style={tableStyles.cell}>{d.name}</td>\n <td style={tableStyles.cell}>\n {d.discountType === 'percentage'\n ? `${d.value}%`\n : moneyCur(d.value, 'NGN')}\n </td>\n <td style={tableStyles.cellMuted}>\n {num(d.usageCount)}\n {d.usageLimit ? ` / ${num(d.usageLimit)}` : ''}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n d.isExpired\n ? 'secondary'\n : d.isValid\n ? 'success'\n : 'info'\n }\n >\n {d.status}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Settlements tab\n// ---------------------------------------------------------------------------\n\nfunction SettlementsTab({ id, range }: { id: string; range: DateRange }) {\n const { data, isLoading, isError } = useTenantSettlements(id, {\n limit: 25,\n startDate: range.startDate,\n endDate: range.endDate,\n });\n if (isError) return <EmptyPanel>Failed to load settlements.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading settlements…\" />;\n const sum = data.summary;\n const cur = sum.currency || 'NGN';\n const banks: TenantBankAccount[] = data.bankAccounts ?? [];\n const rows: TenantSettlement[] = data.settlements ?? [];\n\n const statItems: StatItem[] = [\n {\n label: 'Settled',\n value: moneyCur(sum.totalSettled, cur),\n hint: 'Total amount successfully paid out to the tenant’s bank account in this window.',\n },\n {\n label: 'Pending',\n value: moneyCur(sum.totalPending, cur),\n hint: 'Payouts initiated but not yet confirmed as deposited.',\n },\n {\n label: 'Failed',\n value: moneyCur(sum.totalFailed, cur),\n hint: 'Payouts that could not be completed — usually a bank or account issue to investigate.',\n },\n {\n label: 'Platform fees',\n value: moneyCur(sum.platformFeesCollected, cur),\n hint: 'Fees Box retained from this tenant’s settlements over the window.',\n },\n {\n label: 'Payouts',\n value: num(sum.count),\n hint: 'Number of settlement payouts in this window.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n </>\n }\n detail={\n <div>\n <SubaccountsPanel banks={banks} />\n <div className=\"adm-panel-title\" style={{ marginBottom: 12 }}>\n Settlements\n </div>\n {rows.length === 0 ? (\n <EmptyPanel>No settlements yet for this tenant.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Gross</th>\n <th style={tableStyles.th}>Fees</th>\n <th style={tableStyles.th}>Net</th>\n <th style={tableStyles.th}>Destination</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Settled</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((st) => (\n <tr key={st.id}>\n <td style={tableStyles.cell}>\n {moneyCur(st.grossAmount, st.currency)}\n </td>\n <td style={tableStyles.cellMuted}>\n {moneyCur(st.paystackFee + st.platformFee, st.currency)}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(st.netAmount, st.currency)}\n </td>\n <td style={tableStyles.cell}>\n {st.bankAccount\n ? `${st.bankAccount.bankName} ••••${st.bankAccount.accountNumber.slice(-4)}`\n : '—'}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n st.status === 'completed' || st.status === 'success'\n ? 'success'\n : st.status === 'failed'\n ? 'secondary'\n : 'info'\n }\n >\n {st.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {st.settledAt\n ? new Date(st.settledAt).toLocaleDateString()\n : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Subscriptions tab — recurring plans this tenant sells to its customers\n// ---------------------------------------------------------------------------\n\nfunction subStatusVariant(\n status: string,\n): 'success' | 'info' | 'warning' | 'secondary' {\n switch (status) {\n case 'active':\n return 'success';\n case 'non_renewing':\n return 'info';\n case 'attention':\n return 'warning';\n default:\n return 'secondary';\n }\n}\n\nfunction subStatusLabel(status: string): string {\n return status === 'non_renewing' ? 'non-renewing' : status;\n}\n\nfunction SubscriptionsTab({ id }: { id: string }) {\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantSubscriptions(id, {\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load subscriptions.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading subscriptions…\" />;\n\n const stats = data.stats;\n const rows: TenantSubscription[] = data.subscriptions ?? [];\n const mrrCurrency = rows[0]?.currency || 'NGN';\n\n const statItems: StatItem[] = [\n {\n label: 'Active',\n value: num(stats.totalActive),\n hint: 'Subscriptions currently active and billing on schedule.',\n },\n {\n label: 'Non-renewing',\n value: num(stats.totalNonRenewing),\n hint: 'Active subscriptions set to end at the current period — they will not renew.',\n },\n {\n label: 'Cancelled',\n value: num(stats.totalCancelled),\n hint: 'Subscriptions that have been cancelled or have completed their term.',\n },\n {\n label: 'MRR',\n value: moneyCur(stats.monthlyRecurringRevenue, mrrCurrency),\n hint: 'Monthly recurring revenue — active subscription amounts normalised to a monthly value.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <div>\n <PanelToolbar\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'non_renewing', label: 'Non-renewing' },\n { value: 'attention', label: 'Attention' },\n { value: 'cancelled', label: 'Cancelled' },\n { value: 'completed', label: 'Completed' },\n ],\n }}\n />\n {rows.length === 0 ? (\n <EmptyPanel>No subscriptions match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Plan</th>\n <th style={tableStyles.th}>Amount</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Next payment</th>\n <th style={tableStyles.th}>Payments</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((s) => (\n <tr key={s.id}>\n <td style={tableStyles.cell}>\n {s.customer?.name || s.customerEmail}\n </td>\n <td style={tableStyles.cell}>{s.plan?.name ?? '—'}</td>\n <td style={tableStyles.cell}>\n {moneyCur(s.amount, s.currency)}\n {s.plan?.interval ? (\n <span\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {' '}\n / {s.plan.interval}\n </span>\n ) : null}\n </td>\n <td style={tableStyles.cell}>\n <Badge variant={subStatusVariant(s.status)}>\n {subStatusLabel(s.status)}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {compactDate(s.nextPaymentDate ?? s.currentPeriodEnd)}\n </td>\n <td style={tableStyles.cellMuted}>\n {num(s.paymentsCount)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// shared sub-components\n// ---------------------------------------------------------------------------\n\nfunction SearchInput({\n value,\n onChange,\n placeholder,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n}) {\n return (\n <FilterSearch value={value} onChange={onChange} placeholder={placeholder} />\n );\n}\n\nfunction FilterSelect({\n value,\n onChange,\n options,\n}: {\n value: string;\n onChange: (v: string) => void;\n options: Array<{ value: string; label: string }>;\n}) {\n return (\n <AdmFilterSelect\n label=\"Filter\"\n value={value}\n onChange={onChange}\n options={options}\n />\n );\n}\n\nfunction PanelToolbar({\n title,\n search,\n onSearch,\n searchPlaceholder,\n filter,\n}: {\n title?: string;\n search?: string;\n onSearch?: (v: string) => void;\n searchPlaceholder?: string;\n filter?: {\n value: string;\n onChange: (v: string) => void;\n options: Array<{ value: string; label: string }>;\n };\n}) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 12,\n flexWrap: 'wrap',\n }}\n >\n {title ? (\n <>\n <div className=\"adm-panel-title\" style={{ margin: 0 }}>\n {title}\n </div>\n <Filters label=\"Filter\">\n {onSearch && (\n <SearchInput\n value={search ?? ''}\n onChange={onSearch}\n placeholder={searchPlaceholder}\n />\n )}\n {filter && (\n <FilterSelect\n value={filter.value}\n onChange={filter.onChange}\n options={filter.options}\n />\n )}\n </Filters>\n </>\n ) : (\n <Filters label=\"Filter\">\n {onSearch && (\n <SearchInput\n value={search ?? ''}\n onChange={onSearch}\n placeholder={searchPlaceholder}\n />\n )}\n {filter && (\n <FilterSelect\n value={filter.value}\n onChange={filter.onChange}\n options={filter.options}\n />\n )}\n </Filters>\n )}\n </div>\n );\n}\n\nfunction KeyRow({\n label,\n value,\n hint,\n last,\n}: {\n label: string;\n value: string;\n hint?: string;\n last?: boolean;\n}) {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n gap: 16,\n padding: '10px 0',\n borderBottom: last ? 'none' : '1px solid var(--border-subtle)',\n }}\n >\n <span\n style={{\n color: 'var(--text-secondary)',\n fontSize: 13.5,\n flexShrink: 0,\n }}\n >\n <HintLabel label={label} hint={hint} />\n </span>\n <span\n style={{\n fontWeight: 600,\n fontSize: 14,\n textAlign: 'right',\n minWidth: 0,\n }}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction BarRow({\n label,\n value,\n fraction,\n hint,\n}: {\n label: string;\n value: string;\n fraction: number;\n hint?: string;\n}) {\n const w = Math.max(0, Math.min(1, fraction)) * 100;\n return (\n <div style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span style={{ textTransform: 'capitalize' }}>\n <HintLabel label={label} hint={hint} />\n </span>\n <span style={{ color: 'var(--text-secondary)' }}>{value}</span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${w}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction FunnelBar({\n label,\n value,\n max,\n rate,\n hint,\n last,\n}: {\n label: string;\n value: number;\n max: number;\n rate?: number;\n hint?: string;\n last?: boolean;\n}) {\n const w = max > 0 ? Math.max(2, (value / max) * 100) : 0;\n return (\n <div style={{ padding: last ? '9px 0 0' : '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center' }}>\n <HintLabel label={label} hint={hint} />\n </span>\n <span style={{ color: 'var(--text-secondary)' }}>\n {num(value)}\n {rate !== undefined ? ` · ${pct(rate)}` : ''}\n </span>\n </div>\n <div\n style={{\n height: 8,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${w}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel({ children }: { children: ReactNode }) {\n return (\n <div\n className=\"adm-panel\"\n style={{ color: 'var(--text-tertiary)', fontSize: 13 }}\n >\n {children}\n </div>\n );\n}\n\nfunction EmptyInline({ children }: { children: ReactNode }) {\n return (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '24px 0',\n textAlign: 'center',\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction ActivityTable({\n orders,\n isLoading,\n empty = 'No orders yet for this tenant.',\n}: {\n orders?: TenantActivityOrder[];\n isLoading?: boolean;\n empty?: string;\n}) {\n if (isLoading) {\n return <AdmLoading label=\"Loading activity…\" />;\n }\n if (!orders || orders.length === 0) {\n return <EmptyPanel>{empty}</EmptyPanel>;\n }\n return (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Order</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Total</th>\n <th style={tableStyles.th}>Payment</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Date</th>\n </tr>\n </thead>\n <tbody>\n {orders.map((o) => (\n <tr key={o.id}>\n <td style={tableStyles.cell}>#{o.orderNumber}</td>\n <td style={tableStyles.cell}>\n {o.customerName ?? o.customerEmail}\n </td>\n <td style={tableStyles.cell}>{moneyCur(o.total, o.currency)}</td>\n <td style={tableStyles.cell}>\n <Badge\n variant={o.paymentStatus === 'paid' ? 'success' : 'secondary'}\n >\n {o.paymentStatus}\n </Badge>\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n o.status === 'cancelled' || o.status === 'refunded'\n ? 'secondary'\n : 'info'\n }\n >\n {o.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(o.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction TransactionsTable({ rows }: { rows?: Transaction[] }) {\n if (!rows || rows.length === 0) {\n return <EmptyPanel>No transactions yet for this tenant.</EmptyPanel>;\n }\n return (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Reference</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Amount</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Date</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((t) => (\n <tr key={t.id}>\n <td style={tableStyles.cell}>{t.reference}</td>\n <td style={tableStyles.cell}>\n <span style={{ textTransform: 'capitalize' }}>{t.type}</span>\n </td>\n <td style={tableStyles.cell}>\n {t.customer?.name ?? t.customer?.email ?? '—'}\n </td>\n <td style={tableStyles.cell}>{moneyCur(t.amount, t.currency)}</td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n t.status === 'success'\n ? 'success'\n : t.status === 'failed' ||\n t.status === 'refunded' ||\n t.status === 'partially_refunded'\n ? 'secondary'\n : 'info'\n }\n >\n {t.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(t.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/admin/tenants/%5Bid%5D/page.tsx"],"sourcesContent":["'use client';\n\nimport { use, useState, useMemo, type ReactNode } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { Badge } from '@withpotter/ui-kit';\nimport {\n platformAdminApi,\n type TenantActivityOrder,\n type DashboardStats,\n type AdminFinanceAnalytics,\n type Transaction,\n type TenantCustomer,\n type TenantProduct,\n type TenantInvoice,\n type TenantDiscount,\n type TenantSettlement,\n type TenantBankAccount,\n type TenantSubscription,\n type ProductInsights,\n type CustomerInsights,\n type SellerRow,\n type SpenderRow,\n} from '@withpotter/lib/admin-api';\nimport { SubaccountsPanel } from './subaccounts-panel';\nimport { ActivityColumns } from './tenant-activity-feed';\nimport { TenantHeader, tenantTabs, type TenantTab } from './tenant-header';\nimport { useAdminModules } from '../../_shell/modules-context';\nimport { moduleOn } from '../../_shell/nav-modules';\nimport { TenantOverview } from './tenant-overview';\nimport { TenantPeoplePanel } from './tenant-people-panel';\nimport { TenantWalletCard } from './tenant-wallet-card';\nimport { useTenantWallet } from './use-tenant-wallet';\nimport { LedgerCurrencyFilter, MerchantLedger } from './merchant-ledger';\nimport { TenantSupport } from './tenant-support';\nimport { TenantVerification } from './verification/tenant-verification';\nimport { TenantPos } from './tenant-pos';\nimport { MerchantCommerce } from './commerce';\nimport {\n usePlatformTenant,\n useTenantAnalytics,\n useTenantFinance,\n useTenantTransactions,\n useTenantCustomers,\n useTenantProducts,\n useTenantProductInsights,\n useTenantCustomerInsights,\n useTenantInvoices,\n useTenantLoyalty,\n useTenantDiscounts,\n useTenantSettlements,\n useTenantSubscriptions,\n} from '../../hooks';\nimport {\n tableStyles,\n AdmLoading,\n Filters,\n FilterSearch,\n FilterSelect as AdmFilterSelect,\n PeriodSelector,\n customRange,\n periodPhrase,\n rangeFromKey,\n usePersistedDateRange,\n type DateRange,\n useTabParam,\n CurrencyFilter,\n byCurrency,\n currenciesIn,\n useCurrencyParam,\n MoneyLines,\n PICK_CURRENCY,\n focusCurrency,\n rowFor,\n shownRows,\n} from '../../_ui';\nimport { GrowthChart } from '../../growth-chart';\n\n// ---------------------------------------------------------------------------\n// formatting\n// ---------------------------------------------------------------------------\n\nfunction moneyCur(n: number, currency: string): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currencyDisplay: 'narrowSymbol',\n currency,\n maximumFractionDigits: 0,\n }).format(n);\n } catch {\n return `${currency} ${n.toFixed(0)}`;\n }\n}\n\n/**\n * The one currency the listed invoices share, or null when they are mixed or\n * there are none. The totals carry no currency of their own, so the rows name\n * it, and the caller falls back to naira.\n */\nfunction sharedCurrency(rows: Array<{ currency: string }>): string | null {\n const codes = new Set(rows.map((r: { currency: string }) => r.currency));\n return codes.size === 1 ? [...codes][0] || null : null;\n}\n\nfunction num(n: number): string {\n return new Intl.NumberFormat('en-US').format(n ?? 0);\n}\n\nfunction pct(n: number): string {\n return `${(n ?? 0).toFixed(1)}%`;\n}\n\nfunction duration(seconds: number): string {\n if (!seconds || seconds < 1) return '0s';\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return m > 0 ? `${m}m ${s}s` : `${s}s`;\n}\n\nfunction compactDate(s: string | null): string {\n if (!s) return '—';\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\n// ---------------------------------------------------------------------------\n// date range\n// ---------------------------------------------------------------------------\n\nfunction SegToggle<T extends string>({\n value,\n options,\n onChange,\n}: {\n value: T;\n options: Array<{ key: T; label: string }>;\n onChange: (k: T) => void;\n}) {\n // The console's segmented strip: the chosen part tinted, never solid.\n return (\n <div role=\"group\" className=\"adm-segments\">\n {options.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className=\"adm-segment\"\n onClick={() => onChange(opt.key)}\n aria-pressed={opt.key === value}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n\n/** Sub-sections inside the grouped tabs. */\nconst SUBTABS = {\n wallet: [\n { key: 'money', label: 'Money health' },\n { key: 'finance', label: 'Balances & finance' },\n ],\n payments: [\n { key: 'invoices', label: 'Invoices' },\n { key: 'subscriptions', label: 'Subscriptions' },\n ],\n withdrawals: [{ key: 'settlements', label: 'Payouts & bank accounts' }],\n commerce: [\n { key: 'commerce', label: 'Commerce' },\n { key: 'analytics', label: 'Sales' },\n { key: 'customers', label: 'Customers' },\n { key: 'products', label: 'Products' },\n { key: 'discounts', label: 'Discounts' },\n { key: 'loyalty', label: 'Loyalty' },\n ],\n} as const;\n\ntype GroupTab = keyof typeof SUBTABS;\ntype SubTab = (typeof SUBTABS)[GroupTab][number]['key'];\n\n// ---------------------------------------------------------------------------\n// page\n// ---------------------------------------------------------------------------\n\nexport default function TenantDetailPage({\n params,\n}: {\n params: Promise<{ id: string }>;\n}) {\n const { id } = use(params);\n // The tab lives in `?tab=`, so a deep link opens it (payout problems,\n // merchant finder) and Back from a case in Support returns to the tab it\n // was opened from. Clicks replace the entry rather than adding one.\n const modules = useAdminModules();\n // Every tab this Box serves; the first is the one a bare URL opens.\n const tabKeys = useMemo(\n () => tenantTabs(modules).map((t) => t.key as TenantTab),\n [modules],\n );\n const [tab, setTab] = useTabParam<TenantTab>(tabKeys);\n // Money health reads the merchant's wallet ledger, served with Wallets.\n const walletLedger = moduleOn(modules, 'wallets');\n const [sub, setSub] = useState<Record<GroupTab, SubTab>>({\n wallet: walletLedger ? 'money' : 'finance',\n payments: 'invoices',\n withdrawals: 'settlements',\n commerce: 'commerce',\n });\n const { rangeKey, setRangeKey, customStart, customEnd, onCustomChange } =\n usePersistedDateRange();\n const range = useMemo(\n () =>\n rangeKey === 'custom'\n ? customRange(customStart, customEnd)\n : rangeFromKey(rangeKey),\n [rangeKey, customStart, customEnd],\n );\n const [shown, setShown] = useCurrencyParam();\n const { data, isLoading, isError } = usePlatformTenant(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n // The tenant detail has no wallet of its own; the ledger is the source.\n const { wallet, walletNote } = useTenantWallet(\n id,\n walletLedger,\n data?.wallet,\n );\n const queryClient = useQueryClient();\n const statusMutation = useMutation({\n mutationFn: (status: string) =>\n platformAdminApi.setTenantStatus(id, status as never),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: ['platform-admin', 'tenant', id],\n });\n queryClient.invalidateQueries({\n queryKey: ['platform-admin', 'tenants'],\n });\n },\n });\n\n if (isError) {\n return <p style={{ color: 'var(--error)' }}>Failed to load tenant.</p>;\n }\n\n if (isLoading || !data) return <AdmLoading label=\"Loading tenant…\" />;\n\n // Same wallet Money shows, under the shape every card here already reads.\n const view: typeof data = { ...data, wallet };\n\n const currency = data.currency ?? 'NGN';\n // Every figure on this record comes back once per currency: sales, the\n // wallet, recent orders and finance. One control narrows them all.\n const currencyControl = (\n <CurrencyFilter\n value={shown}\n onChange={setShown}\n currencies={currenciesIn(\n data.currencies,\n view.wallet?.balances.map((b) => b.currency),\n data.recentOrders.map((o) => o.currency),\n )}\n />\n );\n const group = tab in SUBTABS ? (tab as GroupTab) : null;\n const current = group ? sub[group] : null;\n const periodControl = (\n <PeriodSelector\n value={rangeKey}\n onChange={setRangeKey}\n customStart={customStart}\n customEnd={customEnd}\n onCustomChange={onCustomChange}\n />\n );\n\n return (\n <div>\n <TenantHeader\n data={data}\n tab={tab}\n onTab={setTab}\n onStatus={(status) => statusMutation.mutate(status)}\n statusPending={statusMutation.isPending}\n />\n\n {tab === 'overview' && (\n <TenantOverview\n data={view}\n walletNote={walletNote}\n periodLabel={periodPhrase(range)}\n periodControl={periodControl}\n recentOrders={\n <ActivityTable\n orders={byCurrency(data.recentOrders, shown, (o) => o.currency)}\n isLoading={false}\n empty={shown ? `No recent ${shown} orders.` : undefined}\n />\n }\n onTab={setTab}\n currency={shown}\n currencyControl={currencyControl}\n />\n )}\n {tab === 'overview' && (\n <div id=\"tenant-team\" style={{ marginTop: 'var(--adm-gap)' }}>\n <TenantPeoplePanel data={data} />\n </div>\n )}\n {tab === 'verification' && <TenantVerification tenantId={id} />}\n {tab === 'support' && <TenantSupport tenantId={id} />}\n {tab === 'pos' && <TenantPos tenantId={id} />}\n {tab === 'audit' && <ActivityColumns entries={data.activity ?? []} />}\n\n {group && current && (\n <>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 16,\n }}\n >\n {SUBTABS[group].filter((o) => walletLedger || o.key !== 'money')\n .length > 1 ? (\n <SegToggle<SubTab>\n value={current}\n options={SUBTABS[group].filter(\n (o) => walletLedger || o.key !== 'money',\n )}\n onChange={(key) => setSub((s) => ({ ...s, [group]: key }))}\n />\n ) : (\n <span />\n )}\n <div className=\"adm-toolbar\">\n {group === 'wallet' && current !== 'money' && currencyControl}\n {current === 'money' ? (\n <LedgerCurrencyFilter\n tenantId={id}\n value={shown}\n onChange={setShown}\n />\n ) : (\n periodControl\n )}\n </div>\n </div>\n {group === 'wallet' && current !== 'money' && (\n <TenantWalletCard\n data={view}\n currency={shown}\n walletNote={walletNote}\n />\n )}\n {current === 'money' && (\n <MerchantLedger\n tenantId={id}\n business={data.businessName}\n currency={shown}\n onCurrency={setShown}\n />\n )}\n {current === 'settlements' && (\n <SettlementsTab id={id} range={range} />\n )}\n {current === 'finance' && (\n <FinanceTab id={id} range={range} currency={shown} />\n )}\n {current === 'commerce' && (\n <MerchantCommerce tenantId={id} currency={currency} range={range} />\n )}\n {current === 'analytics' && <AnalyticsTab id={id} range={range} />}\n {current === 'customers' && (\n <CustomersTab id={id} currency={currency} range={range} />\n )}\n {current === 'products' && (\n <ProductsTab id={id} currency={currency} range={range} />\n )}\n {current === 'discounts' && <DiscountsTab id={id} />}\n {current === 'loyalty' && <LoyaltyTab id={id} />}\n {current === 'invoices' && <InvoicesTab id={id} />}\n {current === 'subscriptions' && <SubscriptionsTab id={id} />}\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Analytics tab\n// ---------------------------------------------------------------------------\n\ntype StatItem = {\n label: string;\n value: ReactNode;\n /** Plain-language explanation of what this metric means, shown on hover. */\n hint?: string;\n};\n\n/**\n * Wraps a label so that hovering (or focusing) the label itself reveals a\n * plain-language explanation of the adjacent data point. No separate icon —\n * the element is its own trigger. Used to annotate every metric, breakdown\n * row and key/value stat.\n */\nfunction HintLabel({ label, hint }: { label: ReactNode; hint?: string }) {\n if (!hint) return <>{label}</>;\n return (\n <span className=\"adm-hint\" tabIndex={0} role=\"note\" aria-label={hint}>\n {label}\n <span className=\"adm-hint-bubble\" role=\"tooltip\">\n {hint}\n </span>\n </span>\n );\n}\n\n/**\n * Shared left-column summary list used by every sub-data tab. Vertical\n * label / value rows inside a single panel — this is the standard\n * \"summary\" surface that pairs with a wide detail column on the right.\n */\nfunction StatsListPanel({ items }: { items: StatItem[] }) {\n return (\n <div className=\"adm-panel\" style={{ padding: '4px 0' }}>\n {items.map((s, i) => (\n <div\n key={s.label}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '12px 16px',\n borderBottom:\n i < items.length - 1 ? '1px solid var(--border-subtle)' : 'none',\n }}\n >\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 10,\n fontSize: 13,\n color: 'var(--text-secondary)',\n }}\n >\n <HintLabel label={s.label} hint={s.hint} />\n </span>\n <span\n style={{\n fontSize: 18,\n fontWeight: 600,\n color: 'var(--text-primary)',\n }}\n >\n {s.value}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n/** Standard two-column scaffold: narrow summary column + wide detail column. */\nfunction SubDataLayout({\n summary,\n detail,\n}: {\n summary: ReactNode;\n detail: ReactNode;\n}) {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 300px) minmax(0, 1fr)',\n gap: 16,\n alignItems: 'start',\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {summary}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {detail}\n </div>\n </div>\n );\n}\n\nfunction AnalyticsTab({ id, range }: { id: string; range: DateRange }) {\n const { data, isLoading, isError } = useTenantAnalytics(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n const [srcTab, setSrcTab] = useState<'traffic' | 'devices'>('traffic');\n const [crTab, setCrTab] = useState<'customers' | 'reviews'>('customers');\n\n if (isError) {\n return <EmptyPanel>Failed to load analytics for this tenant.</EmptyPanel>;\n }\n if (isLoading || !data) {\n return <AdmLoading label=\"Loading analytics…\" />;\n }\n\n const a: DashboardStats = data;\n const series = a.visitorsTimeSeries?.length\n ? a.visitorsTimeSeries\n : a.sessionsTimeSeries;\n\n const statItems: StatItem[] = [\n {\n label: 'Page views',\n value: num(a.overview.totalPageViews),\n hint: 'Total number of pages loaded across the storefront in the selected period. One visitor can generate many page views.',\n },\n {\n label: 'Unique visitors',\n value: num(a.overview.uniqueVisitors),\n hint: 'Distinct people who visited the storefront, de-duplicated by device. Reloads and repeat visits in the period count once.',\n },\n {\n label: 'Sessions',\n value: num(a.overview.totalSessions),\n hint: 'Number of browsing sessions. A session is a continuous visit that ends after ~30 minutes of inactivity.',\n },\n {\n label: 'Avg session',\n value: duration(a.overview.averageSessionDuration),\n hint: 'Average time a visitor spends per session. Longer sessions usually indicate more engaged shoppers.',\n },\n {\n label: 'Bounce rate',\n value: pct(a.overview.bounceRate),\n hint: 'Share of sessions that left after viewing a single page without interacting. Lower is better.',\n },\n {\n label: 'Conversion',\n value: pct(a.sales.conversionRate),\n hint: 'Percentage of sessions that resulted in a completed purchase. The core measure of storefront effectiveness.',\n },\n ];\n\n return (\n <>\n {/* Stats list (left) + trend & funnel (right) */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 300px) minmax(0, 1fr)',\n gap: 16,\n alignItems: 'start',\n }}\n >\n {/* left column: stats list + channels tabbed card */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <StatsListPanel items={statItems} />\n\n <div className=\"adm-panel\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <div className=\"adm-panel-title\" style={{ marginBottom: 0 }}>\n Channels\n </div>\n <SegToggle\n value={srcTab}\n onChange={setSrcTab}\n options={[\n { key: 'traffic', label: 'Traffic' },\n { key: 'devices', label: 'Devices' },\n ]}\n />\n </div>\n {srcTab === 'traffic' ? (\n a.trafficSources?.length ? (\n a.trafficSources.map((s) => (\n <BarRow\n key={s.source}\n label={s.source || 'direct'}\n value={`${num(s.sessions)} · ${pct(s.percentage)}`}\n fraction={s.percentage / 100}\n hint={`Sessions arriving via ${s.source || 'direct'} — ${pct(s.percentage)} of all traffic in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No source data.</EmptyInline>\n )\n ) : a.devices?.length ? (\n a.devices.map((d) => (\n <BarRow\n key={d.device}\n label={d.device}\n value={`${num(d.sessions)} · ${pct(d.percentage)}`}\n fraction={d.percentage / 100}\n hint={`Sessions on ${d.device} devices — ${pct(d.percentage)} of all traffic in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No device data.</EmptyInline>\n )}\n </div>\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Conversion funnel</div>\n <FunnelBar\n label=\"Product views\"\n value={a.funnel.productViews}\n max={a.funnel.productViews}\n hint=\"Number of times shoppers viewed a product page — the top of the purchase funnel.\"\n />\n <FunnelBar\n label=\"Add to cart\"\n value={a.funnel.addToCart}\n max={a.funnel.productViews}\n rate={a.funnel.viewToCartRate}\n hint=\"Sessions that added an item to cart. The percentage is the view-to-cart conversion rate.\"\n />\n <FunnelBar\n label=\"Checkout\"\n value={a.funnel.checkoutStart}\n max={a.funnel.productViews}\n rate={a.funnel.cartToCheckoutRate}\n hint=\"Sessions that started checkout. The percentage is the cart-to-checkout conversion rate.\"\n />\n <FunnelBar\n label=\"Purchase\"\n value={a.funnel.purchase}\n max={a.funnel.productViews}\n rate={a.funnel.checkoutToPurchaseRate}\n hint=\"Sessions that completed a purchase. The percentage is the checkout-to-purchase conversion rate.\"\n last\n />\n </div>\n </div>\n\n {/* right column: visitors trend + top pages */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Visitors trend</div>\n {series?.length ? (\n <GrowthChart\n data={series.map((p) => ({ date: p.date, count: p.value }))}\n />\n ) : (\n <EmptyInline>No traffic recorded in this window.</EmptyInline>\n )}\n </div>\n\n <div>\n {a.topPages?.length ? (\n <div className=\"adm-table-card\">\n <div\n className=\"adm-panel-title\"\n style={{ margin: 0, padding: '16px 20px 12px' }}\n >\n Top pages\n </div>\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Page</th>\n <th style={tableStyles.th}>Views</th>\n <th style={tableStyles.th}>Unique visitors</th>\n </tr>\n </thead>\n <tbody>\n {a.topPages.slice(0, 12).map((p) => (\n <tr key={p.pageUrl}>\n <td style={tableStyles.cell}>{p.pageUrl || '/'}</td>\n <td style={tableStyles.cell}>{num(p.views)}</td>\n <td style={tableStyles.cellMuted}>\n {num(p.uniqueVisitors)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Top pages</div>\n <EmptyInline>No page views recorded yet.</EmptyInline>\n </div>\n )}\n </div>\n\n {/* Orders (left) + customers/reviews tabbed (right) */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: 16,\n alignItems: 'stretch',\n }}\n >\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Orders</div>\n <KeyRow label=\"Total\" value={num(a.orderStats.total)} />\n <KeyRow label=\"Completed\" value={num(a.orderStats.completed)} />\n <KeyRow label=\"Processing\" value={num(a.orderStats.processing)} />\n <KeyRow label=\"Pending\" value={num(a.orderStats.pending)} />\n <KeyRow\n label=\"Refunded\"\n value={num(a.orderStats.refunded)}\n last\n />\n </div>\n\n <div className=\"adm-panel\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <div className=\"adm-panel-title\" style={{ marginBottom: 0 }}>\n {crTab === 'customers' ? 'Customers' : 'Reviews'}\n </div>\n <SegToggle\n value={crTab}\n onChange={setCrTab}\n options={[\n { key: 'customers', label: 'Customers' },\n { key: 'reviews', label: 'Reviews' },\n ]}\n />\n </div>\n {crTab === 'customers' ? (\n <>\n <KeyRow\n label=\"Total\"\n value={num(a.customerStats.totalCustomers)}\n />\n <KeyRow\n label=\"Registered\"\n value={num(a.customerStats.registered)}\n />\n <KeyRow\n label=\"Subscribers\"\n value={num(a.customerStats.subscribers)}\n />\n <KeyRow label=\"Leads\" value={num(a.customerStats.leads)} />\n <KeyRow\n label=\"Guests\"\n value={num(a.customerStats.guests)}\n last\n />\n </>\n ) : (\n <>\n <KeyRow\n label=\"Average rating\"\n value={`${a.reviewStats.averageRating.toFixed(1)} ★`}\n />\n <KeyRow\n label=\"Approved\"\n value={num(a.reviewStats.totalApproved)}\n />\n <KeyRow\n label=\"Pending\"\n value={num(a.reviewStats.pendingCount)}\n />\n <KeyRow\n label=\"Response rate\"\n value={pct(a.reviewStats.responseRate)}\n last\n />\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Client errors */}\n {a.clientErrors?.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div className=\"adm-panel-title\" style={{ marginBottom: 12 }}>\n Client errors\n </div>\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Message</th>\n <th style={tableStyles.th}>Page</th>\n <th style={tableStyles.th}>Count</th>\n <th style={tableStyles.th}>Last seen</th>\n </tr>\n </thead>\n <tbody>\n {a.clientErrors.slice(0, 10).map((e, i) => (\n <tr key={`${e.pageUrl}-${i}`}>\n <td style={tableStyles.cell}>{e.message}</td>\n <td style={tableStyles.cell}>{e.pageUrl || '/'}</td>\n <td style={tableStyles.cell}>{num(e.count)}</td>\n <td style={tableStyles.cellMuted}>\n {new Date(e.lastSeen).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Finance tab\n// ---------------------------------------------------------------------------\n\nfunction FinanceTab({\n id,\n range,\n currency,\n}: {\n id: string;\n range: DateRange;\n /** The currency filter's choice; '' shows every currency. */\n currency: string;\n}) {\n const { data, isLoading, isError } = useTenantFinance(id, {\n startDate: range.startDate,\n endDate: range.endDate,\n });\n const [txnSearch, setTxnSearch] = useState('');\n const [txnType, setTxnType] = useState('');\n const { data: txns } = useTenantTransactions(id, {\n limit: 15,\n search: txnSearch || undefined,\n type: txnType || undefined,\n });\n\n if (isError) {\n return (\n <EmptyPanel>Failed to load finance data for this tenant.</EmptyPanel>\n );\n }\n if (isLoading || !data) {\n return <AdmLoading label=\"Loading finance…\" />;\n }\n\n const f: AdminFinanceAnalytics = data;\n // Money comes back once per currency and is never added across them; the\n // breakdown and the trend draw one currency, the filter's or the only one.\n const rows = f.summary.byCurrency;\n const focus = focusCurrency(f.summary.currencies ?? [], currency);\n const breakdown = rowFor(f.revenueByType?.byCurrency, focus)?.breakdown;\n const trend = rowFor(f.chart?.byCurrency, focus)?.data;\n const shown = shownRows(rows, currency);\n const count = (pick: (r: (typeof shown)[number]) => number, all: number) =>\n rows && currency ? shown.reduce((n, r) => n + pick(r), 0) : all;\n const lines = (amount: (r: NonNullable<typeof rows>[number]) => number) => (\n <MoneyLines rows={rows} currency={currency} amount={amount} />\n );\n\n const statItems: StatItem[] = [\n {\n label: 'Total revenue',\n value: lines((r) => r.totalRevenue),\n hint: 'Gross money collected from all successful transactions in this window, before platform and processing fees.',\n },\n {\n label: 'Fees',\n value: lines((r) => r.totalFees),\n hint: 'Total platform and payment-processing fees deducted from gross revenue over this window.',\n },\n {\n label: 'Net revenue',\n value: lines((r) => r.netRevenue),\n hint: 'What the tenant actually keeps: total revenue minus all fees. This is the amount eligible for payout.',\n },\n {\n label: 'Transactions',\n value: num(count((r) => r.transactionCount, f.summary.transactionCount)),\n hint: 'Count of all payment attempts in this window, including successful, pending, failed and refunded ones.',\n },\n {\n label: 'Avg value',\n value: lines((r) => r.averageTransactionValue),\n hint: 'Average amount per successful transaction (total revenue ÷ successful transactions).',\n },\n {\n label: 'Successful',\n value: num(count((r) => r.successfulCount, f.summary.successfulCount)),\n hint: 'Number of transactions that were fully captured and paid in this window.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Transaction status</div>\n <KeyRow\n label=\"Successful\"\n value={num(f.summary.successfulCount)}\n hint=\"Payments captured in full — money has been received.\"\n />\n <KeyRow\n label=\"Pending\"\n value={num(f.summary.pendingCount)}\n hint=\"Payments initiated but not yet confirmed by the processor.\"\n />\n <KeyRow\n label=\"Failed\"\n value={num(f.summary.failedCount)}\n hint=\"Payment attempts that were declined or errored and collected no money.\"\n />\n <KeyRow\n label=\"Refunded\"\n value={num(f.summary.refundedCount)}\n hint=\"Previously successful payments that were later returned to the customer.\"\n last\n />\n </div>\n\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Revenue by type{focus ? ` · ${focus}` : ''}\n </div>\n {!focus && f.summary.currencies?.length ? (\n <EmptyInline>{PICK_CURRENCY}</EmptyInline>\n ) : breakdown?.length ? (\n breakdown.map((b) => (\n <BarRow\n key={b.type}\n label={b.type}\n value={`${moneyCur(b.total, focus ?? '')} · ${pct(b.percentage)}`}\n fraction={b.percentage / 100}\n hint={`Revenue from ${b.type} sources — ${pct(b.percentage)} of total revenue in this window.`}\n />\n ))\n ) : (\n <EmptyInline>No revenue breakdown.</EmptyInline>\n )}\n </div>\n </>\n }\n detail={\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Revenue trend{focus ? ` · ${focus}` : ''}\n </div>\n {!focus && f.summary.currencies?.length ? (\n <EmptyInline>{PICK_CURRENCY}</EmptyInline>\n ) : trend?.length ? (\n <GrowthChart\n data={trend.map((p) => ({\n date: p.date,\n count: p.total,\n }))}\n />\n ) : (\n <EmptyInline>No revenue in this window.</EmptyInline>\n )}\n </div>\n\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 12,\n flexWrap: 'wrap',\n }}\n >\n <div className=\"adm-panel-title\" style={{ margin: 0 }}>\n Transactions\n </div>\n <Filters label=\"Filter transactions\">\n <SearchInput\n value={txnSearch}\n onChange={setTxnSearch}\n placeholder=\"Search reference / customer…\"\n />\n <FilterSelect\n value={txnType}\n onChange={setTxnType}\n options={[\n { value: '', label: 'All sources' },\n { value: 'order', label: 'Order' },\n { value: 'invoice', label: 'Invoice' },\n { value: 'booking', label: 'Booking' },\n { value: 'membership', label: 'Membership' },\n { value: 'subscription', label: 'Subscription' },\n { value: 'deposit', label: 'Deposit' },\n { value: 'tip', label: 'Tip' },\n { value: 'refund', label: 'Refund' },\n { value: 'payout', label: 'Payout' },\n ]}\n />\n </Filters>\n </div>\n <TransactionsTable\n rows={txns?.transactions ?? f.recentTransactions}\n />\n </div>\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Customers tab\n// ---------------------------------------------------------------------------\n\n/** Compact panel listing top-spending customers. */\nfunction SpenderList({\n rows,\n currency,\n}: {\n rows: SpenderRow[];\n currency: string;\n}) {\n const max = Math.max(...rows.map((r) => r.totalSpent), 1);\n return (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Top spenders</div>\n {rows.length === 0 ? (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '8px 0',\n }}\n >\n No paying customers yet.\n </div>\n ) : (\n rows.map((r) => (\n <div key={r.id} style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 12,\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span\n style={{\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {r.name ?? r.email}\n </span>\n <span\n style={{ color: 'var(--text-secondary)', whiteSpace: 'nowrap' }}\n >\n {moneyCur(r.totalSpent, currency)} · {num(r.totalOrders)} orders\n </span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(2, (r.totalSpent / max) * 100)}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n ))\n )}\n </div>\n );\n}\n\nfunction CustomersTab({\n id,\n currency,\n range,\n}: {\n id: string;\n currency: string;\n range: DateRange;\n}) {\n const [search, setSearch] = useState('');\n const [type, setType] = useState('');\n const { data, isLoading, isError } = useTenantCustomers(id, {\n search: search || undefined,\n type: type || undefined,\n limit: 50,\n });\n const { data: insights } = useTenantCustomerInsights(id, {\n startDate: range.startDate,\n });\n if (isError) return <EmptyPanel>Failed to load customers.</EmptyPanel>;\n const rows: TenantCustomer[] = data?.members ?? [];\n const cur = insights?.currency ?? currency;\n\n const statItems: StatItem[] = insights\n ? [\n {\n label: 'Customers',\n value: num(insights.totalCustomers),\n hint: 'All-time count of customer records for this tenant, including registered, subscribers, leads and guests.',\n },\n {\n label: 'New · 30 days',\n value: num(insights.newCustomers30d),\n hint: 'Customers who first appeared in the last 30 days. This is a fixed 30-day metric and does not follow the range selector.',\n },\n {\n label: 'Paying',\n value: num(insights.payingCustomers),\n hint: 'Customers who have completed at least one paid order. The rest are leads, subscribers or guests.',\n },\n {\n label: 'Lifetime value',\n value: moneyCur(insights.lifetimeValue, cur),\n hint: 'Total amount paying customers have spent over their entire history with this tenant (all-time, not windowed).',\n },\n {\n label: 'Avg order value',\n value: moneyCur(insights.avgOrderValue, cur),\n hint: 'Average amount per paid order across all customers (lifetime spend ÷ total paid orders).',\n },\n {\n label: 'Repeat rate',\n value: pct(insights.repeatRate),\n hint: 'Share of paying customers who have placed more than one order. Higher means stronger retention.',\n },\n ]\n : [];\n\n return (\n <SubDataLayout\n summary={\n <>\n {insights && <StatsListPanel items={statItems} />}\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Acquisition source</div>\n {insights.bySource.length ? (\n insights.bySource.map((s) => (\n <BarRow\n key={s.label}\n label={s.label}\n value={num(s.count)}\n fraction={\n insights.totalCustomers > 0\n ? s.count / insights.totalCustomers\n : 0\n }\n hint={`Customers first attributed to ${s.label}. Bar width is this source's share of all customers.`}\n />\n ))\n ) : (\n <EmptyInline>No source data yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Segments</div>\n {insights.byType.length ? (\n insights.byType.map((s) => (\n <BarRow\n key={s.label}\n label={s.label}\n value={num(s.count)}\n fraction={\n insights.totalCustomers > 0\n ? s.count / insights.totalCustomers\n : 0\n }\n hint={`Number of ${s.label} customers. Bar width is this segment's share of the total customer base.`}\n />\n ))\n ) : (\n <EmptyInline>No segment data yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Retention</div>\n <KeyRow\n label=\"Repeat customers\"\n value={num(insights.repeatCustomers)}\n hint=\"Customers who have placed more than one paid order.\"\n />\n <KeyRow\n label=\"Dormant · 60d+\"\n value={num(insights.dormantCustomers)}\n hint=\"Paying customers with no order in the last 60 days — candidates for win-back campaigns.\"\n />\n <KeyRow\n label=\"Avg orders / customer\"\n value={insights.avgOrdersPerCustomer.toFixed(1)}\n hint=\"Average number of paid orders per paying customer over their lifetime.\"\n />\n <KeyRow\n label=\"Marketing opt-in\"\n value={pct(insights.marketingOptInRate)}\n hint=\"Share of customers who consented to marketing communications.\"\n last\n />\n </div>\n </>\n )}\n </>\n }\n detail={\n <>\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n New customers · {periodPhrase(range)}\n </div>\n <GrowthChart\n data={insights.signupsSeries}\n emptyLabel=\"No new customers in the selected period\"\n />\n </div>\n <SpenderList rows={insights.topSpenders} currency={cur} />\n </>\n )}\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search name / email…\"\n filter={{\n value: type,\n onChange: setType,\n options: [\n { value: '', label: 'All types' },\n { value: 'registered', label: 'Registered' },\n { value: 'subscriber', label: 'Subscriber' },\n { value: 'lead', label: 'Lead' },\n { value: 'guest', label: 'Guest' },\n ],\n }}\n />\n {isLoading ? (\n <AdmLoading label=\"Loading customers…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No customers match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Orders</th>\n <th style={tableStyles.th}>Spent</th>\n <th style={tableStyles.th}>Last order</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((c) => (\n <tr key={c.id}>\n <td style={tableStyles.cell}>\n <div style={{ fontWeight: 600 }}>{c.name ?? '—'}</div>\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {c.email}\n </div>\n </td>\n <td style={tableStyles.cell}>\n <span style={{ textTransform: 'capitalize' }}>\n {c.type}\n </span>\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n c.status === 'active' ? 'success' : 'secondary'\n }\n >\n {c.status}\n </Badge>\n </td>\n <td style={tableStyles.cell}>{num(c.totalOrders)}</td>\n <td style={tableStyles.cell}>\n {moneyCur(c.totalSpent, currency)}\n </td>\n <td style={tableStyles.cellMuted}>\n {c.lastOrderAt\n ? new Date(c.lastOrderAt).toLocaleDateString()\n : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Products tab\n// ---------------------------------------------------------------------------\n\nconst PRODUCT_TYPE_LABELS: Record<string, string> = {\n product: 'Products',\n event: 'Events',\n booking: 'Bookings',\n subscription: 'Subscriptions',\n membership: 'Memberships',\n 'digital-file': 'Digital files',\n};\n\n/** Compact panel listing a ranked set of sellers (best / worst). */\nfunction SellerList({\n title,\n rows,\n currency,\n emptyLabel,\n}: {\n title: string;\n rows: SellerRow[];\n currency: string;\n emptyLabel: string;\n}) {\n const max = Math.max(...rows.map((r) => r.units), 1);\n return (\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">{title}</div>\n {rows.length === 0 ? (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '8px 0',\n }}\n >\n {emptyLabel}\n </div>\n ) : (\n rows.map((r) => (\n <div key={r.id} style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 12,\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span\n style={{\n fontWeight: 500,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {r.title}\n </span>\n <span\n style={{ color: 'var(--text-secondary)', whiteSpace: 'nowrap' }}\n >\n {num(r.units)} sold · {moneyCur(r.revenue, currency)}\n </span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(2, (r.units / max) * 100)}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n ))\n )}\n </div>\n );\n}\n\nfunction ProductsTab({\n id,\n currency,\n range,\n}: {\n id: string;\n currency: string;\n range: DateRange;\n}) {\n const [search, setSearch] = useState('');\n const [type, setType] = useState('');\n const { data, isLoading, isError } = useTenantProducts(id, {\n search: search || undefined,\n type: type || undefined,\n });\n const { data: insights } = useTenantProductInsights(id, {\n startDate: range.startDate,\n });\n if (isError) return <EmptyPanel>Failed to load catalog.</EmptyPanel>;\n const items: TenantProduct[] = data?.items ?? [];\n const cur = insights?.currency ?? currency;\n\n const statItems: StatItem[] = insights\n ? [\n {\n label: 'Catalog items',\n value: num(insights.totalProducts),\n hint: 'Total number of products, events, bookings and other sellable items in the catalog.',\n },\n {\n label: 'Active',\n value: num(insights.activeProducts),\n hint: 'Items currently published and available for purchase on the storefront.',\n },\n {\n label: 'Catalog value',\n value: moneyCur(insights.catalogValue, cur),\n hint: 'Combined list price of every catalog item — the total retail value on offer, not inventory on hand.',\n },\n {\n label: 'Inventory value',\n value: moneyCur(insights.inventoryValue, cur),\n hint: 'Retail value of stock currently on hand (price × quantity in stock) for trackable items.',\n },\n {\n label: 'Units sold',\n value: num(insights.totalUnitsSold),\n hint: 'Total quantity sold across paid orders in the selected period.',\n },\n {\n label: 'Avg price',\n value: moneyCur(insights.avgPrice, cur),\n hint: 'Average list price across all catalog items.',\n },\n ]\n : [\n {\n label: 'Catalog items',\n value: num(data?.stats.total ?? 0),\n hint: 'Total number of items in the catalog.',\n },\n {\n label: 'Active',\n value: num(data?.stats.active ?? 0),\n hint: 'Items currently published and available for purchase.',\n },\n {\n label: 'Featured',\n value: num(data?.stats.featured ?? 0),\n hint: 'Items flagged as featured and given prominent placement on the storefront.',\n },\n {\n label: 'Low stock',\n value: num(data?.stats.lowStock ?? 0),\n hint: 'Items at or below their low-stock threshold and at risk of selling out.',\n },\n {\n label: 'Out of stock',\n value: num(data?.stats.outOfStock ?? 0),\n hint: 'Items with zero inventory that cannot currently be purchased.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Inventory health</div>\n <KeyRow\n label=\"Featured\"\n value={num(insights.featuredProducts)}\n hint=\"Items flagged as featured for prominent storefront placement.\"\n />\n <KeyRow\n label=\"Low stock\"\n value={num(insights.lowStock)}\n hint=\"Items at or below their low-stock threshold and at risk of selling out.\"\n />\n <KeyRow\n label=\"Out of stock\"\n value={num(insights.outOfStock)}\n hint=\"Items with zero inventory that cannot currently be purchased.\"\n />\n <KeyRow\n label=\"At-risk value\"\n value={moneyCur(insights.inventoryAtRiskValue, cur)}\n hint=\"Retail value of low- and out-of-stock items — potential sales at risk from stockouts.\"\n last\n />\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Category mix</div>\n {insights.categories.length ? (\n insights.categories.map((c) => (\n <BarRow\n key={c.category}\n label={c.category}\n value={`${num(c.count)} · ${moneyCur(c.value, cur)}`}\n fraction={\n insights.catalogValue > 0\n ? c.value / insights.catalogValue\n : 0\n }\n hint={`${num(c.count)} items in ${c.category}. Bar width is this category's share of total catalog value.`}\n />\n ))\n ) : (\n <EmptyInline>No categories yet.</EmptyInline>\n )}\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Featured performance</div>\n <KeyRow\n label=\"Featured items\"\n value={num(insights.featuredProducts)}\n hint=\"Number of items currently flagged as featured.\"\n />\n <KeyRow\n label=\"Featured units sold\"\n value={num(insights.featuredSellThrough.featuredUnits)}\n hint=\"Units sold from featured items in the selected period — measures whether featuring drives sales.\"\n />\n <KeyRow\n label=\"Non-featured units\"\n value={num(insights.featuredSellThrough.nonFeaturedUnits)}\n hint=\"Units sold from items that were not featured, for comparison.\"\n last\n />\n </div>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Catalog snapshot</div>\n <KeyRow\n label=\"Catalog sold\"\n value={pct(insights.pctEverSold)}\n hint=\"Share of catalog items that have sold at least one unit, ever.\"\n />\n <KeyRow\n label=\"Never sold\"\n value={num(insights.deadStock)}\n hint=\"Items that have never recorded a sale — dead stock to review or retire.\"\n />\n <KeyRow\n label=\"Newest\"\n value={insights.newestProduct?.title ?? '—'}\n hint=\"The most recently created catalog item.\"\n />\n <KeyRow\n label=\"Last updated\"\n value={compactDate(\n insights.lastUpdatedProduct?.updatedAt ?? null,\n )}\n hint=\"When any catalog item was last edited — a signal of how actively the catalog is maintained.\"\n last\n />\n </div>\n </>\n )}\n </>\n }\n detail={\n <>\n {insights && (\n <>\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">\n Units sold · {periodPhrase(range)}\n </div>\n <GrowthChart\n data={insights.unitsSeries}\n emptyLabel=\"No sales in the selected period\"\n />\n </div>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',\n gap: 16,\n }}\n >\n <SellerList\n title=\"Best sellers\"\n rows={insights.bestSellers}\n currency={cur}\n emptyLabel=\"No paid sales yet.\"\n />\n <SellerList\n title=\"Slowest movers\"\n rows={insights.worstSellers}\n currency={cur}\n emptyLabel=\"No paid sales yet.\"\n />\n </div>\n </>\n )}\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search title…\"\n filter={{\n value: type,\n onChange: setType,\n options: [\n { value: '', label: 'All types' },\n { value: 'product', label: 'Products' },\n { value: 'event', label: 'Events' },\n { value: 'booking', label: 'Bookings' },\n { value: 'subscription', label: 'Subscriptions' },\n { value: 'membership', label: 'Memberships' },\n { value: 'digital-file', label: 'Digital files' },\n ],\n }}\n />\n\n {isLoading ? (\n <AdmLoading label=\"Loading catalog…\" />\n ) : items.length === 0 ? (\n <EmptyPanel>No catalog items match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Title</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Price</th>\n <th style={tableStyles.th}>Inventory</th>\n <th style={tableStyles.th}>Status</th>\n </tr>\n </thead>\n <tbody>\n {items.map((p) => (\n <tr key={p.id}>\n <td style={tableStyles.cell}>\n <div style={{ fontWeight: 600 }}>{p.title}</div>\n {p.category && (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {p.category}\n </div>\n )}\n </td>\n <td style={tableStyles.cellMuted}>\n {PRODUCT_TYPE_LABELS[p.type] ?? p.type}\n </td>\n <td style={tableStyles.cell}>\n {p.price != null\n ? moneyCur(p.price, p.currency ?? currency)\n : '—'}\n </td>\n <td style={tableStyles.cellMuted}>\n {p.trackInventory\n ? num((p.quantity ?? 0) - (p.reserved ?? 0))\n : '∞'}\n </td>\n <td style={tableStyles.cell}>\n <Badge variant={p.isActive ? 'success' : 'secondary'}>\n {p.isActive ? 'active' : 'inactive'}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Invoices tab\n// ---------------------------------------------------------------------------\n\nfunction InvoicesTab({ id }: { id: string }) {\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantInvoices(id, {\n search: search || undefined,\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load invoices.</EmptyPanel>;\n const rows: TenantInvoice[] = data?.invoices ?? [];\n const s = data?.stats;\n // Naira unless the listed invoices all name another currency.\n const invoiceCurrency = sharedCurrency(rows) ?? 'NGN';\n const invoiceMoney = (n: number): string => moneyCur(n, invoiceCurrency);\n\n const statItems: StatItem[] = [\n {\n label: 'Revenue',\n value: invoiceMoney(s?.totalRevenue ?? 0),\n hint: 'Total amount collected from invoices that have been paid.',\n },\n {\n label: 'Outstanding',\n value: invoiceMoney(s?.totalOutstanding ?? 0),\n hint: 'Amount still owed across sent and overdue invoices that have not been paid.',\n },\n {\n label: 'Paid',\n value: num(s?.paid ?? 0),\n hint: 'Number of invoices settled in full.',\n },\n {\n label: 'Sent',\n value: num(s?.sent ?? 0),\n hint: 'Invoices issued to customers and awaiting payment.',\n },\n {\n label: 'Overdue',\n value: num(s?.overdue ?? 0),\n hint: 'Sent invoices past their due date and still unpaid.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <>\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search invoice / customer…\"\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'draft', label: 'Draft' },\n { value: 'sent', label: 'Sent' },\n { value: 'paid', label: 'Paid' },\n { value: 'overdue', label: 'Overdue' },\n { value: 'cancelled', label: 'Cancelled' },\n ],\n }}\n />\n\n {isLoading ? (\n <AdmLoading label=\"Loading invoices…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No invoices match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Invoice</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Total</th>\n <th style={tableStyles.th}>Due</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Created</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((inv) => (\n <tr key={inv.id}>\n <td style={tableStyles.cell}>#{inv.invoiceNumber}</td>\n <td style={tableStyles.cell}>\n {inv.customerName ?? inv.customerEmail ?? '—'}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(inv.total, inv.currency)}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(inv.amountDue, inv.currency)}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n inv.status === 'paid'\n ? 'success'\n : inv.status === 'overdue'\n ? 'secondary'\n : 'info'\n }\n >\n {inv.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(inv.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loyalty tab\n// ---------------------------------------------------------------------------\n\nfunction LoyaltyTab({ id }: { id: string }) {\n const { data, isLoading, isError } = useTenantLoyalty(id);\n if (isError) return <EmptyPanel>Failed to load loyalty program.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading loyalty…\" />;\n const { program, stats } = data;\n\n const statItems: StatItem[] = [\n {\n label: 'Members',\n value: num(stats.totalMembers),\n hint: 'Total customers enrolled in the loyalty program.',\n },\n {\n label: 'Active members',\n value: num(stats.activeMembers),\n hint: 'Members who have earned or redeemed points recently.',\n },\n {\n label: 'Points issued',\n value: num(stats.totalPointsIssued),\n hint: 'All loyalty points ever awarded to members.',\n },\n {\n label: 'Points redeemed',\n value: num(stats.totalPointsRedeemed),\n hint: 'Points members have spent on rewards. The difference from issued points is the outstanding liability.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <div className=\"adm-panel\">\n <div className=\"adm-panel-title\">Program</div>\n {program ? (\n <>\n <KeyRow\n label=\"Name\"\n value={program.name}\n hint=\"The customer-facing name of the loyalty program.\"\n />\n <KeyRow\n label=\"Points unit\"\n value={program.pointsName}\n hint=\"What members' points are called (e.g. points, stars, coins).\"\n />\n <KeyRow\n label=\"Earn rate\"\n value={`${program.pointsPerCurrency} pts / unit`}\n hint=\"How many points a member earns per unit of currency spent.\"\n />\n <KeyRow\n label=\"Redeem rate\"\n value={`${program.currencyPerPoint} / pt`}\n hint=\"How much each point is worth when redeemed against a purchase.\"\n />\n <KeyRow\n label=\"Status\"\n value={program.isActive ? 'active' : 'inactive'}\n hint=\"Whether the program is currently running and accruing points.\"\n last\n />\n </>\n ) : (\n <EmptyInline>\n No loyalty program configured for this tenant.\n </EmptyInline>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Discounts tab\n// ---------------------------------------------------------------------------\n\nfunction DiscountsTab({ id }: { id: string }) {\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantDiscounts(id, {\n search: search || undefined,\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load discounts.</EmptyPanel>;\n const rows: TenantDiscount[] = data?.discounts ?? [];\n return (\n <>\n <PanelToolbar\n search={search}\n onSearch={setSearch}\n searchPlaceholder=\"Search code / name…\"\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'scheduled', label: 'Scheduled' },\n { value: 'expired', label: 'Expired' },\n { value: 'disabled', label: 'Disabled' },\n ],\n }}\n />\n {isLoading ? (\n <AdmLoading label=\"Loading discounts…\" />\n ) : rows.length === 0 ? (\n <EmptyPanel>No discounts match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Code</th>\n <th style={tableStyles.th}>Name</th>\n <th style={tableStyles.th}>Value</th>\n <th style={tableStyles.th}>Usage</th>\n <th style={tableStyles.th}>Status</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((d) => (\n <tr key={d.id}>\n <td style={tableStyles.cell}>{d.code}</td>\n <td style={tableStyles.cell}>{d.name}</td>\n <td style={tableStyles.cell}>\n {d.discountType === 'percentage'\n ? `${d.value}%`\n : moneyCur(d.value, 'NGN')}\n </td>\n <td style={tableStyles.cellMuted}>\n {num(d.usageCount)}\n {d.usageLimit ? ` / ${num(d.usageLimit)}` : ''}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n d.isExpired\n ? 'secondary'\n : d.isValid\n ? 'success'\n : 'info'\n }\n >\n {d.status}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Settlements tab\n// ---------------------------------------------------------------------------\n\nfunction SettlementsTab({ id, range }: { id: string; range: DateRange }) {\n const { data, isLoading, isError } = useTenantSettlements(id, {\n limit: 25,\n startDate: range.startDate,\n endDate: range.endDate,\n });\n if (isError) return <EmptyPanel>Failed to load settlements.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading settlements…\" />;\n const sum = data.summary;\n const cur = sum.currency || 'NGN';\n const banks: TenantBankAccount[] = data.bankAccounts ?? [];\n const rows: TenantSettlement[] = data.settlements ?? [];\n\n const statItems: StatItem[] = [\n {\n label: 'Settled',\n value: moneyCur(sum.totalSettled, cur),\n hint: 'Total amount successfully paid out to the tenant’s bank account in this window.',\n },\n {\n label: 'Pending',\n value: moneyCur(sum.totalPending, cur),\n hint: 'Payouts initiated but not yet confirmed as deposited.',\n },\n {\n label: 'Failed',\n value: moneyCur(sum.totalFailed, cur),\n hint: 'Payouts that could not be completed — usually a bank or account issue to investigate.',\n },\n {\n label: 'Platform fees',\n value: moneyCur(sum.platformFeesCollected, cur),\n hint: 'Fees Box retained from this tenant’s settlements over the window.',\n },\n {\n label: 'Payouts',\n value: num(sum.count),\n hint: 'Number of settlement payouts in this window.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={\n <>\n <StatsListPanel items={statItems} />\n </>\n }\n detail={\n <div>\n <SubaccountsPanel banks={banks} />\n <div className=\"adm-panel-title\" style={{ marginBottom: 12 }}>\n Settlements\n </div>\n {rows.length === 0 ? (\n <EmptyPanel>No settlements yet for this tenant.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Gross</th>\n <th style={tableStyles.th}>Fees</th>\n <th style={tableStyles.th}>Net</th>\n <th style={tableStyles.th}>Destination</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Settled</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((st) => (\n <tr key={st.id}>\n <td style={tableStyles.cell}>\n {moneyCur(st.grossAmount, st.currency)}\n </td>\n <td style={tableStyles.cellMuted}>\n {moneyCur(st.paystackFee + st.platformFee, st.currency)}\n </td>\n <td style={tableStyles.cell}>\n {moneyCur(st.netAmount, st.currency)}\n </td>\n <td style={tableStyles.cell}>\n {st.bankAccount\n ? `${st.bankAccount.bankName} ••••${st.bankAccount.accountNumber.slice(-4)}`\n : '—'}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n st.status === 'completed' || st.status === 'success'\n ? 'success'\n : st.status === 'failed'\n ? 'secondary'\n : 'info'\n }\n >\n {st.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {st.settledAt\n ? new Date(st.settledAt).toLocaleDateString()\n : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Subscriptions tab — recurring plans this tenant sells to its customers\n// ---------------------------------------------------------------------------\n\nfunction subStatusVariant(\n status: string,\n): 'success' | 'info' | 'warning' | 'secondary' {\n switch (status) {\n case 'active':\n return 'success';\n case 'non_renewing':\n return 'info';\n case 'attention':\n return 'warning';\n default:\n return 'secondary';\n }\n}\n\nfunction subStatusLabel(status: string): string {\n return status === 'non_renewing' ? 'non-renewing' : status;\n}\n\nfunction SubscriptionsTab({ id }: { id: string }) {\n const [status, setStatus] = useState('');\n const { data, isLoading, isError } = useTenantSubscriptions(id, {\n status: status || undefined,\n limit: 50,\n });\n if (isError) return <EmptyPanel>Failed to load subscriptions.</EmptyPanel>;\n if (isLoading || !data) return <AdmLoading label=\"Loading subscriptions…\" />;\n\n const stats = data.stats;\n const rows: TenantSubscription[] = data.subscriptions ?? [];\n const mrrCurrency = rows[0]?.currency || 'NGN';\n\n const statItems: StatItem[] = [\n {\n label: 'Active',\n value: num(stats.totalActive),\n hint: 'Subscriptions currently active and billing on schedule.',\n },\n {\n label: 'Non-renewing',\n value: num(stats.totalNonRenewing),\n hint: 'Active subscriptions set to end at the current period — they will not renew.',\n },\n {\n label: 'Cancelled',\n value: num(stats.totalCancelled),\n hint: 'Subscriptions that have been cancelled or have completed their term.',\n },\n {\n label: 'MRR',\n value: moneyCur(stats.monthlyRecurringRevenue, mrrCurrency),\n hint: 'Monthly recurring revenue — active subscription amounts normalised to a monthly value.',\n },\n ];\n\n return (\n <SubDataLayout\n summary={<StatsListPanel items={statItems} />}\n detail={\n <div>\n <PanelToolbar\n filter={{\n value: status,\n onChange: setStatus,\n options: [\n { value: '', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'non_renewing', label: 'Non-renewing' },\n { value: 'attention', label: 'Attention' },\n { value: 'cancelled', label: 'Cancelled' },\n { value: 'completed', label: 'Completed' },\n ],\n }}\n />\n {rows.length === 0 ? (\n <EmptyPanel>No subscriptions match this view.</EmptyPanel>\n ) : (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Plan</th>\n <th style={tableStyles.th}>Amount</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Next payment</th>\n <th style={tableStyles.th}>Payments</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((s) => (\n <tr key={s.id}>\n <td style={tableStyles.cell}>\n {s.customer?.name || s.customerEmail}\n </td>\n <td style={tableStyles.cell}>{s.plan?.name ?? '—'}</td>\n <td style={tableStyles.cell}>\n {moneyCur(s.amount, s.currency)}\n {s.plan?.interval ? (\n <span\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 12,\n }}\n >\n {' '}\n / {s.plan.interval}\n </span>\n ) : null}\n </td>\n <td style={tableStyles.cell}>\n <Badge variant={subStatusVariant(s.status)}>\n {subStatusLabel(s.status)}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {compactDate(s.nextPaymentDate ?? s.currentPeriodEnd)}\n </td>\n <td style={tableStyles.cellMuted}>\n {num(s.paymentsCount)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// shared sub-components\n// ---------------------------------------------------------------------------\n\nfunction SearchInput({\n value,\n onChange,\n placeholder,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n}) {\n return (\n <FilterSearch value={value} onChange={onChange} placeholder={placeholder} />\n );\n}\n\nfunction FilterSelect({\n value,\n onChange,\n options,\n}: {\n value: string;\n onChange: (v: string) => void;\n options: Array<{ value: string; label: string }>;\n}) {\n return (\n <AdmFilterSelect\n label=\"Filter\"\n value={value}\n onChange={onChange}\n options={options}\n />\n );\n}\n\nfunction PanelToolbar({\n title,\n search,\n onSearch,\n searchPlaceholder,\n filter,\n}: {\n title?: string;\n search?: string;\n onSearch?: (v: string) => void;\n searchPlaceholder?: string;\n filter?: {\n value: string;\n onChange: (v: string) => void;\n options: Array<{ value: string; label: string }>;\n };\n}) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 12,\n flexWrap: 'wrap',\n }}\n >\n {title ? (\n <>\n <div className=\"adm-panel-title\" style={{ margin: 0 }}>\n {title}\n </div>\n <Filters label=\"Filter\">\n {onSearch && (\n <SearchInput\n value={search ?? ''}\n onChange={onSearch}\n placeholder={searchPlaceholder}\n />\n )}\n {filter && (\n <FilterSelect\n value={filter.value}\n onChange={filter.onChange}\n options={filter.options}\n />\n )}\n </Filters>\n </>\n ) : (\n <Filters label=\"Filter\">\n {onSearch && (\n <SearchInput\n value={search ?? ''}\n onChange={onSearch}\n placeholder={searchPlaceholder}\n />\n )}\n {filter && (\n <FilterSelect\n value={filter.value}\n onChange={filter.onChange}\n options={filter.options}\n />\n )}\n </Filters>\n )}\n </div>\n );\n}\n\nfunction KeyRow({\n label,\n value,\n hint,\n last,\n}: {\n label: string;\n value: string;\n hint?: string;\n last?: boolean;\n}) {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n gap: 16,\n padding: '10px 0',\n borderBottom: last ? 'none' : '1px solid var(--border-subtle)',\n }}\n >\n <span\n style={{\n color: 'var(--text-secondary)',\n fontSize: 13.5,\n flexShrink: 0,\n }}\n >\n <HintLabel label={label} hint={hint} />\n </span>\n <span\n style={{\n fontWeight: 600,\n fontSize: 14,\n textAlign: 'right',\n minWidth: 0,\n }}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction BarRow({\n label,\n value,\n fraction,\n hint,\n}: {\n label: string;\n value: string;\n fraction: number;\n hint?: string;\n}) {\n const w = Math.max(0, Math.min(1, fraction)) * 100;\n return (\n <div style={{ padding: '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span style={{ textTransform: 'capitalize' }}>\n <HintLabel label={label} hint={hint} />\n </span>\n <span style={{ color: 'var(--text-secondary)' }}>{value}</span>\n </div>\n <div\n style={{\n height: 6,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${w}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction FunnelBar({\n label,\n value,\n max,\n rate,\n hint,\n last,\n}: {\n label: string;\n value: number;\n max: number;\n rate?: number;\n hint?: string;\n last?: boolean;\n}) {\n const w = max > 0 ? Math.max(2, (value / max) * 100) : 0;\n return (\n <div style={{ padding: last ? '9px 0 0' : '9px 0' }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: 13,\n marginBottom: 6,\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center' }}>\n <HintLabel label={label} hint={hint} />\n </span>\n <span style={{ color: 'var(--text-secondary)' }}>\n {num(value)}\n {rate !== undefined ? ` · ${pct(rate)}` : ''}\n </span>\n </div>\n <div\n style={{\n height: 8,\n borderRadius: 4,\n background: 'var(--border-subtle)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${w}%`,\n height: '100%',\n borderRadius: 4,\n background: 'var(--accent-primary)',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel({ children }: { children: ReactNode }) {\n return (\n <div\n className=\"adm-panel\"\n style={{ color: 'var(--text-tertiary)', fontSize: 13 }}\n >\n {children}\n </div>\n );\n}\n\nfunction EmptyInline({ children }: { children: ReactNode }) {\n return (\n <div\n style={{\n color: 'var(--text-tertiary)',\n fontSize: 13,\n padding: '24px 0',\n textAlign: 'center',\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction ActivityTable({\n orders,\n isLoading,\n empty = 'No orders yet for this tenant.',\n}: {\n orders?: TenantActivityOrder[];\n isLoading?: boolean;\n empty?: string;\n}) {\n if (isLoading) {\n return <AdmLoading label=\"Loading activity…\" />;\n }\n if (!orders || orders.length === 0) {\n return <EmptyPanel>{empty}</EmptyPanel>;\n }\n return (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Order</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Total</th>\n <th style={tableStyles.th}>Payment</th>\n <th style={tableStyles.th}>Paid by</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Date</th>\n </tr>\n </thead>\n <tbody>\n {orders.map((o) => (\n <tr key={o.id}>\n <td style={tableStyles.cell}>#{o.orderNumber}</td>\n <td style={tableStyles.cell}>\n {o.customerName ?? o.customerEmail}\n {o.customerName ? (\n <div style={{ fontSize: 12, color: 'var(--text-tertiary)' }}>\n {[o.customerEmail, o.customerPhone]\n .filter(Boolean)\n .join(' · ')}\n </div>\n ) : null}\n </td>\n <td style={tableStyles.cell}>{moneyCur(o.total, o.currency)}</td>\n <td style={tableStyles.cell}>\n <Badge\n variant={o.paymentStatus === 'paid' ? 'success' : 'secondary'}\n >\n {o.paymentStatus}\n </Badge>\n </td>\n <td style={tableStyles.cell}>\n {o.paymentMethod ?? (\n <span style={{ color: 'var(--text-tertiary)' }}>Not recorded</span>\n )}\n </td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n o.status === 'cancelled' || o.status === 'refunded'\n ? 'secondary'\n : 'info'\n }\n >\n {o.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(o.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction TransactionsTable({ rows }: { rows?: Transaction[] }) {\n if (!rows || rows.length === 0) {\n return <EmptyPanel>No transactions yet for this tenant.</EmptyPanel>;\n }\n return (\n <div className=\"adm-table-card\">\n <table style={tableStyles.table}>\n <thead>\n <tr style={tableStyles.headRow}>\n <th style={tableStyles.th}>Reference</th>\n <th style={tableStyles.th}>Type</th>\n <th style={tableStyles.th}>Customer</th>\n <th style={tableStyles.th}>Amount</th>\n <th style={tableStyles.th}>Status</th>\n <th style={tableStyles.th}>Date</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((t) => (\n <tr key={t.id}>\n <td style={tableStyles.cell}>{t.reference}</td>\n <td style={tableStyles.cell}>\n <span style={{ textTransform: 'capitalize' }}>{t.type}</span>\n </td>\n <td style={tableStyles.cell}>\n {t.customer?.name ?? t.customer?.email ?? '—'}\n </td>\n <td style={tableStyles.cell}>{moneyCur(t.amount, t.currency)}</td>\n <td style={tableStyles.cell}>\n <Badge\n variant={\n t.status === 'success'\n ? 'success'\n : t.status === 'failed' ||\n t.status === 'refunded' ||\n t.status === 'partially_refunded'\n ? 'secondary'\n : 'info'\n }\n >\n {t.status}\n </Badge>\n </td>\n <td style={tableStyles.cellMuted}>\n {new Date(t.createdAt).toLocaleDateString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|