@cedros/login-react 0.0.29 → 0.0.30
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/README.md +2 -0
- package/dist/{AdminDepositList-CyT4VBH8.js → AdminDepositList-BUm_ZcAW.js} +1 -1
- package/dist/{AdminDepositList-CyT4VBH8.js.map → AdminDepositList-BUm_ZcAW.js.map} +1 -1
- package/dist/{AdminDepositList-b2AXtLg0.cjs → AdminDepositList-B_z6x3j5.cjs} +1 -1
- package/dist/{AdminDepositList-b2AXtLg0.cjs.map → AdminDepositList-B_z6x3j5.cjs.map} +1 -1
- package/dist/{AdminWithdrawalHistory-DL9zbu2b.cjs → AdminWithdrawalHistory-B2EY2ZmH.cjs} +1 -1
- package/dist/{AdminWithdrawalHistory-DL9zbu2b.cjs.map → AdminWithdrawalHistory-B2EY2ZmH.cjs.map} +1 -1
- package/dist/{AdminWithdrawalHistory-Cud-yuWy.js → AdminWithdrawalHistory-C76bkbjX.js} +1 -1
- package/dist/{AdminWithdrawalHistory-Cud-yuWy.js.map → AdminWithdrawalHistory-C76bkbjX.js.map} +1 -1
- package/dist/{AuthenticationSettings-D6GvSw3g.cjs → AuthenticationSettings-C-aYDXNH.cjs} +1 -1
- package/dist/{AuthenticationSettings-D6GvSw3g.cjs.map → AuthenticationSettings-C-aYDXNH.cjs.map} +1 -1
- package/dist/AuthenticationSettings-CoTic-d_.cjs +1 -0
- package/dist/AuthenticationSettings-CoTic-d_.cjs.map +1 -0
- package/dist/{AuthenticationSettings-rb4Fksw5.js → AuthenticationSettings-CsPbxwP7.js} +1 -1
- package/dist/{AuthenticationSettings-rb4Fksw5.js.map → AuthenticationSettings-CsPbxwP7.js.map} +1 -1
- package/dist/AuthenticationSettings-DIVk0OP8.js +712 -0
- package/dist/AuthenticationSettings-DIVk0OP8.js.map +1 -0
- package/dist/AutosaveStatus-DGNI4lXn.cjs +1 -0
- package/dist/AutosaveStatus-DGNI4lXn.cjs.map +1 -0
- package/dist/{AutosaveStatus-vkJxtuEw.js → AutosaveStatus-f-jw25Ay.js} +141 -93
- package/dist/AutosaveStatus-f-jw25Ay.js.map +1 -0
- package/dist/{CreditSystemSettings-ChA_lbef.cjs → CreditSystemSettings-BNkvsgsk.cjs} +1 -1
- package/dist/{CreditSystemSettings-ChA_lbef.cjs.map → CreditSystemSettings-BNkvsgsk.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-DsRipb2R.js → CreditSystemSettings-C6ed3yp7.js} +1 -1
- package/dist/{CreditSystemSettings-DsRipb2R.js.map → CreditSystemSettings-C6ed3yp7.js.map} +1 -1
- package/dist/{CreditSystemSettings-r3gnGjiU.cjs → CreditSystemSettings-DM9ep1TF.cjs} +1 -1
- package/dist/{CreditSystemSettings-r3gnGjiU.cjs.map → CreditSystemSettings-DM9ep1TF.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-a31pqSYS.js → CreditSystemSettings-uinhzoha.js} +1 -1
- package/dist/{CreditSystemSettings-a31pqSYS.js.map → CreditSystemSettings-uinhzoha.js.map} +1 -1
- package/dist/{DepositsSection-DD9MKUFt.js → DepositsSection-Bb4ISzvE.js} +1 -1
- package/dist/{DepositsSection-DD9MKUFt.js.map → DepositsSection-Bb4ISzvE.js.map} +1 -1
- package/dist/{DepositsSection-BkKUS4vk.cjs → DepositsSection-uQUdGeVb.cjs} +1 -1
- package/dist/{DepositsSection-BkKUS4vk.cjs.map → DepositsSection-uQUdGeVb.cjs.map} +1 -1
- package/dist/EmailRegisterForm-B_TiJkD6.cjs +1 -0
- package/dist/EmailRegisterForm-B_TiJkD6.cjs.map +1 -0
- package/dist/EmailRegisterForm-CCEuQA-w.js +773 -0
- package/dist/EmailRegisterForm-CCEuQA-w.js.map +1 -0
- package/dist/{EmailSettings-BVJ4vz0Y.js → EmailSettings-BAuQtEfM.js} +1 -1
- package/dist/{EmailSettings-BVJ4vz0Y.js.map → EmailSettings-BAuQtEfM.js.map} +1 -1
- package/dist/{EmailSettings-Dg2SAiHj.cjs → EmailSettings-BC0f1PCI.cjs} +1 -1
- package/dist/{EmailSettings-Dg2SAiHj.cjs.map → EmailSettings-BC0f1PCI.cjs.map} +1 -1
- package/dist/{EmailSettings-CM5l8qqK.cjs → EmailSettings-BF5EiPl9.cjs} +1 -1
- package/dist/{EmailSettings-CM5l8qqK.cjs.map → EmailSettings-BF5EiPl9.cjs.map} +1 -1
- package/dist/{EmailSettings-xtVl4kXD.js → EmailSettings-BKuXy8sc.js} +1 -1
- package/dist/{EmailSettings-xtVl4kXD.js.map → EmailSettings-BKuXy8sc.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-Bmx8x21f.cjs → EmbeddedWalletSettings-BRjt2PAj.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-Bmx8x21f.cjs.map → EmbeddedWalletSettings-BRjt2PAj.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BuDgqv-K.js → EmbeddedWalletSettings-C27X9He2.js} +1 -1
- package/dist/{EmbeddedWalletSettings-BuDgqv-K.js.map → EmbeddedWalletSettings-C27X9He2.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BXN9VbNJ.cjs → EmbeddedWalletSettings-CJY39UZN.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-BXN9VbNJ.cjs.map → EmbeddedWalletSettings-CJY39UZN.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DY5iJhS0.js → EmbeddedWalletSettings-Dmi-EQ7W.js} +1 -1
- package/dist/{EmbeddedWalletSettings-DY5iJhS0.js.map → EmbeddedWalletSettings-Dmi-EQ7W.js.map} +1 -1
- package/dist/GoogleLoginButton-CjBO3Rf1.cjs +1 -0
- package/dist/GoogleLoginButton-CjBO3Rf1.cjs.map +1 -0
- package/dist/{GoogleLoginButton-B6qnNMZp.js → GoogleLoginButton-DEbiQngr.js} +51 -51
- package/dist/GoogleLoginButton-DEbiQngr.js.map +1 -0
- package/dist/LoadingSpinner-6vml-zwr.js.map +1 -1
- package/dist/LoadingSpinner-d6sSxgQN.cjs.map +1 -1
- package/dist/{PermissionsSection-BPbE-hNx.cjs → PermissionsSection-DEMVp7X3.cjs} +1 -1
- package/dist/PermissionsSection-DEMVp7X3.cjs.map +1 -0
- package/dist/{PermissionsSection-CighC1p6.js → PermissionsSection-DNzOL1xW.js} +27 -25
- package/dist/PermissionsSection-DNzOL1xW.js.map +1 -0
- package/dist/{ServerSettings-BAstMKHS.js → ServerSettings-BT9weFPz.js} +1 -1
- package/dist/{ServerSettings-BAstMKHS.js.map → ServerSettings-BT9weFPz.js.map} +1 -1
- package/dist/{ServerSettings-LIIP5TPz.cjs → ServerSettings-CKfiLfXi.cjs} +1 -1
- package/dist/{ServerSettings-LIIP5TPz.cjs.map → ServerSettings-CKfiLfXi.cjs.map} +1 -1
- package/dist/{ServerSettings-9Q091f3o.js → ServerSettings-CZfBdMxG.js} +1 -1
- package/dist/{ServerSettings-9Q091f3o.js.map → ServerSettings-CZfBdMxG.js.map} +1 -1
- package/dist/{ServerSettings-PH7T8JKI.cjs → ServerSettings-rHrVN8O8.cjs} +1 -1
- package/dist/{ServerSettings-PH7T8JKI.cjs.map → ServerSettings-rHrVN8O8.cjs.map} +1 -1
- package/dist/SolanaLoginButton-DAV3r4oB.cjs +1 -0
- package/dist/SolanaLoginButton-DAV3r4oB.cjs.map +1 -0
- package/dist/{mobileWalletAdapter-Cm_AUXhg.js → SolanaLoginButton-DFOoLqoj.js} +75 -74
- package/dist/SolanaLoginButton-DFOoLqoj.js.map +1 -0
- package/dist/{TeamSection-BIECkp7g.js → TeamSection-CoMXyFtz.js} +2 -2
- package/dist/{TeamSection-BIECkp7g.js.map → TeamSection-CoMXyFtz.js.map} +1 -1
- package/dist/{TeamSection-BOH9pv_E.cjs → TeamSection-DopbZClq.cjs} +1 -1
- package/dist/{TeamSection-BOH9pv_E.cjs.map → TeamSection-DopbZClq.cjs.map} +1 -1
- package/dist/{UsersSection-t-zm0jZW.js → UsersSection--PAE1XRh.js} +1 -1
- package/dist/{UsersSection-t-zm0jZW.js.map → UsersSection--PAE1XRh.js.map} +1 -1
- package/dist/{UsersSection-e6q7FHzx.cjs → UsersSection-C7aRNkK2.cjs} +1 -1
- package/dist/{UsersSection-e6q7FHzx.cjs.map → UsersSection-C7aRNkK2.cjs.map} +1 -1
- package/dist/{WebhookSettings-D0F8ESlB.js → WebhookSettings-Bgld6D_T.js} +1 -1
- package/dist/{WebhookSettings-D0F8ESlB.js.map → WebhookSettings-Bgld6D_T.js.map} +1 -1
- package/dist/{WebhookSettings-2p9abGm5.cjs → WebhookSettings-DXjnq-c7.cjs} +1 -1
- package/dist/{WebhookSettings-2p9abGm5.cjs.map → WebhookSettings-DXjnq-c7.cjs.map} +1 -1
- package/dist/{WebhookSettings-CdFM7_V-.cjs → WebhookSettings-DnLk97Mr.cjs} +1 -1
- package/dist/{WebhookSettings-CdFM7_V-.cjs.map → WebhookSettings-DnLk97Mr.cjs.map} +1 -1
- package/dist/{WebhookSettings-CXMBju7N.js → WebhookSettings-ufiGTmbG.js} +1 -1
- package/dist/{WebhookSettings-CXMBju7N.js.map → WebhookSettings-ufiGTmbG.js.map} +1 -1
- package/dist/{WithdrawalsSection-yRDTVFsb.js → WithdrawalsSection-BN-FjTEV.js} +1 -1
- package/dist/{WithdrawalsSection-yRDTVFsb.js.map → WithdrawalsSection-BN-FjTEV.js.map} +1 -1
- package/dist/{WithdrawalsSection-sljIyeaz.cjs → WithdrawalsSection-BhuCwFat.cjs} +1 -1
- package/dist/{WithdrawalsSection-sljIyeaz.cjs.map → WithdrawalsSection-BhuCwFat.cjs.map} +1 -1
- 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 +17 -1
- package/dist/email-only.js +3 -3
- package/dist/google-only.cjs +1 -1
- package/dist/google-only.d.ts +16 -0
- 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 +246 -10
- package/dist/index.js +3384 -2508
- package/dist/index.js.map +1 -1
- package/dist/login-react.css +1 -1
- package/dist/{plugin-DbkijwEV.js → plugin-BbExid4E.js} +1 -1
- package/dist/{plugin-DbkijwEV.js.map → plugin-BbExid4E.js.map} +1 -1
- package/dist/{plugin-PU2vAozn.cjs → plugin-Xca67fp7.cjs} +1 -1
- package/dist/{plugin-PU2vAozn.cjs.map → plugin-Xca67fp7.cjs.map} +1 -1
- package/dist/{shamir-CiBczzDN.cjs → shamir-DBpHm7WN.cjs} +1 -1
- package/dist/{shamir-CiBczzDN.cjs.map → shamir-DBpHm7WN.cjs.map} +1 -1
- package/dist/{shamir-OAB2zD9Y.js → shamir-R8ddesFt.js} +1 -1
- package/dist/{shamir-OAB2zD9Y.js.map → shamir-R8ddesFt.js.map} +1 -1
- package/dist/{silentWalletEnroll-FqXS7Rvh.js → silentWalletEnroll-Dp1GTeNr.js} +3 -3
- package/dist/{silentWalletEnroll-FqXS7Rvh.js.map → silentWalletEnroll-Dp1GTeNr.js.map} +1 -1
- package/dist/{silentWalletEnroll-wnkcB9HP.cjs → silentWalletEnroll-HPvsbd2J.cjs} +1 -1
- package/dist/{silentWalletEnroll-wnkcB9HP.cjs.map → silentWalletEnroll-HPvsbd2J.cjs.map} +1 -1
- package/dist/solana-only.cjs +1 -1
- package/dist/solana-only.d.ts +16 -0
- package/dist/solana-only.js +3 -3
- package/dist/{useAdminDeposits-BTSyeAfg.js → useAdminDeposits-C76B2Q_8.js} +1 -1
- package/dist/{useAdminDeposits-BTSyeAfg.js.map → useAdminDeposits-C76B2Q_8.js.map} +1 -1
- package/dist/{useAdminDeposits-BkkCwHWp.cjs → useAdminDeposits-CpLd68oP.cjs} +1 -1
- package/dist/{useAdminDeposits-BkkCwHWp.cjs.map → useAdminDeposits-CpLd68oP.cjs.map} +1 -1
- package/dist/{useAuth-m5Hf89v8.js → useAuth-CVLv2oKA.js} +547 -545
- package/dist/useAuth-CVLv2oKA.js.map +1 -0
- package/dist/useAuth-XZaciuLg.cjs +1 -0
- package/dist/useAuth-XZaciuLg.cjs.map +1 -0
- package/dist/useCedrosLogin-CFfID-0i.js +228 -0
- package/dist/useCedrosLogin-CFfID-0i.js.map +1 -0
- package/dist/useCedrosLogin-DtJorrE7.cjs +1 -0
- package/dist/useCedrosLogin-DtJorrE7.cjs.map +1 -0
- package/dist/{useOrgs-C3pzMA9h.js → useOrgs-C90KT9KP.js} +1 -1
- package/dist/{useOrgs-C3pzMA9h.js.map → useOrgs-C90KT9KP.js.map} +1 -1
- package/dist/{useOrgs-DDVRCaVi.cjs → useOrgs-CNqfn-fk.cjs} +1 -1
- package/dist/{useOrgs-DDVRCaVi.cjs.map → useOrgs-CNqfn-fk.cjs.map} +1 -1
- package/dist/{useSystemSettings-DRrreszl.cjs → useSystemSettings-B2jY51ob.cjs} +1 -1
- package/dist/{useSystemSettings-DRrreszl.cjs.map → useSystemSettings-B2jY51ob.cjs.map} +1 -1
- package/dist/{useSystemSettings-DBlAMjFi.js → useSystemSettings-rgskaDqP.js} +1 -1
- package/dist/{useSystemSettings-DBlAMjFi.js.map → useSystemSettings-rgskaDqP.js.map} +1 -1
- package/dist/{useUsersStatsSummary-NjEFvWuz.js → useUsersStatsSummary-5DJwzntC.js} +2 -2
- package/dist/{useUsersStatsSummary-NjEFvWuz.js.map → useUsersStatsSummary-5DJwzntC.js.map} +1 -1
- package/dist/{useUsersStatsSummary-8qY7iP4G.cjs → useUsersStatsSummary-DgKaUIfs.cjs} +1 -1
- package/dist/{useUsersStatsSummary-8qY7iP4G.cjs.map → useUsersStatsSummary-DgKaUIfs.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/AuthenticationSettings-C9f5MKgj.cjs +0 -1
- package/dist/AuthenticationSettings-C9f5MKgj.cjs.map +0 -1
- package/dist/AuthenticationSettings-DC64o_J6.js +0 -525
- package/dist/AuthenticationSettings-DC64o_J6.js.map +0 -1
- package/dist/AutosaveStatus-BFj5GIab.cjs +0 -1
- package/dist/AutosaveStatus-BFj5GIab.cjs.map +0 -1
- package/dist/AutosaveStatus-vkJxtuEw.js.map +0 -1
- package/dist/EmailRegisterForm-B1DB-bqe.cjs +0 -1
- package/dist/EmailRegisterForm-B1DB-bqe.cjs.map +0 -1
- package/dist/EmailRegisterForm-BAX_uBIt.js +0 -927
- package/dist/EmailRegisterForm-BAX_uBIt.js.map +0 -1
- package/dist/GoogleLoginButton-B6qnNMZp.js.map +0 -1
- package/dist/GoogleLoginButton-D7CoMXLq.cjs +0 -1
- package/dist/GoogleLoginButton-D7CoMXLq.cjs.map +0 -1
- package/dist/PermissionsSection-BPbE-hNx.cjs.map +0 -1
- package/dist/PermissionsSection-CighC1p6.js.map +0 -1
- package/dist/mobileWalletAdapter-B6ELaZp1.cjs +0 -1
- package/dist/mobileWalletAdapter-B6ELaZp1.cjs.map +0 -1
- package/dist/mobileWalletAdapter-Cm_AUXhg.js.map +0 -1
- package/dist/useAuth-X6Ds6WW4.cjs +0 -1
- package/dist/useAuth-X6Ds6WW4.cjs.map +0 -1
- package/dist/useAuth-m5Hf89v8.js.map +0 -1
- package/dist/useCedrosLogin-C9MrcZvh.cjs +0 -1
- package/dist/useCedrosLogin-C9MrcZvh.cjs.map +0 -1
- package/dist/useCedrosLogin-_94MmGGq.js +0 -216
- package/dist/useCedrosLogin-_94MmGGq.js.map +0 -1
package/README.md
CHANGED
|
@@ -903,6 +903,8 @@ function SecuritySettings() {
|
|
|
903
903
|
|
|
904
904
|
### Two-Factor Authentication
|
|
905
905
|
|
|
906
|
+
> **Scope:** TOTP 2FA applies to **email/password sign-in only**. OAuth providers (Google, Apple) and passkeys handle their own multi-factor verification, so TOTP is not prompted for those methods.
|
|
907
|
+
|
|
906
908
|
```tsx
|
|
907
909
|
import { TotpSettings, TotpSetup, TotpVerify } from '@cedros/login-react';
|
|
908
910
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as a, jsx as e, Fragment as V } from "react/jsx-runtime";
|
|
2
2
|
import { useState as p, useCallback as O, useEffect as f, useMemo as B } from "react";
|
|
3
|
-
import { u as R } from "./useAdminDeposits-
|
|
3
|
+
import { u as R } from "./useAdminDeposits-C76B2Q_8.js";
|
|
4
4
|
import { S as K } from "./StatsBar-BX-hHtTq.js";
|
|
5
5
|
function Z({
|
|
6
6
|
refreshInterval: s = 0,
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"AdminDepositList-BUm_ZcAW.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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const t=require("react/jsx-runtime"),a=require("react"),M=require("./useAdminDeposits-
|
|
1
|
+
"use strict";const t=require("react/jsx-runtime"),a=require("react"),M=require("./useAdminDeposits-CpLd68oP.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;
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"AdminDepositList-B_z6x3j5.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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),a=require("react"),U=require("./useAdminDeposits-BkkCwHWp.cjs"),J=require("./StatsBar-DTUZCwDD.cjs");function se({refreshInterval:s=0,refreshSignal:o,className:h="",onLoad:w}){const{getStats:b,isLoading:i,error:v,clearError:p}=U.useAdminDeposits(),[g,q]=a.useState(null),[N,A]=a.useState(null),u=a.useCallback(async()=>{try{const d=await b();q(d),w?.(d),A(null)}catch(d){const k=d&&typeof d=="object"&&"message"in d?String(d.message):"Failed to load stats";A(k)}},[b,w]);a.useEffect(()=>{u()},[u]),a.useEffect(()=>{o!==void 0&&u()},[o,u]),a.useEffect(()=>{if(o!==void 0||s<=0)return;const d=setInterval(u,s);return()=>clearInterval(d)},[s,o,u]);const C=N||v;return C?e.jsxs("div",{className:`cedros-admin-stats ${h}`,children:[e.jsx("p",{className:"cedros-admin-error",children:C}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{p(),A(null),u()},children:"Retry"})]}):i&&!g?e.jsx("div",{className:`cedros-admin-stats ${h}`,children:e.jsx(J.StatsBar,{stats:[{label:"Total Withdrawn",value:0},{label:"Pending Withdraw",value:0},{label:"In Privacy Period",value:0},{label:"Microbatch (SOL)",value:"0.0000"}],isLoading:!0})}):g?e.jsx("div",{className:`cedros-admin-stats ${h}`,children:e.jsx(J.StatsBar,{stats:[{label:"Total Withdrawn",value:g.totalWithdrawnCount},{label:"Pending Withdraw",value:g.pendingWithdrawalCount},{label:"In Privacy Period",value:g.inPrivacyPeriodCount??0},{label:"Microbatch (SOL)",value:g.readyForWithdrawalSol?.toFixed(4)??"0.0000"}],isLoading:i,onRefresh:u})}):null}function X(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function Y(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Z(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function te(s){const o=new Date(s),w=new Date().getTime()-o.getTime(),b=Math.floor(w/6e4),i=Math.floor(b/60),v=Math.floor(i/24);return v>0?`${v}d ago`:i>0?`${i}h ago`:b>0?`${b}m ago`:"just now"}function z(s){return s?new Date(s)>new Date:!0}function ae({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i,onWithdrawalProcessed:v,onAllProcessed:p}){const{listPendingWithdrawals:g,processWithdrawal:q,processAllWithdrawals:N,isLoading:A,error:u,clearError:C}=U.useAdminDeposits(),[d,k]=a.useState([]),[T,E]=a.useState(0),[c,W]=a.useState(0),[f,D]=a.useState(null),[y,n]=a.useState("withdrawalAvailableAt"),[l,O]=a.useState("asc"),L=t=>{y===t?O(l==="asc"?"desc":"asc"):(n(t),O(t==="withdrawalAvailableAt"?"asc":"desc"))},K=a.useMemo(()=>[...d].sort((t,x)=>{let j,$;switch(y){case"userId":j=t.userId.toLowerCase(),$=x.userId.toLowerCase();break;case"amountLamports":j=t.amountLamports??0,$=x.amountLamports??0;break;case"withdrawalAvailableAt":j=t.withdrawalAvailableAt?new Date(t.withdrawalAvailableAt).getTime():0,$=x.withdrawalAvailableAt?new Date(x.withdrawalAvailableAt).getTime():0;break;default:return 0}return j<$?l==="asc"?-1:1:j>$?l==="asc"?1:-1:0}),[d,y,l]),[R,r]=a.useState(null),[m,I]=a.useState(!1),[P,M]=a.useState(null),[F,_]=a.useState(null),S=a.useCallback(async()=>{try{const t=await g({limit:s,offset:c});k(t.deposits),E(t.total),b?.(t),D(null)}catch(t){const x=t&&typeof t=="object"&&"message"in t?String(t.message):"Failed to load pending withdrawals";D(x)}},[s,c,g,b]);a.useEffect(()=>{W(0)},[s]),a.useEffect(()=>{S()},[S]),a.useEffect(()=>{h!==void 0&&S()},[h,S]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const t=setInterval(S,o);return()=>clearInterval(t)},[o,h,S]),a.useEffect(()=>{if(!P)return;const t=setTimeout(()=>M(null),5e3);return()=>clearTimeout(t)},[P]);const V=Math.ceil(T/s),H=Math.floor(c/s)+1,B=t=>{const x=(t-1)*s;W(Math.max(0,Math.min(x,Math.max(0,T-1))))},Q=async(t,x=!1)=>{if(!x&&z(t.withdrawalAvailableAt)){_(t);return}r(t.id),M(null);try{const j=await q(t.id,{force:x});j.success?(M({type:"success",message:`Withdrawal processed: ${j.txSignature?.slice(0,12)}...`}),v?.(j),await S()):M({type:"error",message:j.error||"Failed to process withdrawal"})}catch(j){M({type:"error",message:j instanceof Error?j.message:"Failed to process withdrawal"})}finally{r(null),_(null)}},ee=async()=>{if(d.length!==0){I(!0),M(null);try{const t=await N();t.totalSucceeded>0?M({type:"success",message:`Processed ${t.totalSucceeded}/${t.totalProcessed} withdrawals`}):t.totalFailed>0&&M({type:"error",message:`Failed to process ${t.totalFailed} withdrawals`}),p?.(t),await S()}catch(t){M({type:"error",message:t instanceof Error?t.message:"Failed to process withdrawals"})}finally{I(!1)}}},G=f||u;return G?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:G}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{C(),D(null),S()},children:"Retry"})]}):A&&d.length===0&&!R&&!m?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading withdrawal queue..."})]}):e.jsxs("div",{className:`cedros-admin-withdrawal-queue ${w}`,children:[F&&e.jsx("div",{className:"cedros-admin-modal-overlay",onClick:()=>_(null),onKeyDown:t=>t.key==="Escape"&&_(null),role:"dialog","aria-modal":"true","aria-labelledby":"early-withdrawal-title",children:e.jsxs("div",{className:"cedros-admin-modal cedros-admin-modal-warning",onClick:t=>t.stopPropagation(),onKeyDown:()=>{},role:"document",children:[e.jsx("h3",{id:"early-withdrawal-title",className:"cedros-admin-modal-title",children:"Early Withdrawal Warning"}),e.jsxs("div",{className:"cedros-admin-modal-content",children:[e.jsx("p",{className:"cedros-admin-modal-warning-text",children:e.jsx("strong",{children:"This deposit is still within its privacy period."})}),e.jsx("p",{children:"Processing this withdrawal early may compromise user privacy. The privacy period exists to provide plausible deniability for deposits."}),e.jsxs("p",{className:"cedros-admin-modal-details",children:["User: ",Z(F.userId),e.jsx("br",{}),"Amount: ",X(F.amountLamports),e.jsx("br",{}),"Available at:"," ",F.withdrawalAvailableAt?Y(F.withdrawalAvailableAt):"—"]}),e.jsx("p",{children:"Are you sure you want to process this withdrawal early?"})]}),e.jsxs("div",{className:"cedros-admin-modal-actions",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>_(null),children:"Cancel"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger",onClick:()=>Q(F,!0),disabled:R===F.id,children:R===F.id?"Processing...":"Process Early"})]})]})}),P&&e.jsx("div",{className:`cedros-admin-result cedros-admin-result-${P.type}`,role:"status","aria-live":"polite",children:P.message}),e.jsxs("div",{className:"cedros-admin-withdrawal-queue-header",children:[e.jsx("h4",{className:"cedros-admin-withdrawal-queue-title",children:"Pending Withdrawals"}),e.jsxs("div",{className:"cedros-admin-withdrawal-queue-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[T," pending"]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:S,disabled:A||m,title:"Refresh queue","aria-label":"Refresh queue",children:A&&!m?"...":"↻"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-primary cedros-button-sm",onClick:ee,disabled:A||m||d.length===0,title:"Process all ready withdrawals",children:m?"Processing...":"Process All"})]})]}),d.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No pending withdrawals."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-withdrawal-table",children:[e.jsxs("div",{className:"cedros-admin-withdrawal-thead",children:[e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="userId"?"cedros-admin-sort-active":""}`,onClick:()=>L("userId"),"aria-label":"Sort by user",children:["User"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="userId"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="amountLamports"?"cedros-admin-sort-active":""}`,onClick:()=>L("amountLamports"),"aria-label":"Sort by amount",children:["Amount"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="amountLamports"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="withdrawalAvailableAt"?"cedros-admin-sort-active":""}`,onClick:()=>L("withdrawalAvailableAt"),"aria-label":"Sort by ready since",children:["Ready Since"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="withdrawalAvailableAt"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:"Waiting"}),e.jsx("div",{className:"cedros-admin-withdrawal-th cedros-admin-withdrawal-th-action",children:"Action"})]}),K.map(t=>{const x=z(t.withdrawalAvailableAt),j=R===t.id;return e.jsxs("div",{className:`cedros-admin-withdrawal-row ${x?"cedros-admin-withdrawal-row-early":""}`,onClick:()=>i?.(t),onKeyDown:$=>{($.key==="Enter"||$.key===" ")&&($.preventDefault(),i?.(t))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-withdrawal-td",title:t.userId,children:Z(t.userId)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:X(t.amountLamports)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:t.withdrawalAvailableAt?Y(t.withdrawalAvailableAt):"—"}),e.jsx("div",{className:"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting",children:t.withdrawalAvailableAt?x?"In privacy period":te(t.withdrawalAvailableAt):"—"}),e.jsx("div",{className:"cedros-admin-withdrawal-td cedros-admin-withdrawal-td-action",children:e.jsx("button",{type:"button",className:`cedros-button cedros-button-sm ${x?"cedros-button-warning":"cedros-button-primary"}`,onClick:$=>{$.stopPropagation(),Q(t)},disabled:j||m,title:x?"Early withdrawal (requires confirmation)":"Process this withdrawal",children:j?"...":x?"Early":"Process"})})]},t.id)})]}),V>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>B(H-1),disabled:H<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",H," of ",V," (",T," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>B(H+1),disabled:H>=V,children:"Next"})]})]})]})}function re(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function ie(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function ne(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function oe(s){const o=new Date(s),h=new Date,w=o.getTime()-h.getTime();if(w<=0)return"Ready";const b=Math.floor(w/6e4),i=Math.floor(b/60),v=Math.floor(i/24);if(v>0){const p=i%24;return p>0?`${v}d ${p}h`:`${v}d`}if(i>0){const p=b%60;return p>0?`${i}h ${p}m`:`${i}h`}return`${b}m`}function de({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i}){const{listInPrivacyPeriod:v,isLoading:p,error:g,clearError:q}=U.useAdminDeposits(),[N,A]=a.useState([]),[u,C]=a.useState(0),[d,k]=a.useState(0),[T,E]=a.useState(null),c=a.useCallback(async()=>{try{const n=await v({limit:s,offset:d});A(n.deposits),C(n.total),b?.(n),E(null)}catch(n){const l=n&&typeof n=="object"&&"message"in n?String(n.message):"Failed to load deposits";E(l)}},[s,d,v,b]);a.useEffect(()=>{k(0)},[s]),a.useEffect(()=>{c()},[c]),a.useEffect(()=>{h!==void 0&&c()},[h,c]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const n=setInterval(c,o);return()=>clearInterval(n)},[o,h,c]);const W=Math.ceil(u/s),f=Math.floor(d/s)+1,D=n=>{const l=(n-1)*s;k(Math.max(0,Math.min(l,Math.max(0,u-1))))},y=T||g;return y?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:y}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{q(),E(null),c()},children:"Retry"})]}):p&&N.length===0?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading deposits..."})]}):e.jsxs("div",{className:`cedros-admin-privacy-deposits ${w}`,children:[e.jsxs("div",{className:"cedros-admin-privacy-deposits-header",children:[e.jsx("h4",{className:"cedros-admin-privacy-deposits-title",children:"In Privacy Period"}),e.jsxs("div",{className:"cedros-admin-privacy-deposits-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[u," deposit",u!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:c,disabled:p,title:"Refresh list","aria-label":"Refresh list",children:p?"...":"↻"})]})]}),N.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No deposits in privacy period."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-privacy-table",children:[e.jsxs("div",{className:"cedros-admin-privacy-thead",children:[e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by user",children:["User ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by amount",children:["Amount ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by deposited",children:["Deposited ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by ready in",children:["Ready In ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})})]}),N.map(n=>e.jsxs("div",{className:"cedros-admin-privacy-row",onClick:()=>i?.(n),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),i?.(n))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-privacy-td",title:n.userId,children:ne(n.userId)}),e.jsx("div",{className:"cedros-admin-privacy-td",children:re(n.amountLamports)}),e.jsx("div",{className:"cedros-admin-privacy-td",children:n.completedAt?ie(n.completedAt):"—"}),e.jsx("div",{className:"cedros-admin-privacy-td cedros-admin-privacy-remaining",children:n.withdrawalAvailableAt?oe(n.withdrawalAvailableAt):"—"})]},n.id))]}),W>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>D(f-1),disabled:f<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",f," of ",W," (",u," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>D(f+1),disabled:f>=W,children:"Next"})]})]})]})}function ce(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function le(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function ue(s){return s.length<=16?s:`${s.slice(0,8)}...${s.slice(-6)}`}function me(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function he({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i}){const{listDeposits:v,isLoading:p,error:g,clearError:q}=U.useAdminDeposits(),[N,A]=a.useState([]),[u,C]=a.useState(0),[d,k]=a.useState(0),[T,E]=a.useState(null),[c,W]=a.useState("completedAt"),[f,D]=a.useState("desc"),y=r=>{c===r?D(f==="asc"?"desc":"asc"):(W(r),D("desc"))},n=a.useMemo(()=>[...N].sort((r,m)=>{let I,P;switch(c){case"userId":I=r.userId.toLowerCase(),P=m.userId.toLowerCase();break;case"amountLamports":I=r.amountLamports??0,P=m.amountLamports??0;break;case"completedAt":I=r.completedAt?new Date(r.completedAt).getTime():0,P=m.completedAt?new Date(m.completedAt).getTime():0;break;case"withdrawalTxSignature":I=r.withdrawalTxSignature||"",P=m.withdrawalTxSignature||"";break;default:return 0}return I<P?f==="asc"?-1:1:I>P?f==="asc"?1:-1:0}),[N,c,f]),l=a.useCallback(async()=>{try{const r=await v({status:"withdrawn",limit:s,offset:d});A(r.deposits),C(r.total),b?.(r),E(null)}catch(r){const m=r&&typeof r=="object"&&"message"in r?String(r.message):"Failed to load withdrawal history";E(m)}},[s,d,v,b]);a.useEffect(()=>{k(0)},[s]),a.useEffect(()=>{l()},[l]),a.useEffect(()=>{h!==void 0&&l()},[h,l]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const r=setInterval(l,o);return()=>clearInterval(r)},[o,h,l]);const O=Math.ceil(u/s),L=Math.floor(d/s)+1,K=r=>{const m=(r-1)*s;k(Math.max(0,Math.min(m,Math.max(0,u-1))))},R=T||g;return R?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:R}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{q(),E(null),l()},children:"Retry"})]}):p&&N.length===0?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading withdrawal history..."})]}):e.jsxs("div",{className:`cedros-admin-withdrawal-history ${w}`,children:[e.jsxs("div",{className:"cedros-admin-withdrawal-history-header",children:[e.jsx("h4",{className:"cedros-admin-withdrawal-history-title",children:"Withdrawal History"}),e.jsxs("div",{className:"cedros-admin-withdrawal-history-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[u," withdrawal",u!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:l,disabled:p,title:"Refresh list","aria-label":"Refresh list",children:p?"...":"↻"})]})]}),N.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No withdrawals processed yet."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-history-table",children:[e.jsxs("div",{className:"cedros-admin-history-thead",children:[e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="userId"?"cedros-admin-sort-active":""}`,onClick:()=>y("userId"),"aria-label":"Sort by user",children:["User"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="userId"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="amountLamports"?"cedros-admin-sort-active":""}`,onClick:()=>y("amountLamports"),"aria-label":"Sort by amount",children:["Amount"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="amountLamports"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="completedAt"?"cedros-admin-sort-active":""}`,onClick:()=>y("completedAt"),"aria-label":"Sort by processed",children:["Processed"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="completedAt"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="withdrawalTxSignature"?"cedros-admin-sort-active":""}`,onClick:()=>y("withdrawalTxSignature"),"aria-label":"Sort by transaction",children:["Transaction"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="withdrawalTxSignature"?f==="asc"?"↑":"↓":"↕"})]})})]}),n.map(r=>e.jsxs("div",{className:"cedros-admin-history-row",onClick:()=>i?.(r),onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),i?.(r))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-history-td",title:r.userId,children:me(r.userId)}),e.jsx("div",{className:"cedros-admin-history-td",children:ce(r.amountLamports)}),e.jsx("div",{className:"cedros-admin-history-td",children:r.completedAt?le(r.completedAt):"—"}),e.jsx("div",{className:"cedros-admin-history-td",children:r.withdrawalTxSignature?e.jsx("a",{href:`https://orbmarkets.io/tx/${r.withdrawalTxSignature}`,target:"_blank",rel:"noopener noreferrer",className:"cedros-admin-tx-link",onClick:m=>m.stopPropagation(),title:r.withdrawalTxSignature,children:ue(r.withdrawalTxSignature)}):"—"})]},r.id))]}),O>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>K(L-1),disabled:L<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",L," of ",O," (",u," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>K(L+1),disabled:L>=O,children:"Next"})]})]})]})}exports.AdminPrivacyPeriodDeposits=de;exports.AdminWithdrawalHistory=he;exports.AdminWithdrawalQueue=ae;exports.AdminWithdrawalStats=se;
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),a=require("react"),U=require("./useAdminDeposits-CpLd68oP.cjs"),J=require("./StatsBar-DTUZCwDD.cjs");function se({refreshInterval:s=0,refreshSignal:o,className:h="",onLoad:w}){const{getStats:b,isLoading:i,error:v,clearError:p}=U.useAdminDeposits(),[g,q]=a.useState(null),[N,A]=a.useState(null),u=a.useCallback(async()=>{try{const d=await b();q(d),w?.(d),A(null)}catch(d){const k=d&&typeof d=="object"&&"message"in d?String(d.message):"Failed to load stats";A(k)}},[b,w]);a.useEffect(()=>{u()},[u]),a.useEffect(()=>{o!==void 0&&u()},[o,u]),a.useEffect(()=>{if(o!==void 0||s<=0)return;const d=setInterval(u,s);return()=>clearInterval(d)},[s,o,u]);const C=N||v;return C?e.jsxs("div",{className:`cedros-admin-stats ${h}`,children:[e.jsx("p",{className:"cedros-admin-error",children:C}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{p(),A(null),u()},children:"Retry"})]}):i&&!g?e.jsx("div",{className:`cedros-admin-stats ${h}`,children:e.jsx(J.StatsBar,{stats:[{label:"Total Withdrawn",value:0},{label:"Pending Withdraw",value:0},{label:"In Privacy Period",value:0},{label:"Microbatch (SOL)",value:"0.0000"}],isLoading:!0})}):g?e.jsx("div",{className:`cedros-admin-stats ${h}`,children:e.jsx(J.StatsBar,{stats:[{label:"Total Withdrawn",value:g.totalWithdrawnCount},{label:"Pending Withdraw",value:g.pendingWithdrawalCount},{label:"In Privacy Period",value:g.inPrivacyPeriodCount??0},{label:"Microbatch (SOL)",value:g.readyForWithdrawalSol?.toFixed(4)??"0.0000"}],isLoading:i,onRefresh:u})}):null}function X(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function Y(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Z(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function te(s){const o=new Date(s),w=new Date().getTime()-o.getTime(),b=Math.floor(w/6e4),i=Math.floor(b/60),v=Math.floor(i/24);return v>0?`${v}d ago`:i>0?`${i}h ago`:b>0?`${b}m ago`:"just now"}function z(s){return s?new Date(s)>new Date:!0}function ae({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i,onWithdrawalProcessed:v,onAllProcessed:p}){const{listPendingWithdrawals:g,processWithdrawal:q,processAllWithdrawals:N,isLoading:A,error:u,clearError:C}=U.useAdminDeposits(),[d,k]=a.useState([]),[T,E]=a.useState(0),[c,W]=a.useState(0),[f,D]=a.useState(null),[y,n]=a.useState("withdrawalAvailableAt"),[l,O]=a.useState("asc"),L=t=>{y===t?O(l==="asc"?"desc":"asc"):(n(t),O(t==="withdrawalAvailableAt"?"asc":"desc"))},K=a.useMemo(()=>[...d].sort((t,x)=>{let j,$;switch(y){case"userId":j=t.userId.toLowerCase(),$=x.userId.toLowerCase();break;case"amountLamports":j=t.amountLamports??0,$=x.amountLamports??0;break;case"withdrawalAvailableAt":j=t.withdrawalAvailableAt?new Date(t.withdrawalAvailableAt).getTime():0,$=x.withdrawalAvailableAt?new Date(x.withdrawalAvailableAt).getTime():0;break;default:return 0}return j<$?l==="asc"?-1:1:j>$?l==="asc"?1:-1:0}),[d,y,l]),[R,r]=a.useState(null),[m,I]=a.useState(!1),[P,M]=a.useState(null),[F,_]=a.useState(null),S=a.useCallback(async()=>{try{const t=await g({limit:s,offset:c});k(t.deposits),E(t.total),b?.(t),D(null)}catch(t){const x=t&&typeof t=="object"&&"message"in t?String(t.message):"Failed to load pending withdrawals";D(x)}},[s,c,g,b]);a.useEffect(()=>{W(0)},[s]),a.useEffect(()=>{S()},[S]),a.useEffect(()=>{h!==void 0&&S()},[h,S]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const t=setInterval(S,o);return()=>clearInterval(t)},[o,h,S]),a.useEffect(()=>{if(!P)return;const t=setTimeout(()=>M(null),5e3);return()=>clearTimeout(t)},[P]);const V=Math.ceil(T/s),H=Math.floor(c/s)+1,B=t=>{const x=(t-1)*s;W(Math.max(0,Math.min(x,Math.max(0,T-1))))},Q=async(t,x=!1)=>{if(!x&&z(t.withdrawalAvailableAt)){_(t);return}r(t.id),M(null);try{const j=await q(t.id,{force:x});j.success?(M({type:"success",message:`Withdrawal processed: ${j.txSignature?.slice(0,12)}...`}),v?.(j),await S()):M({type:"error",message:j.error||"Failed to process withdrawal"})}catch(j){M({type:"error",message:j instanceof Error?j.message:"Failed to process withdrawal"})}finally{r(null),_(null)}},ee=async()=>{if(d.length!==0){I(!0),M(null);try{const t=await N();t.totalSucceeded>0?M({type:"success",message:`Processed ${t.totalSucceeded}/${t.totalProcessed} withdrawals`}):t.totalFailed>0&&M({type:"error",message:`Failed to process ${t.totalFailed} withdrawals`}),p?.(t),await S()}catch(t){M({type:"error",message:t instanceof Error?t.message:"Failed to process withdrawals"})}finally{I(!1)}}},G=f||u;return G?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:G}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{C(),D(null),S()},children:"Retry"})]}):A&&d.length===0&&!R&&!m?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading withdrawal queue..."})]}):e.jsxs("div",{className:`cedros-admin-withdrawal-queue ${w}`,children:[F&&e.jsx("div",{className:"cedros-admin-modal-overlay",onClick:()=>_(null),onKeyDown:t=>t.key==="Escape"&&_(null),role:"dialog","aria-modal":"true","aria-labelledby":"early-withdrawal-title",children:e.jsxs("div",{className:"cedros-admin-modal cedros-admin-modal-warning",onClick:t=>t.stopPropagation(),onKeyDown:()=>{},role:"document",children:[e.jsx("h3",{id:"early-withdrawal-title",className:"cedros-admin-modal-title",children:"Early Withdrawal Warning"}),e.jsxs("div",{className:"cedros-admin-modal-content",children:[e.jsx("p",{className:"cedros-admin-modal-warning-text",children:e.jsx("strong",{children:"This deposit is still within its privacy period."})}),e.jsx("p",{children:"Processing this withdrawal early may compromise user privacy. The privacy period exists to provide plausible deniability for deposits."}),e.jsxs("p",{className:"cedros-admin-modal-details",children:["User: ",Z(F.userId),e.jsx("br",{}),"Amount: ",X(F.amountLamports),e.jsx("br",{}),"Available at:"," ",F.withdrawalAvailableAt?Y(F.withdrawalAvailableAt):"—"]}),e.jsx("p",{children:"Are you sure you want to process this withdrawal early?"})]}),e.jsxs("div",{className:"cedros-admin-modal-actions",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>_(null),children:"Cancel"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger",onClick:()=>Q(F,!0),disabled:R===F.id,children:R===F.id?"Processing...":"Process Early"})]})]})}),P&&e.jsx("div",{className:`cedros-admin-result cedros-admin-result-${P.type}`,role:"status","aria-live":"polite",children:P.message}),e.jsxs("div",{className:"cedros-admin-withdrawal-queue-header",children:[e.jsx("h4",{className:"cedros-admin-withdrawal-queue-title",children:"Pending Withdrawals"}),e.jsxs("div",{className:"cedros-admin-withdrawal-queue-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[T," pending"]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:S,disabled:A||m,title:"Refresh queue","aria-label":"Refresh queue",children:A&&!m?"...":"↻"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-primary cedros-button-sm",onClick:ee,disabled:A||m||d.length===0,title:"Process all ready withdrawals",children:m?"Processing...":"Process All"})]})]}),d.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No pending withdrawals."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-withdrawal-table",children:[e.jsxs("div",{className:"cedros-admin-withdrawal-thead",children:[e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="userId"?"cedros-admin-sort-active":""}`,onClick:()=>L("userId"),"aria-label":"Sort by user",children:["User"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="userId"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="amountLamports"?"cedros-admin-sort-active":""}`,onClick:()=>L("amountLamports"),"aria-label":"Sort by amount",children:["Amount"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="amountLamports"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${y==="withdrawalAvailableAt"?"cedros-admin-sort-active":""}`,onClick:()=>L("withdrawalAvailableAt"),"aria-label":"Sort by ready since",children:["Ready Since"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:y==="withdrawalAvailableAt"?l==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-withdrawal-th",children:"Waiting"}),e.jsx("div",{className:"cedros-admin-withdrawal-th cedros-admin-withdrawal-th-action",children:"Action"})]}),K.map(t=>{const x=z(t.withdrawalAvailableAt),j=R===t.id;return e.jsxs("div",{className:`cedros-admin-withdrawal-row ${x?"cedros-admin-withdrawal-row-early":""}`,onClick:()=>i?.(t),onKeyDown:$=>{($.key==="Enter"||$.key===" ")&&($.preventDefault(),i?.(t))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-withdrawal-td",title:t.userId,children:Z(t.userId)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:X(t.amountLamports)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:t.withdrawalAvailableAt?Y(t.withdrawalAvailableAt):"—"}),e.jsx("div",{className:"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting",children:t.withdrawalAvailableAt?x?"In privacy period":te(t.withdrawalAvailableAt):"—"}),e.jsx("div",{className:"cedros-admin-withdrawal-td cedros-admin-withdrawal-td-action",children:e.jsx("button",{type:"button",className:`cedros-button cedros-button-sm ${x?"cedros-button-warning":"cedros-button-primary"}`,onClick:$=>{$.stopPropagation(),Q(t)},disabled:j||m,title:x?"Early withdrawal (requires confirmation)":"Process this withdrawal",children:j?"...":x?"Early":"Process"})})]},t.id)})]}),V>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>B(H-1),disabled:H<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",H," of ",V," (",T," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>B(H+1),disabled:H>=V,children:"Next"})]})]})]})}function re(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function ie(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function ne(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function oe(s){const o=new Date(s),h=new Date,w=o.getTime()-h.getTime();if(w<=0)return"Ready";const b=Math.floor(w/6e4),i=Math.floor(b/60),v=Math.floor(i/24);if(v>0){const p=i%24;return p>0?`${v}d ${p}h`:`${v}d`}if(i>0){const p=b%60;return p>0?`${i}h ${p}m`:`${i}h`}return`${b}m`}function de({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i}){const{listInPrivacyPeriod:v,isLoading:p,error:g,clearError:q}=U.useAdminDeposits(),[N,A]=a.useState([]),[u,C]=a.useState(0),[d,k]=a.useState(0),[T,E]=a.useState(null),c=a.useCallback(async()=>{try{const n=await v({limit:s,offset:d});A(n.deposits),C(n.total),b?.(n),E(null)}catch(n){const l=n&&typeof n=="object"&&"message"in n?String(n.message):"Failed to load deposits";E(l)}},[s,d,v,b]);a.useEffect(()=>{k(0)},[s]),a.useEffect(()=>{c()},[c]),a.useEffect(()=>{h!==void 0&&c()},[h,c]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const n=setInterval(c,o);return()=>clearInterval(n)},[o,h,c]);const W=Math.ceil(u/s),f=Math.floor(d/s)+1,D=n=>{const l=(n-1)*s;k(Math.max(0,Math.min(l,Math.max(0,u-1))))},y=T||g;return y?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:y}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{q(),E(null),c()},children:"Retry"})]}):p&&N.length===0?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading deposits..."})]}):e.jsxs("div",{className:`cedros-admin-privacy-deposits ${w}`,children:[e.jsxs("div",{className:"cedros-admin-privacy-deposits-header",children:[e.jsx("h4",{className:"cedros-admin-privacy-deposits-title",children:"In Privacy Period"}),e.jsxs("div",{className:"cedros-admin-privacy-deposits-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[u," deposit",u!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:c,disabled:p,title:"Refresh list","aria-label":"Refresh list",children:p?"...":"↻"})]})]}),N.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No deposits in privacy period."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-privacy-table",children:[e.jsxs("div",{className:"cedros-admin-privacy-thead",children:[e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by user",children:["User ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by amount",children:["Amount ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by deposited",children:["Deposited ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})}),e.jsx("div",{className:"cedros-admin-privacy-th",children:e.jsxs("button",{type:"button",className:"cedros-admin-sort-button","aria-label":"Sort by ready in",children:["Ready In ",e.jsx("span",{className:"cedros-admin-sort-icon",children:"↕"})]})})]}),N.map(n=>e.jsxs("div",{className:"cedros-admin-privacy-row",onClick:()=>i?.(n),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),i?.(n))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-privacy-td",title:n.userId,children:ne(n.userId)}),e.jsx("div",{className:"cedros-admin-privacy-td",children:re(n.amountLamports)}),e.jsx("div",{className:"cedros-admin-privacy-td",children:n.completedAt?ie(n.completedAt):"—"}),e.jsx("div",{className:"cedros-admin-privacy-td cedros-admin-privacy-remaining",children:n.withdrawalAvailableAt?oe(n.withdrawalAvailableAt):"—"})]},n.id))]}),W>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>D(f-1),disabled:f<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",f," of ",W," (",u," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>D(f+1),disabled:f>=W,children:"Next"})]})]})]})}function ce(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function le(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function ue(s){return s.length<=16?s:`${s.slice(0,8)}...${s.slice(-6)}`}function me(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function he({pageSize:s=20,refreshInterval:o=0,refreshSignal:h,className:w="",onLoad:b,onItemClick:i}){const{listDeposits:v,isLoading:p,error:g,clearError:q}=U.useAdminDeposits(),[N,A]=a.useState([]),[u,C]=a.useState(0),[d,k]=a.useState(0),[T,E]=a.useState(null),[c,W]=a.useState("completedAt"),[f,D]=a.useState("desc"),y=r=>{c===r?D(f==="asc"?"desc":"asc"):(W(r),D("desc"))},n=a.useMemo(()=>[...N].sort((r,m)=>{let I,P;switch(c){case"userId":I=r.userId.toLowerCase(),P=m.userId.toLowerCase();break;case"amountLamports":I=r.amountLamports??0,P=m.amountLamports??0;break;case"completedAt":I=r.completedAt?new Date(r.completedAt).getTime():0,P=m.completedAt?new Date(m.completedAt).getTime():0;break;case"withdrawalTxSignature":I=r.withdrawalTxSignature||"",P=m.withdrawalTxSignature||"";break;default:return 0}return I<P?f==="asc"?-1:1:I>P?f==="asc"?1:-1:0}),[N,c,f]),l=a.useCallback(async()=>{try{const r=await v({status:"withdrawn",limit:s,offset:d});A(r.deposits),C(r.total),b?.(r),E(null)}catch(r){const m=r&&typeof r=="object"&&"message"in r?String(r.message):"Failed to load withdrawal history";E(m)}},[s,d,v,b]);a.useEffect(()=>{k(0)},[s]),a.useEffect(()=>{l()},[l]),a.useEffect(()=>{h!==void 0&&l()},[h,l]),a.useEffect(()=>{if(h!==void 0||o<=0)return;const r=setInterval(l,o);return()=>clearInterval(r)},[o,h,l]);const O=Math.ceil(u/s),L=Math.floor(d/s)+1,K=r=>{const m=(r-1)*s;k(Math.max(0,Math.min(m,Math.max(0,u-1))))},R=T||g;return R?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${w}`,children:[e.jsx("p",{className:"cedros-admin-error",children:R}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{q(),E(null),l()},children:"Retry"})]}):p&&N.length===0?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${w}`,children:[e.jsx("span",{className:"cedros-admin-loading-indicator"}),e.jsx("span",{className:"cedros-admin-loading-text",children:"Loading withdrawal history..."})]}):e.jsxs("div",{className:`cedros-admin-withdrawal-history ${w}`,children:[e.jsxs("div",{className:"cedros-admin-withdrawal-history-header",children:[e.jsx("h4",{className:"cedros-admin-withdrawal-history-title",children:"Withdrawal History"}),e.jsxs("div",{className:"cedros-admin-withdrawal-history-actions",children:[e.jsxs("span",{className:"cedros-admin-queue-count",children:[u," withdrawal",u!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:l,disabled:p,title:"Refresh list","aria-label":"Refresh list",children:p?"...":"↻"})]})]}),N.length===0?e.jsx("div",{className:"cedros-admin-empty",children:e.jsx("p",{className:"cedros-admin-empty-message",children:"No withdrawals processed yet."})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"cedros-admin-history-table",children:[e.jsxs("div",{className:"cedros-admin-history-thead",children:[e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="userId"?"cedros-admin-sort-active":""}`,onClick:()=>y("userId"),"aria-label":"Sort by user",children:["User"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="userId"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="amountLamports"?"cedros-admin-sort-active":""}`,onClick:()=>y("amountLamports"),"aria-label":"Sort by amount",children:["Amount"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="amountLamports"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="completedAt"?"cedros-admin-sort-active":""}`,onClick:()=>y("completedAt"),"aria-label":"Sort by processed",children:["Processed"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="completedAt"?f==="asc"?"↑":"↓":"↕"})]})}),e.jsx("div",{className:"cedros-admin-history-th",children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${c==="withdrawalTxSignature"?"cedros-admin-sort-active":""}`,onClick:()=>y("withdrawalTxSignature"),"aria-label":"Sort by transaction",children:["Transaction"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:c==="withdrawalTxSignature"?f==="asc"?"↑":"↓":"↕"})]})})]}),n.map(r=>e.jsxs("div",{className:"cedros-admin-history-row",onClick:()=>i?.(r),onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),i?.(r))},role:i?"button":void 0,tabIndex:i?0:void 0,children:[e.jsx("div",{className:"cedros-admin-history-td",title:r.userId,children:me(r.userId)}),e.jsx("div",{className:"cedros-admin-history-td",children:ce(r.amountLamports)}),e.jsx("div",{className:"cedros-admin-history-td",children:r.completedAt?le(r.completedAt):"—"}),e.jsx("div",{className:"cedros-admin-history-td",children:r.withdrawalTxSignature?e.jsx("a",{href:`https://orbmarkets.io/tx/${r.withdrawalTxSignature}`,target:"_blank",rel:"noopener noreferrer",className:"cedros-admin-tx-link",onClick:m=>m.stopPropagation(),title:r.withdrawalTxSignature,children:ue(r.withdrawalTxSignature)}):"—"})]},r.id))]}),O>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>K(L-1),disabled:L<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",L," of ",O," (",u," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>K(L+1),disabled:L>=O,children:"Next"})]})]})]})}exports.AdminPrivacyPeriodDeposits=de;exports.AdminWithdrawalHistory=he;exports.AdminWithdrawalQueue=ae;exports.AdminWithdrawalStats=se;
|