@cedros/login-react 0.0.13 → 0.0.15
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/AdminDepositList-CyT4VBH8.js +311 -0
- package/dist/AdminDepositList-CyT4VBH8.js.map +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs.map +1 -0
- package/dist/{AdminWithdrawalHistory-BGjfrIe3.js → AdminWithdrawalHistory-Cud-yuWy.js} +295 -283
- package/dist/AdminWithdrawalHistory-Cud-yuWy.js.map +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs.map +1 -0
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs → AuthenticationSettings-CjGGqbcS.cjs} +1 -1
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs.map → AuthenticationSettings-CjGGqbcS.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js → AuthenticationSettings-DGWktSVw.js} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js.map → AuthenticationSettings-DGWktSVw.js.map} +1 -1
- package/dist/{AuthenticationSettings-CR_i6TTS.js → AuthenticationSettings-Dg6ATgOl.js} +170 -140
- package/dist/{AuthenticationSettings-CR_i6TTS.js.map → AuthenticationSettings-Dg6ATgOl.js.map} +1 -1
- package/dist/AuthenticationSettings-HhrUAmM6.cjs +1 -0
- package/dist/{AuthenticationSettings-BPAh1my6.cjs.map → AuthenticationSettings-HhrUAmM6.cjs.map} +1 -1
- package/dist/AutosaveStatus-BDWxAg4U.cjs +1 -0
- package/dist/AutosaveStatus-BDWxAg4U.cjs.map +1 -0
- package/dist/{AutosaveStatus-N4uNS6-2.js → AutosaveStatus-DeViUyyI.js} +1 -7
- package/dist/AutosaveStatus-DeViUyyI.js.map +1 -0
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs → CreditSystemSettings-BykhytcS.cjs} +1 -1
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-BykhytcS.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js → CreditSystemSettings-CSlsQynZ.js} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js.map → CreditSystemSettings-CSlsQynZ.js.map} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs → CreditSystemSettings-CyFQbXMh.cjs} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CyFQbXMh.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js → CreditSystemSettings-DBr7QS59.js} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js.map → CreditSystemSettings-DBr7QS59.js.map} +1 -1
- package/dist/DepositsSection-BkKUS4vk.cjs +1 -0
- package/dist/DepositsSection-BkKUS4vk.cjs.map +1 -0
- package/dist/{DepositsSection-DA89uR9A.js → DepositsSection-DD9MKUFt.js} +20 -14
- package/dist/DepositsSection-DD9MKUFt.js.map +1 -0
- package/dist/EmailRegisterForm-Pvm3I8GP.cjs +1 -0
- package/dist/{EmailRegisterForm-CxktR-4J.cjs.map → EmailRegisterForm-Pvm3I8GP.cjs.map} +1 -1
- package/dist/{EmailRegisterForm-BrDL3BZy.js → EmailRegisterForm-nI0BOIxR.js} +2 -2
- package/dist/{EmailRegisterForm-BrDL3BZy.js.map → EmailRegisterForm-nI0BOIxR.js.map} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs → EmailSettings-Bup2rCgU.cjs} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs.map → EmailSettings-Bup2rCgU.cjs.map} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js → EmailSettings-C04qdJCz.js} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js.map → EmailSettings-C04qdJCz.js.map} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs → EmailSettings-C0Ss6Cne.cjs} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs.map → EmailSettings-C0Ss6Cne.cjs.map} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js → EmailSettings-DAqH_xum.js} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js.map → EmailSettings-DAqH_xum.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs → EmbeddedWalletSettings-B0XkNuPR.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs.map → EmbeddedWalletSettings-B0XkNuPR.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js → EmbeddedWalletSettings-DDFQhQOw.js} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js.map → EmbeddedWalletSettings-DDFQhQOw.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js → EmbeddedWalletSettings-DYh884HP.js} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js.map → EmbeddedWalletSettings-DYh884HP.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs → EmbeddedWalletSettings-YX0Dk_b_.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs.map → EmbeddedWalletSettings-YX0Dk_b_.cjs.map} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js → GoogleLoginButton-CXwp4LsQ.js} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js.map → GoogleLoginButton-CXwp4LsQ.js.map} +1 -1
- package/dist/GoogleLoginButton-zS_69-KV.cjs +1 -0
- package/dist/{GoogleLoginButton-BydKswn4.cjs.map → GoogleLoginButton-zS_69-KV.cjs.map} +1 -1
- package/dist/PermissionsSection-BPbE-hNx.cjs +1 -0
- package/dist/{PermissionsSection-CKXXDfqi.cjs.map → PermissionsSection-BPbE-hNx.cjs.map} +1 -1
- package/dist/{PermissionsSection-BGaj_sI7.js → PermissionsSection-CighC1p6.js} +3 -3
- package/dist/{PermissionsSection-BGaj_sI7.js.map → PermissionsSection-CighC1p6.js.map} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs → ServerSettings-CInJe4jY.cjs} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs.map → ServerSettings-CInJe4jY.cjs.map} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs → ServerSettings-CwnEI-PC.cjs} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs.map → ServerSettings-CwnEI-PC.cjs.map} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js → ServerSettings-DVEtfDQo.js} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js.map → ServerSettings-DVEtfDQo.js.map} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js → ServerSettings-DakhpYcO.js} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js.map → ServerSettings-DakhpYcO.js.map} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs → SettingsPageLayout-C6DWgyXS.cjs} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs.map → SettingsPageLayout-C6DWgyXS.cjs.map} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js → SettingsPageLayout-CLJI6hFQ.js} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js.map → SettingsPageLayout-CLJI6hFQ.js.map} +1 -1
- package/dist/SolanaLoginButton-BjOxpE1C.cjs +1 -0
- package/dist/{SolanaLoginButton-fAW7kRUu.cjs.map → SolanaLoginButton-BjOxpE1C.cjs.map} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js → SolanaLoginButton-P22QjBaO.js} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js.map → SolanaLoginButton-P22QjBaO.js.map} +1 -1
- package/dist/{TeamSection-CvrCoa9D.js → TeamSection-BIECkp7g.js} +2 -2
- package/dist/{TeamSection-CvrCoa9D.js.map → TeamSection-BIECkp7g.js.map} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs → TeamSection-BOH9pv_E.cjs} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs.map → TeamSection-BOH9pv_E.cjs.map} +1 -1
- package/dist/UsersSection-e6q7FHzx.cjs +1 -0
- package/dist/UsersSection-e6q7FHzx.cjs.map +1 -0
- package/dist/UsersSection-t-zm0jZW.js +33 -0
- package/dist/UsersSection-t-zm0jZW.js.map +1 -0
- package/dist/{WebhookSettings-DXNH5bal.cjs → WebhookSettings-BMeykdRP.cjs} +1 -1
- package/dist/{WebhookSettings-DXNH5bal.cjs.map → WebhookSettings-BMeykdRP.cjs.map} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs → WebhookSettings-BNVooF0B.cjs} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs.map → WebhookSettings-BNVooF0B.cjs.map} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js → WebhookSettings-DXeDYhAe.js} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js.map → WebhookSettings-DXeDYhAe.js.map} +1 -1
- package/dist/{WebhookSettings-bUg2u_p0.js → WebhookSettings-DdbxNPZ9.js} +1 -1
- package/dist/{WebhookSettings-bUg2u_p0.js.map → WebhookSettings-DdbxNPZ9.js.map} +1 -1
- package/dist/WithdrawalsSection-sljIyeaz.cjs +1 -0
- package/dist/WithdrawalsSection-sljIyeaz.cjs.map +1 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js +27 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js.map +1 -0
- package/dist/admin-only.cjs +1 -1
- package/dist/admin-only.js +1 -1
- package/dist/email-only.cjs +1 -1
- package/dist/email-only.d.ts +13 -2
- package/dist/email-only.js +3 -3
- package/dist/google-only.cjs +1 -1
- package/dist/google-only.d.ts +13 -2
- package/dist/google-only.js +3 -3
- package/dist/index.cjs +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +31 -8
- package/dist/index.js +1066 -1098
- package/dist/index.js.map +1 -1
- package/dist/{plugin-5qRh-YhX.js → plugin-CW_ycXye.js} +1 -1
- package/dist/{plugin-5qRh-YhX.js.map → plugin-CW_ycXye.js.map} +1 -1
- package/dist/{plugin-BtYBW6JY.cjs → plugin-CnbFRy5o.cjs} +1 -1
- package/dist/{plugin-BtYBW6JY.cjs.map → plugin-CnbFRy5o.cjs.map} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs → shamir-4DyQMJCk.cjs} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs.map → shamir-4DyQMJCk.cjs.map} +1 -1
- package/dist/{shamir-B0wConeK.js → shamir-L-s-Tp1Z.js} +1 -1
- package/dist/{shamir-B0wConeK.js.map → shamir-L-s-Tp1Z.js.map} +1 -1
- package/dist/silentWalletEnroll-BgTb4H5I.cjs +1 -0
- package/dist/{silentWalletEnroll-B8pgdKZO.cjs.map → silentWalletEnroll-BgTb4H5I.cjs.map} +1 -1
- package/dist/{silentWalletEnroll-DR2kPw7W.js → silentWalletEnroll-DWt6Pr3B.js} +3 -3
- package/dist/{silentWalletEnroll-DR2kPw7W.js.map → silentWalletEnroll-DWt6Pr3B.js.map} +1 -1
- package/dist/solana-only.cjs +1 -1
- package/dist/solana-only.d.ts +13 -2
- package/dist/solana-only.js +3 -3
- package/dist/{useAdminDeposits-BDY5KJ0-.js → useAdminDeposits-BTSyeAfg.js} +1 -1
- package/dist/{useAdminDeposits-BDY5KJ0-.js.map → useAdminDeposits-BTSyeAfg.js.map} +1 -1
- package/dist/useAdminDeposits-BkkCwHWp.cjs +1 -0
- package/dist/{useAdminDeposits-Dvx3_UUE.cjs.map → useAdminDeposits-BkkCwHWp.cjs.map} +1 -1
- package/dist/{useAuth-Bge6KaWN.js → useAuth-C3dpk0po.js} +597 -561
- package/dist/useAuth-C3dpk0po.js.map +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs.map +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs.map +1 -0
- package/dist/{apiClient-B2JxVPlH.js → useCedrosLogin-_94MmGGq.js} +29 -29
- package/dist/useCedrosLogin-_94MmGGq.js.map +1 -0
- package/dist/{useOrgs-Be3KH4ib.js → useOrgs-C3pzMA9h.js} +1 -1
- package/dist/{useOrgs-Be3KH4ib.js.map → useOrgs-C3pzMA9h.js.map} +1 -1
- package/dist/useOrgs-DDVRCaVi.cjs +1 -0
- package/dist/{useOrgs-CVbacmaQ.cjs.map → useOrgs-DDVRCaVi.cjs.map} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js → useSystemSettings-DBlAMjFi.js} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js.map → useSystemSettings-DBlAMjFi.js.map} +1 -1
- package/dist/useSystemSettings-DRrreszl.cjs +1 -0
- package/dist/{useSystemSettings-D9Cr7ZTl.cjs.map → useSystemSettings-DRrreszl.cjs.map} +1 -1
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs +1 -0
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs.map +1 -0
- package/dist/{AdminUserDetail-DHFDzY8B.js → useUsersStatsSummary-NjEFvWuz.js} +431 -380
- package/dist/useUsersStatsSummary-NjEFvWuz.js.map +1 -0
- package/package.json +1 -1
- package/dist/AdminDepositList-Cx0xRwES.js +0 -305
- package/dist/AdminDepositList-Cx0xRwES.js.map +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs.map +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs.map +0 -1
- package/dist/AdminUserDetail-DHFDzY8B.js.map +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs.map +0 -1
- package/dist/AdminWithdrawalHistory-BGjfrIe3.js.map +0 -1
- package/dist/AuthenticationSettings-BPAh1my6.cjs +0 -1
- package/dist/AutosaveStatus-CYkC2aI_.cjs +0 -1
- package/dist/AutosaveStatus-CYkC2aI_.cjs.map +0 -1
- package/dist/AutosaveStatus-N4uNS6-2.js.map +0 -1
- package/dist/DepositsSection-DA89uR9A.js.map +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs.map +0 -1
- package/dist/EmailRegisterForm-CxktR-4J.cjs +0 -1
- package/dist/GoogleLoginButton-BydKswn4.cjs +0 -1
- package/dist/PermissionsSection-CKXXDfqi.cjs +0 -1
- package/dist/SolanaLoginButton-fAW7kRUu.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs.map +0 -1
- package/dist/UsersSection-Dbh9PTSA.js +0 -83
- package/dist/UsersSection-Dbh9PTSA.js.map +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs.map +0 -1
- package/dist/WithdrawalsSection-CN-lLnqX.js +0 -20
- package/dist/WithdrawalsSection-CN-lLnqX.js.map +0 -1
- package/dist/apiClient-B2JxVPlH.js.map +0 -1
- package/dist/apiClient-CTTKhsYb.cjs +0 -1
- package/dist/apiClient-CTTKhsYb.cjs.map +0 -1
- package/dist/silentWalletEnroll-B8pgdKZO.cjs +0 -1
- package/dist/useAdminDeposits-Dvx3_UUE.cjs +0 -1
- package/dist/useAuth-Bge6KaWN.js.map +0 -1
- package/dist/useAuth-DhIDTLRd.cjs +0 -1
- package/dist/useAuth-DhIDTLRd.cjs.map +0 -1
- package/dist/useOrgs-CVbacmaQ.cjs +0 -1
- package/dist/useSystemSettings-D9Cr7ZTl.cjs +0 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { jsxs as a, jsx as e, Fragment as V } from "react/jsx-runtime";
|
|
2
|
+
import { useState as p, useCallback as O, useEffect as f, useMemo as B } from "react";
|
|
3
|
+
import { u as R } from "./useAdminDeposits-BTSyeAfg.js";
|
|
4
|
+
import { S as K } from "./StatsBar-BX-hHtTq.js";
|
|
5
|
+
function Z({
|
|
6
|
+
refreshInterval: s = 0,
|
|
7
|
+
refreshSignal: r,
|
|
8
|
+
className: h = "",
|
|
9
|
+
onLoad: b
|
|
10
|
+
}) {
|
|
11
|
+
const { getStats: N, isLoading: w, error: y, clearError: C } = R(), [d, L] = p(null), [k, m] = p(null), c = O(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const i = await N();
|
|
14
|
+
L(i), b?.(i), m(null);
|
|
15
|
+
} catch (i) {
|
|
16
|
+
const S = i && typeof i == "object" && "message" in i ? String(i.message) : "Failed to load stats";
|
|
17
|
+
m(S);
|
|
18
|
+
}
|
|
19
|
+
}, [N, b]);
|
|
20
|
+
f(() => {
|
|
21
|
+
c();
|
|
22
|
+
}, [c]), f(() => {
|
|
23
|
+
r !== void 0 && c();
|
|
24
|
+
}, [r, c]), f(() => {
|
|
25
|
+
if (r !== void 0 || s <= 0) return;
|
|
26
|
+
const i = setInterval(c, s);
|
|
27
|
+
return () => clearInterval(i);
|
|
28
|
+
}, [s, r, c]);
|
|
29
|
+
const x = k || y;
|
|
30
|
+
return x ? /* @__PURE__ */ a("div", { className: `cedros-admin-stats cedros-admin-stats-error ${h}`, children: [
|
|
31
|
+
/* @__PURE__ */ e("p", { className: "cedros-admin-error", children: x }),
|
|
32
|
+
/* @__PURE__ */ e(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
type: "button",
|
|
36
|
+
className: "cedros-button cedros-button-outline",
|
|
37
|
+
onClick: () => {
|
|
38
|
+
C(), m(null), c();
|
|
39
|
+
},
|
|
40
|
+
children: "Retry"
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }) : w && !d ? /* @__PURE__ */ a("div", { className: `cedros-admin-stats cedros-admin-stats-loading ${h}`, children: [
|
|
44
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-loading-indicator" }),
|
|
45
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-loading-text", children: "Loading statistics..." })
|
|
46
|
+
] }) : d ? /* @__PURE__ */ e("div", { className: `cedros-admin-stats ${h}`, children: /* @__PURE__ */ e(
|
|
47
|
+
K,
|
|
48
|
+
{
|
|
49
|
+
stats: [
|
|
50
|
+
{ label: "Total Deposits", value: d.totalDeposits },
|
|
51
|
+
{ label: "Private Deposits", value: d.inPrivacyPeriodCount ?? 0 },
|
|
52
|
+
{ label: "Standard Deposits", value: d.readyForWithdrawalCount ?? 0 },
|
|
53
|
+
{ label: "Microdeposits", value: d.nativeSolDepositCount ?? 0 }
|
|
54
|
+
],
|
|
55
|
+
isLoading: w,
|
|
56
|
+
onRefresh: c
|
|
57
|
+
}
|
|
58
|
+
) }) : null;
|
|
59
|
+
}
|
|
60
|
+
function U(s) {
|
|
61
|
+
return {
|
|
62
|
+
pending: "Pending",
|
|
63
|
+
detected: "Detected",
|
|
64
|
+
processing: "Processing",
|
|
65
|
+
completed: "Completed",
|
|
66
|
+
withdrawn: "Withdrawn",
|
|
67
|
+
partially_withdrawn: "Partially Withdrawn",
|
|
68
|
+
expired: "Expired",
|
|
69
|
+
failed: "Failed"
|
|
70
|
+
}[s] || s;
|
|
71
|
+
}
|
|
72
|
+
function q(s) {
|
|
73
|
+
return s === "completed" || s === "withdrawn" || s === "partially_withdrawn" ? "cedros-admin-deposit-success" : s === "failed" || s === "expired" ? "cedros-admin-deposit-error" : s === "processing" || s === "detected" ? "cedros-admin-deposit-processing" : "cedros-admin-deposit-pending";
|
|
74
|
+
}
|
|
75
|
+
function G(s) {
|
|
76
|
+
return s == null ? "—" : `${(s / 1e9).toFixed(4)} SOL`;
|
|
77
|
+
}
|
|
78
|
+
function H(s) {
|
|
79
|
+
return new Date(s).toLocaleDateString(void 0, {
|
|
80
|
+
year: "numeric",
|
|
81
|
+
month: "short",
|
|
82
|
+
day: "numeric",
|
|
83
|
+
hour: "2-digit",
|
|
84
|
+
minute: "2-digit"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function T(s) {
|
|
88
|
+
return s.length <= 12 ? s : `${s.slice(0, 6)}...${s.slice(-4)}`;
|
|
89
|
+
}
|
|
90
|
+
function z({
|
|
91
|
+
statusFilter: s,
|
|
92
|
+
pageSize: r = 20,
|
|
93
|
+
refreshInterval: h = 0,
|
|
94
|
+
refreshSignal: b,
|
|
95
|
+
className: N = "",
|
|
96
|
+
onLoad: w,
|
|
97
|
+
onDepositClick: y
|
|
98
|
+
}) {
|
|
99
|
+
const { listDeposits: C, isLoading: d, error: L, clearError: k } = R(), [m, c] = p([]), [x, i] = p(0), [S, I] = p(0), [j, $] = p(null), [o, _] = p("createdAt"), [l, E] = p("desc"), D = (t) => {
|
|
100
|
+
o === t ? E(l === "asc" ? "desc" : "asc") : (_(t), E("desc"));
|
|
101
|
+
}, W = B(() => [...m].sort((t, n) => {
|
|
102
|
+
let g, v;
|
|
103
|
+
switch (o) {
|
|
104
|
+
case "userId":
|
|
105
|
+
g = t.userId.toLowerCase(), v = n.userId.toLowerCase();
|
|
106
|
+
break;
|
|
107
|
+
case "amountLamports":
|
|
108
|
+
g = t.amountLamports ?? 0, v = n.amountLamports ?? 0;
|
|
109
|
+
break;
|
|
110
|
+
case "status":
|
|
111
|
+
g = t.status, v = n.status;
|
|
112
|
+
break;
|
|
113
|
+
case "createdAt":
|
|
114
|
+
g = new Date(t.createdAt).getTime(), v = new Date(n.createdAt).getTime();
|
|
115
|
+
break;
|
|
116
|
+
case "txSignature":
|
|
117
|
+
g = t.txSignature || "", v = n.txSignature || "";
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
return g < v ? l === "asc" ? -1 : 1 : g > v ? l === "asc" ? 1 : -1 : 0;
|
|
123
|
+
}), [m, o, l]), u = O(async () => {
|
|
124
|
+
try {
|
|
125
|
+
const t = await C({ status: s, limit: r, offset: S });
|
|
126
|
+
c(t.deposits), i(t.total), w?.(t), $(null);
|
|
127
|
+
} catch (t) {
|
|
128
|
+
const n = t && typeof t == "object" && "message" in t ? String(t.message) : "Failed to load deposits";
|
|
129
|
+
$(n);
|
|
130
|
+
}
|
|
131
|
+
}, [s, r, S, C, w]);
|
|
132
|
+
f(() => {
|
|
133
|
+
I(0);
|
|
134
|
+
}, [s, r]), f(() => {
|
|
135
|
+
u();
|
|
136
|
+
}, [u]), f(() => {
|
|
137
|
+
b !== void 0 && u();
|
|
138
|
+
}, [b, u]), f(() => {
|
|
139
|
+
if (b !== void 0 || h <= 0) return;
|
|
140
|
+
const t = setInterval(u, h);
|
|
141
|
+
return () => clearInterval(t);
|
|
142
|
+
}, [h, b, u]);
|
|
143
|
+
const P = Math.ceil(x / r), A = Math.floor(S / r) + 1, M = (t) => {
|
|
144
|
+
const n = (t - 1) * r;
|
|
145
|
+
I(Math.max(0, Math.min(n, Math.max(0, x - 1))));
|
|
146
|
+
}, F = j || L;
|
|
147
|
+
return F ? /* @__PURE__ */ a("div", { className: `cedros-admin-deposit-list cedros-admin-deposit-list-error ${N}`, children: [
|
|
148
|
+
/* @__PURE__ */ e("p", { className: "cedros-admin-error", children: F }),
|
|
149
|
+
/* @__PURE__ */ e(
|
|
150
|
+
"button",
|
|
151
|
+
{
|
|
152
|
+
type: "button",
|
|
153
|
+
className: "cedros-button cedros-button-outline",
|
|
154
|
+
onClick: () => {
|
|
155
|
+
k(), $(null), u();
|
|
156
|
+
},
|
|
157
|
+
children: "Retry"
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
] }) : d && m.length === 0 ? /* @__PURE__ */ a("div", { className: `cedros-admin-deposit-list cedros-admin-deposit-list-loading ${N}`, children: [
|
|
161
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-loading-indicator" }),
|
|
162
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-loading-text", children: "Loading deposits..." })
|
|
163
|
+
] }) : /* @__PURE__ */ a("div", { className: `cedros-admin-deposit-list ${N}`, children: [
|
|
164
|
+
/* @__PURE__ */ a("div", { className: "cedros-admin-deposit-list-header", children: [
|
|
165
|
+
/* @__PURE__ */ e("h4", { className: "cedros-admin-deposit-list-title", children: "All Deposits" }),
|
|
166
|
+
/* @__PURE__ */ e(
|
|
167
|
+
"button",
|
|
168
|
+
{
|
|
169
|
+
type: "button",
|
|
170
|
+
className: "cedros-admin__stats-bar-refresh",
|
|
171
|
+
onClick: u,
|
|
172
|
+
disabled: d,
|
|
173
|
+
title: "Refresh deposits",
|
|
174
|
+
"aria-label": "Refresh deposits",
|
|
175
|
+
children: d ? "..." : "↻"
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
] }),
|
|
179
|
+
m.length === 0 ? /* @__PURE__ */ e("div", { className: "cedros-admin-empty", children: /* @__PURE__ */ e("p", { className: "cedros-admin-empty-message", children: "No deposits found." }) }) : /* @__PURE__ */ a(V, { children: [
|
|
180
|
+
/* @__PURE__ */ a("div", { className: "cedros-admin-deposit-table", children: [
|
|
181
|
+
/* @__PURE__ */ a("div", { className: "cedros-admin-deposit-thead", children: [
|
|
182
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-th", children: /* @__PURE__ */ a(
|
|
183
|
+
"button",
|
|
184
|
+
{
|
|
185
|
+
type: "button",
|
|
186
|
+
className: `cedros-admin-sort-button ${o === "userId" ? "cedros-admin-sort-active" : ""}`,
|
|
187
|
+
onClick: () => D("userId"),
|
|
188
|
+
"aria-label": "Sort by user",
|
|
189
|
+
children: [
|
|
190
|
+
"User",
|
|
191
|
+
" ",
|
|
192
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-sort-icon", children: o === "userId" ? l === "asc" ? "↑" : "↓" : "↕" })
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
) }),
|
|
196
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-th", children: /* @__PURE__ */ a(
|
|
197
|
+
"button",
|
|
198
|
+
{
|
|
199
|
+
type: "button",
|
|
200
|
+
className: `cedros-admin-sort-button ${o === "amountLamports" ? "cedros-admin-sort-active" : ""}`,
|
|
201
|
+
onClick: () => D("amountLamports"),
|
|
202
|
+
"aria-label": "Sort by amount",
|
|
203
|
+
children: [
|
|
204
|
+
"Amount",
|
|
205
|
+
" ",
|
|
206
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-sort-icon", children: o === "amountLamports" ? l === "asc" ? "↑" : "↓" : "↕" })
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
) }),
|
|
210
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-th", children: /* @__PURE__ */ a(
|
|
211
|
+
"button",
|
|
212
|
+
{
|
|
213
|
+
type: "button",
|
|
214
|
+
className: `cedros-admin-sort-button ${o === "status" ? "cedros-admin-sort-active" : ""}`,
|
|
215
|
+
onClick: () => D("status"),
|
|
216
|
+
"aria-label": "Sort by status",
|
|
217
|
+
children: [
|
|
218
|
+
"Status",
|
|
219
|
+
" ",
|
|
220
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-sort-icon", children: o === "status" ? l === "asc" ? "↑" : "↓" : "↕" })
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
) }),
|
|
224
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-th", children: /* @__PURE__ */ a(
|
|
225
|
+
"button",
|
|
226
|
+
{
|
|
227
|
+
type: "button",
|
|
228
|
+
className: `cedros-admin-sort-button ${o === "createdAt" ? "cedros-admin-sort-active" : ""}`,
|
|
229
|
+
onClick: () => D("createdAt"),
|
|
230
|
+
"aria-label": "Sort by created",
|
|
231
|
+
children: [
|
|
232
|
+
"Created",
|
|
233
|
+
" ",
|
|
234
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-sort-icon", children: o === "createdAt" ? l === "asc" ? "↑" : "↓" : "↕" })
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
) }),
|
|
238
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-th", children: /* @__PURE__ */ a(
|
|
239
|
+
"button",
|
|
240
|
+
{
|
|
241
|
+
type: "button",
|
|
242
|
+
className: `cedros-admin-sort-button ${o === "txSignature" ? "cedros-admin-sort-active" : ""}`,
|
|
243
|
+
onClick: () => D("txSignature"),
|
|
244
|
+
"aria-label": "Sort by transaction",
|
|
245
|
+
children: [
|
|
246
|
+
"Tx",
|
|
247
|
+
" ",
|
|
248
|
+
/* @__PURE__ */ e("span", { className: "cedros-admin-sort-icon", children: o === "txSignature" ? l === "asc" ? "↑" : "↓" : "↕" })
|
|
249
|
+
]
|
|
250
|
+
}
|
|
251
|
+
) })
|
|
252
|
+
] }),
|
|
253
|
+
W.map((t) => /* @__PURE__ */ a(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
className: `cedros-admin-deposit-row ${q(t.status)}`,
|
|
257
|
+
onClick: () => y?.(t),
|
|
258
|
+
onKeyDown: (n) => {
|
|
259
|
+
(n.key === "Enter" || n.key === " ") && (n.preventDefault(), y?.(t));
|
|
260
|
+
},
|
|
261
|
+
role: y ? "button" : void 0,
|
|
262
|
+
tabIndex: y ? 0 : void 0,
|
|
263
|
+
children: [
|
|
264
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-td", title: t.userId, children: T(t.userId) }),
|
|
265
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-td", children: G(t.amountLamports) }),
|
|
266
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-td", children: /* @__PURE__ */ e("span", { className: "cedros-admin-status-badge", children: U(t.status) }) }),
|
|
267
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-td", children: H(t.createdAt) }),
|
|
268
|
+
/* @__PURE__ */ e("div", { className: "cedros-admin-deposit-td", title: t.txSignature || void 0, children: t.txSignature ? T(t.txSignature) : "—" })
|
|
269
|
+
]
|
|
270
|
+
},
|
|
271
|
+
t.id
|
|
272
|
+
))
|
|
273
|
+
] }),
|
|
274
|
+
P > 1 && /* @__PURE__ */ a("div", { className: "cedros-admin-pagination", children: [
|
|
275
|
+
/* @__PURE__ */ e(
|
|
276
|
+
"button",
|
|
277
|
+
{
|
|
278
|
+
type: "button",
|
|
279
|
+
className: "cedros-button cedros-button-outline cedros-button-sm",
|
|
280
|
+
onClick: () => M(A - 1),
|
|
281
|
+
disabled: A <= 1,
|
|
282
|
+
children: "Previous"
|
|
283
|
+
}
|
|
284
|
+
),
|
|
285
|
+
/* @__PURE__ */ a("span", { className: "cedros-admin-page-info", children: [
|
|
286
|
+
"Page ",
|
|
287
|
+
A,
|
|
288
|
+
" of ",
|
|
289
|
+
P,
|
|
290
|
+
" (",
|
|
291
|
+
x,
|
|
292
|
+
" total)"
|
|
293
|
+
] }),
|
|
294
|
+
/* @__PURE__ */ e(
|
|
295
|
+
"button",
|
|
296
|
+
{
|
|
297
|
+
type: "button",
|
|
298
|
+
className: "cedros-button cedros-button-outline cedros-button-sm",
|
|
299
|
+
onClick: () => M(A + 1),
|
|
300
|
+
disabled: A >= P,
|
|
301
|
+
children: "Next"
|
|
302
|
+
}
|
|
303
|
+
)
|
|
304
|
+
] })
|
|
305
|
+
] })
|
|
306
|
+
] });
|
|
307
|
+
}
|
|
308
|
+
export {
|
|
309
|
+
Z as A,
|
|
310
|
+
z as a
|
|
311
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminDepositList-CyT4VBH8.js","sources":["../src/components/deposit/admin/AdminDepositStats.tsx","../src/components/deposit/admin/AdminDepositList.tsx"],"sourcesContent":["/**\n * Admin deposit statistics component\n *\n * Shows aggregate statistics for Privacy Cash deposits.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositStatsResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\nimport { StatsBar } from '../../admin/StatsBar';\n\nexport interface AdminDepositStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** External refresh signal from parent coordinator */\n refreshSignal?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\n/**\n * Admin deposit statistics display\n *\n * Shows total deposits, withdrawals, and pending amounts.\n */\nexport function AdminDepositStats({\n refreshInterval = 0,\n refreshSignal,\n className = '',\n onLoad,\n}: AdminDepositStatsProps) {\n const { getStats, isLoading, error, clearError } = useAdminDeposits();\n\n const [stats, setStats] = useState<AdminDepositStatsResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStats = useCallback(async () => {\n try {\n const result = await getStats();\n setStats(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load stats';\n setLoadError(message);\n }\n }, [getStats, onLoad]);\n\n // Fetch on mount\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n useEffect(() => {\n if (refreshSignal === undefined) return;\n fetchStats();\n }, [refreshSignal, fetchStats]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshSignal !== undefined) return;\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, refreshSignal, fetchStats]);\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStats();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading statistics...</span>\n </div>\n );\n }\n\n if (!stats) {\n return null;\n }\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Deposits', value: stats.totalDeposits },\n { label: 'Private Deposits', value: stats.inPrivacyPeriodCount ?? 0 },\n { label: 'Standard Deposits', value: stats.readyForWithdrawalCount ?? 0 },\n { label: 'Microdeposits', value: stats.nativeSolDepositCount ?? 0 },\n ]}\n isLoading={isLoading}\n onRefresh={fetchStats}\n />\n </div>\n );\n}\n","/**\n * Admin deposit list component\n *\n * Shows a paginated list of all deposits across all users.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype DepositSortField = 'userId' | 'amountLamports' | 'status' | 'createdAt' | 'txSignature';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminDepositListProps {\n /** Filter by status (comma-separated) */\n statusFilter?: string;\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** External refresh signal from parent coordinator */\n refreshSignal?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit is clicked */\n onDepositClick?: (deposit: AdminDepositItem) => void;\n}\n\ntype DepositStatusType =\n | 'pending'\n | 'detected'\n | 'processing'\n | 'completed'\n | 'withdrawn'\n | 'partially_withdrawn'\n | 'expired'\n | 'failed';\n\nfunction getStatusLabel(status: DepositStatusType): string {\n const labels: Record<DepositStatusType, string> = {\n pending: 'Pending',\n detected: 'Detected',\n processing: 'Processing',\n completed: 'Completed',\n withdrawn: 'Withdrawn',\n partially_withdrawn: 'Partially Withdrawn',\n expired: 'Expired',\n failed: 'Failed',\n };\n return labels[status] || status;\n}\n\nfunction getStatusClass(status: DepositStatusType): string {\n if (status === 'completed' || status === 'withdrawn' || status === 'partially_withdrawn') {\n return 'cedros-admin-deposit-success';\n }\n if (status === 'failed' || status === 'expired') return 'cedros-admin-deposit-error';\n if (status === 'processing' || status === 'detected') return 'cedros-admin-deposit-processing';\n return 'cedros-admin-deposit-pending';\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin deposit list display\n *\n * Shows paginated list of all deposits with user info.\n */\nexport function AdminDepositList({\n statusFilter,\n pageSize = 20,\n refreshInterval = 0,\n refreshSignal,\n className = '',\n onLoad,\n onDepositClick,\n}: AdminDepositListProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [deposits, setDeposits] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<DepositSortField>('createdAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: DepositSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedDeposits = useMemo(() => {\n return [...deposits].sort((a, b) => {\n let aVal: string | number | null;\n let bVal: string | number | null;\n\n switch (sortField) {\n case 'userId':\n aVal = a.userId.toLowerCase();\n bVal = b.userId.toLowerCase();\n break;\n case 'amountLamports':\n aVal = a.amountLamports ?? 0;\n bVal = b.amountLamports ?? 0;\n break;\n case 'status':\n aVal = a.status;\n bVal = b.status;\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'txSignature':\n aVal = a.txSignature || '';\n bVal = b.txSignature || '';\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [deposits, sortField, sortOrder]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const result = await listDeposits({ status: statusFilter, limit: pageSize, offset });\n setDeposits(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load deposits';\n setLoadError(message);\n }\n }, [statusFilter, pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when filters change\n useEffect(() => {\n setOffset(0);\n }, [statusFilter, pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchDeposits();\n }, [fetchDeposits]);\n\n useEffect(() => {\n if (refreshSignal === undefined) return;\n fetchDeposits();\n }, [refreshSignal, fetchDeposits]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshSignal !== undefined) return;\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchDeposits, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, refreshSignal, fetchDeposits]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchDeposits();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && deposits.length === 0) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-deposit-list ${className}`}>\n <div className=\"cedros-admin-deposit-list-header\">\n <h4 className=\"cedros-admin-deposit-list-title\">All Deposits</h4>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchDeposits}\n disabled={isLoading}\n title=\"Refresh deposits\"\n aria-label=\"Refresh deposits\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {deposits.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-deposit-table\">\n <div className=\"cedros-admin-deposit-thead\">\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'userId' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('userId')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'userId' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'amountLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('amountLamports')}\n aria-label=\"Sort by amount\"\n >\n Amount{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'amountLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'status' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('status')}\n aria-label=\"Sort by status\"\n >\n Status{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'status' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'createdAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('createdAt')}\n aria-label=\"Sort by created\"\n >\n Created{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'createdAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'txSignature' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('txSignature')}\n aria-label=\"Sort by transaction\"\n >\n Tx{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'txSignature' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedDeposits.map((deposit) => (\n <div\n key={deposit.id}\n className={`cedros-admin-deposit-row ${getStatusClass(deposit.status)}`}\n onClick={() => onDepositClick?.(deposit)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onDepositClick?.(deposit);\n }\n }}\n role={onDepositClick ? 'button' : undefined}\n tabIndex={onDepositClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-deposit-td\" title={deposit.userId}>\n {truncateId(deposit.userId)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n {formatAmount(deposit.amountLamports)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n <span className=\"cedros-admin-status-badge\">\n {getStatusLabel(deposit.status)}\n </span>\n </div>\n <div className=\"cedros-admin-deposit-td\">{formatDate(deposit.createdAt)}</div>\n <div className=\"cedros-admin-deposit-td\" title={deposit.txSignature || undefined}>\n {deposit.txSignature ? truncateId(deposit.txSignature) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":["AdminDepositStats","refreshInterval","refreshSignal","className","onLoad","getStats","isLoading","error","clearError","useAdminDeposits","stats","setStats","useState","loadError","setLoadError","fetchStats","useCallback","result","err","message","useEffect","interval","errorMessage","jsxs","jsx","StatsBar","getStatusLabel","status","getStatusClass","formatAmount","lamports","formatDate","dateString","truncateId","id","AdminDepositList","statusFilter","pageSize","onDepositClick","listDeposits","deposits","setDeposits","total","setTotal","offset","setOffset","sortField","setSortField","sortOrder","setSortOrder","toggleSort","field","sortedDeposits","useMemo","a","b","aVal","bVal","fetchDeposits","totalPages","currentPage","goToPage","page","newOffset","Fragment","deposit","e"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const t=require("react/jsx-runtime"),a=require("react"),M=require("./useAdminDeposits-BkkCwHWp.cjs"),O=require("./StatsBar-DTUZCwDD.cjs");function q({refreshInterval:s=0,refreshSignal:r,className:p="",onLoad:h}){const{getStats:f,isLoading:v,error:j,clearError:w}=M.useAdminDeposits(),[d,D]=a.useState(null),[A,u]=a.useState(null),c=a.useCallback(async()=>{try{const i=await f();D(i),h?.(i),u(null)}catch(i){const N=i&&typeof i=="object"&&"message"in i?String(i.message):"Failed to load stats";u(N)}},[f,h]);a.useEffect(()=>{c()},[c]),a.useEffect(()=>{r!==void 0&&c()},[r,c]),a.useEffect(()=>{if(r!==void 0||s<=0)return;const i=setInterval(c,s);return()=>clearInterval(i)},[s,r,c]);const g=A||j;return g?t.jsxs("div",{className:`cedros-admin-stats cedros-admin-stats-error ${p}`,children:[t.jsx("p",{className:"cedros-admin-error",children:g}),t.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{w(),u(null),c()},children:"Retry"})]}):v&&!d?t.jsxs("div",{className:`cedros-admin-stats cedros-admin-stats-loading ${p}`,children:[t.jsx("span",{className:"cedros-admin-loading-indicator"}),t.jsx("span",{className:"cedros-admin-loading-text",children:"Loading statistics..."})]}):d?t.jsx("div",{className:`cedros-admin-stats ${p}`,children:t.jsx(O.StatsBar,{stats:[{label:"Total Deposits",value:d.totalDeposits},{label:"Private Deposits",value:d.inPrivacyPeriodCount??0},{label:"Standard Deposits",value:d.readyForWithdrawalCount??0},{label:"Microdeposits",value:d.nativeSolDepositCount??0}],isLoading:v,onRefresh:c})}):null}function _(s){return{pending:"Pending",detected:"Detected",processing:"Processing",completed:"Completed",withdrawn:"Withdrawn",partially_withdrawn:"Partially Withdrawn",expired:"Expired",failed:"Failed"}[s]||s}function W(s){return s==="completed"||s==="withdrawn"||s==="partially_withdrawn"?"cedros-admin-deposit-success":s==="failed"||s==="expired"?"cedros-admin-deposit-error":s==="processing"||s==="detected"?"cedros-admin-deposit-processing":"cedros-admin-deposit-pending"}function B(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function V(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function I(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function K({statusFilter:s,pageSize:r=20,refreshInterval:p=0,refreshSignal:h,className:f="",onLoad:v,onDepositClick:j}){const{listDeposits:w,isLoading:d,error:D,clearError:A}=M.useAdminDeposits(),[u,c]=a.useState([]),[g,i]=a.useState(0),[N,k]=a.useState(0),[F,C]=a.useState(null),[n,R]=a.useState("createdAt"),[l,E]=a.useState("desc"),y=e=>{n===e?E(l==="asc"?"desc":"asc"):(R(e),E("desc"))},T=a.useMemo(()=>[...u].sort((e,o)=>{let x,b;switch(n){case"userId":x=e.userId.toLowerCase(),b=o.userId.toLowerCase();break;case"amountLamports":x=e.amountLamports??0,b=o.amountLamports??0;break;case"status":x=e.status,b=o.status;break;case"createdAt":x=new Date(e.createdAt).getTime(),b=new Date(o.createdAt).getTime();break;case"txSignature":x=e.txSignature||"",b=o.txSignature||"";break;default:return 0}return x<b?l==="asc"?-1:1:x>b?l==="asc"?1:-1:0}),[u,n,l]),m=a.useCallback(async()=>{try{const e=await w({status:s,limit:r,offset:N});c(e.deposits),i(e.total),v?.(e),C(null)}catch(e){const o=e&&typeof e=="object"&&"message"in e?String(e.message):"Failed to load deposits";C(o)}},[s,r,N,w,v]);a.useEffect(()=>{k(0)},[s,r]),a.useEffect(()=>{m()},[m]),a.useEffect(()=>{h!==void 0&&m()},[h,m]),a.useEffect(()=>{if(h!==void 0||p<=0)return;const e=setInterval(m,p);return()=>clearInterval(e)},[p,h,m]);const L=Math.ceil(g/r),S=Math.floor(N/r)+1,$=e=>{const o=(e-1)*r;k(Math.max(0,Math.min(o,Math.max(0,g-1))))},P=F||D;return P?t.jsxs("div",{className:`cedros-admin-deposit-list cedros-admin-deposit-list-error ${f}`,children:[t.jsx("p",{className:"cedros-admin-error",children:P}),t.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{A(),C(null),m()},children:"Retry"})]}):d&&u.length===0?t.jsxs("div",{className:`cedros-admin-deposit-list cedros-admin-deposit-list-loading ${f}`,children:[t.jsx("span",{className:"cedros-admin-loading-indicator"}),t.jsx("span",{className:"cedros-admin-loading-text",children:"Loading deposits..."})]}):t.jsxs("div",{className:`cedros-admin-deposit-list ${f}`,children:[t.jsxs("div",{className:"cedros-admin-deposit-list-header",children:[t.jsx("h4",{className:"cedros-admin-deposit-list-title",children:"All Deposits"}),t.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:m,disabled:d,title:"Refresh deposits","aria-label":"Refresh deposits",children:d?"...":"↻"})]}),u.length===0?t.jsx("div",{className:"cedros-admin-empty",children:t.jsx("p",{className:"cedros-admin-empty-message",children:"No deposits found."})}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"cedros-admin-deposit-table",children:[t.jsxs("div",{className:"cedros-admin-deposit-thead",children:[t.jsx("div",{className:"cedros-admin-deposit-th",children:t.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${n==="userId"?"cedros-admin-sort-active":""}`,onClick:()=>y("userId"),"aria-label":"Sort by user",children:["User"," ",t.jsx("span",{className:"cedros-admin-sort-icon",children:n==="userId"?l==="asc"?"↑":"↓":"↕"})]})}),t.jsx("div",{className:"cedros-admin-deposit-th",children:t.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${n==="amountLamports"?"cedros-admin-sort-active":""}`,onClick:()=>y("amountLamports"),"aria-label":"Sort by amount",children:["Amount"," ",t.jsx("span",{className:"cedros-admin-sort-icon",children:n==="amountLamports"?l==="asc"?"↑":"↓":"↕"})]})}),t.jsx("div",{className:"cedros-admin-deposit-th",children:t.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${n==="status"?"cedros-admin-sort-active":""}`,onClick:()=>y("status"),"aria-label":"Sort by status",children:["Status"," ",t.jsx("span",{className:"cedros-admin-sort-icon",children:n==="status"?l==="asc"?"↑":"↓":"↕"})]})}),t.jsx("div",{className:"cedros-admin-deposit-th",children:t.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${n==="createdAt"?"cedros-admin-sort-active":""}`,onClick:()=>y("createdAt"),"aria-label":"Sort by created",children:["Created"," ",t.jsx("span",{className:"cedros-admin-sort-icon",children:n==="createdAt"?l==="asc"?"↑":"↓":"↕"})]})}),t.jsx("div",{className:"cedros-admin-deposit-th",children:t.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${n==="txSignature"?"cedros-admin-sort-active":""}`,onClick:()=>y("txSignature"),"aria-label":"Sort by transaction",children:["Tx"," ",t.jsx("span",{className:"cedros-admin-sort-icon",children:n==="txSignature"?l==="asc"?"↑":"↓":"↕"})]})})]}),T.map(e=>t.jsxs("div",{className:`cedros-admin-deposit-row ${W(e.status)}`,onClick:()=>j?.(e),onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),j?.(e))},role:j?"button":void 0,tabIndex:j?0:void 0,children:[t.jsx("div",{className:"cedros-admin-deposit-td",title:e.userId,children:I(e.userId)}),t.jsx("div",{className:"cedros-admin-deposit-td",children:B(e.amountLamports)}),t.jsx("div",{className:"cedros-admin-deposit-td",children:t.jsx("span",{className:"cedros-admin-status-badge",children:_(e.status)})}),t.jsx("div",{className:"cedros-admin-deposit-td",children:V(e.createdAt)}),t.jsx("div",{className:"cedros-admin-deposit-td",title:e.txSignature||void 0,children:e.txSignature?I(e.txSignature):"—"})]},e.id))]}),L>1&&t.jsxs("div",{className:"cedros-admin-pagination",children:[t.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>$(S-1),disabled:S<=1,children:"Previous"}),t.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",S," of ",L," (",g," total)"]}),t.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>$(S+1),disabled:S>=L,children:"Next"})]})]})]})}exports.AdminDepositList=K;exports.AdminDepositStats=q;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminDepositList-b2AXtLg0.cjs","sources":["../src/components/deposit/admin/AdminDepositStats.tsx","../src/components/deposit/admin/AdminDepositList.tsx"],"sourcesContent":["/**\n * Admin deposit statistics component\n *\n * Shows aggregate statistics for Privacy Cash deposits.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositStatsResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\nimport { StatsBar } from '../../admin/StatsBar';\n\nexport interface AdminDepositStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** External refresh signal from parent coordinator */\n refreshSignal?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\n/**\n * Admin deposit statistics display\n *\n * Shows total deposits, withdrawals, and pending amounts.\n */\nexport function AdminDepositStats({\n refreshInterval = 0,\n refreshSignal,\n className = '',\n onLoad,\n}: AdminDepositStatsProps) {\n const { getStats, isLoading, error, clearError } = useAdminDeposits();\n\n const [stats, setStats] = useState<AdminDepositStatsResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStats = useCallback(async () => {\n try {\n const result = await getStats();\n setStats(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load stats';\n setLoadError(message);\n }\n }, [getStats, onLoad]);\n\n // Fetch on mount\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n useEffect(() => {\n if (refreshSignal === undefined) return;\n fetchStats();\n }, [refreshSignal, fetchStats]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshSignal !== undefined) return;\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, refreshSignal, fetchStats]);\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStats();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading statistics...</span>\n </div>\n );\n }\n\n if (!stats) {\n return null;\n }\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Deposits', value: stats.totalDeposits },\n { label: 'Private Deposits', value: stats.inPrivacyPeriodCount ?? 0 },\n { label: 'Standard Deposits', value: stats.readyForWithdrawalCount ?? 0 },\n { label: 'Microdeposits', value: stats.nativeSolDepositCount ?? 0 },\n ]}\n isLoading={isLoading}\n onRefresh={fetchStats}\n />\n </div>\n );\n}\n","/**\n * Admin deposit list component\n *\n * Shows a paginated list of all deposits across all users.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype DepositSortField = 'userId' | 'amountLamports' | 'status' | 'createdAt' | 'txSignature';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminDepositListProps {\n /** Filter by status (comma-separated) */\n statusFilter?: string;\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** External refresh signal from parent coordinator */\n refreshSignal?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit is clicked */\n onDepositClick?: (deposit: AdminDepositItem) => void;\n}\n\ntype DepositStatusType =\n | 'pending'\n | 'detected'\n | 'processing'\n | 'completed'\n | 'withdrawn'\n | 'partially_withdrawn'\n | 'expired'\n | 'failed';\n\nfunction getStatusLabel(status: DepositStatusType): string {\n const labels: Record<DepositStatusType, string> = {\n pending: 'Pending',\n detected: 'Detected',\n processing: 'Processing',\n completed: 'Completed',\n withdrawn: 'Withdrawn',\n partially_withdrawn: 'Partially Withdrawn',\n expired: 'Expired',\n failed: 'Failed',\n };\n return labels[status] || status;\n}\n\nfunction getStatusClass(status: DepositStatusType): string {\n if (status === 'completed' || status === 'withdrawn' || status === 'partially_withdrawn') {\n return 'cedros-admin-deposit-success';\n }\n if (status === 'failed' || status === 'expired') return 'cedros-admin-deposit-error';\n if (status === 'processing' || status === 'detected') return 'cedros-admin-deposit-processing';\n return 'cedros-admin-deposit-pending';\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin deposit list display\n *\n * Shows paginated list of all deposits with user info.\n */\nexport function AdminDepositList({\n statusFilter,\n pageSize = 20,\n refreshInterval = 0,\n refreshSignal,\n className = '',\n onLoad,\n onDepositClick,\n}: AdminDepositListProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [deposits, setDeposits] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<DepositSortField>('createdAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: DepositSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedDeposits = useMemo(() => {\n return [...deposits].sort((a, b) => {\n let aVal: string | number | null;\n let bVal: string | number | null;\n\n switch (sortField) {\n case 'userId':\n aVal = a.userId.toLowerCase();\n bVal = b.userId.toLowerCase();\n break;\n case 'amountLamports':\n aVal = a.amountLamports ?? 0;\n bVal = b.amountLamports ?? 0;\n break;\n case 'status':\n aVal = a.status;\n bVal = b.status;\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'txSignature':\n aVal = a.txSignature || '';\n bVal = b.txSignature || '';\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [deposits, sortField, sortOrder]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const result = await listDeposits({ status: statusFilter, limit: pageSize, offset });\n setDeposits(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load deposits';\n setLoadError(message);\n }\n }, [statusFilter, pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when filters change\n useEffect(() => {\n setOffset(0);\n }, [statusFilter, pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchDeposits();\n }, [fetchDeposits]);\n\n useEffect(() => {\n if (refreshSignal === undefined) return;\n fetchDeposits();\n }, [refreshSignal, fetchDeposits]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshSignal !== undefined) return;\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchDeposits, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, refreshSignal, fetchDeposits]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchDeposits();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && deposits.length === 0) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-deposit-list ${className}`}>\n <div className=\"cedros-admin-deposit-list-header\">\n <h4 className=\"cedros-admin-deposit-list-title\">All Deposits</h4>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchDeposits}\n disabled={isLoading}\n title=\"Refresh deposits\"\n aria-label=\"Refresh deposits\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {deposits.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-deposit-table\">\n <div className=\"cedros-admin-deposit-thead\">\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'userId' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('userId')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'userId' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'amountLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('amountLamports')}\n aria-label=\"Sort by amount\"\n >\n Amount{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'amountLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'status' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('status')}\n aria-label=\"Sort by status\"\n >\n Status{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'status' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'createdAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('createdAt')}\n aria-label=\"Sort by created\"\n >\n Created{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'createdAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'txSignature' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('txSignature')}\n aria-label=\"Sort by transaction\"\n >\n Tx{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'txSignature' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedDeposits.map((deposit) => (\n <div\n key={deposit.id}\n className={`cedros-admin-deposit-row ${getStatusClass(deposit.status)}`}\n onClick={() => onDepositClick?.(deposit)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onDepositClick?.(deposit);\n }\n }}\n role={onDepositClick ? 'button' : undefined}\n tabIndex={onDepositClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-deposit-td\" title={deposit.userId}>\n {truncateId(deposit.userId)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n {formatAmount(deposit.amountLamports)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n <span className=\"cedros-admin-status-badge\">\n {getStatusLabel(deposit.status)}\n </span>\n </div>\n <div className=\"cedros-admin-deposit-td\">{formatDate(deposit.createdAt)}</div>\n <div className=\"cedros-admin-deposit-td\" title={deposit.txSignature || undefined}>\n {deposit.txSignature ? truncateId(deposit.txSignature) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":["AdminDepositStats","refreshInterval","refreshSignal","className","onLoad","getStats","isLoading","error","clearError","useAdminDeposits","stats","setStats","useState","loadError","setLoadError","fetchStats","useCallback","result","err","message","useEffect","interval","errorMessage","jsxs","jsx","StatsBar","getStatusLabel","status","getStatusClass","formatAmount","lamports","formatDate","dateString","truncateId","id","AdminDepositList","statusFilter","pageSize","onDepositClick","listDeposits","deposits","setDeposits","total","setTotal","offset","setOffset","sortField","setSortField","sortOrder","setSortOrder","toggleSort","field","sortedDeposits","useMemo","a","b","aVal","bVal","fetchDeposits","totalPages","currentPage","goToPage","page","newOffset","Fragment","deposit","e"],"mappings":"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"}
|