@cedros/login-react 0.0.43 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +216 -0
  2. package/dist/{AuthenticationSettings-Y40T1djV.cjs → AuthenticationSettings-BlYOmaEG.cjs} +1 -1
  3. package/dist/{AuthenticationSettings-Y40T1djV.cjs.map → AuthenticationSettings-BlYOmaEG.cjs.map} +1 -1
  4. package/dist/{AuthenticationSettings-CxAubcoz.js → AuthenticationSettings-BsuwWKbT.js} +1 -1
  5. package/dist/{AuthenticationSettings-CxAubcoz.js.map → AuthenticationSettings-BsuwWKbT.js.map} +1 -1
  6. package/dist/{AuthenticationSettings-aVBFKKZ-.js → AuthenticationSettings-DrHqtD7p.js} +1 -1
  7. package/dist/{AuthenticationSettings-aVBFKKZ-.js.map → AuthenticationSettings-DrHqtD7p.js.map} +1 -1
  8. package/dist/{AuthenticationSettings-DPr882lj.cjs → AuthenticationSettings-bNQiNQ9g.cjs} +1 -1
  9. package/dist/{AuthenticationSettings-DPr882lj.cjs.map → AuthenticationSettings-bNQiNQ9g.cjs.map} +1 -1
  10. package/dist/{AutosaveStatus-ByD01ENa.cjs → AutosaveStatus-CZSwtgrL.cjs} +1 -1
  11. package/dist/AutosaveStatus-CZSwtgrL.cjs.map +1 -0
  12. package/dist/{AutosaveStatus-DtF_58rC.js → AutosaveStatus-D-roPsRx.js} +280 -280
  13. package/dist/AutosaveStatus-D-roPsRx.js.map +1 -0
  14. package/dist/{CreditSystemSettings-DHG_jhz9.cjs → CreditSystemSettings-3R6crxvW.cjs} +1 -1
  15. package/dist/{CreditSystemSettings-DHG_jhz9.cjs.map → CreditSystemSettings-3R6crxvW.cjs.map} +1 -1
  16. package/dist/{CreditSystemSettings-BQek2Ux2.js → CreditSystemSettings-BTqZFn4K.js} +1 -1
  17. package/dist/{CreditSystemSettings-BQek2Ux2.js.map → CreditSystemSettings-BTqZFn4K.js.map} +1 -1
  18. package/dist/{CreditSystemSettings-CbuCce29.cjs → CreditSystemSettings-BskW_NKx.cjs} +1 -1
  19. package/dist/{CreditSystemSettings-CbuCce29.cjs.map → CreditSystemSettings-BskW_NKx.cjs.map} +1 -1
  20. package/dist/{CreditSystemSettings-GDKgYc7I.js → CreditSystemSettings-SL45GRH3.js} +1 -1
  21. package/dist/{CreditSystemSettings-GDKgYc7I.js.map → CreditSystemSettings-SL45GRH3.js.map} +1 -1
  22. package/dist/{EmailSettings-D2pCqTKC.js → EmailSettings-BUAQji4I.js} +1 -1
  23. package/dist/{EmailSettings-D2pCqTKC.js.map → EmailSettings-BUAQji4I.js.map} +1 -1
  24. package/dist/{EmailSettings-CjxBg0cE.cjs → EmailSettings-CEC1rhrm.cjs} +1 -1
  25. package/dist/{EmailSettings-CjxBg0cE.cjs.map → EmailSettings-CEC1rhrm.cjs.map} +1 -1
  26. package/dist/{EmailSettings-Cg4Z7139.cjs → EmailSettings-CihElRkc.cjs} +1 -1
  27. package/dist/{EmailSettings-Cg4Z7139.cjs.map → EmailSettings-CihElRkc.cjs.map} +1 -1
  28. package/dist/{EmailSettings-Ct6nFslP.js → EmailSettings-XETM8FdS.js} +1 -1
  29. package/dist/{EmailSettings-Ct6nFslP.js.map → EmailSettings-XETM8FdS.js.map} +1 -1
  30. package/dist/{EmbeddedWalletSettings-PwFgtGmK.js → EmbeddedWalletSettings-B-083zu6.js} +1 -1
  31. package/dist/{EmbeddedWalletSettings-PwFgtGmK.js.map → EmbeddedWalletSettings-B-083zu6.js.map} +1 -1
  32. package/dist/{EmbeddedWalletSettings-Bus7UyOX.js → EmbeddedWalletSettings-CCT9DwmL.js} +1 -1
  33. package/dist/{EmbeddedWalletSettings-Bus7UyOX.js.map → EmbeddedWalletSettings-CCT9DwmL.js.map} +1 -1
  34. package/dist/{EmbeddedWalletSettings-CfzvFYnn.cjs → EmbeddedWalletSettings-DXIjansC.cjs} +1 -1
  35. package/dist/{EmbeddedWalletSettings-CfzvFYnn.cjs.map → EmbeddedWalletSettings-DXIjansC.cjs.map} +1 -1
  36. package/dist/{EmbeddedWalletSettings-t0_5poBu.cjs → EmbeddedWalletSettings-MtwR81WH.cjs} +1 -1
  37. package/dist/{EmbeddedWalletSettings-t0_5poBu.cjs.map → EmbeddedWalletSettings-MtwR81WH.cjs.map} +1 -1
  38. package/dist/{PermissionsSection-CSB_Ikj9.cjs → PermissionsSection-4zcE9Zs9.cjs} +1 -1
  39. package/dist/PermissionsSection-4zcE9Zs9.cjs.map +1 -0
  40. package/dist/{PermissionsSection-BDDiEfho.js → PermissionsSection-mm9hfp-u.js} +94 -74
  41. package/dist/PermissionsSection-mm9hfp-u.js.map +1 -0
  42. package/dist/{ServerSettings-D7WJDTbZ.js → ServerSettings-24DA_BOI.js} +1 -1
  43. package/dist/{ServerSettings-D7WJDTbZ.js.map → ServerSettings-24DA_BOI.js.map} +1 -1
  44. package/dist/{ServerSettings-BjLFs_sb.cjs → ServerSettings-BNc4LEs4.cjs} +1 -1
  45. package/dist/{ServerSettings-BjLFs_sb.cjs.map → ServerSettings-BNc4LEs4.cjs.map} +1 -1
  46. package/dist/{ServerSettings-Dmw2rpFA.cjs → ServerSettings-BTEuzdrf.cjs} +1 -1
  47. package/dist/{ServerSettings-Dmw2rpFA.cjs.map → ServerSettings-BTEuzdrf.cjs.map} +1 -1
  48. package/dist/{ServerSettings-COkhan4u.js → ServerSettings-DBpbRihl.js} +1 -1
  49. package/dist/{ServerSettings-COkhan4u.js.map → ServerSettings-DBpbRihl.js.map} +1 -1
  50. package/dist/{TeamSection-BhsBEckR.js → TeamSection-C_eODdLU.js} +1 -1
  51. package/dist/{TeamSection-BhsBEckR.js.map → TeamSection-C_eODdLU.js.map} +1 -1
  52. package/dist/{TeamSection-DLxtRmta.cjs → TeamSection-Km7EwLWD.cjs} +1 -1
  53. package/dist/{TeamSection-DLxtRmta.cjs.map → TeamSection-Km7EwLWD.cjs.map} +1 -1
  54. package/dist/{UsersSection-BEKfbhQ4.cjs → UsersSection-C1Tt0ePx.cjs} +1 -1
  55. package/dist/{UsersSection-BEKfbhQ4.cjs.map → UsersSection-C1Tt0ePx.cjs.map} +1 -1
  56. package/dist/{UsersSection-DbGkmxty.js → UsersSection-Ct_E-MBF.js} +1 -1
  57. package/dist/{UsersSection-DbGkmxty.js.map → UsersSection-Ct_E-MBF.js.map} +1 -1
  58. package/dist/{WebhookSettings-DEHV2ptf.js → WebhookSettings-BhIwucKb.js} +1 -1
  59. package/dist/{WebhookSettings-DEHV2ptf.js.map → WebhookSettings-BhIwucKb.js.map} +1 -1
  60. package/dist/{WebhookSettings-Rq_nNJuw.cjs → WebhookSettings-C6X_JJcD.cjs} +1 -1
  61. package/dist/{WebhookSettings-Rq_nNJuw.cjs.map → WebhookSettings-C6X_JJcD.cjs.map} +1 -1
  62. package/dist/{WebhookSettings-CpPvGmV7.js → WebhookSettings-D9IsXZJN.js} +1 -1
  63. package/dist/{WebhookSettings-CpPvGmV7.js.map → WebhookSettings-D9IsXZJN.js.map} +1 -1
  64. package/dist/{WebhookSettings-DbyPJ8V2.cjs → WebhookSettings-H1x6IKOj.cjs} +1 -1
  65. package/dist/{WebhookSettings-DbyPJ8V2.cjs.map → WebhookSettings-H1x6IKOj.cjs.map} +1 -1
  66. package/dist/admin-only.cjs +1 -1
  67. package/dist/admin-only.js +1 -1
  68. package/dist/index.cjs +13 -13
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.d.ts +128 -22
  71. package/dist/index.js +7352 -6482
  72. package/dist/index.js.map +1 -1
  73. package/dist/{plugin-C4bijrSr.cjs → plugin-BwwJh2cY.cjs} +1 -1
  74. package/dist/{plugin-C4bijrSr.cjs.map → plugin-BwwJh2cY.cjs.map} +1 -1
  75. package/dist/{plugin-Bwwe7_ZO.js → plugin-CetHtdLq.js} +1 -1
  76. package/dist/{plugin-Bwwe7_ZO.js.map → plugin-CetHtdLq.js.map} +1 -1
  77. package/dist/useUsersStatsSummary-BGeh3RnI.js +2025 -0
  78. package/dist/useUsersStatsSummary-BGeh3RnI.js.map +1 -0
  79. package/dist/useUsersStatsSummary-DnsYtFGX.cjs +1 -0
  80. package/dist/useUsersStatsSummary-DnsYtFGX.cjs.map +1 -0
  81. package/package.json +1 -1
  82. package/dist/AutosaveStatus-ByD01ENa.cjs.map +0 -1
  83. package/dist/AutosaveStatus-DtF_58rC.js.map +0 -1
  84. package/dist/PermissionsSection-BDDiEfho.js.map +0 -1
  85. package/dist/PermissionsSection-CSB_Ikj9.cjs.map +0 -1
  86. package/dist/assets/argon2Worker-Bi5TuQvD.js +0 -1
  87. package/dist/assets/argon2Worker-Bi5TuQvD.js.map +0 -1
  88. package/dist/useUsersStatsSummary-9HQDKBU5.js +0 -1879
  89. package/dist/useUsersStatsSummary-9HQDKBU5.js.map +0 -1
  90. package/dist/useUsersStatsSummary-DiRC8sGs.cjs +0 -1
  91. package/dist/useUsersStatsSummary-DiRC8sGs.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CreditSystemSettings-GDKgYc7I.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 title: 'Sidecar Shared Secrets',\n description:\n 'Auto-generated secrets shared between the auth server and the login-sidecar. Copy these into your sidecar deploy secrets.',\n keys: ['sidecar_api_key', 'note_encryption_key'],\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-SL45GRH3.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 title: 'Sidecar Shared Secrets',\n description:\n 'Auto-generated secrets shared between the auth server and the login-sidecar. Copy these into your sidecar deploy secrets.',\n keys: ['sidecar_api_key', 'note_encryption_key'],\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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"}
@@ -2,7 +2,7 @@ import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
2
  import { useEffect as y, useMemo as P } from "react";
3
3
  import { L as w } from "./LoadingSpinner-6vml-zwr.js";
4
4
  import { E as I } from "./ErrorMessage-CcEK0pYO.js";
