@cedros/login-react 0.0.13 → 0.0.14

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.
Files changed (185) hide show
  1. package/dist/AdminDepositList-CyT4VBH8.js +311 -0
  2. package/dist/AdminDepositList-CyT4VBH8.js.map +1 -0
  3. package/dist/AdminDepositList-b2AXtLg0.cjs +1 -0
  4. package/dist/AdminDepositList-b2AXtLg0.cjs.map +1 -0
  5. package/dist/{AdminWithdrawalHistory-BGjfrIe3.js → AdminWithdrawalHistory-Cud-yuWy.js} +295 -283
  6. package/dist/AdminWithdrawalHistory-Cud-yuWy.js.map +1 -0
  7. package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs +1 -0
  8. package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs.map +1 -0
  9. package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs → AuthenticationSettings-D739nNul.cjs} +1 -1
  10. package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs.map → AuthenticationSettings-D739nNul.cjs.map} +1 -1
  11. package/dist/AuthenticationSettings-DtLoxQ2z.cjs +1 -0
  12. package/dist/{AuthenticationSettings-BPAh1my6.cjs.map → AuthenticationSettings-DtLoxQ2z.cjs.map} +1 -1
  13. package/dist/{AuthenticationSettings-CJg8CJY9.js → AuthenticationSettings-Dx3JCI3m.js} +1 -1
  14. package/dist/{AuthenticationSettings-CJg8CJY9.js.map → AuthenticationSettings-Dx3JCI3m.js.map} +1 -1
  15. package/dist/{AuthenticationSettings-CR_i6TTS.js → AuthenticationSettings-vowmQPXz.js} +170 -140
  16. package/dist/{AuthenticationSettings-CR_i6TTS.js.map → AuthenticationSettings-vowmQPXz.js.map} +1 -1
  17. package/dist/{AutosaveStatus-CYkC2aI_.cjs → AutosaveStatus-CCrZszKA.cjs} +1 -1
  18. package/dist/{AutosaveStatus-CYkC2aI_.cjs.map → AutosaveStatus-CCrZszKA.cjs.map} +1 -1
  19. package/dist/{AutosaveStatus-N4uNS6-2.js → AutosaveStatus-Ciyt350A.js} +1 -1
  20. package/dist/{AutosaveStatus-N4uNS6-2.js.map → AutosaveStatus-Ciyt350A.js.map} +1 -1
  21. package/dist/{CreditSystemSettings-CIf_SfJq.js → CreditSystemSettings-BQ3h4CyM.js} +1 -1
  22. package/dist/{CreditSystemSettings-CIf_SfJq.js.map → CreditSystemSettings-BQ3h4CyM.js.map} +1 -1
  23. package/dist/{CreditSystemSettings-BnAOK_tT.cjs → CreditSystemSettings-C6dUsu72.cjs} +1 -1
  24. package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-C6dUsu72.cjs.map} +1 -1
  25. package/dist/{CreditSystemSettings-Ck5WIMp3.cjs → CreditSystemSettings-CBot8EPW.cjs} +1 -1
  26. package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CBot8EPW.cjs.map} +1 -1
  27. package/dist/{CreditSystemSettings-CePYGgev.js → CreditSystemSettings-bVuNLsqp.js} +1 -1
  28. package/dist/{CreditSystemSettings-CePYGgev.js.map → CreditSystemSettings-bVuNLsqp.js.map} +1 -1
  29. package/dist/DepositsSection-BkKUS4vk.cjs +1 -0
  30. package/dist/DepositsSection-BkKUS4vk.cjs.map +1 -0
  31. package/dist/{DepositsSection-DA89uR9A.js → DepositsSection-DD9MKUFt.js} +20 -14
  32. package/dist/DepositsSection-DD9MKUFt.js.map +1 -0
  33. package/dist/EmailRegisterForm-Pvm3I8GP.cjs +1 -0
  34. package/dist/{EmailRegisterForm-CxktR-4J.cjs.map → EmailRegisterForm-Pvm3I8GP.cjs.map} +1 -1
  35. package/dist/{EmailRegisterForm-BrDL3BZy.js → EmailRegisterForm-nI0BOIxR.js} +2 -2
  36. package/dist/{EmailRegisterForm-BrDL3BZy.js.map → EmailRegisterForm-nI0BOIxR.js.map} +1 -1
  37. package/dist/{EmailSettings-DZywTTRq.cjs → EmailSettings-B9qwPSiM.cjs} +1 -1
  38. package/dist/{EmailSettings-DZywTTRq.cjs.map → EmailSettings-B9qwPSiM.cjs.map} +1 -1
  39. package/dist/{EmailSettings-DbMDfVaM.js → EmailSettings-CCA8dNCi.js} +1 -1
  40. package/dist/{EmailSettings-DbMDfVaM.js.map → EmailSettings-CCA8dNCi.js.map} +1 -1
  41. package/dist/{EmailSettings-B8xwgd6_.cjs → EmailSettings-RbgAq9FB.cjs} +1 -1
  42. package/dist/{EmailSettings-B8xwgd6_.cjs.map → EmailSettings-RbgAq9FB.cjs.map} +1 -1
  43. package/dist/{EmailSettings-Bna7Z53E.js → EmailSettings-mxlKNcPl.js} +1 -1
  44. package/dist/{EmailSettings-Bna7Z53E.js.map → EmailSettings-mxlKNcPl.js.map} +1 -1
  45. package/dist/{EmbeddedWalletSettings-DivEPn39.cjs → EmbeddedWalletSettings-B4h-8rxB.cjs} +1 -1
  46. package/dist/{EmbeddedWalletSettings-DivEPn39.cjs.map → EmbeddedWalletSettings-B4h-8rxB.cjs.map} +1 -1
  47. package/dist/{EmbeddedWalletSettings-BEztqO19.js → EmbeddedWalletSettings-BInZvFZf.js} +1 -1
  48. package/dist/{EmbeddedWalletSettings-BEztqO19.js.map → EmbeddedWalletSettings-BInZvFZf.js.map} +1 -1
  49. package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js → EmbeddedWalletSettings-CXlZFFDw.js} +1 -1
  50. package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js.map → EmbeddedWalletSettings-CXlZFFDw.js.map} +1 -1
  51. package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs → EmbeddedWalletSettings-D5JXae1L.cjs} +1 -1
  52. package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs.map → EmbeddedWalletSettings-D5JXae1L.cjs.map} +1 -1
  53. package/dist/{GoogleLoginButton-B3uRMJ_n.js → GoogleLoginButton-CXwp4LsQ.js} +1 -1
  54. package/dist/{GoogleLoginButton-B3uRMJ_n.js.map → GoogleLoginButton-CXwp4LsQ.js.map} +1 -1
  55. package/dist/GoogleLoginButton-zS_69-KV.cjs +1 -0
  56. package/dist/{GoogleLoginButton-BydKswn4.cjs.map → GoogleLoginButton-zS_69-KV.cjs.map} +1 -1
  57. package/dist/PermissionsSection-BPbE-hNx.cjs +1 -0
  58. package/dist/{PermissionsSection-CKXXDfqi.cjs.map → PermissionsSection-BPbE-hNx.cjs.map} +1 -1
  59. package/dist/{PermissionsSection-BGaj_sI7.js → PermissionsSection-CighC1p6.js} +3 -3
  60. package/dist/{PermissionsSection-BGaj_sI7.js.map → PermissionsSection-CighC1p6.js.map} +1 -1
  61. package/dist/{ServerSettings-B2RKhJtZ.js → ServerSettings-BE8fsE5k.js} +1 -1
  62. package/dist/{ServerSettings-B2RKhJtZ.js.map → ServerSettings-BE8fsE5k.js.map} +1 -1
  63. package/dist/{ServerSettings-BZXlm1BX.cjs → ServerSettings-CYTlQ2xy.cjs} +1 -1
  64. package/dist/{ServerSettings-BZXlm1BX.cjs.map → ServerSettings-CYTlQ2xy.cjs.map} +1 -1
  65. package/dist/{ServerSettings-DZUKo6By.cjs → ServerSettings-DFs9jQ3f.cjs} +1 -1
  66. package/dist/{ServerSettings-DZUKo6By.cjs.map → ServerSettings-DFs9jQ3f.cjs.map} +1 -1
  67. package/dist/{ServerSettings-Bqm4-bt2.js → ServerSettings-pSmWDC1d.js} +1 -1
  68. package/dist/{ServerSettings-Bqm4-bt2.js.map → ServerSettings-pSmWDC1d.js.map} +1 -1
  69. package/dist/{SettingsPageLayout-DpgNEkuu.js → SettingsPageLayout--GZ_iHLc.js} +1 -1
  70. package/dist/{SettingsPageLayout-DpgNEkuu.js.map → SettingsPageLayout--GZ_iHLc.js.map} +1 -1
  71. package/dist/{SettingsPageLayout-COSYLMu7.cjs → SettingsPageLayout-j5lMjEID.cjs} +1 -1
  72. package/dist/{SettingsPageLayout-COSYLMu7.cjs.map → SettingsPageLayout-j5lMjEID.cjs.map} +1 -1
  73. package/dist/SolanaLoginButton-BjOxpE1C.cjs +1 -0
  74. package/dist/{SolanaLoginButton-fAW7kRUu.cjs.map → SolanaLoginButton-BjOxpE1C.cjs.map} +1 -1
  75. package/dist/{SolanaLoginButton-C_u9OppS.js → SolanaLoginButton-P22QjBaO.js} +1 -1
  76. package/dist/{SolanaLoginButton-C_u9OppS.js.map → SolanaLoginButton-P22QjBaO.js.map} +1 -1
  77. package/dist/{TeamSection-CvrCoa9D.js → TeamSection-BIECkp7g.js} +2 -2
  78. package/dist/{TeamSection-CvrCoa9D.js.map → TeamSection-BIECkp7g.js.map} +1 -1
  79. package/dist/{TeamSection-DlUD5kp5.cjs → TeamSection-BOH9pv_E.cjs} +1 -1
  80. package/dist/{TeamSection-DlUD5kp5.cjs.map → TeamSection-BOH9pv_E.cjs.map} +1 -1
  81. package/dist/UsersSection-e6q7FHzx.cjs +1 -0
  82. package/dist/UsersSection-e6q7FHzx.cjs.map +1 -0
  83. package/dist/UsersSection-t-zm0jZW.js +33 -0
  84. package/dist/UsersSection-t-zm0jZW.js.map +1 -0
  85. package/dist/{WebhookSettings-bUg2u_p0.js → WebhookSettings-Bb70MbFj.js} +1 -1
  86. package/dist/{WebhookSettings-bUg2u_p0.js.map → WebhookSettings-Bb70MbFj.js.map} +1 -1
  87. package/dist/{WebhookSettings-BWl_wsvg.cjs → WebhookSettings-C-gvNAW1.cjs} +1 -1
  88. package/dist/{WebhookSettings-BWl_wsvg.cjs.map → WebhookSettings-C-gvNAW1.cjs.map} +1 -1
  89. package/dist/{WebhookSettings-DXNH5bal.cjs → WebhookSettings-CGyDKjrm.cjs} +1 -1
  90. package/dist/{WebhookSettings-DXNH5bal.cjs.map → WebhookSettings-CGyDKjrm.cjs.map} +1 -1
  91. package/dist/{WebhookSettings-BT5q6AZ8.js → WebhookSettings-kIstSjZi.js} +1 -1
  92. package/dist/{WebhookSettings-BT5q6AZ8.js.map → WebhookSettings-kIstSjZi.js.map} +1 -1
  93. package/dist/WithdrawalsSection-sljIyeaz.cjs +1 -0
  94. package/dist/WithdrawalsSection-sljIyeaz.cjs.map +1 -0
  95. package/dist/WithdrawalsSection-yRDTVFsb.js +27 -0
  96. package/dist/WithdrawalsSection-yRDTVFsb.js.map +1 -0
  97. package/dist/admin-only.cjs +1 -1
  98. package/dist/admin-only.js +1 -1
  99. package/dist/email-only.cjs +1 -1
  100. package/dist/email-only.d.ts +13 -2
  101. package/dist/email-only.js +3 -3
  102. package/dist/google-only.cjs +1 -1
  103. package/dist/google-only.d.ts +13 -2
  104. package/dist/google-only.js +3 -3
  105. package/dist/index.cjs +12 -12
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.d.ts +31 -8
  108. package/dist/index.js +1066 -1092
  109. package/dist/index.js.map +1 -1
  110. package/dist/{plugin-BtYBW6JY.cjs → plugin-8_dpq7tC.cjs} +1 -1
  111. package/dist/{plugin-BtYBW6JY.cjs.map → plugin-8_dpq7tC.cjs.map} +1 -1
  112. package/dist/{plugin-5qRh-YhX.js → plugin-D1NdppqC.js} +1 -1
  113. package/dist/{plugin-5qRh-YhX.js.map → plugin-D1NdppqC.js.map} +1 -1
  114. package/dist/{shamir-AeLLfw0p.cjs → shamir-4DyQMJCk.cjs} +1 -1
  115. package/dist/{shamir-AeLLfw0p.cjs.map → shamir-4DyQMJCk.cjs.map} +1 -1
  116. package/dist/{shamir-B0wConeK.js → shamir-L-s-Tp1Z.js} +1 -1
  117. package/dist/{shamir-B0wConeK.js.map → shamir-L-s-Tp1Z.js.map} +1 -1
  118. package/dist/silentWalletEnroll-BgTb4H5I.cjs +1 -0
  119. package/dist/{silentWalletEnroll-B8pgdKZO.cjs.map → silentWalletEnroll-BgTb4H5I.cjs.map} +1 -1
  120. package/dist/{silentWalletEnroll-DR2kPw7W.js → silentWalletEnroll-DWt6Pr3B.js} +3 -3
  121. package/dist/{silentWalletEnroll-DR2kPw7W.js.map → silentWalletEnroll-DWt6Pr3B.js.map} +1 -1
  122. package/dist/solana-only.cjs +1 -1
  123. package/dist/solana-only.d.ts +13 -2
  124. package/dist/solana-only.js +3 -3
  125. package/dist/{useAdminDeposits-BDY5KJ0-.js → useAdminDeposits-BTSyeAfg.js} +1 -1
  126. package/dist/{useAdminDeposits-BDY5KJ0-.js.map → useAdminDeposits-BTSyeAfg.js.map} +1 -1
  127. package/dist/useAdminDeposits-BkkCwHWp.cjs +1 -0
  128. package/dist/{useAdminDeposits-Dvx3_UUE.cjs.map → useAdminDeposits-BkkCwHWp.cjs.map} +1 -1
  129. package/dist/{useAuth-Bge6KaWN.js → useAuth-C3dpk0po.js} +597 -561
  130. package/dist/useAuth-C3dpk0po.js.map +1 -0
  131. package/dist/useAuth-D3Pk_H3z.cjs +1 -0
  132. package/dist/useAuth-D3Pk_H3z.cjs.map +1 -0
  133. package/dist/useCedrosLogin-C9MrcZvh.cjs +1 -0
  134. package/dist/useCedrosLogin-C9MrcZvh.cjs.map +1 -0
  135. package/dist/{apiClient-B2JxVPlH.js → useCedrosLogin-_94MmGGq.js} +29 -29
  136. package/dist/useCedrosLogin-_94MmGGq.js.map +1 -0
  137. package/dist/{useOrgs-Be3KH4ib.js → useOrgs-C3pzMA9h.js} +1 -1
  138. package/dist/{useOrgs-Be3KH4ib.js.map → useOrgs-C3pzMA9h.js.map} +1 -1
  139. package/dist/useOrgs-DDVRCaVi.cjs +1 -0
  140. package/dist/{useOrgs-CVbacmaQ.cjs.map → useOrgs-DDVRCaVi.cjs.map} +1 -1
  141. package/dist/{useSystemSettings-DN5YqfNq.js → useSystemSettings-DBlAMjFi.js} +1 -1
  142. package/dist/{useSystemSettings-DN5YqfNq.js.map → useSystemSettings-DBlAMjFi.js.map} +1 -1
  143. package/dist/useSystemSettings-DRrreszl.cjs +1 -0
  144. package/dist/{useSystemSettings-D9Cr7ZTl.cjs.map → useSystemSettings-DRrreszl.cjs.map} +1 -1
  145. package/dist/useUsersStatsSummary-8qY7iP4G.cjs +1 -0
  146. package/dist/useUsersStatsSummary-8qY7iP4G.cjs.map +1 -0
  147. package/dist/{AdminUserDetail-DHFDzY8B.js → useUsersStatsSummary-NjEFvWuz.js} +431 -380
  148. package/dist/useUsersStatsSummary-NjEFvWuz.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/AdminDepositList-Cx0xRwES.js +0 -305
  151. package/dist/AdminDepositList-Cx0xRwES.js.map +0 -1
  152. package/dist/AdminDepositList-UEcyRZkA.cjs +0 -1
  153. package/dist/AdminDepositList-UEcyRZkA.cjs.map +0 -1
  154. package/dist/AdminUserDetail-BzEIdNJh.cjs +0 -1
  155. package/dist/AdminUserDetail-BzEIdNJh.cjs.map +0 -1
  156. package/dist/AdminUserDetail-DHFDzY8B.js.map +0 -1
  157. package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs +0 -1
  158. package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs.map +0 -1
  159. package/dist/AdminWithdrawalHistory-BGjfrIe3.js.map +0 -1
  160. package/dist/AuthenticationSettings-BPAh1my6.cjs +0 -1
  161. package/dist/DepositsSection-DA89uR9A.js.map +0 -1
  162. package/dist/DepositsSection-i6XdhLNs.cjs +0 -1
  163. package/dist/DepositsSection-i6XdhLNs.cjs.map +0 -1
  164. package/dist/EmailRegisterForm-CxktR-4J.cjs +0 -1
  165. package/dist/GoogleLoginButton-BydKswn4.cjs +0 -1
  166. package/dist/PermissionsSection-CKXXDfqi.cjs +0 -1
  167. package/dist/SolanaLoginButton-fAW7kRUu.cjs +0 -1
  168. package/dist/UsersSection-C2U8Tb7V.cjs +0 -1
  169. package/dist/UsersSection-C2U8Tb7V.cjs.map +0 -1
  170. package/dist/UsersSection-Dbh9PTSA.js +0 -83
  171. package/dist/UsersSection-Dbh9PTSA.js.map +0 -1
  172. package/dist/WithdrawalsSection-BL_LOUq8.cjs +0 -1
  173. package/dist/WithdrawalsSection-BL_LOUq8.cjs.map +0 -1
  174. package/dist/WithdrawalsSection-CN-lLnqX.js +0 -20
  175. package/dist/WithdrawalsSection-CN-lLnqX.js.map +0 -1
  176. package/dist/apiClient-B2JxVPlH.js.map +0 -1
  177. package/dist/apiClient-CTTKhsYb.cjs +0 -1
  178. package/dist/apiClient-CTTKhsYb.cjs.map +0 -1
  179. package/dist/silentWalletEnroll-B8pgdKZO.cjs +0 -1
  180. package/dist/useAdminDeposits-Dvx3_UUE.cjs +0 -1
  181. package/dist/useAuth-Bge6KaWN.js.map +0 -1
  182. package/dist/useAuth-DhIDTLRd.cjs +0 -1
  183. package/dist/useAuth-DhIDTLRd.cjs.map +0 -1
  184. package/dist/useOrgs-CVbacmaQ.cjs +0 -1
  185. package/dist/useSystemSettings-D9Cr7ZTl.cjs +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminWithdrawalHistory-BGjfrIe3.js","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","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","a"],"mappings":"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"}
