@cedros/login-react 0.0.39 → 0.0.41

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 (94) hide show
  1. package/dist/{AuthenticationSettings-DUXpyiJ5.js → AuthenticationSettings-CSoFp-_2.js} +1 -1
  2. package/dist/{AuthenticationSettings-DUXpyiJ5.js.map → AuthenticationSettings-CSoFp-_2.js.map} +1 -1
  3. package/dist/{AuthenticationSettings-Dk1LX0CK.cjs → AuthenticationSettings-Cu5Z2mTC.cjs} +1 -1
  4. package/dist/{AuthenticationSettings-Dk1LX0CK.cjs.map → AuthenticationSettings-Cu5Z2mTC.cjs.map} +1 -1
  5. package/dist/{AuthenticationSettings-BF_7Ea6Z.js → AuthenticationSettings-D4ExU-2a.js} +1 -1
  6. package/dist/{AuthenticationSettings-BF_7Ea6Z.js.map → AuthenticationSettings-D4ExU-2a.js.map} +1 -1
  7. package/dist/{AuthenticationSettings-BMDrCVSf.cjs → AuthenticationSettings-DABzZHuI.cjs} +1 -1
  8. package/dist/{AuthenticationSettings-BMDrCVSf.cjs.map → AuthenticationSettings-DABzZHuI.cjs.map} +1 -1
  9. package/dist/AutosaveStatus-B1A1zORa.cjs +1 -0
  10. package/dist/AutosaveStatus-B1A1zORa.cjs.map +1 -0
  11. package/dist/{AutosaveStatus-CSZsp6w7.js → AutosaveStatus-DMjvXzP2.js} +526 -341
  12. package/dist/AutosaveStatus-DMjvXzP2.js.map +1 -0
  13. package/dist/CreditSystemSettings-BWuiRTtA.cjs +1 -0
  14. package/dist/CreditSystemSettings-BWuiRTtA.cjs.map +1 -0
  15. package/dist/{CreditSystemSettings-Cj21_Ug8.js → CreditSystemSettings-BjQdysRS.js} +1 -1
  16. package/dist/{CreditSystemSettings-Cj21_Ug8.js.map → CreditSystemSettings-BjQdysRS.js.map} +1 -1
  17. package/dist/{CreditSystemSettings-CLImarX-.cjs → CreditSystemSettings-DfSfQVE8.cjs} +1 -1
  18. package/dist/{CreditSystemSettings-CLImarX-.cjs.map → CreditSystemSettings-DfSfQVE8.cjs.map} +1 -1
  19. package/dist/{CreditSystemSettings-Buu7Y-7I.js → CreditSystemSettings-Du3ac0ID.js} +12 -7
  20. package/dist/CreditSystemSettings-Du3ac0ID.js.map +1 -0
  21. package/dist/EmailRegisterForm-CMXsa-_r.js +750 -0
  22. package/dist/EmailRegisterForm-CMXsa-_r.js.map +1 -0
  23. package/dist/EmailRegisterForm-i7f4St2N.cjs +1 -0
  24. package/dist/EmailRegisterForm-i7f4St2N.cjs.map +1 -0
  25. package/dist/EmailSettings-ASDHfI0K.js +86 -0
  26. package/dist/EmailSettings-ASDHfI0K.js.map +1 -0
  27. package/dist/EmailSettings-BcHo0cqk.cjs +1 -0
  28. package/dist/EmailSettings-BcHo0cqk.cjs.map +1 -0
  29. package/dist/{EmailSettings-CmxxnrA9.js → EmailSettings-CjngJwDS.js} +1 -1
  30. package/dist/{EmailSettings-CmxxnrA9.js.map → EmailSettings-CjngJwDS.js.map} +1 -1
  31. package/dist/{EmailSettings-9sdEAONl.cjs → EmailSettings-CswtKXhb.cjs} +1 -1
  32. package/dist/{EmailSettings-9sdEAONl.cjs.map → EmailSettings-CswtKXhb.cjs.map} +1 -1
  33. package/dist/{EmbeddedWalletSettings-BuLN_Uqc.cjs → EmbeddedWalletSettings-BXlboZ9-.cjs} +1 -1
  34. package/dist/{EmbeddedWalletSettings-BuLN_Uqc.cjs.map → EmbeddedWalletSettings-BXlboZ9-.cjs.map} +1 -1
  35. package/dist/{EmbeddedWalletSettings-DGq-kXbw.cjs → EmbeddedWalletSettings-BkwIbTkL.cjs} +1 -1
  36. package/dist/{EmbeddedWalletSettings-DGq-kXbw.cjs.map → EmbeddedWalletSettings-BkwIbTkL.cjs.map} +1 -1
  37. package/dist/{EmbeddedWalletSettings-CHkkCjyR.js → EmbeddedWalletSettings-CPLbqlxJ.js} +1 -1
  38. package/dist/{EmbeddedWalletSettings-CHkkCjyR.js.map → EmbeddedWalletSettings-CPLbqlxJ.js.map} +1 -1
  39. package/dist/{EmbeddedWalletSettings-M-D5N0eY.js → EmbeddedWalletSettings-CUY_X7Vj.js} +1 -1
  40. package/dist/{EmbeddedWalletSettings-M-D5N0eY.js.map → EmbeddedWalletSettings-CUY_X7Vj.js.map} +1 -1
  41. package/dist/{PermissionsSection-DEMVp7X3.cjs → PermissionsSection-B-6DJnN8.cjs} +1 -1
  42. package/dist/{PermissionsSection-DEMVp7X3.cjs.map → PermissionsSection-B-6DJnN8.cjs.map} +1 -1
  43. package/dist/{PermissionsSection-DNzOL1xW.js → PermissionsSection-BeFhIgQy.js} +22 -18
  44. package/dist/{PermissionsSection-DNzOL1xW.js.map → PermissionsSection-BeFhIgQy.js.map} +1 -1
  45. package/dist/{ServerSettings-DQemMrNv.js → ServerSettings-B9PNMse1.js} +1 -1
  46. package/dist/{ServerSettings-DQemMrNv.js.map → ServerSettings-B9PNMse1.js.map} +1 -1
  47. package/dist/{ServerSettings-qxi8aZO7.js → ServerSettings-BLoWX7KG.js} +1 -1
  48. package/dist/{ServerSettings-qxi8aZO7.js.map → ServerSettings-BLoWX7KG.js.map} +1 -1
  49. package/dist/{ServerSettings-CMmH5pZv.cjs → ServerSettings-BygCxOTY.cjs} +1 -1
  50. package/dist/{ServerSettings-CMmH5pZv.cjs.map → ServerSettings-BygCxOTY.cjs.map} +1 -1
  51. package/dist/{ServerSettings-DfimU7ay.cjs → ServerSettings-CgBdYspU.cjs} +1 -1
  52. package/dist/{ServerSettings-DfimU7ay.cjs.map → ServerSettings-CgBdYspU.cjs.map} +1 -1
  53. package/dist/{TeamSection-DopbZClq.cjs → TeamSection-B1t1tU-_.cjs} +1 -1
  54. package/dist/{TeamSection-DopbZClq.cjs.map → TeamSection-B1t1tU-_.cjs.map} +1 -1
  55. package/dist/{TeamSection-CoMXyFtz.js → TeamSection-DbSYDRdI.js} +1 -1
  56. package/dist/{TeamSection-CoMXyFtz.js.map → TeamSection-DbSYDRdI.js.map} +1 -1
  57. package/dist/{WebhookSettings-B8hAwhZ2.js → WebhookSettings-C-7Yxueu.js} +1 -1
  58. package/dist/{WebhookSettings-B8hAwhZ2.js.map → WebhookSettings-C-7Yxueu.js.map} +1 -1
  59. package/dist/{WebhookSettings-8QAqvkkO.js → WebhookSettings-C923ZSKa.js} +1 -1
  60. package/dist/{WebhookSettings-8QAqvkkO.js.map → WebhookSettings-C923ZSKa.js.map} +1 -1
  61. package/dist/{WebhookSettings-0sgWRI3U.cjs → WebhookSettings-CbU3cfTJ.cjs} +1 -1
  62. package/dist/{WebhookSettings-0sgWRI3U.cjs.map → WebhookSettings-CbU3cfTJ.cjs.map} +1 -1
  63. package/dist/{WebhookSettings-B6Y3Tnjv.cjs → WebhookSettings-D19u9Uok.cjs} +1 -1
  64. package/dist/{WebhookSettings-B6Y3Tnjv.cjs.map → WebhookSettings-D19u9Uok.cjs.map} +1 -1
  65. package/dist/admin-only.cjs +1 -1
  66. package/dist/admin-only.js +1 -1
  67. package/dist/email-only.cjs +1 -1
  68. package/dist/email-only.d.ts +1 -1
  69. package/dist/email-only.js +1 -1
  70. package/dist/index.cjs +13 -13
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.d.ts +5 -8
  73. package/dist/index.js +4639 -4480
  74. package/dist/index.js.map +1 -1
  75. package/dist/login-react.css +1 -1
  76. package/dist/{plugin-C_NDZ2-D.js → plugin-BiftIhZe.js} +1 -1
  77. package/dist/{plugin-C_NDZ2-D.js.map → plugin-BiftIhZe.js.map} +1 -1
  78. package/dist/{plugin-CUxpAjL-.cjs → plugin-BtQdI_Ay.cjs} +1 -1
  79. package/dist/{plugin-CUxpAjL-.cjs.map → plugin-BtQdI_Ay.cjs.map} +1 -1
  80. package/package.json +1 -1
  81. package/dist/AutosaveStatus-BKsCIvPj.cjs +0 -1
  82. package/dist/AutosaveStatus-BKsCIvPj.cjs.map +0 -1
  83. package/dist/AutosaveStatus-CSZsp6w7.js.map +0 -1
  84. package/dist/CreditSystemSettings-Buu7Y-7I.js.map +0 -1
  85. package/dist/CreditSystemSettings-C2HkyMXy.cjs +0 -1
  86. package/dist/CreditSystemSettings-C2HkyMXy.cjs.map +0 -1
  87. package/dist/EmailRegisterForm-CNjYrqU6.cjs +0 -1
  88. package/dist/EmailRegisterForm-CNjYrqU6.cjs.map +0 -1
  89. package/dist/EmailRegisterForm-D2VaJouj.js +0 -750
  90. package/dist/EmailRegisterForm-D2VaJouj.js.map +0 -1
  91. package/dist/EmailSettings-DRfOF0Sf.js +0 -78
  92. package/dist/EmailSettings-DRfOF0Sf.js.map +0 -1
  93. package/dist/EmailSettings-eLlzzI5D.cjs +0 -1
  94. package/dist/EmailSettings-eLlzzI5D.cjs.map +0 -1