5
- import { u as M, A as b, S as A } from "./AutosaveStatus-DtF_58rC.js";
5
+ import { u as M, A as b, S as A } from "./AutosaveStatus-D-roPsRx.js";
6
6
  const j = {
7
7
  mailgun: "smtp.mailgun.org",
8
8
  sendgrid: "smtp.sendgrid.net",
@@ -1 +1 @@
1
- {"version":3,"file":"EmailSettings-D2pCqTKC.js","sources":["../src/components/admin/settings/EmailSettings.tsx"],"sourcesContent":["/**\n * Email settings page - SMTP configuration with provider-aware auto-fill\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** SMTP hosts auto-filled when selecting a known provider */\nexport const PROVIDER_SMTP_HOSTS: Record<string, string> = {\n mailgun: 'smtp.mailgun.org',\n sendgrid: 'smtp.sendgrid.net',\n postmark: 'smtp.postmarkapp.com',\n ses: 'email-smtp.us-east-1.amazonaws.com',\n resend: 'smtp.resend.com',\n};\n\n/** Subject customization fields (appended to both provider modes) */\nconst EMAIL_SUBJECT_FIELDS = [\n 'email_subject_verification',\n 'email_subject_password_reset',\n 'email_subject_instant_link',\n 'email_subject_invite',\n 'email_subject_security_alert',\n];\n\n/** Simplified fields for known providers (host/port/tls auto-configured) */\nexport const SIMPLIFIED_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_password',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\n/** All fields for custom SMTP */\nexport const ALL_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_host',\n 'email_smtp_port',\n 'email_smtp_user',\n 'email_smtp_password',\n 'email_smtp_tls',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\nexport interface EmailSettingsProps {\n className?: string;\n}\n\nexport function EmailSettings({ className }: EmailSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n const emailProvider = getEffectiveValue('email_provider') || 'custom';\n const isCustomProvider = emailProvider === 'custom';\n\n // Check if SMTP is configured\n const smtpHost = getEffectiveValue('email_smtp_host');\n const isSmtpConfigured = !isCustomProvider || (smtpHost != null && smtpHost !== '');\n\n // Filter and order fields based on provider mode\n const currentSettings = useMemo(() => {\n const categorySettings = settings['email'] ?? [];\n const fieldsToShow = isCustomProvider ? ALL_EMAIL_FIELDS : SIMPLIFIED_EMAIL_FIELDS;\n return categorySettings\n .filter((s) => fieldsToShow.includes(s.key))\n .sort((a, b) => fieldsToShow.indexOf(a.key) - fieldsToShow.indexOf(b.key));\n }, [settings, isCustomProvider]);\n\n // Auto-set SMTP host/port/tls when provider changes\n const handleProviderAwareChange = (key: string, value: string) => {\n handleChange(key, value);\n if (key === 'email_provider' && value !== 'custom') {\n const host = PROVIDER_SMTP_HOSTS[value];\n if (host) {\n handleChange('email_smtp_host', host);\n handleChange('email_smtp_port', '587');\n handleChange('email_smtp_tls', 'true');\n }\n }\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\">Email & SMTP</h2>\n <p className=\"cedros-settings-page-description\">\n Configure email delivery for verification emails, password resets, and instant link\n login.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {!isSmtpConfigured && (\n <div className=\"cedros-settings-warning-banner\">\n Email features (verification, password reset, instant link) are disabled until SMTP is\n configured. Select a provider or enter custom SMTP settings below.\n </div>\n )}\n\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleProviderAwareChange}\n />\n )}\n </div>\n );\n}\n"],"names":["PROVIDER_SMTP_HOSTS","EMAIL_SUBJECT_FIELDS","SIMPLIFIED_EMAIL_FIELDS","ALL_EMAIL_FIELDS","EmailSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","isCustomProvider","smtpHost","isSmtpConfigured","currentSettings","useMemo","categorySettings","fieldsToShow","s","a","b","handleProviderAwareChange","key","value","host","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
1
+ {"version":3,"file":"EmailSettings-BUAQji4I.js","sources":["../src/components/admin/settings/EmailSettings.tsx"],"sourcesContent":["/**\n * Email settings page - SMTP configuration with provider-aware auto-fill\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** SMTP hosts auto-filled when selecting a known provider */\nexport const PROVIDER_SMTP_HOSTS: Record<string, string> = {\n mailgun: 'smtp.mailgun.org',\n sendgrid: 'smtp.sendgrid.net',\n postmark: 'smtp.postmarkapp.com',\n ses: 'email-smtp.us-east-1.amazonaws.com',\n resend: 'smtp.resend.com',\n};\n\n/** Subject customization fields (appended to both provider modes) */\nconst EMAIL_SUBJECT_FIELDS = [\n 'email_subject_verification',\n 'email_subject_password_reset',\n 'email_subject_instant_link',\n 'email_subject_invite',\n 'email_subject_security_alert',\n];\n\n/** Simplified fields for known providers (host/port/tls auto-configured) */\nexport const SIMPLIFIED_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_password',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\n/** All fields for custom SMTP */\nexport const ALL_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_host',\n 'email_smtp_port',\n 'email_smtp_user',\n 'email_smtp_password',\n 'email_smtp_tls',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\nexport interface EmailSettingsProps {\n className?: string;\n}\n\nexport function EmailSettings({ className }: EmailSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n const emailProvider = getEffectiveValue('email_provider') || 'custom';\n const isCustomProvider = emailProvider === 'custom';\n\n // Check if SMTP is configured\n const smtpHost = getEffectiveValue('email_smtp_host');\n const isSmtpConfigured = !isCustomProvider || (smtpHost != null && smtpHost !== '');\n\n // Filter and order fields based on provider mode\n const currentSettings = useMemo(() => {\n const categorySettings = settings['email'] ?? [];\n const fieldsToShow = isCustomProvider ? ALL_EMAIL_FIELDS : SIMPLIFIED_EMAIL_FIELDS;\n return categorySettings\n .filter((s) => fieldsToShow.includes(s.key))\n .sort((a, b) => fieldsToShow.indexOf(a.key) - fieldsToShow.indexOf(b.key));\n }, [settings, isCustomProvider]);\n\n // Auto-set SMTP host/port/tls when provider changes\n const handleProviderAwareChange = (key: string, value: string) => {\n handleChange(key, value);\n if (key === 'email_provider' && value !== 'custom') {\n const host = PROVIDER_SMTP_HOSTS[value];\n if (host) {\n handleChange('email_smtp_host', host);\n handleChange('email_smtp_port', '587');\n handleChange('email_smtp_tls', 'true');\n }\n }\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\">Email & SMTP</h2>\n <p className=\"cedros-settings-page-description\">\n Configure email delivery for verification emails, password resets, and instant link\n login.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {!isSmtpConfigured && (\n <div className=\"cedros-settings-warning-banner\">\n Email features (verification, password reset, instant link) are disabled until SMTP is\n configured. Select a provider or enter custom SMTP settings below.\n </div>\n )}\n\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleProviderAwareChange}\n />\n )}\n </div>\n );\n}\n"],"names":["PROVIDER_SMTP_HOSTS","EMAIL_SUBJECT_FIELDS","SIMPLIFIED_EMAIL_FIELDS","ALL_EMAIL_FIELDS","EmailSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","isCustomProvider","smtpHost","isSmtpConfigured","currentSettings","useMemo","categorySettings","fieldsToShow","s","a","b","handleProviderAwareChange","key","value","host","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";const e=require("react/jsx-runtime"),u=require("react"),P=require("./LoadingSpinner-d6sSxgQN.cjs"),y=require("./ErrorMessage-CHbYbVi2.cjs"),m=require("./AutosaveStatus-ByD01ENa.cjs"),p={mailgun:"smtp.mailgun.org",sendgrid:"smtp.sendgrid.net",postmark:"smtp.postmarkapp.com",ses:"email-smtp.us-east-1.amazonaws.com",resend:"smtp.resend.com"},S=["email_subject_verification","email_subject_password_reset","email_subject_instant_link","email_subject_invite","email_subject_security_alert"],f=["email_provider","email_smtp_password","email_from_address","email_from_name",...S],h=["email_provider","email_smtp_host","email_smtp_port","email_smtp_user","email_smtp_password","email_smtp_tls","email_from_address","email_from_name",...S];function A({className:n}){const{settings:a,edits:v,isLoading:E,autosaveStatus:j,autosaveError:L,error:c,fetchSettings:l,handleChange:i,getEffectiveValue:d}=m.useSettingsAutosave();u.useEffect(()=>{l()},[l]);const o=(d("email_provider")||"custom")==="custom",_=d("email_smtp_host"),x=!o||_!=null&&_!=="",g=u.useMemo(()=>{const r=a.email??[],s=o?h:f;return r.filter(t=>s.includes(t.key)).sort((t,M)=>s.indexOf(t.key)-s.indexOf(M.key))},[a,o]),I=(r,s)=>{if(i(r,s),r==="email_provider"&&s!=="custom"){const t=p[s];t&&(i("email_smtp_host",t),i("email_smtp_port","587"),i("email_smtp_tls","true"))}};return E&&Object.keys(a).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(P.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):c?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(y.ErrorMessage,{error:c.message})}):e.jsxs("div",{className:`cedros-system-settings ${n??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Email & SMTP"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure email delivery for verification emails, password resets, and instant link login."})]}),e.jsx(m.AutosaveStatus,{status:j,error:L})]}),!x&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Email features (verification, password reset, instant link) are disabled until SMTP is configured. Select a provider or enter custom SMTP settings below."}),g.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No settings found for this section."})}):e.jsx(m.SettingsSection,{settings:g,edits:v,onChange:I})]})}exports.ALL_EMAIL_FIELDS=h;exports.EmailSettings=A;exports.PROVIDER_SMTP_HOSTS=p;exports.SIMPLIFIED_EMAIL_FIELDS=f;
1
+ "use strict";const e=require("react/jsx-runtime"),u=require("react"),P=require("./LoadingSpinner-d6sSxgQN.cjs"),y=require("./ErrorMessage-CHbYbVi2.cjs"),m=require("./AutosaveStatus-CZSwtgrL.cjs"),p={mailgun:"smtp.mailgun.org",sendgrid:"smtp.sendgrid.net",postmark:"smtp.postmarkapp.com",ses:"email-smtp.us-east-1.amazonaws.com",resend:"smtp.resend.com"},S=["email_subject_verification","email_subject_password_reset","email_subject_instant_link","email_subject_invite","email_subject_security_alert"],f=["email_provider","email_smtp_password","email_from_address","email_from_name",...S],h=["email_provider","email_smtp_host","email_smtp_port","email_smtp_user","email_smtp_password","email_smtp_tls","email_from_address","email_from_name",...S];function A({className:n}){const{settings:a,edits:v,isLoading:E,autosaveStatus:j,autosaveError:L,error:c,fetchSettings:l,handleChange:i,getEffectiveValue:d}=m.useSettingsAutosave();u.useEffect(()=>{l()},[l]);const o=(d("email_provider")||"custom")==="custom",_=d("email_smtp_host"),x=!o||_!=null&&_!=="",g=u.useMemo(()=>{const r=a.email??[],s=o?h:f;return r.filter(t=>s.includes(t.key)).sort((t,M)=>s.indexOf(t.key)-s.indexOf(M.key))},[a,o]),I=(r,s)=>{if(i(r,s),r==="email_provider"&&s!=="custom"){const t=p[s];t&&(i("email_smtp_host",t),i("email_smtp_port","587"),i("email_smtp_tls","true"))}};return E&&Object.keys(a).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(P.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):c?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(y.ErrorMessage,{error:c.message})}):e.jsxs("div",{className:`cedros-system-settings ${n??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Email & SMTP"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure email delivery for verification emails, password resets, and instant link login."})]}),e.jsx(m.AutosaveStatus,{status:j,error:L})]}),!x&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Email features (verification, password reset, instant link) are disabled until SMTP is configured. Select a provider or enter custom SMTP settings below."}),g.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No settings found for this section."})}):e.jsx(m.SettingsSection,{settings:g,edits:v,onChange:I})]})}exports.ALL_EMAIL_FIELDS=h;exports.EmailSettings=A;exports.PROVIDER_SMTP_HOSTS=p;exports.SIMPLIFIED_EMAIL_FIELDS=f;
@@ -1 +1 @@
1
- {"version":3,"file":"EmailSettings-CjxBg0cE.cjs","sources":["../src/components/admin/settings/EmailSettings.tsx"],"sourcesContent":["/**\n * Email settings page - SMTP configuration with provider-aware auto-fill\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** SMTP hosts auto-filled when selecting a known provider */\nexport const PROVIDER_SMTP_HOSTS: Record<string, string> = {\n mailgun: 'smtp.mailgun.org',\n sendgrid: 'smtp.sendgrid.net',\n postmark: 'smtp.postmarkapp.com',\n ses: 'email-smtp.us-east-1.amazonaws.com',\n resend: 'smtp.resend.com',\n};\n\n/** Subject customization fields (appended to both provider modes) */\nconst EMAIL_SUBJECT_FIELDS = [\n 'email_subject_verification',\n 'email_subject_password_reset',\n 'email_subject_instant_link',\n 'email_subject_invite',\n 'email_subject_security_alert',\n];\n\n/** Simplified fields for known providers (host/port/tls auto-configured) */\nexport const SIMPLIFIED_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_password',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\n/** All fields for custom SMTP */\nexport const ALL_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_host',\n 'email_smtp_port',\n 'email_smtp_user',\n 'email_smtp_password',\n 'email_smtp_tls',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\nexport interface EmailSettingsProps {\n className?: string;\n}\n\nexport function EmailSettings({ className }: EmailSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n const emailProvider = getEffectiveValue('email_provider') || 'custom';\n const isCustomProvider = emailProvider === 'custom';\n\n // Check if SMTP is configured\n const smtpHost = getEffectiveValue('email_smtp_host');\n const isSmtpConfigured = !isCustomProvider || (smtpHost != null && smtpHost !== '');\n\n // Filter and order fields based on provider mode\n const currentSettings = useMemo(() => {\n const categorySettings = settings['email'] ?? [];\n const fieldsToShow = isCustomProvider ? ALL_EMAIL_FIELDS : SIMPLIFIED_EMAIL_FIELDS;\n return categorySettings\n .filter((s) => fieldsToShow.includes(s.key))\n .sort((a, b) => fieldsToShow.indexOf(a.key) - fieldsToShow.indexOf(b.key));\n }, [settings, isCustomProvider]);\n\n // Auto-set SMTP host/port/tls when provider changes\n const handleProviderAwareChange = (key: string, value: string) => {\n handleChange(key, value);\n if (key === 'email_provider' && value !== 'custom') {\n const host = PROVIDER_SMTP_HOSTS[value];\n if (host) {\n handleChange('email_smtp_host', host);\n handleChange('email_smtp_port', '587');\n handleChange('email_smtp_tls', 'true');\n }\n }\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\">Email & SMTP</h2>\n <p className=\"cedros-settings-page-description\">\n Configure email delivery for verification emails, password resets, and instant link\n login.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {!isSmtpConfigured && (\n <div className=\"cedros-settings-warning-banner\">\n Email features (verification, password reset, instant link) are disabled until SMTP is\n configured. Select a provider or enter custom SMTP settings below.\n </div>\n )}\n\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleProviderAwareChange}\n />\n )}\n </div>\n );\n}\n"],"names":["PROVIDER_SMTP_HOSTS","EMAIL_SUBJECT_FIELDS","SIMPLIFIED_EMAIL_FIELDS","ALL_EMAIL_FIELDS","EmailSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","isCustomProvider","smtpHost","isSmtpConfigured","currentSettings","useMemo","categorySettings","fieldsToShow","s","a","b","handleProviderAwareChange","key","value","host","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"oMAWaA,EAA8C,CACzD,QAAS,mBACT,SAAU,oBACV,SAAU,uBACV,IAAK,qCACL,OAAQ,iBACV,EAGMC,EAAuB,CAC3B,6BACA,+BACA,6BACA,uBACA,8BACF,EAGaC,EAA0B,CACrC,iBACA,sBACA,qBACA,kBACA,GAAGD,CACL,EAGaE,EAAmB,CAC9B,iBACA,kBACA,kBACA,kBACA,sBACA,iBACA,qBACA,kBACA,GAAGF,CACL,EAMO,SAASG,EAAc,CAAE,UAAAC,GAAiC,CAC/D,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,EACA,kBAAAC,CAAA,EACEC,sBAAA,EAEJC,EAAAA,UAAU,IAAM,CACdJ,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMK,GADgBH,EAAkB,gBAAgB,GAAK,YAClB,SAGrCI,EAAWJ,EAAkB,iBAAiB,EAC9CK,EAAmB,CAACF,GAAqBC,GAAY,MAAQA,IAAa,GAG1EE,EAAkBC,EAAAA,QAAQ,IAAM,CACpC,MAAMC,EAAmBhB,EAAS,OAAY,CAAA,EACxCiB,EAAeN,EAAmBd,EAAmBD,EAC3D,OAAOoB,EACJ,OAAQE,GAAMD,EAAa,SAASC,EAAE,GAAG,CAAC,EAC1C,KAAK,CAACC,EAAGC,IAAMH,EAAa,QAAQE,EAAE,GAAG,EAAIF,EAAa,QAAQG,EAAE,GAAG,CAAC,CAC7E,EAAG,CAACpB,EAAUW,CAAgB,CAAC,EAGzBU,EAA4B,CAACC,EAAaC,IAAkB,CAEhE,GADAhB,EAAae,EAAKC,CAAK,EACnBD,IAAQ,kBAAoBC,IAAU,SAAU,CAClD,MAAMC,EAAO9B,EAAoB6B,CAAK,EAClCC,IACFjB,EAAa,kBAAmBiB,CAAI,EACpCjB,EAAa,kBAAmB,KAAK,EACrCA,EAAa,iBAAkB,MAAM,EAEzC,CACF,EAEA,OAAIL,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,SAE7C,MAAA,CAAI,UAAW,yDAAyDD,GAAa,EAAE,GACtF,SAAA,CAAA0B,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIApB,EAEAoB,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0B1B,GAAa,EAAE,GACvD,SAAA0B,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOtB,EAAM,OAAA,CAAS,EACtC,SAKD,MAAA,CAAI,UAAW,0BAA0BN,GAAa,EAAE,GACvD,SAAA,CAAA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA6B,SAAA,eAAY,EACvDA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,4FAAA,CAGhD,CAAA,EACF,EACAA,EAAAA,IAACI,EAAAA,eAAA,CAAe,OAAQ1B,EAAgB,MAAOC,CAAA,CAAe,CAAA,EAChE,EAEC,CAACS,GACAY,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAiC,SAAA,4JAGhD,EAGDX,EAAgB,SAAW,EAC1BW,EAAAA,IAAC,MAAA,CAAI,UAAU,+BACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,SAAA,qCAAA,CAAmC,CAAA,CACxC,EAEAA,EAAAA,IAACK,EAAAA,gBAAA,CACC,SAAUhB,EACV,MAAAb,EACA,SAAUoB,CAAA,CAAA,CACZ,EAEJ,CAEJ"}
1
+ {"version":3,"file":"EmailSettings-CEC1rhrm.cjs","sources":["../src/components/admin/settings/EmailSettings.tsx"],"sourcesContent":["/**\n * Email settings page - SMTP configuration with provider-aware auto-fill\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** SMTP hosts auto-filled when selecting a known provider */\nexport const PROVIDER_SMTP_HOSTS: Record<string, string> = {\n mailgun: 'smtp.mailgun.org',\n sendgrid: 'smtp.sendgrid.net',\n postmark: 'smtp.postmarkapp.com',\n ses: 'email-smtp.us-east-1.amazonaws.com',\n resend: 'smtp.resend.com',\n};\n\n/** Subject customization fields (appended to both provider modes) */\nconst EMAIL_SUBJECT_FIELDS = [\n 'email_subject_verification',\n 'email_subject_password_reset',\n 'email_subject_instant_link',\n 'email_subject_invite',\n 'email_subject_security_alert',\n];\n\n/** Simplified fields for known providers (host/port/tls auto-configured) */\nexport const SIMPLIFIED_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_password',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\n/** All fields for custom SMTP */\nexport const ALL_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_host',\n 'email_smtp_port',\n 'email_smtp_user',\n 'email_smtp_password',\n 'email_smtp_tls',\n 'email_from_address',\n 'email_from_name',\n ...EMAIL_SUBJECT_FIELDS,\n];\n\nexport interface EmailSettingsProps {\n className?: string;\n}\n\nexport function EmailSettings({ className }: EmailSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n const emailProvider = getEffectiveValue('email_provider') || 'custom';\n const isCustomProvider = emailProvider === 'custom';\n\n // Check if SMTP is configured\n const smtpHost = getEffectiveValue('email_smtp_host');\n const isSmtpConfigured = !isCustomProvider || (smtpHost != null && smtpHost !== '');\n\n // Filter and order fields based on provider mode\n const currentSettings = useMemo(() => {\n const categorySettings = settings['email'] ?? [];\n const fieldsToShow = isCustomProvider ? ALL_EMAIL_FIELDS : SIMPLIFIED_EMAIL_FIELDS;\n return categorySettings\n .filter((s) => fieldsToShow.includes(s.key))\n .sort((a, b) => fieldsToShow.indexOf(a.key) - fieldsToShow.indexOf(b.key));\n }, [settings, isCustomProvider]);\n\n // Auto-set SMTP host/port/tls when provider changes\n const handleProviderAwareChange = (key: string, value: string) => {\n handleChange(key, value);\n if (key === 'email_provider' && value !== 'custom') {\n const host = PROVIDER_SMTP_HOSTS[value];\n if (host) {\n handleChange('email_smtp_host', host);\n handleChange('email_smtp_port', '587');\n handleChange('email_smtp_tls', 'true');\n }\n }\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\">Email & SMTP</h2>\n <p className=\"cedros-settings-page-description\">\n Configure email delivery for verification emails, password resets, and instant link\n login.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {!isSmtpConfigured && (\n <div className=\"cedros-settings-warning-banner\">\n Email features (verification, password reset, instant link) are disabled until SMTP is\n configured. Select a provider or enter custom SMTP settings below.\n </div>\n )}\n\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleProviderAwareChange}\n />\n )}\n </div>\n );\n}\n"],"names":["PROVIDER_SMTP_HOSTS","EMAIL_SUBJECT_FIELDS","SIMPLIFIED_EMAIL_FIELDS","ALL_EMAIL_FIELDS","EmailSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","isCustomProvider","smtpHost","isSmtpConfigured","currentSettings","useMemo","categorySettings","fieldsToShow","s","a","b","handleProviderAwareChange","key","value","host","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"oMAWaA,EAA8C,CACzD,QAAS,mBACT,SAAU,oBACV,SAAU,uBACV,IAAK,qCACL,OAAQ,iBACV,EAGMC,EAAuB,CAC3B,6BACA,+BACA,6BACA,uBACA,8BACF,EAGaC,EAA0B,CACrC,iBACA,sBACA,qBACA,kBACA,GAAGD,CACL,EAGaE,EAAmB,CAC9B,iBACA,kBACA,kBACA,kBACA,sBACA,iBACA,qBACA,kBACA,GAAGF,CACL,EAMO,SAASG,EAAc,CAAE,UAAAC,GAAiC,CAC/D,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,EACA,kBAAAC,CAAA,EACEC,sBAAA,EAEJC,EAAAA,UAAU,IAAM,CACdJ,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMK,GADgBH,EAAkB,gBAAgB,GAAK,YAClB,SAGrCI,EAAWJ,EAAkB,iBAAiB,EAC9CK,EAAmB,CAACF,GAAqBC,GAAY,MAAQA,IAAa,GAG1EE,EAAkBC,EAAAA,QAAQ,IAAM,CACpC,MAAMC,EAAmBhB,EAAS,OAAY,CAAA,EACxCiB,EAAeN,EAAmBd,EAAmBD,EAC3D,OAAOoB,EACJ,OAAQE,GAAMD,EAAa,SAASC,EAAE,GAAG,CAAC,EAC1C,KAAK,CAACC,EAAGC,IAAMH,EAAa,QAAQE,EAAE,GAAG,EAAIF,EAAa,QAAQG,EAAE,GAAG,CAAC,CAC7E,EAAG,CAACpB,EAAUW,CAAgB,CAAC,EAGzBU,EAA4B,CAACC,EAAaC,IAAkB,CAEhE,GADAhB,EAAae,EAAKC,CAAK,EACnBD,IAAQ,kBAAoBC,IAAU,SAAU,CAClD,MAAMC,EAAO9B,EAAoB6B,CAAK,EAClCC,IACFjB,EAAa,kBAAmBiB,CAAI,EACpCjB,EAAa,kBAAmB,KAAK,EACrCA,EAAa,iBAAkB,MAAM,EAEzC,CACF,EAEA,OAAIL,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,SAE7C,MAAA,CAAI,UAAW,yDAAyDD,GAAa,EAAE,GACtF,SAAA,CAAA0B,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIApB,EAEAoB,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0B1B,GAAa,EAAE,GACvD,SAAA0B,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOtB,EAAM,OAAA,CAAS,EACtC,SAKD,MAAA,CAAI,UAAW,0BAA0BN,GAAa,EAAE,GACvD,SAAA,CAAA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA6B,SAAA,eAAY,EACvDA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,4FAAA,CAGhD,CAAA,EACF,EACAA,EAAAA,IAACI,EAAAA,eAAA,CAAe,OAAQ1B,EAAgB,MAAOC,CAAA,CAAe,CAAA,EAChE,EAEC,CAACS,GACAY,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAiC,SAAA,4JAGhD,EAGDX,EAAgB,SAAW,EAC1BW,EAAAA,IAAC,MAAA,CAAI,UAAU,+BACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,SAAA,qCAAA,CAAmC,CAAA,CACxC,EAEAA,EAAAA,IAACK,EAAAA,gBAAA,CACC,SAAUhB,EACV,MAAAb,EACA,SAAUoB,CAAA,CAAA,CACZ,EAEJ,CAEJ"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmailSettings-CjxBg0cE.cjs");function i(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.EmailSettings,{})})}exports.default=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmailSettings-CEC1rhrm.cjs");function i(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.EmailSettings,{})})}exports.default=i;
@@ -1 +1 @@
1
- {"version":3,"file":"EmailSettings-Cg4Z7139.cjs","sources":["../src/admin/sections/EmailSettings.tsx"],"sourcesContent":["/**\n * Email Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmailSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmailSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmailSettings","jsx","Settings"],"mappings":"sLAOA,SAAwBA,GAAmC,CACzD,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,gBAAS,EACZ,CAEJ"}
1
+ {"version":3,"file":"EmailSettings-CihElRkc.cjs","sources":["../src/admin/sections/EmailSettings.tsx"],"sourcesContent":["/**\n * Email Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmailSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmailSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmailSettings","jsx","Settings"],"mappings":"sLAOA,SAAwBA,GAAmC,CACzD,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,gBAAS,EACZ,CAEJ"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import "react";
3
- import { E as i } from "./EmailSettings-D2pCqTKC.js";
3
+ import { E as i } from "./EmailSettings-BUAQji4I.js";
4
4
  function a() {
5
5
  return /* @__PURE__ */ t("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ t(i, {}) });
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EmailSettings-Ct6nFslP.js","sources":["../src/admin/sections/EmailSettings.tsx"],"sourcesContent":["/**\n * Email Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmailSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmailSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmailSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAmC;AACzD,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
1
+ {"version":3,"file":"EmailSettings-XETM8FdS.js","sources":["../src/admin/sections/EmailSettings.tsx"],"sourcesContent":["/**\n * Email Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmailSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmailSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmailSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAmC;AACzD,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
2
  import "react";
3
- import { E as t } from "./EmbeddedWalletSettings-Bus7UyOX.js";
3
+ import { E as t } from "./EmbeddedWalletSettings-CCT9DwmL.js";
4
4
  function s() {
5
5
  return /* @__PURE__ */ e("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ e(t, {}) });
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedWalletSettings-PwFgtGmK.js","sources":["../src/admin/sections/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmbeddedWalletSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmbeddedWalletSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmbeddedWalletSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAA4C;AAClE,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
1
+ {"version":3,"file":"EmbeddedWalletSettings-B-083zu6.js","sources":["../src/admin/sections/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmbeddedWalletSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmbeddedWalletSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmbeddedWalletSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAA4C;AAClE,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
@@ -2,7 +2,7 @@ import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
2
  import { useEffect as k, useMemo as x } from "react";
3
3
  import { L } from "./LoadingSpinner-6vml-zwr.js";
4
4
  import { E as W } from "./ErrorMessage-CcEK0pYO.js";
5
- import { u as C, A as M, S as $ } from "./AutosaveStatus-DtF_58rC.js";
5
+ import { u as C, A as M, S as $ } from "./AutosaveStatus-D-roPsRx.js";
6
6
  const d = ["wallet_recovery_mode", "wallet_enroll_solana_users"];
7
7
  function q({ className: n }) {
8
8
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedWalletSettings-Bus7UyOX.js","sources":["../src/components/admin/settings/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet settings page - enable/disable and configure recovery\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** Keys to show on this page (excluding the master toggle which is in header) */\nconst SETTINGS_KEYS = ['wallet_recovery_mode', 'wallet_enroll_solana_users'];\n\nexport interface EmbeddedWalletSettingsProps {\n className?: string;\n}\n\nexport function EmbeddedWalletSettings({ className }: EmbeddedWalletSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get wallet settings from features category\n const featuresSettings = settings['features'] ?? [];\n const currentSettings = featuresSettings\n .filter((s) => SETTINGS_KEYS.includes(s.key))\n .sort((a, b) => SETTINGS_KEYS.indexOf(a.key) - SETTINGS_KEYS.indexOf(b.key));\n\n // Embedded wallet master toggle\n const walletEnabled = getEffectiveValue('feature_wallet_signing') === 'true';\n const handleWalletToggle = () => {\n handleChange('feature_wallet_signing', walletEnabled ? 'false' : 'true');\n };\n\n // User withdrawals toggle (only visible when wallet is enabled)\n const withdrawalsEnabled = getEffectiveValue('feature_user_withdrawals') === 'true';\n const handleWithdrawalsToggle = () => {\n handleChange('feature_user_withdrawals', withdrawalsEnabled ? 'false' : 'true');\n };\n\n // Cross-category mismatch detection\n const privateDepositsEnabled = getEffectiveValue('deposit_privacy_enabled') === 'true';\n const recoveryMode = getEffectiveValue('wallet_recovery_mode');\n const recoveryMismatch = privateDepositsEnabled && recoveryMode !== 'none';\n const walletMismatch = privateDepositsEnabled && !walletEnabled;\n\n // Inline warning on recovery mode row\n const externalWarnings = useMemo(() => {\n if (!recoveryMismatch) return undefined;\n return {\n wallet_recovery_mode:\n 'Private deposits require No Recovery mode. Deposits will fail with the current setting.',\n };\n }, [recoveryMismatch]);\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\">Embedded Wallet</h2>\n <p className=\"cedros-settings-page-description\">\n Configure the embedded wallet for transaction signing.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={walletEnabled}\n className={`cedros-toggle ${walletEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWalletToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{walletEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* User Withdrawals toggle (only visible when wallet is enabled) */}\n {walletEnabled && (\n <div className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <div>\n <h3 className=\"cedros-settings-subsection-title\">User Withdrawals</h3>\n <p className=\"cedros-settings-subsection-description\">\n Allow users to withdraw SOL/SPL tokens from their embedded wallet to external\n addresses.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={withdrawalsEnabled}\n className={`cedros-toggle ${withdrawalsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWithdrawalsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">\n {withdrawalsEnabled ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n </div>\n </div>\n )}\n\n {/* Mismatch warnings */}\n {recoveryMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require No Recovery mode. Users will see an error when\n attempting private deposits until recovery mode is changed below.\n </div>\n )}\n {walletMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require the embedded wallet. Enable it above.\n </div>\n )}\n\n {/* Settings content */}\n <div className=\"cedros-admin-tab-content\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No additional settings available.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["SETTINGS_KEYS","EmbeddedWalletSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","currentSettings","s","a","b","walletEnabled","handleWalletToggle","withdrawalsEnabled","handleWithdrawalsToggle","privateDepositsEnabled","recoveryMode","recoveryMismatch","walletMismatch","externalWarnings","useMemo","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
1
+ {"version":3,"file":"EmbeddedWalletSettings-CCT9DwmL.js","sources":["../src/components/admin/settings/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet settings page - enable/disable and configure recovery\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** Keys to show on this page (excluding the master toggle which is in header) */\nconst SETTINGS_KEYS = ['wallet_recovery_mode', 'wallet_enroll_solana_users'];\n\nexport interface EmbeddedWalletSettingsProps {\n className?: string;\n}\n\nexport function EmbeddedWalletSettings({ className }: EmbeddedWalletSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get wallet settings from features category\n const featuresSettings = settings['features'] ?? [];\n const currentSettings = featuresSettings\n .filter((s) => SETTINGS_KEYS.includes(s.key))\n .sort((a, b) => SETTINGS_KEYS.indexOf(a.key) - SETTINGS_KEYS.indexOf(b.key));\n\n // Embedded wallet master toggle\n const walletEnabled = getEffectiveValue('feature_wallet_signing') === 'true';\n const handleWalletToggle = () => {\n handleChange('feature_wallet_signing', walletEnabled ? 'false' : 'true');\n };\n\n // User withdrawals toggle (only visible when wallet is enabled)\n const withdrawalsEnabled = getEffectiveValue('feature_user_withdrawals') === 'true';\n const handleWithdrawalsToggle = () => {\n handleChange('feature_user_withdrawals', withdrawalsEnabled ? 'false' : 'true');\n };\n\n // Cross-category mismatch detection\n const privateDepositsEnabled = getEffectiveValue('deposit_privacy_enabled') === 'true';\n const recoveryMode = getEffectiveValue('wallet_recovery_mode');\n const recoveryMismatch = privateDepositsEnabled && recoveryMode !== 'none';\n const walletMismatch = privateDepositsEnabled && !walletEnabled;\n\n // Inline warning on recovery mode row\n const externalWarnings = useMemo(() => {\n if (!recoveryMismatch) return undefined;\n return {\n wallet_recovery_mode:\n 'Private deposits require No Recovery mode. Deposits will fail with the current setting.',\n };\n }, [recoveryMismatch]);\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\">Embedded Wallet</h2>\n <p className=\"cedros-settings-page-description\">\n Configure the embedded wallet for transaction signing.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={walletEnabled}\n className={`cedros-toggle ${walletEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWalletToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{walletEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* User Withdrawals toggle (only visible when wallet is enabled) */}\n {walletEnabled && (\n <div className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <div>\n <h3 className=\"cedros-settings-subsection-title\">User Withdrawals</h3>\n <p className=\"cedros-settings-subsection-description\">\n Allow users to withdraw SOL/SPL tokens from their embedded wallet to external\n addresses.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={withdrawalsEnabled}\n className={`cedros-toggle ${withdrawalsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWithdrawalsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">\n {withdrawalsEnabled ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n </div>\n </div>\n )}\n\n {/* Mismatch warnings */}\n {recoveryMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require No Recovery mode. Users will see an error when\n attempting private deposits until recovery mode is changed below.\n </div>\n )}\n {walletMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require the embedded wallet. Enable it above.\n </div>\n )}\n\n {/* Settings content */}\n <div className=\"cedros-admin-tab-content\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No additional settings available.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["SETTINGS_KEYS","EmbeddedWalletSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","currentSettings","s","a","b","walletEnabled","handleWalletToggle","withdrawalsEnabled","handleWithdrawalsToggle","privateDepositsEnabled","recoveryMode","recoveryMismatch","walletMismatch","externalWarnings","useMemo","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"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("./EmbeddedWalletSettings-t0_5poBu.cjs");function d(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.EmbeddedWalletSettings,{})})}exports.default=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmbeddedWalletSettings-MtwR81WH.cjs");function d(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.EmbeddedWalletSettings,{})})}exports.default=d;
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedWalletSettings-CfzvFYnn.cjs","sources":["../src/admin/sections/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmbeddedWalletSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmbeddedWalletSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmbeddedWalletSettings","jsx","Settings"],"mappings":"+LAOA,SAAwBA,GAA4C,CAClE,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,yBAAS,EACZ,CAEJ"}
1
+ {"version":3,"file":"EmbeddedWalletSettings-DXIjansC.cjs","sources":["../src/admin/sections/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { EmbeddedWalletSettings as Settings } from '../../components/admin/settings';\n\nexport default function EmbeddedWalletSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["EmbeddedWalletSettings","jsx","Settings"],"mappings":"+LAOA,SAAwBA,GAA4C,CAClE,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,yBAAS,EACZ,CAEJ"}
@@ -1 +1 @@
1
- "use strict";const e=require("react/jsx-runtime"),b=require("react"),E=require("./LoadingSpinner-d6sSxgQN.cjs"),k=require("./ErrorMessage-CHbYbVi2.cjs"),o=require("./AutosaveStatus-ByD01ENa.cjs"),d=["wallet_recovery_mode","wallet_enroll_solana_users"];function q({className:a}){const{settings:c,edits:v,isLoading:x,autosaveStatus:j,autosaveError:p,error:g,fetchSettings:u,handleChange:n,getEffectiveValue:t}=o.useSettingsAutosave();b.useEffect(()=>{u()},[u]);const h=(c.features??[]).filter(l=>d.includes(l.key)).sort((l,S)=>d.indexOf(l.key)-d.indexOf(S.key)),s=t("feature_wallet_signing")==="true",w=()=>{n("feature_wallet_signing",s?"false":"true")},r=t("feature_user_withdrawals")==="true",f=()=>{n("feature_user_withdrawals",r?"false":"true")},m=t("deposit_privacy_enabled")==="true",N=t("wallet_recovery_mode"),i=m&&N!=="none",y=m&&!s,_=b.useMemo(()=>{if(i)return{wallet_recovery_mode:"Private deposits require No Recovery mode. Deposits will fail with the current setting."}},[i]);return x&&Object.keys(c).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${a??""}`,children:[e.jsx(E.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):g?e.jsx("div",{className:`cedros-system-settings ${a??""}`,children:e.jsx(k.ErrorMessage,{error:g.message})}):e.jsxs("div",{className:`cedros-system-settings ${a??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Embedded Wallet"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure the embedded wallet for transaction signing."})]}),e.jsxs("div",{className:"cedros-settings-page-header-actions",children:[e.jsxs("button",{type:"button",role:"switch","aria-checked":s,className:`cedros-toggle ${s?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:w,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:s?"Enabled":"Disabled"})]}),e.jsx(o.AutosaveStatus,{status:j,error:p})]})]}),s&&e.jsx("div",{className:"cedros-settings-subsection",children:e.jsxs("div",{className:"cedros-settings-subsection-header",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"cedros-settings-subsection-title",children:"User Withdrawals"}),e.jsx("p",{className:"cedros-settings-subsection-description",children:"Allow users to withdraw SOL/SPL tokens from their embedded wallet to external addresses."})]}),e.jsxs("button",{type:"button",role:"switch","aria-checked":r,className:`cedros-toggle ${r?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:f,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:r?"Enabled":"Disabled"})]})]})}),i&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Private deposits are enabled but require No Recovery mode. Users will see an error when attempting private deposits until recovery mode is changed below."}),y&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Private deposits are enabled but require the embedded wallet. Enable it above."}),e.jsx("div",{className:"cedros-admin-tab-content",children:h.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No additional settings available."})}):e.jsx(o.SettingsSection,{settings:h,edits:v,onChange:n,externalWarnings:_})})]})}exports.EmbeddedWalletSettings=q;
1
+ "use strict";const e=require("react/jsx-runtime"),b=require("react"),E=require("./LoadingSpinner-d6sSxgQN.cjs"),k=require("./ErrorMessage-CHbYbVi2.cjs"),o=require("./AutosaveStatus-CZSwtgrL.cjs"),d=["wallet_recovery_mode","wallet_enroll_solana_users"];function q({className:a}){const{settings:c,edits:v,isLoading:x,autosaveStatus:j,autosaveError:p,error:g,fetchSettings:u,handleChange:n,getEffectiveValue:t}=o.useSettingsAutosave();b.useEffect(()=>{u()},[u]);const h=(c.features??[]).filter(l=>d.includes(l.key)).sort((l,S)=>d.indexOf(l.key)-d.indexOf(S.key)),s=t("feature_wallet_signing")==="true",w=()=>{n("feature_wallet_signing",s?"false":"true")},r=t("feature_user_withdrawals")==="true",f=()=>{n("feature_user_withdrawals",r?"false":"true")},m=t("deposit_privacy_enabled")==="true",N=t("wallet_recovery_mode"),i=m&&N!=="none",y=m&&!s,_=b.useMemo(()=>{if(i)return{wallet_recovery_mode:"Private deposits require No Recovery mode. Deposits will fail with the current setting."}},[i]);return x&&Object.keys(c).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${a??""}`,children:[e.jsx(E.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):g?e.jsx("div",{className:`cedros-system-settings ${a??""}`,children:e.jsx(k.ErrorMessage,{error:g.message})}):e.jsxs("div",{className:`cedros-system-settings ${a??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Embedded Wallet"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure the embedded wallet for transaction signing."})]}),e.jsxs("div",{className:"cedros-settings-page-header-actions",children:[e.jsxs("button",{type:"button",role:"switch","aria-checked":s,className:`cedros-toggle ${s?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:w,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:s?"Enabled":"Disabled"})]}),e.jsx(o.AutosaveStatus,{status:j,error:p})]})]}),s&&e.jsx("div",{className:"cedros-settings-subsection",children:e.jsxs("div",{className:"cedros-settings-subsection-header",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"cedros-settings-subsection-title",children:"User Withdrawals"}),e.jsx("p",{className:"cedros-settings-subsection-description",children:"Allow users to withdraw SOL/SPL tokens from their embedded wallet to external addresses."})]}),e.jsxs("button",{type:"button",role:"switch","aria-checked":r,className:`cedros-toggle ${r?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:f,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:r?"Enabled":"Disabled"})]})]})}),i&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Private deposits are enabled but require No Recovery mode. Users will see an error when attempting private deposits until recovery mode is changed below."}),y&&e.jsx("div",{className:"cedros-settings-warning-banner",children:"Private deposits are enabled but require the embedded wallet. Enable it above."}),e.jsx("div",{className:"cedros-admin-tab-content",children:h.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No additional settings available."})}):e.jsx(o.SettingsSection,{settings:h,edits:v,onChange:n,externalWarnings:_})})]})}exports.EmbeddedWalletSettings=q;
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedWalletSettings-t0_5poBu.cjs","sources":["../src/components/admin/settings/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet settings page - enable/disable and configure recovery\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** Keys to show on this page (excluding the master toggle which is in header) */\nconst SETTINGS_KEYS = ['wallet_recovery_mode', 'wallet_enroll_solana_users'];\n\nexport interface EmbeddedWalletSettingsProps {\n className?: string;\n}\n\nexport function EmbeddedWalletSettings({ className }: EmbeddedWalletSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get wallet settings from features category\n const featuresSettings = settings['features'] ?? [];\n const currentSettings = featuresSettings\n .filter((s) => SETTINGS_KEYS.includes(s.key))\n .sort((a, b) => SETTINGS_KEYS.indexOf(a.key) - SETTINGS_KEYS.indexOf(b.key));\n\n // Embedded wallet master toggle\n const walletEnabled = getEffectiveValue('feature_wallet_signing') === 'true';\n const handleWalletToggle = () => {\n handleChange('feature_wallet_signing', walletEnabled ? 'false' : 'true');\n };\n\n // User withdrawals toggle (only visible when wallet is enabled)\n const withdrawalsEnabled = getEffectiveValue('feature_user_withdrawals') === 'true';\n const handleWithdrawalsToggle = () => {\n handleChange('feature_user_withdrawals', withdrawalsEnabled ? 'false' : 'true');\n };\n\n // Cross-category mismatch detection\n const privateDepositsEnabled = getEffectiveValue('deposit_privacy_enabled') === 'true';\n const recoveryMode = getEffectiveValue('wallet_recovery_mode');\n const recoveryMismatch = privateDepositsEnabled && recoveryMode !== 'none';\n const walletMismatch = privateDepositsEnabled && !walletEnabled;\n\n // Inline warning on recovery mode row\n const externalWarnings = useMemo(() => {\n if (!recoveryMismatch) return undefined;\n return {\n wallet_recovery_mode:\n 'Private deposits require No Recovery mode. Deposits will fail with the current setting.',\n };\n }, [recoveryMismatch]);\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\">Embedded Wallet</h2>\n <p className=\"cedros-settings-page-description\">\n Configure the embedded wallet for transaction signing.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={walletEnabled}\n className={`cedros-toggle ${walletEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWalletToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{walletEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* User Withdrawals toggle (only visible when wallet is enabled) */}\n {walletEnabled && (\n <div className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <div>\n <h3 className=\"cedros-settings-subsection-title\">User Withdrawals</h3>\n <p className=\"cedros-settings-subsection-description\">\n Allow users to withdraw SOL/SPL tokens from their embedded wallet to external\n addresses.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={withdrawalsEnabled}\n className={`cedros-toggle ${withdrawalsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWithdrawalsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">\n {withdrawalsEnabled ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n </div>\n </div>\n )}\n\n {/* Mismatch warnings */}\n {recoveryMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require No Recovery mode. Users will see an error when\n attempting private deposits until recovery mode is changed below.\n </div>\n )}\n {walletMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require the embedded wallet. Enable it above.\n </div>\n )}\n\n {/* Settings content */}\n <div className=\"cedros-admin-tab-content\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No additional settings available.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["SETTINGS_KEYS","EmbeddedWalletSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","currentSettings","s","a","b","walletEnabled","handleWalletToggle","withdrawalsEnabled","handleWithdrawalsToggle","privateDepositsEnabled","recoveryMode","recoveryMismatch","walletMismatch","externalWarnings","useMemo","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
1
+ {"version":3,"file":"EmbeddedWalletSettings-MtwR81WH.cjs","sources":["../src/components/admin/settings/EmbeddedWalletSettings.tsx"],"sourcesContent":["/**\n * Embedded Wallet settings page - enable/disable and configure recovery\n */\nimport { useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** Keys to show on this page (excluding the master toggle which is in header) */\nconst SETTINGS_KEYS = ['wallet_recovery_mode', 'wallet_enroll_solana_users'];\n\nexport interface EmbeddedWalletSettingsProps {\n className?: string;\n}\n\nexport function EmbeddedWalletSettings({ className }: EmbeddedWalletSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get wallet settings from features category\n const featuresSettings = settings['features'] ?? [];\n const currentSettings = featuresSettings\n .filter((s) => SETTINGS_KEYS.includes(s.key))\n .sort((a, b) => SETTINGS_KEYS.indexOf(a.key) - SETTINGS_KEYS.indexOf(b.key));\n\n // Embedded wallet master toggle\n const walletEnabled = getEffectiveValue('feature_wallet_signing') === 'true';\n const handleWalletToggle = () => {\n handleChange('feature_wallet_signing', walletEnabled ? 'false' : 'true');\n };\n\n // User withdrawals toggle (only visible when wallet is enabled)\n const withdrawalsEnabled = getEffectiveValue('feature_user_withdrawals') === 'true';\n const handleWithdrawalsToggle = () => {\n handleChange('feature_user_withdrawals', withdrawalsEnabled ? 'false' : 'true');\n };\n\n // Cross-category mismatch detection\n const privateDepositsEnabled = getEffectiveValue('deposit_privacy_enabled') === 'true';\n const recoveryMode = getEffectiveValue('wallet_recovery_mode');\n const recoveryMismatch = privateDepositsEnabled && recoveryMode !== 'none';\n const walletMismatch = privateDepositsEnabled && !walletEnabled;\n\n // Inline warning on recovery mode row\n const externalWarnings = useMemo(() => {\n if (!recoveryMismatch) return undefined;\n return {\n wallet_recovery_mode:\n 'Private deposits require No Recovery mode. Deposits will fail with the current setting.',\n };\n }, [recoveryMismatch]);\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\">Embedded Wallet</h2>\n <p className=\"cedros-settings-page-description\">\n Configure the embedded wallet for transaction signing.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={walletEnabled}\n className={`cedros-toggle ${walletEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWalletToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{walletEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* User Withdrawals toggle (only visible when wallet is enabled) */}\n {walletEnabled && (\n <div className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <div>\n <h3 className=\"cedros-settings-subsection-title\">User Withdrawals</h3>\n <p className=\"cedros-settings-subsection-description\">\n Allow users to withdraw SOL/SPL tokens from their embedded wallet to external\n addresses.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={withdrawalsEnabled}\n className={`cedros-toggle ${withdrawalsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWithdrawalsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">\n {withdrawalsEnabled ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n </div>\n </div>\n )}\n\n {/* Mismatch warnings */}\n {recoveryMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require No Recovery mode. Users will see an error when\n attempting private deposits until recovery mode is changed below.\n </div>\n )}\n {walletMismatch && (\n <div className=\"cedros-settings-warning-banner\">\n Private deposits are enabled but require the embedded wallet. Enable it above.\n </div>\n )}\n\n {/* Settings content */}\n <div className=\"cedros-admin-tab-content\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No additional settings available.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["SETTINGS_KEYS","EmbeddedWalletSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","useEffect","currentSettings","s","a","b","walletEnabled","handleWalletToggle","withdrawalsEnabled","handleWithdrawalsToggle","privateDepositsEnabled","recoveryMode","recoveryMismatch","walletMismatch","externalWarnings","useMemo","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";const e=require("react/jsx-runtime"),r=require("react"),R=require("./LoadingSpinner-d6sSxgQN.cjs"),$=require("./ErrorMessage-CHbYbVi2.cjs"),D=require("./sanitization-Bo_tn-L2.cjs"),q=require("./validation-BuGQrA-K.cjs"),A=require("./useCedrosLogin-DtJorrE7.cjs"),F=require("./useOrgs-CNqfn-fk.cjs"),P=require("./useSystemSettings-B2jY51ob.cjs"),U=["owner","admin","member"];function z({members:s,currentUserId:t,isLoading:n=!1,error:i,canManage:a=!1,canChangeRoles:o=!1,onUpdateRole:h,onRemove:m,className:f=""}){const[l,j]=r.useState("name"),[d,y]=r.useState("asc"),p=u=>{l===u?y(d==="asc"?"desc":"asc"):(j(u),y("asc"))},c=r.useMemo(()=>{const u={owner:0,admin:1,member:2};return[...s].sort((g,b)=>{let S,w;switch(l){case"name":S=(g.user.name||g.user.email||"").toLowerCase(),w=(b.user.name||b.user.email||"").toLowerCase();break;case"role":S=u[g.role]??99,w=u[b.role]??99;break;case"joinedAt":S=new Date(g.joinedAt).getTime(),w=new Date(b.joinedAt).getTime();break;default:return 0}return S<w?d==="asc"?-1:1:S>w?d==="asc"?1:-1:0})},[s,l,d]);return n&&s.length===0?e.jsxs("div",{className:`cedros-member-list cedros-member-list-loading ${f}`,children:[e.jsx(R.LoadingSpinner,{}),e.jsx("span",{children:"Loading members..."})]}):i?e.jsx("div",{className:`cedros-member-list ${f}`,children:e.jsx($.ErrorMessage,{error:i})}):s.length===0?e.jsx("div",{className:`cedros-member-list cedros-member-list-empty ${f}`,children:e.jsx("p",{children:"No members found."})}):e.jsx("div",{className:`cedros-member-list ${f}`,children:e.jsxs("table",{className:"cedros-member-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="name"?"cedros-admin-sort-active":""}`,onClick:()=>p("name"),children:["Member"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="name"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="role"?"cedros-admin-sort-active":""}`,onClick:()=>p("role"),children:["Role"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="role"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="joinedAt"?"cedros-admin-sort-active":""}`,onClick:()=>p("joinedAt"),children:["Joined"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="joinedAt"?d==="asc"?"↑":"↓":"↕"})]})}),(a||o)&&e.jsx("th",{children:"Actions"})]})}),e.jsx("tbody",{children:c.map(u=>e.jsx(B,{member:u,isCurrentUser:u.userId===t,canManage:a,canChangeRoles:o,onUpdateRole:h,onRemove:m},u.id))})]})})}function B({member:s,isCurrentUser:t,canManage:n,canChangeRoles:i,onUpdateRole:a,onRemove:o}){const[h,m]=r.useState(!1),[f,l]=r.useState(s.role),j=r.useCallback(async c=>{if(!(!a||c===s.role)){m(!0);try{await a(s.userId,c),l(c)}catch{l(s.role)}finally{m(!1)}}},[s.userId,s.role,a]),d=r.useCallback(async()=>{if(!(!o||!window.confirm(`Are you sure you want to remove ${s.user.name||s.user.email} from this organization?`))){m(!0);try{await o(s.userId)}finally{m(!1)}}},[s.userId,s.user.name,s.user.email,o]),y=s.role==="owner",p=!t&&!y;return e.jsxs("tr",{className:`cedros-member-row ${t?"cedros-member-row-current":""}`,children:[e.jsxs("td",{className:"cedros-member-info",children:[e.jsx(W,{user:s.user}),e.jsxs("div",{className:"cedros-member-details",children:[e.jsxs("span",{className:"cedros-member-name",children:[s.user.name||"Unknown",t&&e.jsx("span",{className:"cedros-member-you",children:"(you)"})]}),e.jsx("span",{className:"cedros-member-email",children:s.user.email})]})]}),e.jsx("td",{className:"cedros-member-role",children:i&&p&&a?e.jsx("select",{value:f,onChange:c=>j(c.target.value),disabled:h,className:"cedros-role-select",children:U.map(c=>e.jsx("option",{value:c,children:c.charAt(0).toUpperCase()+c.slice(1)},c))}):e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)})}),e.jsx("td",{className:"cedros-member-joined",children:H(s.joinedAt)}),(n||i)&&e.jsx("td",{className:"cedros-member-actions",children:n&&p&&o&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:d,disabled:h,"aria-label":`Remove ${s.user.name||s.user.email}`,children:h?e.jsx(R.LoadingSpinner,{size:"sm"}):"Remove"})})]})}function W({user:s}){const t=D.sanitizeImageUrl(s.picture);if(t)return e.jsx("img",{src:t,alt:s.name||s.email||"Member",className:"cedros-member-avatar",referrerPolicy:"no-referrer"});const n=(s.name?.[0]||s.email?.[0]||"?").toUpperCase();return e.jsx("div",{className:"cedros-member-avatar-placeholder",children:n})}function H(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}const V=["admin","member"];function K({onSubmit:s,isLoading:t=!1,error:n,availableRoles:i=V,defaultRole:a="member",className:o=""}){const[h,m]=r.useState(""),[f,l]=r.useState(a),[j,d]=r.useState(null),[y,p]=r.useState(!1),c=r.useRef(null),u=r.useRef(!0);r.useEffect(()=>(u.current=!0,()=>{u.current=!1,c.current!==null&&(window.clearTimeout(c.current),c.current=null)}),[]);const g=r.useCallback(async b=>{b.preventDefault(),d(null),p(!1);const S=h.trim();if(!S){d("Email is required");return}if(!q.validateEmail(S)){d("Please enter a valid email address");return}try{await s(S,f),m(""),l(a),p(!0),c.current!==null&&window.clearTimeout(c.current),c.current=window.setTimeout(()=>{u.current&&p(!1),c.current=null},3e3)}catch{}},[h,f,a,s]);return e.jsxs("form",{className:`cedros-invite-form ${o}`,onSubmit:g,children:[(n||j)&&e.jsx($.ErrorMessage,{error:j??n??null}),y&&e.jsxs("div",{className:"cedros-invite-success",role:"status",children:[e.jsx(G,{}),e.jsx("span",{children:"Invitation sent successfully!"})]}),e.jsxs("div",{className:"cedros-invite-form-row",children:[e.jsxs("div",{className:"cedros-form-group cedros-invite-email-group",children:[e.jsx("label",{htmlFor:"invite-email",className:"cedros-form-label",children:"Email Address"}),e.jsx("input",{id:"invite-email",type:"email",className:"cedros-form-input",value:h,onChange:b=>m(b.target.value),placeholder:"colleague@example.com",disabled:t,autoComplete:"email"})]}),e.jsxs("div",{className:"cedros-form-group cedros-invite-role-group",children:[e.jsx("label",{htmlFor:"invite-role",className:"cedros-form-label",children:"Role"}),e.jsx("select",{id:"invite-role",className:"cedros-form-select",value:f,onChange:b=>l(b.target.value),disabled:t,children:i.map(b=>e.jsx("option",{value:b,children:b.charAt(0).toUpperCase()+b.slice(1)},b))})]}),e.jsx("button",{type:"submit",className:"cedros-button cedros-button-primary cedros-invite-submit",disabled:t||!h.trim(),children:t?e.jsx(R.LoadingSpinner,{size:"sm"}):"Send Invite"})]}),e.jsx("p",{className:"cedros-form-hint",children:"The invited user will receive an email with a link to join your organization."})]})}function G(){return e.jsx("svg",{className:"cedros-invite-check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M3 8L6 11L13 5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function J({invites:s,isLoading:t=!1,error:n,canManage:i=!1,onCancel:a,onResend:o,className:h=""}){return t&&s.length===0?e.jsxs("div",{className:`cedros-invite-list cedros-invite-list-loading ${h}`,children:[e.jsx(R.LoadingSpinner,{}),e.jsx("span",{children:"Loading invites..."})]}):n?e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx($.ErrorMessage,{error:n})}):s.length===0?e.jsx("div",{className:`cedros-invite-list cedros-invite-list-empty ${h}`,children:e.jsx("p",{children:"No pending invites."})}):e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx("ul",{className:"cedros-invite-items",children:s.map(m=>e.jsx(Y,{invite:m,canManage:i,onCancel:a,onResend:o},m.id))})})}function Y({invite:s,canManage:t,onCancel:n,onResend:i}){const[a,o]=r.useState(!1),[h,m]=r.useState(!1),f=r.useRef(null),l=new Date(s.expiresAt)<new Date,j=r.useCallback(async()=>{if(!(!n||!window.confirm(`Are you sure you want to cancel the invite for ${s.email}?`))){o(!0);try{await n(s.id)}finally{o(!1)}}},[s.id,s.email,n]),d=r.useCallback(async()=>{if(i){o(!0),m(!1);try{await i(s.id),m(!0),f.current!==null&&window.clearTimeout(f.current),f.current=window.setTimeout(()=>{m(!1),f.current=null},3e3)}finally{o(!1)}}},[s.id,i]);return r.useEffect(()=>()=>{f.current!==null&&(window.clearTimeout(f.current),f.current=null)},[]),e.jsxs("li",{className:`cedros-invite-item ${l?"cedros-invite-item-expired":""}`,children:[e.jsxs("div",{className:"cedros-invite-item-info",children:[e.jsxs("div",{className:"cedros-invite-item-main",children:[e.jsx("span",{className:"cedros-invite-item-email",children:s.email}),e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)}),l&&e.jsx("span",{className:"cedros-invite-expired-badge",children:"Expired"})]}),e.jsxs("div",{className:"cedros-invite-item-meta",children:[e.jsxs("span",{className:"cedros-invite-item-date",children:["Invited ",M(s.createdAt)]}),!l&&e.jsxs("span",{className:"cedros-invite-item-expires",children:["Expires ",Q(s.expiresAt)]})]})]}),t&&e.jsxs("div",{className:"cedros-invite-item-actions",children:[h&&e.jsx("span",{className:"cedros-invite-resend-success",children:"Sent!"}),i&&!l&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:d,disabled:a,"aria-label":`Resend invite to ${s.email}`,children:a?e.jsx(R.LoadingSpinner,{size:"sm"}):"Resend"}),n&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:j,disabled:a,"aria-label":`Cancel invite for ${s.email}`,children:"Cancel"})]})]})}function M(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Q(s){const t=new Date(s),n=new Date,i=t.getTime()-n.getTime(),a=Math.ceil(i/(1e3*60*60*24));return a<0?"expired":a===0?"today":a===1?"tomorrow":a<7?`in ${a} days`:M(s)}class X{client;constructor(t,n,i,a){this.client=new A.ApiClient({baseUrl:t,timeoutMs:n,retryAttempts:i,getAccessToken:a})}async listMembers(t,n=50,i=0){try{const a=await this.client.get(`/orgs/${t}/members?limit=${n}&offset=${i}`);return{members:a.members.map(o=>({id:o.id,userId:o.userId,orgId:t,role:o.role,joinedAt:o.joinedAt,user:{id:o.userId,email:o.email,name:o.name}})),total:a.total}}catch(a){throw A.handleApiError(a,"Failed to list members")}}async updateMemberRole(t,n,i){try{return await this.client.patch(`/orgs/${t}/members/${n}`,i)}catch(a){throw A.handleApiError(a,"Failed to update member role")}}async removeMember(t,n){try{await this.client.delete(`/orgs/${t}/members/${n}`)}catch(i){throw A.handleApiError(i,"Failed to remove member")}}}function Z(s){const{config:t,authState:n,_internal:i}=A.useCedrosLogin(),[a,o]=r.useState([]),[h,m]=r.useState(0),[f,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new X(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async w=>{if(!s||n!=="authenticated"){o([]),m(0);return}l(!0),d(null);const x=++p.current;try{const{limit:v=50,offset:N=0}=w??{},C=await u.current.listMembers(s,v,N);if(x!==p.current)return;o(C.members),m(C.total)}catch(v){if(x!==p.current)return;d(v)}finally{x===p.current&&l(!1)}},[s,n]);r.useEffect(()=>{if(n!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,n,g]);const b=r.useCallback(async(w,x)=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.updateMemberRole(s,w,{role:x}),await g()}catch(v){throw d(v),v}finally{l(!1)}},[s,g]),S=r.useCallback(async w=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.removeMember(s,w),await g()}catch(x){throw d(x),x}finally{l(!1)}},[s,g]);return{members:a,total:h,isLoading:f,error:j,fetchMembers:g,updateMemberRole:b,removeMember:S}}class ee{client;constructor(t,n,i,a){this.client=new A.ApiClient({baseUrl:t,timeoutMs:n,retryAttempts:i,getAccessToken:a})}async listInvites(t,n=50,i=0){try{const a=await this.client.get(`/orgs/${t}/invites?limit=${n}&offset=${i}`);return{invites:a.invites.map(o=>({id:o.id,orgId:o.orgId,email:o.email,role:o.role,invitedBy:o.invitedBy,createdAt:o.createdAt,expiresAt:o.expiresAt})),total:a.total}}catch(a){throw A.handleApiError(a,"Failed to list invites")}}async createInvite(t,n){try{return await this.client.post(`/orgs/${t}/invites`,n)}catch(i){throw A.handleApiError(i,"Failed to create invite")}}async cancelInvite(t,n){try{await this.client.delete(`/orgs/${t}/invites/${n}`)}catch(i){throw A.handleApiError(i,"Failed to cancel invite")}}async resendInvite(t,n){try{await this.client.post(`/orgs/${t}/invites/${n}/resend`,{})}catch(i){throw A.handleApiError(i,"Failed to resend invite")}}async acceptInvite(t){try{return await this.client.post("/invites/accept",t)}catch(n){throw A.handleApiError(n,"Failed to accept invite")}}}function se(s){const{config:t,authState:n,_internal:i}=A.useCedrosLogin(),[a,o]=r.useState([]),[h,m]=r.useState(0),[f,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new ee(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async v=>{if(!s||n!=="authenticated"){o([]),m(0);return}l(!0),d(null);const N=++p.current;try{const{limit:C=50,offset:O=0}=v??{},L=await u.current.listInvites(s,C,O);if(N!==p.current)return;o(L.invites),m(L.total)}catch(C){if(N!==p.current)return;d(C)}finally{N===p.current&&l(!1)}},[s,n]);r.useEffect(()=>{if(n!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,n,g]);const b=r.useCallback(async(v,N="member")=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.createInvite(s,{email:v,role:N}),await g()}catch(C){throw d(C),C}finally{l(!1)}},[s,g]),S=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.cancelInvite(s,v),await g()}catch(N){throw d(N),N}finally{l(!1)}},[s,g]),w=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.resendInvite(s,v)}catch(N){throw d(N),N}finally{l(!1)}},[s]),x=r.useCallback(async v=>{l(!0),d(null);try{return await u.current.acceptInvite({token:v})}catch(N){throw d(N),N}finally{l(!1)}},[]);return{invites:a,total:h,isLoading:f,error:j,fetchInvites:g,createInvite:b,cancelInvite:S,resendInvite:w,acceptInvite:x}}const te={organizations:!1,sso:!1,mfa:!1,mfaRequired:!1,walletSigning:!1,credits:!1,userWithdrawals:!1,cedrosPay:!1};function _(){const{settings:s,isLoading:t,error:n,fetchSettings:i,getValue:a}=P.useSystemSettings(),[o,h]=r.useState(!1);r.useEffect(()=>{o||(i(),h(!0))},[i,o]);const m=r.useCallback(d=>d===void 0?!1:d==="true"||d==="1",[]),f=r.useMemo(()=>Object.keys(s).length===0?te:{organizations:m(a("feature_organizations")),sso:m(a("feature_sso")),mfa:m(a("feature_mfa")),mfaRequired:m(a("security_require_mfa")),walletSigning:m(a("feature_wallet_signing")),credits:m(a("feature_credits")),userWithdrawals:m(a("feature_user_withdrawals")),cedrosPay:m(a("feature_cedros_pay"))},[s,a,m]),l=r.useCallback(async()=>{await i()},[i]),j=r.useCallback(d=>f[d],[f]);return{features:f,isLoading:t,error:n,refetch:l,isEnabled:j}}const re=["users","team","referrals","deposits","withdrawals","settings-wallet","settings-auth","settings-messaging","settings-credits","settings-server","settings-images"],ae=["pay-products","pay-subscriptions","pay-transactions","pay-coupons","pay-refunds","pay-storefront","pay-ai","pay-payment","pay-messaging","pay-settings"],E={users:"Users",team:"Team",referrals:"Referrals",deposits:"Deposits",withdrawals:"Withdrawals","settings-wallet":"Wallet Settings","settings-auth":"Auth Settings","settings-messaging":"Messages Settings","settings-credits":"Credits Settings","settings-server":"Server Settings","settings-images":"Image Storage","pay-products":"Products","pay-subscriptions":"Subscriptions","pay-transactions":"Transactions","pay-coupons":"Coupons","pay-refunds":"Refunds","pay-storefront":"Storefront","pay-ai":"Store AI","pay-payment":"Payment Options","pay-messaging":"Store Messages","pay-settings":"Store Server"},k={admin:{users:!0,team:!0,referrals:!0,deposits:!0,withdrawals:!0,"settings-wallet":!0,"settings-auth":!0,"settings-messaging":!0,"settings-credits":!0,"settings-server":!0,"settings-images":!0,"pay-products":!0,"pay-subscriptions":!0,"pay-transactions":!0,"pay-coupons":!0,"pay-refunds":!0,"pay-storefront":!0,"pay-ai":!0,"pay-payment":!0,"pay-messaging":!0,"pay-settings":!0},member:{users:!1,team:!0,referrals:!1,deposits:!1,withdrawals:!1,"settings-wallet":!1,"settings-auth":!1,"settings-messaging":!1,"settings-credits":!1,"settings-server":!1,"settings-images":!1,"pay-products":!1,"pay-subscriptions":!1,"pay-transactions":!1,"pay-coupons":!1,"pay-refunds":!1,"pay-storefront":!1,"pay-ai":!1,"pay-payment":!1,"pay-messaging":!1,"pay-settings":!1}};function I(){const{config:s,authState:t,_internal:n}=A.useCedrosLogin(),{activeOrg:i,role:a}=F.useOrgs(),[o,h]=r.useState(k),[m,f]=r.useState(!1),[l,j]=r.useState(!1),[d,y]=r.useState(null),p=r.useRef(0),c=r.useMemo(()=>new A.ApiClient({baseUrl:s.serverUrl,timeoutMs:s.requestTimeout,retryAttempts:s.retryAttempts,getAccessToken:n?.getAccessToken}),[s.serverUrl,s.requestTimeout,s.retryAttempts,n]),u=r.useRef(c);u.current=c;const g=r.useCallback(async()=>{if(t!=="authenticated"||!i){h(k);return}f(!0),y(null);const w=++p.current;try{const x=await u.current.get("/admin/dashboard-permissions");if(w!==p.current)return;h(x.permissions)}catch(x){if(w!==p.current)return;if(x instanceof Error&&x.message.includes("404"))h(k);else{const v=x instanceof Error?x.message:"Failed to fetch permissions";y({code:"NETWORK_ERROR",message:v}),h(k)}}finally{w===p.current&&f(!1)}},[t,i]),b=r.useCallback(async w=>{if(t!=="authenticated"||!i)throw new Error("Not authenticated");if(a!=="owner")throw new Error("Only owners can modify dashboard permissions");j(!0),y(null);try{await u.current.request({method:"PUT",path:"/admin/dashboard-permissions",body:w}),h(w)}catch(x){const v=x instanceof Error?x.message:"Failed to update permissions";throw y({code:"NETWORK_ERROR",message:v}),new Error(v)}finally{j(!1)}},[t,i,a]),S=r.useCallback(w=>!i||!a||a==="owner"?!0:o[a]?.[w]??!1,[i,a,o]);return r.useEffect(()=>{i?.id&&g()},[i?.id,g]),{permissions:o,canAccess:S,updatePermissions:b,isLoading:m,isUpdating:l,error:d,fetchPermissions:g}}function T({checked:s,onChange:t,disabled:n,label:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:n,className:`cedros-toggle cedros-toggle-sm ${s?"cedros-toggle-on":"cedros-toggle-off"} ${n?"cedros-toggle-disabled":""}`,onClick:()=>!n&&t(!s),children:e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})})})}function ne({userRole:s}){const{permissions:t,updatePermissions:n,isLoading:i,isUpdating:a,error:o}=I(),{features:h,isLoading:m}=_(),f=r.useRef(null),l=r.useRef(null),j=s==="owner",d=h.cedrosPay,y=r.useCallback(c=>{l.current=c,f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{l.current&&(n(l.current).catch(()=>{}),l.current=null)},500)},[n]);r.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]);const p=r.useCallback((c,u,g)=>{const b={...t,[c]:{...t[c],[u]:g}};y(b)},[t,y]);return i||m?e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__loading",children:"Loading permissions..."})}):j?e.jsxs("div",{className:"cedros-dashboard__section cedros-permissions-section",children:[e.jsxs("div",{className:"cedros-permissions-header",children:[e.jsx("p",{className:"cedros-permissions-description",children:"Configure which dashboard sections each role can access. Owners always have full access."}),o&&e.jsx("div",{className:"cedros-permissions-error",children:o.message}),a&&e.jsx("span",{className:"cedros-permissions-saving",children:"Saving..."})]}),e.jsx("div",{className:"cedros-permissions-matrix",children:e.jsx("table",{className:"cedros-permissions-table",children:e.jsxs("tbody",{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Login"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),re.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:a,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:a,label:`Member access to ${E[c]}`})})]},c)),d&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Pay"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),ae.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:a,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:a,label:`Member access to ${E[c]}`})})]},c))]})]})})})]}):e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__empty",children:"Only organization owners can configure dashboard permissions."})})}exports.InviteForm=K;exports.InviteList=J;exports.MemberList=z;exports.PermissionsSection=ne;exports.useDashboardPermissions=I;exports.useInvites=se;exports.useMembers=Z;exports.useServerFeatures=_;
1
+ "use strict";const e=require("react/jsx-runtime"),r=require("react"),R=require("./LoadingSpinner-d6sSxgQN.cjs"),$=require("./ErrorMessage-CHbYbVi2.cjs"),q=require("./sanitization-Bo_tn-L2.cjs"),D=require("./validation-BuGQrA-K.cjs"),A=require("./useCedrosLogin-DtJorrE7.cjs"),F=require("./useOrgs-CNqfn-fk.cjs"),P=require("./useSystemSettings-B2jY51ob.cjs"),U=["owner","admin","member"];function z({members:s,currentUserId:t,isLoading:n=!1,error:i,canManage:a=!1,canChangeRoles:o=!1,onUpdateRole:h,onRemove:m,className:f=""}){const[l,j]=r.useState("name"),[d,y]=r.useState("asc"),p=u=>{l===u?y(d==="asc"?"desc":"asc"):(j(u),y("asc"))},c=r.useMemo(()=>{const u={owner:0,admin:1,member:2};return[...s].sort((g,b)=>{let S,w;switch(l){case"name":S=(g.user.name||g.user.email||"").toLowerCase(),w=(b.user.name||b.user.email||"").toLowerCase();break;case"role":S=u[g.role]??99,w=u[b.role]??99;break;case"joinedAt":S=new Date(g.joinedAt).getTime(),w=new Date(b.joinedAt).getTime();break;default:return 0}return S<w?d==="asc"?-1:1:S>w?d==="asc"?1:-1:0})},[s,l,d]);return n&&s.length===0?e.jsxs("div",{className:`cedros-member-list cedros-member-list-loading ${f}`,children:[e.jsx(R.LoadingSpinner,{}),e.jsx("span",{children:"Loading members..."})]}):i?e.jsx("div",{className:`cedros-member-list ${f}`,children:e.jsx($.ErrorMessage,{error:i})}):s.length===0?e.jsx("div",{className:`cedros-member-list cedros-member-list-empty ${f}`,children:e.jsx("p",{children:"No members found."})}):e.jsx("div",{className:`cedros-member-list ${f}`,children:e.jsxs("table",{className:"cedros-member-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="name"?"cedros-admin-sort-active":""}`,onClick:()=>p("name"),children:["Member"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="name"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="role"?"cedros-admin-sort-active":""}`,onClick:()=>p("role"),children:["Role"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="role"?d==="asc"?"↑":"↓":"↕"})]})}),e.jsx("th",{children:e.jsxs("button",{type:"button",className:`cedros-admin-sort-button ${l==="joinedAt"?"cedros-admin-sort-active":""}`,onClick:()=>p("joinedAt"),children:["Joined"," ",e.jsx("span",{className:"cedros-admin-sort-icon",children:l==="joinedAt"?d==="asc"?"↑":"↓":"↕"})]})}),(a||o)&&e.jsx("th",{children:"Actions"})]})}),e.jsx("tbody",{children:c.map(u=>e.jsx(B,{member:u,isCurrentUser:u.userId===t,canManage:a,canChangeRoles:o,onUpdateRole:h,onRemove:m},u.id))})]})})}function B({member:s,isCurrentUser:t,canManage:n,canChangeRoles:i,onUpdateRole:a,onRemove:o}){const[h,m]=r.useState(!1),[f,l]=r.useState(s.role),j=r.useCallback(async c=>{if(!(!a||c===s.role)){m(!0);try{await a(s.userId,c),l(c)}catch{l(s.role)}finally{m(!1)}}},[s.userId,s.role,a]),d=r.useCallback(async()=>{if(!(!o||!window.confirm(`Are you sure you want to remove ${s.user.name||s.user.email} from this organization?`))){m(!0);try{await o(s.userId)}finally{m(!1)}}},[s.userId,s.user.name,s.user.email,o]),y=s.role==="owner",p=!t&&!y;return e.jsxs("tr",{className:`cedros-member-row ${t?"cedros-member-row-current":""}`,children:[e.jsxs("td",{className:"cedros-member-info",children:[e.jsx(W,{user:s.user}),e.jsxs("div",{className:"cedros-member-details",children:[e.jsxs("span",{className:"cedros-member-name",children:[s.user.name||"Unknown",t&&e.jsx("span",{className:"cedros-member-you",children:"(you)"})]}),e.jsx("span",{className:"cedros-member-email",children:s.user.email})]})]}),e.jsx("td",{className:"cedros-member-role",children:i&&p&&a?e.jsx("select",{value:f,onChange:c=>j(c.target.value),disabled:h,className:"cedros-role-select",children:U.map(c=>e.jsx("option",{value:c,children:c.charAt(0).toUpperCase()+c.slice(1)},c))}):e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)})}),e.jsx("td",{className:"cedros-member-joined",children:H(s.joinedAt)}),(n||i)&&e.jsx("td",{className:"cedros-member-actions",children:n&&p&&o&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:d,disabled:h,"aria-label":`Remove ${s.user.name||s.user.email}`,children:h?e.jsx(R.LoadingSpinner,{size:"sm"}):"Remove"})})]})}function W({user:s}){const t=q.sanitizeImageUrl(s.picture);if(t)return e.jsx("img",{src:t,alt:s.name||s.email||"Member",className:"cedros-member-avatar",referrerPolicy:"no-referrer"});const n=(s.name?.[0]||s.email?.[0]||"?").toUpperCase();return e.jsx("div",{className:"cedros-member-avatar-placeholder",children:n})}function H(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}const V=["admin","member"];function G({onSubmit:s,isLoading:t=!1,error:n,availableRoles:i=V,defaultRole:a="member",className:o=""}){const[h,m]=r.useState(""),[f,l]=r.useState(a),[j,d]=r.useState(null),[y,p]=r.useState(!1),c=r.useRef(null),u=r.useRef(!0);r.useEffect(()=>(u.current=!0,()=>{u.current=!1,c.current!==null&&(window.clearTimeout(c.current),c.current=null)}),[]);const g=r.useCallback(async b=>{b.preventDefault(),d(null),p(!1);const S=h.trim();if(!S){d("Email is required");return}if(!D.validateEmail(S)){d("Please enter a valid email address");return}try{await s(S,f),m(""),l(a),p(!0),c.current!==null&&window.clearTimeout(c.current),c.current=window.setTimeout(()=>{u.current&&p(!1),c.current=null},3e3)}catch{}},[h,f,a,s]);return e.jsxs("form",{className:`cedros-invite-form ${o}`,onSubmit:g,children:[(n||j)&&e.jsx($.ErrorMessage,{error:j??n??null}),y&&e.jsxs("div",{className:"cedros-invite-success",role:"status",children:[e.jsx(K,{}),e.jsx("span",{children:"Invitation sent successfully!"})]}),e.jsxs("div",{className:"cedros-invite-form-row",children:[e.jsxs("div",{className:"cedros-form-group cedros-invite-email-group",children:[e.jsx("label",{htmlFor:"invite-email",className:"cedros-form-label",children:"Email Address"}),e.jsx("input",{id:"invite-email",type:"email",className:"cedros-form-input",value:h,onChange:b=>m(b.target.value),placeholder:"colleague@example.com",disabled:t,autoComplete:"email"})]}),e.jsxs("div",{className:"cedros-form-group cedros-invite-role-group",children:[e.jsx("label",{htmlFor:"invite-role",className:"cedros-form-label",children:"Role"}),e.jsx("select",{id:"invite-role",className:"cedros-form-select",value:f,onChange:b=>l(b.target.value),disabled:t,children:i.map(b=>e.jsx("option",{value:b,children:b.charAt(0).toUpperCase()+b.slice(1)},b))})]}),e.jsx("button",{type:"submit",className:"cedros-button cedros-button-primary cedros-invite-submit",disabled:t||!h.trim(),children:t?e.jsx(R.LoadingSpinner,{size:"sm"}):"Send Invite"})]}),e.jsx("p",{className:"cedros-form-hint",children:"The invited user will receive an email with a link to join your organization."})]})}function K(){return e.jsx("svg",{className:"cedros-invite-check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M3 8L6 11L13 5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function J({invites:s,isLoading:t=!1,error:n,canManage:i=!1,onCancel:a,onResend:o,className:h=""}){return t&&s.length===0?e.jsxs("div",{className:`cedros-invite-list cedros-invite-list-loading ${h}`,children:[e.jsx(R.LoadingSpinner,{}),e.jsx("span",{children:"Loading invites..."})]}):n?e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx($.ErrorMessage,{error:n})}):s.length===0?e.jsx("div",{className:`cedros-invite-list cedros-invite-list-empty ${h}`,children:e.jsx("p",{children:"No pending invites."})}):e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx("ul",{className:"cedros-invite-items",children:s.map(m=>e.jsx(Q,{invite:m,canManage:i,onCancel:a,onResend:o},m.id))})})}function Q({invite:s,canManage:t,onCancel:n,onResend:i}){const[a,o]=r.useState(!1),[h,m]=r.useState(!1),f=r.useRef(null),l=new Date(s.expiresAt)<new Date,j=r.useCallback(async()=>{if(!(!n||!window.confirm(`Are you sure you want to cancel the invite for ${s.email}?`))){o(!0);try{await n(s.id)}finally{o(!1)}}},[s.id,s.email,n]),d=r.useCallback(async()=>{if(i){o(!0),m(!1);try{await i(s.id),m(!0),f.current!==null&&window.clearTimeout(f.current),f.current=window.setTimeout(()=>{m(!1),f.current=null},3e3)}finally{o(!1)}}},[s.id,i]);return r.useEffect(()=>()=>{f.current!==null&&(window.clearTimeout(f.current),f.current=null)},[]),e.jsxs("li",{className:`cedros-invite-item ${l?"cedros-invite-item-expired":""}`,children:[e.jsxs("div",{className:"cedros-invite-item-info",children:[e.jsxs("div",{className:"cedros-invite-item-main",children:[e.jsx("span",{className:"cedros-invite-item-email",children:s.email}),e.jsx("span",{className:`cedros-role-badge cedros-role-badge-${s.role}`,children:s.role.charAt(0).toUpperCase()+s.role.slice(1)}),l&&e.jsx("span",{className:"cedros-invite-expired-badge",children:"Expired"})]}),e.jsxs("div",{className:"cedros-invite-item-meta",children:[e.jsxs("span",{className:"cedros-invite-item-date",children:["Invited ",M(s.createdAt)]}),!l&&e.jsxs("span",{className:"cedros-invite-item-expires",children:["Expires ",Y(s.expiresAt)]})]})]}),t&&e.jsxs("div",{className:"cedros-invite-item-actions",children:[h&&e.jsx("span",{className:"cedros-invite-resend-success",children:"Sent!"}),i&&!l&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-outline cedros-button-sm",onClick:d,disabled:a,"aria-label":`Resend invite to ${s.email}`,children:a?e.jsx(R.LoadingSpinner,{size:"sm"}):"Resend"}),n&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:j,disabled:a,"aria-label":`Cancel invite for ${s.email}`,children:"Cancel"})]})]})}function M(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Y(s){const t=new Date(s),n=new Date,i=t.getTime()-n.getTime(),a=Math.ceil(i/(1e3*60*60*24));return a<0?"expired":a===0?"today":a===1?"tomorrow":a<7?`in ${a} days`:M(s)}class X{client;constructor(t,n,i,a){this.client=new A.ApiClient({baseUrl:t,timeoutMs:n,retryAttempts:i,getAccessToken:a})}async listMembers(t,n=50,i=0){try{const a=await this.client.get(`/orgs/${t}/members?limit=${n}&offset=${i}`);return{members:a.members.map(o=>({id:o.id,userId:o.userId,orgId:t,role:o.role,joinedAt:o.joinedAt,user:{id:o.userId,email:o.email,name:o.name}})),total:a.total}}catch(a){throw A.handleApiError(a,"Failed to list members")}}async updateMemberRole(t,n,i){try{return await this.client.patch(`/orgs/${t}/members/${n}`,i)}catch(a){throw A.handleApiError(a,"Failed to update member role")}}async removeMember(t,n){try{await this.client.delete(`/orgs/${t}/members/${n}`)}catch(i){throw A.handleApiError(i,"Failed to remove member")}}}function Z(s){const{config:t,authState:n,_internal:i}=A.useCedrosLogin(),[a,o]=r.useState([]),[h,m]=r.useState(0),[f,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new X(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async w=>{if(!s||n!=="authenticated"){o([]),m(0);return}l(!0),d(null);const x=++p.current;try{const{limit:v=50,offset:N=0}=w??{},C=await u.current.listMembers(s,v,N);if(x!==p.current)return;o(C.members),m(C.total)}catch(v){if(x!==p.current)return;d(v)}finally{x===p.current&&l(!1)}},[s,n]);r.useEffect(()=>{if(n!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,n,g]);const b=r.useCallback(async(w,x)=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.updateMemberRole(s,w,{role:x}),await g()}catch(v){throw d(v),v}finally{l(!1)}},[s,g]),S=r.useCallback(async w=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.removeMember(s,w),await g()}catch(x){throw d(x),x}finally{l(!1)}},[s,g]);return{members:a,total:h,isLoading:f,error:j,fetchMembers:g,updateMemberRole:b,removeMember:S}}class ee{client;constructor(t,n,i,a){this.client=new A.ApiClient({baseUrl:t,timeoutMs:n,retryAttempts:i,getAccessToken:a})}async listInvites(t,n=50,i=0){try{const a=await this.client.get(`/orgs/${t}/invites?limit=${n}&offset=${i}`);return{invites:a.invites.map(o=>({id:o.id,orgId:o.orgId,email:o.email,role:o.role,invitedBy:o.invitedBy,createdAt:o.createdAt,expiresAt:o.expiresAt})),total:a.total}}catch(a){throw A.handleApiError(a,"Failed to list invites")}}async createInvite(t,n){try{return await this.client.post(`/orgs/${t}/invites`,n)}catch(i){throw A.handleApiError(i,"Failed to create invite")}}async cancelInvite(t,n){try{await this.client.delete(`/orgs/${t}/invites/${n}`)}catch(i){throw A.handleApiError(i,"Failed to cancel invite")}}async resendInvite(t,n){try{await this.client.post(`/orgs/${t}/invites/${n}/resend`,{})}catch(i){throw A.handleApiError(i,"Failed to resend invite")}}async acceptInvite(t){try{return await this.client.post("/invites/accept",t)}catch(n){throw A.handleApiError(n,"Failed to accept invite")}}}function se(s){const{config:t,authState:n,_internal:i}=A.useCedrosLogin(),[a,o]=r.useState([]),[h,m]=r.useState(0),[f,l]=r.useState(!1),[j,d]=r.useState(null),y=r.useRef(void 0),p=r.useRef(0),c=r.useMemo(()=>new ee(t.serverUrl,t.requestTimeout,t.retryAttempts,i?.getAccessToken),[t.serverUrl,t.requestTimeout,t.retryAttempts,i]),u=r.useRef(c);u.current=c;const g=r.useCallback(async v=>{if(!s||n!=="authenticated"){o([]),m(0);return}l(!0),d(null);const N=++p.current;try{const{limit:C=50,offset:O=0}=v??{},L=await u.current.listInvites(s,C,O);if(N!==p.current)return;o(L.invites),m(L.total)}catch(C){if(N!==p.current)return;d(C)}finally{N===p.current&&l(!1)}},[s,n]);r.useEffect(()=>{if(n!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,n,g]);const b=r.useCallback(async(v,N="member")=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.createInvite(s,{email:v,role:N}),await g()}catch(C){throw d(C),C}finally{l(!1)}},[s,g]),S=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.cancelInvite(s,v),await g()}catch(N){throw d(N),N}finally{l(!1)}},[s,g]),w=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.resendInvite(s,v)}catch(N){throw d(N),N}finally{l(!1)}},[s]),x=r.useCallback(async v=>{l(!0),d(null);try{return await u.current.acceptInvite({token:v})}catch(N){throw d(N),N}finally{l(!1)}},[]);return{invites:a,total:h,isLoading:f,error:j,fetchInvites:g,createInvite:b,cancelInvite:S,resendInvite:w,acceptInvite:x}}const te=["users","team","referrals","deposits","withdrawals","compliance","accreditation-queue","sanctions","settings-wallet","settings-auth","settings-messaging","settings-credits","settings-compliance","settings-referrals","settings-server","settings-images"],re=["pay-products","pay-subscriptions","pay-transactions","pay-coupons","pay-refunds","pay-storefront","pay-ai","pay-payment","pay-messaging","pay-settings"],E={users:"Users",team:"Team",referrals:"Referrals",deposits:"Deposits",withdrawals:"Withdrawals",compliance:"Compliance","accreditation-queue":"Accreditation Queue",sanctions:"Sanctions","settings-wallet":"Wallet Settings","settings-auth":"Auth Settings","settings-messaging":"Messages Settings","settings-credits":"Credits Settings","settings-compliance":"Compliance & Gating","settings-referrals":"Referrals & Rewards","settings-server":"Server Settings","settings-images":"Image Storage","pay-products":"Products","pay-subscriptions":"Subscriptions","pay-transactions":"Transactions","pay-coupons":"Coupons","pay-refunds":"Refunds","pay-storefront":"Storefront","pay-ai":"Store AI","pay-payment":"Payment Options","pay-messaging":"Store Messages","pay-settings":"Store Server"},k={admin:{users:!0,team:!0,referrals:!0,deposits:!0,withdrawals:!0,compliance:!0,"accreditation-queue":!0,sanctions:!0,"settings-wallet":!0,"settings-auth":!0,"settings-messaging":!0,"settings-credits":!0,"settings-compliance":!0,"settings-referrals":!0,"settings-server":!0,"settings-images":!0,"pay-products":!0,"pay-subscriptions":!0,"pay-transactions":!0,"pay-coupons":!0,"pay-refunds":!0,"pay-storefront":!0,"pay-ai":!0,"pay-payment":!0,"pay-messaging":!0,"pay-settings":!0},member:{users:!1,team:!0,referrals:!1,deposits:!1,withdrawals:!1,compliance:!1,"accreditation-queue":!1,sanctions:!1,"settings-wallet":!1,"settings-auth":!1,"settings-messaging":!1,"settings-credits":!1,"settings-compliance":!1,"settings-referrals":!1,"settings-server":!1,"settings-images":!1,"pay-products":!1,"pay-subscriptions":!1,"pay-transactions":!1,"pay-coupons":!1,"pay-refunds":!1,"pay-storefront":!1,"pay-ai":!1,"pay-payment":!1,"pay-messaging":!1,"pay-settings":!1}};function _(){const{config:s,authState:t,_internal:n}=A.useCedrosLogin(),{activeOrg:i,role:a}=F.useOrgs(),[o,h]=r.useState(k),[m,f]=r.useState(!1),[l,j]=r.useState(!1),[d,y]=r.useState(null),p=r.useRef(0),c=r.useMemo(()=>new A.ApiClient({baseUrl:s.serverUrl,timeoutMs:s.requestTimeout,retryAttempts:s.retryAttempts,getAccessToken:n?.getAccessToken}),[s.serverUrl,s.requestTimeout,s.retryAttempts,n]),u=r.useRef(c);u.current=c;const g=r.useCallback(async()=>{if(t!=="authenticated"||!i){h(k);return}f(!0),y(null);const w=++p.current;try{const x=await u.current.get("/admin/dashboard-permissions");if(w!==p.current)return;h(x.permissions)}catch(x){if(w!==p.current)return;if(x instanceof Error&&x.message.includes("404"))h(k);else{const v=x instanceof Error?x.message:"Failed to fetch permissions";y({code:"NETWORK_ERROR",message:v}),h(k)}}finally{w===p.current&&f(!1)}},[t,i]),b=r.useCallback(async w=>{if(t!=="authenticated"||!i)throw new Error("Not authenticated");if(a!=="owner")throw new Error("Only owners can modify dashboard permissions");j(!0),y(null);try{await u.current.request({method:"PUT",path:"/admin/dashboard-permissions",body:w}),h(w)}catch(x){const v=x instanceof Error?x.message:"Failed to update permissions";throw y({code:"NETWORK_ERROR",message:v}),new Error(v)}finally{j(!1)}},[t,i,a]),S=r.useCallback(w=>!i||!a||a==="owner"?!0:o[a]?.[w]??!1,[i,a,o]);return r.useEffect(()=>{i?.id&&g()},[i?.id,g]),{permissions:o,canAccess:S,updatePermissions:b,isLoading:m,isUpdating:l,error:d,fetchPermissions:g}}const ae={organizations:!1,sso:!1,mfa:!1,mfaRequired:!1,walletSigning:!1,credits:!1,userWithdrawals:!1,cedrosPay:!1};function I(){const{settings:s,isLoading:t,error:n,fetchSettings:i,getValue:a}=P.useSystemSettings(),[o,h]=r.useState(!1);r.useEffect(()=>{o||(i(),h(!0))},[i,o]);const m=r.useCallback(d=>d===void 0?!1:d==="true"||d==="1",[]),f=r.useMemo(()=>Object.keys(s).length===0?ae:{organizations:m(a("feature_organizations")),sso:m(a("feature_sso")),mfa:m(a("feature_mfa")),mfaRequired:m(a("security_require_mfa")),walletSigning:m(a("feature_wallet_signing")),credits:m(a("feature_credits")),userWithdrawals:m(a("feature_user_withdrawals")),cedrosPay:m(a("feature_cedros_pay"))},[s,a,m]),l=r.useCallback(async()=>{await i()},[i]),j=r.useCallback(d=>f[d],[f]);return{features:f,isLoading:t,error:n,refetch:l,isEnabled:j}}function T({checked:s,onChange:t,disabled:n,label:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:n,className:`cedros-toggle cedros-toggle-sm ${s?"cedros-toggle-on":"cedros-toggle-off"} ${n?"cedros-toggle-disabled":""}`,onClick:()=>!n&&t(!s),children:e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})})})}function ne({userRole:s}){const{permissions:t,updatePermissions:n,isLoading:i,isUpdating:a,error:o}=_(),{features:h,isLoading:m}=I(),f=r.useRef(null),l=r.useRef(null),j=s==="owner",d=h.cedrosPay,y=r.useCallback(c=>{l.current=c,f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{l.current&&(n(l.current).catch(()=>{}),l.current=null)},500)},[n]);r.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]);const p=r.useCallback((c,u,g)=>{const b={...t,[c]:{...t[c],[u]:g}};y(b)},[t,y]);return i||m?e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__loading",children:"Loading permissions..."})}):j?e.jsxs("div",{className:"cedros-dashboard__section cedros-permissions-section",children:[e.jsxs("div",{className:"cedros-permissions-header",children:[e.jsx("p",{className:"cedros-permissions-description",children:"Configure which dashboard sections each role can access. Owners always have full access."}),o&&e.jsx("div",{className:"cedros-permissions-error",children:o.message}),a&&e.jsx("span",{className:"cedros-permissions-saving",children:"Saving..."})]}),e.jsx("div",{className:"cedros-permissions-matrix",children:e.jsx("table",{className:"cedros-permissions-table",children:e.jsxs("tbody",{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Login"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),te.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:a,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:a,label:`Member access to ${E[c]}`})})]},c)),d&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Pay"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),re.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:a,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:a,label:`Member access to ${E[c]}`})})]},c))]})]})})})]}):e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__empty",children:"Only organization owners can configure dashboard permissions."})})}exports.InviteForm=G;exports.InviteList=J;exports.MemberList=z;exports.PermissionsSection=ne;exports.useDashboardPermissions=_;exports.useInvites=se;exports.useMembers=Z;exports.useServerFeatures=I;