@cedros/login-react 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdminDepositList-CyT4VBH8.js +311 -0
- package/dist/AdminDepositList-CyT4VBH8.js.map +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs.map +1 -0
- package/dist/{AdminWithdrawalHistory-BGjfrIe3.js → AdminWithdrawalHistory-Cud-yuWy.js} +295 -283
- package/dist/AdminWithdrawalHistory-Cud-yuWy.js.map +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs.map +1 -0
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs → AuthenticationSettings-CjGGqbcS.cjs} +1 -1
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs.map → AuthenticationSettings-CjGGqbcS.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js → AuthenticationSettings-DGWktSVw.js} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js.map → AuthenticationSettings-DGWktSVw.js.map} +1 -1
- package/dist/{AuthenticationSettings-CR_i6TTS.js → AuthenticationSettings-Dg6ATgOl.js} +170 -140
- package/dist/{AuthenticationSettings-CR_i6TTS.js.map → AuthenticationSettings-Dg6ATgOl.js.map} +1 -1
- package/dist/AuthenticationSettings-HhrUAmM6.cjs +1 -0
- package/dist/{AuthenticationSettings-BPAh1my6.cjs.map → AuthenticationSettings-HhrUAmM6.cjs.map} +1 -1
- package/dist/AutosaveStatus-BDWxAg4U.cjs +1 -0
- package/dist/AutosaveStatus-BDWxAg4U.cjs.map +1 -0
- package/dist/{AutosaveStatus-N4uNS6-2.js → AutosaveStatus-DeViUyyI.js} +1 -7
- package/dist/AutosaveStatus-DeViUyyI.js.map +1 -0
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs → CreditSystemSettings-BykhytcS.cjs} +1 -1
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-BykhytcS.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js → CreditSystemSettings-CSlsQynZ.js} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js.map → CreditSystemSettings-CSlsQynZ.js.map} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs → CreditSystemSettings-CyFQbXMh.cjs} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CyFQbXMh.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js → CreditSystemSettings-DBr7QS59.js} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js.map → CreditSystemSettings-DBr7QS59.js.map} +1 -1
- package/dist/DepositsSection-BkKUS4vk.cjs +1 -0
- package/dist/DepositsSection-BkKUS4vk.cjs.map +1 -0
- package/dist/{DepositsSection-DA89uR9A.js → DepositsSection-DD9MKUFt.js} +20 -14
- package/dist/DepositsSection-DD9MKUFt.js.map +1 -0
- package/dist/EmailRegisterForm-Pvm3I8GP.cjs +1 -0
- package/dist/{EmailRegisterForm-CxktR-4J.cjs.map → EmailRegisterForm-Pvm3I8GP.cjs.map} +1 -1
- package/dist/{EmailRegisterForm-BrDL3BZy.js → EmailRegisterForm-nI0BOIxR.js} +2 -2
- package/dist/{EmailRegisterForm-BrDL3BZy.js.map → EmailRegisterForm-nI0BOIxR.js.map} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs → EmailSettings-Bup2rCgU.cjs} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs.map → EmailSettings-Bup2rCgU.cjs.map} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js → EmailSettings-C04qdJCz.js} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js.map → EmailSettings-C04qdJCz.js.map} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs → EmailSettings-C0Ss6Cne.cjs} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs.map → EmailSettings-C0Ss6Cne.cjs.map} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js → EmailSettings-DAqH_xum.js} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js.map → EmailSettings-DAqH_xum.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs → EmbeddedWalletSettings-B0XkNuPR.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs.map → EmbeddedWalletSettings-B0XkNuPR.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js → EmbeddedWalletSettings-DDFQhQOw.js} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js.map → EmbeddedWalletSettings-DDFQhQOw.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js → EmbeddedWalletSettings-DYh884HP.js} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js.map → EmbeddedWalletSettings-DYh884HP.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs → EmbeddedWalletSettings-YX0Dk_b_.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs.map → EmbeddedWalletSettings-YX0Dk_b_.cjs.map} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js → GoogleLoginButton-CXwp4LsQ.js} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js.map → GoogleLoginButton-CXwp4LsQ.js.map} +1 -1
- package/dist/GoogleLoginButton-zS_69-KV.cjs +1 -0
- package/dist/{GoogleLoginButton-BydKswn4.cjs.map → GoogleLoginButton-zS_69-KV.cjs.map} +1 -1
- package/dist/PermissionsSection-BPbE-hNx.cjs +1 -0
- package/dist/{PermissionsSection-CKXXDfqi.cjs.map → PermissionsSection-BPbE-hNx.cjs.map} +1 -1
- package/dist/{PermissionsSection-BGaj_sI7.js → PermissionsSection-CighC1p6.js} +3 -3
- package/dist/{PermissionsSection-BGaj_sI7.js.map → PermissionsSection-CighC1p6.js.map} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs → ServerSettings-CInJe4jY.cjs} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs.map → ServerSettings-CInJe4jY.cjs.map} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs → ServerSettings-CwnEI-PC.cjs} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs.map → ServerSettings-CwnEI-PC.cjs.map} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js → ServerSettings-DVEtfDQo.js} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js.map → ServerSettings-DVEtfDQo.js.map} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js → ServerSettings-DakhpYcO.js} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js.map → ServerSettings-DakhpYcO.js.map} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs → SettingsPageLayout-C6DWgyXS.cjs} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs.map → SettingsPageLayout-C6DWgyXS.cjs.map} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js → SettingsPageLayout-CLJI6hFQ.js} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js.map → SettingsPageLayout-CLJI6hFQ.js.map} +1 -1
- package/dist/SolanaLoginButton-BjOxpE1C.cjs +1 -0
- package/dist/{SolanaLoginButton-fAW7kRUu.cjs.map → SolanaLoginButton-BjOxpE1C.cjs.map} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js → SolanaLoginButton-P22QjBaO.js} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js.map → SolanaLoginButton-P22QjBaO.js.map} +1 -1
- package/dist/{TeamSection-CvrCoa9D.js → TeamSection-BIECkp7g.js} +2 -2
- package/dist/{TeamSection-CvrCoa9D.js.map → TeamSection-BIECkp7g.js.map} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs → TeamSection-BOH9pv_E.cjs} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs.map → TeamSection-BOH9pv_E.cjs.map} +1 -1
- package/dist/UsersSection-e6q7FHzx.cjs +1 -0
- package/dist/UsersSection-e6q7FHzx.cjs.map +1 -0
- package/dist/UsersSection-t-zm0jZW.js +33 -0
- package/dist/UsersSection-t-zm0jZW.js.map +1 -0
- package/dist/{WebhookSettings-DXNH5bal.cjs → WebhookSettings-BMeykdRP.cjs} +1 -1
- package/dist/{WebhookSettings-DXNH5bal.cjs.map → WebhookSettings-BMeykdRP.cjs.map} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs → WebhookSettings-BNVooF0B.cjs} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs.map → WebhookSettings-BNVooF0B.cjs.map} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js → WebhookSettings-DXeDYhAe.js} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js.map → WebhookSettings-DXeDYhAe.js.map} +1 -1
- package/dist/{WebhookSettings-bUg2u_p0.js → WebhookSettings-DdbxNPZ9.js} +1 -1
- package/dist/{WebhookSettings-bUg2u_p0.js.map → WebhookSettings-DdbxNPZ9.js.map} +1 -1
- package/dist/WithdrawalsSection-sljIyeaz.cjs +1 -0
- package/dist/WithdrawalsSection-sljIyeaz.cjs.map +1 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js +27 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js.map +1 -0
- package/dist/admin-only.cjs +1 -1
- package/dist/admin-only.js +1 -1
- package/dist/email-only.cjs +1 -1
- package/dist/email-only.d.ts +13 -2
- package/dist/email-only.js +3 -3
- package/dist/google-only.cjs +1 -1
- package/dist/google-only.d.ts +13 -2
- package/dist/google-only.js +3 -3
- package/dist/index.cjs +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +31 -8
- package/dist/index.js +1066 -1098
- package/dist/index.js.map +1 -1
- package/dist/{plugin-5qRh-YhX.js → plugin-CW_ycXye.js} +1 -1
- package/dist/{plugin-5qRh-YhX.js.map → plugin-CW_ycXye.js.map} +1 -1
- package/dist/{plugin-BtYBW6JY.cjs → plugin-CnbFRy5o.cjs} +1 -1
- package/dist/{plugin-BtYBW6JY.cjs.map → plugin-CnbFRy5o.cjs.map} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs → shamir-4DyQMJCk.cjs} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs.map → shamir-4DyQMJCk.cjs.map} +1 -1
- package/dist/{shamir-B0wConeK.js → shamir-L-s-Tp1Z.js} +1 -1
- package/dist/{shamir-B0wConeK.js.map → shamir-L-s-Tp1Z.js.map} +1 -1
- package/dist/silentWalletEnroll-BgTb4H5I.cjs +1 -0
- package/dist/{silentWalletEnroll-B8pgdKZO.cjs.map → silentWalletEnroll-BgTb4H5I.cjs.map} +1 -1
- package/dist/{silentWalletEnroll-DR2kPw7W.js → silentWalletEnroll-DWt6Pr3B.js} +3 -3
- package/dist/{silentWalletEnroll-DR2kPw7W.js.map → silentWalletEnroll-DWt6Pr3B.js.map} +1 -1
- package/dist/solana-only.cjs +1 -1
- package/dist/solana-only.d.ts +13 -2
- package/dist/solana-only.js +3 -3
- package/dist/{useAdminDeposits-BDY5KJ0-.js → useAdminDeposits-BTSyeAfg.js} +1 -1
- package/dist/{useAdminDeposits-BDY5KJ0-.js.map → useAdminDeposits-BTSyeAfg.js.map} +1 -1
- package/dist/useAdminDeposits-BkkCwHWp.cjs +1 -0
- package/dist/{useAdminDeposits-Dvx3_UUE.cjs.map → useAdminDeposits-BkkCwHWp.cjs.map} +1 -1
- package/dist/{useAuth-Bge6KaWN.js → useAuth-C3dpk0po.js} +597 -561
- package/dist/useAuth-C3dpk0po.js.map +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs.map +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs.map +1 -0
- package/dist/{apiClient-B2JxVPlH.js → useCedrosLogin-_94MmGGq.js} +29 -29
- package/dist/useCedrosLogin-_94MmGGq.js.map +1 -0
- package/dist/{useOrgs-Be3KH4ib.js → useOrgs-C3pzMA9h.js} +1 -1
- package/dist/{useOrgs-Be3KH4ib.js.map → useOrgs-C3pzMA9h.js.map} +1 -1
- package/dist/useOrgs-DDVRCaVi.cjs +1 -0
- package/dist/{useOrgs-CVbacmaQ.cjs.map → useOrgs-DDVRCaVi.cjs.map} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js → useSystemSettings-DBlAMjFi.js} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js.map → useSystemSettings-DBlAMjFi.js.map} +1 -1
- package/dist/useSystemSettings-DRrreszl.cjs +1 -0
- package/dist/{useSystemSettings-D9Cr7ZTl.cjs.map → useSystemSettings-DRrreszl.cjs.map} +1 -1
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs +1 -0
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs.map +1 -0
- package/dist/{AdminUserDetail-DHFDzY8B.js → useUsersStatsSummary-NjEFvWuz.js} +431 -380
- package/dist/useUsersStatsSummary-NjEFvWuz.js.map +1 -0
- package/package.json +1 -1
- package/dist/AdminDepositList-Cx0xRwES.js +0 -305
- package/dist/AdminDepositList-Cx0xRwES.js.map +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs.map +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs.map +0 -1
- package/dist/AdminUserDetail-DHFDzY8B.js.map +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs.map +0 -1
- package/dist/AdminWithdrawalHistory-BGjfrIe3.js.map +0 -1
- package/dist/AuthenticationSettings-BPAh1my6.cjs +0 -1
- package/dist/AutosaveStatus-CYkC2aI_.cjs +0 -1
- package/dist/AutosaveStatus-CYkC2aI_.cjs.map +0 -1
- package/dist/AutosaveStatus-N4uNS6-2.js.map +0 -1
- package/dist/DepositsSection-DA89uR9A.js.map +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs.map +0 -1
- package/dist/EmailRegisterForm-CxktR-4J.cjs +0 -1
- package/dist/GoogleLoginButton-BydKswn4.cjs +0 -1
- package/dist/PermissionsSection-CKXXDfqi.cjs +0 -1
- package/dist/SolanaLoginButton-fAW7kRUu.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs.map +0 -1
- package/dist/UsersSection-Dbh9PTSA.js +0 -83
- package/dist/UsersSection-Dbh9PTSA.js.map +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs.map +0 -1
- package/dist/WithdrawalsSection-CN-lLnqX.js +0 -20
- package/dist/WithdrawalsSection-CN-lLnqX.js.map +0 -1
- package/dist/apiClient-B2JxVPlH.js.map +0 -1
- package/dist/apiClient-CTTKhsYb.cjs +0 -1
- package/dist/apiClient-CTTKhsYb.cjs.map +0 -1
- package/dist/silentWalletEnroll-B8pgdKZO.cjs +0 -1
- package/dist/useAdminDeposits-Dvx3_UUE.cjs +0 -1
- package/dist/useAuth-Bge6KaWN.js.map +0 -1
- package/dist/useAuth-DhIDTLRd.cjs +0 -1
- package/dist/useAuth-DhIDTLRd.cjs.map +0 -1
- package/dist/useOrgs-CVbacmaQ.cjs +0 -1
- package/dist/useSystemSettings-D9Cr7ZTl.cjs +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUserDetail-DHFDzY8B.js","sources":["../src/utils/adminUserApi.ts","../src/hooks/useAdminUsers.ts","../src/components/admin/AdminUserList.tsx","../src/components/admin/AdminUserDetail.tsx"],"sourcesContent":["import type {\n AdminUser,\n AdminUserChatsResponse,\n AdminUserCreditsResponse,\n AdminUserStatsResponse,\n AdjustCreditsRequest,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for admin user operations\n *\n * Requires system admin privileges.\n */\nexport class AdminUserApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all users in the system\n */\n async listUsers(params?: ListUsersParams): Promise<ListAdminUsersResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<ListAdminUsersResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to list users');\n }\n }\n\n /**\n * Get a specific user by ID\n */\n async getUser(userId: string): Promise<AdminUser> {\n try {\n return await this.client.get<AdminUser>(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user');\n }\n }\n\n /**\n * Set a user's system admin status\n */\n async setSystemAdmin(userId: string, isAdmin: boolean): Promise<void> {\n try {\n await this.client.patch(`/admin/users/${userId}/system-admin`, { isAdmin });\n } catch (error) {\n throw handleApiError(error, 'Failed to update system admin status');\n }\n }\n\n /**\n * Update a user's profile\n */\n async updateUser(userId: string, data: UpdateUserRequest): Promise<AdminUser> {\n try {\n return await this.client.patch<AdminUser>(`/admin/users/${userId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update user');\n }\n }\n\n /**\n * Delete a user\n */\n async deleteUser(userId: string): Promise<void> {\n try {\n await this.client.delete(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to delete user');\n }\n }\n\n /**\n * Send a password reset email to a user\n */\n async forcePasswordReset(userId: string): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/force-password-reset`, {});\n } catch (error) {\n throw handleApiError(error, 'Failed to send password reset email');\n }\n }\n\n /**\n * Adjust a user's credits\n */\n async adjustCredits(userId: string, data: AdjustCreditsRequest): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/credits`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to adjust credits');\n }\n }\n\n /**\n * Get a user's deposit history\n */\n async getUserDeposits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminDepositListResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/deposits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminDepositListResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user deposits');\n }\n }\n\n /**\n * Get a user's credit stats and transaction history\n */\n async getUserCredits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserCreditsResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/credits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserCreditsResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user credits');\n }\n }\n\n /**\n * Get a user's withdrawal history\n */\n async getUserWithdrawalHistory(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/withdrawal-history${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserWithdrawalHistoryResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user withdrawal history');\n }\n }\n\n /**\n * Get a user's chat history (from cedros-pay)\n * Only available when cedros-pay is enabled.\n */\n async getUserChats(userId: string, params?: ListUsersParams): Promise<AdminUserChatsResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/chats${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserChatsResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user chat history');\n }\n }\n\n /**\n * Get user statistics by auth method\n */\n async getStats(): Promise<AdminUserStatsResponse> {\n try {\n return await this.client.get<AdminUserStatsResponse>('/admin/users/stats');\n } catch (error) {\n throw handleApiError(error, 'Failed to get user stats');\n }\n }\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { AdminUserApiClient } from '../utils/adminUserApi';\nimport type {\n AdminUser,\n AdminUserChatsResponse,\n AdminUserCreditsResponse,\n AdminUserStatsResponse,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n UseAdminUsersReturn,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\n\n/**\n * Hook for admin user management operations\n *\n * Provides methods to list all users, get individual users,\n * and manage system admin status. Requires system admin privileges.\n *\n * @example\n * ```tsx\n * function UserManagement() {\n * const { users, total, isLoading, listUsers, setSystemAdmin } = useAdminUsers();\n *\n * useEffect(() => {\n * listUsers({ limit: 20 });\n * }, [listUsers]);\n *\n * return (\n * <AdminUserList\n * users={users}\n * total={total}\n * isLoading={isLoading}\n * onToggleAdmin={(userId, isAdmin) => setSystemAdmin(userId, isAdmin)}\n * />\n * );\n * }\n * ```\n */\nexport function useAdminUsers(): UseAdminUsersReturn {\n const { config, _internal } = useCedrosLogin();\n\n const [users, setUsers] = useState<AdminUser[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastParams, setLastParams] = useState<ListUsersParams>({});\n\n const apiClient = useMemo(\n () =>\n new AdminUserApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const listUsers = useCallback(\n async (params?: ListUsersParams): Promise<ListAdminUsersResponse> => {\n setIsLoading(true);\n setError(null);\n setLastParams(params || {});\n\n try {\n const response = await apiClient.listUsers(params);\n setUsers(response.users);\n setTotal(response.total);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to list users');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUser = useCallback(\n async (userId: string): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUser(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const setSystemAdmin = useCallback(\n async (userId: string, isAdmin: boolean): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.setSystemAdmin(userId, isAdmin);\n // Update local state\n setUsers((prev) =>\n prev.map((user) => (user.id === userId ? { ...user, isSystemAdmin: isAdmin } : user))\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update admin status');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const updateUser = useCallback(\n async (userId: string, data: UpdateUserRequest): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const updated = await apiClient.updateUser(userId, data);\n // Update local state\n setUsers((prev) => prev.map((user) => (user.id === userId ? updated : user)));\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const deleteUser = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.deleteUser(userId);\n // Remove from local state\n setUsers((prev) => prev.filter((user) => user.id !== userId));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const forcePasswordReset = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.forcePasswordReset(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to send password reset');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const adjustCredits = useCallback(\n async (userId: string, amount: number, reason: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.adjustCredits(userId, { amount, reason });\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to adjust credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserDeposits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminDepositListResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserDeposits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user deposits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserCredits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminUserCreditsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserCredits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserWithdrawalHistory = useCallback(\n async (\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserWithdrawalHistory(userId, params);\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error('Failed to get user withdrawal history');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserChats = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminUserChatsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserChats(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user chat history');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminUserStatsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getStats();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user stats');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const refresh = useCallback(async () => {\n await listUsers(lastParams);\n }, [listUsers, lastParams]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n users,\n total,\n isLoading,\n error,\n listUsers,\n getUser,\n setSystemAdmin,\n updateUser,\n deleteUser,\n forcePasswordReset,\n adjustCredits,\n getUserDeposits,\n getUserCredits,\n getUserWithdrawalHistory,\n getUserChats,\n getStats,\n refresh,\n clearError,\n };\n}\n","/**\n * Admin user list component\n *\n * Displays all registered users in the system with management actions.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type { AdminUser, ListAdminUsersResponse } from '../../types';\n\ntype SortField = 'name' | 'createdAt' | 'lastLoginAt' | 'balanceLamports';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminUserListProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Current user's ID (to highlight current user) */\n currentUserId?: string;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: ListAdminUsersResponse) => void;\n /** Callback when a user is clicked */\n onUserClick?: (user: AdminUser) => void;\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 });\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\nfunction formatBalance(lamports: number | undefined): string {\n if (lamports === undefined || lamports === null) return '-';\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n const sol = lamports / 1_000_000_000;\n return sol.toFixed(4);\n}\n\n/**\n * Admin user list display\n *\n * Shows all registered users.\n */\nexport function AdminUserList({\n pageSize = 20,\n refreshInterval = 0,\n currentUserId,\n className = '',\n onLoad,\n onUserClick,\n}: AdminUserListProps) {\n const { users, total, isLoading, error, listUsers, clearError } = useAdminUsers();\n\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<SortField>('createdAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: SortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n // P-05: Client-side sort applies only to the current page of results.\n // For cross-page sorting, add server-side ORDER BY with sort parameters.\n const sortedUsers = useMemo(() => {\n return [...users].sort((a, b) => {\n let aVal: string | number | null;\n let bVal: string | number | null;\n\n switch (sortField) {\n case 'name':\n aVal = (a.name || a.email || '').toLowerCase();\n bVal = (b.name || b.email || '').toLowerCase();\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'lastLoginAt':\n aVal = a.lastLoginAt ? new Date(a.lastLoginAt).getTime() : 0;\n bVal = b.lastLoginAt ? new Date(b.lastLoginAt).getTime() : 0;\n break;\n case 'balanceLamports':\n aVal = a.balanceLamports ?? 0;\n bVal = b.balanceLamports ?? 0;\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 }, [users, sortField, sortOrder]);\n\n const fetchUsers = useCallback(async () => {\n try {\n const result = await listUsers({ limit: pageSize, offset });\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load users');\n }\n }, [pageSize, offset, listUsers, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchUsers, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchUsers]);\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 // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error?.message}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchUsers();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && users.length === 0) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading users...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-user-list ${className}`}>\n <div className=\"cedros-admin-user-list-header\">\n <h4 className=\"cedros-admin-user-list-title\">All Users</h4>\n <div className=\"cedros-admin-user-list-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} user{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchUsers}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {users.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No users found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-user-table\">\n <div className=\"cedros-admin-user-thead\">\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'name' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('name')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'name' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-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 registered date\"\n >\n Registered{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'createdAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'lastLoginAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('lastLoginAt')}\n aria-label=\"Sort by last login\"\n >\n Last Login{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'lastLoginAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'balanceLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('balanceLamports')}\n aria-label=\"Sort by balance\"\n >\n Balance{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'balanceLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedUsers.map((user) => {\n const isCurrentUser = user.id === currentUserId;\n\n return (\n <div\n key={user.id}\n className={`cedros-admin-user-row ${isCurrentUser ? 'cedros-admin-user-row-current' : ''}`}\n onClick={() => onUserClick?.(user)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onUserClick?.(user);\n }\n }}\n role={onUserClick ? 'button' : undefined}\n tabIndex={onUserClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-user-td cedros-admin-user-info\">\n <div className=\"cedros-admin-user-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-details\">\n <span className=\"cedros-admin-user-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </span>\n <span className=\"cedros-admin-user-email\" title={user.email}>\n {user.email || truncateId(user.id)}\n </span>\n </div>\n </div>\n <div className=\"cedros-admin-user-td\">{formatDate(user.createdAt)}</div>\n <div className=\"cedros-admin-user-td\">\n {user.lastLoginAt ? formatDate(user.lastLoginAt) : '-'}\n </div>\n <div className=\"cedros-admin-user-td\">{formatBalance(user.balanceLamports)}</div>\n </div>\n );\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","/**\n * Admin user detail component\n *\n * Displays detailed information about a specific user including:\n * - Account information (email, auth methods, admin status)\n * - Credit balance and stats\n * - Deposit history\n * - Transaction history\n *\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type {\n AdminUser,\n AdminUserCreditsResponse,\n AdminUserChatsResponse,\n AdminChatSession,\n AdminCreditTransactionItem,\n ListUsersParams,\n} from '../../types';\nimport type { AdminDepositListResponse, AdminDepositItem } from '../../types/deposit';\n\nexport interface AdminUserDetailProps {\n /** User ID to display */\n userId: string;\n /** Callback when back button is clicked */\n onBack: () => void;\n /** Current user's ID (to prevent self-demotion) */\n currentUserId?: string;\n /** Callback when edit is clicked (parent handles modal) */\n onEditUser?: (user: AdminUser) => void;\n /** Callback when credits adjustment is clicked (parent handles modal) */\n onAdjustCredits?: (user: AdminUser) => void;\n /** Whether cedros-pay is enabled (shows Chats tab) */\n cedrosPayEnabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\ntype TabId = 'deposits' | 'transactions' | 'chats';\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 });\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSol(lamports: number | null | undefined): string {\n if (lamports === null || lamports === undefined) return '—';\n const sol = lamports / 1_000_000_000;\n return `${sol.toFixed(4)} SOL`;\n}\n\nfunction formatCredits(lamports: number | null | undefined): string {\n if (lamports === null || lamports === undefined) return '—';\n // Credits are stored in lamports but displayed as a simple number\n const credits = lamports / 1_000_000_000;\n return credits.toFixed(4);\n}\n\nfunction formatTxType(txType: string): string {\n const typeMap: Record<string, string> = {\n DEPOSIT: 'Deposit',\n SPEND: 'Spend',\n ADJUSTMENT: 'Adjustment',\n REFUND: 'Refund',\n };\n return typeMap[txType.toUpperCase()] || txType;\n}\n\nfunction formatTxDescription(txType: string, referenceType?: string): string {\n if (referenceType) {\n const refMap: Record<string, string> = {\n deposit: 'Credit deposit',\n purchase: 'Purchase',\n api_call: 'API usage',\n subscription: 'Subscription',\n refund: 'Refund',\n bonus: 'Bonus credit',\n promo: 'Promotional credit',\n correction: 'Balance correction',\n };\n return refMap[referenceType.toLowerCase()] || referenceType;\n }\n // Fallback based on tx type\n const typeDescriptions: Record<string, string> = {\n DEPOSIT: 'Credit added',\n SPEND: 'Credit used',\n ADJUSTMENT: 'Manual adjustment',\n REFUND: 'Credit refunded',\n };\n return typeDescriptions[txType.toUpperCase()] || '—';\n}\n\n/**\n * Admin user detail display\n *\n * Shows comprehensive user information with deposit and credit history.\n */\nexport function AdminUserDetail({\n userId,\n onBack,\n currentUserId,\n onEditUser,\n onAdjustCredits,\n cedrosPayEnabled = false,\n className = '',\n}: AdminUserDetailProps) {\n const {\n isLoading,\n getUser,\n getUserDeposits,\n getUserCredits,\n getUserChats,\n deleteUser,\n forcePasswordReset,\n clearError,\n } = useAdminUsers();\n\n const [user, setUser] = useState<AdminUser | null>(null);\n const [credits, setCredits] = useState<AdminUserCreditsResponse | null>(null);\n const [deposits, setDeposits] = useState<AdminDepositListResponse | null>(null);\n const [chats, setChats] = useState<AdminUserChatsResponse | null>(null);\n const [activeTab, setActiveTab] = useState<TabId>('deposits');\n const [userError, setUserError] = useState<string | null>(null);\n const [creditsError, setCreditsError] = useState<string | null>(null);\n const [depositsError, setDepositsError] = useState<string | null>(null);\n const [chatsError, setChatsError] = useState<string | null>(null);\n const [actionInProgress, setActionInProgress] = useState(false);\n\n // Pagination state\n const [depositsOffset, setDepositsOffset] = useState(0);\n const [transactionsOffset, setTransactionsOffset] = useState(0);\n const [chatsOffset, setChatsOffset] = useState(0);\n const pageSize = 10;\n\n const fetchUser = useCallback(async () => {\n try {\n const userData = await getUser(userId);\n setUser(userData);\n setUserError(null);\n } catch (err) {\n setUserError(err instanceof Error ? err.message : 'Failed to load user');\n }\n }, [userId, getUser]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: depositsOffset };\n const depositsData = await getUserDeposits(userId, params);\n setDeposits(depositsData);\n setDepositsError(null);\n } catch (err) {\n setDepositsError(err instanceof Error ? err.message : 'Failed to load deposits');\n }\n }, [userId, getUserDeposits, depositsOffset]);\n\n const fetchCredits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: transactionsOffset };\n const creditsData = await getUserCredits(userId, params);\n setCredits(creditsData);\n setCreditsError(null);\n } catch (err) {\n setCreditsError(err instanceof Error ? err.message : 'Failed to load credits');\n }\n }, [userId, getUserCredits, transactionsOffset]);\n\n const fetchChats = useCallback(async () => {\n if (!cedrosPayEnabled) return;\n try {\n const params: ListUsersParams = { limit: pageSize, offset: chatsOffset };\n const chatsData = await getUserChats(userId, params);\n setChats(chatsData);\n setChatsError(null);\n } catch (err) {\n setChatsError(err instanceof Error ? err.message : 'Failed to load chat history');\n }\n }, [userId, getUserChats, chatsOffset, cedrosPayEnabled]);\n\n // Initial load\n useEffect(() => {\n fetchUser();\n fetchDeposits();\n fetchCredits();\n if (cedrosPayEnabled) {\n fetchChats();\n }\n }, [fetchUser, fetchDeposits, fetchCredits, fetchChats, cedrosPayEnabled]);\n\n const handleDelete = async () => {\n if (!user) return;\n if (user.id === currentUserId) {\n alert('You cannot delete your own account');\n return;\n }\n if (user.isSystemAdmin) {\n alert('Cannot delete a system admin. Remove admin status first.');\n return;\n }\n\n const confirmed = window.confirm(\n `Are you sure you want to delete ${user.name || user.email || 'this user'}? This action cannot be undone.`\n );\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await deleteUser(user.id);\n onBack();\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n const handlePasswordReset = async () => {\n if (!user?.email) {\n alert('User has no email address');\n return;\n }\n\n const confirmed = window.confirm(`Send a password reset email to ${user.email}?`);\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await forcePasswordReset(user.id);\n alert('Password reset email sent');\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n // Pagination handlers\n const depositsTotalPages = deposits ? Math.ceil(deposits.total / pageSize) : 0;\n const depositsCurrentPage = Math.floor(depositsOffset / pageSize) + 1;\n\n const transactionsTotalPages = credits ? Math.ceil(credits.totalTransactions / pageSize) : 0;\n const transactionsCurrentPage = Math.floor(transactionsOffset / pageSize) + 1;\n\n const goToDepositsPage = (page: number) => {\n setDepositsOffset((page - 1) * pageSize);\n };\n\n const goToTransactionsPage = (page: number) => {\n setTransactionsOffset((page - 1) * pageSize);\n };\n\n const chatsTotalPages = chats ? Math.ceil(chats.total / pageSize) : 0;\n const chatsCurrentPage = Math.floor(chatsOffset / pageSize) + 1;\n\n const goToChatsPage = (page: number) => {\n setChatsOffset((page - 1) * pageSize);\n };\n\n // Critical error - user fetch failed\n if (userError) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-error ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-error\">{userError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setUserError(null);\n fetchUser();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !user) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading user...</span>\n </div>\n );\n }\n\n if (!user) {\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-empty-message\">User not found.</p>\n </div>\n );\n }\n\n const isCurrentUser = user.id === currentUserId;\n\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n {/* Header */}\n <div className=\"cedros-admin-user-detail-header\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-back-btn\"\n onClick={onBack}\n >\n Back to Users\n </button>\n <div className=\"cedros-admin-user-detail-actions\">\n {onEditUser && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onEditUser(user)}\n disabled={actionInProgress}\n >\n Edit\n </button>\n )}\n {user.email && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={handlePasswordReset}\n disabled={actionInProgress}\n >\n Reset Password\n </button>\n )}\n {onAdjustCredits && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onAdjustCredits(user)}\n disabled={actionInProgress}\n >\n Adjust Credits\n </button>\n )}\n {!isCurrentUser && !user.isSystemAdmin && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-btn-danger\"\n onClick={handleDelete}\n disabled={actionInProgress}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n\n {/* User Info Section */}\n <div className=\"cedros-admin-user-detail-info\">\n <div className=\"cedros-admin-user-detail-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-detail-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-detail-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-detail-meta\">\n <h2 className=\"cedros-admin-user-detail-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </h2>\n <p className=\"cedros-admin-user-detail-email\">\n {user.email || 'No email'}\n {user.emailVerified && (\n <span className=\"cedros-admin-verified-badge\" title=\"Email verified\">\n Verified\n </span>\n )}\n </p>\n {user.isSystemAdmin && (\n <div className=\"cedros-admin-user-detail-badges\">\n <span className=\"cedros-admin-admin-badge cedros-admin-admin-badge-yes\">\n System Admin\n </span>\n </div>\n )}\n <div className=\"cedros-admin-user-detail-methods\">\n <span className=\"cedros-admin-user-detail-methods-label\">Auth Methods:</span>\n {user.authMethods.length > 0 ? (\n user.authMethods.map((method) => (\n <span\n key={method}\n className={`cedros-admin-auth-badge cedros-admin-auth-badge-${method}`}\n >\n {method}\n </span>\n ))\n ) : (\n <span className=\"cedros-admin-auth-badge cedros-admin-auth-badge-none\">none</span>\n )}\n </div>\n <p className=\"cedros-admin-user-detail-dates\">\n Registered: {formatDate(user.createdAt)} | Updated: {formatDate(user.updatedAt)}\n </p>\n </div>\n </div>\n\n {/* Stats Cards */}\n {creditsError ? (\n <div className=\"cedros-admin-stats-error\">\n <p className=\"cedros-admin-error-inline\">{creditsError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n >\n Retry\n </button>\n </div>\n ) : credits ? (\n <div className=\"cedros-admin-user-detail-stats\">\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Credit Balance</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.currentBalanceLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Credited</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.totalDepositedLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Spent</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.totalSpentLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Deposits</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.depositCount}</span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Transactions</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.spendCount}</span>\n </div>\n </div>\n ) : (\n <div className=\"cedros-admin-stats-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading credit stats...</span>\n </div>\n )}\n\n {/* Tabs */}\n <div className=\"cedros-admin-user-detail-tabs\">\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'deposits' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('deposits')}\n >\n Deposits ({deposits?.total ?? 0})\n </button>\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'transactions' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('transactions')}\n >\n Credits ({credits?.totalTransactions ?? 0})\n </button>\n {cedrosPayEnabled && (\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'chats' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('chats')}\n >\n Chats ({chats?.total ?? 0})\n </button>\n )}\n </div>\n\n {/* Tab Content */}\n <div className=\"cedros-admin-user-detail-content\">\n {activeTab === 'deposits' && (\n <DepositsTab\n deposits={deposits?.deposits ?? []}\n total={deposits?.total ?? 0}\n currentPage={depositsCurrentPage}\n totalPages={depositsTotalPages}\n onPageChange={goToDepositsPage}\n isLoading={isLoading}\n error={depositsError}\n onRetry={() => {\n setDepositsError(null);\n fetchDeposits();\n }}\n />\n )}\n {activeTab === 'transactions' && (\n <TransactionsTab\n transactions={credits?.transactions ?? []}\n total={credits?.totalTransactions ?? 0}\n currentPage={transactionsCurrentPage}\n totalPages={transactionsTotalPages}\n onPageChange={goToTransactionsPage}\n error={creditsError}\n onRetry={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n isLoading={isLoading}\n />\n )}\n {activeTab === 'chats' && cedrosPayEnabled && (\n <ChatsTab\n sessions={chats?.sessions ?? []}\n total={chats?.total ?? 0}\n currentPage={chatsCurrentPage}\n totalPages={chatsTotalPages}\n onPageChange={goToChatsPage}\n error={chatsError}\n onRetry={() => {\n setChatsError(null);\n fetchChats();\n }}\n isLoading={isLoading}\n />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Tab Components\n// =============================================================================\n\ninterface DepositsTabProps {\n deposits: AdminDepositItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction DepositsTab({\n deposits,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: DepositsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && deposits.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading deposits...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No deposits found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Amount</div>\n <div className=\"cedros-admin-list-th\">Status</div>\n <div className=\"cedros-admin-list-th\">Transaction</div>\n </div>\n {deposits.map((deposit) => (\n <div key={deposit.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(deposit.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">{formatSol(deposit.amountLamports)}</div>\n <div className=\"cedros-admin-list-td\">\n <span className={`cedros-admin-status-badge cedros-admin-status-${deposit.status}`}>\n {deposit.status}\n </span>\n </div>\n <div className=\"cedros-admin-list-td cedros-admin-list-td-actions\">\n {deposit.txSignature ? (\n <>\n <span className=\"cedros-admin-list-td-mono\" title={deposit.txSignature}>\n {deposit.txSignature.slice(0, 8)}...\n </span>\n <a\n href={`https://orbmarkets.io/tx/${deposit.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cedros-admin-icon-link\"\n title=\"View on Orbmarkets\"\n aria-label=\"View transaction on Orbmarkets\"\n >\n ↗\n </a>\n </>\n ) : (\n <span className=\"cedros-admin-list-td-muted\">—</span>\n )}\n </div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface TransactionsTabProps {\n transactions: AdminCreditTransactionItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction TransactionsTab({\n transactions,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: TransactionsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && transactions.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading transactions...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No credit transactions found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Type</div>\n <div className=\"cedros-admin-list-th\">Description</div>\n <div className=\"cedros-admin-list-th\">Amount</div>\n </div>\n {transactions.map((tx) => (\n <div key={tx.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(tx.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">\n <span\n className={`cedros-admin-tx-type cedros-admin-tx-type-${tx.txType.toLowerCase()}`}\n >\n {formatTxType(tx.txType)}\n </span>\n </div>\n <div className=\"cedros-admin-list-td\">\n {formatTxDescription(tx.txType, tx.referenceType)}\n </div>\n <div\n className={`cedros-admin-list-td ${tx.amountLamports >= 0 ? 'cedros-admin-amount-positive' : 'cedros-admin-amount-negative'}`}\n >\n {tx.amountLamports >= 0 ? '+' : ''}\n {formatCredits(tx.amountLamports)}\n </div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface ChatsTabProps {\n sessions: AdminChatSession[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction ChatsTab({\n sessions,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: ChatsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && sessions.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading chat history...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No chat sessions found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Session</div>\n <div className=\"cedros-admin-list-th\">Messages</div>\n </div>\n {sessions.map((session) => (\n <div key={session.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(session.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">\n {session.title || `Chat ${session.id.slice(0, 8)}...`}\n </div>\n <div className=\"cedros-admin-list-td\">{session.messageCount}</div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n total: number;\n onPageChange: (page: number) => void;\n}\n\nfunction Pagination({ currentPage, totalPages, total, onPageChange }: PaginationProps) {\n return (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onPageChange(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={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n );\n}\n"],"names":["AdminUserApiClient","baseUrl","timeoutMs","retryAttempts","getAccessToken","ApiClient","params","query","queryString","url","error","handleApiError","userId","isAdmin","data","useAdminUsers","config","_internal","useCedrosLogin","users","setUsers","useState","total","setTotal","isLoading","setIsLoading","setError","lastParams","setLastParams","apiClient","useMemo","listUsers","useCallback","response","err","getUser","setSystemAdmin","prev","user","updateUser","updated","deleteUser","forcePasswordReset","adjustCredits","amount","reason","getUserDeposits","getUserCredits","getUserWithdrawalHistory","getUserChats","getStats","refresh","clearError","formatDate","dateString","truncateId","id","formatBalance","lamports","AdminUserList","pageSize","refreshInterval","currentUserId","className","onLoad","onUserClick","offset","setOffset","loadError","setLoadError","sortField","setSortField","sortOrder","setSortOrder","toggleSort","field","sortedUsers","a","b","aVal","bVal","fetchUsers","result","useEffect","interval","totalPages","currentPage","goToPage","page","newOffset","jsxs","jsx","Fragment","isCurrentUser","e","formatDateTime","formatSol","formatCredits","formatTxType","txType","formatTxDescription","referenceType","AdminUserDetail","onBack","onEditUser","onAdjustCredits","cedrosPayEnabled","setUser","credits","setCredits","deposits","setDeposits","chats","setChats","activeTab","setActiveTab","userError","setUserError","creditsError","setCreditsError","depositsError","setDepositsError","chatsError","setChatsError","actionInProgress","setActionInProgress","depositsOffset","setDepositsOffset","transactionsOffset","setTransactionsOffset","chatsOffset","setChatsOffset","fetchUser","userData","fetchDeposits","depositsData","fetchCredits","creditsData","fetchChats","chatsData","handleDelete","handlePasswordReset","depositsTotalPages","depositsCurrentPage","transactionsTotalPages","transactionsCurrentPage","goToDepositsPage","goToTransactionsPage","chatsTotalPages","chatsCurrentPage","goToChatsPage","method","DepositsTab","TransactionsTab","ChatsTab","onPageChange","onRetry","deposit","Pagination","transactions","tx","sessions","session"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),a=require("react"),K=require("./useAdminDeposits-Dvx3_UUE.cjs"),G=require("./StatsBar-DTUZCwDD.cjs");function ee({refreshInterval:s=0,className:i="",onLoad:p}){const{getStats:f,isLoading:o,error:h,clearError:b}=K.useAdminDeposits(),[w,F]=a.useState(null),[g,N]=a.useState(null),m=a.useCallback(async()=>{try{const d=await f();F(d),p?.(d),N(null)}catch(d){const P=d&&typeof d=="object"&&"message"in d?String(d.message):"Failed to load stats";N(P)}},[f,p]);a.useEffect(()=>{m()},[m]),a.useEffect(()=>{if(s<=0)return;const d=setInterval(m,s);return()=>clearInterval(d)},[s,m]);const I=g||h;return I?e.jsxs("div",{className:`cedros-admin-stats ${i}`,children:[e.jsx("p",{className:"cedros-admin-error",children:I}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{b(),N(null),m()},children:"Retry"})]}):o&&!w?e.jsx("div",{className:`cedros-admin-stats ${i}`,children:e.jsx(G.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})}):w?e.jsx("div",{className:`cedros-admin-stats ${i}`,children:e.jsx(G.StatsBar,{stats:[{label:"Total Withdrawn",value:w.totalWithdrawnCount},{label:"Pending Withdraw",value:w.pendingWithdrawalCount},{label:"In Privacy Period",value:w.inPrivacyPeriodCount??0},{label:"Microbatch (SOL)",value:w.readyForWithdrawalSol?.toFixed(4)??"0.0000"}],isLoading:o,onRefresh:m})}):null}function J(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function X(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Y(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function se(s){const i=new Date(s),f=new Date().getTime()-i.getTime(),o=Math.floor(f/6e4),h=Math.floor(o/60),b=Math.floor(h/24);return b>0?`${b}d ago`:h>0?`${h}h ago`:o>0?`${o}m ago`:"just now"}function Z(s){return s?new Date(s)>new Date:!0}function te({pageSize:s=20,refreshInterval:i=0,className:p="",onLoad:f,onItemClick:o,onWithdrawalProcessed:h,onAllProcessed:b}){const{listPendingWithdrawals:w,processWithdrawal:F,processAllWithdrawals:g,isLoading:N,error:m,clearError:I}=K.useAdminDeposits(),[d,P]=a.useState([]),[M,$]=a.useState(0),[c,C]=a.useState(0),[v,k]=a.useState(null),[y,n]=a.useState("withdrawalAvailableAt"),[l,R]=a.useState("asc"),D=t=>{y===t?R(l==="asc"?"desc":"asc"):(n(t),R(t==="withdrawalAvailableAt"?"asc":"desc"))},H=a.useMemo(()=>[...d].sort((t,x)=>{let j,S;switch(y){case"userId":j=t.userId.toLowerCase(),S=x.userId.toLowerCase();break;case"amountLamports":j=t.amountLamports??0,S=x.amountLamports??0;break;case"withdrawalAvailableAt":j=t.withdrawalAvailableAt?new Date(t.withdrawalAvailableAt).getTime():0,S=x.withdrawalAvailableAt?new Date(x.withdrawalAvailableAt).getTime():0;break;default:return 0}return j<S?l==="asc"?-1:1:j>S?l==="asc"?1:-1:0}),[d,y,l]),[q,r]=a.useState(null),[u,E]=a.useState(!1),[A,L]=a.useState(null),[T,O]=a.useState(null),W=a.useCallback(async()=>{try{const t=await w({limit:s,offset:c});P(t.deposits),$(t.total),f?.(t),k(null)}catch(t){const x=t&&typeof t=="object"&&"message"in t?String(t.message):"Failed to load pending withdrawals";k(x)}},[s,c,w,f]);a.useEffect(()=>{C(0)},[s]),a.useEffect(()=>{W()},[W]),a.useEffect(()=>{if(i<=0)return;const t=setInterval(W,i);return()=>clearInterval(t)},[i,W]),a.useEffect(()=>{if(!A)return;const t=setTimeout(()=>L(null),5e3);return()=>clearTimeout(t)},[A]);const U=Math.ceil(M/s),_=Math.floor(c/s)+1,V=t=>{const x=(t-1)*s;C(Math.max(0,Math.min(x,Math.max(0,M-1))))},B=async(t,x=!1)=>{if(!x&&Z(t.withdrawalAvailableAt)){O(t);return}r(t.id),L(null);try{const j=await F(t.id,{force:x});j.success?(L({type:"success",message:`Withdrawal processed: ${j.txSignature?.slice(0,12)}...`}),h?.(j),await W()):L({type:"error",message:j.error||"Failed to process withdrawal"})}catch(j){L({type:"error",message:j instanceof Error?j.message:"Failed to process withdrawal"})}finally{r(null),O(null)}},z=async()=>{if(d.length!==0){E(!0),L(null);try{const t=await g();t.totalSucceeded>0?L({type:"success",message:`Processed ${t.totalSucceeded}/${t.totalProcessed} withdrawals`}):t.totalFailed>0&&L({type:"error",message:`Failed to process ${t.totalFailed} withdrawals`}),b?.(t),await W()}catch(t){L({type:"error",message:t instanceof Error?t.message:"Failed to process withdrawals"})}finally{E(!1)}}},Q=v||m;return Q?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${p}`,children:[e.jsx("p",{className:"cedros-admin-error",children:Q}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{I(),k(null),W()},children:"Retry"})]}):N&&d.length===0&&!q&&!u?e.jsxs("div",{className:`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${p}`,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 ${p}`,children:[T&&e.jsx("div",{className:"cedros-admin-modal-overlay",onClick:()=>O(null),onKeyDown:t=>t.key==="Escape"&&O(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: ",Y(T.userId),e.jsx("br",{}),"Amount: ",J(T.amountLamports),e.jsx("br",{}),"Available at:"," ",T.withdrawalAvailableAt?X(T.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:()=>O(null),children:"Cancel"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger",onClick:()=>B(T,!0),disabled:q===T.id,children:q===T.id?"Processing...":"Process Early"})]})]})}),A&&e.jsx("div",{className:`cedros-admin-result cedros-admin-result-${A.type}`,role:"status","aria-live":"polite",children:A.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:[M," pending"]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:W,disabled:N||u,title:"Refresh queue","aria-label":"Refresh queue",children:N&&!u?"...":"↻"}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-primary cedros-button-sm",onClick:z,disabled:N||u||d.length===0,title:"Process all ready withdrawals",children:u?"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:()=>D("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:()=>D("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:()=>D("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"})]}),H.map(t=>{const x=Z(t.withdrawalAvailableAt),j=q===t.id;return e.jsxs("div",{className:`cedros-admin-withdrawal-row ${x?"cedros-admin-withdrawal-row-early":""}`,onClick:()=>o?.(t),onKeyDown:S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),o?.(t))},role:o?"button":void 0,tabIndex:o?0:void 0,children:[e.jsx("div",{className:"cedros-admin-withdrawal-td",title:t.userId,children:Y(t.userId)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:J(t.amountLamports)}),e.jsx("div",{className:"cedros-admin-withdrawal-td",children:t.withdrawalAvailableAt?X(t.withdrawalAvailableAt):"—"}),e.jsx("div",{className:"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting",children:t.withdrawalAvailableAt?x?"In privacy period":se(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:S=>{S.stopPropagation(),B(t)},disabled:j||u,title:x?"Early withdrawal (requires confirmation)":"Process this withdrawal",children:j?"...":x?"Early":"Process"})})]},t.id)})]}),U>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>V(_-1),disabled:_<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",_," of ",U," (",M," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>V(_+1),disabled:_>=U,children:"Next"})]})]})]})}function ae(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function re(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 ie(s){const i=new Date(s),p=new Date,f=i.getTime()-p.getTime();if(f<=0)return"Ready";const o=Math.floor(f/6e4),h=Math.floor(o/60),b=Math.floor(h/24);if(b>0){const w=h%24;return w>0?`${b}d ${w}h`:`${b}d`}if(h>0){const w=o%60;return w>0?`${h}h ${w}m`:`${h}h`}return`${o}m`}function oe({pageSize:s=20,refreshInterval:i=0,className:p="",onLoad:f,onItemClick:o}){const{listInPrivacyPeriod:h,isLoading:b,error:w,clearError:F}=K.useAdminDeposits(),[g,N]=a.useState([]),[m,I]=a.useState(0),[d,P]=a.useState(0),[M,$]=a.useState(null),c=a.useCallback(async()=>{try{const n=await h({limit:s,offset:d});N(n.deposits),I(n.total),f?.(n),$(null)}catch(n){const l=n&&typeof n=="object"&&"message"in n?String(n.message):"Failed to load deposits";$(l)}},[s,d,h,f]);a.useEffect(()=>{P(0)},[s]),a.useEffect(()=>{c()},[c]),a.useEffect(()=>{if(i<=0)return;const n=setInterval(c,i);return()=>clearInterval(n)},[i,c]);const C=Math.ceil(m/s),v=Math.floor(d/s)+1,k=n=>{const l=(n-1)*s;P(Math.max(0,Math.min(l,Math.max(0,m-1))))},y=M||w;return y?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${p}`,children:[e.jsx("p",{className:"cedros-admin-error",children:y}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{F(),$(null),c()},children:"Retry"})]}):b&&g.length===0?e.jsxs("div",{className:`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${p}`,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 ${p}`,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:[m," deposit",m!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:c,disabled:b,title:"Refresh list","aria-label":"Refresh list",children:b?"...":"↻"})]})]}),g.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:"↕"})]})})]}),g.map(n=>e.jsxs("div",{className:"cedros-admin-privacy-row",onClick:()=>o?.(n),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o?.(n))},role:o?"button":void 0,tabIndex:o?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:ae(n.amountLamports)}),e.jsx("div",{className:"cedros-admin-privacy-td",children:n.completedAt?re(n.completedAt):"—"}),e.jsx("div",{className:"cedros-admin-privacy-td cedros-admin-privacy-remaining",children:n.withdrawalAvailableAt?ie(n.withdrawalAvailableAt):"—"})]},n.id))]}),C>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(v-1),disabled:v<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",v," of ",C," (",m," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>k(v+1),disabled:v>=C,children:"Next"})]})]})]})}function de(s){return s==null?"—":`${(s/1e9).toFixed(4)} SOL`}function ce(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function le(s){return s.length<=16?s:`${s.slice(0,8)}...${s.slice(-6)}`}function ue(s){return s.length<=12?s:`${s.slice(0,6)}...${s.slice(-4)}`}function me({pageSize:s=20,refreshInterval:i=0,className:p="",onLoad:f,onItemClick:o}){const{listDeposits:h,isLoading:b,error:w,clearError:F}=K.useAdminDeposits(),[g,N]=a.useState([]),[m,I]=a.useState(0),[d,P]=a.useState(0),[M,$]=a.useState(null),[c,C]=a.useState("completedAt"),[v,k]=a.useState("desc"),y=r=>{c===r?k(v==="asc"?"desc":"asc"):(C(r),k("desc"))},n=a.useMemo(()=>[...g].sort((r,u)=>{let E,A;switch(c){case"userId":E=r.userId.toLowerCase(),A=u.userId.toLowerCase();break;case"amountLamports":E=r.amountLamports??0,A=u.amountLamports??0;break;case"completedAt":E=r.completedAt?new Date(r.completedAt).getTime():0,A=u.completedAt?new Date(u.completedAt).getTime():0;break;case"withdrawalTxSignature":E=r.withdrawalTxSignature||"",A=u.withdrawalTxSignature||"";break;default:return 0}return E<A?v==="asc"?-1:1:E>A?v==="asc"?1:-1:0}),[g,c,v]),l=a.useCallback(async()=>{try{const r=await h({status:"withdrawn",limit:s,offset:d});N(r.deposits),I(r.total),f?.(r),$(null)}catch(r){const u=r&&typeof r=="object"&&"message"in r?String(r.message):"Failed to load withdrawal history";$(u)}},[s,d,h,f]);a.useEffect(()=>{P(0)},[s]),a.useEffect(()=>{l()},[l]),a.useEffect(()=>{if(i<=0)return;const r=setInterval(l,i);return()=>clearInterval(r)},[i,l]);const R=Math.ceil(m/s),D=Math.floor(d/s)+1,H=r=>{const u=(r-1)*s;P(Math.max(0,Math.min(u,Math.max(0,m-1))))},q=M||w;return q?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${p}`,children:[e.jsx("p",{className:"cedros-admin-error",children:q}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline",onClick:()=>{F(),$(null),l()},children:"Retry"})]}):b&&g.length===0?e.jsxs("div",{className:`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${p}`,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 ${p}`,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:[m," withdrawal",m!==1?"s":""]}),e.jsx("button",{type:"button",className:"cedros-admin__stats-bar-refresh",onClick:l,disabled:b,title:"Refresh list","aria-label":"Refresh list",children:b?"...":"↻"})]})]}),g.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"?v==="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"?v==="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"?v==="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"?v==="asc"?"↑":"↓":"↕"})]})})]}),n.map(r=>e.jsxs("div",{className:"cedros-admin-history-row",onClick:()=>o?.(r),onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),o?.(r))},role:o?"button":void 0,tabIndex:o?0:void 0,children:[e.jsx("div",{className:"cedros-admin-history-td",title:r.userId,children:ue(r.userId)}),e.jsx("div",{className:"cedros-admin-history-td",children:de(r.amountLamports)}),e.jsx("div",{className:"cedros-admin-history-td",children:r.completedAt?ce(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:u=>u.stopPropagation(),title:r.withdrawalTxSignature,children:le(r.withdrawalTxSignature)}):"—"})]},r.id))]}),R>1&&e.jsxs("div",{className:"cedros-admin-pagination",children:[e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>H(D-1),disabled:D<=1,children:"Previous"}),e.jsxs("span",{className:"cedros-admin-page-info",children:["Page ",D," of ",R," (",m," total)"]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:()=>H(D+1),disabled:D>=R,children:"Next"})]})]})]})}exports.AdminPrivacyPeriodDeposits=oe;exports.AdminWithdrawalHistory=me;exports.AdminWithdrawalQueue=te;exports.AdminWithdrawalStats=ee;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminWithdrawalHistory-0yxtMh6q.cjs","sources":["../src/components/deposit/admin/AdminWithdrawalStats.tsx","../src/components/deposit/admin/AdminWithdrawalQueue.tsx","../src/components/deposit/admin/AdminPrivacyPeriodDeposits.tsx","../src/components/deposit/admin/AdminWithdrawalHistory.tsx"],"sourcesContent":["/**\n * Admin withdrawal statistics component\n *\n * Shows high-level withdrawal pipeline stats in a single row.\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 AdminWithdrawalStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\nexport function AdminWithdrawalStats({\n refreshInterval = 0,\n className = '',\n onLoad,\n}: AdminWithdrawalStatsProps) {\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 useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchStats]);\n\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n if (errorMessage) {\n return (\n <div className={`cedros-admin-stats ${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 if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Withdrawn', value: 0 },\n { label: 'Pending Withdraw', value: 0 },\n { label: 'In Privacy Period', value: 0 },\n { label: 'Microbatch (SOL)', value: '0.0000' },\n ]}\n isLoading\n />\n </div>\n );\n }\n\n if (!stats) return null;\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Withdrawn', value: stats.totalWithdrawnCount },\n { label: 'Pending Withdraw', value: stats.pendingWithdrawalCount },\n { label: 'In Privacy Period', value: stats.inPrivacyPeriodCount ?? 0 },\n { label: 'Microbatch (SOL)', value: stats.readyForWithdrawalSol?.toFixed(4) ?? '0.0000' },\n ]}\n isLoading={isLoading}\n onRefresh={fetchStats}\n />\n </div>\n );\n}\n","/**\n * Admin withdrawal queue component\n *\n * Shows deposits that are ready for withdrawal (privacy period elapsed).\n * Includes buttons to process individual or all withdrawals.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type {\n AdminDepositItem,\n AdminDepositListResponse,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n} from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype QueueSortField = 'userId' | 'amountLamports' | 'withdrawalAvailableAt';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminWithdrawalQueueProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n /** Callback when a withdrawal is processed */\n onWithdrawalProcessed?: (response: ProcessWithdrawalResponse) => void;\n /** Callback when all withdrawals are processed */\n onAllProcessed?: (response: ProcessAllWithdrawalsResponse) => void;\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\nfunction getTimeElapsed(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays}d ago`;\n if (diffHours > 0) return `${diffHours}h ago`;\n if (diffMins > 0) return `${diffMins}m ago`;\n return 'just now';\n}\n\nfunction isWithinPrivacyPeriod(withdrawalAvailableAt: string | undefined): boolean {\n if (!withdrawalAvailableAt) return true;\n return new Date(withdrawalAvailableAt) > new Date();\n}\n\n/**\n * Admin withdrawal queue display\n *\n * Shows deposits ready for withdrawal processing with action buttons.\n */\nexport function AdminWithdrawalQueue({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n onWithdrawalProcessed,\n onAllProcessed,\n}: AdminWithdrawalQueueProps) {\n const {\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n isLoading,\n error,\n clearError,\n } = useAdminDeposits();\n\n const [items, setItems] = 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<QueueSortField>('withdrawalAvailableAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('asc');\n\n const toggleSort = (field: QueueSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder(field === 'withdrawalAvailableAt' ? 'asc' : 'desc');\n }\n };\n\n const sortedItems = useMemo(() => {\n return [...items].sort((a, b) => {\n let aVal: string | number;\n let bVal: string | number;\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 'withdrawalAvailableAt':\n aVal = a.withdrawalAvailableAt ? new Date(a.withdrawalAvailableAt).getTime() : 0;\n bVal = b.withdrawalAvailableAt ? new Date(b.withdrawalAvailableAt).getTime() : 0;\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 }, [items, sortField, sortOrder]);\n\n // Processing state\n const [processingId, setProcessingId] = useState<string | null>(null);\n const [processingAll, setProcessingAll] = useState(false);\n const [processResult, setProcessResult] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Early withdrawal confirmation modal\n const [earlyWithdrawalItem, setEarlyWithdrawalItem] = useState<AdminDepositItem | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listPendingWithdrawals({ limit: pageSize, offset });\n setItems(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 pending withdrawals';\n setLoadError(message);\n }\n }, [pageSize, offset, listPendingWithdrawals, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n // Clear result message after 5 seconds\n useEffect(() => {\n if (!processResult) return;\n const timer = setTimeout(() => setProcessResult(null), 5000);\n return () => clearTimeout(timer);\n }, [processResult]);\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 const handleProcessSingle = async (item: AdminDepositItem, force = false) => {\n // Check if within privacy period and not forcing\n if (!force && isWithinPrivacyPeriod(item.withdrawalAvailableAt)) {\n setEarlyWithdrawalItem(item);\n return;\n }\n\n setProcessingId(item.id);\n setProcessResult(null);\n\n try {\n const result = await processWithdrawal(item.id, { force });\n if (result.success) {\n setProcessResult({\n type: 'success',\n message: `Withdrawal processed: ${result.txSignature?.slice(0, 12)}...`,\n });\n onWithdrawalProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } else {\n setProcessResult({\n type: 'error',\n message: result.error || 'Failed to process withdrawal',\n });\n }\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawal',\n });\n } finally {\n setProcessingId(null);\n setEarlyWithdrawalItem(null);\n }\n };\n\n const handleProcessAll = async () => {\n if (items.length === 0) return;\n\n setProcessingAll(true);\n setProcessResult(null);\n\n try {\n const result = await processAllWithdrawals();\n if (result.totalSucceeded > 0) {\n setProcessResult({\n type: 'success',\n message: `Processed ${result.totalSucceeded}/${result.totalProcessed} withdrawals`,\n });\n } else if (result.totalFailed > 0) {\n setProcessResult({\n type: 'error',\n message: `Failed to process ${result.totalFailed} withdrawals`,\n });\n }\n onAllProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawals',\n });\n } finally {\n setProcessingAll(false);\n }\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\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${className}`}\n >\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 fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0 && !processingId && !processingAll) {\n return (\n <div\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal queue...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-queue ${className}`}>\n {/* Early Withdrawal Confirmation Modal */}\n {earlyWithdrawalItem && (\n <div\n className=\"cedros-admin-modal-overlay\"\n onClick={() => setEarlyWithdrawalItem(null)}\n onKeyDown={(e) => e.key === 'Escape' && setEarlyWithdrawalItem(null)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"early-withdrawal-title\"\n >\n <div\n className=\"cedros-admin-modal cedros-admin-modal-warning\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={() => {}}\n role=\"document\"\n >\n <h3 id=\"early-withdrawal-title\" className=\"cedros-admin-modal-title\">\n Early Withdrawal Warning\n </h3>\n <div className=\"cedros-admin-modal-content\">\n <p className=\"cedros-admin-modal-warning-text\">\n <strong>This deposit is still within its privacy period.</strong>\n </p>\n <p>\n Processing this withdrawal early may compromise user privacy. The privacy period\n exists to provide plausible deniability for deposits.\n </p>\n <p className=\"cedros-admin-modal-details\">\n User: {truncateId(earlyWithdrawalItem.userId)}\n <br />\n Amount: {formatAmount(earlyWithdrawalItem.amountLamports)}\n <br />\n Available at:{' '}\n {earlyWithdrawalItem.withdrawalAvailableAt\n ? formatDate(earlyWithdrawalItem.withdrawalAvailableAt)\n : '—'}\n </p>\n <p>Are you sure you want to process this withdrawal early?</p>\n </div>\n <div className=\"cedros-admin-modal-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => setEarlyWithdrawalItem(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger\"\n onClick={() => handleProcessSingle(earlyWithdrawalItem, true)}\n disabled={processingId === earlyWithdrawalItem.id}\n >\n {processingId === earlyWithdrawalItem.id ? 'Processing...' : 'Process Early'}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Result message */}\n {processResult && (\n <div\n className={`cedros-admin-result cedros-admin-result-${processResult.type}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {processResult.message}\n </div>\n )}\n\n <div className=\"cedros-admin-withdrawal-queue-header\">\n <h4 className=\"cedros-admin-withdrawal-queue-title\">Pending Withdrawals</h4>\n <div className=\"cedros-admin-withdrawal-queue-actions\">\n <span className=\"cedros-admin-queue-count\">{total} pending</span>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchItems}\n disabled={isLoading || processingAll}\n title=\"Refresh queue\"\n aria-label=\"Refresh queue\"\n >\n {isLoading && !processingAll ? '...' : '↻'}\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={handleProcessAll}\n disabled={isLoading || processingAll || items.length === 0}\n title=\"Process all ready withdrawals\"\n >\n {processingAll ? 'Processing...' : 'Process All'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No pending withdrawals.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-withdrawal-table\">\n <div className=\"cedros-admin-withdrawal-thead\">\n <div className=\"cedros-admin-withdrawal-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-withdrawal-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-withdrawal-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'withdrawalAvailableAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('withdrawalAvailableAt')}\n aria-label=\"Sort by ready since\"\n >\n Ready Since{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'withdrawalAvailableAt'\n ? sortOrder === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-withdrawal-th\">Waiting</div>\n <div className=\"cedros-admin-withdrawal-th cedros-admin-withdrawal-th-action\">\n Action\n </div>\n </div>\n {sortedItems.map((item) => {\n const withinPrivacyPeriod = isWithinPrivacyPeriod(item.withdrawalAvailableAt);\n const isProcessing = processingId === item.id;\n\n return (\n <div\n key={item.id}\n className={`cedros-admin-withdrawal-row ${withinPrivacyPeriod ? 'cedros-admin-withdrawal-row-early' : ''}`}\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-withdrawal-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {formatAmount(item.amountLamports)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {item.withdrawalAvailableAt ? formatDate(item.withdrawalAvailableAt) : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting\">\n {item.withdrawalAvailableAt\n ? withinPrivacyPeriod\n ? 'In privacy period'\n : getTimeElapsed(item.withdrawalAvailableAt)\n : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-td-action\">\n <button\n type=\"button\"\n className={`cedros-button cedros-button-sm ${withinPrivacyPeriod ? 'cedros-button-warning' : 'cedros-button-primary'}`}\n onClick={(e) => {\n e.stopPropagation();\n handleProcessSingle(item);\n }}\n disabled={isProcessing || processingAll}\n title={\n withinPrivacyPeriod\n ? 'Early withdrawal (requires confirmation)'\n : 'Process this withdrawal'\n }\n >\n {isProcessing ? '...' : withinPrivacyPeriod ? 'Early' : 'Process'}\n </button>\n </div>\n </div>\n );\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","/**\n * Admin privacy period deposits component\n *\n * Shows deposits that are still in the privacy period (completed but not yet ready for withdrawal).\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\nexport interface AdminPrivacyPeriodDepositsProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\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\nfunction getTimeRemaining(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n\n if (diffMs <= 0) return 'Ready';\n\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) {\n const remainingHours = diffHours % 24;\n return remainingHours > 0 ? `${diffDays}d ${remainingHours}h` : `${diffDays}d`;\n }\n if (diffHours > 0) {\n const remainingMins = diffMins % 60;\n return remainingMins > 0 ? `${diffHours}h ${remainingMins}m` : `${diffHours}h`;\n }\n return `${diffMins}m`;\n}\n\n/**\n * Admin privacy period deposits display\n *\n * Shows deposits that are still in the privacy period (not yet available for withdrawal).\n */\nexport function AdminPrivacyPeriodDeposits({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminPrivacyPeriodDepositsProps) {\n const { listInPrivacyPeriod, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listInPrivacyPeriod({ limit: pageSize, offset });\n setItems(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 }, [pageSize, offset, listInPrivacyPeriod, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\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\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${className}`}\n >\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 fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${className}`}\n >\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-privacy-deposits ${className}`}>\n <div className=\"cedros-admin-privacy-deposits-header\">\n <h4 className=\"cedros-admin-privacy-deposits-title\">In Privacy Period</h4>\n <div className=\"cedros-admin-privacy-deposits-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} deposit{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits in privacy period.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-privacy-table\">\n <div className=\"cedros-admin-privacy-thead\">\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by user\"\n >\n User <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by amount\"\n >\n Amount <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by deposited\"\n >\n Deposited <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by ready in\"\n >\n Ready In <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n </div>\n {items.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-privacy-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-privacy-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-privacy-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-privacy-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-privacy-td cedros-admin-privacy-remaining\">\n {item.withdrawalAvailableAt ? getTimeRemaining(item.withdrawalAvailableAt) : '—'}\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","/**\n * Admin withdrawal history component\n *\n * Shows deposits that have been fully withdrawn (processed).\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 WithdrawalSortField = 'userId' | 'amountLamports' | 'completedAt' | 'withdrawalTxSignature';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminWithdrawalHistoryProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\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 truncateSignature(sig: string): string {\n if (sig.length <= 16) return sig;\n return `${sig.slice(0, 8)}...${sig.slice(-6)}`;\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 withdrawal history display\n *\n * Shows deposits that have been fully withdrawn.\n */\nexport function AdminWithdrawalHistory({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminWithdrawalHistoryProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = 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<WithdrawalSortField>('completedAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: WithdrawalSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedItems = useMemo(() => {\n return [...items].sort((a, b) => {\n let aVal: string | number;\n let bVal: string | number;\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 'completedAt':\n aVal = a.completedAt ? new Date(a.completedAt).getTime() : 0;\n bVal = b.completedAt ? new Date(b.completedAt).getTime() : 0;\n break;\n case 'withdrawalTxSignature':\n aVal = a.withdrawalTxSignature || '';\n bVal = b.withdrawalTxSignature || '';\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 }, [items, sortField, sortOrder]);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listDeposits({ status: 'withdrawn', limit: pageSize, offset });\n setItems(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 withdrawal history';\n setLoadError(message);\n }\n }, [pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\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\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${className}`}\n >\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 fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal history...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-history ${className}`}>\n <div className=\"cedros-admin-withdrawal-history-header\">\n <h4 className=\"cedros-admin-withdrawal-history-title\">Withdrawal History</h4>\n <div className=\"cedros-admin-withdrawal-history-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} withdrawal{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No withdrawals processed yet.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-history-table\">\n <div className=\"cedros-admin-history-thead\">\n <div className=\"cedros-admin-history-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-history-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-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'completedAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('completedAt')}\n aria-label=\"Sort by processed\"\n >\n Processed{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'completedAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'withdrawalTxSignature' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('withdrawalTxSignature')}\n aria-label=\"Sort by transaction\"\n >\n Transaction{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'withdrawalTxSignature'\n ? sortOrder === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedItems.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-history-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-history-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-history-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-history-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-history-td\">\n {item.withdrawalTxSignature ? (\n <a\n href={`https://orbmarkets.io/tx/${item.withdrawalTxSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cedros-admin-tx-link\"\n onClick={(e) => e.stopPropagation()}\n title={item.withdrawalTxSignature}\n >\n {truncateSignature(item.withdrawalTxSignature)}\n </a>\n ) : (\n '—'\n )}\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":["AdminWithdrawalStats","refreshInterval","className","onLoad","getStats","isLoading","error","clearError","useAdminDeposits","stats","setStats","useState","loadError","setLoadError","fetchStats","useCallback","result","err","message","useEffect","interval","errorMessage","jsxs","jsx","StatsBar","formatAmount","lamports","formatDate","dateString","truncateId","id","getTimeElapsed","date","diffMs","diffMins","diffHours","diffDays","isWithinPrivacyPeriod","withdrawalAvailableAt","AdminWithdrawalQueue","pageSize","onItemClick","onWithdrawalProcessed","onAllProcessed","listPendingWithdrawals","processWithdrawal","processAllWithdrawals","items","setItems","total","setTotal","offset","setOffset","sortField","setSortField","sortOrder","setSortOrder","toggleSort","field","sortedItems","useMemo","a","b","aVal","bVal","processingId","setProcessingId","processingAll","setProcessingAll","processResult","setProcessResult","earlyWithdrawalItem","setEarlyWithdrawalItem","fetchItems","timer","totalPages","currentPage","goToPage","page","newOffset","handleProcessSingle","item","force","handleProcessAll","e","Fragment","withinPrivacyPeriod","isProcessing","getTimeRemaining","now","remainingHours","remainingMins","AdminPrivacyPeriodDeposits","listInPrivacyPeriod","truncateSignature","sig","AdminWithdrawalHistory","listDeposits"],"mappings":"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"}
|