@@ -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-BKsCIvPj.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-B1A1zORa.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-DGq-kXbw.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-BkwIbTkL.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":"oMAWMA,EAAgB,CAAC,uBAAwB,4BAA4B,EAMpE,SAASC,EAAuB,CAAE,UAAAC,GAA0C,CACjF,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,EAIlB,MAAMK,GADmBX,EAAS,UAAe,CAAA,GAE9C,OAAQY,GAAMf,EAAc,SAASe,EAAE,GAAG,CAAC,EAC3C,KAAK,CAACC,EAAGC,IAAMjB,EAAc,QAAQgB,EAAE,GAAG,EAAIhB,EAAc,QAAQiB,EAAE,GAAG,CAAC,EAGvEC,EAAgBP,EAAkB,wBAAwB,IAAM,OAChEQ,EAAqB,IAAM,CAC/BT,EAAa,yBAA0BQ,EAAgB,QAAU,MAAM,CACzE,EAGME,EAAqBT,EAAkB,0BAA0B,IAAM,OACvEU,EAA0B,IAAM,CACpCX,EAAa,2BAA4BU,EAAqB,QAAU,MAAM,CAChF,EAGME,EAAyBX,EAAkB,yBAAyB,IAAM,OAC1EY,EAAeZ,EAAkB,sBAAsB,EACvDa,EAAmBF,GAA0BC,IAAiB,OAC9DE,EAAiBH,GAA0B,CAACJ,EAG5CQ,EAAmBC,EAAAA,QAAQ,IAAM,CACrC,GAAKH,EACL,MAAO,CACL,qBACE,yFAAA,CAEN,EAAG,CAACA,CAAgB,CAAC,EAErB,OAAInB,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,kBAAe,EAC1DA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,wDAAA,CAEhD,CAAA,EACF,EACAG,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,KAAK,SACL,eAAcb,EACd,UAAW,iBAAiBA,EAAgB,mBAAqB,mBAAmB,GACpF,QAASC,EAET,SAAA,CAAAS,EAAAA,IAAC,QAAK,UAAU,sBACd,eAAC,OAAA,CAAK,UAAU,sBAAsB,CAAA,CACxC,QACC,OAAA,CAAK,UAAU,sBAAuB,SAAAV,EAAgB,UAAY,UAAA,CAAW,CAAA,CAAA,CAAA,EAEhFU,EAAAA,IAACI,EAAAA,eAAA,CAAe,OAAQ1B,EAAgB,MAAOC,CAAA,CAAe,CAAA,CAAA,CAChE,CAAA,EACF,EAGCW,SACE,MAAA,CAAI,UAAU,6BACb,SAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,mCAAmC,SAAA,mBAAgB,EACjEA,EAAAA,IAAC,IAAA,CAAE,UAAU,yCAAyC,SAAA,0FAAA,CAGtD,CAAA,EACF,EACAG,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,KAAK,SACL,eAAcX,EACd,UAAW,iBAAiBA,EAAqB,mBAAqB,mBAAmB,GACzF,QAASC,EAET,SAAA,CAAAO,EAAAA,IAAC,QAAK,UAAU,sBACd,eAAC,OAAA,CAAK,UAAU,sBAAsB,CAAA,CACxC,QACC,OAAA,CAAK,UAAU,sBACb,SAAAR,EAAqB,UAAY,UAAA,CACpC,CAAA,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,EAIDI,GACCI,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAiC,SAAA,4JAGhD,EAEDH,GACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAiC,SAAA,iFAEhD,EAIFA,MAAC,MAAA,CAAI,UAAU,2BACZ,WAAgB,SAAW,EAC1BA,MAAC,MAAA,CAAI,UAAU,+BACb,SAAAA,MAAC,IAAA,CAAE,SAAA,mCAAA,CAAiC,EACtC,EAEAA,EAAAA,IAACK,EAAAA,gBAAA,CACC,SAAUnB,EACV,MAAAV,EACA,SAAUM,EACV,iBAAAgB,CAAA,CAAA,CACF,CAEJ,CAAA,EACF,CAEJ"}
@@ -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-M-D5N0eY.js";
3
+ import { E as t } from "./EmbeddedWalletSettings-CUY_X7Vj.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-CHkkCjyR.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-CPLbqlxJ.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-CSZsp6w7.js";
5
+ import { u as C, A as M, S as $ } from "./AutosaveStatus-DMjvXzP2.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-M-D5N0eY.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-CUY_X7Vj.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";const e=require("react/jsx-runtime"),r=require("react"),k=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:a=!1,error:i,canManage:n=!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 a&&s.length===0?e.jsxs("div",{className:`cedros-member-list cedros-member-list-loading ${f}`,children:[e.jsx(k.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"?"↑":"↓":"↕"})]})}),(n||o)&&e.jsx("th",{children:"Actions"})]})}),e.jsx("tbody",{children:c.map(u=>e.jsx(B,{member:u,isCurrentUser:u.userId===t,canManage:n,canChangeRoles:o,onUpdateRole:h,onRemove:m},u.id))})]})})}function B({member:s,isCurrentUser:t,canManage:a,canChangeRoles:i,onUpdateRole:n,onRemove:o}){const[h,m]=r.useState(!1),[f,l]=r.useState(s.role),j=r.useCallback(async c=>{if(!(!n||c===s.role)){m(!0);try{await n(s.userId,c),l(c)}catch{l(s.role)}finally{m(!1)}}},[s.userId,s.role,n]),d=r.useCallback(async()=>{if(!(!o||!window.confirm(`Are you sure you want to remove ${s.user.name||s.user.email} from this organization?`))){m(!0);try{await o(s.userId)}finally{m(!1)}}},[s.userId,s.user.name,s.user.email,o]),y=s.role==="owner",p=!t&&!y;return e.jsxs("tr",{className:`cedros-member-row ${t?"cedros-member-row-current":""}`,children:[e.jsxs("td",{className:"cedros-member-info",children:[e.jsx(W,{user:s.user}),e.jsxs("div",{className:"cedros-member-details",children:[e.jsxs("span",{className:"cedros-member-name",children:[s.user.name||"Unknown",t&&e.jsx("span",{className:"cedros-member-you",children:"(you)"})]}),e.jsx("span",{className:"cedros-member-email",children:s.user.email})]})]}),e.jsx("td",{className:"cedros-member-role",children:i&&p&&n?e.jsx("select",{value: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)}),(a||i)&&e.jsx("td",{className:"cedros-member-actions",children:a&&p&&o&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:d,disabled:h,"aria-label":`Remove ${s.user.name||s.user.email}`,children:h?e.jsx(k.LoadingSpinner,{size:"sm"}):"Remove"})})]})}function W({user:s}){const t=D.sanitizeImageUrl(s.picture);if(t)return e.jsx("img",{src:t,alt:s.name||s.email||"Member",className:"cedros-member-avatar",referrerPolicy:"no-referrer"});const a=(s.name?.[0]||s.email?.[0]||"?").toUpperCase();return e.jsx("div",{className:"cedros-member-avatar-placeholder",children:a})}function H(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}const V=["admin","member"];function K({onSubmit:s,isLoading:t=!1,error:a,availableRoles:i=V,defaultRole:n="member",className:o=""}){const[h,m]=r.useState(""),[f,l]=r.useState(n),[j,d]=r.useState(null),[y,p]=r.useState(!1),c=r.useRef(null),u=r.useRef(!0);r.useEffect(()=>(u.current=!0,()=>{u.current=!1,c.current!==null&&(window.clearTimeout(c.current),c.current=null)}),[]);const g=r.useCallback(async b=>{b.preventDefault(),d(null),p(!1);const S=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(n),p(!0),c.current!==null&&window.clearTimeout(c.current),c.current=window.setTimeout(()=>{u.current&&p(!1),c.current=null},3e3)}catch{}},[h,f,n,s]);return e.jsxs("form",{className:`cedros-invite-form ${o}`,onSubmit:g,children:[(a||j)&&e.jsx($.ErrorMessage,{error:j??a??null}),y&&e.jsxs("div",{className:"cedros-invite-success",role:"status",children:[e.jsx(G,{}),e.jsx("span",{children:"Invitation sent successfully!"})]}),e.jsxs("div",{className:"cedros-invite-form-row",children:[e.jsxs("div",{className:"cedros-form-group cedros-invite-email-group",children:[e.jsx("label",{htmlFor:"invite-email",className:"cedros-form-label",children:"Email Address"}),e.jsx("input",{id:"invite-email",type:"email",className:"cedros-form-input",value: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(k.LoadingSpinner,{size:"sm"}):"Send Invite"})]}),e.jsx("p",{className:"cedros-form-hint",children:"The invited user will receive an email with a link to join your organization."})]})}function G(){return e.jsx("svg",{className:"cedros-invite-check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M3 8L6 11L13 5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function J({invites:s,isLoading:t=!1,error:a,canManage:i=!1,onCancel:n,onResend:o,className:h=""}){return t&&s.length===0?e.jsxs("div",{className:`cedros-invite-list cedros-invite-list-loading ${h}`,children:[e.jsx(k.LoadingSpinner,{}),e.jsx("span",{children:"Loading invites..."})]}):a?e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx($.ErrorMessage,{error:a})}):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:n,onResend:o},m.id))})})}function Y({invite:s,canManage:t,onCancel:a,onResend:i}){const[n,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(!(!a||!window.confirm(`Are you sure you want to cancel the invite for ${s.email}?`))){o(!0);try{await a(s.id)}finally{o(!1)}}},[s.id,s.email,a]),d=r.useCallback(async()=>{if(i){o(!0),m(!1);try{await i(s.id),m(!0),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:n,"aria-label":`Resend invite to ${s.email}`,children:n?e.jsx(k.LoadingSpinner,{size:"sm"}):"Resend"}),a&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:j,disabled:n,"aria-label":`Cancel invite for ${s.email}`,children:"Cancel"})]})]})}function M(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Q(s){const t=new Date(s),a=new Date,i=t.getTime()-a.getTime(),n=Math.ceil(i/(1e3*60*60*24));return n<0?"expired":n===0?"today":n===1?"tomorrow":n<7?`in ${n} days`:M(s)}class X{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listMembers(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/members?limit=${a}&offset=${i}`);return{members:n.members.map(o=>({id:o.id,userId:o.userId,orgId:t,role:o.role,joinedAt:o.joinedAt,user:{id:o.userId,email:o.email,name:o.name}})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list members")}}async updateMemberRole(t,a,i){try{return await this.client.patch(`/orgs/${t}/members/${a}`,i)}catch(n){throw A.handleApiError(n,"Failed to update member role")}}async removeMember(t,a){try{await this.client.delete(`/orgs/${t}/members/${a}`)}catch(i){throw A.handleApiError(i,"Failed to remove member")}}}function Z(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[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||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const x=++p.current;try{const{limit:v=50,offset:N=0}=w??{},C=await u.current.listMembers(s,v,N);if(x!==p.current)return;o(C.members),m(C.total)}catch(v){if(x!==p.current)return;d(v)}finally{x===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(w,x)=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.updateMemberRole(s,w,{role:x}),await g()}catch(v){throw d(v),v}finally{l(!1)}},[s,g]),S=r.useCallback(async w=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.removeMember(s,w),await g()}catch(x){throw d(x),x}finally{l(!1)}},[s,g]);return{members:n,total:h,isLoading:f,error:j,fetchMembers:g,updateMemberRole:b,removeMember:S}}class ee{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listInvites(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/invites?limit=${a}&offset=${i}`);return{invites:n.invites.map(o=>({id:o.id,orgId:o.orgId,email:o.email,role:o.role,invitedBy:o.invitedBy,createdAt:o.createdAt,expiresAt:o.expiresAt})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list invites")}}async createInvite(t,a){try{return await this.client.post(`/orgs/${t}/invites`,a)}catch(i){throw A.handleApiError(i,"Failed to create invite")}}async cancelInvite(t,a){try{await this.client.delete(`/orgs/${t}/invites/${a}`)}catch(i){throw A.handleApiError(i,"Failed to cancel invite")}}async resendInvite(t,a){try{await this.client.post(`/orgs/${t}/invites/${a}/resend`,{})}catch(i){throw A.handleApiError(i,"Failed to resend invite")}}async acceptInvite(t){try{return await this.client.post("/invites/accept",t)}catch(a){throw A.handleApiError(a,"Failed to accept invite")}}}function se(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[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||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const N=++p.current;try{const{limit:C=50,offset:O=0}=v??{},L=await u.current.listInvites(s,C,O);if(N!==p.current)return;o(L.invites),m(L.total)}catch(C){if(N!==p.current)return;d(C)}finally{N===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(v,N="member")=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.createInvite(s,{email:v,role:N}),await g()}catch(C){throw d(C),C}finally{l(!1)}},[s,g]),S=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.cancelInvite(s,v),await g()}catch(N){throw d(N),N}finally{l(!1)}},[s,g]),w=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.resendInvite(s,v)}catch(N){throw d(N),N}finally{l(!1)}},[s]),x=r.useCallback(async v=>{l(!0),d(null);try{return await u.current.acceptInvite({token:v})}catch(N){throw d(N),N}finally{l(!1)}},[]);return{invites:n,total: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:a,fetchSettings:i,getValue:n}=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(n("feature_organizations")),sso:m(n("feature_sso")),mfa:m(n("feature_mfa")),mfaRequired:m(n("security_require_mfa")),walletSigning:m(n("feature_wallet_signing")),credits:m(n("feature_credits")),userWithdrawals:m(n("feature_user_withdrawals")),cedrosPay:m(n("feature_cedros_pay"))},[s,n,m]),l=r.useCallback(async()=>{await i()},[i]),j=r.useCallback(d=>f[d],[f]);return{features:f,isLoading:t,error:a,refetch:l,isEnabled:j}}const re=["users","team","deposits","withdrawals","settings-wallet","settings-auth","settings-messaging","settings-credits","settings-server"],ne=["pay-products","pay-subscriptions","pay-transactions","pay-coupons","pay-refunds","pay-storefront","pay-ai","pay-payment","pay-messaging","pay-settings"],E={users:"Users",team:"Team",deposits:"Deposits",withdrawals:"Withdrawals","settings-wallet":"Wallet Settings","settings-auth":"Auth Settings","settings-messaging":"Messages Settings","settings-credits":"Credits Settings","settings-server":"Server Settings","pay-products":"Products","pay-subscriptions":"Subscriptions","pay-transactions":"Transactions","pay-coupons":"Coupons","pay-refunds":"Refunds","pay-storefront":"Storefront","pay-ai":"Store AI","pay-payment":"Payment Options","pay-messaging":"Store Messages","pay-settings":"Store Server"},R={admin:{users:!0,team:!0,deposits:!0,withdrawals:!0,"settings-wallet":!0,"settings-auth":!0,"settings-messaging":!0,"settings-credits":!0,"settings-server":!0,"pay-products":!0,"pay-subscriptions":!0,"pay-transactions":!0,"pay-coupons":!0,"pay-refunds":!0,"pay-storefront":!0,"pay-ai":!0,"pay-payment":!0,"pay-messaging":!0,"pay-settings":!0},member:{users:!1,team:!0,deposits:!1,withdrawals:!1,"settings-wallet":!1,"settings-auth":!1,"settings-messaging":!1,"settings-credits":!1,"settings-server":!1,"pay-products":!1,"pay-subscriptions":!1,"pay-transactions":!1,"pay-coupons":!1,"pay-refunds":!1,"pay-storefront":!1,"pay-ai":!1,"pay-payment":!1,"pay-messaging":!1,"pay-settings":!1}};function I(){const{config:s,authState:t,_internal:a}=A.useCedrosLogin(),{activeOrg:i,role:n}=F.useOrgs(),[o,h]=r.useState(R),[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:a?.getAccessToken}),[s.serverUrl,s.requestTimeout,s.retryAttempts,a]),u=r.useRef(c);u.current=c;const g=r.useCallback(async()=>{if(t!=="authenticated"||!i){h(R);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(R);else{const v=x instanceof Error?x.message:"Failed to fetch permissions";y({code:"NETWORK_ERROR",message:v}),h(R)}}finally{w===p.current&&f(!1)}},[t,i]),b=r.useCallback(async w=>{if(t!=="authenticated"||!i)throw new Error("Not authenticated");if(n!=="owner")throw new Error("Only owners can modify dashboard permissions");j(!0),y(null);try{await u.current.request({method:"PUT",path:"/admin/dashboard-permissions",body:w}),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,n]),S=r.useCallback(w=>!i||!n||n==="owner"?!0:o[n]?.[w]??!1,[i,n,o]);return r.useEffect(()=>{i?.id&&g()},[i?.id,g]),{permissions:o,canAccess:S,updatePermissions:b,isLoading:m,isUpdating:l,error:d,fetchPermissions:g}}function T({checked:s,onChange:t,disabled:a,label:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:a,className:`cedros-toggle cedros-toggle-sm ${s?"cedros-toggle-on":"cedros-toggle-off"} ${a?"cedros-toggle-disabled":""}`,onClick:()=>!a&&t(!s),children:e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})})})}function ae({userRole:s}){const{permissions:t,updatePermissions:a,isLoading:i,isUpdating:n,error:o}=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&&(a(l.current).catch(()=>{}),l.current=null)},500)},[a]);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}),n&&e.jsx("span",{className:"cedros-permissions-saving",children:"Saving..."})]}),e.jsx("div",{className:"cedros-permissions-matrix",children:e.jsx("table",{className:"cedros-permissions-table",children:e.jsxs("tbody",{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Login"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),re.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c)),d&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Pay"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),ne.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c))]})]})})})]}):e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__empty",children:"Only organization owners can configure dashboard permissions."})})}exports.InviteForm=K;exports.InviteList=J;exports.MemberList=z;exports.PermissionsSection=ae;exports.useDashboardPermissions=I;exports.useInvites=se;exports.useMembers=Z;exports.useServerFeatures=_;
1
+ "use strict";const e=require("react/jsx-runtime"),r=require("react"),k=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:a=!1,error:i,canManage:n=!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 a&&s.length===0?e.jsxs("div",{className:`cedros-member-list cedros-member-list-loading ${f}`,children:[e.jsx(k.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"?"↑":"↓":"↕"})]})}),(n||o)&&e.jsx("th",{children:"Actions"})]})}),e.jsx("tbody",{children:c.map(u=>e.jsx(B,{member:u,isCurrentUser:u.userId===t,canManage:n,canChangeRoles:o,onUpdateRole:h,onRemove:m},u.id))})]})})}function B({member:s,isCurrentUser:t,canManage:a,canChangeRoles:i,onUpdateRole:n,onRemove:o}){const[h,m]=r.useState(!1),[f,l]=r.useState(s.role),j=r.useCallback(async c=>{if(!(!n||c===s.role)){m(!0);try{await n(s.userId,c),l(c)}catch{l(s.role)}finally{m(!1)}}},[s.userId,s.role,n]),d=r.useCallback(async()=>{if(!(!o||!window.confirm(`Are you sure you want to remove ${s.user.name||s.user.email} from this organization?`))){m(!0);try{await o(s.userId)}finally{m(!1)}}},[s.userId,s.user.name,s.user.email,o]),y=s.role==="owner",p=!t&&!y;return e.jsxs("tr",{className:`cedros-member-row ${t?"cedros-member-row-current":""}`,children:[e.jsxs("td",{className:"cedros-member-info",children:[e.jsx(W,{user:s.user}),e.jsxs("div",{className:"cedros-member-details",children:[e.jsxs("span",{className:"cedros-member-name",children:[s.user.name||"Unknown",t&&e.jsx("span",{className:"cedros-member-you",children:"(you)"})]}),e.jsx("span",{className:"cedros-member-email",children:s.user.email})]})]}),e.jsx("td",{className:"cedros-member-role",children:i&&p&&n?e.jsx("select",{value: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)}),(a||i)&&e.jsx("td",{className:"cedros-member-actions",children:a&&p&&o&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:d,disabled:h,"aria-label":`Remove ${s.user.name||s.user.email}`,children:h?e.jsx(k.LoadingSpinner,{size:"sm"}):"Remove"})})]})}function W({user:s}){const t=D.sanitizeImageUrl(s.picture);if(t)return e.jsx("img",{src:t,alt:s.name||s.email||"Member",className:"cedros-member-avatar",referrerPolicy:"no-referrer"});const a=(s.name?.[0]||s.email?.[0]||"?").toUpperCase();return e.jsx("div",{className:"cedros-member-avatar-placeholder",children:a})}function H(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}const V=["admin","member"];function K({onSubmit:s,isLoading:t=!1,error:a,availableRoles:i=V,defaultRole:n="member",className:o=""}){const[h,m]=r.useState(""),[f,l]=r.useState(n),[j,d]=r.useState(null),[y,p]=r.useState(!1),c=r.useRef(null),u=r.useRef(!0);r.useEffect(()=>(u.current=!0,()=>{u.current=!1,c.current!==null&&(window.clearTimeout(c.current),c.current=null)}),[]);const g=r.useCallback(async b=>{b.preventDefault(),d(null),p(!1);const S=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(n),p(!0),c.current!==null&&window.clearTimeout(c.current),c.current=window.setTimeout(()=>{u.current&&p(!1),c.current=null},3e3)}catch{}},[h,f,n,s]);return e.jsxs("form",{className:`cedros-invite-form ${o}`,onSubmit:g,children:[(a||j)&&e.jsx($.ErrorMessage,{error:j??a??null}),y&&e.jsxs("div",{className:"cedros-invite-success",role:"status",children:[e.jsx(G,{}),e.jsx("span",{children:"Invitation sent successfully!"})]}),e.jsxs("div",{className:"cedros-invite-form-row",children:[e.jsxs("div",{className:"cedros-form-group cedros-invite-email-group",children:[e.jsx("label",{htmlFor:"invite-email",className:"cedros-form-label",children:"Email Address"}),e.jsx("input",{id:"invite-email",type:"email",className:"cedros-form-input",value: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(k.LoadingSpinner,{size:"sm"}):"Send Invite"})]}),e.jsx("p",{className:"cedros-form-hint",children:"The invited user will receive an email with a link to join your organization."})]})}function G(){return e.jsx("svg",{className:"cedros-invite-check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M3 8L6 11L13 5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function J({invites:s,isLoading:t=!1,error:a,canManage:i=!1,onCancel:n,onResend:o,className:h=""}){return t&&s.length===0?e.jsxs("div",{className:`cedros-invite-list cedros-invite-list-loading ${h}`,children:[e.jsx(k.LoadingSpinner,{}),e.jsx("span",{children:"Loading invites..."})]}):a?e.jsx("div",{className:`cedros-invite-list ${h}`,children:e.jsx($.ErrorMessage,{error:a})}):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:n,onResend:o},m.id))})})}function Y({invite:s,canManage:t,onCancel:a,onResend:i}){const[n,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(!(!a||!window.confirm(`Are you sure you want to cancel the invite for ${s.email}?`))){o(!0);try{await a(s.id)}finally{o(!1)}}},[s.id,s.email,a]),d=r.useCallback(async()=>{if(i){o(!0),m(!1);try{await i(s.id),m(!0),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:n,"aria-label":`Resend invite to ${s.email}`,children:n?e.jsx(k.LoadingSpinner,{size:"sm"}):"Resend"}),a&&e.jsx("button",{type:"button",className:"cedros-button cedros-button-danger cedros-button-sm",onClick:j,disabled:n,"aria-label":`Cancel invite for ${s.email}`,children:"Cancel"})]})]})}function M(s){return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Q(s){const t=new Date(s),a=new Date,i=t.getTime()-a.getTime(),n=Math.ceil(i/(1e3*60*60*24));return n<0?"expired":n===0?"today":n===1?"tomorrow":n<7?`in ${n} days`:M(s)}class X{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listMembers(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/members?limit=${a}&offset=${i}`);return{members:n.members.map(o=>({id:o.id,userId:o.userId,orgId:t,role:o.role,joinedAt:o.joinedAt,user:{id:o.userId,email:o.email,name:o.name}})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list members")}}async updateMemberRole(t,a,i){try{return await this.client.patch(`/orgs/${t}/members/${a}`,i)}catch(n){throw A.handleApiError(n,"Failed to update member role")}}async removeMember(t,a){try{await this.client.delete(`/orgs/${t}/members/${a}`)}catch(i){throw A.handleApiError(i,"Failed to remove member")}}}function Z(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[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||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const x=++p.current;try{const{limit:v=50,offset:N=0}=w??{},C=await u.current.listMembers(s,v,N);if(x!==p.current)return;o(C.members),m(C.total)}catch(v){if(x!==p.current)return;d(v)}finally{x===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(w,x)=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.updateMemberRole(s,w,{role:x}),await g()}catch(v){throw d(v),v}finally{l(!1)}},[s,g]),S=r.useCallback(async w=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.removeMember(s,w),await g()}catch(x){throw d(x),x}finally{l(!1)}},[s,g]);return{members:n,total:h,isLoading:f,error:j,fetchMembers:g,updateMemberRole:b,removeMember:S}}class ee{client;constructor(t,a,i,n){this.client=new A.ApiClient({baseUrl:t,timeoutMs:a,retryAttempts:i,getAccessToken:n})}async listInvites(t,a=50,i=0){try{const n=await this.client.get(`/orgs/${t}/invites?limit=${a}&offset=${i}`);return{invites:n.invites.map(o=>({id:o.id,orgId:o.orgId,email:o.email,role:o.role,invitedBy:o.invitedBy,createdAt:o.createdAt,expiresAt:o.expiresAt})),total:n.total}}catch(n){throw A.handleApiError(n,"Failed to list invites")}}async createInvite(t,a){try{return await this.client.post(`/orgs/${t}/invites`,a)}catch(i){throw A.handleApiError(i,"Failed to create invite")}}async cancelInvite(t,a){try{await this.client.delete(`/orgs/${t}/invites/${a}`)}catch(i){throw A.handleApiError(i,"Failed to cancel invite")}}async resendInvite(t,a){try{await this.client.post(`/orgs/${t}/invites/${a}/resend`,{})}catch(i){throw A.handleApiError(i,"Failed to resend invite")}}async acceptInvite(t){try{return await this.client.post("/invites/accept",t)}catch(a){throw A.handleApiError(a,"Failed to accept invite")}}}function se(s){const{config:t,authState:a,_internal:i}=A.useCedrosLogin(),[n,o]=r.useState([]),[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||a!=="authenticated"){o([]),m(0);return}l(!0),d(null);const N=++p.current;try{const{limit:C=50,offset:O=0}=v??{},L=await u.current.listInvites(s,C,O);if(N!==p.current)return;o(L.invites),m(L.total)}catch(C){if(N!==p.current)return;d(C)}finally{N===p.current&&l(!1)}},[s,a]);r.useEffect(()=>{if(a!=="authenticated"){y.current=void 0;return}s!==y.current&&(y.current=s,g())},[s,a,g]);const b=r.useCallback(async(v,N="member")=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.createInvite(s,{email:v,role:N}),await g()}catch(C){throw d(C),C}finally{l(!1)}},[s,g]),S=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.cancelInvite(s,v),await g()}catch(N){throw d(N),N}finally{l(!1)}},[s,g]),w=r.useCallback(async v=>{if(!s)throw new Error("No organization selected");l(!0),d(null);try{await u.current.resendInvite(s,v)}catch(N){throw d(N),N}finally{l(!1)}},[s]),x=r.useCallback(async v=>{l(!0),d(null);try{return await u.current.acceptInvite({token:v})}catch(N){throw d(N),N}finally{l(!1)}},[]);return{invites:n,total: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:a,fetchSettings:i,getValue:n}=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(n("feature_organizations")),sso:m(n("feature_sso")),mfa:m(n("feature_mfa")),mfaRequired:m(n("security_require_mfa")),walletSigning:m(n("feature_wallet_signing")),credits:m(n("feature_credits")),userWithdrawals:m(n("feature_user_withdrawals")),cedrosPay:m(n("feature_cedros_pay"))},[s,n,m]),l=r.useCallback(async()=>{await i()},[i]),j=r.useCallback(d=>f[d],[f]);return{features:f,isLoading:t,error:a,refetch:l,isEnabled:j}}const re=["users","team","deposits","withdrawals","settings-wallet","settings-auth","settings-messaging","settings-credits","settings-server","settings-images"],ne=["pay-products","pay-subscriptions","pay-transactions","pay-coupons","pay-refunds","pay-storefront","pay-ai","pay-payment","pay-messaging","pay-settings"],E={users:"Users",team:"Team",deposits:"Deposits",withdrawals:"Withdrawals","settings-wallet":"Wallet Settings","settings-auth":"Auth Settings","settings-messaging":"Messages Settings","settings-credits":"Credits Settings","settings-server":"Server Settings","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"},R={admin:{users:!0,team:!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,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:a}=A.useCedrosLogin(),{activeOrg:i,role:n}=F.useOrgs(),[o,h]=r.useState(R),[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:a?.getAccessToken}),[s.serverUrl,s.requestTimeout,s.retryAttempts,a]),u=r.useRef(c);u.current=c;const g=r.useCallback(async()=>{if(t!=="authenticated"||!i){h(R);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(R);else{const v=x instanceof Error?x.message:"Failed to fetch permissions";y({code:"NETWORK_ERROR",message:v}),h(R)}}finally{w===p.current&&f(!1)}},[t,i]),b=r.useCallback(async w=>{if(t!=="authenticated"||!i)throw new Error("Not authenticated");if(n!=="owner")throw new Error("Only owners can modify dashboard permissions");j(!0),y(null);try{await u.current.request({method:"PUT",path:"/admin/dashboard-permissions",body:w}),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,n]),S=r.useCallback(w=>!i||!n||n==="owner"?!0:o[n]?.[w]??!1,[i,n,o]);return r.useEffect(()=>{i?.id&&g()},[i?.id,g]),{permissions:o,canAccess:S,updatePermissions:b,isLoading:m,isUpdating:l,error:d,fetchPermissions:g}}function T({checked:s,onChange:t,disabled:a,label:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:a,className:`cedros-toggle cedros-toggle-sm ${s?"cedros-toggle-on":"cedros-toggle-off"} ${a?"cedros-toggle-disabled":""}`,onClick:()=>!a&&t(!s),children:e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})})})}function ae({userRole:s}){const{permissions:t,updatePermissions:a,isLoading:i,isUpdating:n,error:o}=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&&(a(l.current).catch(()=>{}),l.current=null)},500)},[a]);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}),n&&e.jsx("span",{className:"cedros-permissions-saving",children:"Saving..."})]}),e.jsx("div",{className:"cedros-permissions-matrix",children:e.jsx("table",{className:"cedros-permissions-table",children:e.jsxs("tbody",{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Login"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),re.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c)),d&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"cedros-permissions-group-header",children:[e.jsx("th",{className:"cedros-permissions-section-header",children:"Cedros Pay"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Admin"}),e.jsx("th",{className:"cedros-permissions-role-header",children:"Member"})]}),ne.map(c=>e.jsxs("tr",{className:"cedros-permissions-row",children:[e.jsx("td",{className:"cedros-permissions-section-label",children:E[c]}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.admin[c]??!1,onChange:u=>p("admin",c,u),disabled:n,label:`Admin access to ${E[c]}`})}),e.jsx("td",{className:"cedros-permissions-toggle-cell",children:e.jsx(T,{checked:t.member[c]??!1,onChange:u=>p("member",c,u),disabled:n,label:`Member access to ${E[c]}`})})]},c))]})]})})})]}):e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx("div",{className:"cedros-dashboard__empty",children:"Only organization owners can configure dashboard permissions."})})}exports.InviteForm=K;exports.InviteList=J;exports.MemberList=z;exports.PermissionsSection=ae;exports.useDashboardPermissions=I;exports.useInvites=se;exports.useMembers=Z;exports.useServerFeatures=_;