@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.
- package/dist/AdminDepositList-CyT4VBH8.js +311 -0
- package/dist/AdminDepositList-CyT4VBH8.js.map +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs +1 -0
- package/dist/AdminDepositList-b2AXtLg0.cjs.map +1 -0
- package/dist/{AdminWithdrawalHistory-BGjfrIe3.js → AdminWithdrawalHistory-Cud-yuWy.js} +295 -283
- package/dist/AdminWithdrawalHistory-Cud-yuWy.js.map +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs +1 -0
- package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs.map +1 -0
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs → AuthenticationSettings-D739nNul.cjs} +1 -1
- package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs.map → AuthenticationSettings-D739nNul.cjs.map} +1 -1
- package/dist/AuthenticationSettings-DtLoxQ2z.cjs +1 -0
- package/dist/{AuthenticationSettings-BPAh1my6.cjs.map → AuthenticationSettings-DtLoxQ2z.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js → AuthenticationSettings-Dx3JCI3m.js} +1 -1
- package/dist/{AuthenticationSettings-CJg8CJY9.js.map → AuthenticationSettings-Dx3JCI3m.js.map} +1 -1
- package/dist/{AuthenticationSettings-CR_i6TTS.js → AuthenticationSettings-vowmQPXz.js} +170 -140
- package/dist/{AuthenticationSettings-CR_i6TTS.js.map → AuthenticationSettings-vowmQPXz.js.map} +1 -1
- package/dist/{AutosaveStatus-CYkC2aI_.cjs → AutosaveStatus-CCrZszKA.cjs} +1 -1
- package/dist/{AutosaveStatus-CYkC2aI_.cjs.map → AutosaveStatus-CCrZszKA.cjs.map} +1 -1
- package/dist/{AutosaveStatus-N4uNS6-2.js → AutosaveStatus-Ciyt350A.js} +1 -1
- package/dist/{AutosaveStatus-N4uNS6-2.js.map → AutosaveStatus-Ciyt350A.js.map} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js → CreditSystemSettings-BQ3h4CyM.js} +1 -1
- package/dist/{CreditSystemSettings-CIf_SfJq.js.map → CreditSystemSettings-BQ3h4CyM.js.map} +1 -1
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs → CreditSystemSettings-C6dUsu72.cjs} +1 -1
- package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-C6dUsu72.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs → CreditSystemSettings-CBot8EPW.cjs} +1 -1
- package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CBot8EPW.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js → CreditSystemSettings-bVuNLsqp.js} +1 -1
- package/dist/{CreditSystemSettings-CePYGgev.js.map → CreditSystemSettings-bVuNLsqp.js.map} +1 -1
- package/dist/DepositsSection-BkKUS4vk.cjs +1 -0
- package/dist/DepositsSection-BkKUS4vk.cjs.map +1 -0
- package/dist/{DepositsSection-DA89uR9A.js → DepositsSection-DD9MKUFt.js} +20 -14
- package/dist/DepositsSection-DD9MKUFt.js.map +1 -0
- package/dist/EmailRegisterForm-Pvm3I8GP.cjs +1 -0
- package/dist/{EmailRegisterForm-CxktR-4J.cjs.map → EmailRegisterForm-Pvm3I8GP.cjs.map} +1 -1
- package/dist/{EmailRegisterForm-BrDL3BZy.js → EmailRegisterForm-nI0BOIxR.js} +2 -2
- package/dist/{EmailRegisterForm-BrDL3BZy.js.map → EmailRegisterForm-nI0BOIxR.js.map} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs → EmailSettings-B9qwPSiM.cjs} +1 -1
- package/dist/{EmailSettings-DZywTTRq.cjs.map → EmailSettings-B9qwPSiM.cjs.map} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js → EmailSettings-CCA8dNCi.js} +1 -1
- package/dist/{EmailSettings-DbMDfVaM.js.map → EmailSettings-CCA8dNCi.js.map} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs → EmailSettings-RbgAq9FB.cjs} +1 -1
- package/dist/{EmailSettings-B8xwgd6_.cjs.map → EmailSettings-RbgAq9FB.cjs.map} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js → EmailSettings-mxlKNcPl.js} +1 -1
- package/dist/{EmailSettings-Bna7Z53E.js.map → EmailSettings-mxlKNcPl.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs → EmbeddedWalletSettings-B4h-8rxB.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-DivEPn39.cjs.map → EmbeddedWalletSettings-B4h-8rxB.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js → EmbeddedWalletSettings-BInZvFZf.js} +1 -1
- package/dist/{EmbeddedWalletSettings-BEztqO19.js.map → EmbeddedWalletSettings-BInZvFZf.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js → EmbeddedWalletSettings-CXlZFFDw.js} +1 -1
- package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js.map → EmbeddedWalletSettings-CXlZFFDw.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs → EmbeddedWalletSettings-D5JXae1L.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs.map → EmbeddedWalletSettings-D5JXae1L.cjs.map} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js → GoogleLoginButton-CXwp4LsQ.js} +1 -1
- package/dist/{GoogleLoginButton-B3uRMJ_n.js.map → GoogleLoginButton-CXwp4LsQ.js.map} +1 -1
- package/dist/GoogleLoginButton-zS_69-KV.cjs +1 -0
- package/dist/{GoogleLoginButton-BydKswn4.cjs.map → GoogleLoginButton-zS_69-KV.cjs.map} +1 -1
- package/dist/PermissionsSection-BPbE-hNx.cjs +1 -0
- package/dist/{PermissionsSection-CKXXDfqi.cjs.map → PermissionsSection-BPbE-hNx.cjs.map} +1 -1
- package/dist/{PermissionsSection-BGaj_sI7.js → PermissionsSection-CighC1p6.js} +3 -3
- package/dist/{PermissionsSection-BGaj_sI7.js.map → PermissionsSection-CighC1p6.js.map} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js → ServerSettings-BE8fsE5k.js} +1 -1
- package/dist/{ServerSettings-B2RKhJtZ.js.map → ServerSettings-BE8fsE5k.js.map} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs → ServerSettings-CYTlQ2xy.cjs} +1 -1
- package/dist/{ServerSettings-BZXlm1BX.cjs.map → ServerSettings-CYTlQ2xy.cjs.map} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs → ServerSettings-DFs9jQ3f.cjs} +1 -1
- package/dist/{ServerSettings-DZUKo6By.cjs.map → ServerSettings-DFs9jQ3f.cjs.map} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js → ServerSettings-pSmWDC1d.js} +1 -1
- package/dist/{ServerSettings-Bqm4-bt2.js.map → ServerSettings-pSmWDC1d.js.map} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js → SettingsPageLayout--GZ_iHLc.js} +1 -1
- package/dist/{SettingsPageLayout-DpgNEkuu.js.map → SettingsPageLayout--GZ_iHLc.js.map} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs → SettingsPageLayout-j5lMjEID.cjs} +1 -1
- package/dist/{SettingsPageLayout-COSYLMu7.cjs.map → SettingsPageLayout-j5lMjEID.cjs.map} +1 -1
- package/dist/SolanaLoginButton-BjOxpE1C.cjs +1 -0
- package/dist/{SolanaLoginButton-fAW7kRUu.cjs.map → SolanaLoginButton-BjOxpE1C.cjs.map} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js → SolanaLoginButton-P22QjBaO.js} +1 -1
- package/dist/{SolanaLoginButton-C_u9OppS.js.map → SolanaLoginButton-P22QjBaO.js.map} +1 -1
- package/dist/{TeamSection-CvrCoa9D.js → TeamSection-BIECkp7g.js} +2 -2
- package/dist/{TeamSection-CvrCoa9D.js.map → TeamSection-BIECkp7g.js.map} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs → TeamSection-BOH9pv_E.cjs} +1 -1
- package/dist/{TeamSection-DlUD5kp5.cjs.map → TeamSection-BOH9pv_E.cjs.map} +1 -1
- package/dist/UsersSection-e6q7FHzx.cjs +1 -0
- package/dist/UsersSection-e6q7FHzx.cjs.map +1 -0
- package/dist/UsersSection-t-zm0jZW.js +33 -0
- package/dist/UsersSection-t-zm0jZW.js.map +1 -0
- package/dist/{WebhookSettings-bUg2u_p0.js → WebhookSettings-Bb70MbFj.js} +1 -1
- package/dist/{WebhookSettings-bUg2u_p0.js.map → WebhookSettings-Bb70MbFj.js.map} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs → WebhookSettings-C-gvNAW1.cjs} +1 -1
- package/dist/{WebhookSettings-BWl_wsvg.cjs.map → WebhookSettings-C-gvNAW1.cjs.map} +1 -1
- package/dist/{WebhookSettings-DXNH5bal.cjs → WebhookSettings-CGyDKjrm.cjs} +1 -1
- package/dist/{WebhookSettings-DXNH5bal.cjs.map → WebhookSettings-CGyDKjrm.cjs.map} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js → WebhookSettings-kIstSjZi.js} +1 -1
- package/dist/{WebhookSettings-BT5q6AZ8.js.map → WebhookSettings-kIstSjZi.js.map} +1 -1
- package/dist/WithdrawalsSection-sljIyeaz.cjs +1 -0
- package/dist/WithdrawalsSection-sljIyeaz.cjs.map +1 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js +27 -0
- package/dist/WithdrawalsSection-yRDTVFsb.js.map +1 -0
- package/dist/admin-only.cjs +1 -1
- package/dist/admin-only.js +1 -1
- package/dist/email-only.cjs +1 -1
- package/dist/email-only.d.ts +13 -2
- package/dist/email-only.js +3 -3
- package/dist/google-only.cjs +1 -1
- package/dist/google-only.d.ts +13 -2
- package/dist/google-only.js +3 -3
- package/dist/index.cjs +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +31 -8
- package/dist/index.js +1066 -1092
- package/dist/index.js.map +1 -1
- package/dist/{plugin-BtYBW6JY.cjs → plugin-8_dpq7tC.cjs} +1 -1
- package/dist/{plugin-BtYBW6JY.cjs.map → plugin-8_dpq7tC.cjs.map} +1 -1
- package/dist/{plugin-5qRh-YhX.js → plugin-D1NdppqC.js} +1 -1
- package/dist/{plugin-5qRh-YhX.js.map → plugin-D1NdppqC.js.map} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs → shamir-4DyQMJCk.cjs} +1 -1
- package/dist/{shamir-AeLLfw0p.cjs.map → shamir-4DyQMJCk.cjs.map} +1 -1
- package/dist/{shamir-B0wConeK.js → shamir-L-s-Tp1Z.js} +1 -1
- package/dist/{shamir-B0wConeK.js.map → shamir-L-s-Tp1Z.js.map} +1 -1
- package/dist/silentWalletEnroll-BgTb4H5I.cjs +1 -0
- package/dist/{silentWalletEnroll-B8pgdKZO.cjs.map → silentWalletEnroll-BgTb4H5I.cjs.map} +1 -1
- package/dist/{silentWalletEnroll-DR2kPw7W.js → silentWalletEnroll-DWt6Pr3B.js} +3 -3
- package/dist/{silentWalletEnroll-DR2kPw7W.js.map → silentWalletEnroll-DWt6Pr3B.js.map} +1 -1
- package/dist/solana-only.cjs +1 -1
- package/dist/solana-only.d.ts +13 -2
- package/dist/solana-only.js +3 -3
- package/dist/{useAdminDeposits-BDY5KJ0-.js → useAdminDeposits-BTSyeAfg.js} +1 -1
- package/dist/{useAdminDeposits-BDY5KJ0-.js.map → useAdminDeposits-BTSyeAfg.js.map} +1 -1
- package/dist/useAdminDeposits-BkkCwHWp.cjs +1 -0
- package/dist/{useAdminDeposits-Dvx3_UUE.cjs.map → useAdminDeposits-BkkCwHWp.cjs.map} +1 -1
- package/dist/{useAuth-Bge6KaWN.js → useAuth-C3dpk0po.js} +597 -561
- package/dist/useAuth-C3dpk0po.js.map +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs +1 -0
- package/dist/useAuth-D3Pk_H3z.cjs.map +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs +1 -0
- package/dist/useCedrosLogin-C9MrcZvh.cjs.map +1 -0
- package/dist/{apiClient-B2JxVPlH.js → useCedrosLogin-_94MmGGq.js} +29 -29
- package/dist/useCedrosLogin-_94MmGGq.js.map +1 -0
- package/dist/{useOrgs-Be3KH4ib.js → useOrgs-C3pzMA9h.js} +1 -1
- package/dist/{useOrgs-Be3KH4ib.js.map → useOrgs-C3pzMA9h.js.map} +1 -1
- package/dist/useOrgs-DDVRCaVi.cjs +1 -0
- package/dist/{useOrgs-CVbacmaQ.cjs.map → useOrgs-DDVRCaVi.cjs.map} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js → useSystemSettings-DBlAMjFi.js} +1 -1
- package/dist/{useSystemSettings-DN5YqfNq.js.map → useSystemSettings-DBlAMjFi.js.map} +1 -1
- package/dist/useSystemSettings-DRrreszl.cjs +1 -0
- package/dist/{useSystemSettings-D9Cr7ZTl.cjs.map → useSystemSettings-DRrreszl.cjs.map} +1 -1
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs +1 -0
- package/dist/useUsersStatsSummary-8qY7iP4G.cjs.map +1 -0
- package/dist/{AdminUserDetail-DHFDzY8B.js → useUsersStatsSummary-NjEFvWuz.js} +431 -380
- package/dist/useUsersStatsSummary-NjEFvWuz.js.map +1 -0
- package/package.json +1 -1
- package/dist/AdminDepositList-Cx0xRwES.js +0 -305
- package/dist/AdminDepositList-Cx0xRwES.js.map +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs +0 -1
- package/dist/AdminDepositList-UEcyRZkA.cjs.map +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs +0 -1
- package/dist/AdminUserDetail-BzEIdNJh.cjs.map +0 -1
- package/dist/AdminUserDetail-DHFDzY8B.js.map +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs +0 -1
- package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs.map +0 -1
- package/dist/AdminWithdrawalHistory-BGjfrIe3.js.map +0 -1
- package/dist/AuthenticationSettings-BPAh1my6.cjs +0 -1
- package/dist/DepositsSection-DA89uR9A.js.map +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs +0 -1
- package/dist/DepositsSection-i6XdhLNs.cjs.map +0 -1
- package/dist/EmailRegisterForm-CxktR-4J.cjs +0 -1
- package/dist/GoogleLoginButton-BydKswn4.cjs +0 -1
- package/dist/PermissionsSection-CKXXDfqi.cjs +0 -1
- package/dist/SolanaLoginButton-fAW7kRUu.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs +0 -1
- package/dist/UsersSection-C2U8Tb7V.cjs.map +0 -1
- package/dist/UsersSection-Dbh9PTSA.js +0 -83
- package/dist/UsersSection-Dbh9PTSA.js.map +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs +0 -1
- package/dist/WithdrawalsSection-BL_LOUq8.cjs.map +0 -1
- package/dist/WithdrawalsSection-CN-lLnqX.js +0 -20
- package/dist/WithdrawalsSection-CN-lLnqX.js.map +0 -1
- package/dist/apiClient-B2JxVPlH.js.map +0 -1
- package/dist/apiClient-CTTKhsYb.cjs +0 -1
- package/dist/apiClient-CTTKhsYb.cjs.map +0 -1
- package/dist/silentWalletEnroll-B8pgdKZO.cjs +0 -1
- package/dist/useAdminDeposits-Dvx3_UUE.cjs +0 -1
- package/dist/useAuth-Bge6KaWN.js.map +0 -1
- package/dist/useAuth-DhIDTLRd.cjs +0 -1
- package/dist/useAuth-DhIDTLRd.cjs.map +0 -1
- package/dist/useOrgs-CVbacmaQ.cjs +0 -1
- package/dist/useSystemSettings-D9Cr7ZTl.cjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreditSystemSettings-CIf_SfJq.js","sources":["../src/components/admin/settings/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System settings page - deposits, withdrawals, privacy period (with tabs)\n */\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting } from '../../../types';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype CreditTab = 'deposits' | 'tokens' | 'fees' | 'privacy' | 'treasury';\n\ninterface TabSection {\n title: string;\n description?: string;\n keys: string[];\n}\n\ninterface TabConfig {\n id: CreditTab;\n label: string;\n /** Categories to pull settings from */\n categories: string[];\n /** Specific keys to include (if empty, include all from categories) */\n includeKeys?: string[];\n /** Specific keys to exclude */\n excludeKeys?: string[];\n /** Additional sections rendered below the main settings */\n sections?: TabSection[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'deposits',\n label: 'Deposits',\n categories: ['deposit.general'],\n includeKeys: [\n 'deposit_company_token',\n 'deposit_max_usd',\n 'deposit_min_usd',\n 'deposit_micro_enabled',\n 'deposit_gasless_swap_enabled',\n 'solana_rpc_url',\n 'jupiter_api_key',\n ],\n },\n {\n id: 'tokens',\n label: 'Component',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_show_explainer',\n 'deposit_quick_action_tokens',\n 'deposit_custom_tokens',\n 'deposit_custom_tokens_json',\n ],\n },\n {\n id: 'fees',\n label: 'Fees',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_fee_policy',\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'swap_fee_fixed_lamports',\n 'swap_fee_percent_bps',\n 'company_fee_fixed_lamports',\n 'company_fee_percent_bps',\n 'private_deposit_min_lamports',\n ],\n },\n {\n id: 'privacy',\n label: 'Privacy',\n categories: ['deposit.general', 'privacy', 'withdrawal'],\n includeKeys: [\n // Enable toggle\n 'deposit_privacy_enabled',\n // Privacy period setting\n 'privacy_period_secs',\n // Withdrawal settings (from privacy pool)\n 'withdrawal_percentage',\n 'withdrawal_min_lamports',\n // Partial withdrawal settings (related to privacy mixing)\n 'partial_withdrawal_count',\n 'partial_withdrawal_min_lamports',\n ],\n sections: [\n {\n title: 'Privacy Pool Worker',\n description: 'Background worker for processing withdrawals from the privacy cash pool.',\n keys: ['withdrawal_poll_interval_secs', 'withdrawal_batch_size'],\n },\n ],\n },\n {\n id: 'treasury',\n label: 'Treasury',\n categories: ['withdrawal', 'deposit'],\n includeKeys: [\n // Treasury wallet (separate section)\n 'treasury_wallet_address',\n ],\n sections: [\n {\n title: 'Micropayment Batch Worker',\n description: 'Background worker for batching small SOL deposits together.',\n keys: ['micro_batch_threshold_usd', 'micro_batch_poll_secs'],\n },\n ],\n },\n];\n\nexport interface CreditSystemSettingsProps {\n className?: string;\n}\n\nexport function CreditSystemSettings({ className }: CreditSystemSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<CreditTab>('deposits');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config and filter settings\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect all settings from the tab's categories\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: SystemSetting[] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n // Get fee policy for conditional visibility\n const feePolicy = getEffectiveValue('deposit_fee_policy') || 'company_pays_all';\n\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n\n // Apply include/exclude filters\n let filtered = allTabSettings;\n\n if (currentTab.includeKeys && currentTab.includeKeys.length > 0) {\n // Only include specific keys\n filtered = filtered.filter((s) => currentTab.includeKeys!.includes(s.key));\n // Sort by includeKeys order\n filtered.sort(\n (a, b) => currentTab.includeKeys!.indexOf(a.key) - currentTab.includeKeys!.indexOf(b.key)\n );\n } else if (currentTab.excludeKeys && currentTab.excludeKeys.length > 0) {\n // Exclude specific keys\n filtered = filtered.filter((s) => !currentTab.excludeKeys!.includes(s.key));\n }\n\n // Deposits tab: hide SOL micro payments if minimum > $10\n if (currentTab.id === 'deposits') {\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n if (minUsd > 10) {\n filtered = filtered.filter((s) => s.key !== 'deposit_micro_enabled');\n }\n }\n\n // Fees tab: conditionally show fee settings based on policy\n if (currentTab.id === 'fees') {\n const privacyFeeKeys = [\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'private_deposit_min_lamports',\n ];\n const swapFeeKeys = ['swap_fee_fixed_lamports', 'swap_fee_percent_bps'];\n const companyFeeKeys = ['company_fee_fixed_lamports', 'company_fee_percent_bps'];\n\n filtered = filtered.filter((s) => {\n // Always show fee policy selector\n if (s.key === 'deposit_fee_policy') return true;\n\n // Hide all fees if company pays all\n if (feePolicy === 'company_pays_all') return false;\n\n // Show privacy fees for user_pays_privacy or user_pays_all\n if (privacyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_privacy' || feePolicy === 'user_pays_all';\n }\n\n // Show swap fees for user_pays_swap or user_pays_all\n if (swapFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_swap' || feePolicy === 'user_pays_all';\n }\n\n // Show company fees only for user_pays_all\n if (companyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_all';\n }\n\n return true;\n });\n }\n\n return filtered;\n }, [allTabSettings, currentTab, getEffectiveValue, feePolicy]);\n\n // Helper to get settings for a section\n const getSectionSettings = useCallback(\n (keys: string[]) => {\n return allTabSettings\n .filter((s) => keys.includes(s.key))\n .sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));\n },\n [allTabSettings]\n );\n\n // Compute external warnings for the deposits tab\n const externalWarnings = useMemo(() => {\n if (currentTab?.id !== 'deposits') return undefined;\n\n const warnings: Record<string, string> = {};\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n const microEnabled = getEffectiveValue('deposit_micro_enabled');\n const isMicroDisabled = microEnabled === 'false' || microEnabled === '0' || microEnabled === '';\n\n // Warn if micro payments disabled but minimum < $10\n if (isMicroDisabled && minUsd < 10) {\n warnings['deposit_min_usd'] =\n 'SOL micro payments must be enabled for minimum deposits under $10.';\n }\n\n return Object.keys(warnings).length > 0 ? warnings : undefined;\n }, [currentTab?.id, getEffectiveValue]);\n\n // Credit system master toggle\n const creditsEnabled = getEffectiveValue('feature_credits') === 'true';\n const handleCreditsToggle = () => {\n handleChange('feature_credits', creditsEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Credit System</h2>\n <p className=\"cedros-settings-page-description\">\n Configure credit deposits, timed withdrawals, and privacy period settings.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={creditsEnabled}\n className={`cedros-toggle ${creditsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleCreditsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{creditsEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 && !currentTab?.sections?.length ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <>\n {currentSettings.length > 0 && (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n {/* Render additional sections */}\n {currentTab?.sections?.map((section) => {\n const sectionSettings = getSectionSettings(section.keys);\n if (sectionSettings.length === 0) return null;\n return (\n <div key={section.title} className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <h4 className=\"cedros-settings-subsection-title\">{section.title}</h4>\n {section.description && (\n <p className=\"cedros-settings-subsection-description\">\n {section.description}\n </p>\n )}\n </div>\n <SettingsSection\n settings={sectionSettings}\n edits={edits}\n onChange={handleChange}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Keep old export name for backwards compatibility\nexport { CreditSystemSettings as PrivacyCashSettings };\nexport type { CreditSystemSettingsProps as PrivacyCashSettingsProps };\n"],"names":["TABS","CreditSystemSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","activeTab","setActiveTab","useState","useEffect","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","feePolicy","currentSettings","filtered","s","a","b","privacyFeeKeys","swapFeeKeys","companyFeeKeys","getSectionSettings","useCallback","keys","externalWarnings","warnings","minUsd","microEnabled","creditsEnabled","handleCreditsToggle","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","tab","Fragment","SettingsSection","section","sectionSettings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreditSystemSettings-BQ3h4CyM.js","sources":["../src/components/admin/settings/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System settings page - deposits, withdrawals, privacy period (with tabs)\n */\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting } from '../../../types';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype CreditTab = 'deposits' | 'tokens' | 'fees' | 'privacy' | 'treasury';\n\ninterface TabSection {\n title: string;\n description?: string;\n keys: string[];\n}\n\ninterface TabConfig {\n id: CreditTab;\n label: string;\n /** Categories to pull settings from */\n categories: string[];\n /** Specific keys to include (if empty, include all from categories) */\n includeKeys?: string[];\n /** Specific keys to exclude */\n excludeKeys?: string[];\n /** Additional sections rendered below the main settings */\n sections?: TabSection[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'deposits',\n label: 'Deposits',\n categories: ['deposit.general'],\n includeKeys: [\n 'deposit_company_token',\n 'deposit_max_usd',\n 'deposit_min_usd',\n 'deposit_micro_enabled',\n 'deposit_gasless_swap_enabled',\n 'solana_rpc_url',\n 'jupiter_api_key',\n ],\n },\n {\n id: 'tokens',\n label: 'Component',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_show_explainer',\n 'deposit_quick_action_tokens',\n 'deposit_custom_tokens',\n 'deposit_custom_tokens_json',\n ],\n },\n {\n id: 'fees',\n label: 'Fees',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_fee_policy',\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'swap_fee_fixed_lamports',\n 'swap_fee_percent_bps',\n 'company_fee_fixed_lamports',\n 'company_fee_percent_bps',\n 'private_deposit_min_lamports',\n ],\n },\n {\n id: 'privacy',\n label: 'Privacy',\n categories: ['deposit.general', 'privacy', 'withdrawal'],\n includeKeys: [\n // Enable toggle\n 'deposit_privacy_enabled',\n // Privacy period setting\n 'privacy_period_secs',\n // Withdrawal settings (from privacy pool)\n 'withdrawal_percentage',\n 'withdrawal_min_lamports',\n // Partial withdrawal settings (related to privacy mixing)\n 'partial_withdrawal_count',\n 'partial_withdrawal_min_lamports',\n ],\n sections: [\n {\n title: 'Privacy Pool Worker',\n description: 'Background worker for processing withdrawals from the privacy cash pool.',\n keys: ['withdrawal_poll_interval_secs', 'withdrawal_batch_size'],\n },\n ],\n },\n {\n id: 'treasury',\n label: 'Treasury',\n categories: ['withdrawal', 'deposit'],\n includeKeys: [\n // Treasury wallet (separate section)\n 'treasury_wallet_address',\n ],\n sections: [\n {\n title: 'Micropayment Batch Worker',\n description: 'Background worker for batching small SOL deposits together.',\n keys: ['micro_batch_threshold_usd', 'micro_batch_poll_secs'],\n },\n ],\n },\n];\n\nexport interface CreditSystemSettingsProps {\n className?: string;\n}\n\nexport function CreditSystemSettings({ className }: CreditSystemSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<CreditTab>('deposits');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config and filter settings\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect all settings from the tab's categories\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: SystemSetting[] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n // Get fee policy for conditional visibility\n const feePolicy = getEffectiveValue('deposit_fee_policy') || 'company_pays_all';\n\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n\n // Apply include/exclude filters\n let filtered = allTabSettings;\n\n if (currentTab.includeKeys && currentTab.includeKeys.length > 0) {\n // Only include specific keys\n filtered = filtered.filter((s) => currentTab.includeKeys!.includes(s.key));\n // Sort by includeKeys order\n filtered.sort(\n (a, b) => currentTab.includeKeys!.indexOf(a.key) - currentTab.includeKeys!.indexOf(b.key)\n );\n } else if (currentTab.excludeKeys && currentTab.excludeKeys.length > 0) {\n // Exclude specific keys\n filtered = filtered.filter((s) => !currentTab.excludeKeys!.includes(s.key));\n }\n\n // Deposits tab: hide SOL micro payments if minimum > $10\n if (currentTab.id === 'deposits') {\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n if (minUsd > 10) {\n filtered = filtered.filter((s) => s.key !== 'deposit_micro_enabled');\n }\n }\n\n // Fees tab: conditionally show fee settings based on policy\n if (currentTab.id === 'fees') {\n const privacyFeeKeys = [\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'private_deposit_min_lamports',\n ];\n const swapFeeKeys = ['swap_fee_fixed_lamports', 'swap_fee_percent_bps'];\n const companyFeeKeys = ['company_fee_fixed_lamports', 'company_fee_percent_bps'];\n\n filtered = filtered.filter((s) => {\n // Always show fee policy selector\n if (s.key === 'deposit_fee_policy') return true;\n\n // Hide all fees if company pays all\n if (feePolicy === 'company_pays_all') return false;\n\n // Show privacy fees for user_pays_privacy or user_pays_all\n if (privacyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_privacy' || feePolicy === 'user_pays_all';\n }\n\n // Show swap fees for user_pays_swap or user_pays_all\n if (swapFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_swap' || feePolicy === 'user_pays_all';\n }\n\n // Show company fees only for user_pays_all\n if (companyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_all';\n }\n\n return true;\n });\n }\n\n return filtered;\n }, [allTabSettings, currentTab, getEffectiveValue, feePolicy]);\n\n // Helper to get settings for a section\n const getSectionSettings = useCallback(\n (keys: string[]) => {\n return allTabSettings\n .filter((s) => keys.includes(s.key))\n .sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));\n },\n [allTabSettings]\n );\n\n // Compute external warnings for the deposits tab\n const externalWarnings = useMemo(() => {\n if (currentTab?.id !== 'deposits') return undefined;\n\n const warnings: Record<string, string> = {};\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n const microEnabled = getEffectiveValue('deposit_micro_enabled');\n const isMicroDisabled = microEnabled === 'false' || microEnabled === '0' || microEnabled === '';\n\n // Warn if micro payments disabled but minimum < $10\n if (isMicroDisabled && minUsd < 10) {\n warnings['deposit_min_usd'] =\n 'SOL micro payments must be enabled for minimum deposits under $10.';\n }\n\n return Object.keys(warnings).length > 0 ? warnings : undefined;\n }, [currentTab?.id, getEffectiveValue]);\n\n // Credit system master toggle\n const creditsEnabled = getEffectiveValue('feature_credits') === 'true';\n const handleCreditsToggle = () => {\n handleChange('feature_credits', creditsEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Credit System</h2>\n <p className=\"cedros-settings-page-description\">\n Configure credit deposits, timed withdrawals, and privacy period settings.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={creditsEnabled}\n className={`cedros-toggle ${creditsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleCreditsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{creditsEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 && !currentTab?.sections?.length ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <>\n {currentSettings.length > 0 && (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n {/* Render additional sections */}\n {currentTab?.sections?.map((section) => {\n const sectionSettings = getSectionSettings(section.keys);\n if (sectionSettings.length === 0) return null;\n return (\n <div key={section.title} className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <h4 className=\"cedros-settings-subsection-title\">{section.title}</h4>\n {section.description && (\n <p className=\"cedros-settings-subsection-description\">\n {section.description}\n </p>\n )}\n </div>\n <SettingsSection\n settings={sectionSettings}\n edits={edits}\n onChange={handleChange}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Keep old export name for backwards compatibility\nexport { CreditSystemSettings as PrivacyCashSettings };\nexport type { CreditSystemSettingsProps as PrivacyCashSettingsProps };\n"],"names":["TABS","CreditSystemSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","activeTab","setActiveTab","useState","useEffect","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","feePolicy","currentSettings","filtered","s","a","b","privacyFeeKeys","swapFeeKeys","companyFeeKeys","getSectionSettings","useCallback","keys","externalWarnings","warnings","minUsd","microEnabled","creditsEnabled","handleCreditsToggle","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","tab","Fragment","SettingsSection","section","sectionSettings"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./CreditSystemSettings-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./CreditSystemSettings-CBot8EPW.cjs");function r(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.CreditSystemSettings,{})})}exports.default=r;
|
package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-C6dUsu72.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreditSystemSettings-
|
|
1
|
+
{"version":3,"file":"CreditSystemSettings-C6dUsu72.cjs","sources":["../src/admin/sections/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { CreditSystemSettings as Settings } from '../../components/admin/settings';\n\nexport default function CreditSystemSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["CreditSystemSettings","jsx","Settings"],"mappings":"6LAOA,SAAwBA,GAA0C,CAChE,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,uBAAS,EACZ,CAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const s=require("react/jsx-runtime"),o=require("react"),E=require("./LoadingSpinner-d6sSxgQN.cjs"),M=require("./ErrorMessage-CHbYbVi2.cjs"),p=require("./AutosaveStatus-
|
|
1
|
+
"use strict";const s=require("react/jsx-runtime"),o=require("react"),E=require("./LoadingSpinner-d6sSxgQN.cjs"),M=require("./ErrorMessage-CHbYbVi2.cjs"),p=require("./AutosaveStatus-CCrZszKA.cjs"),v=[{id:"deposits",label:"Deposits",categories:["deposit.general"],includeKeys:["deposit_company_token","deposit_max_usd","deposit_min_usd","deposit_micro_enabled","deposit_gasless_swap_enabled","solana_rpc_url","jupiter_api_key"]},{id:"tokens",label:"Component",categories:["deposit"],includeKeys:["deposit_show_explainer","deposit_quick_action_tokens","deposit_custom_tokens","deposit_custom_tokens_json"]},{id:"fees",label:"Fees",categories:["deposit"],includeKeys:["deposit_fee_policy","privacy_fee_fixed_lamports","privacy_fee_percent_bps","swap_fee_fixed_lamports","swap_fee_percent_bps","company_fee_fixed_lamports","company_fee_percent_bps","private_deposit_min_lamports"]},{id:"privacy",label:"Privacy",categories:["deposit.general","privacy","withdrawal"],includeKeys:["deposit_privacy_enabled","privacy_period_secs","withdrawal_percentage","withdrawal_min_lamports","partial_withdrawal_count","partial_withdrawal_min_lamports"],sections:[{title:"Privacy Pool Worker",description:"Background worker for processing withdrawals from the privacy cash pool.",keys:["withdrawal_poll_interval_secs","withdrawal_batch_size"]}]},{id:"treasury",label:"Treasury",categories:["withdrawal","deposit"],includeKeys:["treasury_wallet_address"],sections:[{title:"Micropayment Batch Worker",description:"Background worker for batching small SOL deposits together.",keys:["micro_batch_threshold_usd","micro_batch_poll_secs"]}]}];function O({className:_}){const{settings:u,edits:f,isLoading:j,autosaveStatus:k,autosaveError:w,error:h,fetchSettings:b,handleChange:g,getEffectiveValue:n}=p.useSettingsAutosave(),[m,S]=o.useState("deposits");o.useEffect(()=>{b()},[b]);const t=v.find(e=>e.id===m),c=o.useMemo(()=>{if(!t)return[];const e=[];for(const i of t.categories){const r=u[i]??[];e.push(...r)}return e},[u,t]),a=n("deposit_fee_policy")||"company_pays_all",y=o.useMemo(()=>{if(!t)return[];let e=c;if(t.includeKeys&&t.includeKeys.length>0?(e=e.filter(i=>t.includeKeys.includes(i.key)),e.sort((i,r)=>t.includeKeys.indexOf(i.key)-t.includeKeys.indexOf(r.key))):t.excludeKeys&&t.excludeKeys.length>0&&(e=e.filter(i=>!t.excludeKeys.includes(i.key))),t.id==="deposits"&&(parseFloat(n("deposit_min_usd"))||0)>10&&(e=e.filter(r=>r.key!=="deposit_micro_enabled")),t.id==="fees"){const i=["privacy_fee_fixed_lamports","privacy_fee_percent_bps","private_deposit_min_lamports"],r=["swap_fee_fixed_lamports","swap_fee_percent_bps"],x=["company_fee_fixed_lamports","company_fee_percent_bps"];e=e.filter(l=>l.key==="deposit_fee_policy"?!0:a==="company_pays_all"?!1:i.includes(l.key)?a==="user_pays_privacy"||a==="user_pays_all":r.includes(l.key)?a==="user_pays_swap"||a==="user_pays_all":x.includes(l.key)?a==="user_pays_all":!0)}return e},[c,t,n,a]),N=o.useCallback(e=>c.filter(i=>e.includes(i.key)).sort((i,r)=>e.indexOf(i.key)-e.indexOf(r.key)),[c]),K=o.useMemo(()=>{if(t?.id!=="deposits")return;const e={},i=parseFloat(n("deposit_min_usd"))||0,r=n("deposit_micro_enabled");return(r==="false"||r==="0"||r==="")&&i<10&&(e.deposit_min_usd="SOL micro payments must be enabled for minimum deposits under $10."),Object.keys(e).length>0?e:void 0},[t?.id,n]),d=n("feature_credits")==="true",C=()=>{g("feature_credits",d?"false":"true")};return j&&Object.keys(u).length===0?s.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${_??""}`,children:[s.jsx(E.LoadingSpinner,{}),s.jsx("span",{children:"Loading settings..."})]}):h?s.jsx("div",{className:`cedros-system-settings ${_??""}`,children:s.jsx(M.ErrorMessage,{error:h.message})}):s.jsxs("div",{className:`cedros-system-settings ${_??""}`,children:[s.jsxs("div",{className:"cedros-settings-page-header",children:[s.jsxs("div",{className:"cedros-settings-page-header-content",children:[s.jsx("h2",{className:"cedros-settings-page-title",children:"Credit System"}),s.jsx("p",{className:"cedros-settings-page-description",children:"Configure credit deposits, timed withdrawals, and privacy period settings."})]}),s.jsxs("div",{className:"cedros-settings-page-header-actions",children:[s.jsxs("button",{type:"button",role:"switch","aria-checked":d,className:`cedros-toggle ${d?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:C,children:[s.jsx("span",{className:"cedros-toggle-track",children:s.jsx("span",{className:"cedros-toggle-thumb"})}),s.jsx("span",{className:"cedros-toggle-label",children:d?"Enabled":"Disabled"})]}),s.jsx(p.AutosaveStatus,{status:k,error:w})]})]}),s.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:v.map(e=>s.jsx("button",{type:"button",className:`cedros-admin-tab ${m===e.id?"cedros-admin-tab-active":""}`,onClick:()=>S(e.id),"aria-selected":m===e.id,role:"tab",children:e.label},e.id))}),s.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:y.length===0&&!t?.sections?.length?s.jsx("div",{className:"cedros-system-settings-empty",children:s.jsxs("p",{children:["No settings found for ",t?.label??"this section","."]})}):s.jsxs(s.Fragment,{children:[y.length>0&&s.jsx(p.SettingsSection,{settings:y,edits:f,onChange:g,externalWarnings:K}),t?.sections?.map(e=>{const i=N(e.keys);return i.length===0?null:s.jsxs("div",{className:"cedros-settings-subsection",children:[s.jsxs("div",{className:"cedros-settings-subsection-header",children:[s.jsx("h4",{className:"cedros-settings-subsection-title",children:e.title}),e.description&&s.jsx("p",{className:"cedros-settings-subsection-description",children:e.description})]}),s.jsx(p.SettingsSection,{settings:i,edits:f,onChange:g})]},e.title)})]})})]})}exports.CreditSystemSettings=O;
|
package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CBot8EPW.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreditSystemSettings-Ck5WIMp3.cjs","sources":["../src/components/admin/settings/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System settings page - deposits, withdrawals, privacy period (with tabs)\n */\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting } from '../../../types';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype CreditTab = 'deposits' | 'tokens' | 'fees' | 'privacy' | 'treasury';\n\ninterface TabSection {\n title: string;\n description?: string;\n keys: string[];\n}\n\ninterface TabConfig {\n id: CreditTab;\n label: string;\n /** Categories to pull settings from */\n categories: string[];\n /** Specific keys to include (if empty, include all from categories) */\n includeKeys?: string[];\n /** Specific keys to exclude */\n excludeKeys?: string[];\n /** Additional sections rendered below the main settings */\n sections?: TabSection[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'deposits',\n label: 'Deposits',\n categories: ['deposit.general'],\n includeKeys: [\n 'deposit_company_token',\n 'deposit_max_usd',\n 'deposit_min_usd',\n 'deposit_micro_enabled',\n 'deposit_gasless_swap_enabled',\n 'solana_rpc_url',\n 'jupiter_api_key',\n ],\n },\n {\n id: 'tokens',\n label: 'Component',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_show_explainer',\n 'deposit_quick_action_tokens',\n 'deposit_custom_tokens',\n 'deposit_custom_tokens_json',\n ],\n },\n {\n id: 'fees',\n label: 'Fees',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_fee_policy',\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'swap_fee_fixed_lamports',\n 'swap_fee_percent_bps',\n 'company_fee_fixed_lamports',\n 'company_fee_percent_bps',\n 'private_deposit_min_lamports',\n ],\n },\n {\n id: 'privacy',\n label: 'Privacy',\n categories: ['deposit.general', 'privacy', 'withdrawal'],\n includeKeys: [\n // Enable toggle\n 'deposit_privacy_enabled',\n // Privacy period setting\n 'privacy_period_secs',\n // Withdrawal settings (from privacy pool)\n 'withdrawal_percentage',\n 'withdrawal_min_lamports',\n // Partial withdrawal settings (related to privacy mixing)\n 'partial_withdrawal_count',\n 'partial_withdrawal_min_lamports',\n ],\n sections: [\n {\n title: 'Privacy Pool Worker',\n description: 'Background worker for processing withdrawals from the privacy cash pool.',\n keys: ['withdrawal_poll_interval_secs', 'withdrawal_batch_size'],\n },\n ],\n },\n {\n id: 'treasury',\n label: 'Treasury',\n categories: ['withdrawal', 'deposit'],\n includeKeys: [\n // Treasury wallet (separate section)\n 'treasury_wallet_address',\n ],\n sections: [\n {\n title: 'Micropayment Batch Worker',\n description: 'Background worker for batching small SOL deposits together.',\n keys: ['micro_batch_threshold_usd', 'micro_batch_poll_secs'],\n },\n ],\n },\n];\n\nexport interface CreditSystemSettingsProps {\n className?: string;\n}\n\nexport function CreditSystemSettings({ className }: CreditSystemSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<CreditTab>('deposits');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config and filter settings\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect all settings from the tab's categories\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: SystemSetting[] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n // Get fee policy for conditional visibility\n const feePolicy = getEffectiveValue('deposit_fee_policy') || 'company_pays_all';\n\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n\n // Apply include/exclude filters\n let filtered = allTabSettings;\n\n if (currentTab.includeKeys && currentTab.includeKeys.length > 0) {\n // Only include specific keys\n filtered = filtered.filter((s) => currentTab.includeKeys!.includes(s.key));\n // Sort by includeKeys order\n filtered.sort(\n (a, b) => currentTab.includeKeys!.indexOf(a.key) - currentTab.includeKeys!.indexOf(b.key)\n );\n } else if (currentTab.excludeKeys && currentTab.excludeKeys.length > 0) {\n // Exclude specific keys\n filtered = filtered.filter((s) => !currentTab.excludeKeys!.includes(s.key));\n }\n\n // Deposits tab: hide SOL micro payments if minimum > $10\n if (currentTab.id === 'deposits') {\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n if (minUsd > 10) {\n filtered = filtered.filter((s) => s.key !== 'deposit_micro_enabled');\n }\n }\n\n // Fees tab: conditionally show fee settings based on policy\n if (currentTab.id === 'fees') {\n const privacyFeeKeys = [\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'private_deposit_min_lamports',\n ];\n const swapFeeKeys = ['swap_fee_fixed_lamports', 'swap_fee_percent_bps'];\n const companyFeeKeys = ['company_fee_fixed_lamports', 'company_fee_percent_bps'];\n\n filtered = filtered.filter((s) => {\n // Always show fee policy selector\n if (s.key === 'deposit_fee_policy') return true;\n\n // Hide all fees if company pays all\n if (feePolicy === 'company_pays_all') return false;\n\n // Show privacy fees for user_pays_privacy or user_pays_all\n if (privacyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_privacy' || feePolicy === 'user_pays_all';\n }\n\n // Show swap fees for user_pays_swap or user_pays_all\n if (swapFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_swap' || feePolicy === 'user_pays_all';\n }\n\n // Show company fees only for user_pays_all\n if (companyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_all';\n }\n\n return true;\n });\n }\n\n return filtered;\n }, [allTabSettings, currentTab, getEffectiveValue, feePolicy]);\n\n // Helper to get settings for a section\n const getSectionSettings = useCallback(\n (keys: string[]) => {\n return allTabSettings\n .filter((s) => keys.includes(s.key))\n .sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));\n },\n [allTabSettings]\n );\n\n // Compute external warnings for the deposits tab\n const externalWarnings = useMemo(() => {\n if (currentTab?.id !== 'deposits') return undefined;\n\n const warnings: Record<string, string> = {};\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n const microEnabled = getEffectiveValue('deposit_micro_enabled');\n const isMicroDisabled = microEnabled === 'false' || microEnabled === '0' || microEnabled === '';\n\n // Warn if micro payments disabled but minimum < $10\n if (isMicroDisabled && minUsd < 10) {\n warnings['deposit_min_usd'] =\n 'SOL micro payments must be enabled for minimum deposits under $10.';\n }\n\n return Object.keys(warnings).length > 0 ? warnings : undefined;\n }, [currentTab?.id, getEffectiveValue]);\n\n // Credit system master toggle\n const creditsEnabled = getEffectiveValue('feature_credits') === 'true';\n const handleCreditsToggle = () => {\n handleChange('feature_credits', creditsEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Credit System</h2>\n <p className=\"cedros-settings-page-description\">\n Configure credit deposits, timed withdrawals, and privacy period settings.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={creditsEnabled}\n className={`cedros-toggle ${creditsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleCreditsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{creditsEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 && !currentTab?.sections?.length ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <>\n {currentSettings.length > 0 && (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n {/* Render additional sections */}\n {currentTab?.sections?.map((section) => {\n const sectionSettings = getSectionSettings(section.keys);\n if (sectionSettings.length === 0) return null;\n return (\n <div key={section.title} className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <h4 className=\"cedros-settings-subsection-title\">{section.title}</h4>\n {section.description && (\n <p className=\"cedros-settings-subsection-description\">\n {section.description}\n </p>\n )}\n </div>\n <SettingsSection\n settings={sectionSettings}\n edits={edits}\n onChange={handleChange}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Keep old export name for backwards compatibility\nexport { CreditSystemSettings as PrivacyCashSettings };\nexport type { CreditSystemSettingsProps as PrivacyCashSettingsProps };\n"],"names":["TABS","CreditSystemSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","activeTab","setActiveTab","useState","useEffect","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","feePolicy","currentSettings","filtered","s","a","b","privacyFeeKeys","swapFeeKeys","companyFeeKeys","getSectionSettings","useCallback","keys","externalWarnings","warnings","minUsd","microEnabled","creditsEnabled","handleCreditsToggle","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","tab","Fragment","SettingsSection","section","sectionSettings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreditSystemSettings-CBot8EPW.cjs","sources":["../src/components/admin/settings/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System settings page - deposits, withdrawals, privacy period (with tabs)\n */\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting } from '../../../types';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype CreditTab = 'deposits' | 'tokens' | 'fees' | 'privacy' | 'treasury';\n\ninterface TabSection {\n title: string;\n description?: string;\n keys: string[];\n}\n\ninterface TabConfig {\n id: CreditTab;\n label: string;\n /** Categories to pull settings from */\n categories: string[];\n /** Specific keys to include (if empty, include all from categories) */\n includeKeys?: string[];\n /** Specific keys to exclude */\n excludeKeys?: string[];\n /** Additional sections rendered below the main settings */\n sections?: TabSection[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'deposits',\n label: 'Deposits',\n categories: ['deposit.general'],\n includeKeys: [\n 'deposit_company_token',\n 'deposit_max_usd',\n 'deposit_min_usd',\n 'deposit_micro_enabled',\n 'deposit_gasless_swap_enabled',\n 'solana_rpc_url',\n 'jupiter_api_key',\n ],\n },\n {\n id: 'tokens',\n label: 'Component',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_show_explainer',\n 'deposit_quick_action_tokens',\n 'deposit_custom_tokens',\n 'deposit_custom_tokens_json',\n ],\n },\n {\n id: 'fees',\n label: 'Fees',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_fee_policy',\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'swap_fee_fixed_lamports',\n 'swap_fee_percent_bps',\n 'company_fee_fixed_lamports',\n 'company_fee_percent_bps',\n 'private_deposit_min_lamports',\n ],\n },\n {\n id: 'privacy',\n label: 'Privacy',\n categories: ['deposit.general', 'privacy', 'withdrawal'],\n includeKeys: [\n // Enable toggle\n 'deposit_privacy_enabled',\n // Privacy period setting\n 'privacy_period_secs',\n // Withdrawal settings (from privacy pool)\n 'withdrawal_percentage',\n 'withdrawal_min_lamports',\n // Partial withdrawal settings (related to privacy mixing)\n 'partial_withdrawal_count',\n 'partial_withdrawal_min_lamports',\n ],\n sections: [\n {\n title: 'Privacy Pool Worker',\n description: 'Background worker for processing withdrawals from the privacy cash pool.',\n keys: ['withdrawal_poll_interval_secs', 'withdrawal_batch_size'],\n },\n ],\n },\n {\n id: 'treasury',\n label: 'Treasury',\n categories: ['withdrawal', 'deposit'],\n includeKeys: [\n // Treasury wallet (separate section)\n 'treasury_wallet_address',\n ],\n sections: [\n {\n title: 'Micropayment Batch Worker',\n description: 'Background worker for batching small SOL deposits together.',\n keys: ['micro_batch_threshold_usd', 'micro_batch_poll_secs'],\n },\n ],\n },\n];\n\nexport interface CreditSystemSettingsProps {\n className?: string;\n}\n\nexport function CreditSystemSettings({ className }: CreditSystemSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<CreditTab>('deposits');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config and filter settings\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect all settings from the tab's categories\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: SystemSetting[] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n // Get fee policy for conditional visibility\n const feePolicy = getEffectiveValue('deposit_fee_policy') || 'company_pays_all';\n\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n\n // Apply include/exclude filters\n let filtered = allTabSettings;\n\n if (currentTab.includeKeys && currentTab.includeKeys.length > 0) {\n // Only include specific keys\n filtered = filtered.filter((s) => currentTab.includeKeys!.includes(s.key));\n // Sort by includeKeys order\n filtered.sort(\n (a, b) => currentTab.includeKeys!.indexOf(a.key) - currentTab.includeKeys!.indexOf(b.key)\n );\n } else if (currentTab.excludeKeys && currentTab.excludeKeys.length > 0) {\n // Exclude specific keys\n filtered = filtered.filter((s) => !currentTab.excludeKeys!.includes(s.key));\n }\n\n // Deposits tab: hide SOL micro payments if minimum > $10\n if (currentTab.id === 'deposits') {\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n if (minUsd > 10) {\n filtered = filtered.filter((s) => s.key !== 'deposit_micro_enabled');\n }\n }\n\n // Fees tab: conditionally show fee settings based on policy\n if (currentTab.id === 'fees') {\n const privacyFeeKeys = [\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'private_deposit_min_lamports',\n ];\n const swapFeeKeys = ['swap_fee_fixed_lamports', 'swap_fee_percent_bps'];\n const companyFeeKeys = ['company_fee_fixed_lamports', 'company_fee_percent_bps'];\n\n filtered = filtered.filter((s) => {\n // Always show fee policy selector\n if (s.key === 'deposit_fee_policy') return true;\n\n // Hide all fees if company pays all\n if (feePolicy === 'company_pays_all') return false;\n\n // Show privacy fees for user_pays_privacy or user_pays_all\n if (privacyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_privacy' || feePolicy === 'user_pays_all';\n }\n\n // Show swap fees for user_pays_swap or user_pays_all\n if (swapFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_swap' || feePolicy === 'user_pays_all';\n }\n\n // Show company fees only for user_pays_all\n if (companyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_all';\n }\n\n return true;\n });\n }\n\n return filtered;\n }, [allTabSettings, currentTab, getEffectiveValue, feePolicy]);\n\n // Helper to get settings for a section\n const getSectionSettings = useCallback(\n (keys: string[]) => {\n return allTabSettings\n .filter((s) => keys.includes(s.key))\n .sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));\n },\n [allTabSettings]\n );\n\n // Compute external warnings for the deposits tab\n const externalWarnings = useMemo(() => {\n if (currentTab?.id !== 'deposits') return undefined;\n\n const warnings: Record<string, string> = {};\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n const microEnabled = getEffectiveValue('deposit_micro_enabled');\n const isMicroDisabled = microEnabled === 'false' || microEnabled === '0' || microEnabled === '';\n\n // Warn if micro payments disabled but minimum < $10\n if (isMicroDisabled && minUsd < 10) {\n warnings['deposit_min_usd'] =\n 'SOL micro payments must be enabled for minimum deposits under $10.';\n }\n\n return Object.keys(warnings).length > 0 ? warnings : undefined;\n }, [currentTab?.id, getEffectiveValue]);\n\n // Credit system master toggle\n const creditsEnabled = getEffectiveValue('feature_credits') === 'true';\n const handleCreditsToggle = () => {\n handleChange('feature_credits', creditsEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Credit System</h2>\n <p className=\"cedros-settings-page-description\">\n Configure credit deposits, timed withdrawals, and privacy period settings.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={creditsEnabled}\n className={`cedros-toggle ${creditsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleCreditsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{creditsEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 && !currentTab?.sections?.length ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <>\n {currentSettings.length > 0 && (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n {/* Render additional sections */}\n {currentTab?.sections?.map((section) => {\n const sectionSettings = getSectionSettings(section.keys);\n if (sectionSettings.length === 0) return null;\n return (\n <div key={section.title} className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <h4 className=\"cedros-settings-subsection-title\">{section.title}</h4>\n {section.description && (\n <p className=\"cedros-settings-subsection-description\">\n {section.description}\n </p>\n )}\n </div>\n <SettingsSection\n settings={sectionSettings}\n edits={edits}\n onChange={handleChange}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Keep old export name for backwards compatibility\nexport { CreditSystemSettings as PrivacyCashSettings };\nexport type { CreditSystemSettingsProps as PrivacyCashSettingsProps };\n"],"names":["TABS","CreditSystemSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","activeTab","setActiveTab","useState","useEffect","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","feePolicy","currentSettings","filtered","s","a","b","privacyFeeKeys","swapFeeKeys","companyFeeKeys","getSectionSettings","useCallback","keys","externalWarnings","warnings","minUsd","microEnabled","creditsEnabled","handleCreditsToggle","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","tab","Fragment","SettingsSection","section","sectionSettings"],"mappings":"oMAgCMA,EAAoB,CACxB,CACE,GAAI,WACJ,MAAO,WACP,WAAY,CAAC,iBAAiB,EAC9B,YAAa,CACX,wBACA,kBACA,kBACA,wBACA,+BACA,iBACA,iBAAA,CACF,EAEF,CACE,GAAI,SACJ,MAAO,YACP,WAAY,CAAC,SAAS,EACtB,YAAa,CACX,yBACA,8BACA,wBACA,4BAAA,CACF,EAEF,CACE,GAAI,OACJ,MAAO,OACP,WAAY,CAAC,SAAS,EACtB,YAAa,CACX,qBACA,6BACA,0BACA,0BACA,uBACA,6BACA,0BACA,8BAAA,CACF,EAEF,CACE,GAAI,UACJ,MAAO,UACP,WAAY,CAAC,kBAAmB,UAAW,YAAY,EACvD,YAAa,CAEX,0BAEA,sBAEA,wBACA,0BAEA,2BACA,iCAAA,EAEF,SAAU,CACR,CACE,MAAO,sBACP,YAAa,2EACb,KAAM,CAAC,gCAAiC,uBAAuB,CAAA,CACjE,CACF,EAEF,CACE,GAAI,WACJ,MAAO,WACP,WAAY,CAAC,aAAc,SAAS,EACpC,YAAa,CAEX,yBAAA,EAEF,SAAU,CACR,CACE,MAAO,4BACP,YAAa,8DACb,KAAM,CAAC,4BAA6B,uBAAuB,CAAA,CAC7D,CACF,CAEJ,EAMO,SAASC,EAAqB,CAAE,UAAAC,GAAwC,CAC7E,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,EACA,kBAAAC,CAAA,EACEC,sBAAA,EAEE,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAoB,UAAU,EAEhEC,EAAAA,UAAU,IAAM,CACdP,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMQ,EAAajB,EAAK,KAAMkB,GAAMA,EAAE,KAAOL,CAAS,EAGhDM,EAAiBC,EAAAA,QAAQ,IAAM,CACnC,GAAI,CAACH,EAAY,MAAO,CAAA,EACxB,MAAMI,EAA+B,CAAA,EACrC,UAAWC,KAAYL,EAAW,WAAY,CAC5C,MAAMM,EAAmBpB,EAASmB,CAAQ,GAAK,CAAA,EAC/CD,EAAY,KAAK,GAAGE,CAAgB,CACtC,CACA,OAAOF,CACT,EAAG,CAAClB,EAAUc,CAAU,CAAC,EAGnBO,EAAYb,EAAkB,oBAAoB,GAAK,mBAEvDc,EAAkBL,EAAAA,QAAQ,IAAM,CACpC,GAAI,CAACH,EAAY,MAAO,CAAA,EAGxB,IAAIS,EAAWP,EAuBf,GArBIF,EAAW,aAAeA,EAAW,YAAY,OAAS,GAE5DS,EAAWA,EAAS,OAAQC,GAAMV,EAAW,YAAa,SAASU,EAAE,GAAG,CAAC,EAEzED,EAAS,KACP,CAACE,EAAGC,IAAMZ,EAAW,YAAa,QAAQW,EAAE,GAAG,EAAIX,EAAW,YAAa,QAAQY,EAAE,GAAG,CAAA,GAEjFZ,EAAW,aAAeA,EAAW,YAAY,OAAS,IAEnES,EAAWA,EAAS,OAAQC,GAAM,CAACV,EAAW,YAAa,SAASU,EAAE,GAAG,CAAC,GAIxEV,EAAW,KAAO,aACL,WAAWN,EAAkB,iBAAiB,CAAC,GAAK,GACtD,KACXe,EAAWA,EAAS,OAAQC,GAAMA,EAAE,MAAQ,uBAAuB,GAKnEV,EAAW,KAAO,OAAQ,CAC5B,MAAMa,EAAiB,CACrB,6BACA,0BACA,8BAAA,EAEIC,EAAc,CAAC,0BAA2B,sBAAsB,EAChEC,EAAiB,CAAC,6BAA8B,yBAAyB,EAE/EN,EAAWA,EAAS,OAAQC,GAEtBA,EAAE,MAAQ,qBAA6B,GAGvCH,IAAc,mBAA2B,GAGzCM,EAAe,SAASH,EAAE,GAAG,EACxBH,IAAc,qBAAuBA,IAAc,gBAIxDO,EAAY,SAASJ,EAAE,GAAG,EACrBH,IAAc,kBAAoBA,IAAc,gBAIrDQ,EAAe,SAASL,EAAE,GAAG,EACxBH,IAAc,gBAGhB,EACR,CACH,CAEA,OAAOE,CACT,EAAG,CAACP,EAAgBF,EAAYN,EAAmBa,CAAS,CAAC,EAGvDS,EAAqBC,EAAAA,YACxBC,GACQhB,EACJ,OAAQQ,GAAMQ,EAAK,SAASR,EAAE,GAAG,CAAC,EAClC,KAAK,CAACC,EAAGC,IAAMM,EAAK,QAAQP,EAAE,GAAG,EAAIO,EAAK,QAAQN,EAAE,GAAG,CAAC,EAE7D,CAACV,CAAc,CAAA,EAIXiB,EAAmBhB,EAAAA,QAAQ,IAAM,CACrC,GAAIH,GAAY,KAAO,WAAY,OAEnC,MAAMoB,EAAmC,CAAA,EACnCC,EAAS,WAAW3B,EAAkB,iBAAiB,CAAC,GAAK,EAC7D4B,EAAe5B,EAAkB,uBAAuB,EAI9D,OAHwB4B,IAAiB,SAAWA,IAAiB,KAAOA,IAAiB,KAGtED,EAAS,KAC9BD,EAAS,gBACP,sEAGG,OAAO,KAAKA,CAAQ,EAAE,OAAS,EAAIA,EAAW,MACvD,EAAG,CAACpB,GAAY,GAAIN,CAAiB,CAAC,EAGhC6B,EAAiB7B,EAAkB,iBAAiB,IAAM,OAC1D8B,EAAsB,IAAM,CAChC/B,EAAa,kBAAmB8B,EAAiB,QAAU,MAAM,CACnE,EAEA,OAAInC,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,SAE7C,MAAA,CAAI,UAAW,yDAAyDD,GAAa,EAAE,GACtF,SAAA,CAAAwC,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIAlC,EAEAkC,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0BxC,GAAa,EAAE,GACvD,SAAAwC,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOpC,EAAM,OAAA,CAAS,EACtC,SAKD,MAAA,CAAI,UAAW,0BAA0BN,GAAa,EAAE,GACvD,SAAA,CAAA2C,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA6B,SAAA,gBAAa,EACxDA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,4EAAA,CAEhD,CAAA,EACF,EACAG,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,KAAK,SACL,eAAcL,EACd,UAAW,iBAAiBA,EAAiB,mBAAqB,mBAAmB,GACrF,QAASC,EAET,SAAA,CAAAC,EAAAA,IAAC,QAAK,UAAU,sBACd,eAAC,OAAA,CAAK,UAAU,sBAAsB,CAAA,CACxC,QACC,OAAA,CAAK,UAAU,sBAAuB,SAAAF,EAAiB,UAAY,UAAA,CAAW,CAAA,CAAA,CAAA,EAEjFE,EAAAA,IAACI,EAAAA,eAAA,CAAe,OAAQxC,EAAgB,MAAOC,CAAA,CAAe,CAAA,CAAA,CAChE,CAAA,EACF,QAGC,MAAA,CAAI,UAAU,4CACZ,SAAAP,EAAK,IAAK+C,GACTL,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,UAAW,oBAAoB7B,IAAckC,EAAI,GAAK,0BAA4B,EAAE,GACpF,QAAS,IAAMjC,EAAaiC,EAAI,EAAE,EAClC,gBAAelC,IAAckC,EAAI,GACjC,KAAK,MAEJ,SAAAA,EAAI,KAAA,EAPAA,EAAI,EAAA,CASZ,EACH,QAGC,MAAA,CAAI,UAAU,2BAA2B,KAAK,WAC5C,WAAgB,SAAW,GAAK,CAAC9B,GAAY,UAAU,OACtDyB,MAAC,OAAI,UAAU,+BACb,gBAAC,IAAA,CAAE,SAAA,CAAA,yBAAuBzB,GAAY,OAAS,eAAe,GAAA,CAAA,CAAC,CAAA,CACjE,EAEA4B,EAAAA,KAAAG,EAAAA,SAAA,CACG,SAAA,CAAAvB,EAAgB,OAAS,GACxBiB,EAAAA,IAACO,EAAAA,gBAAA,CACC,SAAUxB,EACV,MAAArB,EACA,SAAUM,EACV,iBAAA0B,CAAA,CAAA,EAIHnB,GAAY,UAAU,IAAKiC,GAAY,CACtC,MAAMC,EAAkBlB,EAAmBiB,EAAQ,IAAI,EACvD,OAAIC,EAAgB,SAAW,EAAU,KAEvCN,EAAAA,KAAC,MAAA,CAAwB,UAAU,6BACjC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,mCAAoC,SAAAQ,EAAQ,MAAM,EAC/DA,EAAQ,aACPR,EAAAA,IAAC,KAAE,UAAU,yCACV,WAAQ,WAAA,CACX,CAAA,EAEJ,EACAA,EAAAA,IAACO,EAAAA,gBAAA,CACC,SAAUE,EACV,MAAA/C,EACA,SAAUM,CAAA,CAAA,CACZ,CAAA,EAbQwC,EAAQ,KAclB,CAEJ,CAAC,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,EACF,CAEJ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { C as e } from "./CreditSystemSettings-
|
|
3
|
+
import { C as e } from "./CreditSystemSettings-BQ3h4CyM.js";
|
|
4
4
|
function o() {
|
|
5
5
|
return /* @__PURE__ */ t("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ t(e, {}) });
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreditSystemSettings-
|
|
1
|
+
{"version":3,"file":"CreditSystemSettings-bVuNLsqp.js","sources":["../src/admin/sections/CreditSystemSettings.tsx"],"sourcesContent":["/**\n * Credit System Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { CreditSystemSettings as Settings } from '../../components/admin/settings';\n\nexport default function CreditSystemSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["CreditSystemSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAA0C;AAChE,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),i=require("react"),l=require("./AdminDepositList-b2AXtLg0.cjs");function u({pageSize:r=20,refreshInterval:s=0}){const[a,o]=i.useState(""),[d,n]=i.useState(0);return i.useEffect(()=>{if(s<=0)return;const t=window.setInterval(()=>{n(c=>c+1)},s);return()=>window.clearInterval(t)},[s]),e.jsxs("div",{className:"cedros-dashboard__deposits",children:[e.jsx(l.AdminDepositStats,{refreshSignal:d}),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:a,onChange:t=>o(t.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(l.AdminDepositList,{statusFilter:a||void 0,pageSize:r,refreshSignal:d})]})]})}exports.default=u;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepositsSection-BkKUS4vk.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, { useEffect, 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 const [refreshSignal, setRefreshSignal] = useState(0);\n\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = window.setInterval(() => {\n setRefreshSignal((prev) => prev + 1);\n }, refreshInterval);\n return () => window.clearInterval(interval);\n }, [refreshInterval]);\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshSignal={refreshSignal} />\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 refreshSignal={refreshSignal}\n />\n </div>\n </div>\n );\n}\n"],"names":["DepositsSection","pageSize","refreshInterval","statusFilter","setStatusFilter","useState","refreshSignal","setRefreshSignal","useEffect","interval","prev","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,EACrD,CAACC,EAAeC,CAAgB,EAAIF,EAAAA,SAAS,CAAC,EAEpDG,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIN,GAAmB,EAAG,OAC1B,MAAMO,EAAW,OAAO,YAAY,IAAM,CACxCF,EAAkBG,GAASA,EAAO,CAAC,CACrC,EAAGR,CAAe,EAClB,MAAO,IAAM,OAAO,cAAcO,CAAQ,CAC5C,EAAG,CAACP,CAAe,CAAC,EAGlBS,EAAAA,KAAC,MAAA,CAAI,UAAU,6BAEb,SAAA,CAAAC,MAACC,EAAAA,mBAAkB,cAAAP,EAA8B,EAGjDK,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,MAAOR,EACP,SAAWW,GAAMV,EAAgBU,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,aAAcZ,GAAgB,OAC9B,SAAAF,EACA,cAAAK,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { jsxs as t, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
3
|
-
import { A as
|
|
4
|
-
function
|
|
5
|
-
pageSize:
|
|
2
|
+
import { useState as l, useEffect as h } from "react";
|
|
3
|
+
import { A as u, a as p } from "./AdminDepositList-CyT4VBH8.js";
|
|
4
|
+
function _({
|
|
5
|
+
pageSize: o = 20,
|
|
6
6
|
refreshInterval: s = 0
|
|
7
7
|
}) {
|
|
8
|
-
const [
|
|
9
|
-
return
|
|
10
|
-
|
|
8
|
+
const [a, r] = l(""), [d, n] = l(0);
|
|
9
|
+
return h(() => {
|
|
10
|
+
if (s <= 0) return;
|
|
11
|
+
const i = window.setInterval(() => {
|
|
12
|
+
n((c) => c + 1);
|
|
13
|
+
}, s);
|
|
14
|
+
return () => window.clearInterval(i);
|
|
15
|
+
}, [s]), /* @__PURE__ */ t("div", { className: "cedros-dashboard__deposits", children: [
|
|
16
|
+
/* @__PURE__ */ e(u, { refreshSignal: d }),
|
|
11
17
|
/* @__PURE__ */ t("div", { className: "cedros-dashboard__deposits-list", children: [
|
|
12
18
|
/* @__PURE__ */ e("div", { className: "cedros-dashboard__toolbar", children: /* @__PURE__ */ t("div", { className: "cedros-dashboard__filter", children: [
|
|
13
19
|
/* @__PURE__ */ e("label", { className: "cedros-dashboard__filter-label", htmlFor: "status-filter", children: "Status" }),
|
|
@@ -16,8 +22,8 @@ function u({
|
|
|
16
22
|
{
|
|
17
23
|
id: "status-filter",
|
|
18
24
|
className: "cedros-dashboard__select",
|
|
19
|
-
value:
|
|
20
|
-
onChange: (
|
|
25
|
+
value: a,
|
|
26
|
+
onChange: (i) => r(i.target.value),
|
|
21
27
|
children: [
|
|
22
28
|
/* @__PURE__ */ e("option", { value: "", children: "All statuses" }),
|
|
23
29
|
/* @__PURE__ */ e("option", { value: "pending", children: "Pending" }),
|
|
@@ -32,16 +38,16 @@ function u({
|
|
|
32
38
|
)
|
|
33
39
|
] }) }),
|
|
34
40
|
/* @__PURE__ */ e(
|
|
35
|
-
|
|
41
|
+
p,
|
|
36
42
|
{
|
|
37
|
-
statusFilter:
|
|
38
|
-
pageSize:
|
|
39
|
-
|
|
43
|
+
statusFilter: a || void 0,
|
|
44
|
+
pageSize: o,
|
|
45
|
+
refreshSignal: d
|
|
40
46
|
}
|
|
41
47
|
)
|
|
42
48
|
] })
|
|
43
49
|
] });
|
|
44
50
|
}
|
|
45
51
|
export {
|
|
46
|
-
|
|
52
|
+
_ as default
|
|
47
53
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepositsSection-DD9MKUFt.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, { useEffect, 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 const [refreshSignal, setRefreshSignal] = useState(0);\n\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = window.setInterval(() => {\n setRefreshSignal((prev) => prev + 1);\n }, refreshInterval);\n return () => window.clearInterval(interval);\n }, [refreshInterval]);\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshSignal={refreshSignal} />\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 refreshSignal={refreshSignal}\n />\n </div>\n </div>\n );\n}\n"],"names":["DepositsSection","pageSize","refreshInterval","statusFilter","setStatusFilter","useState","refreshSignal","setRefreshSignal","useEffect","interval","prev","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,GACrD,CAACC,GAAeC,CAAgB,IAAIF,EAAS,CAAC;AAEpD,SAAAG,EAAU,MAAM;AACd,QAAIN,KAAmB,EAAG;AAC1B,UAAMO,IAAW,OAAO,YAAY,MAAM;AACxC,MAAAF,EAAiB,CAACG,MAASA,IAAO,CAAC;AAAA,IACrC,GAAGR,CAAe;AAClB,WAAO,MAAM,OAAO,cAAcO,CAAQ;AAAA,EAC5C,GAAG,CAACP,CAAe,CAAC,GAGlB,gBAAAS,EAAC,OAAA,EAAI,WAAU,8BAEb,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAkB,eAAAP,GAA8B;AAAA,IAGjD,gBAAAK,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,OAAOR;AAAA,YACP,UAAU,CAACW,MAAMV,EAAgBU,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,cAAcZ,KAAgB;AAAA,UAC9B,UAAAF;AAAA,UACA,eAAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),t=require("react"),L=require("./useCedrosLogin-C9MrcZvh.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}=L.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 L.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=L.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-BgTb4H5I.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=L.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}=L.useCedrosLogin(),[x,u]=t.useState(!1),[f,c]=t.useState(!1),[k,d]=t.useState(null),h=t.useMemo(()=>new L.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=L.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=L.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}=L.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 L.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=L.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 N=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(N,"")),b=t.useId();t.useEffect(()=>{m(n.padEnd(N,""))},[n]);const l=t.useCallback(s=>{s>=0&&s<N&&d.current[s]?.focus()},[]),g=t.useCallback(s=>{const a=s.replace(/\D/g,"").slice(0,N);m(a.padEnd(N,"")),p?.(a),a.length===N&&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<N-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<N-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,N);i&&(g(i),l(Math.min(i.length,N-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:N}).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}=L.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 U=d||g,$=()=>{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:U,onDismiss:$}),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}=L.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),U=C?.show??!1,$=C?.defaultChecked??!1,T=C?.label??"Send me updates and news",[S,q]=t.useState(j),[G,J]=t.useState($),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:"*"})]})]})}),U&&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;
|