@@ -1 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),o=require("react"),A=require("./LoadingSpinner-d6sSxgQN.cjs"),E=require("./ErrorMessage-CHbYbVi2.cjs"),C=require("./AutosaveStatus-CYkC2aI_.cjs"),D=require("./apiClient-CTTKhsYb.cjs"),$=require("./useOrgs-CVbacmaQ.cjs");function T(){const{config:n,_internal:g}=D.useCedrosLogin(),u=n.serverUrl,f=o.useRef(g?.getAccessToken??(()=>null));f.current=g?.getAccessToken??(()=>null);const[b,S]=o.useState([]),[v,x]=o.useState(0),[k,c]=o.useState(!1),[N,r]=o.useState(null),h=o.useCallback(()=>{const d=f.current();return{"Content-Type":"application/json",...d?{Authorization:`Bearer ${d}`}:{}}},[]),p=o.useCallback(async(d,t=50,a=0)=>{c(!0),r(null);try{const i=new URLSearchParams;d&&i.set("org_id",d),i.set("limit",String(t)),i.set("offset",String(a));const s=await fetch(`${u}/admin/sso-providers?${i}`,{headers:h()});if(!s.ok){const P=await s.json().catch(()=>({}));throw new Error(P.error||`Failed to fetch SSO providers: ${s.status}`)}const j=await s.json();return S(j.providers),x(j.total),j}catch(i){const s=i instanceof Error?i:new Error(String(i));throw r(s),s}finally{c(!1)}},[u,h]),l=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers`,{method:"POST",headers:h(),body:JSON.stringify(d)});if(!t.ok){const i=await t.json().catch(()=>({}));throw new Error(i.error||`Failed to create SSO provider: ${t.status}`)}const a=await t.json();return S(i=>[...i,a]),x(i=>i+1),a}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),m=o.useCallback(async(d,t)=>{c(!0),r(null);try{const a=await fetch(`${u}/admin/sso-providers/${d}`,{method:"PUT",headers:h(),body:JSON.stringify(t)});if(!a.ok){const s=await a.json().catch(()=>({}));throw new Error(s.error||`Failed to update SSO provider: ${a.status}`)}const i=await a.json();return S(s=>s.map(j=>j.id===d?i:j)),i}catch(a){const i=a instanceof Error?a:new Error(String(a));throw r(i),i}finally{c(!1)}},[u,h]),w=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers/${d}`,{method:"DELETE",headers:h()});if(!t.ok){const a=await t.json().catch(()=>({}));throw new Error(a.error||`Failed to delete SSO provider: ${t.status}`)}S(a=>a.filter(i=>i.id!==d)),x(a=>a-1)}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),y=o.useCallback(async(d,t)=>m(d,{enabled:t}),[m]);return{providers:b,total:v,isLoading:k,error:N,fetchProviders:p,createProvider:l,updateProvider:m,deleteProvider:w,toggleProvider:y}}function I({className:n}){const{providers:g,isLoading:u,error:f,fetchProviders:b,createProvider:S,updateProvider:v,deleteProvider:x,toggleProvider:k}=T(),{activeOrg:c}=$.useOrgs(),[N,r]=o.useState("list"),[h,p]=o.useState(null),[l,m]=o.useState(null);o.useEffect(()=>{b(c?.id)},[b,c?.id]);const w=()=>{p(null),m(null),r("add")},y=s=>{p(s),m(null),r("edit")},d=()=>{r("list"),p(null),m(null)},t=async s=>{if(confirm(`Delete SSO provider "${s.name}"? This cannot be undone.`))try{await x(s.id)}catch{}},a=async s=>{try{await k(s.id,!s.enabled)}catch{}},i=async s=>{m(null);try{N==="add"?await S(s):h&&await v(h.id,s),r("list"),p(null)}catch(j){m(j instanceof Error?j.message:"Failed to save provider")}};return u&&g.length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(A.LoadingSpinner,{}),e.jsx("span",{children:"Loading SSO providers..."})]}):N==="add"||N==="edit"?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(F,{provider:h,orgId:c?.id,error:l,isLoading:u,onSave:i,onCancel:d})}):e.jsxs("div",{className:`cedros-system-settings ${n??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"SSO Providers"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure OIDC identity providers for enterprise single sign-on."})]}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-primary",onClick:w,children:"Add Provider"})]}),f&&e.jsx(E.ErrorMessage,{error:f.message}),g.length===0?e.jsxs("div",{className:"cedros-system-settings-empty",children:[e.jsx("p",{children:"No SSO providers configured."}),e.jsx("p",{className:"cedros-text-muted",children:"Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO."})]}):e.jsx("div",{className:"cedros-sso-provider-list",children:g.map(s=>e.jsx(L,{provider:s,onEdit:()=>y(s),onDelete:()=>t(s),onToggle:()=>a(s)},s.id))})]})}function L({provider:n,onEdit:g,onDelete:u,onToggle:f}){return e.jsxs("div",{className:`cedros-sso-provider-card ${n.enabled?"":"cedros-sso-provider-card--disabled"}`,children:[e.jsxs("div",{className:"cedros-sso-provider-card-header",children:[e.jsxs("div",{className:"cedros-sso-provider-card-info",children:[e.jsx("h3",{className:"cedros-sso-provider-card-name",children:n.name}),e.jsx("p",{className:"cedros-sso-provider-card-issuer",children:n.issuerUrl})]}),e.jsxs("button",{type:"button",role:"switch","aria-checked":n.enabled,className:`cedros-toggle ${n.enabled?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:f,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:n.enabled?"Enabled":"Disabled"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-details",children:[e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Client ID"}),e.jsx("code",{className:"cedros-sso-provider-card-detail-value",children:n.clientId})]}),n.emailDomain&&e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Email Domain"}),e.jsxs("span",{className:"cedros-sso-provider-card-detail-value",children:["@",n.emailDomain]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Registration"}),e.jsx("span",{className:"cedros-sso-provider-card-detail-value",children:n.allowRegistration?"Allowed":"Existing users only"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:g,children:"Edit"}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost cedros-btn-danger",onClick:u,children:"Delete"})]})]})}function F({provider:n,orgId:g,error:u,isLoading:f,onSave:b,onCancel:S}){const v=!!n,[x,k]=o.useState(n?.name??""),[c,N]=o.useState(n?.issuerUrl??""),[r,h]=o.useState(n?.clientId??""),[p,l]=o.useState(""),[m,w]=o.useState(n?.emailDomain??""),[y,d]=o.useState(n?.allowRegistration??!0),[t,a]=o.useState(n?.enabled??!0),i=o.useCallback(s=>{if(s.preventDefault(),v){const j={name:x,issuerUrl:c,clientId:r,emailDomain:m||null,allowRegistration:y,enabled:t};p&&(j.clientSecret=p),b(j)}else{if(!g)return;b({orgId:g,name:x,issuerUrl:c,clientId:r,clientSecret:p,emailDomain:m||null,allowRegistration:y,enabled:t})}},[v,g,x,c,r,p,m,y,t,b]);return e.jsxs("form",{className:"cedros-sso-provider-form",onSubmit:i,children:[e.jsx("div",{className:"cedros-settings-page-header",children:e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:v?"Edit SSO Provider":"Add SSO Provider"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure an OIDC identity provider for enterprise single sign-on."})]})}),u&&e.jsx(E.ErrorMessage,{error:u}),e.jsxs("div",{className:"cedros-form-section",children:[e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-name",children:"Provider Name"}),e.jsx("input",{id:"sso-name",type:"text",className:"cedros-form-input",value:x,onChange:s=>k(s.target.value),placeholder:"e.g., Okta, Azure AD",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-issuer",children:"Issuer URL"}),e.jsx("input",{id:"sso-issuer",type:"url",className:"cedros-form-input",value:c,onChange:s=>N(s.target.value),placeholder:"https://your-org.okta.com",required:!0}),e.jsx("p",{className:"cedros-form-hint",children:"The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration"})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-client-id",children:"Client ID"}),e.jsx("input",{id:"sso-client-id",type:"text",className:"cedros-form-input",value:r,onChange:s=>h(s.target.value),placeholder:"OAuth client ID",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsxs("label",{className:"cedros-form-label",htmlFor:"sso-client-secret",children:["Client Secret"," ",v&&e.jsx("span",{className:"cedros-form-hint-inline",children:"(leave blank to keep current)"})]}),e.jsx("input",{id:"sso-client-secret",type:"password",className:"cedros-form-input",value:p,onChange:s=>l(s.target.value),placeholder:v?"••••••••":"OAuth client secret",required:!v})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-email-domain",children:"Email Domain (optional)"}),e.jsx("input",{id:"sso-email-domain",type:"text",className:"cedros-form-input",value:m,onChange:s=>w(s.target.value),placeholder:"company.com"}),e.jsx("p",{className:"cedros-form-hint",children:"Restrict to users with emails from this domain"})]}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:y,onChange:s=>d(s.target.checked)}),e.jsx("span",{children:"Allow new user registration via SSO"})]})}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:s=>a(s.target.checked)}),e.jsx("span",{children:"Enable this provider"})]})})]}),e.jsxs("div",{className:"cedros-form-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:S,disabled:f,children:"Cancel"}),e.jsx("button",{type:"submit",className:"cedros-btn cedros-btn-primary",disabled:f,children:f?"Saving...":v?"Save Changes":"Add Provider"})]})]})}const O=[{id:"email",label:"Email",categories:["auth.email"]},{id:"google",label:"Google",categories:["auth.google"]},{id:"apple",label:"Apple",categories:["auth.apple"]},{id:"solana",label:"Solana",categories:["auth.solana"]},{id:"passkeys",label:"Passkeys",categories:["auth.webauthn"]},{id:"instantlink",label:"Instant Link",categories:["auth.instantlink"]},{id:"sso",label:"SSO Providers",categories:[],isCustom:!0}];function R({className:n}){const{settings:g,edits:u,isLoading:f,autosaveStatus:b,autosaveError:S,error:v,fetchSettings:x,handleChange:k}=C.useSettingsAutosave(),[c,N]=o.useState("email");o.useEffect(()=>{x()},[x]);const r=O.find(l=>l.id===c),h=o.useMemo(()=>{if(!r)return[];const l=[];for(const m of r.categories){const w=g[m]??[];l.push(...w)}return l},[g,r]),p=o.useMemo(()=>r?.keys?h.filter(l=>r.keys.includes(l.key)).sort((l,m)=>r.keys.indexOf(l.key)-r.keys.indexOf(m.key)):h,[h,r]);return f&&Object.keys(g).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(A.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):v?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(E.ErrorMessage,{error:v.message})}):e.jsxs("div",{className:`cedros-system-settings ${n??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Authentication"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure authentication providers and methods for user sign-in."})]}),e.jsx(C.AutosaveStatus,{status:b,error:S})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:O.map(l=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${c===l.id?"cedros-admin-tab-active":""}`,onClick:()=>N(l.id),"aria-selected":c===l.id,role:"tab",children:l.label},l.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:r?.isCustom?e.jsx(I,{}):p.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",r?.label??"this provider","."]})}):e.jsx(C.SettingsSection,{settings:p,edits:u,onChange:k})})]})}exports.AuthenticationSettings=R;
@@ -1 +0,0 @@
1
- {"version":3,"file":"DepositsSection-DA89uR9A.js","sources":["../src/admin/sections/DepositsSection.tsx"],"sourcesContent":["/**\n * Deposits Section - Plugin wrapper\n *\n * Admin deposit management with stats, list, and filter controls.\n */\n\nimport React, { useState } from 'react';\nimport type { AdminSectionProps } from '../types';\nimport { AdminDepositStats, AdminDepositList } from '../../components/deposit/admin';\n\nexport default function DepositsSection({\n pageSize = 20,\n refreshInterval = 0,\n}: AdminSectionProps): React.JSX.Element {\n const [statusFilter, setStatusFilter] = useState<string>('');\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshInterval={refreshInterval} />\n\n {/* Filter and list */}\n <div className=\"cedros-dashboard__deposits-list\">\n <div className=\"cedros-dashboard__toolbar\">\n <div className=\"cedros-dashboard__filter\">\n <label className=\"cedros-dashboard__filter-label\" htmlFor=\"status-filter\">\n Status\n </label>\n <select\n id=\"status-filter\"\n className=\"cedros-dashboard__select\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n <option value=\"pending\">Pending</option>\n <option value=\"detected\">Detected</option>\n <option value=\"processing\">Processing</option>\n <option value=\"completed\">Completed</option>\n <option value=\"withdrawn\">Withdrawn</option>\n <option value=\"expired\">Expired</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </div>\n\n <AdminDepositList\n statusFilter={statusFilter || undefined}\n pageSize={pageSize}\n refreshInterval={refreshInterval}\n />\n </div>\n </div>\n );\n}\n"],"names":["DepositsSection","pageSize","refreshInterval","statusFilter","setStatusFilter","useState","jsxs","jsx","AdminDepositStats","e","AdminDepositList"],"mappings":";;;AAUA,SAAwBA,EAAgB;AAAA,EACtC,UAAAC,IAAW;AAAA,EACX,iBAAAC,IAAkB;AACpB,GAAyC;AACvC,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAAiB,EAAE;AAE3D,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,8BAEb,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAkB,iBAAAN,GAAkC;AAAA,IAGrD,gBAAAI,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAI,WAAU,6BACb,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kCAAiC,SAAQ,iBAAgB,UAAA,UAE1E;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,OAAOH;AAAA,YACP,UAAU,CAACM,MAAML,EAAgBK,EAAE,OAAO,KAAK;AAAA,YAE/C,UAAA;AAAA,cAAA,gBAAAF,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,gBAAY;AAAA,cAC7B,gBAAAA,EAAC,UAAA,EAAO,OAAM,WAAU,UAAA,WAAO;AAAA,cAC/B,gBAAAA,EAAC,UAAA,EAAO,OAAM,YAAW,UAAA,YAAQ;AAAA,cACjC,gBAAAA,EAAC,UAAA,EAAO,OAAM,cAAa,UAAA,cAAU;AAAA,cACrC,gBAAAA,EAAC,UAAA,EAAO,OAAM,aAAY,UAAA,aAAS;AAAA,cACnC,gBAAAA,EAAC,UAAA,EAAO,OAAM,aAAY,UAAA,aAAS;AAAA,cACnC,gBAAAA,EAAC,UAAA,EAAO,OAAM,WAAU,UAAA,WAAO;AAAA,cAC/B,gBAAAA,EAAC,UAAA,EAAO,OAAM,UAAS,UAAA,SAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC/B,EAAA,CACF,EAAA,CACF;AAAA,MAEA,gBAAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,cAAcP,KAAgB;AAAA,UAC9B,UAAAF;AAAA,UACA,iBAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),o=require("react"),i=require("./AdminDepositList-UEcyRZkA.cjs");function r({pageSize:d=20,refreshInterval:s=0}){const[t,a]=o.useState("");return e.jsxs("div",{className:"cedros-dashboard__deposits",children:[e.jsx(i.AdminDepositStats,{refreshInterval:s}),e.jsxs("div",{className:"cedros-dashboard__deposits-list",children:[e.jsx("div",{className:"cedros-dashboard__toolbar",children:e.jsxs("div",{className:"cedros-dashboard__filter",children:[e.jsx("label",{className:"cedros-dashboard__filter-label",htmlFor:"status-filter",children:"Status"}),e.jsxs("select",{id:"status-filter",className:"cedros-dashboard__select",value:t,onChange:l=>a(l.target.value),children:[e.jsx("option",{value:"",children:"All statuses"}),e.jsx("option",{value:"pending",children:"Pending"}),e.jsx("option",{value:"detected",children:"Detected"}),e.jsx("option",{value:"processing",children:"Processing"}),e.jsx("option",{value:"completed",children:"Completed"}),e.jsx("option",{value:"withdrawn",children:"Withdrawn"}),e.jsx("option",{value:"expired",children:"Expired"}),e.jsx("option",{value:"failed",children:"Failed"})]})]})}),e.jsx(i.AdminDepositList,{statusFilter:t||void 0,pageSize:d,refreshInterval:s})]})]})}exports.default=r;
@@ -1 +0,0 @@
1
- {"version":3,"file":"DepositsSection-i6XdhLNs.cjs","sources":["../src/admin/sections/DepositsSection.tsx"],"sourcesContent":["/**\n * Deposits Section - Plugin wrapper\n *\n * Admin deposit management with stats, list, and filter controls.\n */\n\nimport React, { useState } from 'react';\nimport type { AdminSectionProps } from '../types';\nimport { AdminDepositStats, AdminDepositList } from '../../components/deposit/admin';\n\nexport default function DepositsSection({\n pageSize = 20,\n refreshInterval = 0,\n}: AdminSectionProps): React.JSX.Element {\n const [statusFilter, setStatusFilter] = useState<string>('');\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshInterval={refreshInterval} />\n\n {/* Filter and list */}\n <div className=\"cedros-dashboard__deposits-list\">\n <div className=\"cedros-dashboard__toolbar\">\n <div className=\"cedros-dashboard__filter\">\n <label className=\"cedros-dashboard__filter-label\" htmlFor=\"status-filter\">\n Status\n </label>\n <select\n id=\"status-filter\"\n className=\"cedros-dashboard__select\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n <option value=\"pending\">Pending</option>\n <option value=\"detected\">Detected</option>\n <option value=\"processing\">Processing</option>\n <option value=\"completed\">Completed</option>\n <option value=\"withdrawn\">Withdrawn</option>\n <option value=\"expired\">Expired</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </div>\n\n <AdminDepositList\n statusFilter={statusFilter || undefined}\n pageSize={pageSize}\n refreshInterval={refreshInterval}\n />\n </div>\n </div>\n );\n}\n"],"names":["DepositsSection","pageSize","refreshInterval","statusFilter","setStatusFilter","useState","jsxs","jsx","AdminDepositStats","e","AdminDepositList"],"mappings":"qLAUA,SAAwBA,EAAgB,CACtC,SAAAC,EAAW,GACX,gBAAAC,EAAkB,CACpB,EAAyC,CACvC,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAAiB,EAAE,EAE3D,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,6BAEb,SAAA,CAAAC,MAACC,EAAAA,mBAAkB,gBAAAN,EAAkC,EAGrDI,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,4BACb,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,iCAAiC,QAAQ,gBAAgB,SAAA,SAE1E,EACAD,EAAAA,KAAC,SAAA,CACC,GAAG,gBACH,UAAU,2BACV,MAAOH,EACP,SAAWM,GAAML,EAAgBK,EAAE,OAAO,KAAK,EAE/C,SAAA,CAAAF,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,eAAY,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,UAAU,SAAA,UAAO,EAC/BA,EAAAA,IAAC,SAAA,CAAO,MAAM,WAAW,SAAA,WAAQ,EACjCA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,aAAU,EACrCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,YAAS,EACnCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,YAAS,EACnCA,EAAAA,IAAC,SAAA,CAAO,MAAM,UAAU,SAAA,UAAO,EAC/BA,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,QAAA,CAAM,CAAA,CAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CACF,EAEAA,EAAAA,IAACG,EAAAA,iBAAA,CACC,aAAcP,GAAgB,OAC9B,SAAAF,EACA,gBAAAC,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ"}
@@ -1 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),t=require("react"),N=require("./apiClient-CTTKhsYb.cjs"),V=require("./validation-BuGQrA-K.cjs"),F=require("./LoadingSpinner-d6sSxgQN.cjs"),z=require("./ErrorMessage-CHbYbVi2.cjs"),te=require("./sanitization-Bo_tn-L2.cjs");function P(n={}){const{maxAttempts:p=5,windowMs:x=6e4,showCountdown:u=!1}=n,f=t.useRef([]),[c,k]=t.useState(!1),[,d]=t.useState(0),h=t.useCallback(()=>{d(r=>r+1)},[]),m=t.useCallback(()=>{const r=Date.now();f.current=f.current.filter(s=>r-s<x)},[x]),b=t.useCallback(()=>{m(),k(r=>f.current.length===0&&r?!1:r)},[m]),l=t.useCallback(()=>(m(),Math.max(0,p-f.current.length)),[m,p]),g=t.useCallback(()=>{if(m(),f.current.length===0)return 0;const s=f.current[0]+x;return Math.max(0,s-Date.now())},[m,x]),v=t.useCallback(()=>(m(),f.current.length<p),[m,p]),y=t.useCallback(()=>{if(b(),f.current.length>=p){const r=g(),s=Math.ceil(r/1e3);throw new Error(`Too many attempts. Please wait ${s} second${s===1?"":"s"} before trying again.`)}f.current.push(Date.now()),k(r=>r||!0),h()},[b,p,g,h]),w=t.useCallback(()=>{f.current=[],k(r=>r&&!1),h()},[h]);return t.useEffect(()=>{if(!c||!u)return;const r=window.setInterval(()=>{b(),h()},1e3);return()=>{window.clearInterval(r)}},[c,u,h,b]),{checkLimit:y,isAllowed:v,getRemainingAttempts:l,getTimeUntilReset:g,reset:w}}function re(n){return"mfaRequired"in n&&n.mfaRequired===!0}function _(){const{config:n,_internal:p}=N.useCedrosLogin(),[x,u]=t.useState(!1),[f,c]=t.useState(null),{checkLimit:k,getRemainingAttempts:d,getTimeUntilReset:h,reset:m}=P({maxAttempts:5,windowMs:6e4}),b=t.useMemo(()=>new N.ApiClient({baseUrl:n.serverUrl,timeoutMs:n.requestTimeout,retryAttempts:n.retryAttempts}),[n.serverUrl,n.requestTimeout,n.retryAttempts]),l=n.callbacks,g=n.features?.walletEnrollment!==!1,v=n.serverUrl,y=t.useCallback(async(s,a)=>{if(!V.validateEmail(s)){const i={code:"VALIDATION_ERROR",message:"Please enter a valid email address"};throw c(i),i}try{k()}catch(i){const o={code:"RATE_LIMITED",message:i instanceof Error?i.message:"Too many attempts"};throw c(o),o}u(!0),c(null);try{const i=await b.post("/login",{email:s,password:a});if(re(i))return{mfaRequired:!0,mfaToken:i.mfaToken,email:s,userId:i.userId};const o=i;return l?.onLoginSuccess?.(o.user,"email"),p?.handleLoginSuccess(o.user,o.tokens),m(),{mfaRequired:!1,response:o}}catch(i){const o=N.handleApiError(i,"Login failed");throw c(o),o}finally{u(!1)}},[b,l,p,k,m]),w=t.useCallback(async(s,a,i)=>{if(!V.validateEmail(s)){const o={code:"VALIDATION_ERROR",message:"Please enter a valid email address"};throw c(o),o}try{k()}catch(o){const C={code:"RATE_LIMITED",message:o instanceof Error?o.message:"Too many attempts"};throw c(C),C}u(!0),c(null);try{const o=await b.post("/register",{email:s,password:a,name:i});if(l?.onLoginSuccess?.(o.user,"email"),p?.handleLoginSuccess(o.user,o.tokens),m(),g){const C=o.tokens?.accessToken??"",A=!C?200:0;new Promise(j=>setTimeout(j,A)).then(()=>Promise.resolve().then(()=>require("./silentWalletEnroll-B8pgdKZO.cjs"))).then(({silentWalletEnroll:j})=>j({password:a,serverUrl:v,accessToken:C})).then(j=>{j.success||console.warn("[useEmailAuth] Wallet auto-enrollment failed:",j.error)}).catch(j=>{const R=j instanceof Error?j.message:"Unknown error";console.warn("[useEmailAuth] Wallet auto-enrollment unavailable:",R)})}return o}catch(o){const C=N.handleApiError(o,"Registration failed");throw c(C),C}finally{u(!1)}},[b,l,p,k,m,v,g]),r=t.useCallback(()=>c(null),[]);return{login:y,register:w,isLoading:x,error:f,clearError:r,remainingAttempts:d(),timeUntilReset:h()}}function ae(n){return typeof n=="object"&&n!==null&&"mfaRequired"in n&&n.mfaRequired===!0}function H(){const{config:n,_internal:p}=N.useCedrosLogin(),[x,u]=t.useState(!1),[f,c]=t.useState(!1),[k,d]=t.useState(null),h=t.useMemo(()=>new N.ApiClient({baseUrl:n.serverUrl,timeoutMs:n.requestTimeout,retryAttempts:n.retryAttempts}),[n.serverUrl,n.requestTimeout,n.retryAttempts]),{checkLimit:m,getRemainingAttempts:b}=P({maxAttempts:3,windowMs:3e5}),l=t.useCallback(async w=>{if(!V.validateEmail(w)){const r={code:"VALIDATION_ERROR",message:"Please enter a valid email address"};throw d(r),r}try{m()}catch(r){const s={code:"RATE_LIMITED",message:r instanceof Error?r.message:"Too many attempts"};throw d(s),s}u(!0),d(null),c(!1);try{await h.post("/instant-link",{email:w}),c(!0)}catch(r){const s=N.handleApiError(r,"Failed to send sign-in link");throw d(s),s}finally{u(!1)}},[h,m]),g=t.useCallback(async w=>{if(!w||w.trim().length===0){const r={code:"VALIDATION_ERROR",message:"Invalid or missing sign-in link token"};throw d(r),r}u(!0),d(null),c(!1);try{const r=await h.post("/instant-link/verify",{token:w});return ae(r)||(n.callbacks?.onLoginSuccess?.(r.user,"email"),p?.handleLoginSuccess(r.user,r.tokens)),r}catch(r){const s=N.handleApiError(r,"Failed to verify sign-in link");throw d(s),s}finally{u(!1)}},[h,n.callbacks,p]),v=t.useCallback(()=>d(null),[]),y=t.useCallback(()=>{d(null),c(!1),u(!1)},[]);return{sendInstantLink:l,verifyInstantLink:g,isLoading:x,isSuccess:f,error:k,clearError:v,reset:y,remainingAttempts:b()}}function B({label:n="Password",labelAction:p,showStrengthMeter:x=!1,onValidationChange:u,error:f,className:c="",onChange:k,value:d,...h}){const[m,b]=t.useState(!1),[l,g]=t.useState(null),v=t.useId(),y=r=>{const s=r.target.value;if(x||u){const a=V.validatePassword(s);g(a),u?.(a)}k?.(r)},w={weak:"var(--cedros-destructive, #ef4444)",fair:"var(--cedros-warning, #f59e0b)",good:"var(--cedros-success, #22c55e)",strong:"var(--cedros-success, #22c55e)"};return e.jsxs("div",{className:`cedros-password-input ${c}`,children:[e.jsxs("div",{className:"cedros-label-row",children:[e.jsx("label",{htmlFor:v,className:"cedros-label",children:n}),p]}),e.jsxs("div",{className:"cedros-password-wrapper",children:[e.jsx("input",{id:v,type:m?"text":"password",className:"cedros-input",onChange:y,value:d,"aria-invalid":f?"true":void 0,"aria-describedby":f?`${v}-error`:void 0,...h}),e.jsx("button",{type:"button",className:"cedros-password-toggle",onClick:()=>b(!m),"aria-label":m?"Hide password":"Show password","aria-pressed":m,children:m?e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true",children:[e.jsx("path",{d:"M2.5 10s3-6 7.5-6 7.5 6 7.5 6-3 6-7.5 6-7.5-6-7.5-6z",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("circle",{cx:"10",cy:"10",r:"2.5",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("path",{d:"M3 17L17 3",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})]}):e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true",children:[e.jsx("path",{d:"M2.5 10s3-6 7.5-6 7.5 6 7.5 6-3 6-7.5 6-7.5-6-7.5-6z",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("circle",{cx:"10",cy:"10",r:"2.5",stroke:"currentColor",strokeWidth:"1.5"})]})})]}),f&&e.jsx("p",{id:`${v}-error`,className:"cedros-input-error",children:f}),x&&l&&d?.length>0&&e.jsxs("div",{className:"cedros-password-strength",children:[e.jsx("div",{className:"cedros-strength-bar",children:e.jsx("div",{className:"cedros-strength-fill",style:{width:`${l.strength==="weak"?25:l.strength==="fair"?50:l.strength==="good"?75:100}%`,backgroundColor:w[l.strength]}})}),e.jsx("span",{className:"cedros-strength-label",children:l.strength})]})]})}function K(){const{config:n,_internal:p}=N.useCedrosLogin(),[x,u]=t.useState("idle"),[f,c]=t.useState(!1),[k,d]=t.useState(null),{checkLimit:h,getRemainingAttempts:m,getTimeUntilReset:b,reset:l}=P({maxAttempts:5,windowMs:12e4}),g=t.useMemo(()=>new N.ApiClient({baseUrl:n.serverUrl,timeoutMs:n.requestTimeout,retryAttempts:n.retryAttempts}),[n.serverUrl,n.requestTimeout,n.retryAttempts]),v=t.useCallback(async(r,s)=>{const a=/^[A-Z0-9]{16}$/i.test(s)||/^[A-Z0-9]{4}(-[A-Z0-9]{4}){3}$/i.test(s);if(!(/^\d{6}$/.test(s)||a)){const o={code:"VALIDATION_ERROR",message:"Please enter a valid 6-digit code or recovery code"};throw d(o),o}try{h()}catch(o){const C={code:"RATE_LIMITED",message:o instanceof Error?o.message:"Too many attempts"};throw d(C),C}c(!0),d(null),u("verifying");try{const o=await g.post("/login/mfa",{mfaToken:r,code:s});return u("success"),l(),p&&o.user&&o.tokens&&p.handleLoginSuccess(o.user,o.tokens),o}catch(o){const C=N.handleApiError(o,"Invalid verification code");throw d(C),u("error"),C}finally{c(!1)}},[g,p,h,l]),y=t.useCallback(()=>d(null),[]),w=t.useCallback(()=>{d(null),u("idle"),c(!1)},[]);return{state:x,isLoading:f,error:k,verifyTotp:v,clearError:y,reset:w,remainingAttempts:m(),timeUntilReset:b()}}const L=6;function Z({value:n="",onChange:p,onComplete:x,disabled:u=!1,error:f,autoFocus:c=!1,className:k=""}){const d=t.useRef([]),[h,m]=t.useState(n.padEnd(L,"")),b=t.useId();t.useEffect(()=>{m(n.padEnd(L,""))},[n]);const l=t.useCallback(s=>{s>=0&&s<L&&d.current[s]?.focus()},[]),g=t.useCallback(s=>{const a=s.replace(/\D/g,"").slice(0,L);m(a.padEnd(L,"")),p?.(a),a.length===L&&x?.(a)},[p,x]),v=t.useCallback((s,a)=>{if(!/^\d?$/.test(a))return;const i=h.split("");i[s]=a;const o=i.join("").replace(/ /g,"");g(o),a&&s<L-1&&l(s+1)},[h,g,l]),y=t.useCallback((s,a)=>{if(a.key==="Backspace"){a.preventDefault();const i=h.split("");i[s]&&i[s]!==" "?(i[s]=" ",g(i.join("").replace(/ /g,""))):s>0&&(i[s-1]=" ",g(i.join("").replace(/ /g,"")),l(s-1))}else a.key==="ArrowLeft"&&s>0?(a.preventDefault(),l(s-1)):a.key==="ArrowRight"&&s<L-1&&(a.preventDefault(),l(s+1))},[h,g,l]),w=t.useCallback(s=>{s.preventDefault();const i=s.clipboardData.getData("text").replace(/\D/g,"").slice(0,L);i&&(g(i),l(Math.min(i.length,L-1)))},[g,l]),r=t.useCallback(s=>{s.target.select()},[]);return t.useEffect(()=>{c&&!u&&d.current[0]?.focus()},[c,u]),e.jsxs("div",{className:`cedros-otp-input ${k}`,children:[e.jsx("div",{className:"cedros-otp-slots",role:"group","aria-label":"One-time password",children:Array.from({length:L}).map((s,a)=>e.jsx("input",{ref:i=>{d.current[a]=i},id:`${b}-${a}`,type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:1,className:`cedros-otp-slot ${f?"cedros-otp-slot-error":""}`,value:h[a]===" "?"":h[a]||"",onChange:i=>v(a,i.target.value),onKeyDown:i=>y(a,i),onPaste:w,onFocus:r,disabled:u,autoComplete:"one-time-code","aria-label":`Digit ${a+1}`,"aria-invalid":f?"true":void 0},a))}),f&&e.jsx("p",{className:"cedros-otp-error",role:"alert",children:f})]})}function Y({mfaToken:n,email:p,onSuccess:x,onBack:u,className:f=""}){const{verifyTotp:c,isLoading:k,error:d,clearError:h}=K(),[m,b]=t.useState(""),[l,g]=t.useState(!1),[v,y]=t.useState(""),w=async a=>{const i=a||(l?v:m);if(i)try{await c(n,i),x?.()}catch{l?y(""):b("")}},r=a=>{w(a)},s=()=>{g(!l),h(),b(""),y("")};return e.jsxs("div",{className:`cedros-totp-verify ${f}`,children:[e.jsxs("div",{className:"cedros-totp-verify-header",children:[e.jsxs("svg",{className:"cedros-totp-verify-icon",width:"48",height:"48",viewBox:"0 0 48 48",fill:"none","aria-hidden":"true",children:[e.jsx("rect",{x:"8",y:"20",width:"32",height:"24",rx:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M16 20V14a8 8 0 1 1 16 0v6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),e.jsx("circle",{cx:"24",cy:"32",r:"3",fill:"currentColor"})]}),e.jsx("h3",{className:"cedros-totp-title",children:"Two-factor authentication"}),e.jsx("p",{className:"cedros-totp-description",children:l?"Enter one of your recovery codes to sign in.":"Enter the 6-digit code from your authenticator app."}),p&&e.jsx("p",{className:"cedros-totp-email",children:p})]}),l?e.jsxs("div",{className:"cedros-totp-backup-input",children:[e.jsx("input",{type:"text",className:`cedros-input ${d?"cedros-input-error":""}`,placeholder:"Enter recovery code",value:v,onChange:a=>{y(a.target.value.toUpperCase()),h()},onKeyDown:a=>{a.key==="Enter"&&v&&w()},disabled:k,autoFocus:!0,autoComplete:"one-time-code"}),d&&e.jsx("p",{className:"cedros-input-error",role:"alert",children:d.message})]}):e.jsx(Z,{value:m,onChange:a=>{b(a),h()},onComplete:r,disabled:k,error:d?.message,autoFocus:!0}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-primary cedros-button-md cedros-button-full",onClick:()=>w(),disabled:k||(l?!v:m.length!==6),children:k?e.jsxs(e.Fragment,{children:[e.jsx(F.LoadingSpinner,{size:"sm"}),e.jsx("span",{children:"Verifying..."})]}):"Verify"}),e.jsxs("div",{className:"cedros-totp-verify-footer",children:[e.jsx("button",{type:"button",className:"cedros-link cedros-link-sm",onClick:s,disabled:k,children:l?"Use authenticator app":"Use a recovery code"}),u&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"cedros-totp-verify-divider",children:"•"}),e.jsx("button",{type:"button",className:"cedros-link cedros-link-sm",onClick:u,disabled:k,children:"Back to login"})]})]})]})}function oe({onSuccess:n,onSwitchToRegister:p,onForgotPassword:x,className:u=""}){const{config:f}=N.useCedrosLogin(),{login:c,isLoading:k,error:d,clearError:h}=_(),{sendInstantLink:m,isLoading:b,isSuccess:l,error:g,clearError:v,reset:y}=H(),[w,r]=t.useState(""),[s,a]=t.useState(""),[i,o]=t.useState(null),[C,I]=t.useState(""),A=f.forms?.forgotPassword?.mode??"reset",j=async S=>{S.preventDefault();try{const q=await c(w,s);q.mfaRequired?(o(q.mfaToken),I(q.email)):n?.()}catch{}},R=()=>{o(null),I(""),n?.()},O=()=>{o(null),I(""),a("")},M=async()=>{if(A==="instantLink")try{await m(w)}catch{}else x?.()};if(i)return e.jsx(Y,{mfaToken:i,email:C,onSuccess:R,onBack:O,className:u});if(l)return e.jsxs("div",{className:`cedros-instant-link-success ${u}`,children:[e.jsxs("svg",{className:"cedros-success-icon",width:"48",height:"48",viewBox:"0 0 48 48",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{cx:"24",cy:"24",r:"22",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M14 24l7 7 13-13",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),e.jsx("h3",{className:"cedros-success-title",children:"Check your email"}),e.jsxs("p",{className:"cedros-success-message",children:["We sent a sign-in link to ",e.jsx("strong",{children:w}),". Click the link to sign in."]}),e.jsx("button",{type:"button",className:"cedros-button cedros-button-md cedros-button-outline",onClick:y,children:"Back to login"})]});const $=d||g,U=()=>{h(),v()},T=k||b;return e.jsxs("form",{onSubmit:j,className:`cedros-form ${u}`,children:[e.jsxs("div",{className:"cedros-form-field",children:[e.jsx("label",{htmlFor:"email",className:"cedros-label",children:"Email"}),e.jsx("input",{id:"email",type:"email",className:"cedros-input",value:w,onChange:S=>r(S.target.value),placeholder:"you@example.com",required:!0,"aria-required":"true",autoComplete:"email",disabled:T})]}),e.jsx("div",{className:"cedros-form-field",children:e.jsx(B,{value:s,onChange:S=>a(S.target.value),placeholder:"Enter your password",required:!0,autoComplete:"current-password",disabled:T,labelAction:x||A==="instantLink"?e.jsx("button",{type:"button",className:"cedros-link cedros-link-sm",onClick:M,disabled:b,children:b?"Sending...":"Forgot your password?"}):void 0})}),e.jsx(z.ErrorMessage,{error:$,onDismiss:U}),e.jsx("button",{type:"submit",className:"cedros-button cedros-button-primary cedros-button-md cedros-button-full",disabled:T||!w||!s,"aria-busy":k,children:k?e.jsxs(e.Fragment,{children:[e.jsx(F.LoadingSpinner,{size:"sm",announce:!0,label:"Signing in"}),e.jsx("span",{children:"Signing in..."})]}):"Sign in"}),p&&e.jsxs("p",{className:"cedros-form-footer",children:["Don't have an account?"," ",e.jsx("button",{type:"button",className:"cedros-link",onClick:p,children:"Sign up"})]})]})}function ne({onSuccess:n,onSwitchToLogin:p,className:x=""}){const{config:u}=N.useCedrosLogin(),{register:f,isLoading:c,error:k,clearError:d}=_(),[h,m]=t.useState(""),[b,l]=t.useState(""),[g,v]=t.useState(""),[y,w]=t.useState(""),[r,s]=t.useState(null),[a,i]=t.useState(null),o=u.forms?.termsOfService,C=u.forms?.emailOptIn,I=o?.show??!1,A=o?.required??!0,j=o?.defaultChecked??!1,R=o?.label??"I agree to the Terms of Service",O=o?.url,M=te.sanitizeExternalUrl(O),$=C?.show??!1,U=C?.defaultChecked??!1,T=C?.label??"Send me updates and news",[S,q]=t.useState(j),[G,J]=t.useState(U),D=g===y,Q=r?.isValid??!1,W=b&&g&&y&&D&&Q&&(!I||!A||S)&&!c,X=async E=>{if(E.preventDefault(),i(null),I&&A&&!S){i({code:"VALIDATION_ERROR",message:"You must agree to the Terms of Service to continue"});return}if(W)try{await f(b,g,h||void 0),n?.()}catch{}},ee=k||a,se=()=>{d(),i(null)};return e.jsxs("form",{onSubmit:X,className:`cedros-form ${x}`,children:[e.jsxs("div",{className:"cedros-form-field",children:[e.jsxs("label",{htmlFor:"name",className:"cedros-label",children:["Name ",e.jsx("span",{className:"cedros-optional",children:"(optional)"})]}),e.jsx("input",{id:"name",type:"text",className:"cedros-input",value:h,onChange:E=>m(E.target.value),placeholder:"Your name",autoComplete:"name",disabled:c})]}),e.jsxs("div",{className:"cedros-form-field",children:[e.jsx("label",{htmlFor:"register-email",className:"cedros-label",children:"Email"}),e.jsx("input",{id:"register-email",type:"email",className:"cedros-input",value:b,onChange:E=>l(E.target.value),placeholder:"you@example.com",required:!0,"aria-required":"true",autoComplete:"email",disabled:c})]}),e.jsx("div",{className:"cedros-form-field",children:e.jsx(B,{value:g,onChange:E=>v(E.target.value),placeholder:"Create a password",required:!0,autoComplete:"new-password",disabled:c,showStrengthMeter:!0,onValidationChange:s})}),e.jsxs("div",{className:"cedros-form-field",children:[e.jsx("label",{htmlFor:"confirm-password",className:"cedros-label",children:"Confirm Password"}),e.jsx("input",{id:"confirm-password",type:"password",className:"cedros-input",value:y,onChange:E=>w(E.target.value),placeholder:"Confirm your password",required:!0,"aria-required":"true",autoComplete:"new-password",disabled:c,"aria-invalid":y&&!D?"true":void 0,"aria-describedby":y&&!D?"confirm-password-error":void 0}),y&&!D&&e.jsx("p",{id:"confirm-password-error",className:"cedros-input-error",role:"alert",children:"Passwords do not match"})]}),I&&e.jsx("div",{className:"cedros-form-field cedros-checkbox-field",children:e.jsxs("label",{className:"cedros-checkbox-label",children:[e.jsx("input",{type:"checkbox",className:"cedros-checkbox",checked:S,onChange:E=>q(E.target.checked),disabled:c,"aria-required":A}),e.jsxs("span",{className:"cedros-checkbox-text",children:[M?e.jsxs(e.Fragment,{children:[R.replace("Terms of Service","").trim()||"I agree to the"," ",e.jsx("a",{href:M,target:"_blank",rel:"noopener noreferrer",className:"cedros-link",children:"Terms of Service"})]}):R,A&&e.jsx("span",{className:"cedros-required",children:"*"})]})]})}),$&&e.jsx("div",{className:"cedros-form-field cedros-checkbox-field",children:e.jsxs("label",{className:"cedros-checkbox-label",children:[e.jsx("input",{type:"checkbox",className:"cedros-checkbox",checked:G,onChange:E=>J(E.target.checked),disabled:c}),e.jsx("span",{className:"cedros-checkbox-text",children:T})]})}),e.jsx(z.ErrorMessage,{error:ee,onDismiss:se}),e.jsx("button",{type:"submit",className:"cedros-button cedros-button-primary cedros-button-md cedros-button-full",disabled:!W,"aria-busy":c,children:c?e.jsxs(e.Fragment,{children:[e.jsx(F.LoadingSpinner,{size:"sm",announce:!0,label:"Creating account"}),e.jsx("span",{children:"Creating account..."})]}):"Create account"}),p&&e.jsxs("p",{className:"cedros-form-footer",children:["Already have an account?"," ",e.jsx("button",{type:"button",className:"cedros-link",onClick:p,children:"Sign in"})]})]})}exports.EmailLoginForm=oe;exports.EmailRegisterForm=ne;exports.OtpInput=Z;exports.PasswordInput=B;exports.TotpVerify=Y;exports.useEmailAuth=_;exports.useInstantLink=H;exports.useRateLimiter=P;exports.useTotpVerify=K;
@@ -1 +0,0 @@
1
- "use strict";const u=require("react/jsx-runtime"),i=require("react"),I=require("./apiClient-CTTKhsYb.cjs"),S=require("./LoadingSpinner-d6sSxgQN.cjs"),k={loading:!1,loaded:!1,error:null,callbacks:[],load(){return typeof window>"u"||typeof document>"u"?Promise.reject(new Error("Google Sign-In script loader cannot run in SSR")):this.loaded?Promise.resolve():this.loading?new Promise((e,d)=>{this.callbacks.push({resolve:e,reject:d})}):(this.loading=!0,new Promise((e,d)=>{this.callbacks.push({resolve:e,reject:d});const g=document.getElementById("google-gsi-script");if(g){window.google?.accounts?.id?(this.loaded=!0,this.loading=!1,this.callbacks.forEach(t=>t.resolve()),this.callbacks=[]):g.addEventListener("load",()=>{this.loaded=!0,this.loading=!1,this.callbacks.forEach(t=>t.resolve()),this.callbacks=[]});return}const o=document.createElement("script");o.src="https://accounts.google.com/gsi/client",o.async=!0,o.defer=!0,o.id="google-gsi-script",o.onload=()=>{this.loaded=!0,this.loading=!1,this.callbacks.forEach(t=>t.resolve()),this.callbacks=[]},o.onerror=()=>{this.loading=!1,o.remove();const t=new Error("Failed to load Google Sign-In script");this.callbacks.forEach(f=>f.reject(t)),this.callbacks=[]},document.head.appendChild(o)}))},_reset(){this.loading=!1,this.loaded=!1,this.error=null,this.callbacks=[]}};function w(){const{config:e,_internal:d}=I.useCedrosLogin(),[g,o]=i.useState(!1),[t,f]=i.useState(!1),[E,n]=i.useState(null),c=i.useRef(null),p=i.useRef(e),m=i.useMemo(()=>new I.ApiClient({baseUrl:e.serverUrl,timeoutMs:e.requestTimeout,retryAttempts:e.retryAttempts}),[e.serverUrl,e.requestTimeout,e.retryAttempts]);i.useEffect(()=>{p.current=e},[e]);const R=i.useCallback(async s=>{const r=c.current;if(r)try{const a=await m.post("/google",{idToken:s.credential});p.current.callbacks?.onLoginSuccess?.(a.user,"google"),d?.handleLoginSuccess(a.user,a.tokens),o(!1),r.resolve(a)}catch(a){const l=I.handleApiError(a,"Google sign-in failed");n(l),o(!1),r.reject(l)}finally{c.current=null}},[m,d]);i.useEffect(()=>{if(!e.googleClientId)return;let s=!0;const r=()=>{s&&(window.google?.accounts?.id?.initialize({client_id:e.googleClientId,callback:R,auto_select:!1,cancel_on_tap_outside:!0}),s&&f(!0))};return k.load().then(()=>{s&&r()}).catch(()=>{s&&n({code:"SERVER_ERROR",message:"Failed to load Google Sign-In"})}),()=>{s=!1}},[e.googleClientId,R]);const h=i.useCallback(async()=>{if(!e.googleClientId){const s={code:"VALIDATION_ERROR",message:"Google Client ID not configured"};throw n(s),s}if(!t){const s={code:"VALIDATION_ERROR",message:"Google Sign-In not initialized"};throw n(s),s}if(c.current){const s={code:"VALIDATION_ERROR",message:"Google Sign-In already in progress"};throw n(s),s}return o(!0),n(null),new Promise((s,r)=>{c.current={resolve:s,reject:r},window.google?.accounts?.id?.prompt(a=>{if(a.isNotDisplayed()){const l={code:"SERVER_ERROR",message:"Google Sign-In popup was blocked. Please allow popups or try again."};n(l),o(!1),c.current=null,r(l)}else if(a.isSkippedMoment()){const l={code:"SERVER_ERROR",message:"Google Sign-In was cancelled"};n(l),o(!1),c.current=null,r(l)}else if(a.isDismissedMoment()){const l={code:"SERVER_ERROR",message:"Google Sign-In was cancelled"};n(l),o(!1),c.current=null,r(l)}})})},[e.googleClientId,t]),b=i.useCallback(()=>n(null),[]);return{signIn:h,isLoading:g,isInitialized:t,error:E,clearError:b}}function C({onSuccess:e,onError:d,className:g="",variant:o="default",size:t="md",disabled:f=!1}){const{signIn:E,isLoading:n,isInitialized:c}=w(),p=async()=>{try{await E(),e?.()}catch(h){const b=h instanceof Error?h:new Error(String(h));d?.(b)}},m={sm:"cedros-button-sm",md:"cedros-button-md",lg:"cedros-button-lg"},R={default:"cedros-button-google",outline:"cedros-button-google-outline"};return u.jsxs("button",{type:"button",className:`cedros-button ${R[o]} ${m[t]} ${g}`,onClick:p,disabled:f||!c||n,"aria-label":"Sign in with Google",children:[n?u.jsx(S.LoadingSpinner,{size:"sm"}):u.jsxs("svg",{className:"cedros-button-icon",width:"18",height:"18",viewBox:"0 0 18 18",fill:"none","aria-hidden":"true",children:[u.jsx("path",{d:"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.874 2.684-6.615z",fill:"#4285F4"}),u.jsx("path",{d:"M9.003 18c2.43 0 4.467-.806 5.956-2.18l-2.909-2.26c-.806.54-1.836.86-3.047.86-2.344 0-4.328-1.584-5.036-3.711H.96v2.332A8.997 8.997 0 0 0 9.003 18z",fill:"#34A853"}),u.jsx("path",{d:"M3.964 10.712A5.41 5.41 0 0 1 3.682 9c0-.593.102-1.17.282-1.71V4.958H.96A8.996 8.996 0 0 0 0 9c0 1.452.348 2.827.96 4.042l3.004-2.33z",fill:"#FBBC05"}),u.jsx("path",{d:"M9.003 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.464.891 11.428 0 9.002 0A8.997 8.997 0 0 0 .96 4.958l3.005 2.332c.708-2.127 2.692-3.71 5.036-3.71z",fill:"#EA4335"})]}),u.jsx("span",{children:"Continue with Google"})]})}exports.GoogleLoginButton=C;exports.useGoogleAuth=w;
@@ -1 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),r=require("react"),k=require("./LoadingSpinner-d6sSxgQN.cjs"),T=require("./ErrorMessage-CHbYbVi2.cjs"),D=require("./sanitization-Bo_tn-L2.cjs"),F=require("./validation-BuGQrA-K.cjs"),A=require("./apiClient-CTTKhsYb.cjs"),P=require("./useOrgs-CVbacmaQ.cjs"),q=require("./useSystemSettings-D9Cr7ZTl.cjs"),U=["owner","admin","member"];function z({members:s,currentUserId:t,isLoading:a=!1,error:i,canManage:n=!1,canChangeRoles:o=!1,onUpdateRole:f,onRemove:m,className:h=""}){const[l,j]=r.useState("name"),[d,y]=r.useState("asc"),p=u=>{l===u?y(d==="asc"?"desc":"asc"):(j(u),y("asc"))},c=r.useMemo(()=>{const u={owner:0,admin:1,member:2};return[...s].sort((g,b)=>{let S,w;switch(l){case"name":S=(g.user.name||g.user.email||"").toLowerCase(),w=(b.user.name||b.user.email||"").toLowerCase();break;case"role":S=u[g.role]??99,w=u[b.role]??99;break;case"joinedAt":S=new Date(g.joinedAt).getTime(),w=new Date(b.joinedAt).getTime();break;default:return 0}return S<w?d==="asc"?-1:1:S>w?d==="asc"?1:-1:0})},[s,l,d]);return a&&s.length===0?e.jsxs("div",{className:`cedros-member-list cedros-member-list-loading ${h}`,children:[e.jsx(k.LoadingSpinner,{}),e.jsx("span",{children:"Loading members..."})]}):i?e.jsx("div",{className:`cedros-member-list ${h}`,children:e.jsx(T.ErrorMessage,{error:i})}):s.length===0?e.jsx("div",{className:`cedros-member-list cedros-member-list-empty ${h}`,children:e.jsx("p",{children:"No members found."})}):e.jsx("div",{className:`cedros-member-list ${h}`,children:e.jsxs("table",{className:"cedros-member-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="name"?"cedros-admin-sort-active":""}`,onClick:()=>p("name"),children:["Member"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="name"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="role"?"cedros-admin-sort-active":""}`,onClick:()=>p("role"),children:["Role"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="role"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="joinedAt"?"cedros-admin-sort-active":""}`,onClick:()=>p("joinedAt"),children:["Joined"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="joinedAt"?d==="asc"?"↑":"↓":"↕"})]})}),(n||o)&&e.jsx("th",{children:"Actions"})]})}),e.jsx("tbody",{children:c.map(u=>e.jsx(B,{member:u,isCurrentUser:u.userId===t,canManage:n,canChangeRoles:o,onUpdateRole:f,onRemove:m},u.id))})]})})}function B({member:s,isCurrentUser:t,canManage:a,canChangeRoles:i,onUpdateRole:n,onRemove:o}){const[f,m]=r.useState(!1),[h,l]=r.useState(s.role),j=r.useCallback(async c=>{if(!(!n||c===s.role)){m(!0);try{await n(s.userId,c),l(c)}catch{l(s.role)}finally{m(!1)}}},[s.userId,s.role,n]),d=r.useCallback(async()=>{if(!(!o||!window.confirm(`Are you sure you want to remove ${s.user.name||s.user.email} from this organization?`))){m(!0);try{await o(s.userId)}finally{m(!1)}}},[s.userId,s.user.name,s.user.email,o]),y=s.role==="owner",p=!t&&!y;return e.jsxs("tr",{className:`cedros-member-row ${t?"cedros-member-row-current":""}`,children:[e.jsxs("td",{className:"cedros-member-info",children:[e.jsx(W,{user:s.user}),e.jsxs("div",{className:"cedros-member-details",children:[e.jsxs("span",{className:"cedros-member-name",children:[s.user.name||"Unknown",t&&e.jsx("span",{className:"cedros-member-you",children:"(you)"})]}),e.jsx("span",{className:"cedros-member-email",children:s.user.email})]})]}),e.jsx("td",{className:"cedros-member-role",children:i&&p&&n?e.jsx("select",{value:h,onChange:c=>j(c.target.value),disabled:f,className:"cedros-role-select",children:U.map(c=>e.jsx("option",{value:c,children:c.charAt(0).toUpperCase()+c.slice(1)},c))}):e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)})}),e.jsx("td",{className:"cedros-member-joined",children:H(s.joinedAt)}),(a||i)&&e.jsx("td",{className:"cedros-member-actions",children:a&&p&&o&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:d,disabled:f,"aria-label":`Remove ${s.user.name||s.user.email}`,children:f?e.jsx(k.LoadingSpinner,{size:"sm"}):"Remove"})})]})}function W({user:s}){const t=D.sanitizeImageUrl(s.picture);if(t)return e.jsx("img",{src:t,alt:s.name||s.email||"Member",className:"cedros-member-avatar",referrerPolicy:"no-referrer"});const a=(s.name?.[0]||s.email?.[0]||"?").toUpperCase();return e.jsx("div",{className:"cedros-member-avatar-placeholder",children:a})}function H(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}const V=["admin","member"];function K({onSubmit:s,isLoading:t=!1,error:a,availableRoles:i=V,defaultRole:n="member",className:o=""}){const[f,m]=r.useState(""),[h,l]=r.useState(n),[j,d]=r.useState(null),[y,p]=r.useState(!1),c=r.useRef(null),u=r.useRef(!0);r.useEffect(()=>(u.current=!0,()=>{u.current=!1,c.current!==null&&(window.clearTimeout(c.current),c.current=null)}),[]);const g=r.useCallback(async b=>{b.preventDefault(),d(null),p(!1);const S=f.trim();if(!S){d("Email is required");return}if(!F.validateEmail(S)){d("Please enter a valid email address");return}try{await s(S,h),m(""),l(n),p(!0),c.current!==null&&window.clearTimeout(c.current),c.current=window.setTimeout(()=>{u.current&&p(!1),c.current=null},3e3)}catch{}},[f,h,n,s]);return e.jsxs("form",{className:`cedros-invite-form ${o}`,onSubmit:g,children:[(a||j)&&e.jsx(T.ErrorMessage,{error:j??a??null}),y&&e.jsxs("div",{className:"cedros-invite-success",role:"status",children:[e.jsx(G,{}),e.jsx("span",{children:"Invitation sent successfully!"})]}),e.jsxs("div",{className:"cedros-invite-form-row",children:[e.jsxs("div",{className:"cedros-form-group cedros-invite-email-group",children:[e.jsx("label",{htmlFor:"invite-email",className:"cedros-form-label",children:"Email Address"}),e.jsx("input",{id:"invite-email",type:"email",className:"cedros-form-input",value:f,onChange:b=>m(b.target.value),placeholder:"colleague@example.com",disabled:t,autoComplete:"email"})]}),e.jsxs("div",{className:"cedros-form-group cedros-invite-role-group",children:[e.jsx("label",{htmlFor:"invite-role",className:"cedros-form-label",children:"Role"}),e.jsx("select",{id:"invite-role",className:"cedros-form-select",value:h,onChange:b=>l(b.target.value),disabled:t,children:i.map(b=>e.jsx("option",{value:b,children:b.charAt(0).toUpperCase()+b.slice(1)},b))})]}),e.jsx("button",{type:"submit",className:"cedros-button cedros-button-primary cedros-invite-submit",disabled:t||!f.trim(),children:t?e.jsx(k.LoadingSpinner,{size:"sm"}):"Send Invite"})]}),e.jsx("p",{className:"cedros-form-hint",children:"The invited user will receive an email with a link to join your organization."})]})}function G(){return e.jsx("svg",{className:"cedros-invite-check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M3 8L6 11L13 5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function J({invites:s,isLoading:t=!1,error:a,canManage:i=!1,onCancel:n,onResend:o,className:f=""}){return t&&s.length===0?e.jsxs("div",{className:`cedros-invite-list cedros-invite-list-loading ${f}`,children:[e.jsx(k.LoadingSpinner,{}),e.jsx("span",{children:"Loading invites..."})]}):a?e.jsx("div",{className:`cedros-invite-list ${f}`,children:e.jsx(T.ErrorMessage,{error:a})}):s.length===0?e.jsx("div",{className:`cedros-invite-list cedros-invite-list-empty ${f}`,children:e.jsx("p",{children:"No pending invites."})}):e.jsx("div",{className:`cedros-invite-list ${f}`,children:e.jsx("ul",{className:"cedros-invite-items",children:s.map(m=>e.jsx(Y,{invite:m,canManage:i,onCancel:n,onResend:o},m.id))})})}function Y({invite:s,canManage:t,onCancel:a,onResend:i}){const[n,o]=r.useState(!1),[f,m]=r.useState(!1),h=r.useRef(null),l=new Date(s.expiresAt)<new Date,j=r.useCallback(async()=>{if(!(!a||!window.confirm(`Are you sure you want to cancel the invite for ${s.email}?`))){o(!0);try{await a(s.id)}finally{o(!1)}}},[s.id,s.email,a]),d=r.useCallback(async()=>{if(i){o(!0),m(!1);try{await i(s.id),m(!0),h.current!==null&&window.clearTimeout(h.current),h.current=window.setTimeout(()=>{m(!1),h.current=null},3e3)}finally{o(!1)}}},[s.id,i]);return r.useEffect(()=>()=>{h.current!==null&&(window.clearTimeout(h.current),h.current=null)},[]),e.jsxs("li",{className:`cedros-invite-item ${l?"cedros-invite-item-expired":""}`,children:[e.jsxs("div",{className:"cedros-invite-item-info",children:[e.jsxs("div",{className:"cedros-invite-item-main",children:[e.jsx("span",{className:"cedros-invite-item-email",children:s.email}),e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)}),l&&e.jsx("span",{className:"cedros-invite-expired-badge",children:"Expired"})]}),e.jsxs("div",{className:"cedros-invite-item-meta",children:[e.jsxs("span",{className:"cedros-invite-item-date",children:["Invited ",M(s.createdAt)]}),!l&&e.jsxs("span",{className:"cedros-invite-item-expires",children:["Expires ",Q(s.expiresAt)]})]})]}),t&&e.jsxs("div",{className:"cedros-invite-item-actions",children:[f&&e.jsx("span",{className:"cedros-invite-resend-success",children:"Sent!"}),i&&!l&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:d,disabled:n,"aria-label":`Resend invite to ${s.email}`,children:n?e.jsx(k.LoadingSpinner,{size:"sm"}):"Resend"}),a&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:j,disabled:n,"aria-label":`Cancel invite for ${s.email}`,children:"Cancel"})]})]})}function M(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Q(s){const t=new Date(s),a=new Date,i=t.getTime()-a.getTime(),n=Math.ceil(i/(1e3*60*60*24));return n<0?"expired":n===0?"today":n===1?"tomorrow":n<7?`in ${n} days`:M(s)}class X{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listMembers(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/members?limit=${a}&offset=${i}`);return{members:n.members.map(o=>({id:o.id,userId:o.userId,orgId:t,role:o.role,joinedAt:o.joinedAt,user:{id:o.userId,email:o.email,name:o.name}})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list members")}}async updateMemberRole(t,a,i){try{return await this.client.patch(`/orgs/${t}/members/${a}`,i)}catch(n){throw A.handleApiError(n,"Failed to update member role")}}async removeMember(t,a){try{await this.client.delete(`/orgs/${t}/members/${a}`)}catch(i){throw A.handleApiError(i,"Failed to remove member")}}}function Z(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[f,m]=r.useState(0),[h,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new X(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async w=>{if(!s||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const x=++p.current;try{const{limit:v=50,offset:N=0}=w??{},C=await u.current.listMembers(s,v,N);if(x!==p.current)return;o(C.members),m(C.total)}catch(v){if(x!==p.current)return;d(v)}finally{x===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(w,x)=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.updateMemberRole(s,w,{role:x}),await g()}catch(v){throw d(v),v}finally{l(!1)}},[s,g]),S=r.useCallback(async w=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.removeMember(s,w),await g()}catch(x){throw d(x),x}finally{l(!1)}},[s,g]);return{members:n,total:f,isLoading:h,error:j,fetchMembers:g,updateMemberRole:b,removeMember:S}}class ee{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listInvites(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/invites?limit=${a}&offset=${i}`);return{invites:n.invites.map(o=>({id:o.id,orgId:o.orgId,email:o.email,role:o.role,invitedBy:o.invitedBy,createdAt:o.createdAt,expiresAt:o.expiresAt})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list invites")}}async createInvite(t,a){try{return await this.client.post(`/orgs/${t}/invites`,a)}catch(i){throw A.handleApiError(i,"Failed to create invite")}}async cancelInvite(t,a){try{await this.client.delete(`/orgs/${t}/invites/${a}`)}catch(i){throw A.handleApiError(i,"Failed to cancel invite")}}async resendInvite(t,a){try{await this.client.post(`/orgs/${t}/invites/${a}/resend`,{})}catch(i){throw A.handleApiError(i,"Failed to resend invite")}}async acceptInvite(t){try{return await this.client.post("/invites/accept",t)}catch(a){throw A.handleApiError(a,"Failed to accept invite")}}}function se(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[f,m]=r.useState(0),[h,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new ee(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async v=>{if(!s||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const N=++p.current;try{const{limit:C=50,offset:O=0}=v??{},L=await u.current.listInvites(s,C,O);if(N!==p.current)return;o(L.invites),m(L.total)}catch(C){if(N!==p.current)return;d(C)}finally{N===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(v,N="member")=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.createInvite(s,{email:v,role:N}),await g()}catch(C){throw d(C),C}finally{l(!1)}},[s,g]),S=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.cancelInvite(s,v),await g()}catch(N){throw d(N),N}finally{l(!1)}},[s,g]),w=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.resendInvite(s,v)}catch(N){throw d(N),N}finally{l(!1)}},[s]),x=r.useCallback(async v=>{l(!0),d(null);try{return await u.current.acceptInvite({token:v})}catch(N){throw d(N),N}finally{l(!1)}},[]);return{invites:n,total:f,isLoading:h,error:j,fetchInvites:g,createInvite:b,cancelInvite:S,resendInvite:w,acceptInvite:x}}const te={organizations:!1,sso:!1,mfa:!1,walletSigning:!1,credits:!1,userWithdrawals:!1,cedrosPay:!1};function I(){const{settings:s,isLoading:t,error:a,fetchSettings:i,getValue:n}=q.useSystemSettings(),[o,f]=r.useState(!1);r.useEffect(()=>{o||(i(),f(!0))},[i,o]);const m=r.useCallback(d=>d===void 0?!1:d==="true"||d==="1",[]),h=r.useMemo(()=>Object.keys(s).length===0?te:{organizations:m(n("feature_organizations")),sso:m(n("feature_sso")),mfa:m(n("feature_mfa")),walletSigning:m(n("feature_wallet_signing")),credits:m(n("feature_credits")),userWithdrawals:m(n("feature_user_withdrawals")),cedrosPay:m(n("feature_cedros_pay"))},[s,n,m]),l=r.useCallback(async()=>{await i()},[i]),j=r.useCallback(d=>h[d],[h]);return{features:h,isLoading:t,error:a,refetch:l,isEnabled:j}}const re=["users","team","deposits","withdrawals","settings-wallet","settings-auth","settings-messaging","settings-credits","settings-server"],ne=["pay-products","pay-subscriptions","pay-transactions","pay-coupons","pay-refunds","pay-storefront","pay-ai","pay-payment","pay-messaging","pay-settings"],E={users:"Users",team:"Team",deposits:"Deposits",withdrawals:"Withdrawals","settings-wallet":"Wallet Settings","settings-auth":"Auth Settings","settings-messaging":"Messages Settings","settings-credits":"Credits Settings","settings-server":"Server Settings","pay-products":"Products","pay-subscriptions":"Subscriptions","pay-transactions":"Transactions","pay-coupons":"Coupons","pay-refunds":"Refunds","pay-storefront":"Storefront","pay-ai":"Store AI","pay-payment":"Payment Options","pay-messaging":"Store Messages","pay-settings":"Store Server"},$={admin:{users:!0,team:!0,deposits:!0,withdrawals:!0,"settings-wallet":!0,"settings-auth":!0,"settings-messaging":!0,"settings-credits":!0,"settings-server":!0,"pay-products":!0,"pay-subscriptions":!0,"pay-transactions":!0,"pay-coupons":!0,"pay-refunds":!0,"pay-storefront":!0,"pay-ai":!0,"pay-payment":!0,"pay-messaging":!0,"pay-settings":!0},member:{users:!1,team:!0,deposits:!1,withdrawals:!1,"settings-wallet":!1,"settings-auth":!1,"settings-messaging":!1,"settings-credits":!1,"settings-server":!1,"pay-products":!1,"pay-subscriptions":!1,"pay-transactions":!1,"pay-coupons":!1,"pay-refunds":!1,"pay-storefront":!1,"pay-ai":!1,"pay-payment":!1,"pay-messaging":!1,"pay-settings":!1}};function _(){const{config:s,authState:t,_internal:a}=A.useCedrosLogin(),{activeOrg:i,role:n}=P.useOrgs(),[o,f]=r.useState($),[m,h]=r.useState(!1),[l,j]=r.useState(!1),[d,y]=r.useState(null),p=r.useRef(0),c=r.useMemo(()=>new A.ApiClient({baseUrl:s.serverUrl,timeoutMs:s.requestTimeout,retryAttempts:s.retryAttempts,getAccessToken:a?.getAccessToken}),[s.serverUrl,s.requestTimeout,s.retryAttempts,a]),u=r.useRef(c);u.current=c;const g=r.useCallback(async()=>{if(t!=="authenticated"||!i){f($);return}h(!0),y(null);const w=++p.current;try{const x=await u.current.get("/admin/dashboard-permissions");if(w!==p.current)return;f(x.permissions)}catch(x){if(w!==p.current)return;if(x instanceof Error&&x.message.includes("404"))f($);else{const v=x instanceof Error?x.message:"Failed to fetch permissions";y({code:"NETWORK_ERROR",message:v}),f($)}}finally{w===p.current&&h(!1)}},[t,i]),b=r.useCallback(async w=>{if(t!=="authenticated"||!i)throw new Error("Not authenticated");if(n!=="owner")throw new Error("Only owners can modify dashboard permissions");j(!0),y(null);try{await u.current.request({method:"PUT",path:"/admin/dashboard-permissions",body:w}),f(w)}catch(x){const v=x instanceof Error?x.message:"Failed to update permissions";throw y({code:"NETWORK_ERROR",message:v}),new Error(v)}finally{j(!1)}},[t,i,n]),S=r.useCallback(w=>!i||!n||n==="owner"?!0:o[n]?.[w]??!1,[i,n,o]);return r.useEffect(()=>{i?.id&&g()},[i?.id,g]),{permissions:o,canAccess:S,updatePermissions:b,isLoading:m,isUpdating:l,error:d,fetchPermissions:g}}function R({checked:s,onChange:t,disabled:a,label:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:a,className:`cedros-toggle cedros-toggle-sm ${s?"cedros-toggle-on":"cedros-toggle-off"} ${a?"cedros-toggle-disabled":""}`,onClick:()=>!a&&t(!s),children:e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})})})}function ae({userRole:s}){const{permissions:t,updatePermissions:a,isLoading:i,isUpdating:n,error:o}=_(),{features:f,isLoading:m}=I(),h=r.useRef(null),l=r.useRef(null),j=s==="owner",d=f.cedrosPay,y=r.useCallback(c=>{l.current=c,h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{l.current&&(a(l.current).catch(()=>{}),l.current=null)},500)},[a]);r.useEffect(()=>()=>{h.current&&clearTimeout(h.current)},[]);const p=r.useCallback((c,u,g)=>{const b={...t,[c]:{...t[c],[u]:g}};y(b)},[t,y]);return i||m?e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__loading",children:"Loading permissions..."})}):j?e.jsxs("div",{className:"cedros-dashboard__section cedros-permissions-section",children:[e.jsxs("div",{className:"cedros-permissions-header",children:[e.jsx("p",{className:"cedros-permissions-description",children:"Configure which dashboard sections each role can access. Owners always have full access."}),o&&e.jsx("div",{className:"cedros-permissions-error",children:o.message}),n&&e.jsx("span",{className:"cedros-permissions-saving",children:"Saving..."})]}),e.jsx("div",{className:"cedros-permissions-matrix",children:e.jsx("table",{className:"cedros-permissions-table",children:e.jsxs("tbody",{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Login"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),re.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(R,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(R,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c)),d&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Pay"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),ne.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(R,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(R,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c))]})]})})})]}):e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__empty",children:"Only organization owners can configure dashboard permissions."})})}exports.InviteForm=K;exports.InviteList=J;exports.MemberList=z;exports.PermissionsSection=ae;exports.useDashboardPermissions=_;exports.useInvites=se;exports.useMembers=Z;exports.useServerFeatures=I;
@@ -1 +0,0 @@
1
- "use strict";const t=require("react/jsx-runtime"),l=require("react"),C=require("./apiClient-CTTKhsYb.cjs"),M=require("./validation-BuGQrA-K.cjs"),$=require("./LoadingSpinner-d6sSxgQN.cjs");function B(){const{config:a,_internal:n}=C.useCedrosLogin(),[u,f]=l.useState(!1),[E,r]=l.useState(null),g=l.useMemo(()=>new C.ApiClient({baseUrl:a.serverUrl,timeoutMs:a.requestTimeout,retryAttempts:a.retryAttempts}),[a.serverUrl,a.requestTimeout,a.retryAttempts]),s=l.useCallback(async h=>{if(!M.validateSolanaPublicKey(h)){const c={code:"INVALID_PUBLIC_KEY",message:"Invalid Solana public key format"};throw r(c),c}f(!0),r(null);try{return await g.post("/solana/challenge",{publicKey:h},{credentials:"omit"})}catch(c){const i=C.handleApiError(c,"Failed to get challenge");throw r(i),i}finally{f(!1)}},[g]),w=l.useCallback(async(h,c,i)=>{if(!M.validateSolanaPublicKey(h)){const o={code:"INVALID_PUBLIC_KEY",message:"Invalid Solana public key format"};throw r(o),o}f(!0),r(null);try{const o=await g.post("/solana",{publicKey:h,signature:c,message:i});return a.callbacks?.onLoginSuccess?.(o.user,"solana"),n?.handleLoginSuccess(o.user,o.tokens),o}catch(o){const d=C.handleApiError(o,"Solana sign-in failed");throw r(d),d}finally{f(!1)}},[g,a.callbacks,n]),y=l.useCallback(()=>r(null),[]);return{requestChallenge:s,signIn:w,isLoading:u,error:E,clearError:y}}const D=["phantom","solflare","backpack","glow","slope","sollet","coin98","clover","mathWallet","ledger","torus","walletconnect"];function q(a){if(!a||typeof a!="object")return!1;const n=a;return typeof n.connect=="function"||typeof n.signMessage=="function"||typeof n.signTransaction=="function"||"isConnected"in n}function T(){if(typeof window>"u")return!1;const a=window;for(const n of D){const u=a[n];if(u&&typeof u=="object"&&"solana"in u&&q(u.solana))return!0}return!!q(a.solana)}function F({onSuccess:a,onError:n,className:u="",variant:f="default",size:E="md",disabled:r=!1,hideIfNoWallet:g=!0,walletContext:s}){const{requestChallenge:w,signIn:y,isLoading:h}=B(),[c,i]=l.useState(!1),[o,d]=l.useState(!1),[W,L]=l.useState(!1),j=l.useRef(!1),[U]=l.useState(()=>T()),m=s?.connected??!1,k=s?.connecting??!1,p=s?.publicKey,S=s?.signMessage,x=s?.wallet,b=(s?.wallets??[]).filter(e=>e.adapter.readyState==="Installed"||e.adapter.readyState==="Loadable"),_=s?b.length>0:U,I=l.useCallback(async()=>{if(!j.current){if(!p||!S){n?.(new Error("Wallet not ready"));return}j.current=!0;try{const e=p.toBase58(),v=await w(e),V=new TextEncoder().encode(v.message),N=await S(V);if(!(N instanceof Uint8Array)||N.length===0)throw new Error("Wallet returned invalid signature");let P;try{P=btoa(String.fromCharCode(...N))}catch{throw new Error("Failed to encode signature")}await y(e,P,v.message),a?.()}catch(e){const v=e instanceof Error?e:new Error(String(e));n?.(v)}finally{j.current=!1,d(!1)}}},[p,S,w,y,a,n]);if(l.useEffect(()=>{W&&x&&!m&&!k&&s?.connect&&(L(!1),s.connect().catch(e=>{n?.(e instanceof Error?e:new Error(String(e))),d(!1)}))},[W,x,m,k,s,n]),l.useEffect(()=>{o&&m&&p&&S&&!j.current&&I().catch(()=>{})},[o,m,p,S,I]),g&&!_)return null;const z=async()=>{r||h||k||(m&&p&&S?(d(!0),await I()):x?(d(!0),L(!0)):b.length===1?(s?.select(b[0].adapter.name),d(!0),L(!0)):b.length>1?i(!0):n?.(new Error("No Solana wallet found. Please install Phantom or another Solana wallet.")))},K=e=>{i(!1),s?.select(e),d(!0),L(!0)},R={sm:"cedros-button-sm",md:"cedros-button-md",lg:"cedros-button-lg"},H={default:"cedros-button-solana",outline:"cedros-button-solana-outline"},A=h||k||o&&!m;return t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:`cedros-button ${H[f]} ${R[E]} ${u}`,onClick:z,disabled:r||A,"aria-label":"Continue with Solana",children:[A?t.jsx($.LoadingSpinner,{size:"sm"}):t.jsxs("svg",{className:"cedros-button-icon",width:"18",height:"18",viewBox:"0 0 128 128",fill:"currentColor","aria-hidden":"true",children:[t.jsx("path",{d:"M25.38 96.04a4.35 4.35 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7l-17.71 17.72a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7l17.71-17.72z"}),t.jsx("path",{d:"M25.38 11.81a4.47 4.47 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7L103.96 31.96a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7L25.38 11.81z"}),t.jsx("path",{d:"M102.62 53.76a4.35 4.35 0 0 0-3.07-1.27H7.87c-1.93 0-2.9 2.34-1.54 3.7l17.71 17.72a4.35 4.35 0 0 0 3.07 1.27h91.68c1.93 0 2.9-2.34 1.54-3.7L102.62 53.76z"})]}),t.jsx("span",{children:"Continue with Solana"})]}),c&&t.jsx("div",{className:"cedros-modal-backdrop",onClick:()=>i(!1),role:"presentation",children:t.jsxs("div",{className:"cedros-modal cedros-wallet-selector",role:"dialog","aria-modal":"true","aria-labelledby":"wallet-selector-title",onClick:e=>e.stopPropagation(),children:[t.jsxs("div",{className:"cedros-modal-header",children:[t.jsx("h2",{id:"wallet-selector-title",className:"cedros-modal-title",children:"Select Wallet"}),t.jsx("button",{type:"button",className:"cedros-modal-close",onClick:()=>i(!1),"aria-label":"Close",children:t.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:t.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})})]}),t.jsx("div",{className:"cedros-modal-content",children:t.jsx("div",{className:"cedros-wallet-list",children:b.map(e=>t.jsxs("button",{type:"button",className:"cedros-wallet-option",onClick:()=>K(e.adapter.name),children:[t.jsx("img",{src:e.adapter.icon,alt:"",width:"32",height:"32",className:"cedros-wallet-icon"}),t.jsx("span",{children:e.adapter.name})]},e.adapter.name))})})]})})]})}exports.SolanaLoginButton=F;exports.detectSolanaWallets=T;exports.useSolanaAuth=B;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),e=require("react"),m=require("./AdminUserDetail-BzEIdNJh.cjs"),b=require("./StatsBar-DTUZCwDD.cjs"),U=require("./useSystemSettings-D9Cr7ZTl.cjs"),p=["email","google","apple","solana","webauthn","sso"],E={email:"Email Users",google:"Google Users",apple:"Apple Users",solana:"Solana Users",webauthn:"Passkey Users",sso:"SSO Provider Users"},y={email:"auth_email_enabled",google:"auth_google_enabled",apple:"auth_apple_enabled",solana:"auth_solana_enabled",webauthn:"auth_webauthn_enabled",sso:"feature_sso"};function I(){const{getStats:n}=m.useAdminUsers(),{fetchSettings:u,getValue:l}=U.useSystemSettings(),[r,c]=e.useState(null),[d,o]=e.useState(!1),[S,i]=e.useState(null),[f,_]=e.useState(!1);e.useEffect(()=>{f||(u(),_(!0))},[u,f]);const g=e.useCallback(s=>{const t=l(s);return t===void 0?!1:t==="true"||t==="1"},[l]),h=e.useCallback(async()=>{o(!0),i(null);try{const s=await n();c(s)}catch(s){i(s instanceof Error?s.message:"Failed to load user stats")}finally{o(!1)}},[n]);return e.useEffect(()=>{h()},[h]),{statsItems:e.useMemo(()=>{const s=[{label:"Total Users",value:r?.total??"—"}];return p.forEach(t=>{g(y[t])&&s.push({label:E[t],value:r?.authMethodCounts[t]??0})}),s},[r,g]),isLoading:d,error:S,refresh:h}}function j({pluginContext:n,pageSize:u=20}){const[l,r]=e.useState(null),{statsItems:c,isLoading:d,error:o,refresh:S}=I();return l?a.jsx("div",{className:"cedros-dashboard__section",children:a.jsx(m.AdminUserDetail,{userId:l.id,onBack:()=>r(null),currentUserId:n.userId})}):a.jsxs("div",{className:"cedros-dashboard__section",children:[a.jsx(b.StatsBar,{stats:c,isLoading:d,onRefresh:S}),o&&a.jsx("p",{className:"cedros-admin-error-inline",children:o}),a.jsx("p",{className:"cedros-dashboard__text-muted",children:"All registered users in the system. Requires system admin privileges."}),a.jsx(m.AdminUserList,{pageSize:u,currentUserId:n.userId,onUserClick:i=>r(i)})]})}exports.default=j;
@@ -1 +0,0 @@
1
- {"version":3,"file":"UsersSection-C2U8Tb7V.cjs","sources":["../src/admin/sections/UsersSection.tsx"],"sourcesContent":["/**\n * Users Section - Plugin wrapper\n *\n * Admin user management with list and detail views.\n */\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { AdminSectionProps } from '../types';\nimport { AdminUserList } from '../../components/admin/AdminUserList';\nimport { AdminUserDetail } from '../../components/admin/AdminUserDetail';\nimport { StatsBar } from '../../components/admin/StatsBar';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport { useSystemSettings } from '../../hooks/useSystemSettings';\nimport type { AdminUser, AdminUserStatsResponse } from '../../types';\n\nconst METHOD_ORDER = ['email', 'google', 'apple', 'solana', 'webauthn', 'sso'] as const;\n\nconst METHOD_LABELS: Record<(typeof METHOD_ORDER)[number], string> = {\n email: 'Email Users',\n google: 'Google Users',\n apple: 'Apple Users',\n solana: 'Solana Users',\n webauthn: 'Passkey Users',\n sso: 'SSO Provider Users',\n};\n\nconst METHOD_SETTINGS: Record<(typeof METHOD_ORDER)[number], string> = {\n email: 'auth_email_enabled',\n google: 'auth_google_enabled',\n apple: 'auth_apple_enabled',\n solana: 'auth_solana_enabled',\n webauthn: 'auth_webauthn_enabled',\n sso: 'feature_sso',\n};\n\nfunction useUsersStats() {\n const { getStats } = useAdminUsers();\n const { fetchSettings, getValue } = useSystemSettings();\n const [stats, setStats] = useState<AdminUserStatsResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [settingsFetched, setSettingsFetched] = useState(false);\n\n useEffect(() => {\n if (!settingsFetched) {\n fetchSettings();\n setSettingsFetched(true);\n }\n }, [fetchSettings, settingsFetched]);\n\n const isSettingEnabled = useCallback(\n (key: string): boolean => {\n const value = getValue(key);\n if (value === undefined) return false;\n return value === 'true' || value === '1';\n },\n [getValue]\n );\n\n const fetchStats = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await getStats();\n setStats(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load user stats');\n } finally {\n setIsLoading(false);\n }\n }, [getStats]);\n\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n const statsItems = useMemo(() => {\n const items = [{ label: 'Total Users', value: stats?.total ?? '—' }];\n\n METHOD_ORDER.forEach((method) => {\n if (!isSettingEnabled(METHOD_SETTINGS[method])) return;\n items.push({\n label: METHOD_LABELS[method],\n value: stats?.authMethodCounts[method] ?? 0,\n });\n });\n\n return items;\n }, [stats, isSettingEnabled]);\n\n return { statsItems, isLoading, error, refresh: fetchStats };\n}\n\nexport default function UsersSection({\n pluginContext,\n pageSize = 20,\n}: AdminSectionProps): React.JSX.Element {\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const { statsItems, isLoading, error, refresh } = useUsersStats();\n\n if (selectedUser) {\n return (\n <div className=\"cedros-dashboard__section\">\n <AdminUserDetail\n userId={selectedUser.id}\n onBack={() => setSelectedUser(null)}\n currentUserId={pluginContext.userId}\n />\n </div>\n );\n }\n\n return (\n <div className=\"cedros-dashboard__section\">\n <StatsBar stats={statsItems} isLoading={isLoading} onRefresh={refresh} />\n {error && <p className=\"cedros-admin-error-inline\">{error}</p>}\n <p className=\"cedros-dashboard__text-muted\">\n All registered users in the system. Requires system admin privileges.\n </p>\n <AdminUserList\n pageSize={pageSize}\n currentUserId={pluginContext.userId}\n onUserClick={(user) => setSelectedUser(user)}\n />\n </div>\n );\n}\n"],"names":["METHOD_ORDER","METHOD_LABELS","METHOD_SETTINGS","useUsersStats","getStats","useAdminUsers","fetchSettings","getValue","useSystemSettings","stats","setStats","useState","isLoading","setIsLoading","error","setError","settingsFetched","setSettingsFetched","useEffect","isSettingEnabled","useCallback","key","value","fetchStats","result","err","useMemo","items","method","UsersSection","pluginContext","pageSize","selectedUser","setSelectedUser","statsItems","refresh","jsx","AdminUserDetail","jsxs","StatsBar","AdminUserList","user"],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- import { jsx as a, jsxs as U } from "react/jsx-runtime";
2
- import { useState as l, useEffect as S, useCallback as _, useMemo as b } from "react";
3
- import { A as E, a as I, u as v } from "./AdminUserDetail-DHFDzY8B.js";
4
- import { S as y } from "./StatsBar-BX-hHtTq.js";
5
- import { u as A } from "./useSystemSettings-DN5YqfNq.js";
6
- const L = ["email", "google", "apple", "solana", "webauthn", "sso"], T = {
7
- email: "Email Users",
8
- google: "Google Users",
9
- apple: "Apple Users",
10
- solana: "Solana Users",
11
- webauthn: "Passkey Users",
12
- sso: "SSO Provider Users"
13
- }, w = {
14
- email: "auth_email_enabled",
15
- google: "auth_google_enabled",
16
- apple: "auth_apple_enabled",
17
- solana: "auth_solana_enabled",
18
- webauthn: "auth_webauthn_enabled",
19
- sso: "feature_sso"
20
- };
21
- function D() {
22
- const { getStats: r } = v(), { fetchSettings: i, getValue: n } = A(), [t, c] = l(null), [d, o] = l(!1), [m, u] = l(null), [h, p] = l(!1);
23
- S(() => {
24
- h || (i(), p(!0));
25
- }, [i, h]);
26
- const g = _(
27
- (e) => {
28
- const s = n(e);
29
- return s === void 0 ? !1 : s === "true" || s === "1";
30
- },
31
- [n]
32
- ), f = _(async () => {
33
- o(!0), u(null);
34
- try {
35
- const e = await r();
36
- c(e);
37
- } catch (e) {
38
- u(e instanceof Error ? e.message : "Failed to load user stats");
39
- } finally {
40
- o(!1);
41
- }
42
- }, [r]);
43
- return S(() => {
44
- f();
45
- }, [f]), { statsItems: b(() => {
46
- const e = [{ label: "Total Users", value: t?.total ?? "—" }];
47
- return L.forEach((s) => {
48
- g(w[s]) && e.push({
49
- label: T[s],
50
- value: t?.authMethodCounts[s] ?? 0
51
- });
52
- }), e;
53
- }, [t, g]), isLoading: d, error: m, refresh: f };
54
- }
55
- function B({
56
- pluginContext: r,
57
- pageSize: i = 20
58
- }) {
59
- const [n, t] = l(null), { statsItems: c, isLoading: d, error: o, refresh: m } = D();
60
- return n ? /* @__PURE__ */ a("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ a(
61
- E,
62
- {
63
- userId: n.id,
64
- onBack: () => t(null),
65
- currentUserId: r.userId
66
- }
67
- ) }) : /* @__PURE__ */ U("div", { className: "cedros-dashboard__section", children: [
68
- /* @__PURE__ */ a(y, { stats: c, isLoading: d, onRefresh: m }),
69
- o && /* @__PURE__ */ a("p", { className: "cedros-admin-error-inline", children: o }),
70
- /* @__PURE__ */ a("p", { className: "cedros-dashboard__text-muted", children: "All registered users in the system. Requires system admin privileges." }),
71
- /* @__PURE__ */ a(
72
- I,
73
- {
74
- pageSize: i,
75
- currentUserId: r.userId,
76
- onUserClick: (u) => t(u)
77
- }
78
- )
79
- ] });
80
- }
81
- export {
82
- B as default
83
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"UsersSection-Dbh9PTSA.js","sources":["../src/admin/sections/UsersSection.tsx"],"sourcesContent":["/**\n * Users Section - Plugin wrapper\n *\n * Admin user management with list and detail views.\n */\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { AdminSectionProps } from '../types';\nimport { AdminUserList } from '../../components/admin/AdminUserList';\nimport { AdminUserDetail } from '../../components/admin/AdminUserDetail';\nimport { StatsBar } from '../../components/admin/StatsBar';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport { useSystemSettings } from '../../hooks/useSystemSettings';\nimport type { AdminUser, AdminUserStatsResponse } from '../../types';\n\nconst METHOD_ORDER = ['email', 'google', 'apple', 'solana', 'webauthn', 'sso'] as const;\n\nconst METHOD_LABELS: Record<(typeof METHOD_ORDER)[number], string> = {\n email: 'Email Users',\n google: 'Google Users',\n apple: 'Apple Users',\n solana: 'Solana Users',\n webauthn: 'Passkey Users',\n sso: 'SSO Provider Users',\n};\n\nconst METHOD_SETTINGS: Record<(typeof METHOD_ORDER)[number], string> = {\n email: 'auth_email_enabled',\n google: 'auth_google_enabled',\n apple: 'auth_apple_enabled',\n solana: 'auth_solana_enabled',\n webauthn: 'auth_webauthn_enabled',\n sso: 'feature_sso',\n};\n\nfunction useUsersStats() {\n const { getStats } = useAdminUsers();\n const { fetchSettings, getValue } = useSystemSettings();\n const [stats, setStats] = useState<AdminUserStatsResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [settingsFetched, setSettingsFetched] = useState(false);\n\n useEffect(() => {\n if (!settingsFetched) {\n fetchSettings();\n setSettingsFetched(true);\n }\n }, [fetchSettings, settingsFetched]);\n\n const isSettingEnabled = useCallback(\n (key: string): boolean => {\n const value = getValue(key);\n if (value === undefined) return false;\n return value === 'true' || value === '1';\n },\n [getValue]\n );\n\n const fetchStats = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await getStats();\n setStats(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load user stats');\n } finally {\n setIsLoading(false);\n }\n }, [getStats]);\n\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n const statsItems = useMemo(() => {\n const items = [{ label: 'Total Users', value: stats?.total ?? '—' }];\n\n METHOD_ORDER.forEach((method) => {\n if (!isSettingEnabled(METHOD_SETTINGS[method])) return;\n items.push({\n label: METHOD_LABELS[method],\n value: stats?.authMethodCounts[method] ?? 0,\n });\n });\n\n return items;\n }, [stats, isSettingEnabled]);\n\n return { statsItems, isLoading, error, refresh: fetchStats };\n}\n\nexport default function UsersSection({\n pluginContext,\n pageSize = 20,\n}: AdminSectionProps): React.JSX.Element {\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const { statsItems, isLoading, error, refresh } = useUsersStats();\n\n if (selectedUser) {\n return (\n <div className=\"cedros-dashboard__section\">\n <AdminUserDetail\n userId={selectedUser.id}\n onBack={() => setSelectedUser(null)}\n currentUserId={pluginContext.userId}\n />\n </div>\n );\n }\n\n return (\n <div className=\"cedros-dashboard__section\">\n <StatsBar stats={statsItems} isLoading={isLoading} onRefresh={refresh} />\n {error && <p className=\"cedros-admin-error-inline\">{error}</p>}\n <p className=\"cedros-dashboard__text-muted\">\n All registered users in the system. Requires system admin privileges.\n </p>\n <AdminUserList\n pageSize={pageSize}\n currentUserId={pluginContext.userId}\n onUserClick={(user) => setSelectedUser(user)}\n />\n </div>\n );\n}\n"],"names":["METHOD_ORDER","METHOD_LABELS","METHOD_SETTINGS","useUsersStats","getStats","useAdminUsers","fetchSettings","getValue","useSystemSettings","stats","setStats","useState","isLoading","setIsLoading","error","setError","settingsFetched","setSettingsFetched","useEffect","isSettingEnabled","useCallback","key","value","fetchStats","result","err","useMemo","items","method","UsersSection","pluginContext","pageSize","selectedUser","setSelectedUser","statsItems","refresh","jsx","AdminUserDetail","jsxs","StatsBar","AdminUserList","user"],"mappings":"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"}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime");require("react");const s=require("./AdminWithdrawalHistory-0yxtMh6q.cjs");function e({pageSize:a=20,refreshInterval:d=0}){return i.jsxs("div",{className:"cedros-dashboard__withdrawals",children:[i.jsx(s.AdminWithdrawalStats,{refreshInterval:d}),i.jsx("p",{className:"cedros-dashboard__text-muted",children:"Track deposits through the withdrawal pipeline: privacy period, ready for processing, and completed."}),i.jsxs("div",{className:"cedros-dashboard__pipeline",children:[i.jsx(s.AdminPrivacyPeriodDeposits,{pageSize:a,refreshInterval:d}),i.jsx(s.AdminWithdrawalQueue,{pageSize:a,refreshInterval:d}),i.jsx(s.AdminWithdrawalHistory,{pageSize:a,refreshInterval:d})]})]})}exports.default=e;
@@ -1 +0,0 @@
1
- {"version":3,"file":"WithdrawalsSection-BL_LOUq8.cjs","sources":["../src/admin/sections/WithdrawalsSection.tsx"],"sourcesContent":["/**\n * Withdrawals Section - Plugin wrapper\n *\n * Admin withdrawal pipeline: privacy period, queue, and history.\n */\n\nimport React from 'react';\nimport type { AdminSectionProps } from '../types';\nimport {\n AdminPrivacyPeriodDeposits,\n AdminWithdrawalQueue,\n AdminWithdrawalHistory,\n AdminWithdrawalStats,\n} from '../../components/deposit/admin';\n\nexport default function WithdrawalsSection({\n pageSize = 20,\n refreshInterval = 0,\n}: AdminSectionProps): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__withdrawals\">\n <AdminWithdrawalStats refreshInterval={refreshInterval} />\n <p className=\"cedros-dashboard__text-muted\">\n Track deposits through the withdrawal pipeline: privacy period, ready for processing, and\n completed.\n </p>\n\n {/* Pipeline view: Privacy Period -> Ready -> Completed */}\n <div className=\"cedros-dashboard__pipeline\">\n <AdminPrivacyPeriodDeposits pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalQueue pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalHistory pageSize={pageSize} refreshInterval={refreshInterval} />\n </div>\n </div>\n );\n}\n"],"names":["WithdrawalsSection","pageSize","refreshInterval","jsxs","jsx","AdminWithdrawalStats","AdminPrivacyPeriodDeposits","AdminWithdrawalQueue","AdminWithdrawalHistory"],"mappings":"+LAeA,SAAwBA,EAAmB,CACzC,SAAAC,EAAW,GACX,gBAAAC,EAAkB,CACpB,EAAyC,CACvC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAC,MAACC,EAAAA,sBAAqB,gBAAAH,EAAkC,EACxDE,EAAAA,IAAC,IAAA,CAAE,UAAU,+BAA+B,SAAA,uGAG5C,EAGAD,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAAC,EAAAA,IAACE,EAAAA,2BAAA,CAA2B,SAAAL,EAAoB,gBAAAC,CAAA,CAAkC,EAClFE,EAAAA,IAACG,EAAAA,qBAAA,CAAqB,SAAAN,EAAoB,gBAAAC,CAAA,CAAkC,EAC5EE,EAAAA,IAACI,EAAAA,uBAAA,CAAuB,SAAAP,EAAoB,gBAAAC,CAAA,CAAkC,CAAA,CAAA,CAChF,CAAA,EACF,CAEJ"}
@@ -1,20 +0,0 @@
1
- import { jsxs as s, jsx as a } from "react/jsx-runtime";
2
- import "react";
3
- import { A as r, a as o, b as t, c } from "./AdminWithdrawalHistory-BGjfrIe3.js";
4
- function p({
5
- pageSize: i = 20,
6
- refreshInterval: d = 0
7
- }) {
8
- return /* @__PURE__ */ s("div", { className: "cedros-dashboard__withdrawals", children: [
9
- /* @__PURE__ */ a(r, { refreshInterval: d }),
10
- /* @__PURE__ */ a("p", { className: "cedros-dashboard__text-muted", children: "Track deposits through the withdrawal pipeline: privacy period, ready for processing, and completed." }),
11
- /* @__PURE__ */ s("div", { className: "cedros-dashboard__pipeline", children: [
12
- /* @__PURE__ */ a(o, { pageSize: i, refreshInterval: d }),
13
- /* @__PURE__ */ a(t, { pageSize: i, refreshInterval: d }),
14
- /* @__PURE__ */ a(c, { pageSize: i, refreshInterval: d })
15
- ] })
16
- ] });
17
- }
18
- export {
19
- p as default
20
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"WithdrawalsSection-CN-lLnqX.js","sources":["../src/admin/sections/WithdrawalsSection.tsx"],"sourcesContent":["/**\n * Withdrawals Section - Plugin wrapper\n *\n * Admin withdrawal pipeline: privacy period, queue, and history.\n */\n\nimport React from 'react';\nimport type { AdminSectionProps } from '../types';\nimport {\n AdminPrivacyPeriodDeposits,\n AdminWithdrawalQueue,\n AdminWithdrawalHistory,\n AdminWithdrawalStats,\n} from '../../components/deposit/admin';\n\nexport default function WithdrawalsSection({\n pageSize = 20,\n refreshInterval = 0,\n}: AdminSectionProps): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__withdrawals\">\n <AdminWithdrawalStats refreshInterval={refreshInterval} />\n <p className=\"cedros-dashboard__text-muted\">\n Track deposits through the withdrawal pipeline: privacy period, ready for processing, and\n completed.\n </p>\n\n {/* Pipeline view: Privacy Period -> Ready -> Completed */}\n <div className=\"cedros-dashboard__pipeline\">\n <AdminPrivacyPeriodDeposits pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalQueue pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalHistory pageSize={pageSize} refreshInterval={refreshInterval} />\n </div>\n </div>\n );\n}\n"],"names":["WithdrawalsSection","pageSize","refreshInterval","jsxs","jsx","AdminWithdrawalStats","AdminPrivacyPeriodDeposits","AdminWithdrawalQueue","AdminWithdrawalHistory"],"mappings":";;;AAeA,SAAwBA,EAAmB;AAAA,EACzC,UAAAC,IAAW;AAAA,EACX,iBAAAC,IAAkB;AACpB,GAAyC;AACvC,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAqB,iBAAAH,GAAkC;AAAA,IACxD,gBAAAE,EAAC,KAAA,EAAE,WAAU,gCAA+B,UAAA,wGAG5C;AAAA,IAGA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,MAAA,gBAAAC,EAACE,GAAA,EAA2B,UAAAL,GAAoB,iBAAAC,EAAA,CAAkC;AAAA,MAClF,gBAAAE,EAACG,GAAA,EAAqB,UAAAN,GAAoB,iBAAAC,EAAA,CAAkC;AAAA,MAC5E,gBAAAE,EAACI,GAAA,EAAuB,UAAAP,GAAoB,iBAAAC,EAAA,CAAkC;AAAA,IAAA,EAAA,CAChF;AAAA,EAAA,GACF;AAEJ;"}