@withpotter/pages-admin 0.13.0-next.124 → 0.13.0-next.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/_money/cash-postings.js +3 -20
- package/dist/admin/_money/cash-postings.js.map +1 -1
- package/dist/admin/_money/cash.module.css +0 -10
- package/dist/admin/_money/finder-format.js +0 -1
- package/dist/admin/_money/finder-format.js.map +1 -1
- package/dist/admin/_money/format.js +0 -1
- package/dist/admin/_money/format.js.map +1 -1
- package/dist/admin/_overview/activation-panel.js +6 -6
- package/dist/admin/_overview/activation-panel.js.map +1 -1
- package/dist/admin/_overview/attention-groups.js +8 -8
- package/dist/admin/_overview/attention-groups.js.map +1 -1
- package/dist/admin/_overview/attention-panel.js +33 -37
- package/dist/admin/_overview/attention-panel.js.map +1 -1
- package/dist/admin/_overview/attention.module.css +3 -0
- package/dist/admin/_overview/control-room.js +13 -41
- package/dist/admin/_overview/control-room.js.map +1 -1
- package/dist/admin/_overview/kpi-row.js +7 -7
- package/dist/admin/_overview/kpi-row.js.map +1 -1
- package/dist/admin/_overview/leaders-panel.js +1 -1
- package/dist/admin/_overview/leaders-panel.js.map +1 -1
- package/dist/admin/_overview/overdue-outstanding.js +1 -2
- package/dist/admin/_overview/overdue-outstanding.js.map +1 -1
- package/dist/admin/_overview/portfolio-panel.js +5 -5
- package/dist/admin/_overview/portfolio-panel.js.map +1 -1
- package/dist/admin/_overview/position-panel.js +12 -8
- package/dist/admin/_overview/position-panel.js.map +1 -1
- package/dist/admin/_pos/pos-figures.js +5 -18
- package/dist/admin/_pos/pos-figures.js.map +1 -1
- package/dist/admin/_pos/pos-rules.js +0 -2
- package/dist/admin/_pos/pos-rules.js.map +1 -1
- package/dist/admin/_pos/pos-words.js +1 -6
- package/dist/admin/_pos/pos-words.js.map +1 -1
- package/dist/admin/_pos/use-pos.js +1 -70
- package/dist/admin/_pos/use-pos.js.map +1 -1
- package/dist/admin/_shell/nav-config.js +3 -3
- package/dist/admin/_shell/nav-config.js.map +1 -1
- package/dist/admin/_shell/nav-filter.js +2 -4
- package/dist/admin/_shell/nav-filter.js.map +1 -1
- package/dist/admin/_shell/nav-row.js +2 -5
- package/dist/admin/_shell/nav-row.js.map +1 -1
- package/dist/admin/_shell/sidebar-footer.js +0 -20
- package/dist/admin/_shell/sidebar-footer.js.map +1 -1
- package/dist/admin/_shell/sidebar-footer.module.css +0 -17
- package/dist/admin/_shell/sidebar.js +15 -25
- package/dist/admin/_shell/sidebar.js.map +1 -1
- package/dist/admin/_shell/sidebar.module.css +0 -69
- package/dist/admin/_shell/use-fluid-hover.js +6 -37
- package/dist/admin/_shell/use-fluid-hover.js.map +1 -1
- package/dist/admin/_ui/admin.css +0 -7
- package/dist/admin/_ui/data-table.js +1 -1
- package/dist/admin/_ui/data-table.js.map +1 -1
- package/dist/admin/_ui/list-card.js +1 -1
- package/dist/admin/_ui/list-card.js.map +1 -1
- package/dist/admin/_ui/list-card.module.css +16 -2
- package/dist/admin/_ui/money-view.js +0 -1
- package/dist/admin/_ui/money-view.js.map +1 -1
- package/dist/admin/_ui/page-header.js +4 -31
- package/dist/admin/_ui/page-header.js.map +1 -1
- package/dist/admin/_ui/panel.module.css +10 -0
- package/dist/admin/_ui/stat-card.js +2 -11
- package/dist/admin/_ui/stat-card.js.map +1 -1
- package/dist/admin/_ui/trend.js +2 -2
- package/dist/admin/_ui/trend.js.map +1 -1
- package/dist/admin/accounts/account-panel.js +6 -49
- package/dist/admin/accounts/account-panel.js.map +1 -1
- package/dist/admin/accounts/account-panel.module.css +0 -73
- package/dist/admin/accounts/account-row.js +2 -11
- package/dist/admin/accounts/account-row.js.map +1 -1
- package/dist/admin/accounts/account-vitals.js +13 -15
- package/dist/admin/accounts/account-vitals.js.map +1 -1
- package/dist/admin/accounts/accounts-table.js +8 -39
- package/dist/admin/accounts/accounts-table.js.map +1 -1
- package/dist/admin/accounts/accounts-workspace.js +2 -2
- package/dist/admin/accounts/accounts-workspace.js.map +1 -1
- package/dist/admin/accounts/owner-session.js +6 -0
- package/dist/admin/accounts/owner-session.js.map +1 -1
- package/dist/admin/accounts/rows.module.css +0 -17
- package/dist/admin/audit/status-pill.js +0 -6
- package/dist/admin/audit/status-pill.js.map +1 -1
- package/dist/admin/audit/status-pill.module.css +0 -4
- package/dist/admin/commerce/commerce-overview.js +2 -2
- package/dist/admin/commerce/commerce-overview.js.map +1 -1
- package/dist/admin/commerce/merchant-meta.js +0 -1
- package/dist/admin/commerce/merchant-meta.js.map +1 -1
- package/dist/admin/commerce/merchant-view.js +2 -2
- package/dist/admin/commerce/merchant-view.js.map +1 -1
- package/dist/admin/feedback/prompt-operations.module.css +2 -0
- package/dist/admin/feedback/prompt-preview.module.css +2 -0
- package/dist/admin/hooks.js +1 -57
- package/dist/admin/hooks.js.map +1 -1
- package/dist/admin/layout.js +2 -8
- package/dist/admin/layout.js.map +1 -1
- package/dist/admin/page.js +8 -28
- package/dist/admin/page.js.map +1 -1
- package/dist/admin/payout-tiers/_tier-dialog.js +21 -31
- package/dist/admin/payout-tiers/_tier-dialog.js.map +1 -1
- package/dist/admin/payout-tiers/tier-preview-result.js +9 -10
- package/dist/admin/payout-tiers/tier-preview-result.js.map +1 -1
- package/dist/admin/payout-tiers/tiers-table.js +7 -6
- package/dist/admin/payout-tiers/tiers-table.js.map +1 -1
- package/dist/admin/payout-tiers/tiers-workspace.js +2 -2
- package/dist/admin/payout-tiers/tiers-workspace.js.map +1 -1
- package/dist/admin/pos/pos-workspace.js +2 -6
- package/dist/admin/pos/pos-workspace.js.map +1 -1
- package/dist/admin/pos/shifts-tab.js +9 -16
- package/dist/admin/pos/shifts-tab.js.map +1 -1
- package/dist/admin/revenue/cohort-panel.js +6 -6
- package/dist/admin/revenue/cohort-panel.js.map +1 -1
- package/dist/admin/revenue/health-panel.js +21 -22
- package/dist/admin/revenue/health-panel.js.map +1 -1
- package/dist/admin/revenue/plan-mix-panel.js +3 -3
- package/dist/admin/revenue/plan-mix-panel.js.map +1 -1
- package/dist/admin/revenue/quality-panel.js +19 -19
- package/dist/admin/revenue/quality-panel.js.map +1 -1
- package/dist/admin/revenue/revenue-kpis.js +50 -111
- package/dist/admin/revenue/revenue-kpis.js.map +1 -1
- package/dist/admin/revenue/revenue-overview.js +46 -39
- package/dist/admin/revenue/revenue-overview.js.map +1 -1
- package/dist/admin/revenue/revenue-retention.js +13 -17
- package/dist/admin/revenue/revenue-retention.js.map +1 -1
- package/dist/admin/revenue/revenue-workspace.js +6 -53
- package/dist/admin/revenue/revenue-workspace.js.map +1 -1
- package/dist/admin/revenue/subscriptions-panel.js +14 -14
- package/dist/admin/revenue/subscriptions-panel.js.map +1 -1
- package/dist/admin/revenue/top-tenants-panel.js +4 -4
- package/dist/admin/revenue/top-tenants-panel.js.map +1 -1
- package/dist/admin/settings/account-tab.js +25 -1
- package/dist/admin/settings/account-tab.js.map +1 -1
- package/dist/admin/settings/general-tab.js +2 -2
- package/dist/admin/settings/general-tab.js.map +1 -1
- package/dist/admin/settings/system-status-card.js +30 -0
- package/dist/admin/settings/system-status-card.js.map +1 -0
- package/dist/admin/support/queue-card.module.css +4 -1
- package/dist/admin/tenants/[id]/commerce/format.js +1 -2
- package/dist/admin/tenants/[id]/commerce/format.js.map +1 -1
- package/dist/admin/tenants/[id]/commerce/recent-orders.js +1 -1
- package/dist/admin/tenants/[id]/commerce/recent-orders.js.map +1 -1
- package/dist/admin/tenants/[id]/page.js +10 -37
- package/dist/admin/tenants/[id]/page.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-layout.module.css +4 -1
- package/dist/admin/tenants/[id]/tenant-overview.js +2 -3
- package/dist/admin/tenants/[id]/tenant-overview.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-overview.module.css +1 -1
- package/dist/admin/tenants/[id]/tenant-pos.js +16 -64
- package/dist/admin/tenants/[id]/tenant-pos.js.map +1 -1
- package/dist/admin/tenants/[id]/tenant-wallet-card.js +2 -3
- package/dist/admin/tenants/[id]/tenant-wallet-card.js.map +1 -1
- package/dist/admin/tenants/[id]/verification/document-viewer.js +52 -3
- package/dist/admin/tenants/[id]/verification/document-viewer.js.map +1 -1
- package/dist/admin/tenants/[id]/verification/document-viewer.module.css +0 -51
- package/dist/admin/tenants/[id]/verification/tenant-verification.js +0 -10
- package/dist/admin/tenants/[id]/verification/tenant-verification.js.map +1 -1
- package/dist/admin/tenants/tenant-list-row.js +1 -2
- package/dist/admin/tenants/tenant-list-row.js.map +1 -1
- package/dist/admin/tenants/tenants-table.js +2 -3
- package/dist/admin/tenants/tenants-table.js.map +1 -1
- package/dist/admin/tenants/tenants-workspace.js +2 -2
- package/dist/admin/tenants/tenants-workspace.js.map +1 -1
- package/dist/admin/verification/verification-page.js +3 -19
- package/dist/admin/verification/verification-page.js.map +1 -1
- package/dist/admin/verification/verification.module.css +0 -10
- package/dist/admin/verification/waiting-case-actions.js +68 -0
- package/dist/admin/verification/waiting-case-actions.js.map +1 -0
- package/dist/admin/verification/waiting-cases.js +48 -66
- package/dist/admin/verification/waiting-cases.js.map +1 -1
- package/package.json +5 -5
- package/dist/admin/_pos/olive-balance.js +0 -40
- package/dist/admin/_pos/olive-balance.js.map +0 -1
- package/dist/admin/_pos/olive-state.js +0 -23
- package/dist/admin/_pos/olive-state.js.map +0 -1
- package/dist/admin/_pos/payments-model.js +0 -55
- package/dist/admin/_pos/payments-model.js.map +0 -1
- package/dist/admin/_pos/tenant-operators.js +0 -63
- package/dist/admin/_pos/tenant-operators.js.map +0 -1
- package/dist/admin/_pos/tenant-outlets.js +0 -77
- package/dist/admin/_pos/tenant-outlets.js.map +0 -1
- package/dist/admin/_pos/tenant-pos-figures.js +0 -82
- package/dist/admin/_pos/tenant-pos-figures.js.map +0 -1
- package/dist/admin/_pos/tenant-requests.js +0 -64
- package/dist/admin/_pos/tenant-requests.js.map +0 -1
- package/dist/admin/_pos/tenant-transactions.js +0 -145
- package/dist/admin/_pos/tenant-transactions.js.map +0 -1
- package/dist/admin/_shell/nav-fold.js +0 -14
- package/dist/admin/_shell/nav-fold.js.map +0 -1
- package/dist/admin/_shell/nav-group.js +0 -78
- package/dist/admin/_shell/nav-group.js.map +0 -1
- package/dist/admin/_shell/use-open-groups.js +0 -64
- package/dist/admin/_shell/use-open-groups.js.map +0 -1
- package/dist/admin/_ui/page-header.module.css +0 -45
- package/dist/admin/accounts/account-sessions.js +0 -70
- package/dist/admin/accounts/account-sessions.js.map +0 -1
- package/dist/admin/accounts/account-sessions.module.css +0 -55
- package/dist/admin/accounts/account-stage-filter.js +0 -29
- package/dist/admin/accounts/account-stage-filter.js.map +0 -1
- package/dist/admin/accounts/account-stage.js +0 -81
- package/dist/admin/accounts/account-stage.js.map +0 -1
- package/dist/admin/accounts/hint.js +0 -12
- package/dist/admin/accounts/hint.js.map +0 -1
- package/dist/admin/payout-tiers/requirement-labels.js +0 -70
- package/dist/admin/payout-tiers/requirement-labels.js.map +0 -1
- package/dist/admin/pos/transactions-tab.js +0 -214
- package/dist/admin/pos/transactions-tab.js.map +0 -1
- package/dist/admin/revenue/channel-panel.js +0 -49
- package/dist/admin/revenue/channel-panel.js.map +0 -1
- package/dist/admin/revenue/channel-rows.js +0 -17
- package/dist/admin/revenue/channel-rows.js.map +0 -1
- package/dist/admin/revenue/download-button.js +0 -40
- package/dist/admin/revenue/download-button.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-colors.js +0 -25
- package/dist/admin/revenue/earnings/earnings-colors.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-legend.js +0 -75
- package/dist/admin/revenue/earnings/earnings-legend.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-summary.js +0 -308
- package/dist/admin/revenue/earnings/earnings-summary.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings-table.js +0 -143
- package/dist/admin/revenue/earnings/earnings-table.js.map +0 -1
- package/dist/admin/revenue/earnings/earnings.module.css +0 -201
- package/dist/admin/revenue/earnings/use-earnings.js +0 -27
- package/dist/admin/revenue/earnings/use-earnings.js.map +0 -1
- package/dist/admin/revenue/ledger-model.js +0 -104
- package/dist/admin/revenue/ledger-model.js.map +0 -1
- package/dist/admin/revenue/ledger.module.css +0 -144
- package/dist/admin/revenue/merchant-headline.js +0 -37
- package/dist/admin/revenue/merchant-headline.js.map +0 -1
- package/dist/admin/revenue/merchant-payments-view.js +0 -234
- package/dist/admin/revenue/merchant-payments-view.js.map +0 -1
- package/dist/admin/revenue/method-cards.js +0 -40
- package/dist/admin/revenue/method-cards.js.map +0 -1
- package/dist/admin/revenue/payment-drawer.js +0 -53
- package/dist/admin/revenue/payment-drawer.js.map +0 -1
- package/dist/admin/revenue/plan-lines.js +0 -36
- package/dist/admin/revenue/plan-lines.js.map +0 -1
- package/dist/admin/revenue/plan-payment-drawer.js +0 -42
- package/dist/admin/revenue/plan-payment-drawer.js.map +0 -1
- package/dist/admin/revenue/plans-panel.js +0 -48
- package/dist/admin/revenue/plans-panel.js.map +0 -1
- package/dist/admin/revenue/platform-fees.js +0 -9
- package/dist/admin/revenue/platform-fees.js.map +0 -1
- package/dist/admin/revenue/print-summary-button.js +0 -27
- package/dist/admin/revenue/print-summary-button.js.map +0 -1
- package/dist/admin/revenue/subscriptions-view.js +0 -213
- package/dist/admin/revenue/subscriptions-view.js.map +0 -1
- package/dist/admin/revenue/summary-download.js +0 -38
- package/dist/admin/revenue/summary-download.js.map +0 -1
- package/dist/admin/revenue/summary-print.js +0 -82
- package/dist/admin/revenue/summary-print.js.map +0 -1
- package/dist/admin/revenue/summary-rows.js +0 -44
- package/dist/admin/revenue/summary-rows.js.map +0 -1
- package/dist/admin/revenue/url-filters.js +0 -36
- package/dist/admin/revenue/url-filters.js.map +0 -1
- package/dist/admin/revenue/use-url-filters.js +0 -24
- package/dist/admin/revenue/use-url-filters.js.map +0 -1
- package/dist/admin/tenants/[id]/use-tenant-wallet.js +0 -23
- package/dist/admin/tenants/[id]/use-tenant-wallet.js.map +0 -1
- package/dist/admin/tenants/[id]/verification/document-file.js +0 -78
- package/dist/admin/tenants/[id]/verification/document-file.js.map +0 -1
- package/dist/admin/tenants/[id]/verification/sent-files.js +0 -33
- package/dist/admin/tenants/[id]/verification/sent-files.js.map +0 -1
- package/dist/admin/verification/preview-dialog.js +0 -111
- package/dist/admin/verification/preview-dialog.js.map +0 -1
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/* The page description as an info icon with a popover. */
|
|
2
|
-
.info {
|
|
3
|
-
display: inline-flex;
|
|
4
|
-
flex-shrink: 0;
|
|
5
|
-
margin: 0;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.trigger {
|
|
9
|
-
display: inline-flex;
|
|
10
|
-
align-items: center;
|
|
11
|
-
justify-content: center;
|
|
12
|
-
width: 24px;
|
|
13
|
-
height: 24px;
|
|
14
|
-
padding: 0;
|
|
15
|
-
border: 0;
|
|
16
|
-
border-radius: 6px;
|
|
17
|
-
background: transparent;
|
|
18
|
-
color: var(--text-tertiary);
|
|
19
|
-
cursor: pointer;
|
|
20
|
-
transition: background var(--adm-fast);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.trigger:hover,
|
|
24
|
-
.trigger[data-state='open'] {
|
|
25
|
-
background: var(--adm-hover);
|
|
26
|
-
color: var(--text-primary);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.trigger:focus-visible {
|
|
30
|
-
outline: 2px solid var(--accent-primary);
|
|
31
|
-
outline-offset: 2px;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.popover {
|
|
35
|
-
z-index: 70;
|
|
36
|
-
width: min(320px, calc(100vw - 32px));
|
|
37
|
-
padding: 12px;
|
|
38
|
-
border: 1px solid var(--border-subtle);
|
|
39
|
-
border-radius: var(--adm-card-radius);
|
|
40
|
-
background: var(--bg-base);
|
|
41
|
-
box-shadow: var(--adm-shadow-pop);
|
|
42
|
-
font-size: 13px;
|
|
43
|
-
line-height: 20px;
|
|
44
|
-
color: var(--text-secondary);
|
|
45
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { Button, EmptyNote } from "@withpotter/ui-kit";
|
|
5
|
-
import { AdmLoading } from "../_ui";
|
|
6
|
-
import { useAccountSessions } from "../hooks";
|
|
7
|
-
import { relativeTime, seenWithin } from "./relative-time";
|
|
8
|
-
import styles from "./account-sessions.module.css";
|
|
9
|
-
const ENDED = {
|
|
10
|
-
active: "Signed in",
|
|
11
|
-
revoked: "Signed out",
|
|
12
|
-
expired: "Expired"
|
|
13
|
-
};
|
|
14
|
-
const IN_USE_SECONDS = 300;
|
|
15
|
-
const inUse = (s) => s.endedHow === "active" && seenWithin(s.lastSeenAt, IN_USE_SECONDS);
|
|
16
|
-
const stateOf = (s) => inUse(s) ? "Active now" : ENDED[s.endedHow];
|
|
17
|
-
const when = (iso) => iso ? new Date(iso).toLocaleString(void 0, {
|
|
18
|
-
dateStyle: "medium",
|
|
19
|
-
timeStyle: "short"
|
|
20
|
-
}) : null;
|
|
21
|
-
const FIRST_PAGE = 5;
|
|
22
|
-
const NEXT_PAGE = 10;
|
|
23
|
-
function deviceOf(s) {
|
|
24
|
-
return s.name || s.kind || s.userAgent || "Unknown device";
|
|
25
|
-
}
|
|
26
|
-
function AccountSessions({ accountId }) {
|
|
27
|
-
const { data, isLoading, isError, refetch } = useAccountSessions(accountId);
|
|
28
|
-
const [shown, setShown] = useState(FIRST_PAGE);
|
|
29
|
-
if (isLoading) return /* @__PURE__ */ jsx(AdmLoading, { label: "Loading sessions\u2026", size: "sm" });
|
|
30
|
-
if (isError) {
|
|
31
|
-
return /* @__PURE__ */ jsxs(EmptyNote, { children: [
|
|
32
|
-
"We could not load their sessions just now.",
|
|
33
|
-
" ",
|
|
34
|
-
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => void refetch(), children: "Try again" })
|
|
35
|
-
] });
|
|
36
|
-
}
|
|
37
|
-
if (!data?.length) {
|
|
38
|
-
return /* @__PURE__ */ jsx(EmptyNote, { children: "No sign-ins recorded for this person yet." });
|
|
39
|
-
}
|
|
40
|
-
const ordered = [...data].sort(
|
|
41
|
-
(a, b) => b.startedAt.localeCompare(a.startedAt)
|
|
42
|
-
);
|
|
43
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
44
|
-
/* @__PURE__ */ jsx("ul", { className: styles.list, children: ordered.slice(0, shown).map((s) => /* @__PURE__ */ jsxs("li", { className: styles.item, children: [
|
|
45
|
-
/* @__PURE__ */ jsxs("span", { className: styles.top, children: [
|
|
46
|
-
/* @__PURE__ */ jsx("span", { className: styles.device, title: s.userAgent ?? void 0, children: deviceOf(s) }),
|
|
47
|
-
/* @__PURE__ */ jsx("span", { className: styles.how, "data-live": inUse(s), children: stateOf(s) })
|
|
48
|
-
] }),
|
|
49
|
-
/* @__PURE__ */ jsx("span", { className: styles.meta, children: [s.ipAddress, s.location].filter(Boolean).join(" \xB7 ") || "No address recorded" }),
|
|
50
|
-
/* @__PURE__ */ jsxs("span", { className: styles.meta, children: [
|
|
51
|
-
"Started ",
|
|
52
|
-
when(s.startedAt),
|
|
53
|
-
s.endedAt ? ` \xB7 Ended ${when(s.endedAt)}` : ` \xB7 Last seen ${relativeTime(s.lastSeenAt)}`
|
|
54
|
-
] })
|
|
55
|
-
] }, s.id)) }),
|
|
56
|
-
ordered.length > shown && /* @__PURE__ */ jsx("div", { className: styles.more, children: /* @__PURE__ */ jsx(
|
|
57
|
-
Button,
|
|
58
|
-
{
|
|
59
|
-
variant: "secondary",
|
|
60
|
-
size: "sm",
|
|
61
|
-
onClick: () => setShown((n) => n + NEXT_PAGE),
|
|
62
|
-
children: "Show older"
|
|
63
|
-
}
|
|
64
|
-
) })
|
|
65
|
-
] });
|
|
66
|
-
}
|
|
67
|
-
export {
|
|
68
|
-
AccountSessions
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=account-sessions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/accounts/account-sessions.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { Button, EmptyNote } from '@withpotter/ui-kit';\nimport type { AccountSession } from '@withpotter/lib/admin-api';\nimport { AdmLoading } from '../_ui';\nimport { useAccountSessions } from '../hooks';\nimport { relativeTime, seenWithin } from './relative-time';\nimport styles from './account-sessions.module.css';\n\nconst ENDED: Record<AccountSession['endedHow'], string> = {\n active: 'Signed in',\n revoked: 'Signed out',\n expired: 'Expired',\n};\n\n/** A device seen in the last few minutes is in use; a session not ended yet is only signed in. */\nconst IN_USE_SECONDS = 300;\nconst inUse = (s: AccountSession) =>\n s.endedHow === 'active' && seenWithin(s.lastSeenAt, IN_USE_SECONDS);\nconst stateOf = (s: AccountSession) =>\n inUse(s) ? 'Active now' : ENDED[s.endedHow];\n\nconst when = (iso: string | null) =>\n iso\n ? new Date(iso).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n : null;\n\n/** Sessions shown first, and how many more each \"Show older\" adds. */\nconst FIRST_PAGE = 5;\nconst NEXT_PAGE = 10;\n\n/** A short device name from the session, falling back to the raw agent. */\nfunction deviceOf(s: AccountSession): string {\n return s.name || s.kind || s.userAgent || 'Unknown device';\n}\n\n/** Where and when this person signed in, newest first. */\nexport function AccountSessions({ accountId }: { accountId: string }) {\n const { data, isLoading, isError, refetch } = useAccountSessions(accountId);\n const [shown, setShown] = useState(FIRST_PAGE);\n\n if (isLoading) return <AdmLoading label=\"Loading sessions…\" size=\"sm\" />;\n\n if (isError) {\n return (\n <EmptyNote>\n We could not load their sessions just now.{' '}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void refetch()}>\n Try again\n </Button>\n </EmptyNote>\n );\n }\n\n if (!data?.length) {\n return <EmptyNote>No sign-ins recorded for this person yet.</EmptyNote>;\n }\n\n const ordered = [...data].sort((a: AccountSession, b: AccountSession) =>\n b.startedAt.localeCompare(a.startedAt),\n );\n\n return (\n <>\n <ul className={styles.list}>\n {ordered.slice(0, shown).map((s: AccountSession) => (\n <li key={s.id} className={styles.item}>\n <span className={styles.top}>\n <span className={styles.device} title={s.userAgent ?? undefined}>\n {deviceOf(s)}\n </span>\n <span className={styles.how} data-live={inUse(s)}>\n {stateOf(s)}\n </span>\n </span>\n <span className={styles.meta}>\n {[s.ipAddress, s.location].filter(Boolean).join(' · ') ||\n 'No address recorded'}\n </span>\n <span className={styles.meta}>\n Started {when(s.startedAt)}\n {s.endedAt\n ? ` · Ended ${when(s.endedAt)}`\n : ` · Last seen ${relativeTime(s.lastSeenAt)}`}\n </span>\n </li>\n ))}\n </ul>\n {ordered.length > shown && (\n <div className={styles.more}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setShown((n: number) => n + NEXT_PAGE)}\n >\n Show older\n </Button>\n </div>\n )}\n </>\n );\n}\n"],"mappings":";AA6CwB,SAsBpB,UAtBoB,KAIlB,YAJkB;AA3CxB,SAAS,gBAAgB;AACzB,SAAS,QAAQ,iBAAiB;AAElC,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,cAAc,kBAAkB;AACzC,OAAO,YAAY;AAEnB,MAAM,QAAoD;AAAA,EACxD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAGA,MAAM,iBAAiB;AACvB,MAAM,QAAQ,CAAC,MACb,EAAE,aAAa,YAAY,WAAW,EAAE,YAAY,cAAc;AACpE,MAAM,UAAU,CAAC,MACf,MAAM,CAAC,IAAI,eAAe,MAAM,EAAE,QAAQ;AAE5C,MAAM,OAAO,CAAC,QACZ,MACI,IAAI,KAAK,GAAG,EAAE,eAAe,QAAW;AAAA,EACtC,WAAW;AAAA,EACX,WAAW;AACb,CAAC,IACD;AAGN,MAAM,aAAa;AACnB,MAAM,YAAY;AAGlB,SAAS,SAAS,GAA2B;AAC3C,SAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa;AAC5C;AAGO,SAAS,gBAAgB,EAAE,UAAU,GAA0B;AACpE,QAAM,EAAE,MAAM,WAAW,SAAS,QAAQ,IAAI,mBAAmB,SAAS;AAC1E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,UAAU;AAE7C,MAAI,UAAW,QAAO,oBAAC,cAAW,OAAM,0BAAoB,MAAK,MAAK;AAEtE,MAAI,SAAS;AACX,WACE,qBAAC,aAAU;AAAA;AAAA,MACkC;AAAA,MAC3C,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,KAAK,QAAQ,GAAG,uBAEjE;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,oBAAC,aAAU,uDAAyC;AAAA,EAC7D;AAEA,QAAM,UAAU,CAAC,GAAG,IAAI,EAAE;AAAA,IAAK,CAAC,GAAmB,MACjD,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EACvC;AAEA,SACE,iCACE;AAAA,wBAAC,QAAG,WAAW,OAAO,MACnB,kBAAQ,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,MAC5B,qBAAC,QAAc,WAAW,OAAO,MAC/B;AAAA,2BAAC,UAAK,WAAW,OAAO,KACtB;AAAA,4BAAC,UAAK,WAAW,OAAO,QAAQ,OAAO,EAAE,aAAa,QACnD,mBAAS,CAAC,GACb;AAAA,QACA,oBAAC,UAAK,WAAW,OAAO,KAAK,aAAW,MAAM,CAAC,GAC5C,kBAAQ,CAAC,GACZ;AAAA,SACF;AAAA,MACA,oBAAC,UAAK,WAAW,OAAO,MACrB,WAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,KACnD,uBACJ;AAAA,MACA,qBAAC,UAAK,WAAW,OAAO,MAAM;AAAA;AAAA,QACnB,KAAK,EAAE,SAAS;AAAA,QACxB,EAAE,UACC,eAAY,KAAK,EAAE,OAAO,CAAC,KAC3B,mBAAgB,aAAa,EAAE,UAAU,CAAC;AAAA,SAChD;AAAA,SAlBO,EAAE,EAmBX,CACD,GACH;AAAA,IACC,QAAQ,SAAS,SAChB,oBAAC,SAAI,WAAW,OAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,CAAC,MAAc,IAAI,SAAS;AAAA,QACrD;AAAA;AAAA,IAED,GACF;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
.list {
|
|
2
|
-
display: grid;
|
|
3
|
-
gap: 8px;
|
|
4
|
-
margin: 0;
|
|
5
|
-
padding: 0;
|
|
6
|
-
list-style: none;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.item {
|
|
10
|
-
display: grid;
|
|
11
|
-
gap: 2px;
|
|
12
|
-
padding: 12px 16px;
|
|
13
|
-
border-radius: var(--adm-card-radius);
|
|
14
|
-
border: 1px solid var(--adm-line);
|
|
15
|
-
background: var(--bg-base);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.top {
|
|
19
|
-
display: flex;
|
|
20
|
-
align-items: baseline;
|
|
21
|
-
justify-content: space-between;
|
|
22
|
-
gap: 12px;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
.device {
|
|
26
|
-
min-width: 0;
|
|
27
|
-
overflow: hidden;
|
|
28
|
-
text-overflow: ellipsis;
|
|
29
|
-
white-space: nowrap;
|
|
30
|
-
font-size: 14px;
|
|
31
|
-
font-weight: 500;
|
|
32
|
-
line-height: 20px;
|
|
33
|
-
color: var(--text-primary);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.how {
|
|
37
|
-
flex-shrink: 0;
|
|
38
|
-
font-size: 12px;
|
|
39
|
-
line-height: 16px;
|
|
40
|
-
color: var(--text-tertiary);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.how[data-live='true'] {
|
|
44
|
-
color: var(--success);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.meta {
|
|
48
|
-
font-size: 12px;
|
|
49
|
-
line-height: 16px;
|
|
50
|
-
color: var(--text-tertiary);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.more {
|
|
54
|
-
display: flex;
|
|
55
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { FilterSelect } from "../_ui";
|
|
4
|
-
import { STAGE_LABELS, STAGE_ORDER } from "./account-stage";
|
|
5
|
-
const OPTIONS = [
|
|
6
|
-
{ value: "", label: "All stages" },
|
|
7
|
-
...STAGE_ORDER.map((s) => ({
|
|
8
|
-
value: s,
|
|
9
|
-
label: STAGE_LABELS[s]
|
|
10
|
-
}))
|
|
11
|
-
];
|
|
12
|
-
function AccountStageFilter({
|
|
13
|
-
value,
|
|
14
|
-
onChange
|
|
15
|
-
}) {
|
|
16
|
-
return /* @__PURE__ */ jsx(
|
|
17
|
-
FilterSelect,
|
|
18
|
-
{
|
|
19
|
-
label: "Stage",
|
|
20
|
-
value,
|
|
21
|
-
onChange: (v) => onChange(v),
|
|
22
|
-
options: OPTIONS
|
|
23
|
-
}
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
export {
|
|
27
|
-
AccountStageFilter
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=account-stage-filter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/accounts/account-stage-filter.tsx"],"sourcesContent":["'use client';\n\nimport type { AccountStage } from '@withpotter/lib/admin-api';\nimport { FilterSelect } from '../_ui';\nimport { STAGE_LABELS, STAGE_ORDER } from './account-stage';\n\nconst OPTIONS = [\n { value: '', label: 'All stages' },\n ...STAGE_ORDER.map((s: AccountStage) => ({\n value: s,\n label: STAGE_LABELS[s],\n })),\n];\n\n/** Narrow the accounts list to everyone who stopped at one stage. */\nexport function AccountStageFilter({\n value,\n onChange,\n}: {\n value: AccountStage | '';\n onChange: (value: AccountStage | '') => void;\n}) {\n return (\n <FilterSelect\n label=\"Stage\"\n value={value}\n onChange={(v: string) => onChange(v as AccountStage | '')}\n options={OPTIONS}\n />\n );\n}\n"],"mappings":";AAuBI;AApBJ,SAAS,oBAAoB;AAC7B,SAAS,cAAc,mBAAmB;AAE1C,MAAM,UAAU;AAAA,EACd,EAAE,OAAO,IAAI,OAAO,aAAa;AAAA,EACjC,GAAG,YAAY,IAAI,CAAC,OAAqB;AAAA,IACvC,OAAO;AAAA,IACP,OAAO,aAAa,CAAC;AAAA,EACvB,EAAE;AACJ;AAGO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UAAU,CAAC,MAAc,SAAS,CAAsB;AAAA,MACxD,SAAS;AAAA;AAAA,EACX;AAEJ;","names":[]}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
const STAGE_LABELS = {
|
|
2
|
-
signed_up: "Signed up",
|
|
3
|
-
verified: "Email verified",
|
|
4
|
-
onboarding: "Onboarding",
|
|
5
|
-
kyc_approved: "KYC approved",
|
|
6
|
-
active: "Active"
|
|
7
|
-
};
|
|
8
|
-
const STAGE_ORDER = [
|
|
9
|
-
"signed_up",
|
|
10
|
-
"verified",
|
|
11
|
-
"onboarding",
|
|
12
|
-
"kyc_approved",
|
|
13
|
-
"active"
|
|
14
|
-
];
|
|
15
|
-
const KYC_LABELS = {
|
|
16
|
-
NOT_STARTED: "Not started",
|
|
17
|
-
CHECKING: "Checking",
|
|
18
|
-
WAITING_REVIEW: "In review",
|
|
19
|
-
NEEDS_MORE: "Needs more",
|
|
20
|
-
APPROVED: "Approved",
|
|
21
|
-
DENIED: "Denied"
|
|
22
|
-
};
|
|
23
|
-
const ACTIVE_HINT = "Active means the email is verified, KYC or KYB is approved, and at least one sale was paid.";
|
|
24
|
-
const stageStatus = (stage) => `stage_${stage}`;
|
|
25
|
-
const PROVIDERS = {
|
|
26
|
-
local: "Email",
|
|
27
|
-
email: "Email",
|
|
28
|
-
google: "Google",
|
|
29
|
-
apple: "Apple"
|
|
30
|
-
};
|
|
31
|
-
function providerLabel(provider) {
|
|
32
|
-
const key = provider.toLowerCase();
|
|
33
|
-
return PROVIDERS[key] ?? key.charAt(0).toUpperCase() + key.slice(1);
|
|
34
|
-
}
|
|
35
|
-
function kycLabel(status) {
|
|
36
|
-
if (!status) return null;
|
|
37
|
-
return KYC_LABELS[status] ?? status;
|
|
38
|
-
}
|
|
39
|
-
function stoppedAt(a) {
|
|
40
|
-
if (a.stage === void 0 && a.emailVerified === void 0) return null;
|
|
41
|
-
if (a.stage === "active") return null;
|
|
42
|
-
if (a.emailVerified === false) return "Verify their email";
|
|
43
|
-
if (a.workspaceCount === 0) return "Add a business";
|
|
44
|
-
if (a.kycStatus !== "APPROVED") {
|
|
45
|
-
return a.kycStatus === "DENIED" ? "Finish KYC or KYB (denied)" : "Finish KYC or KYB";
|
|
46
|
-
}
|
|
47
|
-
if (!a.firstSaleAt) return "Make a first sale";
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
function stepStates(a) {
|
|
51
|
-
const all = a.stage === "active";
|
|
52
|
-
const done = [
|
|
53
|
-
all || a.emailVerified === true,
|
|
54
|
-
all || (a.workspaceCount ?? 0) > 0,
|
|
55
|
-
all || a.kycStatus === "APPROVED",
|
|
56
|
-
all || Boolean(a.firstSaleAt)
|
|
57
|
-
];
|
|
58
|
-
const labels = [
|
|
59
|
-
"Email verified",
|
|
60
|
-
"Business added",
|
|
61
|
-
"KYC or KYB approved",
|
|
62
|
-
"First sale"
|
|
63
|
-
];
|
|
64
|
-
const current = done.indexOf(false);
|
|
65
|
-
return labels.map((label, i) => ({
|
|
66
|
-
label,
|
|
67
|
-
state: done[i] ? "done" : i === current ? "current" : "todo"
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
export {
|
|
71
|
-
ACTIVE_HINT,
|
|
72
|
-
KYC_LABELS,
|
|
73
|
-
STAGE_LABELS,
|
|
74
|
-
STAGE_ORDER,
|
|
75
|
-
kycLabel,
|
|
76
|
-
providerLabel,
|
|
77
|
-
stageStatus,
|
|
78
|
-
stepStates,
|
|
79
|
-
stoppedAt
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=account-stage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/accounts/account-stage.ts"],"sourcesContent":["import type {\n AccountKycStatus,\n AccountRow,\n AccountStage,\n} from '@withpotter/lib/admin-api';\n\nexport const STAGE_LABELS: Record<AccountStage, string> = {\n signed_up: 'Signed up',\n verified: 'Email verified',\n onboarding: 'Onboarding',\n kyc_approved: 'KYC approved',\n active: 'Active',\n};\n\nexport const STAGE_ORDER: AccountStage[] = [\n 'signed_up',\n 'verified',\n 'onboarding',\n 'kyc_approved',\n 'active',\n];\n\nexport const KYC_LABELS: Record<AccountKycStatus, string> = {\n NOT_STARTED: 'Not started',\n CHECKING: 'Checking',\n WAITING_REVIEW: 'In review',\n NEEDS_MORE: 'Needs more',\n APPROVED: 'Approved',\n DENIED: 'Denied',\n};\n\n/** What \"active\" means, said once for every place that needs it. */\nexport const ACTIVE_HINT =\n 'Active means the email is verified, KYC or KYB is approved, and at least one sale was paid.';\n\n/** The StatusPill key for a stage, so each stage gets its own tone. */\nexport const stageStatus = (stage: AccountStage): string => `stage_${stage}`;\n\nconst PROVIDERS: Record<string, string> = {\n local: 'Email',\n email: 'Email',\n google: 'Google',\n apple: 'Apple',\n};\n\n/** Plain words for a sign-in provider; the capitalised value for unknown ones. */\nexport function providerLabel(provider: string): string {\n const key = provider.toLowerCase();\n\n return PROVIDERS[key] ?? key.charAt(0).toUpperCase() + key.slice(1);\n}\n\n/** Plain words for a KYC or KYB status; the raw value for unknown ones. */\nexport function kycLabel(status: string | null | undefined): string | null {\n if (!status) return null;\n\n return KYC_LABELS[status as AccountKycStatus] ?? status;\n}\n\ntype Progress = Pick<\n AccountRow,\n 'emailVerified' | 'workspaceCount' | 'kycStatus' | 'firstSaleAt' | 'stage'\n>;\n\n/**\n * The first step this account has not done, from the fields the list sends.\n * Returns null when every step is done (or when nothing is known yet).\n */\nexport function stoppedAt(a: Partial<Progress>): string | null {\n if (a.stage === undefined && a.emailVerified === undefined) return null;\n if (a.stage === 'active') return null;\n if (a.emailVerified === false) return 'Verify their email';\n if (a.workspaceCount === 0) return 'Add a business';\n if (a.kycStatus !== 'APPROVED') {\n return a.kycStatus === 'DENIED'\n ? 'Finish KYC or KYB (denied)'\n : 'Finish KYC or KYB';\n }\n if (!a.firstSaleAt) return 'Make a first sale';\n\n return null;\n}\n\nexport type StepState = 'done' | 'current' | 'todo';\n\n/**\n * The four steps to an active account, each done, current (the first not\n * done) or todo, from the same fields as stoppedAt.\n */\nexport function stepStates(\n a: Partial<Progress>,\n): { label: string; state: StepState }[] {\n const all = a.stage === 'active';\n const done = [\n all || a.emailVerified === true,\n all || (a.workspaceCount ?? 0) > 0,\n all || a.kycStatus === 'APPROVED',\n all || Boolean(a.firstSaleAt),\n ];\n const labels = [\n 'Email verified',\n 'Business added',\n 'KYC or KYB approved',\n 'First sale',\n ];\n const current = done.indexOf(false);\n\n return labels.map((label: string, i: number) => ({\n label,\n state: done[i] ? 'done' : i === current ? 'current' : 'todo',\n }));\n}\n"],"mappings":"AAMO,MAAM,eAA6C;AAAA,EACxD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AACV;AAEO,MAAM,cAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,aAA+C;AAAA,EAC1D,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AACV;AAGO,MAAM,cACX;AAGK,MAAM,cAAc,CAAC,UAAgC,SAAS,KAAK;AAE1E,MAAM,YAAoC;AAAA,EACxC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAGO,SAAS,cAAc,UAA0B;AACtD,QAAM,MAAM,SAAS,YAAY;AAEjC,SAAO,UAAU,GAAG,KAAK,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AACpE;AAGO,SAAS,SAAS,QAAkD;AACzE,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,WAAW,MAA0B,KAAK;AACnD;AAWO,SAAS,UAAU,GAAqC;AAC7D,MAAI,EAAE,UAAU,UAAa,EAAE,kBAAkB,OAAW,QAAO;AACnE,MAAI,EAAE,UAAU,SAAU,QAAO;AACjC,MAAI,EAAE,kBAAkB,MAAO,QAAO;AACtC,MAAI,EAAE,mBAAmB,EAAG,QAAO;AACnC,MAAI,EAAE,cAAc,YAAY;AAC9B,WAAO,EAAE,cAAc,WACnB,+BACA;AAAA,EACN;AACA,MAAI,CAAC,EAAE,YAAa,QAAO;AAE3B,SAAO;AACT;AAQO,SAAS,WACd,GACuC;AACvC,QAAM,MAAM,EAAE,UAAU;AACxB,QAAM,OAAO;AAAA,IACX,OAAO,EAAE,kBAAkB;AAAA,IAC3B,QAAQ,EAAE,kBAAkB,KAAK;AAAA,IACjC,OAAO,EAAE,cAAc;AAAA,IACvB,OAAO,QAAQ,EAAE,WAAW;AAAA,EAC9B;AACA,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,UAAU,KAAK,QAAQ,KAAK;AAElC,SAAO,OAAO,IAAI,CAAC,OAAe,OAAe;AAAA,IAC/C;AAAA,IACA,OAAO,KAAK,CAAC,IAAI,SAAS,MAAM,UAAU,YAAY;AAAA,EACxD,EAAE;AACJ;","names":[]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Info } from "lucide-react";
|
|
4
|
-
import { Tooltip } from "@withpotter/ui-kit";
|
|
5
|
-
import styles from "./rows.module.css";
|
|
6
|
-
function Hint({ label }) {
|
|
7
|
-
return /* @__PURE__ */ jsx(Tooltip, { label, children: /* @__PURE__ */ jsx("button", { type: "button", className: styles.hint, "aria-label": label, children: /* @__PURE__ */ jsx(Info, { size: 13, "aria-hidden": true }) }) });
|
|
8
|
-
}
|
|
9
|
-
export {
|
|
10
|
-
Hint
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=hint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/accounts/hint.tsx"],"sourcesContent":["'use client';\n\nimport { Info } from 'lucide-react';\nimport { Tooltip } from '@withpotter/ui-kit';\nimport styles from './rows.module.css';\n\n/** A small info icon that explains a term on hover or focus. */\nexport function Hint({ label }: { label: string }) {\n return (\n <Tooltip label={label}>\n <button type=\"button\" className={styles.hint} aria-label={label}>\n <Info size={13} aria-hidden />\n </button>\n </Tooltip>\n );\n}\n"],"mappings":";AAWQ;AATR,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AAGZ,SAAS,KAAK,EAAE,MAAM,GAAsB;AACjD,SACE,oBAAC,WAAQ,OACP,8BAAC,YAAO,MAAK,UAAS,WAAW,OAAO,MAAM,cAAY,OACxD,8BAAC,QAAK,MAAM,IAAI,eAAW,MAAC,GAC9B,GACF;AAEJ;","names":[]}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
const LABELS = {
|
|
2
|
-
nin: "National ID number (Nigeria)",
|
|
3
|
-
"nin-slip": "National ID slip (Nigeria)",
|
|
4
|
-
"advanced-nin": "Detailed national ID check (Nigeria)",
|
|
5
|
-
"premium-nin": "Full national ID check with photo (Nigeria)",
|
|
6
|
-
bvn: "Bank verification number (Nigeria)",
|
|
7
|
-
"validate-bvn": "Bank verification number match (Nigeria)",
|
|
8
|
-
"bvn-nin-selfie": "Bank number, national ID and selfie match (Nigeria)",
|
|
9
|
-
"phone-number": "Phone number",
|
|
10
|
-
"age-identity": "Age and identity",
|
|
11
|
-
passport: "Passport",
|
|
12
|
-
"drivers-license": "Driver's licence",
|
|
13
|
-
"voter-id": "Voter's card",
|
|
14
|
-
"ghana-card": "Ghana Card",
|
|
15
|
-
"ghana-passport": "Ghana passport",
|
|
16
|
-
"ghana-digital-address": "Ghana digital address",
|
|
17
|
-
"kenya-national-id": "Kenya national ID",
|
|
18
|
-
"kenya-passport": "Kenya passport",
|
|
19
|
-
"kenya-kra-pin": "Kenya tax number",
|
|
20
|
-
"uganda-nin": "Uganda national ID",
|
|
21
|
-
"uganda-voter-id": "Uganda voter's card",
|
|
22
|
-
"south-africa-national-id": "South Africa national ID",
|
|
23
|
-
"angola-national-id": "Angola national ID",
|
|
24
|
-
"zambia-nrc": "Zambia national registration card",
|
|
25
|
-
"zimbabwe-national-id": "Zimbabwe national ID",
|
|
26
|
-
"zimbabwe-credit-check": "Zimbabwe credit check",
|
|
27
|
-
"canada-ekyc": "Canada identity check",
|
|
28
|
-
"uk-ekyc": "UK identity check",
|
|
29
|
-
liveness: "Live selfie check",
|
|
30
|
-
"face-compare": "Selfie matches photo",
|
|
31
|
-
"face-doc-compare": "Selfie matches ID document",
|
|
32
|
-
"document-analysis": "ID document check",
|
|
33
|
-
"generic-ocr": "Text read from a document",
|
|
34
|
-
"utility-bill": "Utility bill",
|
|
35
|
-
"individual-address": "Home address",
|
|
36
|
-
"aml-screening": "Anti-money-laundering screening",
|
|
37
|
-
"user-screening": "Person screening (sanctions and watchlists)",
|
|
38
|
-
"email-check": "Email address check",
|
|
39
|
-
"ip-screening": "Device location check",
|
|
40
|
-
"phone-check": "Phone number check",
|
|
41
|
-
cac: "Company registration (Nigeria)",
|
|
42
|
-
tin: "Tax number",
|
|
43
|
-
"global-business-search": "Worldwide business search",
|
|
44
|
-
"kenya-business": "Kenya business registration",
|
|
45
|
-
"zambia-business": "Zambia business registration",
|
|
46
|
-
"business-document": "Business documents",
|
|
47
|
-
"business-address": "Business address",
|
|
48
|
-
"business-aml-screening": "Business screening (sanctions and watchlists)",
|
|
49
|
-
"business-owners": "Owners listed",
|
|
50
|
-
"business-profile": "Business profile completed",
|
|
51
|
-
"screening-clear": "Screening came back clear"
|
|
52
|
-
};
|
|
53
|
-
const GROUP_LABELS = {
|
|
54
|
-
Individual: "Checks on a person",
|
|
55
|
-
Business: "Checks on a business",
|
|
56
|
-
Readiness: "Account readiness (worked out automatically)"
|
|
57
|
-
};
|
|
58
|
-
function requirementLabel(code) {
|
|
59
|
-
if (LABELS[code]) return LABELS[code];
|
|
60
|
-
const spaced = code.replace(/[-_]+/g, " ").trim();
|
|
61
|
-
return spaced.charAt(0).toUpperCase() + spaced.slice(1);
|
|
62
|
-
}
|
|
63
|
-
function requirementGroupLabel(group) {
|
|
64
|
-
return GROUP_LABELS[group] ?? group;
|
|
65
|
-
}
|
|
66
|
-
export {
|
|
67
|
-
requirementGroupLabel,
|
|
68
|
-
requirementLabel
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=requirement-labels.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/payout-tiers/requirement-labels.ts"],"sourcesContent":["/**\n * Plain-English names for the identity and business checks a payout level can\n * require. The codes are what the API stores; admins should never have to read them.\n */\nconst LABELS: Record<string, string> = {\n nin: 'National ID number (Nigeria)',\n 'nin-slip': 'National ID slip (Nigeria)',\n 'advanced-nin': 'Detailed national ID check (Nigeria)',\n 'premium-nin': 'Full national ID check with photo (Nigeria)',\n bvn: 'Bank verification number (Nigeria)',\n 'validate-bvn': 'Bank verification number match (Nigeria)',\n 'bvn-nin-selfie': 'Bank number, national ID and selfie match (Nigeria)',\n 'phone-number': 'Phone number',\n 'age-identity': 'Age and identity',\n passport: 'Passport',\n 'drivers-license': \"Driver's licence\",\n 'voter-id': \"Voter's card\",\n 'ghana-card': 'Ghana Card',\n 'ghana-passport': 'Ghana passport',\n 'ghana-digital-address': 'Ghana digital address',\n 'kenya-national-id': 'Kenya national ID',\n 'kenya-passport': 'Kenya passport',\n 'kenya-kra-pin': 'Kenya tax number',\n 'uganda-nin': 'Uganda national ID',\n 'uganda-voter-id': \"Uganda voter's card\",\n 'south-africa-national-id': 'South Africa national ID',\n 'angola-national-id': 'Angola national ID',\n 'zambia-nrc': 'Zambia national registration card',\n 'zimbabwe-national-id': 'Zimbabwe national ID',\n 'zimbabwe-credit-check': 'Zimbabwe credit check',\n 'canada-ekyc': 'Canada identity check',\n 'uk-ekyc': 'UK identity check',\n liveness: 'Live selfie check',\n 'face-compare': 'Selfie matches photo',\n 'face-doc-compare': 'Selfie matches ID document',\n 'document-analysis': 'ID document check',\n 'generic-ocr': 'Text read from a document',\n 'utility-bill': 'Utility bill',\n 'individual-address': 'Home address',\n 'aml-screening': 'Anti-money-laundering screening',\n 'user-screening': 'Person screening (sanctions and watchlists)',\n 'email-check': 'Email address check',\n 'ip-screening': 'Device location check',\n 'phone-check': 'Phone number check',\n cac: 'Company registration (Nigeria)',\n tin: 'Tax number',\n 'global-business-search': 'Worldwide business search',\n 'kenya-business': 'Kenya business registration',\n 'zambia-business': 'Zambia business registration',\n 'business-document': 'Business documents',\n 'business-address': 'Business address',\n 'business-aml-screening': 'Business screening (sanctions and watchlists)',\n 'business-owners': 'Owners listed',\n 'business-profile': 'Business profile completed',\n 'screening-clear': 'Screening came back clear',\n};\n\nconst GROUP_LABELS: Record<string, string> = {\n Individual: 'Checks on a person',\n Business: 'Checks on a business',\n Readiness: 'Account readiness (worked out automatically)',\n};\n\n/** \"bvn\" → \"Bank verification number (Nigeria)\". Unknown codes stay readable. */\nexport function requirementLabel(code: string): string {\n if (LABELS[code]) return LABELS[code];\n const spaced = code.replace(/[-_]+/g, ' ').trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nexport function requirementGroupLabel(group: string): string {\n return GROUP_LABELS[group] ?? group;\n}\n"],"mappings":"AAIA,MAAM,SAAiC;AAAA,EACrC,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA,EACL,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,mBAAmB;AACrB;AAEA,MAAM,eAAuC;AAAA,EAC3C,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AACb;AAGO,SAAS,iBAAiB,MAAsB;AACrD,MAAI,OAAO,IAAI,EAAG,QAAO,OAAO,IAAI;AACpC,QAAM,SAAS,KAAK,QAAQ,UAAU,GAAG,EAAE,KAAK;AAChD,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,SAAO,aAAa,KAAK,KAAK;AAChC;","names":[]}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useDeferredValue, useEffect, useMemo, useState } from "react";
|
|
4
|
-
import { Badge, Button, TableRow, Th, useToast } from "@withpotter/ui-kit";
|
|
5
|
-
import { toCsv } from "@withpotter/lib/csv";
|
|
6
|
-
import { adminPosApi } from "@withpotter/lib/admin-pos-api";
|
|
7
|
-
import { formatMinor } from "@withpotter/lib/money-minor";
|
|
8
|
-
import { FilterSearch, FilterSelect, Filters } from "../_ui";
|
|
9
|
-
import { ListCard } from "../_ui/list-card";
|
|
10
|
-
import list from "../_ui/list-card.module.css";
|
|
11
|
-
import { saveCsv } from "../revenue/download-button";
|
|
12
|
-
import {
|
|
13
|
-
PAYMENTS_CSV_HEAD,
|
|
14
|
-
PAYMENT_STATUS_OPTIONS,
|
|
15
|
-
matchesSearch,
|
|
16
|
-
paymentRow,
|
|
17
|
-
statusWord
|
|
18
|
-
} from "../_pos/payments-model";
|
|
19
|
-
import { isForbidden, posErrorText } from "../_pos/pos-rules";
|
|
20
|
-
import { atTime } from "../_pos/pos-words";
|
|
21
|
-
import { usePosPayments, usePosTerminals } from "../_pos/use-pos";
|
|
22
|
-
import { useTenantParam } from "../_pos/use-tenant-param";
|
|
23
|
-
import pos from "../_pos/pos.module.css";
|
|
24
|
-
const PAGE_SIZE = 25;
|
|
25
|
-
const EXPORT_MAX_PAGES = 20;
|
|
26
|
-
function TransactionsTab() {
|
|
27
|
-
const { toast } = useToast();
|
|
28
|
-
const [tenantId, setTenantId] = useTenantParam();
|
|
29
|
-
const [status, setStatus] = useState("");
|
|
30
|
-
const [search, setSearch] = useState("");
|
|
31
|
-
const [page, setPage] = useState(0);
|
|
32
|
-
const [exporting, setExporting] = useState(false);
|
|
33
|
-
const term = useDeferredValue(search);
|
|
34
|
-
const q = usePosPayments({ tenantId, status });
|
|
35
|
-
const terminals = usePosTerminals({ limit: 100 });
|
|
36
|
-
const names = useMemo(
|
|
37
|
-
() => new Map(terminals.data?.data.map((t) => [t.tenant.id, t.tenant.name])),
|
|
38
|
-
[terminals.data]
|
|
39
|
-
);
|
|
40
|
-
const businessOptions = useMemo(
|
|
41
|
-
() => [
|
|
42
|
-
{ value: "", label: "Every business" },
|
|
43
|
-
...[...names].map(([value, label]) => ({ value, label }))
|
|
44
|
-
],
|
|
45
|
-
[names]
|
|
46
|
-
);
|
|
47
|
-
const loaded = useMemo(
|
|
48
|
-
() => q.data?.pages.flatMap((p) => p.rows) ?? [],
|
|
49
|
-
[q.data]
|
|
50
|
-
);
|
|
51
|
-
const matched = useMemo(
|
|
52
|
-
() => loaded.filter((p) => matchesSearch(p, names.get(p.tenantId), term)),
|
|
53
|
-
[loaded, names, term]
|
|
54
|
-
);
|
|
55
|
-
const pages = Math.max(1, Math.ceil(matched.length / PAGE_SIZE));
|
|
56
|
-
const last = page >= pages - 1;
|
|
57
|
-
const rows = matched.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE);
|
|
58
|
-
const narrowed = !!(tenantId || status || term.trim());
|
|
59
|
-
useEffect(() => setPage(0), [tenantId, status, term]);
|
|
60
|
-
const next = async () => {
|
|
61
|
-
if (last && q.hasNextPage) await q.fetchNextPage();
|
|
62
|
-
setPage((p) => p + 1);
|
|
63
|
-
};
|
|
64
|
-
const exportCsv = async () => {
|
|
65
|
-
setExporting(true);
|
|
66
|
-
try {
|
|
67
|
-
const all = [];
|
|
68
|
-
let cursor;
|
|
69
|
-
let capped = false;
|
|
70
|
-
for (let i = 0; i < EXPORT_MAX_PAGES; i += 1) {
|
|
71
|
-
const got = await adminPosApi.payments({
|
|
72
|
-
tenantId: tenantId || void 0,
|
|
73
|
-
status: status || void 0,
|
|
74
|
-
cursor,
|
|
75
|
-
limit: 100
|
|
76
|
-
});
|
|
77
|
-
all.push(...got.rows);
|
|
78
|
-
cursor = got.nextCursor ?? void 0;
|
|
79
|
-
if (!cursor) break;
|
|
80
|
-
capped = i === EXPORT_MAX_PAGES - 1;
|
|
81
|
-
}
|
|
82
|
-
const body = all.filter((p) => matchesSearch(p, names.get(p.tenantId), term)).map((p) => paymentRow(p, names.get(p.tenantId)));
|
|
83
|
-
saveCsv(
|
|
84
|
-
`pos-transactions-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`,
|
|
85
|
-
toCsv([PAYMENTS_CSV_HEAD, ...body])
|
|
86
|
-
);
|
|
87
|
-
if (capped)
|
|
88
|
-
toast({
|
|
89
|
-
title: `Exported the newest ${all.length} payments. Narrow the filters to reach older ones.`
|
|
90
|
-
});
|
|
91
|
-
} catch {
|
|
92
|
-
toast({ title: "The export did not start. Please try again." });
|
|
93
|
-
} finally {
|
|
94
|
-
setExporting(false);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
return /* @__PURE__ */ jsx(
|
|
98
|
-
ListCard,
|
|
99
|
-
{
|
|
100
|
-
title: "Transactions",
|
|
101
|
-
count: q.hasNextPage ? void 0 : matched.length,
|
|
102
|
-
columns: 6,
|
|
103
|
-
minWidth: 900,
|
|
104
|
-
isLoading: q.isLoading,
|
|
105
|
-
isError: q.isError && !q.data,
|
|
106
|
-
onRetry: () => void q.refetch(),
|
|
107
|
-
errorTitle: isForbidden(q.error) ? "You don't have permission to see transactions." : posErrorText(q.error, "Transactions did not load."),
|
|
108
|
-
isEmpty: rows.length === 0,
|
|
109
|
-
emptyTitle: narrowed ? "No transactions match." : "No card payments yet.",
|
|
110
|
-
controls: /* @__PURE__ */ jsxs(Filters, { label: "Filter transactions", children: [
|
|
111
|
-
/* @__PURE__ */ jsx(
|
|
112
|
-
FilterSearch,
|
|
113
|
-
{
|
|
114
|
-
value: search,
|
|
115
|
-
onChange: setSearch,
|
|
116
|
-
placeholder: "Business, terminal, reference or amount",
|
|
117
|
-
label: "Search transactions"
|
|
118
|
-
}
|
|
119
|
-
),
|
|
120
|
-
/* @__PURE__ */ jsx(
|
|
121
|
-
FilterSelect,
|
|
122
|
-
{
|
|
123
|
-
label: "Business",
|
|
124
|
-
value: tenantId,
|
|
125
|
-
onChange: setTenantId,
|
|
126
|
-
options: businessOptions,
|
|
127
|
-
searchable: true
|
|
128
|
-
}
|
|
129
|
-
),
|
|
130
|
-
/* @__PURE__ */ jsx(
|
|
131
|
-
FilterSelect,
|
|
132
|
-
{
|
|
133
|
-
label: "Result",
|
|
134
|
-
value: status,
|
|
135
|
-
onChange: setStatus,
|
|
136
|
-
options: [...PAYMENT_STATUS_OPTIONS]
|
|
137
|
-
}
|
|
138
|
-
),
|
|
139
|
-
narrowed && /* @__PURE__ */ jsx(
|
|
140
|
-
Button,
|
|
141
|
-
{
|
|
142
|
-
size: "sm",
|
|
143
|
-
variant: "secondary",
|
|
144
|
-
onClick: () => {
|
|
145
|
-
setSearch("");
|
|
146
|
-
setStatus("");
|
|
147
|
-
setTenantId("");
|
|
148
|
-
},
|
|
149
|
-
children: "Clear filters"
|
|
150
|
-
}
|
|
151
|
-
),
|
|
152
|
-
/* @__PURE__ */ jsx(
|
|
153
|
-
Button,
|
|
154
|
-
{
|
|
155
|
-
size: "sm",
|
|
156
|
-
variant: "secondary",
|
|
157
|
-
loading: exporting,
|
|
158
|
-
onClick: () => void exportCsv(),
|
|
159
|
-
children: "Export CSV"
|
|
160
|
-
}
|
|
161
|
-
)
|
|
162
|
-
] }),
|
|
163
|
-
head: /* @__PURE__ */ jsxs("tr", { children: [
|
|
164
|
-
/* @__PURE__ */ jsx(Th, { children: "Business" }),
|
|
165
|
-
/* @__PURE__ */ jsx(Th, { children: "Terminal" }),
|
|
166
|
-
/* @__PURE__ */ jsx(Th, { children: "Reference" }),
|
|
167
|
-
/* @__PURE__ */ jsx(Th, { children: "Result" }),
|
|
168
|
-
/* @__PURE__ */ jsx(Th, { children: "Amount" }),
|
|
169
|
-
/* @__PURE__ */ jsx(Th, { children: "When" })
|
|
170
|
-
] }),
|
|
171
|
-
footer: matched.length > 0 || q.hasNextPage ? /* @__PURE__ */ jsxs("div", { className: pos.toolbarRow, children: [
|
|
172
|
-
/* @__PURE__ */ jsxs("span", { className: "adm-caption", children: [
|
|
173
|
-
`Page ${page + 1}${last && !q.hasNextPage ? ` of ${pages}` : ""}`,
|
|
174
|
-
term.trim() && q.hasNextPage ? " \xB7 searching the payments loaded so far" : ""
|
|
175
|
-
] }),
|
|
176
|
-
/* @__PURE__ */ jsxs("div", { className: "adm-toolbar", children: [
|
|
177
|
-
/* @__PURE__ */ jsx(
|
|
178
|
-
Button,
|
|
179
|
-
{
|
|
180
|
-
size: "sm",
|
|
181
|
-
variant: "secondary",
|
|
182
|
-
disabled: page === 0,
|
|
183
|
-
onClick: () => setPage((p) => p - 1),
|
|
184
|
-
children: "Previous"
|
|
185
|
-
}
|
|
186
|
-
),
|
|
187
|
-
/* @__PURE__ */ jsx(
|
|
188
|
-
Button,
|
|
189
|
-
{
|
|
190
|
-
size: "sm",
|
|
191
|
-
variant: "secondary",
|
|
192
|
-
loading: q.isFetchingNextPage,
|
|
193
|
-
disabled: last && !q.hasNextPage,
|
|
194
|
-
onClick: () => void next(),
|
|
195
|
-
children: "Next"
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
] })
|
|
199
|
-
] }) : void 0,
|
|
200
|
-
children: rows.map((p) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
201
|
-
/* @__PURE__ */ jsx("td", { children: names.get(p.tenantId) ?? "\u2013" }),
|
|
202
|
-
/* @__PURE__ */ jsx("td", { children: p.deviceLabel ?? "\u2013" }),
|
|
203
|
-
/* @__PURE__ */ jsx("td", { className: list.muted, children: p.reference ?? "\u2013" }),
|
|
204
|
-
/* @__PURE__ */ jsx("td", { className: list.nowrap, children: /* @__PURE__ */ jsx(Badge, { variant: p.status === "SUCCEEDED" ? "success" : "secondary", children: statusWord(p.status) }) }),
|
|
205
|
-
/* @__PURE__ */ jsx("td", { className: `${list.nowrap} ${pos.num}`, children: `${p.direction === "out" ? "-" : ""}${formatMinor(p.amountMinor, p.currency)}` }),
|
|
206
|
-
/* @__PURE__ */ jsx("td", { className: `${list.nowrap} ${list.muted}`, children: atTime(p.at) })
|
|
207
|
-
] }, p.id))
|
|
208
|
-
}
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
export {
|
|
212
|
-
TransactionsTab
|
|
213
|
-
};
|
|
214
|
-
//# sourceMappingURL=transactions-tab.js.map
|