@cedros/login-react 0.0.44 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AuthenticationSettings-bNQiNQ9g.cjs → AuthenticationSettings-BBOjHR6j.cjs} +1 -1
- package/dist/{AuthenticationSettings-bNQiNQ9g.cjs.map → AuthenticationSettings-BBOjHR6j.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-BlYOmaEG.cjs → AuthenticationSettings-BXZRBZqc.cjs} +1 -1
- package/dist/{AuthenticationSettings-BlYOmaEG.cjs.map → AuthenticationSettings-BXZRBZqc.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-BsuwWKbT.js → AuthenticationSettings-Bc_qT4nV.js} +1 -1
- package/dist/{AuthenticationSettings-BsuwWKbT.js.map → AuthenticationSettings-Bc_qT4nV.js.map} +1 -1
- package/dist/{AuthenticationSettings-DrHqtD7p.js → AuthenticationSettings-DXWCVZxS.js} +1 -1
- package/dist/{AuthenticationSettings-DrHqtD7p.js.map → AuthenticationSettings-DXWCVZxS.js.map} +1 -1
- package/dist/{AutosaveStatus-CZSwtgrL.cjs → AutosaveStatus-DfMPudTQ.cjs} +1 -1
- package/dist/AutosaveStatus-DfMPudTQ.cjs.map +1 -0
- package/dist/{AutosaveStatus-D-roPsRx.js → AutosaveStatus-DhGM3UUx.js} +103 -36
- package/dist/AutosaveStatus-DhGM3UUx.js.map +1 -0
- package/dist/{CreditSystemSettings-BTqZFn4K.js → CreditSystemSettings-B59-gOQT.js} +1 -1
- package/dist/{CreditSystemSettings-BTqZFn4K.js.map → CreditSystemSettings-B59-gOQT.js.map} +1 -1
- package/dist/{CreditSystemSettings-3R6crxvW.cjs → CreditSystemSettings-Badz4iAc.cjs} +1 -1
- package/dist/{CreditSystemSettings-3R6crxvW.cjs.map → CreditSystemSettings-Badz4iAc.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-BskW_NKx.cjs → CreditSystemSettings-BxSoDwEi.cjs} +1 -1
- package/dist/{CreditSystemSettings-BskW_NKx.cjs.map → CreditSystemSettings-BxSoDwEi.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-SL45GRH3.js → CreditSystemSettings-DxFpOeBW.js} +1 -1
- package/dist/{CreditSystemSettings-SL45GRH3.js.map → CreditSystemSettings-DxFpOeBW.js.map} +1 -1
- package/dist/{EmailSettings-XETM8FdS.js → EmailSettings-0y8D1QzF.js} +1 -1
- package/dist/{EmailSettings-XETM8FdS.js.map → EmailSettings-0y8D1QzF.js.map} +1 -1
- package/dist/{EmailSettings-BUAQji4I.js → EmailSettings-BA722mhf.js} +1 -1
- package/dist/{EmailSettings-BUAQji4I.js.map → EmailSettings-BA722mhf.js.map} +1 -1
- package/dist/{EmailSettings-CihElRkc.cjs → EmailSettings-BwZvdOYB.cjs} +1 -1
- package/dist/{EmailSettings-CihElRkc.cjs.map → EmailSettings-BwZvdOYB.cjs.map} +1 -1
- package/dist/{EmailSettings-CEC1rhrm.cjs → EmailSettings-DIjo3aJo.cjs} +1 -1
- package/dist/{EmailSettings-CEC1rhrm.cjs.map → EmailSettings-DIjo3aJo.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-CCT9DwmL.js → EmbeddedWalletSettings-BDbPpqWD.js} +1 -1
- package/dist/{EmbeddedWalletSettings-CCT9DwmL.js.map → EmbeddedWalletSettings-BDbPpqWD.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-MtwR81WH.cjs → EmbeddedWalletSettings-Db9a0D5l.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-MtwR81WH.cjs.map → EmbeddedWalletSettings-Db9a0D5l.cjs.map} +1 -1
- package/dist/{EmbeddedWalletSettings-B-083zu6.js → EmbeddedWalletSettings-MH4A6e6S.js} +1 -1
- package/dist/{EmbeddedWalletSettings-B-083zu6.js.map → EmbeddedWalletSettings-MH4A6e6S.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DXIjansC.cjs → EmbeddedWalletSettings-T7LwbGok.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-DXIjansC.cjs.map → EmbeddedWalletSettings-T7LwbGok.cjs.map} +1 -1
- package/dist/{ServerSettings-DBpbRihl.js → ServerSettings-CwCkkU50.js} +1 -1
- package/dist/{ServerSettings-DBpbRihl.js.map → ServerSettings-CwCkkU50.js.map} +1 -1
- package/dist/{ServerSettings-24DA_BOI.js → ServerSettings-DKzWaqjC.js} +1 -1
- package/dist/{ServerSettings-24DA_BOI.js.map → ServerSettings-DKzWaqjC.js.map} +1 -1
- package/dist/{ServerSettings-BTEuzdrf.cjs → ServerSettings-DptlzQAu.cjs} +1 -1
- package/dist/{ServerSettings-BTEuzdrf.cjs.map → ServerSettings-DptlzQAu.cjs.map} +1 -1
- package/dist/{ServerSettings-BNc4LEs4.cjs → ServerSettings-j5Lu5D-R.cjs} +1 -1
- package/dist/{ServerSettings-BNc4LEs4.cjs.map → ServerSettings-j5Lu5D-R.cjs.map} +1 -1
- package/dist/{WebhookSettings-D9IsXZJN.js → WebhookSettings-2hlLLyGd.js} +1 -1
- package/dist/{WebhookSettings-D9IsXZJN.js.map → WebhookSettings-2hlLLyGd.js.map} +1 -1
- package/dist/{WebhookSettings-C6X_JJcD.cjs → WebhookSettings-CoEoVRRO.cjs} +1 -1
- package/dist/{WebhookSettings-C6X_JJcD.cjs.map → WebhookSettings-CoEoVRRO.cjs.map} +1 -1
- package/dist/{WebhookSettings-H1x6IKOj.cjs → WebhookSettings-DOaydSWQ.cjs} +1 -1
- package/dist/{WebhookSettings-H1x6IKOj.cjs.map → WebhookSettings-DOaydSWQ.cjs.map} +1 -1
- package/dist/{WebhookSettings-BhIwucKb.js → WebhookSettings-LS_wUimF.js} +1 -1
- package/dist/{WebhookSettings-BhIwucKb.js.map → WebhookSettings-LS_wUimF.js.map} +1 -1
- package/dist/admin-only.cjs +1 -1
- package/dist/admin-only.js +1 -1
- package/dist/index.cjs +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1448 -1489
- package/dist/index.js.map +1 -1
- package/dist/{plugin-BwwJh2cY.cjs → plugin-Ci67QMGG.cjs} +1 -1
- package/dist/{plugin-BwwJh2cY.cjs.map → plugin-Ci67QMGG.cjs.map} +1 -1
- package/dist/{plugin-CetHtdLq.js → plugin-Cm8Q6O4-.js} +1 -1
- package/dist/{plugin-CetHtdLq.js.map → plugin-Cm8Q6O4-.js.map} +1 -1
- package/package.json +1 -1
- package/dist/AutosaveStatus-CZSwtgrL.cjs.map +0 -1
- package/dist/AutosaveStatus-D-roPsRx.js.map +0 -1
- package/dist/assets/argon2Worker-Bi5TuQvD.js +0 -1
- package/dist/assets/argon2Worker-Bi5TuQvD.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"CreditSystemSettings-DxFpOeBW.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,6 +1,6 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { E as i } from "./EmailSettings-
|
|
3
|
+
import { E as i } from "./EmailSettings-BA722mhf.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-
|
|
1
|
+
{"version":3,"file":"EmailSettings-0y8D1QzF.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;"}
|
|
@@ -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-
|
|
5
|
+
import { u as M, A as b, S as A } from "./AutosaveStatus-DhGM3UUx.js";
|
|
6
6
|
const j = {
|
|
7
7
|
mailgun: "smtp.mailgun.org",
|
|
8
8
|
sendgrid: "smtp.sendgrid.net",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailSettings-
|
|
1
|
+
{"version":3,"file":"EmailSettings-BA722mhf.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";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmailSettings-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmailSettings-DIjo3aJo.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-
|
|
1
|
+
{"version":3,"file":"EmailSettings-BwZvdOYB.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 +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-
|
|
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-DfMPudTQ.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-
|
|
1
|
+
{"version":3,"file":"EmailSettings-DIjo3aJo.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"}
|
|
@@ -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-
|
|
5
|
+
import { u as C, A as M, S as $ } from "./AutosaveStatus-DhGM3UUx.js";
|
|
6
6
|
const d = ["wallet_recovery_mode", "wallet_enroll_solana_users"];
|
|
7
7
|
function q({ className: n }) {
|
|
8
8
|
const {
|
package/dist/{EmbeddedWalletSettings-CCT9DwmL.js.map → EmbeddedWalletSettings-BDbPpqWD.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"EmbeddedWalletSettings-BDbPpqWD.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":";;;;;AAWA,MAAMA,IAAgB,CAAC,wBAAwB,4BAA4B;AAMpE,SAASC,EAAuB,EAAE,WAAAC,KAA0C;AACjF,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA,IACEC,EAAA;AAEJ,EAAAC,EAAU,MAAM;AACd,IAAAJ,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC;AAIlB,QAAMK,KADmBX,EAAS,YAAe,CAAA,GAE9C,OAAO,CAACY,MAAMf,EAAc,SAASe,EAAE,GAAG,CAAC,EAC3C,KAAK,CAACC,GAAGC,MAAMjB,EAAc,QAAQgB,EAAE,GAAG,IAAIhB,EAAc,QAAQiB,EAAE,GAAG,CAAC,GAGvEC,IAAgBP,EAAkB,wBAAwB,MAAM,QAChEQ,IAAqB,MAAM;AAC/B,IAAAT,EAAa,0BAA0BQ,IAAgB,UAAU,MAAM;AAAA,EACzE,GAGME,IAAqBT,EAAkB,0BAA0B,MAAM,QACvEU,IAA0B,MAAM;AACpC,IAAAX,EAAa,4BAA4BU,IAAqB,UAAU,MAAM;AAAA,EAChF,GAGME,IAAyBX,EAAkB,yBAAyB,MAAM,QAC1EY,IAAeZ,EAAkB,sBAAsB,GACvDa,IAAmBF,KAA0BC,MAAiB,QAC9DE,IAAiBH,KAA0B,CAACJ,GAG5CQ,IAAmBC,EAAQ,MAAM;AACrC,QAAKH;AACL,aAAO;AAAA,QACL,sBACE;AAAA,MAAA;AAAA,EAEN,GAAG,CAACA,CAAgB,CAAC;AAErB,SAAInB,KAAa,OAAO,KAAKF,CAAQ,EAAE,WAAW,sBAE7C,OAAA,EAAI,WAAW,yDAAyDD,KAAa,EAAE,IACtF,UAAA;AAAA,IAAA,gBAAA0B,EAACC,GAAA,EAAe;AAAA,IAChB,gBAAAD,EAAC,UAAK,UAAA,sBAAA,CAAmB;AAAA,EAAA,GAC3B,IAIApB,IAEA,gBAAAoB,EAAC,OAAA,EAAI,WAAW,0BAA0B1B,KAAa,EAAE,IACvD,UAAA,gBAAA0B,EAACE,GAAA,EAAa,OAAOtB,EAAM,QAAA,CAAS,GACtC,sBAKD,OAAA,EAAI,WAAW,0BAA0BN,KAAa,EAAE,IACvD,UAAA;AAAA,IAAA,gBAAA6B,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,8BAA6B,UAAA,mBAAe;AAAA,QAC1D,gBAAAA,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA,yDAAA,CAEhD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAG,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAcb;AAAA,YACd,WAAW,iBAAiBA,IAAgB,qBAAqB,mBAAmB;AAAA,YACpF,SAASC;AAAA,YAET,UAAA;AAAA,cAAA,gBAAAS,EAAC,UAAK,WAAU,uBACd,4BAAC,QAAA,EAAK,WAAU,uBAAsB,EAAA,CACxC;AAAA,gCACC,QAAA,EAAK,WAAU,uBAAuB,UAAAV,IAAgB,YAAY,WAAA,CAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEhF,gBAAAU,EAACI,GAAA,EAAe,QAAQ1B,GAAgB,OAAOC,EAAA,CAAe;AAAA,MAAA,EAAA,CAChE;AAAA,IAAA,GACF;AAAA,IAGCW,uBACE,OAAA,EAAI,WAAU,8BACb,UAAA,gBAAAa,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,oCAAmC,UAAA,oBAAgB;AAAA,QACjE,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CAAyC,UAAA,2FAAA,CAGtD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAG;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,gBAAcX;AAAA,UACd,WAAW,iBAAiBA,IAAqB,qBAAqB,mBAAmB;AAAA,UACzF,SAASC;AAAA,UAET,UAAA;AAAA,YAAA,gBAAAO,EAAC,UAAK,WAAU,uBACd,4BAAC,QAAA,EAAK,WAAU,uBAAsB,EAAA,CACxC;AAAA,8BACC,QAAA,EAAK,WAAU,uBACb,UAAAR,IAAqB,YAAY,WAAA,CACpC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF,EAAA,CACF;AAAA,IAIDI,KACC,gBAAAI,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,6JAGhD;AAAA,IAEDH,KACC,gBAAAG,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,kFAEhD;AAAA,IAIF,gBAAAA,EAAC,OAAA,EAAI,WAAU,4BACZ,YAAgB,WAAW,IAC1B,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,UAAA,oCAAA,CAAiC,GACtC,IAEA,gBAAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,UAAUnB;AAAA,QACV,OAAAV;AAAA,QACA,UAAUM;AAAA,QACV,kBAAAgB;AAAA,MAAA;AAAA,IAAA,EACF,CAEJ;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -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-
|
|
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-DfMPudTQ.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;
|
package/dist/{EmbeddedWalletSettings-MtwR81WH.cjs.map → EmbeddedWalletSettings-Db9a0D5l.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddedWalletSettings-
|
|
1
|
+
{"version":3,"file":"EmbeddedWalletSettings-Db9a0D5l.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,6 +1,6 @@
|
|
|
1
1
|
import { jsx as e } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { E as t } from "./EmbeddedWalletSettings-
|
|
3
|
+
import { E as t } from "./EmbeddedWalletSettings-BDbPpqWD.js";
|
|
4
4
|
function s() {
|
|
5
5
|
return /* @__PURE__ */ e("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ e(t, {}) });
|
|
6
6
|
}
|
package/dist/{EmbeddedWalletSettings-B-083zu6.js.map → EmbeddedWalletSettings-MH4A6e6S.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddedWalletSettings-
|
|
1
|
+
{"version":3,"file":"EmbeddedWalletSettings-MH4A6e6S.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 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmbeddedWalletSettings-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./EmbeddedWalletSettings-Db9a0D5l.cjs");function d(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.EmbeddedWalletSettings,{})})}exports.default=d;
|
package/dist/{EmbeddedWalletSettings-DXIjansC.cjs.map → EmbeddedWalletSettings-T7LwbGok.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddedWalletSettings-
|
|
1
|
+
{"version":3,"file":"EmbeddedWalletSettings-T7LwbGok.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,6 +1,6 @@
|
|
|
1
1
|
import { jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { S as e } from "./ServerSettings-
|
|
3
|
+
import { S as e } from "./ServerSettings-DKzWaqjC.js";
|
|
4
4
|
function i() {
|
|
5
5
|
return /* @__PURE__ */ r("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ r(e, {}) });
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerSettings-
|
|
1
|
+
{"version":3,"file":"ServerSettings-CwCkkU50.js","sources":["../src/admin/sections/ServerSettings.tsx"],"sourcesContent":["/**\n * Server Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { ServerSettings as Settings } from '../../components/admin/settings';\n\nexport default function ServerSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["ServerSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAoC;AAC1D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as a, jsx as s } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo as v, useState as N, useEffect as h } from "react";
|
|
3
3
|
import { L as A } from "./LoadingSpinner-6vml-zwr.js";
|
|
4
4
|
import { E as x } from "./ErrorMessage-CcEK0pYO.js";
|
|
5
|
-
import { u as E, A as L, S as T } from "./AutosaveStatus-
|
|
5
|
+
import { u as E, A as L, S as T } from "./AutosaveStatus-DhGM3UUx.js";
|
|
6
6
|
const $ = [
|
|
7
7
|
{
|
|
8
8
|
id: "integrations",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerSettings-
|
|
1
|
+
{"version":3,"file":"ServerSettings-DKzWaqjC.js","sources":["../src/components/admin/settings/ServerSettings.tsx"],"sourcesContent":["/**\n * Server settings page - infrastructure configuration with tabs\n *\n * Tab visibility:\n * - Integrations: only shown when `feature_cedros_pay` is enabled.\n * This tab contains the Cedros Pay API Key, which is only needed when\n * cedros-pay runs as a separate microservice. In co-located deployments\n * (e.g., cedros-login and cedros-pay in the same Rust binary), inter-service\n * auth uses JWT/JWKS and no API key is needed.\n * - Logging, Metrics, Security: always visible.\n */\nimport { useState, 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\ntype ServerTab = 'integrations' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n /** When set, tab is only visible if this setting is 'true' */\n requiredSetting?: string;\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'integrations',\n label: 'Integrations',\n keys: ['server_cedros_pay_api_key'],\n requiredSetting: 'feature_cedros_pay',\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: ['feature_mfa', 'security_cors_origins', 'security_session_timeout'],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n // Filter tabs based on feature flags\n const visibleTabs = useMemo(\n () =>\n TABS.filter((tab) => {\n if (!tab.requiredSetting) return true;\n return getEffectiveValue(tab.requiredSetting) === 'true';\n }),\n [getEffectiveValue]\n );\n\n // Default to first visible tab\n const [activeTab, setActiveTab] = useState<ServerTab | null>(null);\n\n // Set initial tab when tabs become available\n useEffect(() => {\n if (activeTab === null && visibleTabs.length > 0) {\n setActiveTab(visibleTabs[0].id);\n } else if (activeTab && !visibleTabs.some((t) => t.id === activeTab)) {\n // Active tab was hidden (feature toggled off) — fall back\n setActiveTab(visibleTabs[0]?.id ?? null);\n }\n }, [visibleTabs, activeTab]);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = visibleTabs.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: (typeof settings)[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\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\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {visibleTabs.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 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["TABS","ServerSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","visibleTabs","useMemo","tab","activeTab","setActiveTab","useState","useEffect","t","currentTab","currentSettings","categories","allSettings","category","categorySettings","s","a","b","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 r=require("./ServerSettings-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const r=require("./ServerSettings-j5Lu5D-R.cjs");function t(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(r.ServerSettings,{})})}exports.default=t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerSettings-
|
|
1
|
+
{"version":3,"file":"ServerSettings-DptlzQAu.cjs","sources":["../src/admin/sections/ServerSettings.tsx"],"sourcesContent":["/**\n * Server Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { ServerSettings as Settings } from '../../components/admin/settings';\n\nexport default function ServerSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["ServerSettings","jsx","Settings"],"mappings":"uLAOA,SAAwBA,GAAoC,CAC1D,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,iBAAS,EACZ,CAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),a=require("react"),p=require("./LoadingSpinner-d6sSxgQN.cjs"),_=require("./ErrorMessage-CHbYbVi2.cjs"),g=require("./AutosaveStatus-
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),a=require("react"),p=require("./LoadingSpinner-d6sSxgQN.cjs"),_=require("./ErrorMessage-CHbYbVi2.cjs"),g=require("./AutosaveStatus-DfMPudTQ.cjs"),k=[{id:"integrations",label:"Integrations",keys:["server_cedros_pay_api_key"],requiredSetting:"feature_cedros_pay"},{id:"logging",label:"Logging",keys:["server_log_level"]},{id:"metrics",label:"Metrics",keys:["server_metrics_api_key"]},{id:"security",label:"Security",categories:["security","features"],keys:["feature_mfa","security_cors_origins","security_session_timeout"]}];function N({className:c}){const{settings:o,edits:h,isLoading:S,autosaveStatus:x,autosaveError:b,error:u,fetchSettings:m,handleChange:j,getEffectiveValue:y}=g.useSettingsAutosave(),t=a.useMemo(()=>k.filter(s=>s.requiredSetting?y(s.requiredSetting)==="true":!0),[y]),[r,d]=a.useState(null);a.useEffect(()=>{r===null&&t.length>0?d(t[0].id):r&&!t.some(s=>s.id===r)&&d(t[0]?.id??null)},[t,r]),a.useEffect(()=>{m()},[m]);const i=t.find(s=>s.id===r),v=a.useMemo(()=>{if(!i)return[];const s=i.categories??["server"],f=[];for(const n of s){const l=o[n]??[];f.push(...l)}return f.filter(n=>i.keys.includes(n.key)).sort((n,l)=>i.keys.indexOf(n.key)-i.keys.indexOf(l.key))},[o,i]);return S&&Object.keys(o).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${c??""}`,children:[e.jsx(p.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):u?e.jsx("div",{className:`cedros-system-settings ${c??""}`,children:e.jsx(_.ErrorMessage,{error:u.message})}):e.jsxs("div",{className:`cedros-system-settings ${c??""}`,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:"Auth Server"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Server infrastructure settings. Some may be overridden by environment variables."})]}),e.jsx(g.AutosaveStatus,{status:x,error:b})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:t.map(s=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${r===s.id?"cedros-admin-tab-active":""}`,onClick:()=>d(s.id),"aria-selected":r===s.id,role:"tab",children:s.label},s.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:v.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",i?.label??"this section","."]})}):e.jsx(g.SettingsSection,{settings:v,edits:h,onChange:j})})]})}exports.ServerSettings=N;
|