@zango-core/crm-framework 1.0.12 → 1.0.13
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/{PageTypeRegistry-DCEjBIBb.js → PageTypeRegistry-Cu_XV_iY.js} +2 -2
- package/dist/{PageTypeRegistry-DCEjBIBb.js.map → PageTypeRegistry-Cu_XV_iY.js.map} +1 -1
- package/dist/{index.framework-CmcZiUOr.js → index.framework-Bu5-4Nwj.js} +4155 -4013
- package/dist/index.framework-Bu5-4Nwj.js.map +1 -0
- package/dist/zango-crm-framework.js +65 -64
- package/dist/zango-crm-framework.umd.cjs +39 -39
- package/dist/zango-crm-framework.umd.cjs.map +1 -1
- package/package.json +2 -2
- package/dist/index.framework-CmcZiUOr.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.framework-Bu5-4Nwj.js","sources":["../src/framework/utils/logoCache.ts","../src/framework/components/CachedLogo.tsx","../src/framework/utils/apiHelpers.ts","../src/framework/utils/apiUrlUtils.ts","../src/services/api.ts","../node_modules/tinycolor2/esm/tinycolor.js","../src/framework/utils/colorUtils.ts","../src/framework/utils/apiConfigHelper.ts","../src/framework/pages/CrudPage.tsx","../src/framework/pages/TrainingPage.tsx","../src/framework/routing/pagePackageMapping.ts","../src/framework/components/CustomPageFallback.tsx","../src/framework/components/CustomPageLoader.tsx","../src/framework/pages/NotFoundPage.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-left.js","../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../node_modules/lucide-react/dist/esm/icons/crown.js","../node_modules/lucide-react/dist/esm/icons/globe.js","../node_modules/lucide-react/dist/esm/icons/house.js","../node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/lucide-react/dist/esm/icons/mail.js","../node_modules/lucide-react/dist/esm/icons/phone.js","../node_modules/lucide-react/dist/esm/icons/shield.js","../node_modules/lucide-react/dist/esm/icons/smartphone.js","../node_modules/lucide-react/dist/esm/icons/user.js","../node_modules/lucide-react/dist/esm/icons/users.js","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/lib/helpers/HttpStatusCode.js","../node_modules/axios/lib/axios.js","../node_modules/axios/index.js","../src/auth/services/network/base.ts","../src/auth/services/network/common.ts","../src/auth/services/network/api.ts","../src/auth/services/network/configuration.ts","../src/auth/services/authService.tsx","../node_modules/zustand/esm/vanilla.mjs","../node_modules/zustand/esm/react.mjs","../src/auth/stores/useAuthStore.ts","../src/framework/contexts/AuthConfigContext.tsx","../src/framework/utils/authThemeUtils.ts","../src/auth/components/ForgotPasswordForm.tsx","../src/auth/components/ResetPasswordForm.tsx","../src/framework/utils/redirectUtils.ts","../src/auth/components/OAuthCallback.tsx","../src/auth/components/ProviderButton.tsx","../src/auth/components/OTPInput.tsx","../src/auth/components/AuthProvider.tsx","../src/auth/components/OTPForm.tsx","../src/auth/components/DynamicLoginForm.tsx","../src/auth/components/LoginForm.tsx","../src/auth/components/RoleSelection.tsx","../src/auth/components/SecondFactorAuth.tsx","../src/auth/components/PasswordResetRequired.tsx","../src/auth/pages/SAMLCallbackPage.tsx","../src/auth/contexts/LoginContext.tsx","../src/auth/pages/LoginPage.tsx","../src/auth/pages/LoginPageWithRoleSelection.tsx","../src/auth/pages/CompleteAuthFlow.tsx","../src/auth/pages/OAuthCallbackPage.tsx","../src/auth/hooks/useAuth.tsx","../src/auth/components/LoginRouter.tsx","../src/auth/components/composable/SSOButtons.tsx","../src/auth/components/composable/PasswordLoginForm.tsx","../src/auth/components/composable/OTPLoginForm.tsx","../src/framework/pages/LoginPage.tsx","../src/framework/routing/dynamicPageRegistry.ts","../src/framework/contexts/AppContext.tsx","../src/framework/hooks/useSmartNavigation.ts","../src/framework/components/SmartLink.tsx","../src/framework/utils/svgUtils.ts","../src/framework/components/layout/Navbar.tsx","../src/framework/hooks/useProfileData.ts","../src/framework/utils/cookieUtils.ts","../src/framework/utils/logoutUtils.ts","../src/framework/components/layout/UserProfileDrawer.tsx","../src/framework/components/layout/Topbar.tsx","../src/framework/config/defaultLayoutConfig.ts","../src/framework/components/layout/Layout.tsx","../src/framework/routing/getRenderComponent.ts","../src/framework/routing/PageTypeRouter.tsx","../src/framework/components/DocumentHead.tsx","../src/framework/hooks/useSessionSecurity.ts","../node_modules/@radix-ui/primitive/dist/index.mjs","../node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../node_modules/@radix-ui/react-context/dist/index.mjs","../node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs","../node_modules/@radix-ui/react-id/dist/index.mjs","../node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs","../node_modules/@radix-ui/react-slot/dist/index.mjs","../node_modules/@radix-ui/react-primitive/dist/index.mjs","../node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs","../node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs","../node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs","../node_modules/@radix-ui/react-focus-scope/dist/index.mjs","../node_modules/@radix-ui/react-portal/dist/index.mjs","../node_modules/@radix-ui/react-presence/dist/index.mjs","../node_modules/@radix-ui/react-focus-guards/dist/index.mjs","../node_modules/tslib/tslib.es6.mjs","../node_modules/react-remove-scroll-bar/dist/es2015/constants.js","../node_modules/use-callback-ref/dist/es2015/assignRef.js","../node_modules/use-callback-ref/dist/es2015/useRef.js","../node_modules/use-callback-ref/dist/es2015/useMergeRef.js","../node_modules/use-sidecar/dist/es2015/medium.js","../node_modules/use-sidecar/dist/es2015/exports.js","../node_modules/react-remove-scroll/dist/es2015/medium.js","../node_modules/react-remove-scroll/dist/es2015/UI.js","../node_modules/get-nonce/dist/es2015/index.js","../node_modules/react-style-singleton/dist/es2015/singleton.js","../node_modules/react-style-singleton/dist/es2015/hook.js","../node_modules/react-style-singleton/dist/es2015/component.js","../node_modules/react-remove-scroll-bar/dist/es2015/utils.js","../node_modules/react-remove-scroll-bar/dist/es2015/component.js","../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js","../node_modules/react-remove-scroll/dist/es2015/handleScroll.js","../node_modules/react-remove-scroll/dist/es2015/SideEffect.js","../node_modules/react-remove-scroll/dist/es2015/sidecar.js","../node_modules/react-remove-scroll/dist/es2015/Combination.js","../node_modules/aria-hidden/dist/es2015/index.js","../node_modules/@radix-ui/react-dialog/dist/index.mjs","../src/framework/components/SessionSecurityDialog.tsx","../src/framework/components/SessionSecurityProvider.tsx","../src/framework/pages/LogoutPage.tsx","../src/framework/pages/ConfigurePage.tsx","../src/framework/ZangoApp.tsx","../src/App.tsx","../src/framework/utils/apiInterceptor.ts"],"sourcesContent":["// Logo Cache Utility\n// Handles caching of app logo with versioning and background updates\n\nconst LOGO_CACHE_KEY = 'zango_app_logo_cache';\nconst CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours in milliseconds\n\nclass LogoCache {\n constructor() {\n this.cacheKey = LOGO_CACHE_KEY;\n }\n\n // Get cached logo data\n getCachedLogo() {\n try {\n const cached = localStorage.getItem(this.cacheKey);\n if (!cached) return null;\n\n const data = JSON.parse(cached);\n\n // Check if cache is expired\n if (this.isCacheExpired(data.timestamp)) {\n this.clearCache();\n return null;\n }\n\n // Validate cached data format\n if (data.base64Data && !data.base64Data.startsWith('data:image/')) {\n console.warn('Invalid cached logo format, clearing cache');\n this.clearCache();\n return null;\n }\n\n return data;\n } catch (error) {\n console.error('Error reading logo cache:', error);\n return null;\n }\n }\n\n // Save logo to cache\n async cacheLogoUrl(logoUrl, appName) {\n if (!logoUrl) return;\n\n try {\n // Create a version hash from the URL\n const version = await this.generateHash(logoUrl);\n\n // Check if we already have this version cached\n const existingCache = this.getCachedLogo();\n if (existingCache && existingCache.version === version) {\n // Update timestamp to extend cache life\n existingCache.timestamp = Date.now();\n localStorage.setItem(this.cacheKey, JSON.stringify(existingCache));\n return existingCache;\n }\n\n // Fetch and convert to base64\n const base64Data = await this.fetchAndConvertToBase64(logoUrl);\n\n const cacheData = {\n url: logoUrl,\n base64Data,\n version,\n timestamp: Date.now(),\n appName: appName || 'Zango CRM'\n };\n\n localStorage.setItem(this.cacheKey, JSON.stringify(cacheData));\n return cacheData;\n } catch (error) {\n console.error('Error caching logo:', error);\n // Return basic data even if caching fails\n return {\n url: logoUrl,\n base64Data: null,\n version: null,\n timestamp: Date.now(),\n appName: appName || 'Zango CRM'\n };\n }\n }\n\n // Fetch logo and convert to base64\n async fetchAndConvertToBase64(url) {\n try {\n // If it's already a data URL, return it as is\n if (url.startsWith('data:')) {\n // Validate it's an image\n if (!url.startsWith('data:image/')) {\n console.error('Invalid logo format: data URL must be an image');\n return null;\n }\n return url;\n }\n\n // Handle relative URLs\n const absoluteUrl = url.startsWith('http') ? url : `${window.location.origin}${url}`;\n\n const response = await fetch(absoluteUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch logo: ${response.status}`);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && !contentType.startsWith('image/')) {\n throw new Error(`Invalid logo content type: ${contentType}`);\n }\n\n const blob = await response.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.error('Error converting logo to base64:', error);\n return null;\n }\n }\n\n // Generate hash from URL for versioning\n async generateHash(str) {\n // Simple hash function for versioning\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36);\n }\n\n // Check if cache is expired\n isCacheExpired(timestamp) {\n return Date.now() - timestamp > CACHE_TTL;\n }\n\n // Clear cache\n clearCache() {\n try {\n localStorage.removeItem(this.cacheKey);\n } catch (error) {\n console.error('Error clearing logo cache:', error);\n }\n }\n\n // Check if logo needs update\n async needsUpdate(currentUrl) {\n const cached = this.getCachedLogo();\n if (!cached) return true;\n\n // If URL changed, needs update\n if (cached.url !== currentUrl) return true;\n\n // If cache is expired, needs update\n if (this.isCacheExpired(cached.timestamp)) return true;\n\n return false;\n }\n\n // Update logo in background\n async updateInBackground(logoUrl, appName, onUpdate) {\n try {\n const needsUpdate = await this.needsUpdate(logoUrl);\n if (!needsUpdate) return;\n\n // Fetch and cache in background\n setTimeout(async () => {\n const newCache = await this.cacheLogoUrl(logoUrl, appName);\n if (newCache && onUpdate) {\n onUpdate(newCache);\n }\n }, 100);\n } catch (error) {\n console.error('Error updating logo in background:', error);\n }\n }\n}\n\n// Export singleton instance\nexport const logoCache = new LogoCache();","import React, { useState, useEffect, useCallback } from 'react';\nimport { Link } from 'react-router-dom';\nimport { logoCache } from '../utils/logoCache';\nimport type { ReactElement } from 'react';\n\n// Default Zango logo SVG component\nconst DefaultLogo = (): ReactElement => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"62\" height=\"20\" viewBox=\"0 0 62 20\" fill=\"none\">\n <path d=\"M0 15.5495L0 13.7372L5.34244 6.80918L0.527365 6.80918L0.527365 4.17101L9.53843 4.17101L9.53843 5.96037L4.19599 12.9114L9.69894 12.9114V15.5495L0 15.5495Z\" fill=\"var(--Colours-Base-black, #000)\" />\n <path d=\"M16.605 15.8248C15.7949 15.8248 15.0382 15.6948 14.3351 15.4348C13.6319 15.1595 13.0205 14.7695 12.5007 14.2649C11.981 13.7449 11.5759 13.1178 11.2855 12.3837C10.9951 11.6496 10.8499 10.8085 10.8499 9.86027C10.8499 8.94265 11.0027 8.11679 11.3084 7.38269C11.6142 6.6333 12.0116 6.00626 12.5007 5.50156C13.0052 4.98158 13.5784 4.58394 14.2204 4.30865C14.8624 4.03337 15.5274 3.89573 16.2152 3.89573C17.0254 3.89573 17.7285 4.03337 18.3247 4.30865C18.9361 4.58394 19.4406 4.96628 19.838 5.45568C20.2507 5.94508 20.5564 6.52624 20.7552 7.19916C20.9539 7.85679 21.0532 8.5756 21.0532 9.35558C21.0532 9.66145 21.0379 9.95203 21.0074 10.2273C20.9768 10.5026 20.9462 10.7091 20.9157 10.8467L14.1058 10.8467C14.2586 11.6726 14.5949 12.2843 15.1146 12.682C15.6497 13.0643 16.2993 13.2555 17.0636 13.2555C17.8738 13.2555 18.6916 13.0031 19.517 12.4984L20.6405 14.5401C20.0596 14.9378 19.41 15.2513 18.6916 15.4807C17.9884 15.7101 17.2929 15.8248 16.605 15.8248ZM14.0828 8.62148L18.1871 8.62148C18.1871 7.97914 18.0419 7.45916 17.7515 7.06152C17.461 6.66389 16.9719 6.46507 16.284 6.46507C15.749 6.46507 15.2751 6.64094 14.8624 6.9927C14.465 7.34445 14.2051 7.88738 14.0828 8.62148Z\" fill=\"currentColor\" />\n <path d=\"M26.4777 15.8248C25.8969 15.8248 25.4077 15.7331 25.0103 15.5495C24.6128 15.366 24.2918 15.1137 24.0472 14.7925C23.818 14.456 23.6498 14.0584 23.5428 13.5996C23.4358 13.1255 23.3823 12.5978 23.3823 12.0167L23.3823 0L26.7529 0L26.7529 12.1543C26.7529 12.5061 26.814 12.7508 26.9363 12.8884C27.0739 13.0261 27.2114 13.0949 27.349 13.0949C27.4254 13.0949 27.4866 13.0949 27.5324 13.0949C27.5936 13.0949 27.67 13.0796 27.7617 13.049L28.1745 15.5495C27.991 15.626 27.7541 15.6872 27.4637 15.7331C27.1885 15.7942 26.8599 15.8248 26.4777 15.8248Z\" fill=\"currentColor\" />\n <path d=\"M34.3225 15.8248C33.6193 15.8248 33.0155 15.7178 32.5111 15.5036C32.0219 15.2895 31.6168 14.9913 31.2958 14.609C30.9901 14.2266 30.7608 13.7678 30.608 13.2325C30.4704 12.682 30.4016 12.0779 30.4016 11.4202L30.4016 6.80918L28.8424 6.80918V4.30865L30.585 4.17101L30.9748 1.14286L33.7722 1.14286V4.17101L36.5007 4.17101V6.80918L33.7722 6.80918V11.3743C33.7722 12.0167 33.9021 12.4831 34.162 12.7737C34.4371 13.049 34.7963 13.1867 35.2396 13.1867C35.423 13.1867 35.6065 13.1637 35.7899 13.1178C35.9886 13.0719 36.1644 13.0184 36.3173 12.9572L36.8446 15.4119C36.5389 15.5036 36.1797 15.5954 35.767 15.6872C35.3543 15.7789 34.8727 15.8248 34.3225 15.8248Z\" fill=\"currentColor\" />\n <path d=\"M38.7205 15.5495V0L42.0911 0V3.41397L41.9306 5.45568C42.3586 5.07334 42.8554 4.72158 43.4209 4.40042C43.9865 4.06396 44.6591 3.89573 45.4387 3.89573C46.6768 3.89573 47.5711 4.30101 48.1214 5.11157C48.687 5.92214 48.9697 7.04623 48.9697 8.48384V15.5495H45.5992V8.91971C45.5992 8.09385 45.4845 7.52798 45.2553 7.22211C45.0413 6.91623 44.6897 6.7633 44.2005 6.7633C43.7725 6.7633 43.4057 6.8627 43.0999 7.06152C42.7942 7.24505 42.4579 7.51269 42.0911 7.86444V15.5495H38.7205Z\" fill=\"currentColor\" />\n <path d=\"M53.0807 20C52.7291 20 52.431 19.9771 52.1864 19.9312C51.9418 19.9006 51.7049 19.8471 51.4756 19.7706L52.0718 17.2013C52.1788 17.2318 52.3011 17.2624 52.4386 17.293C52.5762 17.3236 52.7061 17.3389 52.8284 17.3389C53.394 17.3389 53.8297 17.2013 54.1354 16.926C54.4411 16.6507 54.6704 16.2913 54.8233 15.8478L54.9837 15.2513L50.6043 4.17101L53.9978 4.17101L55.6258 9.05735C55.7939 9.57734 55.9468 10.105 56.0843 10.6402C56.2219 11.1755 56.3671 11.7261 56.52 12.292H56.6117C56.734 11.7567 56.8563 11.2214 56.9786 10.6861C57.1161 10.1356 57.2537 9.59263 57.3913 9.05735L58.767 4.17101H62L58.0562 15.6642C57.7811 16.383 57.4906 17.0101 57.1849 17.5454C56.8945 18.0959 56.5506 18.5471 56.1531 18.8989C55.771 19.2659 55.3277 19.5412 54.8233 19.7247C54.3341 19.9082 53.7532 20 53.0807 20Z\" fill=\"currentColor\" />\n </svg>\n);\n\ninterface CachedLogoProps {\n logoUrl?: string;\n appName?: string;\n height?: string;\n linkTo?: string;\n}\n\nconst CachedLogo: React.FC<CachedLogoProps> = ({ logoUrl, appName, height = \"28px\", linkTo = \"/\" }) => {\n // Initialize state synchronously from cache or props\n const [logoSrc, setLogoSrc] = useState<string | null>(() => {\n // 1. Try cache first\n const cached = logoCache.getCachedLogo();\n if (cached && (cached.base64Data || cached.url)) {\n return cached.base64Data || cached.url;\n }\n // 2. Fallback to provided URL\n if (logoUrl) {\n return logoUrl;\n }\n return null;\n });\n\n const [hasError, setHasError] = useState<boolean>(false);\n\n // Background update effect\n useEffect(() => {\n if (logoUrl) {\n logoCache.updateInBackground(logoUrl, appName, (newCache: any) => {\n if (newCache.base64Data) {\n setLogoSrc(newCache.base64Data);\n }\n });\n }\n }, [logoUrl, appName]);\n\n // Handle image load error\n const handleImageError = useCallback(() => {\n console.error('Logo failed to load');\n setHasError(true);\n\n // Clear cache if the cached image failed\n const cached = logoCache.getCachedLogo();\n if (cached && logoSrc === cached.base64Data) {\n logoCache.clearCache();\n }\n }, [logoSrc]);\n\n // Handle successful image load\n const handleImageLoad = useCallback(() => {\n setHasError(false);\n }, []);\n\n // Render logo or fallback\n const renderLogo = () => {\n if (hasError || !logoSrc) {\n return <DefaultLogo />;\n }\n\n return (\n <img\n src={logoSrc}\n height={height}\n alt={appName || \"Logo\"}\n onError={handleImageError}\n onLoad={handleImageLoad}\n style={{\n maxHeight: height,\n objectFit: 'contain'\n }}\n />\n );\n };\n\n return (\n <Link to={linkTo} className=\"logo-link\">\n {renderLogo()}\n </Link>\n );\n};\n\nexport default CachedLogo;","import type { ApiConfig } from '../../types';\n\n/**\n * Simple API helper functions that work with config passed from consumer app\n */\n\n/**\n * Get full API URL by combining baseUrl with endpoint\n */\nexport const getApiUrl = (endpoint: string, apiConfig: ApiConfig = {}): string => {\n const baseUrl = apiConfig.baseUrl || '';\n const fullUrl = `${baseUrl}${endpoint}`;\n\n return fullUrl;\n};\n\n/**\n * Get endpoint from API config\n */\nexport const getEndpoint = (endpointKey: string, apiConfig: ApiConfig = {}): string => {\n return apiConfig.endpoints?.[endpointKey] || '';\n};\n\n/**\n * Get API timeout from config\n */\nexport const getApiTimeout = (apiConfig: ApiConfig = {}): number => {\n return apiConfig.timeout || 30000; // Default 30 seconds\n};","/**\n * Builds an API URL with query parameters\n * Ensures the endpoint ends with '/' before adding query parameters\n * Similar to buildApiUrl in pkg-zango-crud\n * @param baseUrl - The base URL (will be normalized to end with /)\n * @param params - Optional query parameters to append\n * @returns The complete URL with query parameters\n */\nexport function buildApiUrl(baseUrl: string, params?: Record<string, string>): string {\n if (!baseUrl) return '/';\n\n // Split existing URL and query parts\n const [urlPart, existingQuery] = baseUrl.split('?');\n\n // Ensure the URL ends with '/' (remove trailing slashes first, then add one)\n const normalizedUrl = urlPart.replace(/\\/+$/, '') + '/';\n\n // Combine all query parameters\n const allParams = new URLSearchParams();\n\n // Add existing query parameters if any\n if (existingQuery) {\n const existingParams = new URLSearchParams(existingQuery);\n existingParams.forEach((value, key) => {\n allParams.set(key, value);\n });\n }\n\n // Add new parameters if provided\n if (params && Object.keys(params).length > 0) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== null && value !== undefined) {\n allParams.set(key, String(value));\n }\n });\n }\n\n // Build final URL\n const queryString = allParams.toString();\n return queryString ? `${normalizedUrl}?${queryString}` : normalizedUrl;\n}","import { getApiUrl } from '../framework/utils/apiHelpers';\nimport { buildApiUrl } from '../framework/utils/apiUrlUtils';\n\n// Base URL from helper\nconst baseURL = \"\";\n\n// Cookie utility function\nfunction getCookie(name: string): string | null {\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n const [key, value] = cookie.split(\"=\");\n if (key === name) {\n return decodeURIComponent(value);\n }\n }\n return null;\n}\n\n// Wait for auth token utility - COMMENTED OUT FOR NOW\n// const waitForToken = (\n// timeout = 5000, // max time to wait\n// poll = 100 // how often to check\n// ) =>\n// new Promise((resolve, reject) => {\n// const start = Date.now();\n// const id = setInterval(() => {\n// const tok = localStorage.getItem('auth') || sessionStorage.getItem('auth');\n// if (tok) {\n// clearInterval(id);\n// resolve(tok);\n// } else if (Date.now() - start >= timeout) {\n// clearInterval(id);\n// reject(new Error('Token not found in time'));\n// }\n// }, poll);\n// });\n\n// Build auth headers - simplified version without token waiting\nconst buildAuthHeaders = async () => {\n // const token = localStorage.getItem('auth') || sessionStorage.getItem('auth');\n // if (token) {\n // return { Authorization: `Bearer ${token}` };\n // }\n // No token available – fall back to CSRF header\n return { 'X-Csrftoken': getCookie('csrftoken') };\n};\n\n// API response interface\n// export interface ApiResponse<T = unknown> {\n// response: T;\n// success: boolean;\n// responseStatus: number;\n// }\n\n// Core HTTP function for GET requests\nexport const callGetApi = async ({ fullUrl }) => {\n // Add timestamp to prevent caching issues\n const url = `${baseURL}${fullUrl}${\n fullUrl.includes(\"?\") ? \"&\" : \"?\"\n }_t=${Date.now()}`;\n\n const request = await fetch(url, {\n method: \"GET\",\n redirect: \"follow\",\n headers: {\n ...(await buildAuthHeaders()),\n \"Content-Type\": \"application/json\",\n },\n });\n \n return request;\n};\n\n// Core HTTP function for POST requests\nexport const callPostApi = async ({\n fullUrl,\n payload,\n}) => {\n const request = await fetch(baseURL + fullUrl, {\n method: \"POST\",\n redirect: \"follow\",\n headers: {\n ...(await buildAuthHeaders()),\n ...(!(payload instanceof FormData) && {\n \"Content-Type\": \"application/json\",\n }),\n },\n body: payload instanceof FormData ? payload : JSON.stringify(payload),\n });\n return request;\n};\n\n// Core HTTP function for PUT requests\nexport const callPutApi = async ({\n fullUrl,\n payload,\n}) => {\n const request = await fetch(baseURL + fullUrl, {\n method: \"PUT\",\n redirect: \"follow\",\n headers: {\n ...(await buildAuthHeaders()),\n ...(!(payload instanceof FormData) && {\n \"Content-Type\": \"application/json\",\n }),\n },\n body: payload instanceof FormData ? payload : JSON.stringify(payload),\n });\n return request;\n};\n\n// Core HTTP function for DELETE requests\nexport const callDeleteApi = async ({ fullUrl, payload }) => {\n const request = await fetch(baseURL + fullUrl, {\n method: \"DELETE\",\n redirect: \"follow\",\n headers: {\n ...(await buildAuthHeaders()),\n \"Content-Type\": \"application/json\",\n },\n body: payload instanceof FormData ? payload : JSON.stringify(payload),\n });\n return request;\n};\n\n// Core HTTP function for PATCH requests\nexport const callPatchApi = async ({\n fullUrl,\n payload,\n}) => {\n const request = await fetch(baseURL + fullUrl, {\n method: \"PATCH\",\n redirect: \"follow\",\n headers: {\n ...(await buildAuthHeaders()),\n ...(!(payload instanceof FormData) && {\n \"Content-Type\": \"application/json\",\n }),\n },\n body: payload instanceof FormData ? payload : JSON.stringify(payload),\n });\n return request;\n};\n\n// ApiDetails type definition\n// export type ApiDetails = {\n// url: string;\n// type: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n// payload?: unknown;\n// loader?: boolean;\n// };\n\n// Direct API calling function\nexport const callApi = async (apiDetails) => {\n let apiRequest;\n\n try {\n // Use the getApiUrl helper to construct full URL\n const fullUrl = getApiUrl(apiDetails.url);\n\n switch (apiDetails.type) {\n case 'POST':\n apiRequest = await callPostApi({\n fullUrl,\n payload: apiDetails.payload,\n });\n break;\n case 'PUT':\n apiRequest = await callPutApi({\n fullUrl,\n payload: apiDetails.payload,\n });\n break;\n case 'PATCH':\n apiRequest = await callPatchApi({\n fullUrl,\n payload: apiDetails.payload,\n });\n break;\n case 'DELETE':\n apiRequest = await callDeleteApi({\n fullUrl,\n payload: apiDetails.payload,\n });\n break;\n case 'GET':\n default:\n apiRequest = await callGetApi({\n fullUrl,\n });\n }\n\n if (apiRequest.status === 200) {\n try {\n const response = await apiRequest.json();\n\n return {\n response: response.response,\n success: true,\n responseStatus: apiRequest.status,\n };\n } catch (error) {\n return {\n response: { message: 'Server Error' },\n success: false,\n responseStatus: apiRequest.status,\n };\n }\n } else {\n const response = await apiRequest.json();\n\n return {\n response: response.response || { message: \"Server Error\" },\n success: false,\n responseStatus: apiRequest.status,\n };\n }\n } catch (error) {\n console.error('API Request Error:', error);\n\n return {\n response: { message: 'Network Error' },\n success: false,\n responseStatus: 500,\n };\n }\n};\n\n// Helper function to generate query string\nexport const generateQueryString = (params) => {\n if (!params || Object.keys(params).length === 0) {\n return '';\n }\n \n const queryParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n \n const queryString = queryParams.toString();\n return queryString ? `?${queryString}` : '';\n};\n\n// =============================================================================\n// API ENDPOINT DEFINITIONS\n// =============================================================================\n\n// App Initialization Endpoints\nexport const getAppInitData = () => {\n // Use the helper function to get dynamic endpoint\n const getAppInitializerEndpoint = () => {\n // 1. Check global window variable (set by Django template)\n if (typeof window !== 'undefined' && window.app_initializer_endpoint) {\n return window.app_initializer_endpoint;\n }\n\n // 2. Check environment variable (for development)\n // if (import.meta.env.VITE_APP_INITIALIZER_ENDPOINT) {\n // return import.meta.env.VITE_APP_INITIALIZER_ENDPOINT;\n // }\n\n // 3. Default fallback\n return '/app/initializer';\n };\n\n const endpoint = getAppInitializerEndpoint();\n\n // Ensure endpoint starts with / for proper API URL construction\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n\n return {\n url: buildApiUrl(normalizedEndpoint),\n type: \"GET\",\n };\n};\n\n// Profile Management Endpoints\nexport const getUserProfile = () => ({\n url: buildApiUrl(`/api/v1/profile`),\n type: \"GET\",\n});\n\nexport const updateUserProfile = (payload: any) => ({\n url: buildApiUrl(`/api/v1/profile`),\n type: \"PUT\",\n payload,\n});\n\nexport const uploadProfilePhoto = (payload: any) => ({\n url: buildApiUrl(`/api/v1/profile/photo`),\n type: \"POST\",\n payload,\n});\n\nexport const changePassword = (payload: any) => ({\n url: buildApiUrl(`/api/v1/appauth/password/change/`),\n type: \"PUT\",\n payload,\n});\n\nexport const toggleTwoFactor = (payload: any) => ({\n url: buildApiUrl(`/api/v1/profile/two-factor`),\n type: \"POST\",\n payload,\n});\n\nexport const switchRole = (roleId: string) => ({\n url: buildApiUrl(`/api/v1/appauth/role/switch/?role=${encodeURIComponent(roleId)}`),\n type: \"POST\",\n});\n\n// Session Management Endpoints\nexport const getUserSessions = () => ({\n url: buildApiUrl(`/api/v1/appauth/sessions/`),\n type: \"GET\",\n});\n\nexport const logoutSession = (sessionId: number) => ({\n url: buildApiUrl(`/api/v1/appauth/sessions/`),\n type: \"DELETE\",\n payload: {\n sessions: [sessionId]\n }\n});\n\nexport const logoutAllSessions = (sessionIds: number[]) => ({\n url: buildApiUrl(`/api/v1/appauth/sessions/`),\n type: \"DELETE\",\n payload: {\n sessions: sessionIds\n }\n});\n\n// Authentication Endpoints\nexport const logout = () => ({\n url: buildApiUrl(`/api/v1/appauth/logout`),\n type: \"DELETE\",\n});\n\nexport const performLogout = () => ({\n url: buildApiUrl(`/logout`),\n type: \"POST\",\n});\n\n// Session Security Endpoints\nexport const pingSessionSecurity = (pingUrl: string, idleFor: number) => ({\n url: buildApiUrl(`${pingUrl}${pingUrl.includes('?') ? '&' : '?'}idleFor=${idleFor}`),\n type: \"GET\",\n});\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS (Direct calling)\n// =============================================================================\n\n// Direct calling convenience functions that wrap callApi\nexport const fetchAppInitData = async () => {\n return callApi(getAppInitData());\n};\n\nexport const fetchUserProfile = async () => {\n return callApi(getUserProfile());\n};\n\nexport const fetchUserSessions = async () => {\n return callApi(getUserSessions());\n};\n\nexport const saveUserProfile = async (data: any) => {\n return callApi(updateUserProfile(data));\n};\n\nexport const uploadPhoto = async (formData: any) => {\n return callApi(uploadProfilePhoto(formData));\n};\n\nexport const updatePassword = async (passwordData: any) => {\n return callApi(changePassword(passwordData));\n};\n\nexport const setTwoFactor = async (enabled: boolean) => {\n return callApi(toggleTwoFactor({ enabled }));\n};\n\nexport const changeRole = async (roleId: string) => {\n return callApi(switchRole(roleId));\n};\n\nexport const removeSession = async (sessionId: number) => {\n return callApi(logoutSession(sessionId));\n};\n\nexport const removeAllSessions = async (sessionIds: number[]) => {\n return callApi(logoutAllSessions(sessionIds));\n};\n\nexport const performAppLogout = async () => {\n return callApi(logout());\n};\n\nexport const performDirectLogout = async () => {\n return callApi(performLogout());\n};\n\nexport const pingSession = async (pingUrl: string, idleFor: number) => {\n return callApi(pingSessionSecurity(pingUrl, idleFor));\n};","// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n color = color ? color : \"\";\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) this._r = Math.round(this._r);\n if (this._g < 1) this._g = Math.round(this._g);\n if (this._b < 1) this._b = Math.round(this._b);\n this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = Math.round(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = Math.round(hsv.h * 360),\n s = Math.round(hsv.s * 100),\n v = Math.round(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = Math.round(hsl.h * 360),\n s = Math.round(hsl.s * 100),\n l = Math.round(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return \"#\" + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return \"#\" + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: Math.round(this._r),\n g: Math.round(this._g),\n b: Math.round(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n // Disabled until https://github.com/bgrins/TinyColor/issues/254\n // polyad: function (number) {\n // return this._applyCombination(polyad, [number]);\n // },\n triad: function triad() {\n return this._applyCombination(polyad, [3]);\n },\n tetrad: function tetrad() {\n return this._applyCombination(polyad, [4]);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n if (_typeof(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) return false;\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n return tinycolor.fromRatio({\n r: Math.random(),\n g: Math.random(),\n b: Math.random()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n if (isNaN(number) || number <= 0) {\n throw new Error(\"Argument to polyad must be a positive number\");\n }\n var hsl = tinycolor(color).toHsl();\n var result = [tinycolor(color)];\n var step = 360 / number;\n for (var i = 1; i < number; i++) {\n result.push(tinycolor({\n h: (hsl.h + i * step) % 360,\n s: hsl.s,\n l: hsl.l\n }));\n }\n return result;\n}\nfunction _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n}\nfunction _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\nfunction _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n// tinycolor.isReadable(\"#000\", \"#111\") => false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n level: level,\n size: size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// <https://www.w3.org/TR/css-color-4/#named-colors>\nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) n = \"100%\";\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == \"transparent\") {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n a: convertHexToDecimal(match[4] + \"\" + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n}\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n level: \"AA\",\n size: \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n level: level,\n size: size\n };\n}\n\nexport { tinycolor as default };\n","import tinycolor from 'tinycolor2';\n\ninterface ColorPalette {\n 25: string;\n 50: string;\n 100: string;\n 200: string;\n 300: string;\n 400: string;\n 500: string;\n 600: string;\n 700: string;\n 800: string;\n 900: string;\n 950: string;\n}\n\ninterface ThemeColors {\n primary: string;\n success: string;\n warning: string;\n gray: string;\n error: string;\n}\n\ninterface ThemeConfig {\n colors: ThemeColors;\n typography?: Record<string, string>;\n borders?: Record<string, string>;\n shadows?: Record<string, string>;\n spacing?: Record<string, number>;\n}\n\n/**\n * Generate a complete color palette from a base color\n */\nexport const generatePalette = (baseColor: string): ColorPalette => ({\n 25: tinycolor.mix(baseColor, '#FFFFFF', 95).toHexString(),\n 50: tinycolor.mix(baseColor, '#FFFFFF', 90).toHexString(),\n 100: tinycolor.mix(baseColor, '#FFFFFF', 80).toHexString(),\n 200: tinycolor.mix(baseColor, '#FFFFFF', 65).toHexString(),\n 300: tinycolor.mix(baseColor, '#FFFFFF', 50).toHexString(),\n 400: tinycolor.mix(baseColor, '#FFFFFF', 30).toHexString(),\n 500: tinycolor(baseColor).toHexString(),\n 600: tinycolor.mix(baseColor, '#000000', 10).toHexString(),\n 700: tinycolor.mix(baseColor, '#000000', 20).toHexString(),\n 800: tinycolor.mix(baseColor, '#000000', 30).toHexString(),\n 900: tinycolor.mix(baseColor, '#000000', 45).toHexString(),\n 950: tinycolor.mix(baseColor, '#000000', 60).toHexString(),\n});\n\n/**\n * Generate CSS variables from theme configuration\n */\nexport const generateCSSVariables = (theme: ThemeConfig): string => {\n let css = '';\n\n const palettes = {\n brand: generatePalette(theme.colors.primary),\n success: generatePalette(theme.colors.success),\n warning: generatePalette(theme.colors.warning),\n gray: generatePalette(theme.colors.gray),\n error: generatePalette(theme.colors.error)\n };\n\n css = Object.entries(palettes).map(([group, values]) =>\n Object.entries(values).map(([shade, hex]) => `--color-${group}-${shade}: ${hex}`).join('; \\n')\n ).join(';');\n\n // Typography variables\n if (theme?.typography) {\n Object.entries(theme.typography).forEach(([key, value]) => {\n const cssKey = key.replace(/_/g, '-');\n css += `--${cssKey}: ${value}; `;\n });\n }\n\n // Border radius variables\n if (theme?.borders) {\n Object.entries(theme.borders).forEach(([key, value]) => {\n const cssKey = key.replace(/_/g, '-');\n css += `--${cssKey}: ${value}; `;\n });\n }\n\n // Shadow variables\n if (theme?.shadows) {\n Object.entries(theme.shadows).forEach(([key, value]) => {\n const cssKey = key.replace(/_/g, '-');\n css += `--shadow-${cssKey}: ${value}; `;\n });\n }\n\n // Spacing variables\n if (theme?.spacing) {\n Object.entries(theme.spacing).forEach(([key, value]) => {\n css += `--spacing-${key}: ${value}px; `;\n });\n }\n\n return css;\n};\n\n/**\n * Check if a color is light or dark\n */\nexport const isLightColor = (color: string): boolean => {\n return tinycolor(color).isLight();\n};\n\n/**\n * Get contrast color (black or white) based on background\n */\nexport const getContrastColor = (bgColor: string): string => {\n return isLightColor(bgColor) ? '#000000' : '#FFFFFF';\n};\n\n/**\n * Get a specific color hex code from CSS custom properties\n * @example\n * getColor('brand', 500) // Returns '#5048ED'\n * getColor('success', '100') // Returns '#CCF3E3'\n */\nexport const getColor = (colorName: string, shade: string | number = 500): string => {\n // Construct the CSS variable name\n const cssVarName = `--color-${colorName}-${shade}`;\n\n // Get the computed value from the root element\n if (typeof window !== 'undefined' && window.getComputedStyle) {\n const rootStyles = window.getComputedStyle(document.documentElement);\n const colorValue = rootStyles.getPropertyValue(cssVarName).trim();\n\n // Return the actual color value if found\n if (colorValue) {\n return colorValue;\n }\n }\n\n // Fallback: try to generate the color if we have the theme colors\n const rootElement = document.documentElement;\n const primaryColor = rootElement.style.getPropertyValue('--color-brand-500') || '#5048ED';\n const successColor = rootElement.style.getPropertyValue('--color-success-500') || '#10B981';\n const errorColor = rootElement.style.getPropertyValue('--color-error-500') || '#F04438';\n const warningColor = rootElement.style.getPropertyValue('--color-warning-500') || '#F59E0B';\n const grayColor = rootElement.style.getPropertyValue('--color-gray-500') || '#6B7280';\n\n // Generate palette on the fly if needed\n const colorMap: Record<string, string> = {\n brand: primaryColor,\n success: successColor,\n error: errorColor,\n warning: warningColor,\n gray: grayColor\n };\n\n if (colorMap[colorName]) {\n const palette = generatePalette(colorMap[colorName]);\n return palette[shade as keyof ColorPalette] || colorMap[colorName];\n }\n\n // Default fallback\n return '#5048ED';\n};","import { useLocation } from 'react-router-dom';\nimport { useAppContext } from '../contexts/AppContext';\nimport { getApiUrl } from './apiHelpers';\nimport type { ApiConfig, RouteConfig, ApiRequestConfig } from '../../types';\n\n/**\n * Get base URL from context API config\n */\nexport const getBaseUrl = (apiConfig: ApiConfig = {}): string => {\n return apiConfig.baseUrl || '';\n};\n\n/**\n * Build full API URL using context config\n */\nexport const buildApiUrl = (endpoint: string, apiConfig: ApiConfig = {}): string => {\n if (!endpoint) return getBaseUrl(apiConfig);\n\n // If endpoint is already a full URL, return it\n if (endpoint.startsWith('http://') || endpoint.startsWith('https://')) {\n return endpoint;\n }\n\n const fullUrl = getApiUrl(endpoint, apiConfig);\n\n return fullUrl;\n};\n\n/**\n * Hook to get API configuration for the current route\n * Automatically finds the route config based on current location\n */\nexport const useApiConfig = (): ApiRequestConfig => {\n const location = useLocation();\n const { routes, apiConfig } = useAppContext();\n\n // Get entity from URL (first segment after /)\n const pathSegments = location.pathname.split('/').filter(Boolean);\n const entity = pathSegments[0];\n\n // Sort routes by path length (descending) to match most specific routes first\n const sortedRoutes = [...routes].sort((a, b) => b.path.length - a.path.length);\n\n // Find the route configuration\n let routeConfig: RouteConfig | null = null;\n\n for (const route of sortedRoutes) {\n // 1. Try exact match\n if (route.path === location.pathname) {\n routeConfig = route;\n break;\n }\n\n // 2. Try pattern match with parameters (e.g., /app/profile360/:entityType/:id)\n if (route.path?.includes(':')) {\n const pattern = route.path.replace(/:[^/]+/g, '[^/]+');\n if (location.pathname.match(new RegExp(`^${pattern}$`))) {\n routeConfig = route;\n break;\n }\n }\n\n // 3. Try parent route match (e.g., /app/patients matches /app/patients/detail-view/123)\n if (location.pathname.startsWith(route.path + '/')) {\n routeConfig = route;\n break;\n }\n }\n\n // Get config from route\n const config = routeConfig?.extra_params || {};\n\n return {\n baseUrl: getBaseUrl(apiConfig),\n apiUrl: config.api_endpoint || '',\n fullUrl: buildApiUrl(config.api_endpoint || '', apiConfig),\n headers: config.headers || {},\n entity,\n ...config\n };\n};\n\n/**\n * Hook to get the full route configuration for the current route\n * Returns the complete RouteConfig object that matches the current location\n */\nexport const useRouteConfig = (): RouteConfig | null => {\n const location = useLocation();\n const { routes } = useAppContext();\n\n // Sort routes by path length (descending) to match most specific routes first\n const sortedRoutes = [...routes].sort((a, b) => b.path.length - a.path.length);\n\n // Find the route configuration using the same logic as useApiConfig\n for (const route of sortedRoutes) {\n // 1. Try exact match\n if (route.path === location.pathname) {\n return route;\n }\n\n // 2. Try pattern match with parameters (e.g., /app/profile360/:entityType/:id)\n if (route.path?.includes(':')) {\n const pattern = route.path.replace(/:[^/]+/g, '[^/]+');\n if (location.pathname.match(new RegExp(`^${pattern}$`))) {\n return route;\n }\n }\n\n // 3. Try parent route match (e.g., /app/patients matches /app/patients/detail-view/123)\n if (location.pathname.startsWith(route.path + '/')) {\n return route;\n }\n }\n\n return null;\n};\n\n/**\n * Simple function to get API config when you already know the endpoint\n */\nexport const getApiConfig = (\n endpoint: string,\n apiConfig: ApiConfig = {},\n options: Record<string, any> = {}\n): ApiRequestConfig => {\n return {\n baseUrl: getBaseUrl(apiConfig),\n apiUrl: endpoint,\n fullUrl: buildApiUrl(endpoint, apiConfig),\n headers: options.headers || {},\n ...options\n };\n};","import { CrudHandler } from \"@zango-core/crud/table\";\nimport { useApiConfig } from \"../utils/apiConfigHelper\";\n\ninterface CrudPageProps {\n basePath?: string;\n}\n\nconst CrudPage: React.FC<CrudPageProps> = ({ basePath }) => {\n // Get API configuration using the simplified hook\n const apiConfig = useApiConfig();\n\n return (\n <div className=\"page-container\" style={{ height: \"100%\" }}>\n <CrudHandler api_endpoint={apiConfig.apiUrl} />\n </div>\n );\n};\n\nexport default CrudPage;\n","import React from \"react\";\nimport { useApiConfig } from \"../utils/apiConfigHelper\";\n\ninterface TrainingPageProps {\n basePath?: string;\n}\n\nconst TrainingPage: React.FC<TrainingPageProps> = ({ basePath }) => {\n // Get API configuration using the simplified hook\n const apiConfig = useApiConfig();\n\n // Dynamic import for build-time bundling without circular dependency\n const [TrainingRouter, setTrainingRouter] = React.useState<React.ComponentType | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n const loadTrainingRouter = async () => {\n try {\n // This import will be resolved at build time for the Django bundle\n // but won't create circular dependencies during development\n const trainingModule = await import(\"@zango-core/training\");\n setTrainingRouter(() => trainingModule.TrainingRouter);\n } catch (err) {\n console.error(\"Failed to load training module:\", err);\n setError(\"Training module could not be loaded\");\n }\n };\n\n loadTrainingRouter();\n }, []);\n\n if (error) {\n return (\n <div className=\"page-container\" style={{ height: \"100%\", padding: \"20px\" }}>\n <div className=\"error-message\">\n <h3>Training Module Error</h3>\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n if (!TrainingRouter) {\n return (\n <div className=\"page-container\" style={{ height: \"100%\", padding: \"20px\" }}>\n <div className=\"loading-spinner\">Loading training module...</div>\n </div>\n );\n }\n\n return (\n <div className=\"page-container\" style={{ height: \"100%\" }}>\n <TrainingRouter />\n </div>\n );\n};\n\nexport default TrainingPage;\n","/**\n * Page-to-Package Mapping System\n *\n * Defines which @zango-core packages each page type requires and handles\n * dynamic loading of pages based on their dependencies.\n */\n\nimport React from 'react';\n\n// Import all framework pages statically\nimport CrudPage from '../pages/CrudPage';\nimport TrainingPage from '../pages/TrainingPage';\n// import WorkflowPage from '../pages/WorkflowPage';\n// import DashboardPage from '../pages/DashboardPage';\n\n// Centralized page configuration - UPDATE THIS SINGLE OBJECT TO ADD/REMOVE/UPDATE PACKAGES\nexport const PAGE_CONFIG = {\n crud: {\n requiredPackage: '@zango-core/crud',\n component: CrudPage,\n },\n training: {\n requiredPackage: '@zango-core/training',\n component: TrainingPage,\n },\n // Add more page types here as they become available...\n // workflow: {\n // requiredPackage: '@zango-core/workflow',\n // component: WorkflowPage,\n // },\n // dashboard: {\n // requiredPackage: '@zango-core/dashboard',\n // component: DashboardPage,\n // },\n} as const;\n\n// Auto-generated types and objects from the centralized config\nexport type PageTypeName = keyof typeof PAGE_CONFIG;\nexport type ZangoPackageName = PageTypeName; // Package name is same as page type key\n\n// Auto-generate ZANGO_PACKAGES from config (for @zango-core package imports - these are still dynamic)\nexport const ZANGO_PACKAGES = Object.fromEntries(\n Object.entries(PAGE_CONFIG).map(([pageType, config]) => [\n pageType, // Use page type as package name\n () => import(/* @vite-ignore */ config.requiredPackage)\n ])\n) as Record<ZangoPackageName, () => Promise<any>>;\n\n// Auto-generate PAGE_PACKAGE_DEPENDENCIES from config (each page depends on itself)\nexport const PAGE_PACKAGE_DEPENDENCIES = Object.fromEntries(\n Object.keys(PAGE_CONFIG).map(pageType => [\n pageType,\n [pageType] // Each page requires its own package\n ])\n) as Record<string, ZangoPackageName[]>;\n\n// Static framework pages (already imported)\nexport const FRAMEWORK_PAGES = Object.fromEntries(\n Object.entries(PAGE_CONFIG).map(([pageType, config]) => [\n pageType,\n config.component\n ])\n) as Record<string, React.ComponentType<any>>;\n\nexport type FrameworkPageType = keyof typeof FRAMEWORK_PAGES;\n\n/**\n * Simple approach: If backend sends a page_type, assume package is installed\n * Return all requested page types - let runtime handle any failures gracefully\n */\nexport const getAvailablePageTypes = (requestedPageTypes: string[]): string[] => {\n // Simple: return all requested page types that are in our config\n return requestedPageTypes.filter(pageType => pageType in FRAMEWORK_PAGES);\n};\n\n/**\n * Get static framework page component (no lazy loading needed since they're already imported)\n */\nexport const getFrameworkPageComponent = (pageType: FrameworkPageType): React.ComponentType<any> | null => {\n const component = FRAMEWORK_PAGES[pageType];\n return component || null;\n};\n\n// Removed complex package detection - keeping it simple!","import React, { useState } from 'react';\n\ninterface CustomPageFallbackProps {\n componentName?: string;\n customPagesDir?: string;\n fileExtension?: string;\n}\n\nconst CustomPageFallback: React.FC<CustomPageFallbackProps> = ({\n componentName,\n customPagesDir = 'src/custom/pages',\n fileExtension = 'js'\n}) => {\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const copyToClipboard = (text: string, index: number) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n });\n };\n\n const exampleComponentName = componentName || 'MyCustomPage';\n const dirPath = customPagesDir;\n const ext = fileExtension;\n\n const componentCode = `import React from 'react';\n\nconst ${exampleComponentName} = () => {\n return (\n <div style={{ padding: '24px' }}>\n <h1>${exampleComponentName}</h1>\n <p>Welcome to your custom page!</p>\n {/* Add your custom content here */}\n </div>\n );\n};\n\nexport default ${exampleComponentName};`;\n\n const mainIndexExportCode = `// ${dirPath}/index.${ext}\n// Export all custom pages here\nexport { default as ${exampleComponentName} } from './${exampleComponentName}';`;\n\n const appJsCode = `import React from 'react';\nimport { ZangoApp } from '@zango-core/crm-framework';\nimport * as customPages from './custom/pages';\nimport { Toaster } from '@zango-core/components';\n\nconst App = () => {\n return (\n <>\n <ZangoApp\n appInitializerEndpoint={<app_init_endpoint>}\n customPages={customPages}\n />\n <Toaster position=\"bottom-right\" />\n </>\n )\n};\n\nexport default App;`;\n\n const mkdirCommand = `mkdir -p ${dirPath}`;\n\n const styles = {\n container: {\n padding: '32px',\n maxWidth: '900px',\n margin: '0 auto',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n },\n header: {\n marginBottom: '24px',\n borderBottom: '2px solid #e5e7eb',\n paddingBottom: '16px'\n },\n title: {\n fontSize: '28px',\n fontWeight: '600',\n color: '#111827',\n marginBottom: '8px'\n },\n subtitle: {\n fontSize: '16px',\n color: '#6b7280',\n marginTop: '8px'\n },\n errorBox: {\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: '8px',\n padding: '16px',\n marginBottom: '24px'\n },\n errorText: {\n color: '#dc2626',\n fontWeight: '500',\n fontSize: '15px'\n },\n setupGuide: {\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n padding: '24px',\n marginBottom: '24px'\n },\n sectionTitle: {\n fontSize: '20px',\n fontWeight: '600',\n color: '#111827',\n marginBottom: '16px',\n marginTop: '0'\n },\n stepTitle: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#374151',\n marginBottom: '12px',\n marginTop: '20px'\n },\n stepList: {\n paddingLeft: '24px',\n color: '#4b5563',\n lineHeight: '1.8'\n },\n codeBlock: {\n position: 'relative' as const,\n marginTop: '12px',\n marginBottom: '20px'\n },\n pre: {\n backgroundColor: '#1f2937',\n color: '#f9fafb',\n padding: '16px',\n borderRadius: '6px',\n overflow: 'auto',\n fontSize: '14px',\n lineHeight: '1.6',\n margin: '0',\n fontFamily: '\"Fira Code\", \"Cascadia Code\", Consolas, Monaco, \"Courier New\", monospace'\n },\n copyButton: {\n position: 'absolute' as const,\n top: '8px',\n right: '8px',\n backgroundColor: '#374151',\n color: '#f9fafb',\n border: 'none',\n borderRadius: '4px',\n padding: '6px 12px',\n fontSize: '12px',\n cursor: 'pointer',\n fontWeight: '500',\n transition: 'background-color 0.2s'\n },\n copyButtonHover: {\n backgroundColor: '#4b5563'\n },\n copiedButton: {\n backgroundColor: '#10b981'\n },\n inlineCode: {\n backgroundColor: '#f3f4f6',\n color: '#1f2937',\n padding: '2px 6px',\n borderRadius: '3px',\n fontSize: '14px',\n fontFamily: 'monospace'\n },\n note: {\n backgroundColor: '#eff6ff',\n border: '1px solid #bfdbfe',\n borderRadius: '6px',\n padding: '12px 16px',\n marginTop: '16px',\n fontSize: '14px',\n color: '#1e40af'\n }\n };\n\n return (\n <div style={styles.container}>\n <div style={styles.header}>\n <h1 style={styles.title}>Custom Page Setup Guide</h1>\n <p style={styles.subtitle}>\n Follow the steps below to create your custom page component\n </p>\n </div>\n\n <div style={styles.errorBox}>\n <p style={styles.errorText}>\n ⚠️ Custom page component \"{exampleComponentName}\" could not be loaded\n </p>\n <p style={{ fontSize: '13px', color: '#991b1b', marginTop: '8px', marginBottom: '0' }}>\n Expected location: <code style={{ ...styles.inlineCode, backgroundColor: '#fee2e2', color: '#991b1b' }}>{dirPath}/{exampleComponentName}.{ext}</code>\n </p>\n </div>\n\n <div style={styles.setupGuide}>\n <h2 style={styles.sectionTitle}>📋 Quick Setup Steps</h2>\n\n <ol style={styles.stepList}>\n <li>Create the custom pages directory structure</li>\n <li>Create your component file with the required code</li>\n <li>Export your component from the main index file</li>\n <li>Ensure your App.js imports and passes customPages to ZangoApp</li>\n <li>Refresh the browser to load your new page</li>\n </ol>\n\n <h3 style={styles.stepTitle}>Step 1: Create Directory Structure</h3>\n <p style={{ color: '#4b5563', marginBottom: '12px' }}>\n First, ensure the custom pages directory exists. Run this command in your terminal:\n </p>\n <div style={styles.codeBlock}>\n <button\n style={{\n ...styles.copyButton,\n ...(copiedIndex === 0 ? styles.copiedButton : {})\n }}\n onClick={() => copyToClipboard(mkdirCommand, 0)}\n onMouseEnter={(e) => {\n if (copiedIndex !== 0) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#4b5563';\n }\n }}\n onMouseLeave={(e) => {\n if (copiedIndex !== 0) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#374151';\n }\n }}\n >\n {copiedIndex === 0 ? '✓ Copied!' : 'Copy'}\n </button>\n <pre style={styles.pre}>{mkdirCommand}</pre>\n </div>\n <p style={{ fontSize: '13px', color: '#6b7280', marginTop: '8px' }}>\n This creates the directory where all your custom page components will live.\n </p>\n\n <h3 style={styles.stepTitle}>Step 2: Create Your Component File</h3>\n <p style={{ color: '#4b5563', marginBottom: '12px' }}>\n Create a new file at <code style={styles.inlineCode}>{dirPath}/{exampleComponentName}.{ext}</code> and paste this code:\n </p>\n <div style={styles.codeBlock}>\n <button\n style={{\n ...styles.copyButton,\n ...(copiedIndex === 1 ? styles.copiedButton : {})\n }}\n onClick={() => copyToClipboard(componentCode, 1)}\n onMouseEnter={(e) => {\n if (copiedIndex !== 1) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#4b5563';\n }\n }}\n onMouseLeave={(e) => {\n if (copiedIndex !== 1) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#374151';\n }\n }}\n >\n {copiedIndex === 1 ? '✓ Copied!' : 'Copy'}\n </button>\n <pre style={styles.pre}>{componentCode}</pre>\n </div>\n <p style={{ fontSize: '13px', color: '#6b7280', marginTop: '8px' }}>\n This is a basic React component. You can customize it with your own content, styles, and logic.\n </p>\n\n <h3 style={styles.stepTitle}>Step 3: Export from Main Index File</h3>\n <p style={{ color: '#4b5563', marginBottom: '12px' }}>\n Add your component export to <code style={styles.inlineCode}>{dirPath}/index.{ext}</code>:\n </p>\n <div style={styles.codeBlock}>\n <button\n style={{\n ...styles.copyButton,\n ...(copiedIndex === 2 ? styles.copiedButton : {})\n }}\n onClick={() => copyToClipboard(mainIndexExportCode, 2)}\n onMouseEnter={(e) => {\n if (copiedIndex !== 2) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#4b5563';\n }\n }}\n onMouseLeave={(e) => {\n if (copiedIndex !== 2) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#374151';\n }\n }}\n >\n {copiedIndex === 2 ? '✓ Copied!' : 'Copy'}\n </button>\n <pre style={styles.pre}>{mainIndexExportCode}</pre>\n </div>\n <p style={{ fontSize: '13px', color: '#6b7280', marginTop: '8px' }}>\n The index file exports all custom pages, making them available to the ZangoApp component.\n </p>\n\n <h3 style={styles.stepTitle}>Step 4: Verify App.js Configuration</h3>\n <p style={{ color: '#4b5563', marginBottom: '12px' }}>\n Ensure your <code style={styles.inlineCode}>App.js</code> imports custom pages and passes them to <code style={styles.inlineCode}>ZangoApp</code>:\n </p>\n <div style={styles.codeBlock}>\n <button\n style={{\n ...styles.copyButton,\n ...(copiedIndex === 3 ? styles.copiedButton : {})\n }}\n onClick={() => copyToClipboard(appJsCode, 3)}\n onMouseEnter={(e) => {\n if (copiedIndex !== 3) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#4b5563';\n }\n }}\n onMouseLeave={(e) => {\n if (copiedIndex !== 3) {\n (e.target as HTMLButtonElement).style.backgroundColor = '#374151';\n }\n }}\n >\n {copiedIndex === 3 ? '✓ Copied!' : 'Copy'}\n </button>\n <pre style={styles.pre}>{appJsCode}</pre>\n </div>\n <div style={{\n backgroundColor: '#fef3c7',\n border: '1px solid #fcd34d',\n borderRadius: '6px',\n padding: '12px 16px',\n marginTop: '12px',\n fontSize: '13px',\n color: '#92400e'\n }}>\n <strong>⚠️ Important:</strong> The <code style={{ ...styles.inlineCode, backgroundColor: '#fde68a', color: '#78350f' }}>customPages</code> prop is required for ZangoApp to load your custom page components.\n </div>\n\n <h3 style={styles.stepTitle}>Step 5: Refresh Your Browser</h3>\n <p style={{ color: '#4b5563', marginBottom: '12px' }}>\n After saving all files, refresh your browser to load the new component. The custom page should now appear without errors.\n </p>\n\n <div style={styles.note}>\n <strong>💡 Quick Reference:</strong>\n <br />\n <div style={{ marginTop: '8px', lineHeight: '2' }}>\n <strong>Component file:</strong> <code style={{ ...styles.inlineCode, marginLeft: '4px' }}>{dirPath}/{exampleComponentName}.{ext}</code>\n <br />\n <strong>Export name:</strong> <code style={{ ...styles.inlineCode, marginLeft: '4px' }}>{exampleComponentName}</code>\n <br />\n <strong>Index export:</strong> <code style={{ ...styles.inlineCode, marginLeft: '4px' }}>{dirPath}/index.{ext}</code>\n <br />\n <strong>App import:</strong> <code style={{ ...styles.inlineCode, marginLeft: '4px' }}>import * as customPages from './{dirPath.replace('src/', '')}'</code>\n </div>\n </div>\n </div>\n\n <div style={{\n backgroundColor: '#f0fdf4',\n border: '1px solid #bbf7d0',\n borderRadius: '8px',\n padding: '16px',\n marginTop: '24px'\n }}>\n <h3 style={{ margin: '0 0 8px 0', color: '#15803d', fontSize: '16px' }}>\n ✅ Need Help?\n </h3>\n <p style={{ margin: '0', color: '#166534', fontSize: '14px' }}>\n Make sure the component name matches exactly between the filename, export statement, and route configuration.\n Check the browser console for any additional error messages.\n </p>\n </div>\n </div>\n );\n};\n\nexport default CustomPageFallback;","import React, { useState, useEffect, Suspense } from 'react';\nimport CustomPageFallback from './CustomPageFallback';\n\ninterface CustomPageLoaderProps {\n componentName?: string;\n customPagesDir?: string;\n customPagesGlob?: string;\n fileExtension?: string;\n}\n\nconst CustomPageLoader: React.FC<CustomPageLoaderProps> = ({\n componentName,\n customPagesDir = 'src/custom/pages',\n customPagesGlob = '../../custom/pages/*.js',\n fileExtension = 'js'\n}) => {\n const [CustomComponent, setCustomComponent] = useState<React.ComponentType | null>(null);\n const [error, setError] = useState<boolean>(false);\n\n useEffect(() => {\n // Reset state when component name changes\n setCustomComponent(null);\n setError(false);\n\n if (!componentName) {\n setError(true);\n return;\n }\n\n // Try to dynamically import the custom page component\n const loadCustomPage = async () => {\n try {\n // Use Vite's glob import for dynamic imports\n // Note: The glob pattern needs to be updated in your implementation\n // to match your customPagesGlob configuration\n const modules = import.meta.glob('../../custom/pages/*.js');\n const modulePath = `../../custom/pages/${componentName}.${fileExtension}`;\n\n if (modules[modulePath]) {\n const module = await modules[modulePath]();\n setCustomComponent(() => module.default);\n } else {\n console.error(`Custom page not found: ${componentName} at ${modulePath}`);\n setError(true);\n }\n } catch (err) {\n console.error('Error loading custom page:', err);\n setError(true);\n }\n };\n\n loadCustomPage();\n }, [componentName, fileExtension]);\n\n if (error) {\n return (\n <CustomPageFallback\n componentName={componentName}\n customPagesDir={customPagesDir}\n fileExtension={fileExtension}\n />\n );\n }\n\n if (!CustomComponent) {\n return <div style={{ padding: '24px' }}>Loading custom page...</div>;\n }\n\n return (\n <Suspense fallback={<div style={{ padding: '24px' }}>Loading...</div>}>\n <CustomComponent />\n </Suspense>\n );\n};\n\nexport default CustomPageLoader;","import React, { MouseEvent } from 'react';\n\ninterface NotFoundPageProps {\n message?: string;\n}\n\n/**\n * NotFoundPage - 404 error page component\n * Displays when a route is not found or an unknown page type is encountered\n */\nconst NotFoundPage: React.FC<NotFoundPageProps> = ({ message }) => {\n return (\n <div style={{ \n display: 'flex', \n flexDirection: 'column', \n alignItems: 'center', \n justifyContent: 'center', \n height: '100vh',\n textAlign: 'center',\n padding: '24px',\n backgroundColor: '#f5f5f5'\n }}>\n <div style={{\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '48px',\n boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)',\n maxWidth: '500px',\n width: '100%'\n }}>\n <h1 style={{ \n fontSize: '72px', \n margin: '0', \n color: '#e9eaeb',\n fontWeight: 'bold',\n lineHeight: '1'\n }}>\n 404\n </h1>\n <h2 style={{ \n fontSize: '24px', \n margin: '16px 0', \n color: '#252b37',\n fontWeight: '600'\n }}>\n Page Not Found\n </h2>\n <p style={{ \n fontSize: '16px', \n color: '#717680', \n marginBottom: '32px',\n lineHeight: '1.5'\n }}>\n {message || \"The page you are looking for doesn't exist or has been moved.\"}\n </p>\n <div style={{ display: 'flex', gap: '12px', justifyContent: 'center' }}>\n <button \n onClick={() => window.history.back()} \n style={{\n padding: '10px 24px',\n backgroundColor: '#5048ed',\n color: 'white',\n border: 'none',\n borderRadius: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n fontWeight: '500',\n transition: 'background-color 0.2s'\n }}\n onMouseEnter={(e: MouseEvent<HTMLButtonElement>) => (e.target as HTMLButtonElement).style.backgroundColor = '#4038d8'}\n onMouseLeave={(e: MouseEvent<HTMLButtonElement>) => (e.target as HTMLButtonElement).style.backgroundColor = '#5048ed'}\n >\n Go Back\n </button>\n <button \n onClick={() => window.location.href = '/'} \n style={{\n padding: '10px 24px',\n backgroundColor: 'transparent',\n color: '#5048ed',\n border: '1px solid #5048ed',\n borderRadius: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n fontWeight: '500',\n transition: 'all 0.2s'\n }}\n onMouseEnter={(e: MouseEvent<HTMLButtonElement>) => {\n const target = e.target as HTMLButtonElement;\n target.style.backgroundColor = '#5048ed';\n target.style.color = 'white';\n }}\n onMouseLeave={(e: MouseEvent<HTMLButtonElement>) => {\n const target = e.target as HTMLButtonElement;\n target.style.backgroundColor = 'transparent';\n target.style.color = '#5048ed';\n }}\n >\n Go Home\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default NotFoundPage;","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n];\nconst ArrowLeft = createLucideIcon(\"arrow-left\", __iconNode);\n\nexport { __iconNode, ArrowLeft as default };\n//# sourceMappingURL=arrow-left.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", __iconNode);\n\nexport { __iconNode, CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\",\n key: \"1vdc57\"\n }\n ],\n [\"path\", { d: \"M5 21h14\", key: \"11awu3\" }]\n];\nconst Crown = createLucideIcon(\"crown\", __iconNode);\n\nexport { __iconNode, Crown as default };\n//# sourceMappingURL=crown.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\", key: \"5wwlr5\" }],\n [\n \"path\",\n {\n d: \"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n key: \"r6nss1\"\n }\n ]\n];\nconst House = createLucideIcon(\"house\", __iconNode);\n\nexport { __iconNode, House as default };\n//# sourceMappingURL=house.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\",\n key: \"9njp5v\"\n }\n ]\n];\nconst Phone = createLucideIcon(\"phone\", __iconNode);\n\nexport { __iconNode, Phone as default };\n//# sourceMappingURL=phone.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n];\nconst Smartphone = createLucideIcon(\"smartphone\", __iconNode);\n\nexport { __iconNode, Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n];\nconst User = createLucideIcon(\"user\", __iconNode);\n\nexport { __iconNode, User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.544.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"path\", { d: \"M16 3.128a4 4 0 0 1 0 7.744\", key: \"16gr8j\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }]\n];\nconst Users = createLucideIcon(\"users\", __iconNode);\n\nexport { __iconNode, Users as default };\n//# sourceMappingURL=users.js.map\n","'use strict';\n\n/**\n * Create a bound version of a function with a specified `this` context\n *\n * @param {Function} fn - The function to bind\n * @param {*} thisArg - The value to be passed as the `this` parameter\n * @returns {Function} A new function that will call the original function with the specified `this` context\n */\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure, sameSite) {\n if (typeof document === 'undefined') return;\n\n const cookie = [`${name}=${encodeURIComponent(value)}`];\n\n if (utils.isNumber(expires)) {\n cookie.push(`expires=${new Date(expires).toUTCString()}`);\n }\n if (utils.isString(path)) {\n cookie.push(`path=${path}`);\n }\n if (utils.isString(domain)) {\n cookie.push(`domain=${domain}`);\n }\n if (secure === true) {\n cookie.push('secure');\n }\n if (utils.isString(sameSite)) {\n cookie.push(`SameSite=${sameSite}`);\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000, '/');\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = (config && config.env) || {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\n/**\n * Known adapters mapping.\n * Provides environment-specific adapters for Axios:\n * - `http` for Node.js\n * - `xhr` for browsers\n * - `fetch` for fetch API-based requests\n * \n * @type {Object<string, Function|Object>}\n */\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n};\n\n// Assign adapter names for easier debugging and identification\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', { value });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', { value });\n }\n});\n\n/**\n * Render a rejection reason string for unknown or unsupported adapters\n * \n * @param {string} reason\n * @returns {string}\n */\nconst renderReason = (reason) => `- ${reason}`;\n\n/**\n * Check if the adapter is resolved (function, null, or false)\n * \n * @param {Function|null|false} adapter\n * @returns {boolean}\n */\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\n/**\n * Get the first suitable adapter from the provided list.\n * Tries each adapter in order until a supported one is found.\n * Throws an AxiosError if no adapter is suitable.\n * \n * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.\n * @param {Object} config - Axios request configuration\n * @throws {AxiosError} If no suitable adapter is available\n * @returns {Function} The resolved adapter function\n */\nfunction getAdapter(adapters, config) {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n}\n\n/**\n * Exports Axios adapters and utility to resolve an adapter\n */\nexport default {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter,\n\n /**\n * Exposes all known adapters\n * @type {Object<string, Function|Object>}\n */\n adapters: knownAdapters\n};\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.13.0\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Auth API\n * API collection for app authentication\n *\n * The version of the OpenAPI document: 1.0.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nimport type { Configuration } from './configuration';\n// Some imports not used depending on template conditions\n// @ts-ignore\nimport type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios';\nimport globalAxios from 'axios';\n\nexport const BASE_PATH = \"/api/v1/appauth\".replace(/\\/+$/, \"\");\n\nexport const COLLECTION_FORMATS = {\n csv: \",\",\n ssv: \" \",\n tsv: \"\\t\",\n pipes: \"|\",\n};\n\nexport interface RequestArgs {\n url: string;\n options: RawAxiosRequestConfig;\n}\n\nexport class BaseAPI {\n protected configuration: Configuration | undefined;\n\n constructor(configuration?: Configuration, protected basePath: string = BASE_PATH, protected axios: AxiosInstance = globalAxios) {\n if (configuration) {\n this.configuration = configuration;\n this.basePath = configuration.basePath ?? basePath;\n }\n }\n};\n\nexport class RequiredError extends Error {\n constructor(public field: string, msg?: string) {\n super(msg);\n this.name = \"RequiredError\"\n }\n}\n\ninterface ServerMap {\n [key: string]: {\n url: string,\n description: string,\n }[];\n}\n\nexport const operationServerMap: ServerMap = {\n \"UserProfileApi.getUserProfile\": [\n {\n url: \"/api/v1\",\n description: \"Profile API base URL\",\n }\n ],\n \"UserProfileApi.updateUserProfile\": [\n {\n url: \"/api/v1\",\n description: \"Profile API base URL\",\n }\n ],\n}","/* tslint:disable */\n/* eslint-disable */\n/**\n * Auth API\n * API collection for app authentication\n *\n * The version of the OpenAPI document: 1.0.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nimport type { Configuration } from \"./configuration\";\nimport type { RequestArgs } from \"./base\";\nimport type { AxiosInstance, AxiosResponse } from 'axios';\nimport { RequiredError } from \"./base\";\n\nexport const DUMMY_BASE_URL = 'https://example.com'\n\n/**\n *\n * @throws {RequiredError}\n */\nexport const assertParamExists = function (functionName: string, paramName: string, paramValue: unknown) {\n if (paramValue === null || paramValue === undefined) {\n throw new RequiredError(paramName, `Required parameter ${paramName} was null or undefined when calling ${functionName}.`);\n }\n}\n\nexport const setApiKeyToObject = async function (object: any, keyParamName: string, configuration?: Configuration) {\n if (configuration && configuration.apiKey) {\n const localVarApiKeyValue = typeof configuration.apiKey === 'function'\n ? await configuration.apiKey(keyParamName)\n : await configuration.apiKey;\n object[keyParamName] = localVarApiKeyValue;\n }\n}\n\nexport const setBasicAuthToObject = function (object: any, configuration?: Configuration) {\n if (configuration && (configuration.username || configuration.password)) {\n object[\"auth\"] = { username: configuration.username, password: configuration.password };\n }\n}\n\nexport const setBearerAuthToObject = async function (object: any, configuration?: Configuration) {\n if (configuration && configuration.accessToken) {\n const accessToken = typeof configuration.accessToken === 'function'\n ? await configuration.accessToken()\n : await configuration.accessToken;\n object[\"Authorization\"] = \"Bearer \" + accessToken;\n }\n}\n\nexport const setOAuthToObject = async function (object: any, name: string, scopes: string[], configuration?: Configuration) {\n if (configuration && configuration.accessToken) {\n const localVarAccessTokenValue = typeof configuration.accessToken === 'function'\n ? await configuration.accessToken(name, scopes)\n : await configuration.accessToken;\n object[\"Authorization\"] = \"Bearer \" + localVarAccessTokenValue;\n }\n}\n\nfunction setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: any, key: string = \"\"): void {\n if (parameter == null) return;\n if (typeof parameter === \"object\") {\n if (Array.isArray(parameter)) {\n (parameter as any[]).forEach(item => setFlattenedQueryParams(urlSearchParams, item, key));\n }\n else {\n Object.keys(parameter).forEach(currentKey =>\n setFlattenedQueryParams(urlSearchParams, parameter[currentKey], `${key}${key !== '' ? '.' : ''}${currentKey}`)\n );\n }\n }\n else {\n if (urlSearchParams.has(key)) {\n urlSearchParams.append(key, parameter);\n }\n else {\n urlSearchParams.set(key, parameter);\n }\n }\n}\n\nexport const setSearchParams = function (url: URL, ...objects: any[]) {\n const searchParams = new URLSearchParams(url.search);\n setFlattenedQueryParams(searchParams, objects);\n url.search = searchParams.toString();\n}\n\nexport const serializeDataIfNeeded = function (value: any, requestOptions: any, configuration?: Configuration) {\n const nonString = typeof value !== 'string';\n const needsSerialization = nonString && configuration && configuration.isJsonMime\n ? configuration.isJsonMime(requestOptions.headers['Content-Type'])\n : nonString;\n return needsSerialization\n ? JSON.stringify(value !== undefined ? value : {})\n : (value || \"\");\n}\n\nexport const toPathString = function (url: URL) {\n return url.pathname + url.search + url.hash\n}\n\nexport const createRequestFunction = function (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) {\n return <T = unknown, R = AxiosResponse<T>>(axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {\n const axiosRequestArgs = {...axiosArgs.options, url: (axios.defaults.baseURL ? '' : configuration?.basePath ?? basePath) + axiosArgs.url};\n return axios.request<T, R>(axiosRequestArgs);\n };\n}","/* tslint:disable */\n/* eslint-disable */\n/**\n * Auth API\n * API collection for app authentication\n *\n * The version of the OpenAPI document: 1.0.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nimport type { Configuration } from './configuration';\nimport type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios';\nimport globalAxios from 'axios';\n// Some imports not used depending on template conditions\n// @ts-ignore\nimport { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from './common';\nimport type { RequestArgs } from './base';\n// @ts-ignore\nimport { BASE_PATH, COLLECTION_FORMATS, BaseAPI, RequiredError, operationServerMap } from './base';\n\nexport interface AuthConfig {\n 'login_methods': LoginMethods;\n 'session_policy': SessionPolicy;\n 'password_policy': PasswordPolicy;\n 'two_factor_auth': TwoFactorAuth;\n}\nexport interface AuthConfigResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: AuthConfig;\n}\nexport interface AuthMethod {\n /**\n * Authentication method used\n */\n 'method': AuthMethodMethodEnum;\n /**\n * Unix timestamp when authentication occurred\n */\n 'at': number;\n /**\n * Email address used for authentication\n */\n 'email': string;\n}\n\nexport const AuthMethodMethodEnum = {\n Password: 'password',\n Oauth: 'oauth',\n Sso: 'sso',\n Token: 'token',\n Otp: 'otp'\n} as const;\n\nexport type AuthMethodMethodEnum = typeof AuthMethodMethodEnum[keyof typeof AuthMethodMethodEnum];\n\nexport interface AuthStepRequiredResponse {\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: AuthStepRequiredResponseAllOfResponse;\n}\nexport interface AuthStepRequiredResponseAllOfResponse {\n 'status': number;\n 'data': AuthStepRequiredResponseAllOfResponseData;\n 'meta': AuthStepRequiredResponseAllOfResponseMeta;\n}\nexport interface AuthStepRequiredResponseAllOfResponseData {\n 'next_step': NextStep;\n 'metadata'?: AuthStepRequiredResponseAllOfResponseDataMetadata;\n}\n/**\n * @type AuthStepRequiredResponseAllOfResponseDataMetadata\n */\nexport type AuthStepRequiredResponseAllOfResponseDataMetadata = MfaStep | RoleStep | SetPasswordStep;\n\nexport interface AuthStepRequiredResponseAllOfResponseMeta {\n 'is_authenticated': boolean;\n}\nexport interface BaseResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n}\nexport interface DeleteSessionsRequest {\n /**\n * The IDs of the sessions that are to be ended. \n */\n 'sessions': Array<number>;\n}\nexport interface ErrorResponse {\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'error'?: ErrorResponseAllOfError;\n}\nexport interface ErrorResponseAllOfError {\n /**\n * Error message\n */\n 'message'?: string;\n /**\n * Error code\n */\n 'code'?: string;\n /**\n * param\n */\n 'param'?: string;\n}\n/**\n * @type GetAppAuthConfig403Response\n */\nexport type GetAppAuthConfig403Response = ErrorResponse | LockoutResponse;\n\nexport interface GetMfaCodeResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: GetMfaCodeResponseAllOfResponse;\n}\nexport interface GetMfaCodeResponseAllOfResponse {\n /**\n * The type of OTP that was sent\n */\n 'otp_type': GetMfaCodeResponseAllOfResponseOtpTypeEnum;\n}\n\nexport const GetMfaCodeResponseAllOfResponseOtpTypeEnum = {\n Sms: 'sms',\n Email: 'email',\n Totp: 'totp'\n} as const;\n\nexport type GetMfaCodeResponseAllOfResponseOtpTypeEnum = typeof GetMfaCodeResponseAllOfResponseOtpTypeEnum[keyof typeof GetMfaCodeResponseAllOfResponseOtpTypeEnum];\n\nexport interface ListSessions {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'data'?: Array<ListSessionsAllOfData>;\n}\nexport interface ListSessionsAllOfData {\n /**\n * Unique identifier for the session.\n */\n 'id': number;\n /**\n * The user agent string of the client.\n */\n 'user_agent': string;\n /**\n * The IP address of the client.\n */\n 'ip': string;\n /**\n * Timestamp of when the session was created, in Unix epoch time.\n */\n 'created_at': number;\n /**\n * Timestamp of the last time the session was seen, in Unix epoch time.\n */\n 'last_seen_at': number;\n /**\n * Indicates if this is the current active session.\n */\n 'is_current': boolean;\n}\nexport interface LockoutResponse {\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n /**\n * Account lockout message\n */\n 'message': string;\n /**\n * Cooloff time in seconds\n */\n 'cooloff_time_seconds': number;\n /**\n * Cooloff time in minutes\n */\n 'cooloff_time_minutes': number;\n /**\n * Error code for account lockout\n */\n 'error_code': string;\n}\nexport interface LoginMethodStatus {\n /**\n * Indicates if the login method is enabled\n */\n 'enabled': boolean;\n}\nexport interface LoginMethods {\n 'otp': LoginMethodStatus;\n 'sso': LoginMethodStatus;\n 'oidc': LoginMethodStatus;\n 'password': PasswordLoginMethod;\n /**\n * List of allowed username types for login\n */\n 'allowed_usernames': Array<LoginMethodsAllowedUsernamesEnum>;\n}\n\nexport const LoginMethodsAllowedUsernamesEnum = {\n Email: 'email',\n Mobile: 'mobile',\n Username: 'username'\n} as const;\n\nexport type LoginMethodsAllowedUsernamesEnum = typeof LoginMethodsAllowedUsernamesEnum[keyof typeof LoginMethodsAllowedUsernamesEnum];\n\nexport interface LoginOTPErrorResponse {\n 'success'?: boolean;\n 'response'?: LoginOTPErrorResponseResponse;\n}\nexport interface LoginOTPErrorResponseResponse {\n 'status'?: number;\n 'data'?: LoginOTPErrorResponseResponseData;\n 'meta'?: LoginOTPResponseAllOfResponseMeta;\n}\nexport interface LoginOTPErrorResponseResponseData {\n 'message'?: string;\n}\nexport interface LoginOTPRequest {\n 'email'?: string;\n 'phone'?: string;\n}\nexport interface LoginOTPResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: LoginOTPResponseAllOfResponse;\n}\nexport interface LoginOTPResponseAllOfResponse {\n 'status'?: number;\n 'data'?: LoginOTPResponseAllOfResponseData;\n 'meta'?: LoginOTPResponseAllOfResponseMeta;\n}\nexport interface LoginOTPResponseAllOfResponseData {\n 'message'?: string;\n 'destination'?: string;\n}\nexport interface LoginOTPResponseAllOfResponseMeta {\n 'is_authenticated'?: boolean;\n}\nexport interface LoginOTPVerifyRequest {\n /**\n * OTP verification code\n */\n 'code': string;\n}\nexport interface LoginSuccessResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: LoginSuccessResponseAllOfResponse;\n}\nexport interface LoginSuccessResponseAllOfResponse {\n 'status': number;\n 'data': LoginSuccessResponseAllOfResponseData;\n 'meta': LoginSuccessResponseAllOfResponseMeta;\n}\nexport interface LoginSuccessResponseAllOfResponseData {\n 'user': User;\n 'methods': Array<AuthMethod>;\n 'redirect_url': string;\n}\nexport interface LoginSuccessResponseAllOfResponseMeta {\n 'is_authenticated': boolean;\n}\n/**\n * @type LoginUserRequest\n */\nexport type LoginUserRequest = LoginWithEmailRequest | LoginWithPhoneRequest;\n\nexport interface LoginWithEmailRequest {\n 'email': string;\n 'password': string;\n}\nexport interface LoginWithPhoneRequest {\n 'phone': string;\n 'password': string;\n}\nexport interface MfaMetadata {\n 'method': MfaMetadataMethodEnum;\n}\n\nexport const MfaMetadataMethodEnum = {\n Sms: 'sms',\n Email: 'email',\n Totp: 'totp'\n} as const;\n\nexport type MfaMetadataMethodEnum = typeof MfaMetadataMethodEnum[keyof typeof MfaMetadataMethodEnum];\n\nexport interface MfaStep {\n 'type'?: MfaStepTypeEnum;\n}\n\nexport const MfaStepTypeEnum = {\n Email: 'email',\n Sms: 'sms',\n Totp: 'totp'\n} as const;\n\nexport type MfaStepTypeEnum = typeof MfaStepTypeEnum[keyof typeof MfaStepTypeEnum];\n\nexport interface MfaVerifyRequest {\n /**\n * MFA verification code\n */\n 'code': string;\n}\nexport interface NextStep {\n 'id': NextStepIdEnum;\n 'is_pending': boolean;\n 'metadata'?: NextStepMetadata;\n}\n\nexport const NextStepIdEnum = {\n RoleSelection: 'role_selection',\n MfaAuthenticate: 'mfa_authenticate',\n SetPassword: 'set_password',\n LoginByCode: 'login_by_code'\n} as const;\n\nexport type NextStepIdEnum = typeof NextStepIdEnum[keyof typeof NextStepIdEnum];\n\n/**\n * @type NextStepMetadata\n */\nexport type NextStepMetadata = MfaMetadata | RoleSelectionMetadata | SetPasswordMetadata;\n\nexport interface OAuthRedirectResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response': OAuthRedirectResponseAllOfResponse;\n}\nexport interface OAuthRedirectResponseAllOfResponse {\n /**\n * The URL to redirect to for OAuth authentication\n */\n 'redirect_url': string;\n}\nexport interface PasswordChangeRequest {\n /**\n * New password\n */\n 'new_password': string;\n /**\n * Current Password\n */\n 'current_password': string;\n}\nexport interface PasswordLoginMethod {\n /**\n * Indicates if password login is enabled\n */\n 'enabled': boolean;\n /**\n * Indicates if the forgot password feature is enabled\n */\n 'forgot_password_enabled': boolean;\n /**\n * Expiry time in hours for password reset links\n */\n 'password_reset_link_expiry_hours': number;\n /**\n * List of allowed username types for password login\n */\n 'allowed_usernames': Array<PasswordLoginMethodAllowedUsernamesEnum>;\n}\n\nexport const PasswordLoginMethodAllowedUsernamesEnum = {\n Email: 'email',\n Mobile: 'mobile',\n Username: 'username'\n} as const;\n\nexport type PasswordLoginMethodAllowedUsernamesEnum = typeof PasswordLoginMethodAllowedUsernamesEnum[keyof typeof PasswordLoginMethodAllowedUsernamesEnum];\n\nexport interface PasswordPolicy {\n 'reset': PasswordResetPolicy;\n /**\n * Minimum length required for passwords\n */\n 'min_length': number;\n /**\n * Indicates if users are allowed to change their password\n */\n 'allow_change': boolean;\n /**\n * Indicates if passwords must contain numbers\n */\n 'require_numbers': boolean;\n /**\n * Indicates if passwords must contain lowercase characters\n */\n 'require_lowercase': boolean;\n /**\n * Indicates if passwords must contain uppercase characters\n */\n 'require_uppercase': boolean;\n /**\n * Number of days after which passwords expire (0 for no expiry)\n */\n 'password_expiry_days': number;\n /**\n * Indicates if passwords must contain special characters\n */\n 'require_special_chars': boolean;\n /**\n * Number of past passwords that cannot be reused\n */\n 'password_history_count': number;\n /**\n * Maximum length allowed for passwords\n */\n 'max_length'?: number;\n /**\n * Number of failed attempts before account lockout (0 for no lockout)\n */\n 'lockout_attempts'?: number;\n /**\n * Duration of account lockout in minutes\n */\n 'lockout_duration_minutes'?: number;\n}\nexport interface PasswordResetPolicy {\n /**\n * Allowed methods for password reset\n */\n 'method': Array<PasswordResetPolicyMethodEnum>;\n /**\n * Indicates if password reset is enabled\n */\n 'enabled': boolean;\n /**\n * Expiry time in hours for password reset tokens\n */\n 'expiry_hours': number;\n}\n\nexport const PasswordResetPolicyMethodEnum = {\n Email: 'email',\n Sms: 'sms'\n} as const;\n\nexport type PasswordResetPolicyMethodEnum = typeof PasswordResetPolicyMethodEnum[keyof typeof PasswordResetPolicyMethodEnum];\n\nexport interface PasswordSetRequest {\n /**\n * New password\n */\n 'new_password': string;\n}\nexport interface ProfileData {\n /**\n * User\\'s display name\n */\n 'name': string;\n /**\n * User\\'s email address\n */\n 'email': string;\n /**\n * User\\'s mobile number\n */\n 'mobile': string;\n /**\n * URL to user\\'s profile picture\n */\n 'profile_pic': string | null;\n /**\n * List of roles assigned to the user\n */\n 'roles': Array<Role>;\n 'auth_config': AuthConfig;\n}\nexport interface ProfileResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: ProfileResponseAllOfResponse;\n}\nexport interface ProfileResponseAllOfResponse {\n /**\n * Response message\n */\n 'message': string;\n 'profile_data': ProfileData;\n 'password_policy': PasswordPolicy;\n /**\n * User authentication tokens\n */\n 'tokens': Array<Token>;\n}\n/**\n * @type RequestLoginOTP401Response\n */\nexport type RequestLoginOTP401Response = LoginOTPErrorResponse | LoginOTPResponse;\n\nexport interface Role {\n /**\n * Unique identifier for the role\n */\n 'id': number;\n /**\n * Timestamp when the role was created\n */\n 'created_at': string;\n /**\n * User who created the role\n */\n 'created_by': string;\n /**\n * Timestamp when the role was last modified\n */\n 'modified_at': string;\n /**\n * User who last modified the role\n */\n 'modified_by': string;\n /**\n * Name of the role\n */\n 'name': string;\n /**\n * Role configuration\n */\n 'config': object | null;\n /**\n * Whether the role is active\n */\n 'is_active': boolean;\n /**\n * Whether this is the default role\n */\n 'is_default': boolean;\n 'auth_config': RoleAuthConfig;\n /**\n * List of policy IDs assigned to this role\n */\n 'policies': Array<number>;\n /**\n * List of policy group IDs assigned to this role\n */\n 'policy_groups': Array<number>;\n}\nexport interface RoleAuthConfig {\n /**\n * URL to redirect after authentication\n */\n 'redirect_url': string;\n}\nexport interface RoleSelectionMetadata {\n 'roles': Array<RoleSelectionMetadataRolesInner>;\n}\nexport interface RoleSelectionMetadataRolesInner {\n /**\n * Unique identifier for the role\n */\n 'id': number;\n /**\n * Display name of the role\n */\n 'name': string;\n}\nexport interface RoleStep {\n 'type'?: Array<RoleStepTypeInner>;\n}\nexport interface RoleStepTypeInner {\n 'id'?: number;\n 'name'?: string;\n}\nexport interface SessionPolicy {\n /**\n * Maximum number of concurrent sessions allowed (0 for unlimited)\n */\n 'max_concurrent_sessions': number;\n /**\n * Indicates if users are forced to log out on password change\n */\n 'force_logout_on_password_change': boolean;\n /**\n * Session timeout in minutes (0 for no timeout)\n */\n 'session_timeout_minutes'?: number;\n /**\n * Indicates if remember me functionality is enabled\n */\n 'remember_me_enabled'?: boolean;\n /**\n * Remember me duration in days\n */\n 'remember_me_duration_days'?: number;\n}\n/**\n * @type SetPassword200Response\n */\nexport type SetPassword200Response = AuthStepRequiredResponse | LoginSuccessResponse;\n\nexport interface SetPasswordMetadata {\n 'reset': PasswordResetPolicy;\n /**\n * Minimum length required for passwords\n */\n 'min_length': number;\n /**\n * Indicates if users are allowed to change their password\n */\n 'allow_change': boolean;\n /**\n * Indicates if passwords must contain numbers\n */\n 'require_numbers': boolean;\n /**\n * Indicates if passwords must contain lowercase characters\n */\n 'require_lowercase': boolean;\n /**\n * Indicates if passwords must contain uppercase characters\n */\n 'require_uppercase': boolean;\n /**\n * Number of days after which passwords expire (0 for no expiry)\n */\n 'password_expiry_days': number;\n /**\n * Indicates if passwords must contain special characters\n */\n 'require_special_chars': boolean;\n /**\n * Number of past passwords that cannot be reused\n */\n 'password_history_count': number;\n /**\n * Maximum length allowed for passwords\n */\n 'max_length'?: number;\n /**\n * Number of failed attempts before account lockout (0 for no lockout)\n */\n 'lockout_attempts'?: number;\n /**\n * Duration of account lockout in minutes\n */\n 'lockout_duration_minutes'?: number;\n}\nexport interface SetPasswordStep {\n 'passwordPolicy'?: PasswordPolicy;\n}\nexport interface SuccessResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n /**\n * Success message\n */\n 'message'?: string;\n}\nexport interface Token {\n /**\n * Role associated with the token\n */\n 'role': string;\n /**\n * Token creation timestamp\n */\n 'created': string;\n /**\n * Token expiry timestamp\n */\n 'expiry': string;\n}\nexport interface TwoFactorAuth {\n /**\n * Indicates if two-factor authentication is required\n */\n 'required': boolean;\n /**\n * List of allowed two-factor authentication methods\n */\n 'allowedMethods': Array<TwoFactorAuthAllowedMethodsEnum>;\n /**\n * The URL endpoint for triggering email-based two-factor authentication\n */\n 'email_hook'?: string;\n /**\n * The URL endpoint for triggering SMS-based two-factor authentication\n */\n 'sms_hook'?: string;\n}\n\nexport const TwoFactorAuthAllowedMethodsEnum = {\n Sms: 'sms',\n Email: 'email',\n Totp: 'totp'\n} as const;\n\nexport type TwoFactorAuthAllowedMethodsEnum = typeof TwoFactorAuthAllowedMethodsEnum[keyof typeof TwoFactorAuthAllowedMethodsEnum];\n\nexport interface UpdateConfigResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'auth_config'?: AuthConfig;\n}\nexport interface UpdateProfileResponse {\n /**\n * Indicates if the request was successful\n */\n 'success': boolean;\n /**\n * HTTP status code\n */\n 'status'?: number;\n 'response'?: UpdateProfileResponseAllOfResponse;\n}\nexport interface UpdateProfileResponseAllOfResponse {\n /**\n * Indicates if the profile update was successful\n */\n 'success': boolean;\n /**\n * Response message\n */\n 'message': string;\n}\nexport interface User {\n /**\n * Unique user identifier\n */\n 'id': number;\n /**\n * Display name for the user\n */\n 'display': string;\n /**\n * User\\'s email address\n */\n 'email': string;\n /**\n * Whether the user has a usable password set\n */\n 'has_usable_password': boolean;\n /**\n * Username for the user\n */\n 'username': string;\n /**\n * User\\'s phone number\n */\n 'phone'?: string;\n /**\n * User\\'s first name\n */\n 'first_name'?: string;\n /**\n * User\\'s last name\n */\n 'last_name'?: string;\n /**\n * Whether the user account is active\n */\n 'is_active'?: boolean;\n /**\n * Timestamp of last login\n */\n 'last_login'?: string;\n}\n\n/**\n * ApplicationConfigurationApi - axios parameter creator\n */\nexport const ApplicationConfigurationApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Retrieve authentication configuration for the application\n * @summary Get application auth configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getAppAuthConfig: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n const localVarPath = `/config/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n\n \n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Update authentication configuration for the application\n * @summary Update application auth configuration\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} authConfig JSON string containing authentication configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n updateAppAuthConfig: async (xCSRFToken: string, authConfig: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('updateAppAuthConfig', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'authConfig' is not null or undefined\n assertParamExists('updateAppAuthConfig', 'authConfig', authConfig)\n const localVarPath = `/config/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n const localVarFormParams = new ((configuration && configuration.formDataCtor) || FormData)();\n\n\n if (authConfig !== undefined) { \n localVarFormParams.append('auth_config', authConfig as any);\n }\n \n \n localVarHeaderParameter['Content-Type'] = 'multipart/form-data';\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = localVarFormParams;\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * ApplicationConfigurationApi - functional programming interface\n */\nexport const ApplicationConfigurationApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = ApplicationConfigurationApiAxiosParamCreator(configuration)\n return {\n /**\n * Retrieve authentication configuration for the application\n * @summary Get application auth configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async getAppAuthConfig(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<AuthConfigResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.getAppAuthConfig(options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['ApplicationConfigurationApi.getAppAuthConfig']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Update authentication configuration for the application\n * @summary Update application auth configuration\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} authConfig JSON string containing authentication configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async updateAppAuthConfig(xCSRFToken: string, authConfig: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UpdateConfigResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.updateAppAuthConfig(xCSRFToken, authConfig, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['ApplicationConfigurationApi.updateAppAuthConfig']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * ApplicationConfigurationApi - factory interface\n */\nexport const ApplicationConfigurationApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = ApplicationConfigurationApiFp(configuration)\n return {\n /**\n * Retrieve authentication configuration for the application\n * @summary Get application auth configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getAppAuthConfig(options?: RawAxiosRequestConfig): AxiosPromise<AuthConfigResponse> {\n return localVarFp.getAppAuthConfig(options).then((request) => request(axios, basePath));\n },\n /**\n * Update authentication configuration for the application\n * @summary Update application auth configuration\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} authConfig JSON string containing authentication configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n updateAppAuthConfig(xCSRFToken: string, authConfig: string, options?: RawAxiosRequestConfig): AxiosPromise<UpdateConfigResponse> {\n return localVarFp.updateAppAuthConfig(xCSRFToken, authConfig, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * ApplicationConfigurationApi - object-oriented interface\n */\nexport class ApplicationConfigurationApi extends BaseAPI {\n /**\n * Retrieve authentication configuration for the application\n * @summary Get application auth configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public getAppAuthConfig(options?: RawAxiosRequestConfig) {\n return ApplicationConfigurationApiFp(this.configuration).getAppAuthConfig(options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Update authentication configuration for the application\n * @summary Update application auth configuration\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} authConfig JSON string containing authentication configuration\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public updateAppAuthConfig(xCSRFToken: string, authConfig: string, options?: RawAxiosRequestConfig) {\n return ApplicationConfigurationApiFp(this.configuration).updateAppAuthConfig(xCSRFToken, authConfig, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * AuthenticationApi - axios parameter creator\n */\nexport const AuthenticationApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Authenticate user with email/phone and password\n * @summary User login\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginUserRequest} loginUserRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n loginUser: async (xCSRFToken: string, loginUserRequest: LoginUserRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('loginUser', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'loginUserRequest' is not null or undefined\n assertParamExists('loginUser', 'loginUserRequest', loginUserRequest)\n const localVarPath = `/login/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(loginUserRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Logout user and invalidate session\n * @summary User logout\n * @param {string} xCSRFToken CSRF token for security\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n logoutUser: async (xCSRFToken: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('logoutUser', 'xCSRFToken', xCSRFToken)\n const localVarPath = `/logout/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * AuthenticationApi - functional programming interface\n */\nexport const AuthenticationApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = AuthenticationApiAxiosParamCreator(configuration)\n return {\n /**\n * Authenticate user with email/phone and password\n * @summary User login\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginUserRequest} loginUserRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async loginUser(xCSRFToken: string, loginUserRequest: LoginUserRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginSuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.loginUser(xCSRFToken, loginUserRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['AuthenticationApi.loginUser']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Logout user and invalidate session\n * @summary User logout\n * @param {string} xCSRFToken CSRF token for security\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async logoutUser(xCSRFToken: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.logoutUser(xCSRFToken, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['AuthenticationApi.logoutUser']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * AuthenticationApi - factory interface\n */\nexport const AuthenticationApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = AuthenticationApiFp(configuration)\n return {\n /**\n * Authenticate user with email/phone and password\n * @summary User login\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginUserRequest} loginUserRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n loginUser(xCSRFToken: string, loginUserRequest: LoginUserRequest, options?: RawAxiosRequestConfig): AxiosPromise<LoginSuccessResponse> {\n return localVarFp.loginUser(xCSRFToken, loginUserRequest, options).then((request) => request(axios, basePath));\n },\n /**\n * Logout user and invalidate session\n * @summary User logout\n * @param {string} xCSRFToken CSRF token for security\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n logoutUser(xCSRFToken: string, options?: RawAxiosRequestConfig): AxiosPromise<void> {\n return localVarFp.logoutUser(xCSRFToken, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * AuthenticationApi - object-oriented interface\n */\nexport class AuthenticationApi extends BaseAPI {\n /**\n * Authenticate user with email/phone and password\n * @summary User login\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginUserRequest} loginUserRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public loginUser(xCSRFToken: string, loginUserRequest: LoginUserRequest, options?: RawAxiosRequestConfig) {\n return AuthenticationApiFp(this.configuration).loginUser(xCSRFToken, loginUserRequest, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Logout user and invalidate session\n * @summary User logout\n * @param {string} xCSRFToken CSRF token for security\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public logoutUser(xCSRFToken: string, options?: RawAxiosRequestConfig) {\n return AuthenticationApiFp(this.configuration).logoutUser(xCSRFToken, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * LoginWithOTPApi - axios parameter creator\n */\nexport const LoginWithOTPApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Request OTP for login via email or phone\n * @summary Request login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPRequest | null} loginOTPRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n requestLoginOTP: async (xCSRFToken: string, loginOTPRequest: LoginOTPRequest | null, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('requestLoginOTP', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'loginOTPRequest' is not null or undefined\n assertParamExists('requestLoginOTP', 'loginOTPRequest', loginOTPRequest)\n const localVarPath = `/login/code/request/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(loginOTPRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Verify OTP for login and authenticate user\n * @summary Verify login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPVerifyRequest} loginOTPVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n verifyLoginOTP: async (xCSRFToken: string, loginOTPVerifyRequest: LoginOTPVerifyRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('verifyLoginOTP', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'loginOTPVerifyRequest' is not null or undefined\n assertParamExists('verifyLoginOTP', 'loginOTPVerifyRequest', loginOTPVerifyRequest)\n const localVarPath = `/login/code/confirm/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(loginOTPVerifyRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * LoginWithOTPApi - functional programming interface\n */\nexport const LoginWithOTPApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = LoginWithOTPApiAxiosParamCreator(configuration)\n return {\n /**\n * Request OTP for login via email or phone\n * @summary Request login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPRequest | null} loginOTPRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async requestLoginOTP(xCSRFToken: string, loginOTPRequest: LoginOTPRequest | null, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.requestLoginOTP(xCSRFToken, loginOTPRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['LoginWithOTPApi.requestLoginOTP']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Verify OTP for login and authenticate user\n * @summary Verify login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPVerifyRequest} loginOTPVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async verifyLoginOTP(xCSRFToken: string, loginOTPVerifyRequest: LoginOTPVerifyRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginSuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.verifyLoginOTP(xCSRFToken, loginOTPVerifyRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['LoginWithOTPApi.verifyLoginOTP']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * LoginWithOTPApi - factory interface\n */\nexport const LoginWithOTPApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = LoginWithOTPApiFp(configuration)\n return {\n /**\n * Request OTP for login via email or phone\n * @summary Request login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPRequest | null} loginOTPRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n requestLoginOTP(xCSRFToken: string, loginOTPRequest: LoginOTPRequest | null, options?: RawAxiosRequestConfig): AxiosPromise<void> {\n return localVarFp.requestLoginOTP(xCSRFToken, loginOTPRequest, options).then((request) => request(axios, basePath));\n },\n /**\n * Verify OTP for login and authenticate user\n * @summary Verify login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPVerifyRequest} loginOTPVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n verifyLoginOTP(xCSRFToken: string, loginOTPVerifyRequest: LoginOTPVerifyRequest, options?: RawAxiosRequestConfig): AxiosPromise<LoginSuccessResponse> {\n return localVarFp.verifyLoginOTP(xCSRFToken, loginOTPVerifyRequest, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * LoginWithOTPApi - object-oriented interface\n */\nexport class LoginWithOTPApi extends BaseAPI {\n /**\n * Request OTP for login via email or phone\n * @summary Request login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPRequest | null} loginOTPRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public requestLoginOTP(xCSRFToken: string, loginOTPRequest: LoginOTPRequest | null, options?: RawAxiosRequestConfig) {\n return LoginWithOTPApiFp(this.configuration).requestLoginOTP(xCSRFToken, loginOTPRequest, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Verify OTP for login and authenticate user\n * @summary Verify login OTP\n * @param {string} xCSRFToken CSRF token for security\n * @param {LoginOTPVerifyRequest} loginOTPVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public verifyLoginOTP(xCSRFToken: string, loginOTPVerifyRequest: LoginOTPVerifyRequest, options?: RawAxiosRequestConfig) {\n return LoginWithOTPApiFp(this.configuration).verifyLoginOTP(xCSRFToken, loginOTPVerifyRequest, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * MultiFactorAuthenticationApi - axios parameter creator\n */\nexport const MultiFactorAuthenticationApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Generate and send MFA code for two-factor authentication\n * @summary Get MFA code\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getMfaCode: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n const localVarPath = `/mfa/getcode/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Verify the provided MFA code\n * @summary Verify MFA code\n * @param {string} xCSRFToken CSRF token for security\n * @param {MfaVerifyRequest} mfaVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n verifyMfaCode: async (xCSRFToken: string, mfaVerifyRequest: MfaVerifyRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('verifyMfaCode', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'mfaVerifyRequest' is not null or undefined\n assertParamExists('verifyMfaCode', 'mfaVerifyRequest', mfaVerifyRequest)\n const localVarPath = `/mfa/verify/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(mfaVerifyRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * MultiFactorAuthenticationApi - functional programming interface\n */\nexport const MultiFactorAuthenticationApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = MultiFactorAuthenticationApiAxiosParamCreator(configuration)\n return {\n /**\n * Generate and send MFA code for two-factor authentication\n * @summary Get MFA code\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async getMfaCode(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetMfaCodeResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.getMfaCode(options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['MultiFactorAuthenticationApi.getMfaCode']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Verify the provided MFA code\n * @summary Verify MFA code\n * @param {string} xCSRFToken CSRF token for security\n * @param {MfaVerifyRequest} mfaVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async verifyMfaCode(xCSRFToken: string, mfaVerifyRequest: MfaVerifyRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginSuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.verifyMfaCode(xCSRFToken, mfaVerifyRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['MultiFactorAuthenticationApi.verifyMfaCode']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * MultiFactorAuthenticationApi - factory interface\n */\nexport const MultiFactorAuthenticationApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = MultiFactorAuthenticationApiFp(configuration)\n return {\n /**\n * Generate and send MFA code for two-factor authentication\n * @summary Get MFA code\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getMfaCode(options?: RawAxiosRequestConfig): AxiosPromise<GetMfaCodeResponse> {\n return localVarFp.getMfaCode(options).then((request) => request(axios, basePath));\n },\n /**\n * Verify the provided MFA code\n * @summary Verify MFA code\n * @param {string} xCSRFToken CSRF token for security\n * @param {MfaVerifyRequest} mfaVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n verifyMfaCode(xCSRFToken: string, mfaVerifyRequest: MfaVerifyRequest, options?: RawAxiosRequestConfig): AxiosPromise<LoginSuccessResponse> {\n return localVarFp.verifyMfaCode(xCSRFToken, mfaVerifyRequest, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * MultiFactorAuthenticationApi - object-oriented interface\n */\nexport class MultiFactorAuthenticationApi extends BaseAPI {\n /**\n * Generate and send MFA code for two-factor authentication\n * @summary Get MFA code\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public getMfaCode(options?: RawAxiosRequestConfig) {\n return MultiFactorAuthenticationApiFp(this.configuration).getMfaCode(options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Verify the provided MFA code\n * @summary Verify MFA code\n * @param {string} xCSRFToken CSRF token for security\n * @param {MfaVerifyRequest} mfaVerifyRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public verifyMfaCode(xCSRFToken: string, mfaVerifyRequest: MfaVerifyRequest, options?: RawAxiosRequestConfig) {\n return MultiFactorAuthenticationApiFp(this.configuration).verifyMfaCode(xCSRFToken, mfaVerifyRequest, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * OAuthApi - axios parameter creator\n */\nexport const OAuthApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Handles OAuth callback for a specified provider (google or microsoft).\n * @summary OAuth callback for provider\n * @param {OauthCallbackProviderEnum} provider OAuth provider\n * @param {string} state \n * @param {string} code \n * @param {string} scope \n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [authuser] \n * @param {string} [hd] \n * @param {string} [prompt] \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n oauthCallback: async (provider: OauthCallbackProviderEnum, state: string, code: string, scope: string, xCSRFToken: string, authuser?: string, hd?: string, prompt?: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'provider' is not null or undefined\n assertParamExists('oauthCallback', 'provider', provider)\n // verify required parameter 'state' is not null or undefined\n assertParamExists('oauthCallback', 'state', state)\n // verify required parameter 'code' is not null or undefined\n assertParamExists('oauthCallback', 'code', code)\n // verify required parameter 'scope' is not null or undefined\n assertParamExists('oauthCallback', 'scope', scope)\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('oauthCallback', 'xCSRFToken', xCSRFToken)\n const localVarPath = `/oauth/{provider}/callback/`\n .replace(`{${\"provider\"}}`, encodeURIComponent(String(provider)));\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n if (state !== undefined) {\n localVarQueryParameter['state'] = state;\n }\n\n if (code !== undefined) {\n localVarQueryParameter['code'] = code;\n }\n\n if (scope !== undefined) {\n localVarQueryParameter['scope'] = scope;\n }\n\n if (authuser !== undefined) {\n localVarQueryParameter['authuser'] = authuser;\n }\n\n if (hd !== undefined) {\n localVarQueryParameter['hd'] = hd;\n }\n\n if (prompt !== undefined) {\n localVarQueryParameter['prompt'] = prompt;\n }\n\n\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Initiates an authentication process with a selected provider.\n * @summary OAuth provider redirect\n * @param {string} xCsrftoken CSRF token for security\n * @param {OauthRedirectProviderEnum} provider The OAuth provider to use for authentication\n * @param {OauthRedirectProcessEnum} process The type of process to initiate\n * @param {string} callbackUrl The URL to redirect to after OAuth completion\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n oauthRedirect: async (xCsrftoken: string, provider: OauthRedirectProviderEnum, process: OauthRedirectProcessEnum, callbackUrl: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCsrftoken' is not null or undefined\n assertParamExists('oauthRedirect', 'xCsrftoken', xCsrftoken)\n // verify required parameter 'provider' is not null or undefined\n assertParamExists('oauthRedirect', 'provider', provider)\n // verify required parameter 'process' is not null or undefined\n assertParamExists('oauthRedirect', 'process', process)\n // verify required parameter 'callbackUrl' is not null or undefined\n assertParamExists('oauthRedirect', 'callbackUrl', callbackUrl)\n const localVarPath = `/oauth/redirect/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n const localVarFormParams = new URLSearchParams();\n\n\n if (provider !== undefined) { \n localVarFormParams.set('provider', provider as any);\n }\n \n if (process !== undefined) { \n localVarFormParams.set('process', process as any);\n }\n \n if (callbackUrl !== undefined) { \n localVarFormParams.set('callback_url', callbackUrl as any);\n }\n \n \n localVarHeaderParameter['Content-Type'] = 'application/x-www-form-urlencoded';\n \n if (xCsrftoken != null) {\n localVarHeaderParameter['x-csrftoken'] = String(xCsrftoken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = localVarFormParams.toString();\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * OAuthApi - functional programming interface\n */\nexport const OAuthApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = OAuthApiAxiosParamCreator(configuration)\n return {\n /**\n * Handles OAuth callback for a specified provider (google or microsoft).\n * @summary OAuth callback for provider\n * @param {OauthCallbackProviderEnum} provider OAuth provider\n * @param {string} state \n * @param {string} code \n * @param {string} scope \n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [authuser] \n * @param {string} [hd] \n * @param {string} [prompt] \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async oauthCallback(provider: OauthCallbackProviderEnum, state: string, code: string, scope: string, xCSRFToken: string, authuser?: string, hd?: string, prompt?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginSuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.oauthCallback(provider, state, code, scope, xCSRFToken, authuser, hd, prompt, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['OAuthApi.oauthCallback']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Initiates an authentication process with a selected provider.\n * @summary OAuth provider redirect\n * @param {string} xCsrftoken CSRF token for security\n * @param {OauthRedirectProviderEnum} provider The OAuth provider to use for authentication\n * @param {OauthRedirectProcessEnum} process The type of process to initiate\n * @param {string} callbackUrl The URL to redirect to after OAuth completion\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async oauthRedirect(xCsrftoken: string, provider: OauthRedirectProviderEnum, process: OauthRedirectProcessEnum, callbackUrl: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<OAuthRedirectResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.oauthRedirect(xCsrftoken, provider, process, callbackUrl, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['OAuthApi.oauthRedirect']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * OAuthApi - factory interface\n */\nexport const OAuthApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = OAuthApiFp(configuration)\n return {\n /**\n * Handles OAuth callback for a specified provider (google or microsoft).\n * @summary OAuth callback for provider\n * @param {OauthCallbackProviderEnum} provider OAuth provider\n * @param {string} state \n * @param {string} code \n * @param {string} scope \n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [authuser] \n * @param {string} [hd] \n * @param {string} [prompt] \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n oauthCallback(provider: OauthCallbackProviderEnum, state: string, code: string, scope: string, xCSRFToken: string, authuser?: string, hd?: string, prompt?: string, options?: RawAxiosRequestConfig): AxiosPromise<LoginSuccessResponse> {\n return localVarFp.oauthCallback(provider, state, code, scope, xCSRFToken, authuser, hd, prompt, options).then((request) => request(axios, basePath));\n },\n /**\n * Initiates an authentication process with a selected provider.\n * @summary OAuth provider redirect\n * @param {string} xCsrftoken CSRF token for security\n * @param {OauthRedirectProviderEnum} provider The OAuth provider to use for authentication\n * @param {OauthRedirectProcessEnum} process The type of process to initiate\n * @param {string} callbackUrl The URL to redirect to after OAuth completion\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n oauthRedirect(xCsrftoken: string, provider: OauthRedirectProviderEnum, process: OauthRedirectProcessEnum, callbackUrl: string, options?: RawAxiosRequestConfig): AxiosPromise<OAuthRedirectResponse> {\n return localVarFp.oauthRedirect(xCsrftoken, provider, process, callbackUrl, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * OAuthApi - object-oriented interface\n */\nexport class OAuthApi extends BaseAPI {\n /**\n * Handles OAuth callback for a specified provider (google or microsoft).\n * @summary OAuth callback for provider\n * @param {OauthCallbackProviderEnum} provider OAuth provider\n * @param {string} state \n * @param {string} code \n * @param {string} scope \n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [authuser] \n * @param {string} [hd] \n * @param {string} [prompt] \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public oauthCallback(provider: OauthCallbackProviderEnum, state: string, code: string, scope: string, xCSRFToken: string, authuser?: string, hd?: string, prompt?: string, options?: RawAxiosRequestConfig) {\n return OAuthApiFp(this.configuration).oauthCallback(provider, state, code, scope, xCSRFToken, authuser, hd, prompt, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Initiates an authentication process with a selected provider.\n * @summary OAuth provider redirect\n * @param {string} xCsrftoken CSRF token for security\n * @param {OauthRedirectProviderEnum} provider The OAuth provider to use for authentication\n * @param {OauthRedirectProcessEnum} process The type of process to initiate\n * @param {string} callbackUrl The URL to redirect to after OAuth completion\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public oauthRedirect(xCsrftoken: string, provider: OauthRedirectProviderEnum, process: OauthRedirectProcessEnum, callbackUrl: string, options?: RawAxiosRequestConfig) {\n return OAuthApiFp(this.configuration).oauthRedirect(xCsrftoken, provider, process, callbackUrl, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\nexport const OauthCallbackProviderEnum = {\n Google: 'google',\n Microsoft: 'microsoft'\n} as const;\nexport type OauthCallbackProviderEnum = typeof OauthCallbackProviderEnum[keyof typeof OauthCallbackProviderEnum];\nexport const OauthRedirectProviderEnum = {\n Google: 'google',\n Microsoft: 'microsoft'\n} as const;\nexport type OauthRedirectProviderEnum = typeof OauthRedirectProviderEnum[keyof typeof OauthRedirectProviderEnum];\nexport const OauthRedirectProcessEnum = {\n Login: 'login',\n Connect: 'connect'\n} as const;\nexport type OauthRedirectProcessEnum = typeof OauthRedirectProcessEnum[keyof typeof OauthRedirectProcessEnum];\n\n\n/**\n * PasswordManagementApi - axios parameter creator\n */\nexport const PasswordManagementApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Change the current user\\'s password\n * @summary Change user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordChangeRequest} passwordChangeRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n changePassword: async (xCSRFToken: string, passwordChangeRequest: PasswordChangeRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('changePassword', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'passwordChangeRequest' is not null or undefined\n assertParamExists('changePassword', 'passwordChangeRequest', passwordChangeRequest)\n const localVarPath = `/password/change/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(passwordChangeRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Set the current user\\'s password\n * @summary set user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordSetRequest} passwordSetRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n setPassword: async (xCSRFToken: string, passwordSetRequest: PasswordSetRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('setPassword', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'passwordSetRequest' is not null or undefined\n assertParamExists('setPassword', 'passwordSetRequest', passwordSetRequest)\n const localVarPath = `/password/set/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(passwordSetRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * PasswordManagementApi - functional programming interface\n */\nexport const PasswordManagementApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = PasswordManagementApiAxiosParamCreator(configuration)\n return {\n /**\n * Change the current user\\'s password\n * @summary Change user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordChangeRequest} passwordChangeRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async changePassword(xCSRFToken: string, passwordChangeRequest: PasswordChangeRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<SuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.changePassword(xCSRFToken, passwordChangeRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['PasswordManagementApi.changePassword']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Set the current user\\'s password\n * @summary set user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordSetRequest} passwordSetRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async setPassword(xCSRFToken: string, passwordSetRequest: PasswordSetRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<SetPassword200Response>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.setPassword(xCSRFToken, passwordSetRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['PasswordManagementApi.setPassword']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * PasswordManagementApi - factory interface\n */\nexport const PasswordManagementApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = PasswordManagementApiFp(configuration)\n return {\n /**\n * Change the current user\\'s password\n * @summary Change user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordChangeRequest} passwordChangeRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n changePassword(xCSRFToken: string, passwordChangeRequest: PasswordChangeRequest, options?: RawAxiosRequestConfig): AxiosPromise<SuccessResponse> {\n return localVarFp.changePassword(xCSRFToken, passwordChangeRequest, options).then((request) => request(axios, basePath));\n },\n /**\n * Set the current user\\'s password\n * @summary set user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordSetRequest} passwordSetRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n setPassword(xCSRFToken: string, passwordSetRequest: PasswordSetRequest, options?: RawAxiosRequestConfig): AxiosPromise<SetPassword200Response> {\n return localVarFp.setPassword(xCSRFToken, passwordSetRequest, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * PasswordManagementApi - object-oriented interface\n */\nexport class PasswordManagementApi extends BaseAPI {\n /**\n * Change the current user\\'s password\n * @summary Change user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordChangeRequest} passwordChangeRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public changePassword(xCSRFToken: string, passwordChangeRequest: PasswordChangeRequest, options?: RawAxiosRequestConfig) {\n return PasswordManagementApiFp(this.configuration).changePassword(xCSRFToken, passwordChangeRequest, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Set the current user\\'s password\n * @summary set user password\n * @param {string} xCSRFToken CSRF token for security\n * @param {PasswordSetRequest} passwordSetRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public setPassword(xCSRFToken: string, passwordSetRequest: PasswordSetRequest, options?: RawAxiosRequestConfig) {\n return PasswordManagementApiFp(this.configuration).setPassword(xCSRFToken, passwordSetRequest, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * RoleManagementApi - axios parameter creator\n */\nexport const RoleManagementApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Set the current user\\'s active role\n * @summary Set user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to set to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n setRole: async (xCSRFToken: string, role: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('setRole', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'role' is not null or undefined\n assertParamExists('setRole', 'role', role)\n const localVarPath = `/role/set/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n if (role !== undefined) {\n localVarQueryParameter['role'] = role;\n }\n\n\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Switch the current user\\'s active role\n * @summary Switch user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to switch to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n switchRole: async (xCSRFToken: string, role: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('switchRole', 'xCSRFToken', xCSRFToken)\n // verify required parameter 'role' is not null or undefined\n assertParamExists('switchRole', 'role', role)\n const localVarPath = `/role/switch/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n if (role !== undefined) {\n localVarQueryParameter['role'] = role;\n }\n\n\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * RoleManagementApi - functional programming interface\n */\nexport const RoleManagementApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = RoleManagementApiAxiosParamCreator(configuration)\n return {\n /**\n * Set the current user\\'s active role\n * @summary Set user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to set to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async setRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginSuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.setRole(xCSRFToken, role, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['RoleManagementApi.setRole']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Switch the current user\\'s active role\n * @summary Switch user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to switch to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async switchRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<SuccessResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.switchRole(xCSRFToken, role, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['RoleManagementApi.switchRole']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * RoleManagementApi - factory interface\n */\nexport const RoleManagementApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = RoleManagementApiFp(configuration)\n return {\n /**\n * Set the current user\\'s active role\n * @summary Set user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to set to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n setRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig): AxiosPromise<LoginSuccessResponse> {\n return localVarFp.setRole(xCSRFToken, role, options).then((request) => request(axios, basePath));\n },\n /**\n * Switch the current user\\'s active role\n * @summary Switch user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to switch to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n switchRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig): AxiosPromise<SuccessResponse> {\n return localVarFp.switchRole(xCSRFToken, role, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * RoleManagementApi - object-oriented interface\n */\nexport class RoleManagementApi extends BaseAPI {\n /**\n * Set the current user\\'s active role\n * @summary Set user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to set to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public setRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig) {\n return RoleManagementApiFp(this.configuration).setRole(xCSRFToken, role, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Switch the current user\\'s active role\n * @summary Switch user role\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} role Role ID to switch to\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public switchRole(xCSRFToken: string, role: string, options?: RawAxiosRequestConfig) {\n return RoleManagementApiFp(this.configuration).switchRole(xCSRFToken, role, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * SessionManagementApi - axios parameter creator\n */\nexport const SessionManagementApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Delete user sessions\n * @summary Delete user sessions\n * @param {DeleteSessionsRequest} deleteSessionsRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n deleteSessions: async (deleteSessionsRequest: DeleteSessionsRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'deleteSessionsRequest' is not null or undefined\n assertParamExists('deleteSessions', 'deleteSessionsRequest', deleteSessionsRequest)\n const localVarPath = `/sessions/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n localVarHeaderParameter['Content-Type'] = 'application/json';\n\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = serializeDataIfNeeded(deleteSessionsRequest, localVarRequestOptions, configuration)\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * List user sessions\n * @summary List user sessions\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n listSessions: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n const localVarPath = `/sessions/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * SessionManagementApi - functional programming interface\n */\nexport const SessionManagementApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = SessionManagementApiAxiosParamCreator(configuration)\n return {\n /**\n * Delete user sessions\n * @summary Delete user sessions\n * @param {DeleteSessionsRequest} deleteSessionsRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async deleteSessions(deleteSessionsRequest: DeleteSessionsRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.deleteSessions(deleteSessionsRequest, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['SessionManagementApi.deleteSessions']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * List user sessions\n * @summary List user sessions\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async listSessions(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ListSessions>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.listSessions(options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['SessionManagementApi.listSessions']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * SessionManagementApi - factory interface\n */\nexport const SessionManagementApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = SessionManagementApiFp(configuration)\n return {\n /**\n * Delete user sessions\n * @summary Delete user sessions\n * @param {DeleteSessionsRequest} deleteSessionsRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n deleteSessions(deleteSessionsRequest: DeleteSessionsRequest, options?: RawAxiosRequestConfig): AxiosPromise<void> {\n return localVarFp.deleteSessions(deleteSessionsRequest, options).then((request) => request(axios, basePath));\n },\n /**\n * List user sessions\n * @summary List user sessions\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n listSessions(options?: RawAxiosRequestConfig): AxiosPromise<ListSessions> {\n return localVarFp.listSessions(options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * SessionManagementApi - object-oriented interface\n */\nexport class SessionManagementApi extends BaseAPI {\n /**\n * Delete user sessions\n * @summary Delete user sessions\n * @param {DeleteSessionsRequest} deleteSessionsRequest \n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public deleteSessions(deleteSessionsRequest: DeleteSessionsRequest, options?: RawAxiosRequestConfig) {\n return SessionManagementApiFp(this.configuration).deleteSessions(deleteSessionsRequest, options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * List user sessions\n * @summary List user sessions\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public listSessions(options?: RawAxiosRequestConfig) {\n return SessionManagementApiFp(this.configuration).listSessions(options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n\n/**\n * UserProfileApi - axios parameter creator\n */\nexport const UserProfileApiAxiosParamCreator = function (configuration?: Configuration) {\n return {\n /**\n * Retrieve the authenticated user\\'s profile information including roles and authentication configuration\n * @summary Get user profile\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getUserProfile: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n const localVarPath = `/profile/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n\n // authentication SessionCookie required\n\n\n \n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n /**\n * Update the authenticated user\\'s profile information including name, mobile number, authentication settings, and profile picture\n * @summary Update user profile\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [name] User\\\\\\'s display name\n * @param {string} [mobile] User\\\\\\'s mobile number with country code\n * @param {string} [authConfig] JSON string containing authentication configuration\n * @param {File} [profilePic] Profile picture file upload\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n updateUserProfile: async (xCSRFToken: string, name?: string, mobile?: string, authConfig?: string, profilePic?: File, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {\n // verify required parameter 'xCSRFToken' is not null or undefined\n assertParamExists('updateUserProfile', 'xCSRFToken', xCSRFToken)\n const localVarPath = `/profile/`;\n // use dummy base URL string because the URL constructor only accepts absolute URLs.\n const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);\n let baseOptions;\n if (configuration) {\n baseOptions = configuration.baseOptions;\n }\n\n const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options};\n const localVarHeaderParameter = {} as any;\n const localVarQueryParameter = {} as any;\n const localVarFormParams = new ((configuration && configuration.formDataCtor) || FormData)();\n\n // authentication SessionCookie required\n\n\n if (name !== undefined) { \n localVarFormParams.append('name', name as any);\n }\n \n if (mobile !== undefined) { \n localVarFormParams.append('mobile', mobile as any);\n }\n \n if (authConfig !== undefined) { \n localVarFormParams.append('auth_config', authConfig as any);\n }\n \n if (profilePic !== undefined) { \n localVarFormParams.append('profile_pic', profilePic as any);\n }\n \n \n localVarHeaderParameter['Content-Type'] = 'multipart/form-data';\n \n if (xCSRFToken != null) {\n localVarHeaderParameter['X-CSRFToken'] = String(xCSRFToken);\n }\n setSearchParams(localVarUrlObj, localVarQueryParameter);\n let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};\n localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};\n localVarRequestOptions.data = localVarFormParams;\n\n return {\n url: toPathString(localVarUrlObj),\n options: localVarRequestOptions,\n };\n },\n }\n};\n\n/**\n * UserProfileApi - functional programming interface\n */\nexport const UserProfileApiFp = function(configuration?: Configuration) {\n const localVarAxiosParamCreator = UserProfileApiAxiosParamCreator(configuration)\n return {\n /**\n * Retrieve the authenticated user\\'s profile information including roles and authentication configuration\n * @summary Get user profile\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async getUserProfile(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ProfileResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.getUserProfile(options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['UserProfileApi.getUserProfile']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n /**\n * Update the authenticated user\\'s profile information including name, mobile number, authentication settings, and profile picture\n * @summary Update user profile\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [name] User\\\\\\'s display name\n * @param {string} [mobile] User\\\\\\'s mobile number with country code\n * @param {string} [authConfig] JSON string containing authentication configuration\n * @param {File} [profilePic] Profile picture file upload\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n async updateUserProfile(xCSRFToken: string, name?: string, mobile?: string, authConfig?: string, profilePic?: File, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UpdateProfileResponse>> {\n const localVarAxiosArgs = await localVarAxiosParamCreator.updateUserProfile(xCSRFToken, name, mobile, authConfig, profilePic, options);\n const localVarOperationServerIndex = configuration?.serverIndex ?? 0;\n const localVarOperationServerBasePath = operationServerMap['UserProfileApi.updateUserProfile']?.[localVarOperationServerIndex]?.url;\n return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);\n },\n }\n};\n\n/**\n * UserProfileApi - factory interface\n */\nexport const UserProfileApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {\n const localVarFp = UserProfileApiFp(configuration)\n return {\n /**\n * Retrieve the authenticated user\\'s profile information including roles and authentication configuration\n * @summary Get user profile\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n getUserProfile(options?: RawAxiosRequestConfig): AxiosPromise<ProfileResponse> {\n return localVarFp.getUserProfile(options).then((request) => request(axios, basePath));\n },\n /**\n * Update the authenticated user\\'s profile information including name, mobile number, authentication settings, and profile picture\n * @summary Update user profile\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [name] User\\\\\\'s display name\n * @param {string} [mobile] User\\\\\\'s mobile number with country code\n * @param {string} [authConfig] JSON string containing authentication configuration\n * @param {File} [profilePic] Profile picture file upload\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n updateUserProfile(xCSRFToken: string, name?: string, mobile?: string, authConfig?: string, profilePic?: File, options?: RawAxiosRequestConfig): AxiosPromise<UpdateProfileResponse> {\n return localVarFp.updateUserProfile(xCSRFToken, name, mobile, authConfig, profilePic, options).then((request) => request(axios, basePath));\n },\n };\n};\n\n/**\n * UserProfileApi - object-oriented interface\n */\nexport class UserProfileApi extends BaseAPI {\n /**\n * Retrieve the authenticated user\\'s profile information including roles and authentication configuration\n * @summary Get user profile\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public getUserProfile(options?: RawAxiosRequestConfig) {\n return UserProfileApiFp(this.configuration).getUserProfile(options).then((request) => request(this.axios, this.basePath));\n }\n\n /**\n * Update the authenticated user\\'s profile information including name, mobile number, authentication settings, and profile picture\n * @summary Update user profile\n * @param {string} xCSRFToken CSRF token for security\n * @param {string} [name] User\\\\\\'s display name\n * @param {string} [mobile] User\\\\\\'s mobile number with country code\n * @param {string} [authConfig] JSON string containing authentication configuration\n * @param {File} [profilePic] Profile picture file upload\n * @param {*} [options] Override http request option.\n * @throws {RequiredError}\n */\n public updateUserProfile(xCSRFToken: string, name?: string, mobile?: string, authConfig?: string, profilePic?: File, options?: RawAxiosRequestConfig) {\n return UserProfileApiFp(this.configuration).updateUserProfile(xCSRFToken, name, mobile, authConfig, profilePic, options).then((request) => request(this.axios, this.basePath));\n }\n}\n\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Auth API\n * API collection for app authentication\n *\n * The version of the OpenAPI document: 1.0.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nexport interface ConfigurationParameters {\n apiKey?: string | Promise<string> | ((name: string) => string) | ((name: string) => Promise<string>);\n username?: string;\n password?: string;\n accessToken?: string | Promise<string> | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise<string>);\n basePath?: string;\n serverIndex?: number;\n baseOptions?: any;\n formDataCtor?: new () => any;\n}\n\nexport class Configuration {\n /**\n * parameter for apiKey security\n * @param name security name\n */\n apiKey?: string | Promise<string> | ((name: string) => string) | ((name: string) => Promise<string>);\n /**\n * parameter for basic security\n */\n username?: string;\n /**\n * parameter for basic security\n */\n password?: string;\n /**\n * parameter for oauth2 security\n * @param name security name\n * @param scopes oauth2 scope\n */\n accessToken?: string | Promise<string> | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise<string>);\n /**\n * override base path\n */\n basePath?: string;\n /**\n * override server index\n */\n serverIndex?: number;\n /**\n * base options for axios calls\n */\n baseOptions?: any;\n /**\n * The FormData constructor that will be used to create multipart form data\n * requests. You can inject this here so that execution environments that\n * do not support the FormData class can still run the generated client.\n *\n * @type {new () => FormData}\n */\n formDataCtor?: new () => any;\n\n constructor(param: ConfigurationParameters = {}) {\n this.apiKey = param.apiKey;\n this.username = param.username;\n this.password = param.password;\n this.accessToken = param.accessToken;\n this.basePath = param.basePath;\n this.serverIndex = param.serverIndex;\n this.baseOptions = {\n ...param.baseOptions,\n headers: {\n ...param.baseOptions?.headers,\n },\n };\n this.formDataCtor = param.formDataCtor;\n }\n\n /**\n * Check if the given MIME is a JSON MIME.\n * JSON MIME examples:\n * application/json\n * application/json; charset=UTF8\n * APPLICATION/JSON\n * application/vnd.company+json\n * @param mime - MIME (Multipurpose Internet Mail Extensions)\n * @return True if the given MIME is JSON, false otherwise.\n */\n public isJsonMime(mime: string): boolean {\n const jsonMime: RegExp = new RegExp('^(application\\/json|[^;/ \\t]+\\/[^;/ \\t]+[+]json)[ \\t]*(;.*)?$', 'i');\n return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json');\n }\n}","import {\n Configuration,\n AuthenticationApi,\n ApplicationConfigurationApi,\n LoginWithOTPApi,\n MultiFactorAuthenticationApi,\n PasswordManagementApi,\n RoleManagementApi,\n OAuthApi,\n UserProfileApi,\n LoginUserRequest,\n OauthRedirectProviderEnum,\n OauthCallbackProviderEnum\n} from './network';\nimport type { RawAxiosRequestConfig } from 'axios';\n\nconst BASE_PATH = \"/api/v1/appauth\";\n\n// Create API configuration\nconst apiConfig = new Configuration({\n basePath: BASE_PATH, // Use relative path for proxy\n baseOptions: {\n withCredentials: true, // for cookie-based auth\n },\n});\n\n// Initialize API clients\nconst authApi = new AuthenticationApi(apiConfig);\nconst configApi = new ApplicationConfigurationApi(apiConfig);\nconst otpApi = new LoginWithOTPApi(apiConfig);\nconst mfaApi = new MultiFactorAuthenticationApi(apiConfig);\nconst passwordApi = new PasswordManagementApi(apiConfig);\nconst roleApi = new RoleManagementApi(apiConfig);\nconst oauthApi = new OAuthApi(apiConfig);\nconst profileApi = new UserProfileApi(apiConfig);\n\n// Helper to get CSRF token\nconst getCsrfToken = () => {\n // Try to get from cookie first (Django default)\n const match = document.cookie.match(/csrftoken=([^;]+)/);\n if (match) return decodeURIComponent(match[1]);\n\n // Try to get from meta tag\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\n if (metaTag) return metaTag.getAttribute('content');\n\n // Try alternative cookie names\n const altMatch = document.cookie.match(/csrf_token=([^;]+)/);\n if (altMatch) return decodeURIComponent(altMatch[1]);\n\n console.warn('CSRF token not found. OTP requests may fail.');\n return '';\n};\n\nconst defaultConfig = {\n loginEndpoint: '/api/auth/login',\n logoutEndpoint: '/api/auth/logout',\n verifyEndpoint: '/api/auth/verify',\n forgotPasswordEndpoint: '/api/auth/forgot-password',\n resetPasswordEndpoint: '/api/auth/reset-password',\n loginMethodsEndpoint: '/api/v1/login/?action=fetch_methods',\n otpRequestEndpoint: '/api/auth/otp/request',\n otpVerifyEndpoint: '/api/auth/otp/verify',\n roleSelectionEndpoint: '/api/auth/role/select',\n twoFactorSendEndpoint: '/api/auth/2fa/send',\n twoFactorVerifyEndpoint: '/api/auth/2fa/verify',\n passwordChangeEndpoint: '/api/auth/password/change',\n headers: {\n 'Content-Type': 'application/json'\n }\n};\n\nexport { authApi, configApi, otpApi, mfaApi, passwordApi, roleApi };\n\n// Store the auth configuration and loading promise\nlet authConfig: any = null;\nlet authConfigPromise: Promise<any> | null = null;\n\n// Helper to extract error message from API response\nconst extractErrorMessage = (error: any): string => {\n if (error.response?.data?.errors?.[0]?.message) {\n return error.response.data.errors[0].message;\n }\n if (error.response?.data?.response?.errors?.[0]?.message) {\n return error.response.data.response.errors[0].message;\n }\n if (error.response?.data?.response?.message) {\n return error.response.data.response.message;\n }\n if (error.response?.data?.message) {\n return error.response.data.message;\n }\n if (error.message) {\n return error.message;\n }\n return 'An unexpected error occurred';\n};\n\nexport const authService = {\n async getAuthConfig() {\n // Return cached config if already loaded\n if (authConfig) {\n return authConfig;\n }\n\n // If there's already a request in progress, return that promise\n if (authConfigPromise) {\n return authConfigPromise;\n }\n\n // Start the API request and cache the promise\n authConfigPromise = (async () => {\n try {\n const response = await configApi.getAppAuthConfig();\n // Extract the auth_config from the response, handling different API response structures\n const rawData = response.data as any;\n if (rawData?.response?.auth_config) {\n authConfig = rawData.response.auth_config;\n } else if (rawData?.auth_config) {\n authConfig = rawData.auth_config;\n } else {\n authConfig = rawData;\n }\n return authConfig;\n } catch (error) {\n console.error('Failed to fetch auth config:', error);\n // Clear the promise on error so it can be retried\n authConfigPromise = null;\n throw error;\n } finally {\n // Clear the promise once completed (success or failure)\n authConfigPromise = null;\n }\n })();\n\n return authConfigPromise;\n },\n\n getConfig() {\n return authConfig;\n },\n\n // Login methods configuration\n isPasswordLoginEnabled() {\n return authConfig?.login_methods?.password?.enabled || false;\n },\n\n isOTPLoginEnabled() {\n return authConfig?.login_methods?.otp?.enabled || false;\n },\n\n isSSOEnabled() {\n return authConfig?.login_methods?.sso?.enabled || false;\n },\n\n isOIDCEnabled() {\n return authConfig?.login_methods?.oidc?.enabled || false;\n },\n\n getOIDCProviders() {\n return authConfig?.login_methods?.oidc?.providers || [];\n },\n\n getSSOProviders() {\n return authConfig?.login_methods?.sso?.providers || [];\n },\n\n getAllowedUsernames() {\n // First check password-specific allowed usernames, then fallback to general\n const usernames = authConfig?.login_methods?.password?.allowed_usernames ||\n authConfig?.login_methods?.allowed_usernames ||\n ['email'];\n\n // Normalize 'phone' to 'mobile' for consistency with UI\n return usernames.map((username: string) => username === 'phone' ? 'mobile' : username);\n },\n\n isForgotPasswordEnabled() {\n return authConfig?.password_policy?.reset?.enabled || false;\n },\n\n getPasswordResetLinkExpiry() {\n return authConfig?.login_methods?.password?.password_reset_link_expiry_hours || 24;\n },\n\n // Session policy configuration\n getSessionPolicy() {\n return authConfig?.session_policy || {};\n },\n\n isRememberMeEnabled() {\n // Default to true if session policy is not configured\n return authConfig?.session_policy?.remember_me_enabled !== false;\n },\n\n getRememberMeDurationDays() {\n return authConfig?.session_policy?.remember_me_duration_days || 30;\n },\n\n // Password policy configuration\n getPasswordPolicy() {\n return authConfig?.password_policy || {};\n },\n\n getPasswordResetMethods() {\n return authConfig?.password_policy?.reset?.method || [];\n },\n\n isPasswordResetEnabled() {\n return authConfig?.password_policy?.reset?.enabled || false;\n },\n\n getPasswordResetExpiry() {\n return authConfig?.password_policy?.reset?.expiry_hours || 24;\n },\n\n // Two-factor authentication configuration\n isTwoFactorRequired() {\n return authConfig?.two_factor_auth?.required || false;\n },\n\n getTwoFactorMethods() {\n return authConfig?.two_factor_auth?.allowedMethods || [];\n },\n\n getTwoFactorHooks() {\n return {\n email: authConfig?.two_factor_auth?.email_hook,\n sms: authConfig?.two_factor_auth?.sms_hook\n };\n },\n\n async login(credentials: any, config = {}) {\n try {\n // Ensure we have auth config\n if (!authConfig) {\n await this.getAuthConfig();\n }\n\n // Use the OpenAPI client for login\n const csrfToken = getCsrfToken() || '';\n const loginRequest: LoginUserRequest = credentials;\n\n const response = await authApi.loginUser(csrfToken, loginRequest);\n\n // Handle successful response with nested structure\n const responseData = response.data as any;\n if (responseData?.success && responseData?.response) {\n // Extract the actual response data\n const actualResponse = responseData.response;\n\n // Check if it's a 401 with next_step (multi-step auth)\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n\n // Regular successful login\n return actualResponse.data || actualResponse;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Login error:', error);\n\n // Check for account lockout\n if (error.response?.data?.response?.error_code === 'ACCOUNT_LOCKED') {\n window.location.href = '/app/login';\n // Return a promise that never resolves to prevent further execution while redirecting\n return new Promise(() => { });\n }\n\n // Check if this is a 401 with next_step data (multi-step auth)\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // Handle nested response structure\n if (responseData?.success && responseData?.response) {\n const actualResponse = responseData.response;\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n return responseData;\n }\n }\n\n // Extract and throw specific error message\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n\n throw error;\n }\n },\n\n async logout(config = {}) {\n try {\n const csrfToken = getCsrfToken() || '';\n await authApi.logoutUser(csrfToken);\n } catch (error) {\n console.error('Logout error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async getCurrentUser() {\n try {\n // Import the cookie utility here to avoid circular dependencies\n const { isAuthenticatedViaCookie } = await import('../../framework/utils/cookieUtils');\n\n // First check if user is authenticated via cookie (fast, no API call)\n if (!isAuthenticatedViaCookie()) {\n throw new Error('Not authenticated - no valid session cookie');\n }\n\n // If cookie exists, return a basic authenticated user object\n // This avoids the need for API calls just to check authentication status\n return {\n id: 1,\n username: 'authenticated_user',\n email: 'user@example.com',\n authenticated: true\n };\n } catch (error: any) {\n console.error('Get current user failed:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw new Error('Authentication verification failed');\n }\n },\n\n // Legacy method name for compatibility\n async verifyToken(token: string, config = {}) {\n // For cookie-based auth, we don't need the token parameter\n // Just call getCurrentUser instead\n return this.getCurrentUser();\n },\n\n async forgotPassword(data: { email?: string; phone?: string } | string) {\n try {\n if (typeof data === 'string') {\n return this.requestPasswordReset({ email: data });\n }\n return this.requestPasswordReset(data);\n } catch (error) {\n throw error;\n }\n },\n\n async requestPasswordReset(data: { email?: string; phone?: string }) {\n try {\n const csrfToken = getCsrfToken() || '';\n // Use axios directly for now as the generated client might not have these specific endpoints yet\n // or they are named differently. Based on spec: POST /password/reset/request/\n const response = await passwordApi['axios'].post(`${BASE_PATH}/password/reset/request/`, data, {\n headers: { 'X-CSRFToken': csrfToken }\n });\n\n return response.data;\n } catch (error: any) {\n console.error('Request password reset error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async validatePasswordResetKey(key: string) {\n try {\n // GET /password/reset/ with header x-password-reset-key\n const response = await passwordApi['axios'].get(`${BASE_PATH}/password/reset/`, {\n headers: {\n 'x-password-reset-key': key\n }\n });\n return response.data;\n } catch (error: any) {\n console.error('Validate password reset key error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async confirmResetPassword(data: { key: string; password: string }) {\n try {\n const csrfToken = getCsrfToken() || '';\n // POST /password/reset/ with payload { key, password }\n const response = await passwordApi['axios'].post(`${BASE_PATH}/password/reset/`, data, {\n headers: { 'X-CSRFToken': csrfToken }\n });\n return response.data;\n } catch (error: any) {\n console.error('Confirm reset password error:', error);\n\n // Check if this is a 401 with next_step data\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // Handle nested response structure\n if (responseData?.success && responseData?.response) {\n const actualResponse = responseData.response;\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n }\n }\n\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n\n throw error;\n }\n },\n\n async fetchLoginMethods() {\n try {\n // Login methods are now part of the auth config\n const config = await this.getAuthConfig();\n return config?.login_methods || {};\n } catch (error) {\n throw error;\n }\n },\n\n async requestOTP(identifier: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n\n // Determine if identifier is email or phone based on format\n const isEmail = identifier.includes('@');\n const otpRequest = isEmail\n ? { email: identifier }\n : { phone: identifier };\n\n const response = await otpApi.requestLoginOTP(csrfToken, otpRequest);\n\n // Handle response structure - the API may return nested response data\n const responseData = response.data as any;\n if (responseData?.success && responseData?.response) {\n // Check if it's a 401 (OTP sent successfully, waiting for verification)\n if (responseData.response.status === 401 && responseData.response.data?.message) {\n return responseData.response;\n }\n return responseData.response.data || responseData.response;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Send Code error:', error);\n\n // Check if this is a 401 with success response (OTP sent successfully)\n if (error.response?.status === 401 && error.response?.data) {\n const errorData = error.response.data;\n\n // Handle nested response structure with success:true\n if (errorData?.success && errorData?.response) {\n const actualResponse = errorData.response;\n if (actualResponse.status === 401 && actualResponse.data?.message) {\n return actualResponse;\n }\n }\n }\n\n // Check if this is a 401 with success response (OTP sent successfully)\n if (error.response?.status === 401 && error.response?.data) {\n const errorData = error.response.data;\n\n // Handle nested response structure with success:true\n if (errorData?.success && errorData?.response) {\n const actualResponse = errorData.response;\n if (actualResponse.status === 401 && actualResponse.data?.message) {\n console.log('OTP sent successfully (401 in error handler):', actualResponse.data.message);\n return actualResponse;\n }\n }\n }\n\n // Extract meaningful error message from response\n if (error.response?.data) {\n const errorData = error.response.data;\n\n // Handle errors array format (e.g., { status: 400, errors: [{ message: \"...\" }] })\n if (errorData?.errors && Array.isArray(errorData.errors) && errorData.errors.length > 0) {\n const firstError = errorData.errors[0];\n throw new Error(firstError.message || 'Failed to send OTP');\n }\n\n if (errorData?.response?.data?.message) {\n throw new Error(errorData.response.data.message);\n } else if (errorData?.message) {\n throw new Error(errorData.message);\n }\n }\n\n throw error;\n }\n },\n\n async verifyOTP(identifier: string, otp: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n\n // According to spec, verify only needs the code\n const verifyRequest = { code: otp };\n const response = await otpApi.verifyLoginOTP(csrfToken, verifyRequest);\n\n // Handle response structure - the API may return nested response data\n const responseData = response.data as any;\n if (responseData?.success && responseData?.response) {\n // Check if it's a 401 with next_step (multi-step auth)\n if (responseData.response.status === 401 && responseData.response.data?.next_step) {\n return responseData.response;\n }\n\n // Regular successful OTP verification\n return responseData.response;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Verify OTP error:', error);\n\n // Check for account lockout\n if (error.response?.data?.response?.error_code === 'ACCOUNT_LOCKED') {\n window.location.href = '/app/login';\n // Return a promise that never resolves to prevent further execution while redirecting\n return new Promise(() => { });\n }\n\n // Check if this is a 401 with next_step data (multi-step auth)\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // Handle nested response structure\n if (responseData?.success && responseData?.response) {\n const actualResponse = responseData.response;\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n return responseData;\n }\n }\n\n // Extract meaningful error message from response\n if (error.response?.data) {\n const errorData = error.response.data;\n\n // Handle errors array format (e.g., { status: 400, errors: [{ message: \"Incorrect code.\" }] })\n if (errorData?.errors && Array.isArray(errorData.errors) && errorData.errors.length > 0) {\n const firstError = errorData.errors[0];\n throw new Error(firstError.message || 'Verification failed');\n }\n\n if (errorData?.response?.data?.message) {\n throw new Error(errorData.response.data.message);\n } else if (errorData?.message) {\n throw new Error(errorData.message);\n }\n }\n\n throw error;\n }\n },\n\n async selectRole(roleId: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n // Try passing just the role ID as a string\n const response = await roleApi.setRole(csrfToken, roleId);\n\n // Handle successful response with nested structure\n const responseData = response.data as any;\n if (responseData?.success && responseData?.response) {\n // Extract the actual response data\n const actualResponse = responseData.response;\n\n // Check if it's a 401 with next_step (multi-step auth)\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n\n // Regular successful role selection\n return actualResponse.data || actualResponse;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Select role error:', error);\n\n // Check if this is a 401 with next_step data (multi-step auth)\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // Handle nested response structure\n if (responseData?.success && responseData?.response) {\n const actualResponse = responseData.response;\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n return responseData;\n }\n }\n\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n\n throw error;\n }\n },\n\n async sendTwoFactorCode() {\n try {\n const response = await mfaApi.getMfaCode();\n return response.data;\n } catch (error) {\n console.error('Send 2FA code error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async verifyTwoFactorCode(code: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const response = await mfaApi.verifyMfaCode(csrfToken, { code });\n return response.data;\n } catch (error) {\n console.error('Verify 2FA code error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async changePassword(currentPassword: string, newPassword: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const response = await passwordApi.changePassword(csrfToken, {\n current_password: currentPassword,\n new_password: newPassword\n });\n return response.data;\n } catch (error) {\n console.error('Change password error:', error);\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n throw error;\n }\n },\n\n async setPassword(newPassword: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const response = await passwordApi.setPassword(csrfToken, {\n new_password: newPassword\n });\n return response.data;\n } catch (error: any) {\n console.error('Set password error:', error);\n\n // Check if this is a 401 with next_step data (multi-step auth)\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // If there's a next_step in the response, this is part of the auth flow\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n return responseData; // Return the response data instead of throwing\n }\n }\n\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n\n throw error;\n }\n },\n\n async processOAuthCallback(provider: OauthCallbackProviderEnum, state: string, code: string, scope: string, authUser?: string, hd?: string, prompt?: string, options?: RawAxiosRequestConfig) {\n try {\n const csrfToken = getCsrfToken() || '';\n const resp = await oauthApi.oauthCallback(provider, state, code, scope, csrfToken, authUser, hd, prompt, options);\n\n // Handle successful response with nested structure\n const responseData = resp.data as any;\n if (responseData?.success && responseData?.response) {\n // Extract the actual response data\n const actualResponse = responseData.response;\n\n // Check if it's a 401 with next_step (multi-step auth)\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n\n // Regular successful login\n return actualResponse.data || actualResponse;\n }\n\n return resp.data;\n\n } catch (error: any) {\n\n // Check if this is a 401 with next_step data (multi-step auth)\n if (error.response?.status === 401 && error.response?.data) {\n const responseData = error.response.data;\n\n // Handle nested response structure\n if (responseData?.success && responseData?.response) {\n const actualResponse = responseData.response;\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n return responseData;\n }\n }\n\n const errorMessage = extractErrorMessage(error);\n if (errorMessage !== 'An unexpected error occurred') {\n throw new Error(errorMessage);\n }\n\n throw error;\n }\n },\n\n // Clear cached config (useful for testing or re-authentication)\n clearConfig() {\n authConfig = null;\n authConfigPromise = null;\n },\n\n // Fast cookie-based authentication check without API calls\n async isAuthenticated() {\n try {\n const { isAuthenticatedViaCookie } = await import('../../framework/utils/cookieUtils');\n return isAuthenticatedViaCookie();\n } catch (error) {\n console.error('Authentication check failed:', error);\n return false;\n }\n },\n\n // Helper method to validate password against policy\n validatePassword(password: string) {\n const policy = this.getPasswordPolicy();\n const errors: string[] = [];\n\n if (policy.min_length && password.length < policy.min_length) {\n errors.push(`Password must be at least ${policy.min_length} characters long`);\n }\n\n if (policy.max_length && password.length > policy.max_length) {\n errors.push(`Password must be at most ${policy.max_length} characters long`);\n }\n\n if (policy.require_numbers && !/\\d/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n if (policy.require_lowercase && !/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter');\n }\n\n if (policy.require_uppercase && !/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter');\n }\n\n if (policy.require_special_chars && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n },\n\n async oauthRedirect(provider: OauthRedirectProviderEnum, callbackUrl: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const resp = await oauthApi.oauthRedirect(csrfToken, provider, 'login', callbackUrl);\n return resp.data;\n } catch (error) {\n throw error;\n }\n },\n\n async getUserProfile() {\n try {\n // Create a custom config for the profile endpoint which uses a different base path\n const profileConfig = new Configuration({\n basePath: \"/api/v1\", // Different from appauth endpoints\n baseOptions: {\n withCredentials: true,\n },\n });\n const customProfileApi = new UserProfileApi(profileConfig);\n const response = await customProfileApi.getUserProfile();\n return response.data;\n } catch (error) {\n console.error('Get user profile error:', error);\n throw error;\n }\n },\n\n async initiateSAMLAuth(samlId: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const requestBody = {\n saml_id: samlId\n };\n\n // Make direct fetch call since SAML API is not in the generated client\n const response = await fetch('/api/v1/appauth/saml/init/', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRFToken': csrfToken,\n },\n credentials: 'include',\n body: JSON.stringify(requestBody)\n });\n\n const responseText = await response.text();\n\n if (!response.ok) {\n let errorMessage = `SAML init failed: ${response.status} ${response.statusText}`;\n\n // Try to parse error response for more details\n try {\n const errorData = JSON.parse(responseText);\n\n // Extract error message following ErrorResponse schema structure\n if (errorData?.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData?.message) {\n errorMessage = errorData.message;\n } else if (errorData?.detail) {\n errorMessage = errorData.detail;\n }\n } catch (e) {\n // If response is not JSON, include raw text\n if (responseText && responseText.length < 500) {\n errorMessage += ` - ${responseText}`;\n }\n }\n\n throw new Error(errorMessage);\n }\n\n const data = JSON.parse(responseText);\n\n // Handle response structure - extract redirect_url\n if (data?.success && data?.response) {\n // Check if response is a direct URL string\n if (typeof data.response === 'string' && data.response.startsWith('http')) {\n return { redirect_url: data.response };\n }\n // Check if response has nested redirect_url\n else if (data.response?.redirect_url) {\n return { redirect_url: data.response.redirect_url };\n }\n }\n // Check for direct redirect_url in data\n else if (data?.redirect_url) {\n return { redirect_url: data.redirect_url };\n }\n\n return data;\n } catch (error) {\n console.error('SAML init error:', error);\n throw error;\n }\n },\n\n async getSAMLAuthMeta(token: string, requestId: string) {\n try {\n const response = await fetch(`/api/v1/appauth/saml/ops/?token=${encodeURIComponent(token)}&request_id=${encodeURIComponent(requestId)}&action=get_metadata`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include'\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n // Parse the error response following the ErrorResponse schema\n let errorMessage = `SAML auth meta failed: ${response.status} ${response.statusText}`;\n\n // Extract error message from ErrorResponse schema structure\n if (data?.error?.message) {\n errorMessage = data.error.message;\n } else if (data?.message) {\n errorMessage = data.message;\n } else if (data?.detail) {\n errorMessage = data.detail;\n }\n\n throw new Error(errorMessage);\n }\n\n // Handle response structure similar to other auth methods\n if (data?.success && data?.response) {\n const actualResponse = data.response;\n\n // Check if it's a 401 with next_step (multi-step auth)\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n\n // Regular successful authentication\n return actualResponse.data || actualResponse;\n }\n\n return data;\n } catch (error) {\n console.error('SAML auth meta error:', error);\n throw error;\n }\n },\n\n async setRole(roleId: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n\n const response = await fetch(`/api/v1/appauth/role/set/?role=${encodeURIComponent(roleId)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRFToken': csrfToken,\n },\n credentials: 'include'\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Role set failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Handle successful response with nested structure\n if (data?.success && data?.response) {\n const actualResponse = data.response;\n\n // Check if it's a 401 with next_step (multi-step auth)\n if (actualResponse.status === 401 && actualResponse.data?.next_step) {\n return actualResponse;\n }\n\n // Regular successful role setting\n return actualResponse.data || actualResponse;\n }\n\n return data;\n } catch (error) {\n console.error('Set role error:', error);\n throw error;\n }\n }\n};","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create } from 'zustand';\n\ninterface AuthStore {\n basePath: string;\n setBasePath: (path: string) => void;\n}\n\nconst useAuthStore = create<AuthStore>((set) => ({\n basePath: '/login',\n setBasePath: (path: string) => set({ basePath: path }),\n}));\n\nexport default useAuthStore;","import React, { createContext, useContext, ReactNode } from 'react';\nimport type { AuthConfig } from '../../types';\n\ninterface AuthConfigContextType {\n authConfig: AuthConfig;\n getLoginConfig: () => AuthConfig['login'];\n getRoleSelectionConfig: () => AuthConfig['roleSelection'];\n getTwoFactorConfig: () => AuthConfig['twoFactor'];\n getResetPasswordConfig: () => AuthConfig['resetPassword'];\n getThemeConfig: () => AuthConfig['theme'];\n getCardConfig: () => AuthConfig['card'];\n getLogoConfig: () => AuthConfig['logo'];\n getProvidersConfig: () => AuthConfig['providers'];\n getMessagesConfig: () => AuthConfig['messages'];\n getCustomComponents: () => AuthConfig['customComponents'];\n}\n\ninterface AuthConfigProviderProps {\n children: ReactNode;\n authConfig?: AuthConfig;\n}\n\nconst AuthConfigContext = createContext<AuthConfigContextType | undefined>(undefined);\n\nexport const useAuthConfig = (): AuthConfigContextType => {\n const context = useContext(AuthConfigContext);\n if (!context) {\n throw new Error('useAuthConfig must be used within AuthConfigProvider');\n }\n return context;\n};\n\nexport const AuthConfigProvider: React.FC<AuthConfigProviderProps> = ({\n children,\n authConfig = {}\n}) => {\n // Default configurations\n const defaultAuthConfig: AuthConfig = {\n theme: {\n background: {\n color: '#f0f2f5'\n },\n primaryColor: '#1890ff',\n secondaryColor: '#6d7280',\n borderRadius: '8px'\n },\n card: {\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n maxWidth: '400px',\n padding: '40px'\n },\n logo: {\n position: 'center',\n alt: 'Logo'\n },\n login: {\n title: 'Welcome Back',\n subtitle: 'Please sign in to your account',\n submitButtonText: 'Sign in',\n rememberMeText: 'Remember me',\n forgotPasswordText: 'Forgot password?',\n otpButtonText: 'Sign in with OTP',\n showRememberMe: true,\n enableTabSwitching: true,\n defaultTab: 'email',\n formLabels: {\n email: 'Email',\n mobile: 'Mobile',\n password: 'Password'\n },\n formPlaceholders: {\n email: 'Email address',\n mobile: 'Mobile number (+919876543210)',\n password: 'Password'\n },\n tabLabels: {\n email: 'Email',\n mobile: 'Mobile'\n }\n },\n roleSelection: {\n title: 'Choose Your Role',\n subtitle: 'Select the role that best matches your current responsibilities',\n continueButtonText: 'Continue as {roleName}',\n recommendedBadgeText: 'Recommended',\n emptyStateMessage: 'No roles available',\n cardLayout: 'grid',\n gridColumns: 3,\n roleCardStyling: {\n backgroundColor: '#ffffff',\n selectedColor: '#1890ff',\n hoverColor: '#f0f2f5',\n borderRadius: '8px'\n }\n },\n twoFactor: {\n title: 'Two-Factor Authentication',\n subtitle: 'Please enter your verification code',\n instructionText: 'Enter the verification code sent to your device',\n codeInputLabel: 'Verification Code',\n submitButtonText: 'Verify',\n resendButtonText: 'Resend Code',\n backButtonText: 'Back',\n resendCountdown: 60,\n codeLength: 6,\n methodLabels: {\n email: 'Email',\n sms: 'SMS',\n mobile: 'Mobile'\n }\n },\n resetPassword: {\n forgotPassword: {\n title: 'Forgot Password',\n subtitle: 'Enter your email address to reset your password',\n instructionText: 'We will send you a reset link',\n emailLabel: 'Email',\n emailPlaceholder: 'Enter your email address',\n submitButtonText: 'Send Reset Link',\n backToLoginText: 'Back to Login',\n successMessage: 'Reset email sent successfully',\n errorMessage: 'Failed to send reset email'\n },\n resetForm: {\n title: 'Reset Password',\n subtitle: 'Enter your new password',\n passwordLabel: 'New Password',\n confirmPasswordLabel: 'Confirm Password',\n passwordPlaceholder: 'Enter new password',\n confirmPasswordPlaceholder: 'Confirm new password',\n submitButtonText: 'Reset Password',\n successMessage: 'Password reset successfully',\n showPasswordRequirements: true,\n passwordRequirementsText: 'Password requirements:'\n }\n },\n providers: {\n buttonStyle: 'outline',\n showProviderIcons: true,\n separatorText: 'OR'\n },\n messages: {\n validation: {\n required: 'This field is required',\n invalidEmail: 'Please enter a valid email',\n invalidMobile: 'Please enter a valid mobile number',\n passwordTooShort: 'Password is too short',\n passwordsDoNotMatch: 'Passwords do not match'\n },\n errors: {\n loginFailed: 'Login failed. Please try again.',\n networkError: 'Network error. Please check your connection.',\n invalidOTP: 'Invalid verification code',\n expiredToken: 'Token has expired'\n },\n success: {\n loginSuccess: 'Login successful!',\n otpSent: 'Verification code sent!',\n passwordReset: 'Password reset successfully!',\n roleSelected: 'Role selected successfully!'\n }\n }\n };\n\n // Deep merge function to combine default and custom configs\n const deepMerge = (target: any, source: any): any => {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] !== null && typeof source[key] === 'object' && !Array.isArray(source[key]) && !React.isValidElement(source[key])) {\n result[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n };\n\n // Merge default config with provided config\n const mergedConfig = deepMerge(defaultAuthConfig, authConfig);\n\n const value: AuthConfigContextType = {\n authConfig: mergedConfig,\n getLoginConfig: () => mergedConfig.login || {},\n getRoleSelectionConfig: () => mergedConfig.roleSelection || {},\n getTwoFactorConfig: () => mergedConfig.twoFactor || {},\n getResetPasswordConfig: () => mergedConfig.resetPassword || {},\n getThemeConfig: () => mergedConfig.theme || {},\n getCardConfig: () => mergedConfig.card || {},\n getLogoConfig: () => mergedConfig.logo || {},\n getProvidersConfig: () => mergedConfig.providers || {},\n getMessagesConfig: () => mergedConfig.messages || {},\n getCustomComponents: () => mergedConfig.customComponents || {}\n };\n\n return (\n <AuthConfigContext.Provider value={value}>\n {children}\n </AuthConfigContext.Provider>\n );\n};\n\nexport default AuthConfigProvider;","import type { AuthConfig } from '../../types';\n\n/**\n * Generate CSS variables from AuthConfig theme configuration\n */\nexport const generateAuthCSSVariables = (authConfig: AuthConfig): string => {\n const theme = authConfig?.theme || {};\n const card = authConfig?.card || {};\n\n let css = '';\n\n // Theme colors\n if (theme.primaryColor) {\n css += `--auth-primary-color: ${theme.primaryColor}; `;\n }\n\n if (theme.secondaryColor) {\n css += `--auth-secondary-color: ${theme.secondaryColor}; `;\n }\n\n if (theme.fontFamily) {\n css += `--auth-font-family: ${theme.fontFamily}; `;\n }\n\n if (theme.borderRadius) {\n css += `--auth-border-radius: ${theme.borderRadius}; `;\n }\n\n // Text colors\n if (theme.textColor) {\n css += `--auth-text-color: ${theme.textColor}; `;\n }\n\n if (theme.secondaryTextColor) {\n css += `--auth-secondary-text-color: ${theme.secondaryTextColor}; `;\n }\n\n if (theme.mutedTextColor) {\n css += `--auth-muted-text-color: ${theme.mutedTextColor}; `;\n }\n\n if (theme.linkColor) {\n css += `--auth-link-color: ${theme.linkColor}; `;\n }\n\n if (theme.linkHoverColor) {\n css += `--auth-link-hover-color: ${theme.linkHoverColor}; `;\n }\n\n // Background styles\n if (theme.background?.color) {\n css += `--auth-bg-color: ${theme.background.color}; `;\n }\n\n if (theme.background?.gradient) {\n css += `--auth-bg-gradient: ${theme.background.gradient}; `;\n }\n\n if (theme.background?.image) {\n css += `--auth-bg-image: url(${theme.background.image}); `;\n }\n\n // Card styles\n if (card.backgroundColor) {\n css += `--auth-card-bg: ${card.backgroundColor}; `;\n }\n\n if (card.borderRadius) {\n css += `--auth-card-border-radius: ${card.borderRadius}; `;\n }\n\n if (card.boxShadow) {\n css += `--auth-card-shadow: ${card.boxShadow}; `;\n }\n\n if (card.maxWidth) {\n css += `--auth-card-max-width: ${card.maxWidth}; `;\n }\n\n if (card.padding) {\n css += `--auth-card-padding: ${card.padding}; `;\n }\n\n if (card.border) {\n css += `--auth-card-border: ${card.border}; `;\n }\n\n return css;\n};\n\n/**\n * Apply auth theme to the document\n */\nexport const applyAuthTheme = (authConfig: AuthConfig): void => {\n const css = generateAuthCSSVariables(authConfig);\n\n if (!css) {\n return;\n }\n\n let authStyleElement = document.getElementById('auth-theme-variables');\n if (!authStyleElement) {\n authStyleElement = document.createElement('style');\n authStyleElement.id = 'auth-theme-variables';\n document.head.appendChild(authStyleElement);\n }\n\n // Add CSS for auth component text styling\n const authComponentCSS = `\n :root { ${css} }\n\n /* Auth component text styling using CSS variables */\n .auth-remember-me,\n .auth-remember-me .ant-checkbox-wrapper,\n .auth-remember-me .ant-checkbox + span,\n .auth-remember-me label,\n .auth-remember-me span {\n color: var(--auth-secondary-text-color, #cbd5e1) !important;\n }\n\n /* Auth text color classes for easy application */\n .auth-text {\n color: var(--auth-text-color, #f1f5f9) !important;\n }\n\n .auth-secondary-text {\n color: var(--auth-secondary-text-color, #cbd5e1) !important;\n }\n\n .auth-link {\n color: var(--auth-link-color, #60a5fa) !important;\n }\n\n .auth-link:hover {\n color: var(--auth-link-hover-color, #3b82f6) !important;\n }\n `;\n\n authStyleElement.innerHTML = authComponentCSS;\n\n};\n\n/**\n * Remove auth theme from the document\n */\nexport const removeAuthTheme = (): void => {\n const authStyleElement = document.getElementById('auth-theme-variables');\n if (authStyleElement) {\n authStyleElement.remove();\n }\n};\n\n/**\n * Get background style object from auth config\n */\nexport const getAuthBackgroundStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const bg = authConfig?.theme?.background;\n if (!bg) return {};\n\n const style: React.CSSProperties = {};\n\n if (bg.image) {\n style.backgroundImage = `url(${bg.image})`;\n style.backgroundSize = 'cover';\n style.backgroundPosition = 'center';\n style.backgroundRepeat = 'no-repeat';\n } else if (bg.gradient) {\n style.background = bg.gradient;\n } else if (bg.color) {\n style.backgroundColor = bg.color;\n }\n\n return style;\n};\n\n/**\n * Get card style object from auth config\n */\nexport const getAuthCardStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const card = authConfig?.card;\n if (!card) return {};\n\n const style: React.CSSProperties = {};\n\n if (card.backgroundColor) {\n style.backgroundColor = card.backgroundColor;\n }\n\n if (card.borderRadius) {\n style.borderRadius = card.borderRadius;\n }\n\n if (card.boxShadow) {\n style.boxShadow = card.boxShadow;\n }\n\n if (card.maxWidth) {\n style.maxWidth = card.maxWidth;\n }\n\n if (card.padding) {\n style.padding = card.padding;\n }\n\n if (card.border) {\n style.border = card.border;\n }\n\n return style;\n};\n\n/**\n * Get logo style object from auth config\n */\nexport const getAuthLogoStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const logo = authConfig?.logo;\n if (!logo) return {};\n\n const style: React.CSSProperties = {};\n\n if (logo.width) {\n style.width = logo.width;\n }\n\n if (logo.height) {\n style.height = logo.height;\n }\n\n if (logo.style) {\n Object.assign(style, logo.style);\n }\n\n return style;\n};\n\n/**\n * Get text alignment based on logo position\n */\nexport const getLogoAlignment = (authConfig: AuthConfig): 'left' | 'center' | 'right' => {\n return authConfig?.logo?.position || 'center';\n};\n\n/**\n * Get logo container style and classes for positioning\n */\nexport const getLogoContainerStyle = (authConfig: AuthConfig): {\n className: string;\n style: React.CSSProperties;\n} => {\n const position = getLogoAlignment(authConfig);\n const logoConfig = authConfig?.logo;\n\n let className = 'flex items-center mb-6';\n const style: React.CSSProperties = {};\n\n // Apply positioning\n switch (position) {\n case 'left':\n className += ' justify-start';\n break;\n case 'right':\n className += ' justify-end';\n break;\n case 'center':\n default:\n className += ' justify-center';\n break;\n }\n\n // Add custom className if provided\n if (logoConfig?.className) {\n className += ` ${logoConfig.className}`;\n }\n\n return { className, style };\n};\n\n/**\n * Utility to merge custom styles with auth config styles\n */\nexport const mergeAuthStyles = (\n authConfig: AuthConfig,\n customStyles: React.CSSProperties = {}\n): React.CSSProperties => {\n const authStyles = {\n ...getAuthBackgroundStyle(authConfig),\n ...getAuthCardStyle(authConfig)\n };\n\n return { ...authStyles, ...customStyles };\n};\n\n/**\n * Check if auth config has theme customizations\n */\nexport const hasAuthThemeCustomizations = (authConfig: AuthConfig): boolean => {\n const theme = authConfig?.theme;\n const card = authConfig?.card;\n\n return !!(\n theme?.background ||\n theme?.primaryColor ||\n theme?.secondaryColor ||\n theme?.fontFamily ||\n theme?.borderRadius ||\n theme?.textColor ||\n theme?.secondaryTextColor ||\n theme?.mutedTextColor ||\n theme?.linkColor ||\n theme?.linkHoverColor ||\n card?.backgroundColor ||\n card?.borderRadius ||\n card?.boxShadow ||\n card?.maxWidth ||\n card?.padding ||\n card?.border\n );\n};\n\n/**\n * Get text style object from auth config\n */\nexport const getAuthTextStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const theme = authConfig?.theme;\n if (!theme) return {};\n\n const style: React.CSSProperties = {};\n\n if (theme.textColor) {\n style.color = theme.textColor;\n }\n\n if (theme.fontFamily) {\n style.fontFamily = theme.fontFamily;\n }\n\n // Default to center alignment if not specified\n style.textAlign = theme.alignTitle || 'center';\n\n // Default to center alignment if not specified\n style.textAlign = theme.alignTitle || 'center';\n\n return style;\n};\n\n/**\n * Get secondary text style object from auth config\n */\nexport const getAuthSecondaryTextStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const theme = authConfig?.theme;\n if (!theme) return { textAlign: 'center' };\n\n const style: React.CSSProperties = {};\n\n if (theme.secondaryTextColor) {\n style.color = theme.secondaryTextColor;\n }\n\n if (theme.fontFamily) {\n style.fontFamily = theme.fontFamily;\n }\n\n // Default to center alignment if not specified\n style.textAlign = theme.alignTitle || 'center';\n\n return style;\n};\n\n/**\n * Get muted text style object from auth config\n */\nexport const getAuthMutedTextStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const theme = authConfig?.theme;\n if (!theme) return {};\n\n const style: React.CSSProperties = {};\n\n if (theme.mutedTextColor) {\n style.color = theme.mutedTextColor;\n }\n\n if (theme.fontFamily) {\n style.fontFamily = theme.fontFamily;\n }\n\n return style;\n};\n\n/**\n * Get link style object from auth config\n */\nexport const getAuthLinkStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const theme = authConfig?.theme;\n if (!theme) return {};\n\n const style: React.CSSProperties = {};\n\n if (theme.linkColor) {\n style.color = theme.linkColor;\n }\n\n if (theme.fontFamily) {\n style.fontFamily = theme.fontFamily;\n }\n\n return style;\n};\n\n/**\n * Generate responsive card styles based on screen size\n */\nexport const getResponsiveCardStyle = (authConfig: AuthConfig): React.CSSProperties => {\n const baseStyle = getAuthCardStyle(authConfig);\n\n // Add responsive padding and width adjustments\n const responsiveStyle: React.CSSProperties = {\n ...baseStyle,\n width: '100%',\n maxWidth: baseStyle.maxWidth || '400px',\n margin: '0 auto',\n // Reduce padding on smaller screens\n '@media (max-width: 640px)': {\n padding: baseStyle.padding ?\n (typeof baseStyle.padding === 'string' && baseStyle.padding.includes('px') ?\n `${parseInt(baseStyle.padding) * 0.75}px` : '30px'\n ) : '30px',\n margin: '20px',\n maxWidth: 'calc(100% - 40px)'\n }\n };\n\n return responsiveStyle;\n};","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, Input, Button, Result, Select, Space, toast, Alert } from '@zango-core/components';\nimport { User, ArrowLeft, Mail, Phone } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { authService } from '../services/authService';\nimport useAuthStore from '../stores/useAuthStore';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getAuthTextStyle, getAuthSecondaryTextStyle, getLogoContainerStyle, getAuthLogoStyle } from '../../framework/utils/authThemeUtils';\n\ninterface ForgotPasswordFormProps {\n onSubmit: (data: { email?: string; phone?: string; method: string }) => Promise<void>;\n logo?: React.ReactNode;\n}\n\nconst ForgotPasswordForm: React.FC<ForgotPasswordFormProps> = ({ onSubmit, logo }) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [submitted, setSubmitted] = useState(false);\n const [formKey, setFormKey] = useState(0);\n const [resetMethods, setResetMethods] = useState<string[]>(['email']);\n const [selectedMethod, setSelectedMethod] = useState<string>('email');\n const { basePath } = useAuthStore();\n\n // Get authConfig for customizations\n const { authConfig, getResetPasswordConfig, getMessagesConfig } = useAuthConfig();\n const resetPasswordConfig = getResetPasswordConfig();\n const messagesConfig = getMessagesConfig();\n const cardStyle = getAuthCardStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n useEffect(() => {\n // Load password reset configuration\n const loadConfig = async () => {\n try {\n await authService.getAuthConfig();\n const methods = authService.getPasswordResetMethods();\n if (methods && methods.length > 0) {\n setResetMethods(methods);\n setSelectedMethod(methods[0]);\n }\n } catch (error) {\n console.error('Failed to load reset configuration:', error);\n }\n };\n loadConfig();\n }, []);\n\n const handleSubmit = async (values: any) => {\n setLoading(true);\n setError(null);\n try {\n if (onSubmit) {\n const submitData = {\n email: selectedMethod === 'email' ? values.contact : undefined,\n phone: selectedMethod === 'sms' ? values.contact : undefined\n };\n await onSubmit(submitData as any);\n }\n setSubmitted(true);\n setFormKey(prev => prev + 1);\n } catch (error: any) {\n const methodName = selectedMethod === 'email' ? 'email' : 'SMS';\n // Prioritize the specific error message from the API if available\n const errorMessage = error.message ||\n messagesConfig?.errors?.networkError ||\n `Failed to send reset ${methodName}. Please try again.`;\n\n setError(errorMessage);\n // Also show toast for visibility, or just rely on the inline alert?\n // User asked for \"similar to how login card shows\", which usually implies inline.\n // But keeping toast as a fallback or secondary notification isn't bad, \n // though duplicate notifications can be annoying. \n // DynamicLoginForm uses BOTH setError AND toast.error in some places, but mostly setError for login failures.\n // Let's stick to just setError for the main feedback as requested, but maybe toast for critical failures?\n // The user said \"also display it as message\", implying IN ADDITION to or INSTEAD of the current toast behavior which was \"Network error\".\n // Actually, they said \"api status is 400... but in toast it shows Network error... it should display proper error message... also display it as message\".\n // So they want the proper message in BOTH or at least in the message.\n // I'll set the error state and NOT show a toast if it's a validation/API error to avoid clutter, \n // or show both if that's the pattern. DynamicLoginForm shows error state for login failure.\n // I'll just set the error state to be safe and clean.\n } finally {\n setLoading(false);\n }\n };\n\n const getContactPlaceholder = () => {\n if (selectedMethod === 'email') {\n return resetPasswordConfig?.forgotPassword?.emailPlaceholder || 'Email address';\n }\n return 'Phone number';\n };\n\n const getContactIcon = () => {\n return selectedMethod === 'email' ? <Mail size={16} /> : <Phone size={16} />;\n };\n\n const getContactValidationRules = () => {\n if (selectedMethod === 'email') {\n return [\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please enter your email address'\n },\n {\n type: 'email' as const,\n message: messagesConfig?.validation?.invalidEmail || 'Please enter a valid email address!'\n }\n ];\n }\n return [\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please input your phone number!'\n },\n {\n pattern: /^\\+?[1-9]\\d{1,14}$/,\n message: messagesConfig?.validation?.invalidMobile || 'Please enter a valid phone number!'\n }\n ];\n };\n\n const getSuccessMessage = () => {\n const methodName = selectedMethod === 'email' ? 'Email' : 'SMS';\n const contactType = selectedMethod === 'email' ? 'email' : 'phone';\n return {\n title: resetPasswordConfig?.forgotPassword?.successMessage || `${methodName} Sent!`,\n subTitle: `Please check your ${contactType} for password reset instructions.`\n };\n };\n\n if (submitted) {\n const successMessage = getSuccessMessage();\n return (\n <Result\n status=\"success\"\n title={successMessage.title}\n subTitle={successMessage.subTitle}\n extra={[\n <Link to={basePath} key=\"login\">\n <Button variant=\"primary\">\n {resetPasswordConfig?.forgotPassword?.backToLoginText || 'Back to Login'}\n </Button>\n </Link>\n ]}\n />\n );\n }\n\n return (\n <div className=\"w-full max-w-md mx-auto\" style={cardStyle}>\n <Link to={basePath} className=\"inline-block mb-6\">\n <Button variant=\"link\" size=\"link\" className='flex gap-2' icon={<ArrowLeft size={16} />}>\n <ArrowLeft className='w-4 h-4' /> {resetPasswordConfig?.forgotPassword?.backToLoginText || 'Back to Login'}\n </Button>\n </Link>\n\n {/* Logo */}\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n\n <h2 className=\"text-2xl font-semibold mb-3\" style={getAuthTextStyle(authConfig)}>\n {resetPasswordConfig?.forgotPassword?.title || 'Forgot Password'}\n </h2>\n <p className=\"text-sm mb-6\" style={getAuthSecondaryTextStyle(authConfig)}>\n {resetPasswordConfig?.forgotPassword?.subtitle ||\n resetPasswordConfig?.forgotPassword?.instructionText ||\n `Enter your ${selectedMethod === \"email\" ? \"email address\" : \"phone number\"} and we'll send you instructions to reset your password.`}\n </p>\n\n <Form\n key={formKey}\n name=\"forgot-password\"\n className=\"space-y-4\"\n onFinish={handleSubmit}\n layout=\"vertical\"\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n closable\n onClose={() => setError(null)}\n className=\"mb-4\"\n />\n )}\n {resetMethods.length > 1 && (\n <FormItem label=\"Reset method\">\n <Select\n value={selectedMethod}\n onChange={(value) => {\n setSelectedMethod(value);\n setFormKey((prev) => prev + 1);\n }}\n >\n options=\n {resetMethods.map((method) => ({\n value: method,\n label: (\n <Space>\n {method === \"email\" ? <Mail size={16} /> : <Phone size={16} />}\n {method === \"email\" ? \"Email\" : \"SMS\"}\n </Space>\n ),\n }))}\n </Select>\n </FormItem>\n )}\n\n <FormItem\n name=\"contact\"\n label={selectedMethod === 'email' ?\n (resetPasswordConfig?.forgotPassword?.emailLabel || 'Email') :\n 'Phone'\n }\n rules={getContactValidationRules()}\n >\n <Input\n placeholder={getContactPlaceholder()}\n autoComplete={selectedMethod === \"email\" ? \"email\" : \"tel\"}\n />\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n className=\"w-full h-10 text-base font-medium\"\n disabled={loading}\n fullWidth\n >\n {resetPasswordConfig?.forgotPassword?.submitButtonText ||\n `Send Reset ${selectedMethod === \"email\" ? \"Email\" : \"SMS\"}`}\n </Button>\n </FormItem>\n </Form>\n </div>\n );\n};\n\nexport default ForgotPasswordForm;","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, PasswordInput, Button, Result, toast } from '@zango-core/components';\nimport { Lock } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { authService } from '../services/authService';\nimport useAuthStore from '../stores/useAuthStore';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getLogoContainerStyle, getAuthLogoStyle, getAuthTextStyle, getAuthSecondaryTextStyle } from '../../framework/utils/authThemeUtils';\n\ninterface ResetPasswordFormProps {\n onSubmit: (data: { password: string; confirmPassword: string; token: string }) => Promise<void>;\n token: string;\n logo?: React.ReactNode;\n}\n\nconst ResetPasswordForm: React.FC<ResetPasswordFormProps> = ({ onSubmit, token, logo }) => {\n const [loading, setLoading] = useState(false);\n const [validating, setValidating] = useState(true);\n const [isValidKey, setIsValidKey] = useState(false);\n const [validationError, setValidationError] = useState<string>('');\n const [submitted, setSubmitted] = useState(false);\n const [formKey, setFormKey] = useState(0);\n const [passwordPolicy, setPasswordPolicy] = useState<any>(null);\n const { basePath } = useAuthStore();\n\n // Get authConfig for customizations\n const { authConfig, getResetPasswordConfig, getMessagesConfig } = useAuthConfig();\n const resetPasswordConfig = getResetPasswordConfig();\n const messagesConfig = getMessagesConfig();\n const cardStyle = getAuthCardStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n useEffect(() => {\n const validateKey = async () => {\n try {\n const response = await authService.validatePasswordResetKey(token);\n if (response?.data?.metadata?.password_policy) {\n setPasswordPolicy(response.data.metadata.password_policy);\n }\n setIsValidKey(true);\n } catch (error: any) {\n console.error('Invalid reset key:', error);\n setIsValidKey(false);\n setValidationError(error.message || 'This password reset link is invalid or has expired.');\n // toast.error('Invalid or expired password reset link.'); // Removed to avoid double error showing\n } finally {\n setValidating(false);\n }\n };\n\n if (token) {\n validateKey();\n } else {\n setValidating(false);\n setIsValidKey(false);\n setValidationError('Invalid link.');\n }\n }, [token]);\n\n const validatePassword = (_: any, value: string) => {\n if (!value) {\n const errorMessage = messagesConfig?.validation?.required || 'Please input your new password!';\n return Promise.reject(new Error(errorMessage));\n }\n\n if (passwordPolicy) {\n if (passwordPolicy.min_length && value.length < passwordPolicy.min_length) {\n return Promise.reject(new Error(`Password must be at least ${passwordPolicy.min_length} characters long`));\n }\n } else {\n const validation = authService.validatePassword(value);\n if (!validation.valid) {\n const errorMessage = messagesConfig?.validation?.passwordTooShort || validation.errors.join(', ');\n return Promise.reject(new Error(errorMessage));\n }\n }\n\n return Promise.resolve();\n };\n\n const handleSubmit = async (values: any) => {\n // Validate passwords match before making API call\n if (values.password !== values.confirmPassword) {\n const errorMessage = messagesConfig?.validation?.passwordsDoNotMatch ||\n 'The two passwords do not match!';\n toast.error(errorMessage);\n return;\n }\n\n setLoading(true);\n try {\n const response = await authService.confirmResetPassword({\n key: token,\n password: values.password\n });\n\n if (response?.data?.next_step?.id === 'login') {\n toast.success('Password reset successful! Redirecting to login...');\n setTimeout(() => {\n window.location.href = '/app/login';\n }, 1500);\n return;\n }\n\n setSubmitted(true);\n if (onSubmit) {\n await onSubmit({ ...values, token });\n }\n setFormKey(prev => prev + 1);\n } catch (error: any) {\n const errorMessage = messagesConfig?.errors?.networkError ||\n error.message ||\n 'Failed to reset password. Please try again.';\n toast.error(errorMessage);\n } finally {\n setLoading(false);\n }\n };\n\n if (validating) {\n return (\n <div className=\"w-full max-w-md mx-auto p-8 text-center\" style={cardStyle}>\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900 mx-auto mb-4\"></div>\n <p>Validating reset link...</p>\n </div>\n );\n }\n\n if (!isValidKey) {\n return (\n <Result\n status=\"error\"\n title=\"Invalid Link\"\n subTitle={validationError}\n extra={[\n <Link to={basePath} key=\"login\">\n <Button variant=\"primary\">Back to Login</Button>\n </Link>\n ]}\n />\n );\n }\n\n if (submitted) {\n return (\n <Result\n status=\"success\"\n title={resetPasswordConfig?.resetForm?.successMessage || \"Password Reset Successful!\"}\n subTitle=\"Your password has been successfully reset. You can now login with your new password.\"\n extra={[\n <Link to={basePath} key=\"login\">\n <Button variant=\"primary\">Go to Login</Button>\n </Link>\n ]}\n />\n );\n }\n\n return (\n <div className=\"w-full max-w-md mx-auto\" style={cardStyle}>\n {/* Logo */}\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n <h2 className=\"text-2xl font-semibold mb-3\" style={getAuthTextStyle(authConfig)}>\n {resetPasswordConfig?.resetForm?.title || 'Reset Password'}\n </h2>\n <p className=\"text-sm mb-6\" style={getAuthSecondaryTextStyle(authConfig)}>\n {resetPasswordConfig?.resetForm?.subtitle || 'Please enter your new password below.'}\n </p>\n\n <Form\n key={formKey}\n name=\"reset-password\"\n className=\"space-y-4\"\n onFinish={handleSubmit}\n layout=\"vertical\"\n >\n <FormItem\n name=\"password\"\n label={resetPasswordConfig?.resetForm?.passwordLabel || 'New Password'}\n rules={[{ validator: validatePassword }]}\n >\n <PasswordInput\n prefix={<Lock size={16} className=\"text-gray-400\" />}\n placeholder={resetPasswordConfig?.resetForm?.passwordPlaceholder || \"New Password\"}\n autoComplete=\"new-password\"\n />\n </FormItem>\n\n <FormItem\n name=\"confirmPassword\"\n label={resetPasswordConfig?.resetForm?.confirmPasswordLabel || 'Confirm Password'}\n dependencies={['password']}\n rules={[\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please confirm your password!'\n },\n ({ getFieldValue }) => ({\n validator(_, value) {\n if (!value || getFieldValue('password') === value) {\n return Promise.resolve();\n }\n const errorMessage = messagesConfig?.validation?.passwordsDoNotMatch ||\n 'The two passwords do not match!';\n return Promise.reject(new Error(errorMessage));\n },\n }),\n ]}\n >\n <PasswordInput\n prefix={<Lock size={16} className=\"text-gray-400\" />}\n placeholder={resetPasswordConfig?.resetForm?.confirmPasswordPlaceholder || \"Confirm Password\"}\n autoComplete=\"new-password\"\n />\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n className=\"w-full h-10 text-base font-medium\"\n disabled={loading}\n fullWidth\n >\n {resetPasswordConfig?.resetForm?.submitButtonText || 'Reset Password'}\n </Button>\n </FormItem>\n </Form>\n </div>\n );\n};\n\nexport default ResetPasswordForm;","/**\n * Redirect utility functions with security validation\n * Prevents open redirect vulnerabilities while preserving user's intended destination\n */\n\n/**\n * Validates a redirect URL for security\n * @param url - The URL to validate\n * @returns true if the URL is safe to redirect to, false otherwise\n */\nexport function validateRedirectUrl(url: string | null): boolean {\n if (!url || typeof url !== 'string') {\n return false;\n }\n\n const trimmed = url.trim();\n\n // Must start with /\n if (!trimmed.startsWith('/')) {\n return false;\n }\n\n // Block protocol-relative URLs\n if (trimmed.startsWith('//')) {\n return false;\n }\n\n // Block javascript: protocol\n if (trimmed.toLowerCase().includes('javascript:')) {\n return false;\n }\n\n // Block data: protocol\n if (trimmed.toLowerCase().includes('data:')) {\n return false;\n }\n\n // Block any protocol (://), but allow it in query params after ?\n const beforeQuery = trimmed.split('?')[0];\n if (beforeQuery.includes('://')) {\n return false;\n }\n\n // Don't redirect to login pages (prevent circular redirects)\n if (trimmed.startsWith('/app/login')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Extracts the 'next' parameter from a URL search string\n * @param search - The URL search string (e.g., \"?next=/app/page&other=value\")\n * @returns The decoded next parameter value, or null if not found\n */\nexport function getNextParam(search: string): string | null {\n if (!search) {\n return null;\n }\n\n try {\n const params = new URLSearchParams(search);\n const next = params.get('next');\n\n if (!next) {\n return null;\n }\n\n // Decode the parameter\n return decodeURIComponent(next);\n } catch (error) {\n console.error('Error parsing next parameter:', error);\n return null;\n }\n}\n\n/**\n * Gets a valid redirect URL with security validation and fallback logic\n * Priority: nextParam > serverRedirectUrl > defaultUrl\n *\n * @param nextParam - The 'next' parameter from the URL (highest priority)\n * @param serverRedirectUrl - The redirect URL from server response (medium priority)\n * @param defaultUrl - The default fallback URL (lowest priority, defaults to '/app')\n * @returns A safe, validated redirect URL\n */\nexport function getValidRedirectUrl(\n nextParam: string | null,\n serverRedirectUrl?: string | null,\n defaultUrl: string = '/app'\n): string {\n // Priority 1: Check next parameter\n if (nextParam && validateRedirectUrl(nextParam)) {\n return nextParam;\n }\n\n // Priority 2: Check server redirect URL\n if (serverRedirectUrl && validateRedirectUrl(serverRedirectUrl)) {\n return serverRedirectUrl;\n }\n\n // Priority 3: Use default URL\n if (validateRedirectUrl(defaultUrl)) {\n return defaultUrl;\n }\n\n // Ultimate fallback\n return '/app';\n}\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Spin, Alert, Card, toast } from '@zango-core/components';\nimport { authService } from '../services/authService';\nimport useAuthStore from '../stores/useAuthStore';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthTextStyle, getAuthSecondaryTextStyle } from '../../framework/utils/authThemeUtils';\nimport { getValidRedirectUrl, getNextParam } from '../../framework/utils/redirectUtils';\n\nconst OAuthCallback = ({\n onSuccess,\n onError,\n apiConfig = {},\n redirectPath = '/',\n title = 'Completing sign in...',\n errorTitle = 'Authentication Error',\n logo,\n roleSelectionTitle,\n roleSelectionSubtitle,\n twoFactorTitle,\n twoFactorSubtitle,\n passwordResetTitle,\n passwordResetSubtitle\n}) => {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showCompleteFlow, setShowCompleteFlow] = useState(false);\n const [authResult, setAuthResult] = useState<any>(null);\n const [authStep, setAuthStep] = useState<string>('login');\n const [authData, setAuthData] = useState<any>({});\n const [twoFactorMethods, setTwoFactorMethods] = useState<string[]>(['email']);\n const [passwordResetReason, setPasswordResetReason] = useState<string>('');\n const [nextRedirect, setNextRedirect] = useState<string | null>(null);\n const hasProcessedCallback = useRef(false);\n const location = useLocation();\n const navigate = useNavigate();\n const { basePath, setAuthToken } = useAuthStore();\n const { authConfig } = useAuthConfig();\n\n const handleLoginSuccess = async (result: any) => {\n\n // Handle the nested API response format\n let responseData = result;\n let nextStep = null;\n\n // Check if response has the nested structure from authService\n if (result?.status === 401 && result?.data) {\n responseData = result.data;\n nextStep = result.data?.next_step;\n } else {\n // Legacy format handling\n responseData = result?.response?.data || result?.data || result;\n nextStep = responseData?.next_step;\n }\n\n // Extract login user info from result\n const loginUser = result?.loginUser;\n\n // Store any authentication token if present\n if (result?.token || responseData?.token) {\n setAuthToken(result.token || responseData.token);\n }\n\n // Create user object with login info\n let userInfo = result?.user || responseData?.user || loginUser || {};\n\n // Ensure userInfo is an object\n if (typeof userInfo !== 'object' || userInfo === null) {\n userInfo = {};\n }\n\n // Merge login credentials if available\n if (loginUser && typeof loginUser === 'object') {\n userInfo = {\n ...userInfo,\n email: userInfo.email || loginUser.email,\n username: userInfo.username || loginUser.username,\n phone: userInfo.phone || loginUser.phone,\n name: userInfo.name || loginUser.display\n };\n }\n\n // If there's a next_step, handle it\n if (nextStep && nextStep.is_pending) {\n switch (nextStep.id) {\n case 'role_selection':\n // Convert roles object to array format expected by RoleSelection component\n // Handle any format: {\"5\": \"HCP\", \"7\": \"Doctor\"} or [{id: 5, name: \"HCP\"}]\n let rolesArray = [];\n\n if (Array.isArray(nextStep.metadata.roles)) {\n rolesArray = nextStep.metadata.roles;\n } else if (typeof nextStep.metadata.roles === 'object') {\n rolesArray = Object.entries(nextStep.metadata.roles).map(([id, name]) => ({\n id: id,\n name: name as string,\n is_default: false\n }));\n }\n\n setAuthData({\n ...result,\n roles: rolesArray,\n user: userInfo,\n nextStep: nextStep,\n loginUser: loginUser\n });\n setAuthStep('roleSelection');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n\n case 'mfa_authenticate':\n setAuthToken(result.token || responseData?.token);\n setTwoFactorMethods(nextStep.metadata?.methods || ['email']);\n setAuthStep('twoFactor');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n\n case 'set_password':\n setAuthToken(result.token || responseData?.token);\n // Store password policy from metadata\n const passwordPolicy = nextStep.metadata?.password_policy;\n setPasswordResetReason(nextStep.metadata?.reason || 'Password update required');\n setAuthData({\n ...result,\n passwordPolicy: passwordPolicy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n\n case 'password_expiry':\n setAuthToken(result.token || responseData?.token);\n // Handle password expiry\n setPasswordResetReason('Your password has expired');\n setAuthData({\n ...result,\n passwordPolicy: nextStep.metadata?.password_policy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n\n case 'first_login':\n setAuthToken(result.token || responseData?.token);\n // Handle first login password setup\n setPasswordResetReason('Please set up your password for first login');\n setAuthData({\n ...result,\n passwordPolicy: nextStep.metadata?.password_policy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n\n case 'login_by_code':\n setAuthToken(result.token || responseData?.token);\n // Handle OTP-based login flow\n // This would typically redirect to OTP verification\n // For now, we'll treat it as a login completion\n toast.info('OTP verification required');\n if (onSuccess) {\n onSuccess({\n ...result,\n user: userInfo,\n requiresOTP: true\n });\n }\n return;\n }\n }\n\n // Legacy format support\n if (result.requires2FA) {\n setAuthToken(result.token);\n setTwoFactorMethods(result.twoFactorMethods || ['email']);\n setAuthData({\n ...result,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('twoFactor');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n }\n\n if (result.requiresPasswordReset) {\n setAuthToken(result.token);\n setPasswordResetReason(result.passwordResetReason || 'Your password has expired');\n setAuthData({\n ...result,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n setShowCompleteFlow(true);\n setLoading(false);\n return;\n }\n\n // Authentication complete - will be handled by existing success flow\n };\n\n useEffect(() => {\n // Only process the OAuth callback once on mount\n if (!hasProcessedCallback.current) {\n handleOAuthCallback();\n }\n }, []); // Empty dependency array to run only once on mount\n\n const handleOAuthCallback = async () => {\n try {\n // Mark that we've started processing to prevent multiple calls\n hasProcessedCallback.current = true;\n // Parse query parameters\n const searchParams = new URLSearchParams(location.search);\n const hashParams = new URLSearchParams(location.hash.slice(1));\n\n // Extract 'next' parameter from URL\n const next = getNextParam(location.search) || getNextParam(location.hash.slice(1));\n setNextRedirect(next);\n\n // Check for error in query or hash\n const error = searchParams.get('error') || hashParams.get('error');\n const errorDescription = searchParams.get('error_description') || hashParams.get('error_description');\n\n if (error) {\n throw new Error(errorDescription || `Authentication failed: ${error}`);\n }\n\n // Extract OAuth response data\n const code = searchParams.get('code');\n const state = searchParams.get('state');\n const scope = searchParams.get('scope') || '';\n const authUser = searchParams.get('authuser');\n const hd = searchParams.get('hd');\n const prompt = searchParams.get('prompt');\n const provider = searchParams.get('provider') || state?.split(':')[0];\n\n // Validate state parameter if present\n if (!code || !provider) {\n throw new Error('Missing required OAuth parameters (code or provider)');\n }\n\n // Prepare callback data\n const result = await authService.processOAuthCallback(\n provider,\n state || '',\n code,\n scope,\n authUser || undefined,\n hd || undefined,\n prompt || undefined\n );\n\n\n // Handle login success flow with comprehensive processing\n await handleLoginSuccess(result);\n\n // Check if this is a 401 response with additional authentication steps required\n if (result?.status === 401 && result?.data?.next_step) {\n const nextStep = result.data.next_step;\n\n if (nextStep.is_pending) {\n setLoading(false);\n\n if (onSuccess) {\n // Pass the 401 result with multi-step auth data to the parent\n onSuccess(result);\n } else {\n // Handle multi-step authentication inline using CompleteAuthFlow\n setAuthResult(result);\n setShowCompleteFlow(true);\n }\n return;\n }\n }\n\n // Handle success\n setLoading(false);\n if (onSuccess) {\n onSuccess(result);\n } else {\n // Default behavior - redirect to specified path\n setTimeout(() => {\n navigate(redirectPath, { replace: true });\n }, 1000);\n }\n\n } catch (err) {\n console.error('OAuth callback error:', err);\n setError(err.message || 'Authentication failed');\n setLoading(false);\n\n if (onError) {\n onError(err);\n }\n }\n };\n\n const handleRetry = () => {\n // Redirect back to login using basePath from store\n navigate(basePath, { replace: true });\n };\n\n const handleAuthComplete = async (result: any) => {\n toast.success('Authentication complete!');\n\n try {\n // For cookie-based auth, authentication cookies are already set by the server\n // No need to store tokens - just extract redirect URL\n\n // Extract redirect_url from API response\n const serverRedirectUrl =\n result?.response?.data?.redirect_url ||\n result?.data?.redirect_url ||\n result?.redirect_url;\n\n // Use redirect validation with priority: next param > server redirect > default\n const redirectUrl = getValidRedirectUrl(\n nextRedirect,\n serverRedirectUrl,\n '/app'\n );\n\n // Only redirect if on login page with code/token parameter\n const currentPath = window.location.pathname;\n const searchParams = new URLSearchParams(window.location.search);\n const hasAuthParam = searchParams.get('code') !== null || searchParams.get('token') !== null;\n\n if (currentPath.startsWith('/app/login') && hasAuthParam) {\n // Force a page reload to ensure AuthProvider checks authentication status\n // with the new session cookies\n window.location.href = redirectUrl;\n }\n // Otherwise, do nothing - stay on current page\n } catch (error) {\n console.error('Error handling auth completion:', error);\n }\n };\n\n // If multi-step authentication is required, show CompleteAuthFlow\n if (showCompleteFlow) {\n return (\n <CompleteAuthFlow\n logo={logo}\n apiConfig={apiConfig}\n initialAuthState={authResult || authData}\n onAuthComplete={handleAuthComplete}\n roleSelectionTitle={roleSelectionTitle}\n roleSelectionSubtitle={roleSelectionSubtitle}\n twoFactorTitle={twoFactorTitle}\n twoFactorSubtitle={twoFactorSubtitle}\n passwordResetTitle={passwordResetTitle}\n passwordResetSubtitle={passwordResetSubtitle}\n redirectPath={redirectPath}\n initialRedirectUrl={nextRedirect}\n />\n );\n }\n\n\n if (loading) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-100 p-5\">\n <Card className=\"w-full max-w-md shadow-md\" bordered={false}>\n <div className=\"text-center py-10 px-5\">\n <Spin size=\"large\" />\n <h2 className=\"mt-6 mb-2 text-gray-800 text-xl font-medium\" style={getAuthTextStyle(authConfig)}>{title}</h2>\n <p className=\"text-gray-500 text-sm mb-0\" style={getAuthSecondaryTextStyle(authConfig)}>Please wait while we complete your authentication...</p>\n </div>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-100 p-5\">\n <Card className=\"w-full max-w-md shadow-md\" bordered={false}>\n <div className=\"text-center py-10 px-5\">\n <Alert\n message={errorTitle}\n description={error}\n type=\"error\"\n showIcon\n action={\n <a onClick={handleRetry}>Return to login</a>\n }\n />\n </div>\n </Card>\n </div>\n );\n }\n\n // Success state\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-100 p-5\">\n <Card className=\"w-full max-w-md shadow-md\" bordered={false}>\n <div className=\"text-center py-10 px-5\">\n <Alert\n message=\"Authentication Successful\"\n description=\"You have been successfully authenticated. Redirecting...\"\n type=\"success\"\n showIcon\n />\n </div>\n </Card>\n </div>\n );\n};\n\nexport default OAuthCallback;","import React from 'react';\nimport { Button, toast } from '@zango-core/components';\nimport { Globe } from 'lucide-react';\nimport { authService } from '../services/authService';\n\n// SVG Icons from svgl.app\nconst GoogleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n);\n\nconst MicrosoftIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M11.4 24H0V12.6h11.4V24z\" fill=\"#f25022\" />\n <path d=\"M24 24H12.6V12.6H24V24z\" fill=\"#00a4ef\" />\n <path d=\"M11.4 11.4H0V0h11.4v11.4z\" fill=\"#7fba00\" />\n <path d=\"M24 11.4H12.6V0H24v11.4z\" fill=\"#ffb900\" />\n </svg>\n);\n\nconst GitHubIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n);\n\nconst LinkedInIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#0077b5\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n);\n\nconst FacebookIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"#1877f2\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n);\n\nconst TwitterIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n);\n\nconst AppleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\" />\n </svg>\n);\n\nconst SlackIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52z\" fill=\"#e01e5a\" />\n <path d=\"M6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313z\" fill=\"#e01e5a\" />\n <path d=\"M8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834z\" fill=\"#36c5f0\" />\n <path d=\"M8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312z\" fill=\"#36c5f0\" />\n <path d=\"M18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834z\" fill=\"#2eb67d\" />\n <path d=\"M17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312z\" fill=\"#2eb67d\" />\n <path d=\"M15.165 18.956a2.527 2.527 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52z\" fill=\"#ecb22e\" />\n <path d=\"M15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\" fill=\"#ecb22e\" />\n </svg>\n);\n\nconst SAMLIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2l3.09 6.26L22 9l-5 4.87L18.18 22 12 18.27 5.82 22 7 13.87 2 9l6.91-.74L12 2z\" />\n </svg>\n);\n\nconst OktaIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0z\" fill=\"#00D924\" />\n <path d=\"M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6z\" fill=\"#FFFFFF\" />\n </svg>\n);\n\nconst getProviderIcon = (providerName, type = 'default') => {\n const name = providerName ? providerName.toLowerCase() : '';\n\n // Specific provider matching\n if (name.includes('google')) return <GoogleIcon />;\n if (name.includes('microsoft') || name.includes('azure')) return <MicrosoftIcon />;\n if (name.includes('github')) return <GitHubIcon />;\n if (name.includes('linkedin')) return <LinkedInIcon />;\n if (name.includes('facebook')) return <FacebookIcon />;\n if (name.includes('twitter') || name.includes('x.com')) return <TwitterIcon />;\n if (name.includes('apple')) return <AppleIcon />;\n if (name.includes('slack')) return <SlackIcon />;\n if (name.includes('okta')) return <OktaIcon />;\n\n // SAML-specific patterns\n if (name.includes('saml') || name.includes('sso') || type === 'sso') return <SAMLIcon />;\n\n // Default fallback\n return <Globe size={16} />;\n};\n\nconst ProviderButton = ({ provider, type = 'default', prefix = 'Continue with', postfix = '' }) => {\n const handleClick = async () => {\n try {\n if (type === 'sso') {\n // Handle SAML SSO providers - use provider.id as the SAML identifier\n console.log('Initiating SAML authentication with provider:', provider);\n const samlId = provider.id;\n const response = await authService.initiateSAMLAuth(samlId);\n if (response?.redirect_url) {\n window.location.href = response.redirect_url;\n } else {\n console.error('No redirect URL received from SAML init');\n }\n } else {\n // Handle OAuth providers (OIDC)\n const resp = await authService.oauthRedirect(provider.provider, window.location.href);\n console.log(\"OAuth redirect url:\", resp.response.redirect_url);\n if (resp.success) {\n window.location.href = resp.response.redirect_url;\n } else {\n console.error(\"Error authenticating with OAuth provider\");\n }\n }\n } catch (error: any) {\n console.error(`Error authenticating with ${type} provider:`, error);\n\n // Show user-friendly error message\n let userMessage = `Failed to authenticate with ${providerName}`;\n\n if (error.message?.includes('500')) {\n userMessage += '. The authentication service appears to be unavailable. Please try again later or contact support.';\n } else if (error.message?.includes('404')) {\n userMessage += '. The authentication service is not configured properly.';\n } else if (error.message?.includes('403')) {\n userMessage += '. You do not have permission to use this authentication method.';\n } else if (error.message) {\n userMessage += `. ${error.message}`;\n } else {\n userMessage += '. Please try again or contact support.';\n }\n\n toast.error(userMessage);\n }\n };\n\n // Get the appropriate identifier and label for the provider\n const getProviderDisplayName = () => {\n if (type === 'sso') {\n // For SSO providers, create a user-friendly name\n const label = provider.label || provider.id;\n\n // Convert common patterns to friendly names\n if (label.toLowerCase().includes('azure')) return 'Azure AD';\n if (label.toLowerCase().includes('okta')) return 'Okta';\n if (label.toLowerCase().includes('google')) return 'Google';\n if (label.toLowerCase().includes('microsoft')) return 'Microsoft';\n if (label.toLowerCase().includes('saml')) return 'SSO';\n\n // Capitalize first letter for other cases\n return label.charAt(0).toUpperCase() + label.slice(1);\n } else {\n return provider.name || provider.provider;\n }\n };\n\n const providerIdentifier = type === 'sso' ? provider.label || provider.id : provider.provider;\n const providerName = getProviderDisplayName();\n const icon = getProviderIcon(providerIdentifier, type);\n\n return (\n <Button\n className={`flex w-full items-center justify-center gap-2 h-[42px] text-sm font-medium rounded-md transition-all duration-300 mb-2 last:mb-0 ${type === 'oidc' ? 'bg-gray-100 border border-gray-200 text-gray-800 hover:bg-gray-200 hover:border-gray-300' :\n type === 'sso' ? 'bg-brand-500 border border-brand-500 text-white hover:bg-brand-600 hover:border-brand-600' :\n 'bg-white border border-gray-300 text-gray-800 hover:border-brand-500 hover:text-brand-500'\n }`}\n icon={icon}\n block\n onClick={handleClick}\n >\n {prefix} {providerName} {postfix}\n </Button>\n );\n};\n\nexport default ProviderButton;","import React, { useState, useRef, useEffect } from 'react';\nimport { Input, Space } from '@zango-core/components';\n\nconst OTPInput = ({ length = 6, value = '', onChange, disabled = false }) => {\n const [otp, setOtp] = useState(new Array(length).fill(''));\n const inputRefs = useRef([]);\n\n useEffect(() => {\n if (value) {\n const valueArray = value.split('').slice(0, length);\n const newOtp = [...new Array(length).fill('')];\n valueArray.forEach((val, index) => {\n newOtp[index] = val;\n });\n setOtp(newOtp);\n }\n }, [value, length]);\n\n const handleChange = (element, index) => {\n const value = element.value;\n if (isNaN(value)) return;\n\n const newOtp = [...otp];\n newOtp[index] = value;\n setOtp(newOtp);\n\n // Call onChange with the complete OTP string\n onChange && onChange(newOtp.join(''));\n\n // Move to next input\n if (value && index < length - 1) {\n inputRefs.current[index + 1].focus();\n }\n };\n\n const handleKeyDown = (e, index) => {\n if (e.key === 'Backspace' && !otp[index] && index > 0) {\n inputRefs.current[index - 1].focus();\n }\n };\n\n const handlePaste = (e) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData('text/plain').slice(0, length);\n const pastedArray = pastedData.split('');\n \n const newOtp = [...otp];\n pastedArray.forEach((char, index) => {\n if (!isNaN(char) && index < length) {\n newOtp[index] = char;\n }\n });\n \n setOtp(newOtp);\n onChange && onChange(newOtp.join(''));\n \n // Focus the next empty input or the last input\n const nextEmptyIndex = newOtp.findIndex(val => val === '');\n if (nextEmptyIndex !== -1) {\n inputRefs.current[nextEmptyIndex].focus();\n } else {\n inputRefs.current[length - 1].focus();\n }\n };\n\n return (\n <Space className=\"flex justify-center gap-2\" size=\"small\">\n {otp.map((digit, index) => (\n <Input\n key={index}\n ref={el => inputRefs.current[index] = el}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={digit}\n onChange={e => handleChange(e.target, index)}\n onKeyDown={e => handleKeyDown(e, index)}\n onPaste={handlePaste}\n className=\"!w-12 !h-12 text-center text-xl font-semibold rounded-lg transition-all duration-300 focus:border-brand-500 focus:shadow-[0_0_0_2px_rgba(106,138,18,0.2)] disabled:bg-gray-100 disabled:cursor-not-allowed\"\n disabled={disabled}\n />\n ))}\n </Space>\n );\n};\n\nexport default OTPInput;","import React, { createContext, useState, useContext, useEffect } from 'react';\nimport { authService } from '../services/authService';\n\nconst AuthContext = createContext(null);\n\nexport const useAuthContext = () => {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuthContext must be used within an AuthProvider');\n }\n return context;\n};\n\nconst AuthProvider = ({ children, config = {} }: { children: React.ReactNode, config?: any }) => {\n const [user, setUser] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pendingAuth, setPendingAuth] = useState(null);\n const [availableRoles, setAvailableRoles] = useState(null);\n const [authConfig, setAuthConfig] = useState(null);\n\n // Use ref to prevent initialization from running twice (even on remount)\n const hasInitializedRef = React.useRef(false);\n\n useEffect(() => {\n // Only initialize once, even if component remounts due to parent re-renders\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n initializeAuth();\n }\n }, []);\n\n const initializeAuth = async () => {\n try {\n // Load auth configuration first\n const config = await authService.getAuthConfig();\n setAuthConfig(config);\n\n // Then check existing auth\n await checkAuth();\n } catch (err: any) {\n setError(err.message);\n setLoading(false);\n }\n };\n\n const checkAuth = async () => {\n try {\n // Use fast cookie-based check instead of API calls\n const isAuthenticated = await authService.isAuthenticated();\n\n if (isAuthenticated) {\n // If cookie exists, set basic user object without API call\n const userData = {\n id: 1,\n username: 'authenticated_user',\n email: 'user@example.com',\n authenticated: true\n };\n setUser(userData);\n setError(null);\n } else {\n // No valid session cookie found\n setUser(null);\n setError(null);\n }\n } catch (err: any) {\n console.error('Auth check failed:', err);\n // Don't set error for authentication failures - just clear user\n setUser(null);\n setError(null);\n } finally {\n setLoading(false);\n }\n };\n\n const login = async (credentials: any) => {\n setLoading(true);\n setError(null);\n try {\n const response = await authService.login(credentials, config);\n \n // Handle the nested API response format\n let responseData = response;\n let nextStep = null;\n \n // Check if response has the nested structure\n if (response?.status === 401 && response?.data) {\n responseData = response.data;\n nextStep = response.data?.next_step;\n } else {\n // Legacy format handling\n responseData = response?.response?.data || response?.data || response;\n nextStep = responseData?.next_step;\n }\n \n // Create user object with login credentials\n const userInfo = response?.user || responseData?.user || {};\n userInfo.email = userInfo.email || credentials.email;\n userInfo.username = userInfo.username || credentials.username;\n userInfo.phone = userInfo.phone || credentials.phone;\n userInfo.name = userInfo.name || credentials.email || credentials.username || credentials.phone;\n \n // Store basic auth info\n setPendingAuth({\n user: userInfo,\n token: response.token || responseData?.token,\n roles: response.roles,\n requires2FA: response.requires2FA,\n twoFactorMethods: response.twoFactorMethods,\n requiresPasswordReset: response.requiresPasswordReset,\n passwordResetReason: response.passwordResetReason\n });\n\n // Check if there's a next_step in the response (multi-step auth)\n if (nextStep && nextStep.is_pending && nextStep.id === 'role_selection') {\n // Return the response to be handled by CompleteAuthFlow\n return { ...response, user: userInfo };\n }\n\n // Check if role selection is required (legacy format)\n if (response.roles && response.roles.length > 1) {\n // Multiple roles available, need role selection\n setAvailableRoles(response.roles);\n return { \n requiresRoleSelection: true, \n roles: response.roles,\n user: userInfo,\n token: response.token\n };\n } \n \n // Single role or no roles - auto-select if available\n let authResult = response;\n if (response.roles && response.roles.length === 1) {\n authResult.user = { ...userInfo, role: response.roles[0] };\n } else {\n authResult.user = userInfo;\n }\n\n // Check if 2FA is required\n if (response.requires2FA) {\n return {\n ...authResult,\n requires2FA: true,\n twoFactorMethods: response.twoFactorMethods || ['email']\n };\n }\n\n // Check if password reset is required\n if (response.requiresPasswordReset) {\n return {\n ...authResult,\n requiresPasswordReset: true,\n passwordResetReason: response.passwordResetReason\n };\n }\n\n // Full authentication complete\n setUser(authResult.user);\n // No need to store token for cookie-based auth\n setPendingAuth(null);\n setAvailableRoles(null);\n return { ...authResult, user: userInfo };\n } catch (err: any) {\n console.error('AuthProvider login caught error:', err);\n console.error('AuthProvider error.message:', err.message);\n setError(err.message);\n throw err;\n } finally {\n setLoading(false);\n }\n };\n\n const selectRole = async (role: any) => {\n if (!pendingAuth) {\n throw new Error('No pending authentication');\n }\n\n setLoading(true);\n try {\n // Call role selection endpoint if configured\n if (config.roleSelectionEndpoint) {\n await authService.selectRole(role, pendingAuth.token, config);\n }\n\n // Set user with selected role\n const finalUser = { ...pendingAuth.user, role };\n \n // Check if 2FA is required after role selection\n const authData = { ...pendingAuth, user: finalUser };\n if (authData.requires2FA) {\n setPendingAuth(authData);\n return {\n ...authData,\n requires2FA: true,\n twoFactorMethods: authData.twoFactorMethods || ['email']\n };\n }\n\n // Check if password reset is required after role selection\n if (authData.requiresPasswordReset) {\n setPendingAuth(authData);\n return {\n ...authData,\n requiresPasswordReset: true,\n passwordResetReason: authData.passwordResetReason\n };\n }\n\n // Full authentication complete\n setUser(finalUser);\n // No need to store token for cookie-based auth\n\n // Clear pending auth state\n setPendingAuth(null);\n setAvailableRoles(null);\n\n return { user: finalUser, token: pendingAuth.token };\n } catch (err: any) {\n setError(err.message);\n throw err;\n } finally {\n setLoading(false);\n }\n };\n\n const logout = async () => {\n setLoading(true);\n try {\n await authService.logout(config);\n setUser(null);\n setPendingAuth(null);\n setAvailableRoles(null);\n // No need to remove token for cookie-based auth - logout API handles it\n } catch (err: any) {\n console.error('Logout failed:', err);\n } finally {\n setLoading(false);\n }\n };\n\n const forgotPassword = async (data: { email?: string; phone?: string; method: string }) => {\n return authService.forgotPassword(data);\n };\n\n const resetPassword = async (data: any) => {\n return authService.resetPassword(data);\n };\n\n const value = {\n user,\n loading,\n error,\n login,\n logout,\n selectRole,\n checkAuth,\n forgotPassword,\n resetPassword,\n isAuthenticated: !!user,\n pendingAuth,\n availableRoles,\n authConfig,\n requiresRoleSelection: !!pendingAuth && !!availableRoles\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport default AuthProvider;","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, Input, Button, Typography, Space, Select, Segmented, toast, Alert } from '@zango-core/components';\nimport { User, Phone, Mail, ArrowLeft, Smartphone } from 'lucide-react';\nimport OTPInput from './OTPInput';\nimport { authService } from '../services/authService';\nimport { useAuthContext } from './AuthProvider';\nimport { getAuthTextStyle, getAuthSecondaryTextStyle } from '../../framework/utils/authThemeUtils';\n\nconst { Text, Title } = Typography;\n\ninterface OTPFormProps {\n onSuccess: (result: any) => void;\n onBack?: () => void;\n submitButtonText?: string;\n verifyButtonText?: string;\n resendButtonText?: string;\n}\n\nconst OTPForm: React.FC<OTPFormProps> = ({\n onSuccess,\n onBack,\n submitButtonText,\n verifyButtonText,\n resendButtonText\n}) => {\n const [step, setStep] = useState('request'); // 'request' | 'verify'\n const [loading, setLoading] = useState(false);\n const [username, setUsername] = useState('');\n const [usernameType, setUsernameType] = useState('email');\n const [otp, setOtp] = useState('');\n const [otpError, setOtpError] = useState('');\n const [requestError, setRequestError] = useState('');\n const [resendTimer, setResendTimer] = useState(0);\n const [formKey, setFormKey] = useState(0);\n const { authConfig } = useAuthContext();\n\n useEffect(() => {\n if (authConfig) {\n const allowedUsernames = authService.getAllowedUsernames();\n if (allowedUsernames && allowedUsernames.length > 0) {\n setUsernameType(allowedUsernames[0]);\n }\n }\n }, [authConfig]);\n\n useEffect(() => {\n if (resendTimer > 0) {\n const timer = setTimeout(() => setResendTimer(resendTimer - 1), 1000);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [resendTimer]);\n\n const getInputIcon = (type: string) => {\n return type === 'email' ? <Mail size={16} /> : <Smartphone size={16} />;\n };\n\n const getInputPlaceholder = (type: string) => {\n return type === 'email' ? 'Enter your email address' : 'Enter your mobile number';\n };\n\n const getValidationRules = (type: string) => {\n if (type === 'email') {\n return [\n { required: true, message: 'Please enter your email address' },\n { type: 'email' as const, message: 'Please enter a valid email!' }\n ];\n }\n if (type === 'mobile') {\n return [\n { required: true, message: 'Please input your mobile number!' },\n { pattern: /^\\+?[1-9]\\d{1,14}$/, message: 'Please enter a valid mobile number!' }\n ];\n }\n return [\n { required: true, message: 'Please input your username!' },\n { min: 3, message: 'Username must be at least 3 characters long' }\n ];\n };\n\n const handleRequestOTP = async (values: any) => {\n // Clear previous error\n setRequestError('');\n setLoading(true);\n try {\n const result = await authService.requestOTP(values.username);\n\n // Check if this is a 401 response (OTP sent successfully, waiting for verification)\n if (result?.status === 401 && result?.data?.message) {\n setUsername(values.username);\n setStep('verify');\n setResendTimer(30);\n toast.success(result.data.message || 'Code sent successfully!');\n } else {\n // Regular success response\n setUsername(values.username);\n setStep('verify');\n setResendTimer(30);\n toast.success('Code sent successfully!');\n }\n } catch (error: any) {\n // Show error inline instead of toast\n console.error('Failed to Send Code:', error);\n setRequestError(error.message || 'Failed to Send Code');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyOTP = async () => {\n const otpLength = 6; // Default OTP length\n\n // Clear previous error\n setOtpError('');\n\n if (otp.length !== otpLength) {\n setOtpError(`Please enter ${otpLength} digit Code`);\n return;\n }\n\n setLoading(true);\n try {\n const result = await authService.verifyOTP(username, otp);\n\n // Enrich result with user login information for proper display on role selection\n const enrichedResult = {\n ...result,\n loginUser: {\n email: usernameType === 'email' ? username : undefined,\n phone: usernameType === 'mobile' ? username : undefined,\n username: username,\n display: username\n }\n };\n\n // Pass enriched result to parent component to handle next_step\n // Don't set local step to 'success' - let CompleteAuthFlow handle the flow\n onSuccess(enrichedResult);\n } catch (error: any) {\n // Set error message instead of showing toast\n setOtpError(error.message || 'Invalid Code');\n // Don't clear OTP value - keep it so user can see what they entered\n } finally {\n setLoading(false);\n }\n };\n\n const handleResendOTP = async () => {\n if (resendTimer > 0) return;\n\n setLoading(true);\n try {\n await authService.requestOTP(username);\n setResendTimer(30); // Default 30 seconds\n toast.success('Code resent successfully!');\n } catch (error: any) {\n toast.error(error.message || 'Failed to resend Code');\n } finally {\n setLoading(false);\n }\n };\n\n if (!authConfig) {\n return <div className=\"flex justify-center items-center min-h-[300px]\">Loading...</div>;\n }\n\n const allowedUsernames = authService.getAllowedUsernames();\n const otpLength = 6; // Default OTP length\n\n if (step === 'verify') {\n return (\n <div className=\"w-full\">\n <Button\n variant=\"link\"\n icon={<ArrowLeft size={16} />}\n onClick={() => setStep('request')}\n className=\"mb-4 flex gap-2\"\n >\n <ArrowLeft className='w-4 h-4' /> Change {usernameType?.slice(0, 1).toUpperCase() + usernameType?.slice(1)} {usernameType === 'email' ? 'Address' : 'Number'}\n </Button>\n\n <Title level={4} className=\"!mb-2 text-center\" style={getAuthTextStyle(authConfig)}>Enter Verification Code</Title>\n <Text className=\"block text-center text-gray-500 mb-6\" style={getAuthSecondaryTextStyle(authConfig)}>\n Please enter the {otpLength}-digit code sent to {username}\n </Text>\n\n {otpError && (\n <Alert\n message={otpError}\n type=\"error\"\n showIcon={false}\n closable\n onClose={() => setOtpError('')}\n className=\"mb-4\"\n />\n )}\n\n <div className=\"my-8 flex justify-center\">\n <OTPInput\n length={otpLength}\n value={otp}\n onChange={(value: string) => {\n setOtp(value);\n // Clear error when user types\n if (otpError) {\n setOtpError('');\n }\n }}\n disabled={loading}\n />\n </div>\n\n <Button\n type=\"primary\"\n block\n fullWidth\n loading={loading}\n onClick={handleVerifyOTP}\n className=\"mt-6\"\n >\n {verifyButtonText || \"Verify & Sign In\"}\n </Button>\n\n <div className=\"text-center mt-4\">\n {resendTimer > 0 ? (\n <Text type=\"secondary\">Resend Code in {resendTimer}s</Text>\n ) : (\n <Button variant=\"link\" onClick={handleResendOTP} loading={loading} disabled={loading}>\n {resendButtonText || \"Resend Code\"}\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full\">\n {onBack && (\n <Button\n variant=\"link\"\n icon={<ArrowLeft size={16} />}\n onClick={onBack}\n className=\"mb-4\"\n >\n <ArrowLeft className='w-4 h-4' /> Back to login\n </Button>\n )}\n\n <Title level={4} className=\"!mb-2 text-center\" style={getAuthTextStyle(authConfig)}>Sign in with a One-Time Pin</Title>\n\n {requestError && (\n <Alert\n message={requestError}\n type=\"error\"\n showIcon={false}\n closable\n onClose={() => setRequestError('')}\n className=\"mb-4\"\n />\n )}\n\n <Form\n key={formKey}\n name=\"otp-request\"\n onFinish={handleRequestOTP}\n layout=\"vertical\"\n >\n {allowedUsernames.length > 1 && (\n <FormItem>\n <Segmented\n options={allowedUsernames.map((type: string) => ({\n label: (\n <Space>\n {type === 'email' ? <Mail size={16} /> :\n type === 'mobile' ? <Smartphone size={16} /> : <User size={16} />}\n <span>\n {type === 'mobile' ? 'Phone' :\n type === 'email' ? 'Email' : 'Username'}\n </span>\n </Space>\n ),\n value: type\n }))}\n value={usernameType}\n onChange={(value: string) => setUsernameType(value)}\n block\n className=\"bg-gray-100 mb-2\"\n />\n </FormItem>\n )}\n\n <FormItem\n name=\"username\"\n rules={getValidationRules(usernameType)}\n >\n <Input\n placeholder={getInputPlaceholder(usernameType)}\n />\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n fullWidth\n disabled={loading}\n >\n {submitButtonText || \"Send Code\"}\n </Button>\n </FormItem>\n </Form>\n </div>\n );\n};\n\nexport default OTPForm;\n","import React, { useState, useEffect } from \"react\";\nimport {\n Form,\n FormItem,\n Input,\n PasswordInput,\n Button,\n Checkbox,\n Divider,\n Space,\n Spin,\n Tabs,\n Alert,\n toast,\n} from \"@zango-core/components\";\nimport { Lock, Mail, Phone, Smartphone } from \"lucide-react\";\nimport { Link } from \"react-router-dom\";\nimport ProviderButton from \"./ProviderButton\";\nimport OTPForm from \"./OTPForm\";\nimport { authService } from \"../services/authService\";\nimport { useAuthContext } from \"./AuthProvider\";\nimport { useAuthConfig } from \"../../framework/contexts/AuthConfigContext\";\nimport {\n getAuthTextStyle,\n getAuthSecondaryTextStyle,\n getAuthLinkStyle,\n} from \"../../framework/utils/authThemeUtils\";\n\ninterface DynamicLoginFormProps {\n onLogin: (data: any) => Promise<void>;\n showRememberMe?: boolean;\n}\n\nconst DynamicLoginForm: React.FC<DynamicLoginFormProps> = ({\n onLogin,\n showRememberMe = true,\n}) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [activeMethod, setActiveMethod] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<\"email\" | \"mobile\">(\"email\");\n const [showOTPForm, setShowOTPForm] = useState(false);\n const [formKey, setFormKey] = useState(0); // Use key to reset form\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [showPasswordChange, setShowPasswordChange] = useState(false);\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const { authConfig } = useAuthContext();\n const {\n getLoginConfig,\n getMessagesConfig,\n getProvidersConfig,\n authConfig: configContext,\n } = useAuthConfig();\n\n // Get text styles from authConfig (prefer context config over auth context)\n const effectiveAuthConfig = configContext || authConfig;\n const textStyle = getAuthTextStyle(effectiveAuthConfig);\n const secondaryTextStyle = getAuthSecondaryTextStyle(effectiveAuthConfig);\n const linkStyle = getAuthLinkStyle(effectiveAuthConfig);\n\n // Check if user is authenticated using cookie check (no API call)\n const checkAuthentication = async () => {\n try {\n return await authService.isAuthenticated();\n } catch (error) {\n return false;\n }\n };\n\n useEffect(() => {\n if (authConfig) {\n const allowedUsernames = authService.getAllowedUsernames();\n // Set default tab based on available methods\n if (allowedUsernames && allowedUsernames.length > 0) {\n const hasEmail = allowedUsernames.includes(\"email\");\n const hasMobile = allowedUsernames.includes(\"mobile\");\n if (hasEmail) {\n setActiveTab(\"email\");\n } else if (hasMobile) {\n setActiveTab(\"mobile\");\n }\n }\n\n // Set default active method based on what's enabled\n if (authService.isPasswordLoginEnabled()) {\n setActiveMethod(\"password\");\n } else if (authService.isOTPLoginEnabled()) {\n setActiveMethod(\"otp\");\n }\n }\n }, [authConfig]);\n\n // Check authentication status on mount only (no more polling)\n useEffect(() => {\n const checkSession = async () => {\n const isAuthenticated = await checkAuthentication();\n setIsLoggedIn(isAuthenticated);\n };\n\n checkSession();\n // Removed the setInterval polling - no more repeated API calls\n }, []);\n\n if (!authConfig) {\n return (\n <div className=\"flex justify-center items-center min-h-[300px]\">\n <Spin size=\"large\" />\n </div>\n );\n }\n\n const getUsernameRules = (type: string) => {\n const messagesConfig = getMessagesConfig();\n\n if (type === \"email\") {\n return [\n {\n required: true,\n message:\n messagesConfig?.validation?.required ||\n \"Please enter your email address\",\n },\n {\n type: \"email\" as const,\n message:\n messagesConfig?.validation?.invalidEmail ||\n \"Please enter a valid email address!\",\n },\n ];\n }\n if (type === \"mobile\") {\n return [\n {\n required: true,\n message:\n messagesConfig?.validation?.required ||\n \"Please input your mobile number!\",\n },\n {\n pattern: /^\\+\\d{7,15}$/,\n message:\n messagesConfig?.validation?.invalidMobile ||\n \"Please enter a valid mobile number with country code (e.g., +919876543210)\",\n },\n ];\n }\n // Default to email rules\n return [\n {\n required: true,\n message:\n messagesConfig?.validation?.required ||\n \"Please enter your email address\",\n },\n {\n type: \"email\" as const,\n message:\n messagesConfig?.validation?.invalidEmail ||\n \"Please enter a valid email address!\",\n },\n ];\n };\n\n const handlePasswordLogin = async (values: any) => {\n setLoading(true);\n setError(null); // Clear any previous errors\n try {\n // Determine which method to use based on activeTab or available methods\n const allowedUsernames = authService.getAllowedUsernames();\n const hasEmail = allowedUsernames.includes(\"email\");\n const hasMobile = allowedUsernames.includes(\"mobile\");\n\n // If only one method is available, use it regardless of activeTab\n const method =\n hasEmail && hasMobile ? activeTab : hasEmail ? \"email\" : \"mobile\";\n\n const loginData = {\n email: method === \"email\" ? values.username : undefined,\n phone: method === \"mobile\" ? values.username : undefined,\n password: values.password,\n remember_me: values.remember || false,\n };\n\n const result = await onLogin(loginData);\n\n // onLogin will handle the response and next_step processing in CompleteAuthFlow\n } catch (error: any) {\n const messagesConfig = getMessagesConfig();\n const errorMessage =\n error.message ||\n messagesConfig?.errors?.loginFailed ||\n \"Login failed. Please try again.\";\n setError(errorMessage);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOTPSuccess = async (result: any) => {\n console.log(\"OTP success in DynamicLoginForm, passing to onLogin:\", result);\n await onLogin(result);\n };\n\n const handleLogout = async () => {\n setLoading(true);\n try {\n await authService.logout();\n toast.success(\"Logged out successfully\");\n setIsLoggedIn(false);\n } catch (error: any) {\n toast.error(error.message || \"Failed to logout\");\n } finally {\n setLoading(false);\n }\n };\n\n const handleChangePassword = async () => {\n if (!newPassword || !confirmPassword) {\n toast.error(\"Please fill in all password fields\");\n return;\n }\n\n if (newPassword !== confirmPassword) {\n toast.error(\"Passwords do not match\");\n return;\n }\n\n if (newPassword.length < 8) {\n toast.error(\"Password must be at least 8 characters long\");\n return;\n }\n\n setLoading(true);\n try {\n await authService.setPassword(newPassword);\n toast.success(\"Password changed successfully!\");\n setShowPasswordChange(false);\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n } catch (error: any) {\n toast.error(error.message || \"Failed to change password\");\n } finally {\n setLoading(false);\n }\n };\n\n const renderPasswordForm = (type: \"email\" | \"mobile\") => {\n const loginConfig = getLoginConfig();\n const messagesConfig = getMessagesConfig();\n\n return (\n <Form\n key={`${type}-${formKey}`} // Use key to reset form when switching tabs\n name={`${type}-password-login`}\n className=\"w-full\"\n onFinish={handlePasswordLogin}\n layout=\"vertical\"\n initialValues={{ remember: false }}\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n closable\n onClose={() => setError(null)}\n className=\"mb-4\"\n />\n )}\n\n <FormItem\n name=\"username\"\n rules={getUsernameRules(type)}\n >\n <Input\n placeholder={\n type === \"email\"\n ? loginConfig?.formPlaceholders?.email ||\n \"Enter your email address\"\n : loginConfig?.formPlaceholders?.mobile ||\n \"Enter your mobile number (+919876543210)\"\n }\n autoComplete={type === \"email\" ? \"email\" : \"tel\"}\n onKeyDown={\n type === \"mobile\"\n ? (e) => {\n // Only allow numbers and + for mobile input\n const allowedKeys = [\n \"Backspace\",\n \"Delete\",\n \"Tab\",\n \"Enter\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ];\n const char = e.key;\n if (!allowedKeys.includes(char) && !/[0-9+]/.test(char)) {\n e.preventDefault();\n }\n }\n : undefined\n }\n />\n </FormItem>\n\n <FormItem\n name=\"password\"\n rules={[\n {\n required: true,\n message:\n messagesConfig?.validation?.required ||\n \"Please input your password!\",\n },\n {\n min: authConfig?.password_policy?.min_length || 6,\n message:\n messagesConfig?.validation?.passwordTooShort ||\n `Password must be at least ${\n authConfig?.password_policy?.min_length || 6\n } characters long`,\n },\n ]}\n >\n <PasswordInput\n placeholder={\n loginConfig?.formPlaceholders?.password || \"Enter your password\"\n }\n autoComplete=\"current-password\"\n />\n </FormItem>\n\n <FormItem>\n <div className=\"flex justify-between items-center w-full\">\n <div>\n {loginConfig?.showRememberMe !== false &&\n showRememberMe &&\n authService.isRememberMeEnabled() && (\n <FormItem name=\"remember\" valuePropName=\"checked\" noStyle>\n <div\n className=\"auth-remember-me\"\n style={secondaryTextStyle}\n >\n <Checkbox\n label={loginConfig?.rememberMeText || \"Remember me\"}\n />\n </div>\n </FormItem>\n )}\n </div>\n <div>\n {authService.isForgotPasswordEnabled() && (\n <Link\n to=\"forgot-password\"\n className=\"text-sm transition-colors duration-300\"\n style={linkStyle}\n >\n {loginConfig?.forgotPasswordText || \"Forgot password?\"}\n </Link>\n )}\n </div>\n </div>\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n className=\"w-full text-base font-medium\"\n disabled={loading}\n fullWidth\n >\n {loginConfig?.submitButtonText || \"Sign in\"}\n </Button>\n </FormItem>\n </Form>\n );\n };\n\n const renderOTPOption = () => {\n if (!authService.isOTPLoginEnabled()) return null;\n\n const loginConfig = getLoginConfig();\n\n if (showOTPForm) {\n return (\n <OTPForm\n onSuccess={handleOTPSuccess}\n onBack={() => setShowOTPForm(false)}\n />\n );\n }\n\n return (\n <Button\n variant=\"secondary\"\n fullWidth\n onClick={() => setShowOTPForm(true)}\n className=\"bg-gray-100 border-gray-300\"\n >\n {loginConfig?.otpButtonText || \"Sign in with OTP\"}\n </Button>\n );\n };\n\n const renderAuthMethods = () => {\n // Ensure we have auth config loaded\n if (!authConfig) {\n return null;\n }\n\n const allowedUsernames = authService.getAllowedUsernames();\n const hasEmail = allowedUsernames.includes(\"email\");\n const hasMobile = allowedUsernames.includes(\"mobile\");\n const hasProviders =\n authService.isSSOEnabled() || authService.isOIDCEnabled();\n const isPasswordEnabled = authService.isPasswordLoginEnabled();\n const isOTPEnabled = authService.isOTPLoginEnabled();\n\n // If no auth methods are enabled at all, return null\n if (!isPasswordEnabled && !isOTPEnabled && !hasProviders) {\n return null;\n }\n\n // If only SSO/OIDC is enabled (no password, no OTP), show SSO/OIDC options only\n if (hasProviders && !isPasswordEnabled && !isOTPEnabled) {\n return (\n <div className=\"w-full\">\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n <div className=\"space-y-2\">\n {authService\n .getSSOProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`sso-standalone-${index}`}\n provider={provider}\n type=\"sso\"\n />\n ))}\n </div>\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"space-y-2\">\n {authService\n .getOIDCProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`oidc-standalone-${index}`}\n provider={provider}\n type=\"oidc\"\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // If only OTP is enabled (no password login), show OTP form directly\n // Also show SSO/OIDC if available\n if (isOTPEnabled && !isPasswordEnabled) {\n const providersConfig = getProvidersConfig();\n return (\n <div className=\"w-full\">\n <OTPForm onSuccess={handleOTPSuccess} />\n {hasProviders && (\n <div className=\"mt-6\">\n <Divider>{providersConfig?.separatorText || \"OR\"}</Divider>\n\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n <div className=\"space-y-2\">\n {authService\n .getSSOProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`sso-otp-${index}`}\n provider={provider}\n type=\"sso\"\n />\n ))}\n </div>\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n <div className=\"space-y-2\">\n {authService\n .getOIDCProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`oidc-otp-${index}`}\n provider={provider}\n type=\"oidc\"\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n\n // Check if we need tabs (only show tabs if both email and mobile are enabled AND password login is enabled)\n const showTabs = hasEmail && hasMobile && isPasswordEnabled;\n\n if (showTabs) {\n // Show tabs when both methods are available\n const loginConfig = getLoginConfig();\n const providersConfig = getProvidersConfig();\n\n return (\n <div className=\"w-full\">\n <Tabs\n className=\"login-tabs\"\n activeKey={activeTab}\n onChange={(key) => {\n setActiveTab(key as \"email\" | \"mobile\");\n setFormKey((prev) => prev + 1); // Reset form by changing key\n }}\n items={[\n {\n key: \"email\",\n label: (\n <span className=\"flex items-center gap-1\" style={textStyle}>\n <Mail size={16} />\n {loginConfig?.tabLabels?.email || \"Email\"}\n </span>\n ),\n children: (\n <>\n {renderPasswordForm(\"email\")}\n {isOTPEnabled && isPasswordEnabled && !showOTPForm && (\n <div className=\"mt-6\">\n <Divider>\n {providersConfig?.separatorText || \"OR\"}\n </Divider>\n {renderOTPOption()}\n </div>\n )}\n {showOTPForm && renderOTPOption()}\n {/* SSO and OIDC providers for email tab */}\n {!showOTPForm && hasProviders && (\n <div className=\"mt-6\">\n <Divider>\n {providersConfig?.separatorText || \"OR\"}\n </Divider>\n\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n <div className=\"space-y-2\">\n {authService\n .getSSOProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`sso-email-${index}`}\n provider={provider}\n type=\"sso\"\n />\n ))}\n </div>\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n <div className=\"space-y-2\">\n {authService\n .getOIDCProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`oidc-email-${index}`}\n provider={provider}\n type=\"oidc\"\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </>\n ),\n },\n {\n key: \"mobile\",\n label: (\n <span className=\"flex items-center gap-1\" style={textStyle}>\n <Smartphone size={16} />\n {loginConfig?.tabLabels?.mobile || \"Mobile\"}\n </span>\n ),\n children: (\n <>\n {renderPasswordForm(\"mobile\")}\n {isOTPEnabled && isPasswordEnabled && !showOTPForm && (\n <div className=\"mt-6\">\n <Divider>OR</Divider>\n {renderOTPOption()}\n </div>\n )}\n {showOTPForm && renderOTPOption()}\n {/* SSO and OIDC providers for mobile tab */}\n {!showOTPForm && hasProviders && (\n <div className=\"mt-6\">\n <Divider>OR</Divider>\n\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n <div className=\"space-y-2\">\n {authService\n .getSSOProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`sso-mobile-${index}`}\n provider={provider}\n type=\"sso\"\n />\n ))}\n </div>\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n <div className=\"space-y-2\">\n {authService\n .getOIDCProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`oidc-${index}`}\n provider={provider}\n type=\"oidc\"\n onClick={(provider: any) => {\n console.log(\n \"OIDC provider clicked:\",\n provider\n );\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </>\n ),\n },\n ]}\n />\n </div>\n );\n } else {\n // Show single form without tabs\n const singleMethod = hasEmail ? \"email\" : \"mobile\";\n return (\n <div className=\"w-full\">\n {renderPasswordForm(singleMethod)}\n {isOTPEnabled && isPasswordEnabled && !showOTPForm && (\n <div className=\"mt-6\">\n <Divider>OR</Divider>\n {renderOTPOption()}\n </div>\n )}\n {showOTPForm && renderOTPOption()}\n\n {/* SSO and OIDC providers */}\n {!showOTPForm && hasProviders && (\n <div className=\"mt-6\">\n <Divider>OR</Divider>\n\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n <div className=\"space-y-2\">\n {authService\n .getSSOProviders()\n .map((provider: any, index: number) => (\n <ProviderButton\n key={`sso-single-${index}`}\n provider={provider}\n type=\"sso\"\n />\n ))}\n </div>\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n {/* OIDC providers would be rendered here */}\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n };\n\n // Show loading state while auth config is being loaded\n if (!authConfig) {\n return (\n <div className=\"flex justify-center items-center min-h-[300px]\">\n <Spin size=\"large\" />\n </div>\n );\n }\n\n // If user is already logged in, show logout and change password options\n if (isLoggedIn) {\n return (\n <div className=\"w-full\">\n {!showPasswordChange ? (\n <div className=\"space-y-4\">\n <div className=\"text-center mb-4\">\n <h3 className=\"text-lg font-medium\" style={textStyle}>\n Already Logged In\n </h3>\n <p className=\"text-sm mt-2\" style={secondaryTextStyle}>\n You are currently logged in.\n </p>\n </div>\n\n <Button block onClick={() => setShowPasswordChange(true)}>\n Change Password\n </Button>\n\n <Button block danger onClick={handleLogout} loading={loading}>\n Logout\n </Button>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <h4 className=\"text-base font-medium mb-4\">Change Your Password</h4>\n\n <FormItem label=\"New Password\">\n <PasswordInput\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"Enter new password\"\n disabled={loading}\n />\n </FormItem>\n\n <FormItem label=\"Confirm Password\">\n <PasswordInput\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder=\"Confirm new password\"\n disabled={loading}\n />\n </FormItem>\n\n <div className=\"flex gap-2\">\n <Button\n type=\"primary\"\n onClick={handleChangePassword}\n loading={loading}\n className=\"flex-1\"\n >\n Change Password\n </Button>\n\n <Button\n onClick={() => {\n setShowPasswordChange(false);\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n }}\n disabled={loading}\n className=\"flex-1\"\n >\n Cancel\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return renderAuthMethods();\n};\n\nexport default DynamicLoginForm;\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, Input, PasswordInput, Checkbox, Button, toast, Space, Select } from '@zango-core/components';\nimport { User, Lock, Mail, Phone } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { authService } from '../services/authService';\nimport { useAuthContext } from './AuthProvider';\n\nconst LoginForm = ({ onLogin, showRememberMe = true, showForgotPassword = true }) => {\n const [loading, setLoading] = useState(false);\n const [formKey, setFormKey] = useState(0);\n const [selectedUsernameType, setSelectedUsernameType] = useState<string>('email');\n const { authConfig } = useAuthContext();\n\n useEffect(() => {\n if (authConfig) {\n const allowedUsernames = authService.getAllowedUsernames();\n if (allowedUsernames && allowedUsernames.length > 0) {\n setSelectedUsernameType(allowedUsernames[0]);\n }\n }\n }, [authConfig]);\n\n const handleSubmit = async (values: any) => {\n setLoading(true);\n try {\n if (onLogin) {\n // Map the form values to the expected API format\n const loginData = {\n email: selectedUsernameType === 'email' ? values.username : undefined,\n phone: selectedUsernameType === 'mobile' ? values.username : undefined,\n username: selectedUsernameType === 'username' ? values.username : values.username,\n password: values.password,\n remember_me: values.remember || false\n };\n await onLogin(loginData);\n }\n } catch (error: any) {\n toast.error(error.message || 'Login failed. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const getUsernameIcon = () => {\n switch (selectedUsernameType) {\n case 'email':\n return <Mail size={16} className=\"text-gray-400\" />;\n case 'mobile':\n return <Phone size={16} className=\"text-gray-400\" />;\n default:\n return <User size={16} className=\"text-gray-400\" />;\n }\n };\n\n const getUsernamePlaceholder = () => {\n switch (selectedUsernameType) {\n case 'email':\n return 'Email address';\n case 'mobile':\n return 'Phone number';\n case 'username':\n return 'Username';\n default:\n return 'Username';\n }\n };\n\n const getUsernameValidationRules = () => {\n const baseRules = [{ required: true, message: `Please input your ${selectedUsernameType}!` }];\n \n switch (selectedUsernameType) {\n case 'email':\n return [...baseRules, { type: 'email' as const, message: 'Please enter a valid email address!' }];\n case 'mobile':\n return [...baseRules, { pattern: /^\\+?[1-9]\\d{1,14}$/, message: 'Please enter a valid phone number!' }];\n case 'username':\n return [...baseRules, { min: 3, message: 'Username must be at least 3 characters long' }];\n default:\n return baseRules;\n }\n };\n\n if (!authConfig) {\n return <div className=\"flex justify-center items-center min-h-[300px]\">Loading...</div>;\n }\n\n const allowedUsernames = authService.getAllowedUsernames();\n const showUsernameSelector = allowedUsernames.length > 1;\n const isRememberMeEnabled = authService.isRememberMeEnabled();\n const isForgotPasswordEnabled = authService.isForgotPasswordEnabled();\n\n return (\n <Form\n key={formKey}\n name=\"login\"\n className=\"w-full space-y-4\"\n initialValues={{ remember: false }}\n onFinish={handleSubmit}\n autoComplete=\"off\"\n layout=\"vertical\"\n >\n {showUsernameSelector && (\n <FormItem\n label=\"Login with\"\n className=\"mb-4\"\n >\n <Select\n value={selectedUsernameType}\n onChange={setSelectedUsernameType}\n options={allowedUsernames.map((type: string) => ({\n value: type,\n label: type === 'mobile' ? 'Phone' : type.charAt(0).toUpperCase() + type.slice(1)\n }))}\n />\n </FormItem>\n )}\n\n <FormItem\n name=\"username\"\n rules={getUsernameValidationRules()}\n >\n <Input\n placeholder={getUsernamePlaceholder()}\n autoComplete={selectedUsernameType === 'email' ? 'email' : 'username'}\n />\n </FormItem>\n\n <FormItem\n name=\"password\"\n rules={[\n { required: true, message: 'Please input your password!' },\n { min: authConfig?.password_policy?.min_length || 6, message: `Password must be at least ${authConfig?.password_policy?.min_length || 6} characters long` }\n ]}\n >\n <PasswordInput\n placeholder=\"Password\"\n autoComplete=\"current-password\"\n />\n </FormItem>\n\n <FormItem>\n <Space className=\"flex justify-between items-center w-full\">\n {showRememberMe && isRememberMeEnabled && (\n <FormItem name=\"remember\" valuePropName=\"checked\" noStyle>\n <Checkbox label=\"Remember me\" />\n </FormItem>\n )}\n {showForgotPassword && isForgotPasswordEnabled && (\n <Link to=\"forgot-password\" className=\"text-brand-500 text-sm hover:text-brand-600 transition-colors\">\n Forgot password?\n </Link>\n )}\n </Space>\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n className=\"w-full h-10 text-base font-medium\"\n disabled={loading}\n fullWidth\n >\n Log in\n </Button>\n </FormItem>\n </Form>\n );\n};\n\nexport default LoginForm;","import React, { useState } from 'react';\nimport { Typography, Tag, Spin, Button } from '@zango-core/components';\nimport { User, Users, Crown, Shield, CheckCircle, Star } from 'lucide-react';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getLogoContainerStyle, getAuthLogoStyle, getAuthTextStyle, getAuthSecondaryTextStyle } from '../../framework/utils/authThemeUtils';\n\ninterface Role {\n id: string;\n name: string;\n description?: string;\n permissions?: string[];\n is_default?: boolean;\n}\n\ninterface User {\n id?: string;\n name?: string;\n username?: string;\n email?: string;\n}\n\ninterface RoleSelectionProps {\n user?: User;\n roles: Role[];\n onRoleSelect: (role: Role) => Promise<void>;\n loading?: boolean;\n title?: string;\n subtitle?: string;\n logo?: React.ReactNode;\n}\n\nconst { Title, Text, Paragraph } = Typography;\n\n// Simple Avatar component replacement with initials support\nconst Avatar: React.FC<{\n size?: number | 'default' | 'large' | 'small';\n icon?: React.ReactNode;\n src?: string;\n style?: React.CSSProperties;\n className?: string;\n children?: React.ReactNode;\n}> = ({ size = 'default', icon, src, style, className, children }) => {\n const sizeMap = {\n small: 24,\n default: 32,\n large: 40\n };\n const sizeValue = typeof size === 'number' ? size : sizeMap[size];\n\n return (\n <div\n className={`inline-flex items-center justify-center bg-blue-500 text-white rounded-full overflow-hidden ${className || ''}`}\n style={{\n width: sizeValue,\n height: sizeValue,\n fontSize: sizeValue * 0.45,\n ...style\n }}\n >\n {src ? (\n <img src={src} alt=\"Avatar\" className=\"w-full h-full object-cover\" />\n ) : icon ? (\n icon\n ) : (\n children || <User size={sizeValue * 0.6} />\n )}\n </div>\n );\n};\n\n// Simple Empty component replacement\nconst Empty: React.FC<{\n description?: React.ReactNode;\n className?: string;\n image?: any;\n}> = ({ description, className, image }) => {\n return (\n <div className={`flex flex-col items-center justify-center py-8 ${className || ''}`}>\n {!image && (\n <div className=\"mb-4 text-gray-400\">\n <svg width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" fill=\"currentColor\">\n <g transform=\"translate(0 1)\" fillRule=\"evenodd\">\n <ellipse fill=\"#f5f5f5\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\n <g fillRule=\"nonzero\" stroke=\"#d9d9d9\">\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\n <path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" fill=\"#fafafa\" />\n </g>\n </g>\n </svg>\n </div>\n )}\n {description && <div className=\"text-sm text-gray-500\">{description}</div>}\n </div>\n );\n};\n\nconst getRoleIcon = (roleName: string) => {\n const name = roleName.toLowerCase();\n if (name.includes('admin')) return <Crown size={20} />;\n if (name.includes('manager') || name.includes('supervisor')) return <Users size={20} />;\n if (name.includes('security') || name.includes('compliance')) return <Shield size={20} />;\n return <User size={20} />;\n};\n\nconst getRoleColor = (roleName: string, isDefault?: boolean) => {\n if (isDefault) return '#1890ff';\n const name = roleName.toLowerCase();\n if (name.includes('admin')) return '#ff4d4f';\n if (name.includes('manager') || name.includes('supervisor')) return '#52c41a';\n if (name.includes('security') || name.includes('compliance')) return '#fa8c16';\n if (name.includes('user') || name.includes('employee')) return '#722ed1';\n return '#595959';\n};\n\nconst RoleSelection: React.FC<RoleSelectionProps> = ({\n user,\n roles,\n onRoleSelect,\n loading = false,\n title = \"Choose Your Role\",\n subtitle = \"Select the role that best matches your current responsibilities\",\n logo\n}) => {\n const [selectedRole, setSelectedRole] = useState<Role | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n // Get authConfig for customizations\n const { getRoleSelectionConfig, getCardConfig, authConfig } = useAuthConfig();\n const roleConfig = getRoleSelectionConfig();\n const cardStyle = getAuthCardStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n const handleSubmit = async () => {\n if (!selectedRole) return;\n\n setSubmitting(true);\n try {\n await onRoleSelect(selectedRole);\n } catch (error) {\n console.error('Role selection failed:', error);\n } finally {\n setSubmitting(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center min-h-[400px]\">\n <Spin size=\"large\" tip=\"Loading your available roles...\" />\n </div>\n );\n }\n\n if (!roles || roles.length === 0) {\n const EmptyComponent = roleConfig?.customEmptyState;\n\n if (EmptyComponent) {\n return <EmptyComponent />;\n }\n\n return (\n <div className=\"max-w-lg mx-auto p-5\">\n <div style={cardStyle}>\n <Empty\n className=\"text-center py-12 px-5 text-gray-500\"\n description={\n <div>\n <Text className=\"text-gray-600 text-base block mb-2\">\n {roleConfig?.emptyStateMessage || \"No roles available\"}\n </Text>\n <Text type=\"secondary\" className=\"text-sm\">\n Please contact your administrator for role assignment\n </Text>\n </div>\n }\n />\n </div>\n </div>\n );\n }\n\n // Get merged title and subtitle\n const displayTitle = React.isValidElement(roleConfig?.title) ? roleConfig.title : (roleConfig?.title || title);\n const displaySubtitle = React.isValidElement(roleConfig?.subtitle) ? roleConfig.subtitle : (roleConfig?.subtitle || subtitle);\n\n // Determine grid columns\n const gridColumns = roleConfig?.gridColumns || (roles.length <= 2 ? 2 : 3);\n\n return (\n <div className=\"max-w-lg mx-auto p-5\">\n <div style={cardStyle}>\n {/* Logo */}\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n\n {/* Header */}\n <div className=\"text-center mb-8\">\n {React.isValidElement(displayTitle) ? (\n displayTitle\n ) : (\n <Title level={3} className=\"!mb-3 !text-2xl !font-semibold !text-gray-800\" style={getAuthTextStyle(authConfig)}>\n {displayTitle}\n </Title>\n )}\n\n {React.isValidElement(displaySubtitle) ? (\n displaySubtitle\n ) : (\n <Paragraph className=\"!mb-6 text-base text-gray-600 !leading-relaxed\" style={getAuthSecondaryTextStyle(authConfig)}>\n {displaySubtitle}\n </Paragraph>\n )}\n\n {user && (\n <div className=\"inline-flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-xl border border-gray-200\">\n <Avatar\n size=\"default\"\n className=\"bg-blue-500\"\n >\n {((user.name || user.username || 'U').split(' ').map(n => n[0]).join('').toUpperCase()).slice(0, 2)}\n </Avatar>\n <div className=\"text-left\">\n <Text strong className=\"text-sm block text-gray-800\">\n {user.name || user.username || 'User'}\n </Text>\n {user.email && (\n <Text type=\"secondary\" className=\"text-xs\">\n {user.email}\n </Text>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Roles Grid */}\n <div className=\"mb-8\">\n <div className=\"max-h-96 overflow-y-auto px-2 py-2\" style={{ maxHeight: roleConfig?.maxHeight || '24rem' }}>\n <div className={`grid gap-4 grid-cols-${gridColumns}`}>\n {roles.map(role => {\n const CustomRoleCard = roleConfig?.customRoleCard;\n\n if (CustomRoleCard) {\n return (\n <CustomRoleCard\n key={role.id}\n role={role}\n selected={selectedRole?.id === role.id}\n onSelect={() => setSelectedRole(role)}\n />\n );\n }\n\n const cardStyling = roleConfig?.roleCardStyling || {};\n const isSelected = selectedRole?.id === role.id;\n\n return (\n <div\n key={role.id}\n className=\"cursor-pointer transition-all duration-300 border relative p-4 hover:-translate-y-1 flex flex-col items-center h-32 min-h-[8rem]\"\n style={{\n backgroundColor: isSelected ?\n cardStyling.selectedColor || '#e6f7ff' :\n cardStyling.backgroundColor || '#ffffff',\n borderColor: isSelected ?\n cardStyling.selectedColor || '#1890ff' :\n '#d9d9d9',\n borderRadius: cardStyling.borderRadius || '16px',\n ...roleConfig?.roleCardStyling\n }}\n onClick={() => setSelectedRole(role)}\n >\n {/* Selection Check Mark */}\n {selectedRole?.id === role.id && (\n <div className=\"absolute -top-2 -right-2 bg-brand-500 rounded-full p-2\">\n <CheckCircle size={16} className=\"text-white\" />\n </div>\n )}\n\n {/* Role Icon - Fixed position */}\n <div className=\"flex justify-center mt-2 mb-3\">\n <div className=\"w-12 h-12 bg-gray-100 rounded-xl flex items-center justify-center\">\n {getRoleIcon(role.name)}\n </div>\n </div>\n\n {/* Role Name - Flexible space with center alignment */}\n <div className=\"flex-1 flex flex-col items-center justify-center text-center px-1\">\n <Title\n level={5}\n className=\"!mb-0 !text-sm !font-semibold !text-gray-900 !leading-tight !line-clamp-2 !text-center\"\n title={role.name}\n >\n {role.name}\n </Title>\n {role.is_default && (\n <div className=\"mt-1\">\n <Tag\n color=\"warning\"\n className=\"bg-yellow-50 border-yellow-300 text-yellow-700 font-medium text-xs px-1\"\n >\n {roleConfig?.recommendedBadgeText || \"Recommended\"}\n </Tag>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Action Button */}\n <div className=\"pt-4 border-t border-gray-200\">\n <Button\n type=\"primary\"\n block\n onClick={handleSubmit}\n disabled={!selectedRole}\n loading={submitting}\n icon={selectedRole ? <CheckCircle size={16} /> : null}\n className=\"w-full\"\n >\n {selectedRole\n ? (roleConfig?.continueButtonText?.replace('{roleName}', selectedRole.name) || `Continue as ${selectedRole.name}`)\n : 'Please select a role to continue'\n }\n </Button>\n\n {selectedRole?.is_default && (\n <Text type=\"secondary\" className=\"block text-center mt-3 text-sm\">\n This is your recommended role based on your permissions\n </Text>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default RoleSelection;","import React, { useState, useEffect } from 'react';\nimport { Button, Card, Typography, Space, toast, Segmented, Alert } from '@zango-core/components';\nimport { Mail, Smartphone, Shield, ArrowLeft } from 'lucide-react';\nimport OTPInput from './OTPInput';\nimport { authService } from '../services/authService';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getAuthTextStyle, getAuthSecondaryTextStyle, getLogoContainerStyle, getAuthLogoStyle } from '../../framework/utils/authThemeUtils';\n\ninterface User {\n id?: string;\n name?: string;\n username?: string;\n email?: string;\n mobile?: string;\n}\n\ninterface SecondFactorAuthProps {\n user?: User;\n availableMethods?: ('sms' | 'email' | 'totp')[];\n onVerify: (result: any) => Promise<void>;\n loading?: boolean;\n otpDigits?: number;\n retryInterval?: number;\n title?: string;\n subtitle?: string;\n logo?: React.ReactNode;\n}\n\nconst { Title, Text, Paragraph } = Typography;\n\nconst SecondFactorAuth: React.FC<SecondFactorAuthProps> = ({\n user,\n availableMethods = ['email', 'sms'],\n onVerify,\n loading = false,\n otpDigits = 6,\n retryInterval = 30,\n title = \"Two-Factor Authentication\",\n subtitle = \"For your security, please verify your identity\",\n logo\n}) => {\n const [selectedMethod, setSelectedMethod] = useState<'sms' | 'email' | 'totp'>(availableMethods[0] || 'email');\n const [otp, setOtp] = useState('');\n const [resendTimer, setResendTimer] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [otpSent, setOtpSent] = useState(false);\n\n // Get authConfig for customizations\n const { authConfig, getTwoFactorConfig, getMessagesConfig } = useAuthConfig();\n const twoFactorConfig = getTwoFactorConfig();\n const messagesConfig = getMessagesConfig();\n const cardStyle = getAuthCardStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n useEffect(() => {\n if (resendTimer > 0) {\n const timer = setTimeout(() => setResendTimer(resendTimer - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendTimer]);\n\n const getMaskedContact = (method: string) => {\n if (method === 'email' && user?.email) {\n const [username, domain] = user.email.split('@');\n const masked = username.substring(0, 3) + '****' + username.substring(username.length - 1);\n return `${masked}@${domain}`;\n }\n if ((method === 'sms' || method === 'mobile') && user?.mobile) {\n return `****${user.mobile.substring(user.mobile.length - 4)}`;\n }\n if (method === 'totp') {\n return 'your authenticator app';\n }\n return method === 'email' ? 'your email' : method === 'sms' ? 'your mobile' : 'your authenticator app';\n };\n\n const handleSendOTP = async () => {\n setSubmitting(true);\n try {\n await authService.sendTwoFactorCode(selectedMethod);\n setOtpSent(true);\n setResendTimer(twoFactorConfig?.resendCountdown || retryInterval);\n const successMessage = messagesConfig?.success?.otpSent ||\n `OTP sent to ${getMaskedContact(selectedMethod)}`;\n toast.success(successMessage);\n } catch (error: any) {\n const errorMessage = messagesConfig?.errors?.networkError ||\n error.message ||\n 'Failed to Request OTP';\n toast.error(errorMessage);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleVerify = async () => {\n const expectedLength = twoFactorConfig?.codeLength || otpDigits;\n if (otp.length !== expectedLength) {\n const errorMessage = messagesConfig?.validation?.required ||\n `Please enter ${expectedLength} digit OTP`;\n toast.error(errorMessage);\n return;\n }\n\n setSubmitting(true);\n try {\n const result = await authService.verifyTwoFactorCode(otp);\n await onVerify(result);\n } catch (error: any) {\n const errorMessage = messagesConfig?.errors?.invalidOTP ||\n error.message ||\n 'Invalid OTP';\n toast.error(errorMessage);\n setOtp('');\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleResend = async () => {\n if (resendTimer > 0) return;\n await handleSendOTP();\n };\n\n const renderMethodSelector = () => {\n if (availableMethods.length <= 1) return null;\n\n const options = availableMethods.map(method => ({\n label: (\n <Space>\n {method === 'email' ? <Mail size={16} /> :\n method === 'sms' ? <Smartphone size={16} /> : <Shield size={16} />}\n <span>\n {method === 'email' ? (twoFactorConfig?.methodLabels?.email || 'Email') :\n method === 'sms' ? (twoFactorConfig?.methodLabels?.sms || 'SMS') :\n (twoFactorConfig?.methodLabels?.mobile || 'Authenticator')}\n </span>\n </Space>\n ),\n value: method\n }));\n\n return (\n <div className=\"mb-6\">\n <Text type=\"secondary\" className=\"block mb-2 text-xs\">Verification Method</Text>\n <Segmented\n options={options}\n value={selectedMethod}\n onChange={(value: any) => {\n setSelectedMethod(value);\n setOtpSent(false);\n setOtp('');\n }}\n block\n />\n </div>\n );\n };\n\n return (\n <div className=\"w-full max-w-lg mx-auto\">\n <Card className=\"shadow-lg rounded-lg\" bordered={false} style={cardStyle}>\n {/* Logo */}\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n\n <div className=\"text-center mb-8\">\n\n <Title level={3} className=\"!mb-2\" style={getAuthTextStyle(authConfig)}>\n {twoFactorConfig?.title || title}\n </Title>\n <Paragraph className=\"!mb-0 text-sm\" type=\"secondary\" style={getAuthSecondaryTextStyle(authConfig)}>\n {twoFactorConfig?.subtitle || subtitle}\n </Paragraph>\n </div>\n\n <div className=\"mt-6\">\n {renderMethodSelector()}\n\n {!otpSent ? (\n <div className=\"mt-6\">\n <Alert\n message={twoFactorConfig?.instructionText ||\n `We'll send a verification code to ${getMaskedContact(selectedMethod)}`}\n type=\"info\"\n showIcon\n className=\"mb-6\"\n />\n <Button\n variant=\"primary\"\n fullWidth\n disabled={submitting}\n onClick={handleSendOTP}\n >\n Send Verification Code\n </Button>\n </div>\n ) : (\n <div className=\"mt-6\">\n <Text className=\"block text-center mb-6 text-gray-700\">\n {twoFactorConfig?.instructionText ||\n `Enter the ${twoFactorConfig?.codeLength || otpDigits}-digit code sent to ${getMaskedContact(selectedMethod)}`}\n </Text>\n\n <div className=\"flex justify-center mb-6\">\n <OTPInput\n length={twoFactorConfig?.codeLength || otpDigits}\n value={otp}\n onChange={setOtp}\n disabled={submitting}\n />\n </div>\n\n <Button\n variant=\"primary\"\n fullWidth\n disabled={submitting}\n onClick={handleVerify}\n className=\"mb-4\"\n >\n {twoFactorConfig?.submitButtonText || 'Verify'}\n </Button>\n\n <div className=\"text-center\">\n {resendTimer > 0 ? (\n <Text type=\"secondary\">Resend code in {resendTimer}s</Text>\n ) : (\n <Button variant=\"link\" onClick={handleResend} disabled={submitting}>\n {twoFactorConfig?.resendButtonText || 'Resend Code'}\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n </Card>\n </div>\n );\n};\n\nexport default SecondFactorAuth;","import React, { useState, useEffect } from 'react';\nimport { Button, Card, Form, FormItem, PasswordInput, Typography, Space, Alert, Progress } from '@zango-core/components';\nimport { Lock, Key, CheckCircle } from 'lucide-react';\nimport { authService } from '../services/authService';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getAuthTextStyle, getAuthSecondaryTextStyle, getLogoContainerStyle, getAuthLogoStyle } from '../../framework/utils/authThemeUtils';\n\ninterface PasswordRules {\n minLength: number;\n maxLength?: number;\n requireUppercase: boolean;\n requireLowercase: boolean;\n requireNumbers: boolean;\n requireSpecialChars: boolean;\n}\n\ninterface PasswordResetRequiredProps {\n reason?: string;\n onReset: (data: { password: string; confirmPassword: string }) => Promise<void>;\n loading?: boolean;\n title?: string;\n subtitle?: string;\n passwordRules?: PasswordRules;\n logo?: React.ReactNode;\n}\n\nconst { Title, Text, Paragraph } = Typography;\n\nconst PasswordResetRequired: React.FC<PasswordResetRequiredProps> = ({\n reason = \"Your password has expired\",\n onReset,\n loading = false,\n title = \"Password Reset Required\",\n subtitle = \"Please create a new password to continue\",\n passwordRules,\n logo\n}) => {\n const [formKey, setFormKey] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [password, setPassword] = useState('');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [effectivePasswordRules, setEffectivePasswordRules] = useState<PasswordRules>({\n minLength: 8,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true\n });\n\n // Get authConfig for customizations\n const { authConfig, getResetPasswordConfig, getMessagesConfig } = useAuthConfig();\n const resetPasswordConfig = getResetPasswordConfig();\n const messagesConfig = getMessagesConfig();\n const cardStyle = getAuthCardStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n useEffect(() => {\n // Load password policy from authService if not provided\n if (!passwordRules) {\n const policy = authService.getPasswordPolicy();\n setEffectivePasswordRules({\n minLength: policy.min_length || 8,\n maxLength: policy.max_length,\n requireUppercase: policy.require_uppercase || false,\n requireLowercase: policy.require_lowercase || false,\n requireNumbers: policy.require_numbers || false,\n requireSpecialChars: policy.require_special_chars || false\n });\n } else {\n setEffectivePasswordRules(passwordRules);\n }\n }, [passwordRules]);\n\n const getPasswordStrength = (pwd: string) => {\n if (!pwd) return { percent: 0, status: 'exception' as const };\n\n let strength = 0;\n if (pwd.length >= effectivePasswordRules.minLength) strength += 20;\n if (pwd.length >= 12) strength += 10;\n if (effectivePasswordRules.requireUppercase && /[A-Z]/.test(pwd)) strength += 20;\n if (effectivePasswordRules.requireLowercase && /[a-z]/.test(pwd)) strength += 20;\n if (effectivePasswordRules.requireNumbers && /\\d/.test(pwd)) strength += 15;\n if (effectivePasswordRules.requireSpecialChars && /[!@#$%^&*]/.test(pwd)) strength += 15;\n\n if (strength < 40) return { percent: strength, status: 'exception' as const };\n if (strength < 70) return { percent: strength, status: 'normal' as const };\n return { percent: strength, status: 'success' as const };\n };\n\n const validatePassword = (_: any, value: string) => {\n if (!value) {\n const errorMessage = messagesConfig?.validation?.required || 'Please input your password!';\n return Promise.reject(new Error(errorMessage));\n }\n\n // Use authService validation if available\n const validation = authService.validatePassword(value);\n if (!validation.valid) {\n const errorMessage = messagesConfig?.validation?.passwordTooShort || validation.errors.join(', ');\n return Promise.reject(new Error(errorMessage));\n }\n\n return Promise.resolve();\n };\n\n const handleSubmit = async (values: any) => {\n // Clear any previous error\n setErrorMessage(null);\n\n // Validate passwords match before making API call\n if (values.password !== values.confirmPassword) {\n const error = messagesConfig?.validation?.passwordsDoNotMatch ||\n 'Passwords do not match!';\n setErrorMessage(error);\n return;\n }\n\n setSubmitting(true);\n try {\n // Use onReset prop to handle the password reset\n await onReset({\n password: values.password,\n confirmPassword: values.confirmPassword\n });\n } catch (error: any) {\n // Show error inline instead of toast\n const message = error?.message || 'Failed to set password. Please try again.';\n setErrorMessage(message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const passwordStrength = getPasswordStrength(password);\n\n return (\n <div className=\"w-full max-w-lg mx-auto\">\n <Card className=\"shadow-lg rounded-lg\" bordered={false} style={cardStyle}>\n {/* Logo */}\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n\n <div className=\"text-center mb-6\">\n <Title level={3} className=\"!mb-2\" style={getAuthTextStyle(authConfig)}>\n {resetPasswordConfig?.resetForm?.title || title}\n </Title>\n <Paragraph className=\"!mb-0 text-sm\" type=\"secondary\" style={getAuthSecondaryTextStyle(authConfig)}>\n {resetPasswordConfig?.resetForm?.subtitle || subtitle}\n </Paragraph>\n </div>\n\n <Alert\n message={reason}\n type=\"warning\"\n showIcon\n className=\"mb-6\"\n />\n\n {errorMessage && (\n <Alert\n message={errorMessage}\n type=\"error\"\n showIcon\n className=\"mb-6\"\n />\n )}\n\n <Form\n key={formKey}\n name=\"password-reset-required\"\n onFinish={handleSubmit}\n layout=\"vertical\"\n className=\"mt-6\"\n >\n <FormItem\n name=\"password\"\n label={resetPasswordConfig?.resetForm?.passwordLabel || 'New Password'}\n rules={[{ validator: validatePassword }]}\n >\n <PasswordInput\n prefix={<Lock size={16} />}\n placeholder={resetPasswordConfig?.resetForm?.passwordPlaceholder || \"New Password\"}\n onChange={(e) => setPassword(e.target.value)}\n />\n </FormItem>\n\n {password && (\n <div className=\"-mt-4 mb-4\">\n <Text type=\"secondary\" className=\"text-xs block mb-1\">\n Password Strength\n </Text>\n <Progress\n percent={passwordStrength.percent}\n status={passwordStrength.status}\n showInfo={false}\n strokeWidth={4}\n />\n </div>\n )}\n\n <FormItem\n name=\"confirmPassword\"\n label={resetPasswordConfig?.resetForm?.confirmPasswordLabel || 'Confirm Password'}\n dependencies={['password']}\n rules={[\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please confirm your password!'\n },\n ({ getFieldValue }) => ({\n validator(_, value) {\n if (!value || getFieldValue('password') === value) {\n return Promise.resolve();\n }\n const errorMessage = messagesConfig?.validation?.passwordsDoNotMatch ||\n 'Passwords do not match!';\n return Promise.reject(new Error(errorMessage));\n },\n }),\n ]}\n >\n <PasswordInput\n prefix={<Lock size={16} />}\n placeholder={resetPasswordConfig?.resetForm?.confirmPasswordPlaceholder || \"Confirm Password\"}\n />\n </FormItem>\n\n {resetPasswordConfig?.resetForm?.showPasswordRequirements !== false && (\n <div className=\"bg-gray-50 p-4 rounded-md mb-6\">\n <Text type=\"secondary\" className=\"block font-medium mb-2\">\n {resetPasswordConfig?.resetForm?.passwordRequirementsText || 'Password Requirements:'}\n </Text>\n <Space direction=\"vertical\" size=\"small\">\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={password.length >= effectivePasswordRules.minLength ? 'text-green-500' : 'text-gray-300'} />\n At least {effectivePasswordRules.minLength} characters\n </Text>\n {effectivePasswordRules.maxLength && (\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={password.length <= effectivePasswordRules.maxLength ? 'text-green-500' : 'text-gray-300'} />\n At most {effectivePasswordRules.maxLength} characters\n </Text>\n )}\n {effectivePasswordRules.requireUppercase && (\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={/[A-Z]/.test(password) ? 'text-green-500' : 'text-gray-300'} />\n One uppercase letter\n </Text>\n )}\n {effectivePasswordRules.requireLowercase && (\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={/[a-z]/.test(password) ? 'text-green-500' : 'text-gray-300'} />\n One lowercase letter\n </Text>\n )}\n {effectivePasswordRules.requireNumbers && (\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={/\\d/.test(password) ? 'text-green-500' : 'text-gray-300'} />\n One number\n </Text>\n )}\n {effectivePasswordRules.requireSpecialChars && (\n <Text type=\"secondary\" className=\"flex items-center gap-2 text-sm\">\n <CheckCircle size={16} className={/[!@#$%^&*]/.test(password) ? 'text-green-500' : 'text-gray-300'} />\n One special character (!@#$%^&*)\n </Text>\n )}\n </Space>\n </div>\n )}\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n fullWidth\n disabled={submitting || loading}\n >\n {resetPasswordConfig?.resetForm?.submitButtonText || 'Reset Password'}\n </Button>\n </FormItem>\n </Form>\n </Card>\n </div>\n );\n};\n\nexport default PasswordResetRequired;","import React, { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Layout, Card, Spin, Alert, toast } from '@zango-core/components';\nimport { authService } from '../services/authService';\nimport RoleSelection from '../components/RoleSelection';\nimport SecondFactorAuth from '../components/SecondFactorAuth';\nimport PasswordResetRequired from '../components/PasswordResetRequired';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthBackgroundStyle } from '../../framework/utils/authThemeUtils';\nimport { getValidRedirectUrl } from '../../framework/utils/redirectUtils';\nconst { Content } = Layout;\n\ninterface SAMLCallbackPageProps {\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n onAuthComplete?: (result: any) => void;\n roleSelectionTitle?: string;\n roleSelectionSubtitle?: string;\n twoFactorTitle?: string;\n twoFactorSubtitle?: string;\n passwordResetTitle?: string;\n passwordResetSubtitle?: string;\n}\n\nconst SAMLCallbackPage: React.FC<SAMLCallbackPageProps> = ({\n logo,\n title = 'Processing Authentication',\n subtitle = 'Please wait while we complete your login',\n onAuthComplete,\n roleSelectionTitle = 'Select Your Role',\n roleSelectionSubtitle = 'Choose a role to continue',\n twoFactorTitle = 'Two-Factor Authentication',\n twoFactorSubtitle = 'Please enter your verification code',\n passwordResetTitle = 'Reset Password',\n passwordResetSubtitle = 'Please enter your new password'\n}) => {\n const [searchParams] = useSearchParams();\n const { authConfig } = useAuthConfig();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [authData, setAuthData] = useState<any>(null);\n const [authStep, setAuthStep] = useState<string | null>(null);\n\n // Helper function to clean redirect URL by removing token and request_id params\n const cleanRedirectUrl = (redirectUrl: string): string => {\n try {\n const url = new URL(redirectUrl, window.location.origin);\n url.searchParams.delete('token');\n url.searchParams.delete('request_id');\n return url.pathname + (url.search ? url.search : '');\n } catch (e) {\n // If URL parsing fails, try simple string manipulation\n const urlObj = new URL(redirectUrl.startsWith('http') ? redirectUrl : `${window.location.origin}${redirectUrl}`);\n urlObj.searchParams.delete('token');\n urlObj.searchParams.delete('request_id');\n return urlObj.pathname + (urlObj.search ? urlObj.search : '');\n }\n };\n\n useEffect(() => {\n handleSAMLCallback();\n }, []);\n\n const handleSAMLCallback = async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Set flag to indicate SAML auth is in progress\n sessionStorage.setItem('saml_auth_in_progress', 'true');\n\n // Get token and request_id from URL parameters\n const token = searchParams.get('token');\n const requestId = searchParams.get('request_id');\n const next = searchParams.get('next');\n\n if (!token || !requestId) {\n throw new Error('Missing required SAML parameters (token or request_id)');\n }\n\n // Check if we should process this SAML callback\n // Only process if on login page with token parameter\n const currentPath = window.location.pathname;\n if (!currentPath.startsWith('/app/login')) {\n setLoading(false);\n // Clear flag on early exit\n sessionStorage.removeItem('saml_auth_in_progress');\n return; // Exit early without processing\n }\n\n // Step 1: Always call SAML ops API first to get authentication metadata\n const result = await authService.getSAMLAuthMeta(token, requestId);\n\n // Check for user_not_found error code\n if (result?.code === 'user_not_found') {\n // Store error in sessionStorage to show toast once in LoginPage\n sessionStorage.setItem('saml_error', JSON.stringify({\n message: result.message || 'User does not exist',\n timestamp: Date.now()\n }));\n\n // Clear flag before redirecting\n sessionStorage.removeItem('saml_auth_in_progress');\n window.location.href = '/app/login';\n return;\n }\n\n // Step 2: Check if this is a multi-step authentication flow\n if (result?.status === 401 && result?.data?.next_step) {\n\n // Extract roles from next_step metadata if it's role_selection\n if (result.data.next_step.id === 'role_selection' && result.data.next_step.metadata?.roles) {\n\n // Convert roles object to array format expected by RoleSelection component\n let rolesArray = [];\n if (Array.isArray(result.data.next_step.metadata.roles)) {\n rolesArray = result.data.next_step.metadata.roles;\n } else if (typeof result.data.next_step.metadata.roles === 'object') {\n rolesArray = Object.entries(result.data.next_step.metadata.roles).map(([id, name]) => ({\n id: id,\n name: name as string,\n is_default: false\n }));\n }\n\n setAuthData({\n roles: rolesArray,\n token,\n requestId,\n samlMetadata: result.data\n });\n setAuthStep('role_selection');\n setLoading(false);\n return;\n }\n\n // Handle other auth steps\n setAuthData(result.data);\n setAuthStep(result.data.next_step.id);\n setLoading(false);\n return;\n }\n\n // Step 3: Check if role selection is needed from API response (fallback)\n if (result?.roles && result.roles.length > 1) {\n setAuthData({ roles: result.roles, token, requestId });\n setAuthStep('role_selection');\n setLoading(false);\n return;\n }\n\n // Step 4: Authentication complete - redirect or call completion handler\n if (onAuthComplete) {\n console.log('SAML callback complete, calling onAuthComplete:', result);\n // Clear flag before calling onAuthComplete\n sessionStorage.removeItem('saml_auth_in_progress');\n onAuthComplete(result);\n } else {\n console.log('SAML callback complete, redirecting to:', result?.redirect_url || '/app');\n const redirectUrl = getValidRedirectUrl(\n next,\n result?.redirect_url,\n '/app'\n );\n // Clear flag before redirect\n sessionStorage.removeItem('saml_auth_in_progress');\n window.location.href = redirectUrl;\n }\n\n } catch (error: any) {\n console.error('SAML callback error:', error);\n setError(error.message || 'Failed to process SAML authentication');\n setLoading(false);\n // Clear flag on error\n sessionStorage.removeItem('saml_auth_in_progress');\n }\n };\n\n const handleRoleSelection = async (role: any) => {\n try {\n setLoading(true);\n\n // Use the new setRole method which calls /role/set/ endpoint\n const result = await authService.setRole(role.id);\n\n // Check if there's another auth step required after role selection\n if (result?.status === 401 && result?.data?.next_step) {\n setAuthData(result.data);\n setAuthStep(result.data.next_step.id);\n setLoading(false);\n return;\n }\n\n // Role selection and authentication complete\n if (onAuthComplete) {\n // Clear flag before calling onAuthComplete\n sessionStorage.removeItem('saml_auth_in_progress');\n onAuthComplete(result);\n } else {\n const redirectUrl = getValidRedirectUrl(\n next,\n result?.redirect_url,\n '/app'\n );\n // Clear flag before redirect\n sessionStorage.removeItem('saml_auth_in_progress');\n window.location.href = redirectUrl;\n }\n\n } catch (error: any) {\n console.error('Role selection error:', error);\n toast.error(`Failed to select role: ${error.message || 'Please try again'}`);\n setLoading(false);\n // Clear flag on error\n sessionStorage.removeItem('saml_auth_in_progress');\n }\n };\n\n const handleTwoFactorSuccess = async (result: any) => {\n try {\n\n // Check if there's another auth step required after 2FA\n if (result?.status === 401 && result?.data?.next_step) {\n setAuthData(result.data);\n setAuthStep(result.data.next_step);\n return;\n }\n\n // 2FA complete\n if (onAuthComplete) {\n // Clear flag before calling onAuthComplete\n sessionStorage.removeItem('saml_auth_in_progress');\n onAuthComplete(result);\n } else {\n const redirectUrl = getValidRedirectUrl(\n next,\n result?.redirect_url,\n '/app'\n );\n // Clear flag before redirect\n sessionStorage.removeItem('saml_auth_in_progress');\n window.location.href = redirectUrl;\n }\n } catch (error: any) {\n console.error('Two-factor completion error:', error);\n toast.error(error.message || 'Failed to complete two-factor authentication');\n // Clear flag on error\n sessionStorage.removeItem('saml_auth_in_progress');\n }\n };\n\n const handlePasswordResetSuccess = async (result: any) => {\n try {\n\n // Check if there's another auth step required after password reset\n if (result?.status === 401 && result?.data?.next_step) {\n setAuthData(result.data);\n setAuthStep(result.data.next_step);\n return;\n }\n\n // Password reset complete\n if (onAuthComplete) {\n // Clear flag before calling onAuthComplete\n sessionStorage.removeItem('saml_auth_in_progress');\n onAuthComplete(result);\n } else {\n const redirectUrl = getValidRedirectUrl(\n next,\n result?.redirect_url,\n '/app'\n );\n // Clear flag before redirect\n sessionStorage.removeItem('saml_auth_in_progress');\n window.location.href = redirectUrl;\n }\n } catch (error: any) {\n console.error('Password reset completion error:', error);\n toast.error(error.message || 'Failed to complete password reset');\n // Clear flag on error\n sessionStorage.removeItem('saml_auth_in_progress');\n }\n };\n\n const renderContent = () => {\n if (loading) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[300px] text-center\">\n <Spin size=\"large\" />\n <p className=\"mt-4 text-gray-600\">{subtitle}</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <Alert\n message=\"Authentication Error\"\n description={error}\n type=\"error\"\n showIcon\n action={\n <a href=\"/app/login\">Return to Login</a>\n }\n />\n );\n }\n\n // Render appropriate auth step\n switch (authStep) {\n case 'role_selection':\n return (\n <RoleSelection\n roles={authData?.roles || []}\n onRoleSelect={handleRoleSelection}\n title={roleSelectionTitle}\n subtitle={roleSelectionSubtitle}\n loading={loading}\n logo={logo}\n />\n );\n\n case '2fa_required':\n return (\n <SecondFactorAuth\n user={authData?.user}\n onVerify={handleTwoFactorSuccess}\n title={twoFactorTitle}\n subtitle={twoFactorSubtitle}\n logo={logo}\n />\n );\n\n case 'password_reset_required':\n return (\n <PasswordResetRequired\n onReset={handlePasswordResetSuccess}\n title={passwordResetTitle}\n subtitle={passwordResetSubtitle}\n reason={authData?.metadata?.reason}\n logo={logo}\n />\n );\n\n default:\n return (\n <Card className=\"w-full max-w-md shadow-lg rounded-lg\" bordered={false}>\n {logo && (\n <div className=\"text-center mb-6\">\n {typeof logo === 'string' ? <img src={logo} alt=\"Logo\" className=\"max-w-[150px] h-auto mx-auto\" /> : logo}\n </div>\n )}\n <div className=\"text-center mb-[18px]\">\n <h1 className=\"text-3xl font-semibold text-gray-900 mb-2\">{title}</h1>\n </div>\n <Alert\n message=\"Unknown authentication step\"\n description={`Unhandled auth step: ${authStep}`}\n type=\"warning\"\n showIcon\n />\n </Card>\n );\n }\n };\n\n // Helper to check if we should render the outer card\n const shouldRenderOuterCard = () => {\n return loading || error || !authStep;\n };\n\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(authConfig)}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n {shouldRenderOuterCard() ? (\n <Card className=\"w-full max-w-md shadow-lg rounded-lg\" bordered={false}>\n {logo && (\n <div className=\"text-center mb-6\">\n {typeof logo === 'string' ? <img src={logo} alt=\"Logo\" className=\"max-w-[150px] h-auto mx-auto\" /> : logo}\n </div>\n )}\n <div className=\"text-center mb-[18px]\">\n <h1 className=\"text-3xl font-semibold text-gray-900 mb-2\">{title}</h1>\n </div>\n {renderContent()}\n </Card>\n ) : (\n renderContent()\n )}\n </Content>\n </Layout>\n );\n};\n\nexport default SAMLCallbackPage;","import { createContext, useContext } from 'react';\n\ninterface LoginContextType {\n onLogin: (result: any) => void;\n}\n\nexport const LoginContext = createContext<LoginContextType | null>(null);\n\nexport const useLoginContext = () => useContext(LoginContext);\n","import React, { useState, useEffect, useLayoutEffect } from 'react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { Layout, Card, Spin, Alert } from '@zango-core/components';\nimport { toast } from \"@zango-core/components\";\nimport DynamicLoginForm from '../components/DynamicLoginForm';\nimport LoginForm from '../components/LoginForm';\nimport SAMLCallbackPage from './SAMLCallbackPage';\nimport { authService } from '../services/authService';\nimport { LoginPageProps } from '../types';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getAuthCardStyle, getAuthBackgroundStyle, getAuthTextStyle, getAuthSecondaryTextStyle, getLogoContainerStyle, getAuthLogoStyle } from '../../framework/utils/authThemeUtils';\nimport { LoginContext } from '../contexts/LoginContext';\n\n// Global flag to ensure toast shows only once across all renders/mounts\nlet samlErrorShown = false;\n\ninterface ExtendedLoginPageProps extends LoginPageProps {\n useDynamicConfig?: boolean;\n staticConfig?: any;\n}\n\nconst LoginPage: React.FC<ExtendedLoginPageProps> = ({\n onLogin,\n logo,\n title,\n subtitle,\n apiConfig = {},\n useDynamicConfig = true,\n staticConfig = null\n}) => {\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const [loginConfig, setLoginConfig] = useState<any>(null);\n const [loading, setLoading] = useState<boolean>(useDynamicConfig);\n const [error, setError] = useState<string | null>(null);\n\n // Check for SAML callback parameters\n const token = searchParams.get('token');\n const requestId = searchParams.get('request_id');\n const next = searchParams.get('next');\n\n // Handle SAML error from sessionStorage - show toast EXACTLY once\n useLayoutEffect(() => {\n // Check global flag first\n if (samlErrorShown) {\n return; // Already shown, don't check storage\n }\n\n // Read and IMMEDIATELY remove in atomic operation\n const samlError = sessionStorage.getItem('saml_error');\n\n if (samlError) {\n // Set global flag FIRST\n samlErrorShown = true;\n\n // Remove from storage\n sessionStorage.removeItem('saml_error');\n\n // Then show toast\n try {\n const errorData = JSON.parse(samlError);\n toast.error(errorData.message, {\n duration: 5000,\n });\n } catch (e) {\n // If parsing fails, silently ignore (already removed from storage)\n console.error('Failed to parse SAML error:', e);\n }\n }\n }, []); // Empty deps - only run once on mount\n\n // Get authConfig for styling and custom components\n const { authConfig, getCustomComponents } = useAuthConfig();\n const customComponents = getCustomComponents();\n const cardStyle = getAuthCardStyle(authConfig);\n const backgroundStyle = getAuthBackgroundStyle(authConfig);\n const textStyle = getAuthTextStyle(authConfig);\n const secondaryTextStyle = getAuthSecondaryTextStyle(authConfig);\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n\n // If SAML callback parameters are present, handle SAML flow\n if (token && requestId) {\n\n return (\n <SAMLCallbackPage\n logo={logo}\n title={title || 'Processing Authentication'}\n subtitle={subtitle || 'Please wait while we complete your login'}\n onAuthComplete={(result: any) => {\n // Default redirect behavior - you can customize this\n const redirectUrl = result?.redirect_url || '/app';\n // Clean token and request_id from URL before redirecting\n try {\n const url = new URL(redirectUrl, window.location.origin);\n url.searchParams.delete('token');\n url.searchParams.delete('request_id');\n const cleanUrl = url.pathname + (url.search ? url.search : '');\n window.location.href = cleanUrl;\n } catch (e) {\n // Fallback if URL parsing fails\n window.location.href = redirectUrl;\n }\n }}\n roleSelectionTitle=\"Select Your Role\"\n roleSelectionSubtitle=\"Choose a role to continue\"\n twoFactorTitle=\"Two-Factor Authentication\"\n twoFactorSubtitle=\"For your security, please verify your identity\"\n passwordResetTitle=\"Password Update Required\"\n passwordResetSubtitle=\"Please create a new password to continue\"\n />\n );\n }\n\n // Check for custom page/card components\n const CustomLoginPage = customComponents?.LoginPage;\n const CustomLoginCard = customComponents?.LoginCard;\n\n useEffect(() => {\n if (useDynamicConfig && !staticConfig) {\n fetchLoginMethods();\n } else if (staticConfig) {\n setLoginConfig(staticConfig);\n setLoading(false);\n }\n }, [useDynamicConfig, staticConfig]);\n\n const fetchLoginMethods = async () => {\n try {\n const config = await authService.getAuthConfig();\n setLoginConfig(config);\n setError(null);\n } catch (err) {\n console.error('Failed to fetch login methods:', err);\n\n // Use default configuration instead of showing error\n // This allows the login form to still be usable even if config fetch fails\n const defaultConfig = {\n login_methods: {\n password: {\n enabled: true,\n allowed_usernames: ['email']\n },\n otp: { enabled: false },\n sso: { enabled: false },\n oidc: { enabled: false }\n },\n password_policy: {\n min_length: 8,\n reset: {\n enabled: true\n }\n },\n session_policy: {\n remember_me_enabled: true,\n remember_me_duration_days: 30\n }\n };\n\n setLoginConfig(defaultConfig);\n setError(null); // Don't show error, use defaults\n console.warn('Using default auth configuration due to config fetch failure');\n } finally {\n setLoading(false);\n }\n };\n\n const renderLoginForm = () => {\n if (loading) {\n return (\n <div className=\"flex justify-center items-center min-h-[300px]\">\n <Spin size=\"large\" tip=\"Loading login methods...\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <Alert\n message=\"Error\"\n description={error}\n type=\"error\"\n showIcon\n action={\n <a onClick={fetchLoginMethods}>Retry</a>\n }\n />\n );\n }\n\n // Use DynamicLoginForm if config is available, otherwise fall back to simple LoginForm\n if (loginConfig && useDynamicConfig) {\n return (\n <DynamicLoginForm\n onLogin={onLogin}\n />\n );\n }\n\n // Fallback to simple login form\n return <LoginForm onLogin={onLogin} />;\n };\n\n // Priority: CustomLoginPage > CustomLoginCard > Default page layout\n\n // Full page replacement\n if (CustomLoginPage) {\n return <CustomLoginPage />;\n }\n\n // Card-only replacement (keeps page wrapper, background, etc.)\n if (CustomLoginCard) {\n return (\n <LoginContext.Provider value={{ onLogin: onLogin || (() => { }) }}>\n <Layout className=\"min-h-screen\" style={backgroundStyle}>\n <Layout.Content className=\"flex justify-center items-center min-h-screen p-5\">\n <Card className=\"w-full max-w-md\" bordered={false} style={cardStyle}>\n <CustomLoginCard />\n </Card>\n </Layout.Content>\n </Layout>\n </LoginContext.Provider>\n );\n }\n\n // Default page layout\n return (\n <Layout className=\"min-h-screen\" style={backgroundStyle}>\n <Layout.Content className=\"flex justify-center items-center min-h-screen p-5\">\n <Card className=\"w-full max-w-md\" bordered={false} style={cardStyle}>\n {logo && (\n <div className={logoContainerStyle.className} style={logoContainerStyle.style}>\n {typeof logo === 'string' ? (\n <img\n src={logo}\n alt={authConfig?.logo?.alt || \"Logo\"}\n className=\"max-w-[150px] h-auto\"\n style={logoStyle}\n />\n ) : logo}\n </div>\n )}\n <div className=\"text-center mb-[18px]\">\n <h1 className=\"text-3xl font-semibold mb-2\" style={textStyle}>\n {title || 'Welcome Back'}\n </h1>\n {subtitle && (\n <p className=\"text-base\" style={secondaryTextStyle}>\n {subtitle}\n </p>\n )}\n </div>\n {renderLoginForm()}\n </Card>\n </Layout.Content>\n </Layout>\n );\n};\n\nexport default LoginPage;","import React, { useState } from 'react';\nimport { Layout } from '@zango-core/components';\nimport LoginPage from './LoginPage';\nimport RoleSelection from '../components/RoleSelection';\nimport { useAuthContext } from '../components/AuthProvider';\nimport { getAuthBackgroundStyle } from '../../framework/utils/authThemeUtils';\n\nconst { Content } = Layout;\n\nconst LoginPageWithRoleSelection = ({\n logo,\n title,\n subtitle,\n apiConfig,\n useDynamicConfig = true,\n staticConfig = null,\n onLoginSuccess,\n roleSelectionTitle,\n roleSelectionSubtitle,\n initialAuthResult = null\n}) => {\n const { pendingAuth, availableRoles, selectRole, login } = useAuthContext();\n const [loginError, setLoginError] = useState(null);\n\n // Process initialAuthResult if provided (from custom login pages)\n React.useEffect(() => {\n if (initialAuthResult) {\n handleLogin(initialAuthResult);\n }\n }, [initialAuthResult]);\n\n const handleLogin = async (credentials) => {\n setLoginError(null);\n try {\n // Check if the argument is already a login result (from composable components)\n // Composable components perform the login themselves and pass the result\n if (credentials && (credentials.status || credentials.data || credentials.next_step || credentials.response)) {\n if (onLoginSuccess) {\n onLoginSuccess(credentials);\n }\n return;\n }\n\n const result = await login(credentials);\n\n // Store credentials for later use\n const loginUser = {\n email: credentials.email,\n username: credentials.username,\n phone: credentials.phone,\n // Use whichever credential was provided\n display: credentials.email || credentials.username || credentials.phone\n };\n\n if (result.requiresRoleSelection) {\n // Stay on this page, role selection will be shown\n return;\n }\n\n // Login successful and no role selection needed\n if (onLoginSuccess) {\n onLoginSuccess({ ...result, loginUser });\n }\n } catch (error) {\n setLoginError(error.message);\n throw error; // Re-throw to let the form handle it\n }\n };\n\n const handleRoleSelect = async (role) => {\n try {\n const result = await selectRole(role);\n if (onLoginSuccess) {\n onLoginSuccess(result);\n }\n } catch (error) {\n console.error('Role selection failed:', error);\n throw error;\n }\n };\n\n // Show role selection if we have pending authentication\n if (pendingAuth && availableRoles) {\n const backgroundStyle = getAuthBackgroundStyle(apiConfig || staticConfig || {});\n\n return (\n <Layout className=\"min-h-screen\" style={backgroundStyle}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <RoleSelection\n user={pendingAuth.user}\n roles={availableRoles}\n onRoleSelect={handleRoleSelect}\n title={roleSelectionTitle}\n subtitle={roleSelectionSubtitle}\n />\n </Content>\n </Layout>\n );\n }\n\n // Show login page\n return (\n <LoginPage\n onLogin={handleLogin}\n logo={logo}\n title={title}\n subtitle={subtitle}\n apiConfig={apiConfig}\n useDynamicConfig={useDynamicConfig}\n staticConfig={staticConfig}\n />\n );\n};\n\nexport default LoginPageWithRoleSelection;","import React, { useState, useEffect } from 'react';\nimport { Layout, toast, Spin } from '@zango-core/components';\nconst { Content } = Layout;\nimport LoginPageWithRoleSelection from './LoginPageWithRoleSelection';\nimport SecondFactorAuth from '../components/SecondFactorAuth';\nimport PasswordResetRequired from '../components/PasswordResetRequired';\nimport RoleSelection from '../components/RoleSelection';\nimport { useAuthContext } from '../components/AuthProvider';\nimport { authService } from '../services/authService';\nimport { useAuthConfig } from '../../framework/contexts/AuthConfigContext';\nimport { getLogoContainerStyle, getAuthLogoStyle, getAuthBackgroundStyle } from '../../framework/utils/authThemeUtils';\nimport { getValidRedirectUrl } from '../../framework/utils/redirectUtils';\n\ninterface CompleteAuthFlowProps {\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n apiConfig?: any;\n useDynamicConfig?: boolean;\n staticConfig?: any;\n onAuthComplete: (result: any) => void;\n roleSelectionTitle?: string;\n roleSelectionSubtitle?: string;\n twoFactorTitle?: string;\n twoFactorSubtitle?: string;\n passwordResetTitle?: string;\n passwordResetSubtitle?: string;\n initialAuthState?: any;\n redirectPath?: string;\n initialRedirectUrl?: string | null;\n}\n\nconst CompleteAuthFlow: React.FC<CompleteAuthFlowProps> = ({\n logo,\n title,\n subtitle,\n apiConfig,\n useDynamicConfig = true,\n staticConfig = null,\n onAuthComplete,\n roleSelectionTitle,\n roleSelectionSubtitle,\n twoFactorTitle,\n twoFactorSubtitle,\n passwordResetTitle,\n passwordResetSubtitle,\n initialAuthState = null,\n initialRedirectUrl = null\n}) => {\n const { user, pendingAuth } = useAuthContext();\n const { authConfig } = useAuthConfig();\n const logoContainerStyle = getLogoContainerStyle(authConfig);\n const logoStyle = getAuthLogoStyle(authConfig);\n const [authStep, setAuthStep] = useState(() => {\n // Determine initial step based on initialAuthState\n if (initialAuthState) {\n if (initialAuthState.roles && initialAuthState.roles.length > 1) {\n return 'roleSelection';\n } else if (initialAuthState.requires2FA) {\n return 'twoFactor';\n } else if (initialAuthState.requiresPasswordReset) {\n return 'passwordReset';\n }\n }\n return 'login';\n });\n const [authToken, setAuthToken] = useState<string | null>(initialAuthState?.token || null);\n const [twoFactorMethods, setTwoFactorMethods] = useState<string[] | null>(initialAuthState?.twoFactorMethods || null);\n const [passwordResetReason, setPasswordResetReason] = useState<string | null>(initialAuthState?.passwordResetReason || null);\n const [authData, setAuthData] = useState<any>(initialAuthState || null);\n const [redirectUrl] = useState<string | null>(initialRedirectUrl || null);\n\n // Handle login success and determine next step\n const handleLoginSuccess = async (result: any) => {\n\n // Handle the nested API response format\n let responseData = result;\n let nextStep = null;\n let isAuthenticated = false;\n let statusCode = null;\n\n // Check if response has the nested structure from authService\n if (result?.status === 401 && result?.data) {\n responseData = result.data;\n nextStep = result.data?.next_step;\n statusCode = result.status;\n isAuthenticated = result?.meta?.is_authenticated || false;\n } else if (result?.next_step) {\n // Direct next_step from OTP verification or other auth methods\n responseData = result;\n nextStep = result.next_step;\n isAuthenticated = result?.meta?.is_authenticated || false;\n statusCode = result?.status;\n } else if (result?.response) {\n // Response wrapper format\n statusCode = result.response.status;\n responseData = result.response.data;\n nextStep = responseData?.next_step;\n isAuthenticated = result.response.meta?.is_authenticated || false;\n } else {\n // Legacy format handling\n responseData = result?.response?.data || result?.data || result;\n nextStep = responseData?.next_step;\n isAuthenticated = result?.meta?.is_authenticated || responseData?.meta?.is_authenticated || false;\n statusCode = result?.status || responseData?.status;\n }\n\n // Extract login user info from result\n const loginUser = result?.loginUser;\n\n // Store any authentication token if present\n if (result?.token || responseData?.token) {\n setAuthToken(result.token || responseData.token);\n }\n\n // Create user object with login info\n let userInfo = result?.user || responseData?.user || loginUser || {};\n\n // Ensure userInfo is an object\n if (typeof userInfo !== 'object' || userInfo === null) {\n userInfo = {};\n }\n\n // Merge login credentials if available\n if (loginUser && typeof loginUser === 'object') {\n userInfo = {\n ...userInfo,\n email: userInfo.email || loginUser.email,\n username: userInfo.username || loginUser.username,\n phone: userInfo.phone || loginUser.phone,\n name: userInfo.name || loginUser.display\n };\n }\n\n // Check if authentication is complete (OTP or password login success)\n if (statusCode === 200 && isAuthenticated) {\n toast.success('Login successful!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n user: userInfo,\n authenticated: true,\n redirect_url: getValidRedirectUrl(\n redirectUrl,\n responseData?.redirect_url || result?.redirect_url,\n '/app'\n )\n });\n }\n return;\n }\n\n // If there's a next_step, handle it\n if (nextStep && nextStep.is_pending) {\n switch (nextStep.id) {\n case 'role_selection':\n // Convert roles object to array format expected by RoleSelection component\n // Handle any format: {\"5\": \"HCP\", \"7\": \"Doctor\"} or [{id: 5, name: \"HCP\"}]\n let rolesArray = [];\n\n if (Array.isArray(nextStep.metadata.roles)) {\n rolesArray = nextStep.metadata.roles;\n } else if (typeof nextStep.metadata.roles === 'object') {\n rolesArray = Object.entries(nextStep.metadata.roles).map(([id, name]) => ({\n id: id,\n name: name as string,\n is_default: false\n }));\n }\n\n setAuthData({\n ...result,\n roles: rolesArray,\n user: userInfo,\n nextStep: nextStep,\n loginUser: loginUser\n });\n setAuthStep('roleSelection');\n return;\n\n case 'mfa_authenticate':\n setAuthToken(result.token || responseData?.token);\n // Extract the 2FA method from metadata.type (single method) or metadata.methods (array)\n const mfaMethod = nextStep.metadata?.type ? [nextStep.metadata.type] :\n nextStep.metadata?.methods || ['email'];\n setTwoFactorMethods(mfaMethod);\n setAuthStep('twoFactor');\n return;\n\n case 'set_password':\n setAuthToken(result.token || responseData?.token);\n // Store password policy from metadata\n const passwordPolicy = nextStep.metadata?.password_policy;\n setPasswordResetReason(nextStep.metadata?.reason || 'Password update required');\n setAuthData({\n ...result,\n passwordPolicy: passwordPolicy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n return;\n\n case 'password_expiry':\n setAuthToken(result.token || responseData?.token);\n // Handle password expiry\n setPasswordResetReason('Your password has expired');\n setAuthData({\n ...result,\n passwordPolicy: nextStep.metadata?.password_policy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n return;\n\n case 'first_login':\n setAuthToken(result.token || responseData?.token);\n // Handle first login password setup\n setPasswordResetReason('Please set up your password for first login');\n setAuthData({\n ...result,\n passwordPolicy: nextStep.metadata?.password_policy,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n return;\n\n case 'login_by_code':\n setAuthToken(result.token || responseData?.token);\n // Handle OTP-based login flow\n // This would typically redirect to OTP verification\n // For now, we'll treat it as a login completion\n toast.info('OTP verification required');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n user: userInfo,\n requiresOTP: true\n });\n }\n return;\n }\n }\n\n // Legacy format support\n if (result.requires2FA) {\n setAuthToken(result.token);\n setTwoFactorMethods(result.twoFactorMethods || ['email']);\n setAuthData({\n ...result,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('twoFactor');\n return;\n }\n\n if (result.requiresPasswordReset) {\n setAuthToken(result.token);\n setPasswordResetReason(result.passwordResetReason || 'Your password has expired');\n setAuthData({\n ...result,\n user: userInfo,\n loginUser: loginUser\n });\n setAuthStep('passwordReset');\n return;\n }\n\n // Authentication complete\n if (onAuthComplete) {\n onAuthComplete({ ...result, user: userInfo });\n }\n };\n\n // Handle 2FA verification\n const handleTwoFactorVerify = async (result) => {\n try {\n\n // Handle the API response format\n let responseData = result;\n let nextStep = null;\n let isAuthenticated = false;\n let statusCode = null;\n\n // Check response structure\n if (result?.status === 401 && result?.data) {\n responseData = result.data;\n nextStep = result.data?.next_step;\n statusCode = result.status;\n isAuthenticated = result?.meta?.is_authenticated || false;\n } else if (result?.response) {\n statusCode = result.response.status;\n responseData = result.response.data;\n nextStep = responseData?.next_step;\n isAuthenticated = result.response.meta?.is_authenticated || false;\n } else {\n responseData = result?.data || result;\n nextStep = responseData?.next_step;\n isAuthenticated = result?.meta?.is_authenticated || responseData?.meta?.is_authenticated || false;\n statusCode = result?.status || responseData?.status;\n }\n\n // Check if authentication is complete\n if (statusCode === 200 && isAuthenticated) {\n toast.success('Two-factor authentication successful!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n token: authToken,\n user: authData?.user,\n authenticated: true,\n redirect_url: getValidRedirectUrl(\n redirectUrl,\n responseData?.redirect_url || result?.redirect_url,\n '/app'\n )\n });\n }\n return;\n }\n\n // Handle additional authentication steps\n if (nextStep && nextStep.is_pending) {\n switch (nextStep.id) {\n case 'set_password':\n const passwordPolicy = nextStep.metadata?.password_policy;\n setPasswordResetReason(nextStep.metadata?.reason || 'Password reset required');\n setAuthData({\n ...authData,\n passwordPolicy: passwordPolicy\n });\n setAuthStep('passwordReset');\n return;\n\n default:\n console.warn('Unknown next step after 2FA:', nextStep.id);\n break;\n }\n }\n\n // Legacy format support\n if (result.requiresPasswordReset) {\n setPasswordResetReason(result.passwordResetReason || 'Your password has expired');\n setAuthStep('passwordReset');\n return;\n }\n\n // If no next step and not explicitly authenticated, assume success\n toast.success('Two-factor authentication successful!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n token: authToken,\n user: authData?.user,\n authenticated: true\n });\n }\n } catch (error) {\n throw error;\n }\n };\n\n // Handle 2FA code resend (removed - now handled in SecondFactorAuth component)\n\n // Handle password reset\n const handlePasswordReset = async (data) => {\n try {\n const result = await authService.setPassword(data.password);\n\n // Handle the API response format\n let responseData = result;\n let nextStep = null;\n let isAuthenticated = false;\n let statusCode = null;\n\n // Check response structure\n if (result?.status === 401 && result?.data) {\n responseData = result.data;\n nextStep = result.data?.next_step;\n statusCode = result.status;\n isAuthenticated = result?.meta?.is_authenticated || false;\n } else if (result?.response) {\n statusCode = result.response.status;\n responseData = result.response.data;\n nextStep = responseData?.next_step;\n isAuthenticated = result.response.meta?.is_authenticated || false;\n } else {\n responseData = result?.data || result;\n nextStep = responseData?.next_step;\n isAuthenticated = result?.meta?.is_authenticated || responseData?.meta?.is_authenticated || false;\n statusCode = result?.status || responseData?.status;\n }\n\n // Check if authentication is complete\n if (statusCode === 200 && isAuthenticated) {\n toast.success('Password reset successful!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n token: authToken,\n user: authData?.user,\n authenticated: true,\n redirect_url: getValidRedirectUrl(\n redirectUrl,\n responseData?.redirect_url || result?.redirect_url,\n '/app'\n )\n });\n }\n return;\n }\n\n // Handle additional authentication steps\n if (nextStep && nextStep.is_pending) {\n switch (nextStep.id) {\n case 'mfa_authenticate':\n // Extract the 2FA method from metadata.type (single method) or metadata.methods (array)\n const mfaMethod = nextStep.metadata?.type ? [nextStep.metadata.type] :\n nextStep.metadata?.methods || ['email'];\n setTwoFactorMethods(mfaMethod);\n setAuthStep('twoFactor');\n return;\n\n default:\n console.warn('Unknown next step after password reset:', nextStep.id);\n break;\n }\n }\n\n // If no next step and not explicitly authenticated, assume success\n toast.success('Password reset successful!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n token: authToken,\n user: authData?.user,\n authenticated: true\n });\n }\n } catch (error) {\n toast.error(error.message || 'Failed to reset password');\n throw error;\n }\n };\n\n // Render appropriate step\n const renderAuthStep = () => {\n switch (authStep) {\n case 'login':\n return (\n <LoginPageWithRoleSelection\n onLoginSuccess={handleLoginSuccess}\n logo={logo}\n title={title}\n subtitle={subtitle}\n apiConfig={apiConfig}\n useDynamicConfig={useDynamicConfig}\n staticConfig={staticConfig}\n roleSelectionTitle={roleSelectionTitle}\n roleSelectionSubtitle={roleSelectionSubtitle}\n />\n );\n\n case 'roleSelection':\n // For role selection step\n if (authData?.roles) {\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(authConfig)}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <div className=\"w-full\">\n <RoleSelection\n user={authData?.user}\n roles={authData?.roles || []}\n logo={logo}\n onRoleSelect={async (role) => {\n try {\n // Call the role selection API\n const result = await authService.selectRole(role.id);\n\n // Handle the API response format\n let responseData = result;\n let nextStep = null;\n let isAuthenticated = false;\n let statusCode = null;\n\n // Check if response has the nested structure from authService\n if (result?.status === 401 && result?.data) {\n responseData = result.data;\n nextStep = result.data?.next_step;\n statusCode = result.status;\n isAuthenticated = result?.meta?.is_authenticated || false;\n } else if (result?.response) {\n // Handle nested response structure\n statusCode = result.response.status;\n responseData = result.response.data;\n nextStep = responseData?.next_step;\n isAuthenticated = result.response.meta?.is_authenticated || false;\n } else {\n // Direct response\n responseData = result?.data || result;\n nextStep = responseData?.next_step;\n isAuthenticated = result?.meta?.is_authenticated || responseData?.meta?.is_authenticated || false;\n statusCode = result?.status || responseData?.status;\n }\n\n // Check if authentication is complete\n if (statusCode === 200 && isAuthenticated) {\n toast.success('Role selected successfully!');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n user: { ...authData.user, role },\n authenticated: true,\n redirect_url: getValidRedirectUrl(\n redirectUrl,\n responseData?.redirect_url || result?.redirect_url,\n '/app'\n )\n });\n }\n return;\n }\n\n // Handle additional authentication steps\n if (nextStep && nextStep.is_pending) {\n switch (nextStep.id) {\n case 'mfa_authenticate':\n // Extract the 2FA method from metadata.type (single method) or metadata.methods (array)\n const mfaMethod = nextStep.metadata?.type ? [nextStep.metadata.type] :\n nextStep.metadata?.methods || ['email'];\n setTwoFactorMethods(mfaMethod);\n setAuthStep('twoFactor');\n return;\n\n case 'set_password':\n // Store password policy from metadata\n const passwordPolicy = nextStep.metadata?.password_policy;\n setPasswordResetReason(nextStep.metadata?.reason || 'Password update required');\n setAuthData({\n ...authData,\n passwordPolicy: passwordPolicy\n });\n setAuthStep('passwordReset');\n return;\n\n case 'password_expiry':\n // Handle password expiry\n setPasswordResetReason('Your password has expired');\n setAuthData({\n ...authData,\n passwordPolicy: nextStep.metadata?.password_policy\n });\n setAuthStep('passwordReset');\n return;\n\n case 'first_login':\n // Handle first login password setup\n setPasswordResetReason('Please set up your password for first login');\n setAuthData({\n ...authData,\n passwordPolicy: nextStep.metadata?.password_policy\n });\n setAuthStep('passwordReset');\n return;\n\n case 'login_by_code':\n // Handle OTP-based login flow after role selection\n toast.info('OTP verification required');\n if (onAuthComplete) {\n onAuthComplete({\n ...result,\n user: { ...authData.user, role },\n requiresOTP: true\n });\n }\n return;\n\n default:\n console.warn('Unknown next step:', nextStep.id);\n // Try to continue anyway\n break;\n }\n }\n\n // Authentication complete\n toast.success('Role selected successfully!');\n if (onAuthComplete) {\n onAuthComplete({ ...result, user: { ...authData.user, role } });\n }\n } catch (error) {\n toast.error(error.message || 'Failed to select role');\n throw error;\n }\n }}\n title={roleSelectionTitle || \"Select Your Role\"}\n subtitle={roleSelectionSubtitle || \"Choose a role to continue\"}\n />\n </div>\n </Content>\n </Layout>\n );\n }\n // If no roles data, show loading or redirect to login\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(authConfig)}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <div className=\"text-center py-16 px-5\">\n <Spin size=\"large\" tip=\"Loading...\" />\n </div>\n </Content>\n </Layout>\n );\n break;\n\n case 'twoFactor':\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(authConfig)}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <SecondFactorAuth\n user={authData?.user || (pendingAuth as any)?.user || user}\n availableMethods={twoFactorMethods as any}\n onVerify={handleTwoFactorVerify}\n title={twoFactorTitle}\n subtitle={twoFactorSubtitle}\n />\n </Content>\n </Layout>\n );\n\n case 'passwordReset':\n // Extract password policy from authData\n const passwordPolicy = authData?.passwordPolicy;\n const passwordRules = passwordPolicy ? {\n minLength: passwordPolicy.min_length || 8,\n maxLength: passwordPolicy.max_length,\n requireUppercase: passwordPolicy.require_uppercase || false,\n requireLowercase: passwordPolicy.require_lowercase || false,\n requireNumbers: passwordPolicy.require_numbers || false,\n requireSpecialChars: passwordPolicy.require_special_chars || false\n } : undefined;\n\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(authConfig)}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <PasswordResetRequired\n reason={passwordResetReason || undefined}\n onReset={handlePasswordReset}\n title={passwordResetTitle}\n subtitle={passwordResetSubtitle}\n passwordRules={passwordRules}\n />\n </Content>\n </Layout>\n );\n\n default:\n return null;\n }\n };\n\n return renderAuthStep();\n};\n\nexport default CompleteAuthFlow;","import React from 'react';\nimport { Layout } from '@zango-core/components';\nimport OAuthCallback from '../components/OAuthCallback';\nimport CompleteAuthFlow from './CompleteAuthFlow';\nimport { authService } from '../services/authService';\nimport { getAuthBackgroundStyle } from '../../framework/utils/authThemeUtils';\nconst { Content } = Layout;\n\ninterface OAuthCallbackPageProps {\n logo?: React.ReactNode;\n apiConfig?: any;\n onAuthComplete?: (result: any) => void;\n roleSelectionTitle?: string;\n roleSelectionSubtitle?: string;\n twoFactorTitle?: string;\n twoFactorSubtitle?: string;\n passwordResetTitle?: string;\n passwordResetSubtitle?: string;\n redirectPath?: string;\n}\n\nconst OAuthCallbackPage: React.FC<OAuthCallbackPageProps> = ({\n logo,\n apiConfig,\n onAuthComplete,\n roleSelectionTitle,\n roleSelectionSubtitle,\n twoFactorTitle,\n twoFactorSubtitle,\n passwordResetTitle,\n passwordResetSubtitle,\n redirectPath = '/'\n}) => {\n const [authResult, setAuthResult] = React.useState<any>(null);\n const [showCompleteFlow, setShowCompleteFlow] = React.useState(false);\n\n const handleOAuthSuccess = async (result: any) => {\n // Check if additional steps are required\n if (result.requiresRoleSelection || result.requires2FA || result.requiresPasswordReset) {\n // Store the result and show CompleteAuthFlow\n setAuthResult(result);\n setShowCompleteFlow(true);\n } else {\n // Authentication is complete\n if (result.token) {\n localStorage.setItem(apiConfig?.tokenKey || 'authToken', result.token);\n }\n if (onAuthComplete) {\n onAuthComplete(result);\n }\n }\n };\n\n const handleOAuthError = (error: any) => {\n console.error('OAuth callback error:', error);\n // The OAuthCallback component will handle error display\n };\n\n const handleAuthComplete = (result: any) => {\n // Merge OAuth result with final auth result\n const finalResult = {\n ...authResult,\n ...result,\n authMethod: 'oauth',\n provider: authResult?.provider\n };\n\n if (onAuthComplete) {\n onAuthComplete(finalResult);\n }\n };\n\n // If additional auth steps are required, show CompleteAuthFlow\n if (showCompleteFlow && authResult) {\n return (\n <CompleteAuthFlow\n logo={logo}\n apiConfig={apiConfig}\n onAuthComplete={handleAuthComplete}\n roleSelectionTitle={roleSelectionTitle}\n roleSelectionSubtitle={roleSelectionSubtitle}\n twoFactorTitle={twoFactorTitle}\n twoFactorSubtitle={twoFactorSubtitle}\n passwordResetTitle={passwordResetTitle}\n passwordResetSubtitle={passwordResetSubtitle}\n // Pass initial auth state\n initialAuthState={{\n user: authResult.user,\n token: authResult.token,\n roles: authResult.roles,\n requires2FA: authResult.requires2FA,\n twoFactorMethods: authResult.twoFactorMethods,\n requiresPasswordReset: authResult.requiresPasswordReset,\n passwordResetReason: authResult.passwordResetReason\n }}\n />\n );\n }\n\n // Show OAuth callback handler\n return (\n <Layout className=\"min-h-screen\" style={getAuthBackgroundStyle(apiConfig || {})}>\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <OAuthCallback\n onSuccess={handleOAuthSuccess}\n onError={handleOAuthError}\n apiConfig={apiConfig}\n redirectPath={redirectPath}\n logo={logo}\n roleSelectionTitle={roleSelectionTitle}\n roleSelectionSubtitle={roleSelectionSubtitle}\n twoFactorTitle={twoFactorTitle}\n twoFactorSubtitle={twoFactorSubtitle}\n passwordResetTitle={passwordResetTitle}\n passwordResetSubtitle={passwordResetSubtitle}\n />\n </Content>\n </Layout>\n );\n};\n\nexport default OAuthCallbackPage;","import { useAuthContext } from '../components/AuthProvider';\n\nconst useAuth = () => {\n return useAuthContext();\n};\n\nexport default useAuth;","import React, { useState, useEffect, useMemo } from 'react';\nimport { Routes, Route, Navigate, useLocation, useNavigate, useParams } from 'react-router-dom';\nimport LoginPage from '../pages/LoginPage';\nimport ForgotPasswordForm from './ForgotPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport OAuthCallbackPage from '../pages/OAuthCallbackPage';\nimport SAMLCallbackPage from '../pages/SAMLCallbackPage';\nimport CompleteAuthFlow from '../pages/CompleteAuthFlow';\nimport { ApiConfig } from '../types';\nimport { Home } from 'lucide-react';\n\nimport {\n Layout,\n toast,\n Divider,\n Tag,\n} from \"@zango-core/components\";\n\nimport AuthProvider from './AuthProvider';\nimport useAuth from '../hooks/useAuth';\nimport useAuthStore from '../stores/useAuthStore';\nimport { useAppContext } from '../../framework/contexts/AppContext';\nimport { AuthConfigProvider } from '../../framework/contexts/AuthConfigContext';\nimport { applyAuthTheme, removeAuthTheme, getAuthBackgroundStyle, getAuthCardStyle } from '../../framework/utils/authThemeUtils';\nimport { getValidRedirectUrl } from '../../framework/utils/redirectUtils';\n\nconst { Header, Content } = Layout;\n\ninterface LoginRouterProps {\n basePath?: string;\n apiConfig?: ApiConfig;\n onAuthComplete?: (result: any) => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n // Customizable titles and subtitles for different flows\n roleSelectionTitle?: string;\n roleSelectionSubtitle?: string;\n twoFactorTitle?: string;\n twoFactorSubtitle?: string;\n passwordResetTitle?: string;\n passwordResetSubtitle?: string;\n}\n\n// Mock OTP storage\nconst mockOTPs = {};\nconst mock2FAOTPs = {};\n\n// Mock user configurations for different scenarios\nconst USER_CONFIGS = {\n 'admin@example.com': {\n requires2FA: true,\n requiresPasswordReset: false,\n twoFactorMethods: ['email', 'mobile']\n },\n '+919876543210': {\n requires2FA: true,\n requiresPasswordReset: true,\n passwordResetReason: 'Your password will expire in 7 days',\n twoFactorMethods: ['mobile']\n },\n 'test@example.com': {\n requires2FA: false,\n requiresPasswordReset: true,\n passwordResetReason: 'Password has expired'\n }\n};\n\n// Mock roles data\nconst MOCK_ROLES = {\n 'admin@example.com': [\n {\n id: 1,\n name: 'Super Admin',\n description: 'Full system access with all administrative privileges',\n permissions: ['system.manage', 'users.manage', 'roles.manage', 'settings.manage'],\n is_default: false\n },\n {\n id: 2,\n name: 'Organization Admin',\n description: 'Manage organization settings and users',\n permissions: ['org.manage', 'users.manage', 'reports.view'],\n is_default: true\n },\n {\n id: 3,\n name: 'Compliance Officer',\n description: 'Monitor compliance and security settings',\n permissions: ['compliance.view', 'audit.view', 'reports.generate'],\n is_default: false\n }\n ],\n '+919876543210': [\n {\n id: 4,\n name: 'Team Manager',\n description: 'Manage team members and projects',\n permissions: ['team.manage', 'projects.manage', 'reports.view'],\n is_default: true\n },\n {\n id: 5,\n name: 'Employee',\n description: 'Standard employee access',\n permissions: ['profile.edit', 'tasks.manage', 'reports.view'],\n is_default: false\n }\n ],\n 'default': [\n {\n id: 6,\n name: 'User',\n description: 'Standard user access',\n permissions: ['profile.view', 'profile.edit'],\n is_default: true\n }\n ]\n};\n\nconst createMockApiConfig = (selectedScenario) => ({\n loginEndpoint: \"/api/auth/login\",\n logoutEndpoint: \"/api/auth/logout\",\n verifyEndpoint: \"/api/auth/verify\",\n forgotPasswordEndpoint: \"/api/auth/forgot-password\",\n resetPasswordEndpoint: \"/api/auth/reset-password\",\n loginMethodsEndpoint: \"/api/v1/login/?action=fetch_methods\",\n otpRequestEndpoint: \"/api/auth/otp/request\",\n otpVerifyEndpoint: \"/api/auth/otp/verify\",\n // Mock API client\n apiClient: {\n post: async (endpoint, data) => {\n\n // Simulate API delay\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n if (endpoint.includes(\"login\")) {\n // Handle both email and phone login methods\n const identifier = data.email || data.phone || data.username; // fallback to username for backward compatibility\n const validUsers = [\n \"admin@example.com\",\n \"+919876543210\",\n \"test@example.com\",\n \"admin\",\n ];\n const isValidUser =\n validUsers.includes(identifier) && data.password === \"password\";\n\n if (isValidUser) {\n // Get roles for the user\n const roles = MOCK_ROLES[identifier] || MOCK_ROLES[\"default\"];\n\n // Get user config\n const userConfig = USER_CONFIGS[identifier] || {};\n\n return {\n user: {\n id: 1,\n username: identifier,\n email: identifier.includes(\"@\") ? identifier : \"user@example.com\",\n mobile: identifier.startsWith(\"+\") ? identifier : \"+919876543210\",\n name:\n identifier === \"admin@example.com\"\n ? \"John Admin\"\n : identifier.startsWith(\"+\")\n ? \"Mobile User\"\n : \"Test User\",\n },\n token: \"mock-jwt-token-12345\",\n roles: roles,\n ...userConfig,\n };\n }\n throw new Error(\"Invalid credentials\");\n }\n\n if (endpoint.includes(\"otp/request\")) {\n const identifier =\n data.email_or_phone || data.email || data.phone || data.username;\n const otp = Math.floor(Math.random() * 900000 + 100000)\n .toString()\n .slice(0, 6);\n mockOTPs[identifier] = otp;\n toast.info(`Mock OTP sent! Check console for OTP: ${otp}`);\n return { success: true, message: \"OTP sent successfully\" };\n }\n\n if (endpoint.includes(\"otp/verify\")) {\n const identifier =\n data.email_or_phone || data.email || data.phone || data.username;\n const storedOTP = mockOTPs[identifier];\n if (storedOTP === data.otp) {\n delete mockOTPs[identifier];\n\n // Get roles for the user\n const roles = MOCK_ROLES[identifier] || MOCK_ROLES[\"default\"];\n\n return {\n user: {\n id: 1,\n username: identifier,\n email: identifier.includes(\"@\") ? identifier : \"user@example.com\",\n mobile: identifier.startsWith(\"+\") ? identifier : \"+919876543210\",\n name: identifier.includes(\"@\") ? \"OTP User\" : \"Mobile User\",\n },\n token: \"mock-jwt-token-otp-12345\",\n roles: roles,\n };\n }\n throw new Error(\"Invalid OTP\");\n }\n\n if (endpoint.includes(\"forgot-password\")) {\n return { message: \"Reset email sent successfully\" };\n }\n\n if (endpoint.includes(\"reset-password\")) {\n return { message: \"Password reset successfully\" };\n }\n\n if (endpoint.includes(\"role/select\")) {\n // Check if 2FA is required after role selection\n const userConfig = USER_CONFIGS[\"admin@example.com\"] || {};\n return {\n success: true,\n ...userConfig,\n };\n }\n\n if (endpoint.includes(\"2fa/send\")) {\n const otp = Math.floor(Math.random() * 900000 + 100000)\n .toString()\n .slice(0, 6);\n mock2FAOTPs[data.method] = otp;\n toast.info(`2FA OTP sent! Check console for OTP: ${otp}`);\n return { success: true, message: \"2FA code sent successfully\" };\n }\n\n if (endpoint.includes(\"2fa/verify\")) {\n const storedOTP = mock2FAOTPs[data.method];\n if (storedOTP === data.otp) {\n delete mock2FAOTPs[data.method];\n // Check if password reset is required after 2FA\n const username = \"admin@example.com\"; // In real app, this would come from token\n const userConfig = USER_CONFIGS[username] || {};\n return {\n success: true,\n requiresPasswordReset: userConfig.requiresPasswordReset,\n passwordResetReason: userConfig.passwordResetReason,\n };\n }\n throw new Error(\"Invalid 2FA code\");\n }\n\n if (endpoint.includes(\"password/change\")) {\n return {\n success: true,\n message: \"Password changed successfully\",\n };\n }\n\n if (endpoint.includes(\"oauth/callback\")) {\n // Simulate OAuth user response\n const provider = data.provider || \"google\";\n const mockUser = {\n id: 1,\n email: `user@${provider}.com`,\n name: `${provider.charAt(0).toUpperCase() + provider.slice(1)} User`,\n username: `user@${provider}.com`,\n };\n\n // Simulate different scenarios based on provider\n if (provider === \"google\") {\n // Google user with multiple roles\n return {\n user: mockUser,\n token: \"mock-oauth-token-12345\",\n roles: MOCK_ROLES[\"admin@example.com\"],\n requires2FA: true,\n twoFactorMethods: [\"email\"],\n };\n } else if (provider === \"microsoft\") {\n // Microsoft user needing password reset\n return {\n user: mockUser,\n token: \"mock-oauth-token-12345\",\n requiresPasswordReset: true,\n passwordResetReason: \"first_login\",\n };\n } else {\n // Other providers - direct login\n return {\n user: mockUser,\n token: \"mock-oauth-token-12345\",\n };\n }\n }\n\n return { success: true };\n },\n get: async (endpoint) => {\n // Simulate API delay\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n if (endpoint.includes(\"fetch_methods\") || endpoint.includes(\"config\")) {\n // Return proper auth config structure matching the API response\n return {\n success: true,\n response: {\n auth_config: {\n login_methods: {\n password: {\n enabled: true,\n forgot_password_enabled: true,\n allowed_usernames: [\"email\", \"phone\"],\n },\n otp: {\n enabled: true,\n allowed_methods: [\"email\", \"sms\"],\n },\n sso: {\n enabled: true,\n providers: [\n {\n id: 1,\n label: \"zsaml\"\n }\n ]\n },\n oidc: { enabled: false },\n },\n password_policy: {\n min_length: 8,\n require_numbers: true,\n require_lowercase: true,\n require_uppercase: true,\n require_special_chars: true,\n password_expiry_days: 90,\n password_history_count: 3,\n allow_change: true,\n reset: {\n enabled: true,\n method: [\"email\"],\n expiry_hours: 2,\n },\n },\n session_policy: {\n remember_me_enabled: true,\n remember_me_duration_days: 30,\n },\n two_factor_auth: {\n required: true,\n allowed_methods: [],\n },\n },\n },\n };\n }\n\n if (endpoint.includes(\"verify\")) {\n // Check if token exists\n const token = localStorage.getItem(\"authToken\");\n if (token && token.startsWith(\"mock-jwt-token\")) {\n return { id: 1, username: \"admin\", email: \"admin@example.com\" };\n }\n throw new Error(\"Invalid token\");\n }\n\n return {};\n },\n },\n});\n\nconst LoginRouter: React.FC<LoginRouterProps> = ({\n basePath = '/login',\n apiConfig = {},\n onAuthComplete,\n logo,\n title = 'Welcome Back',\n subtitle = 'Please sign in to your account',\n roleSelectionTitle = 'Select Your Role',\n roleSelectionSubtitle = 'Choose a role to continue',\n twoFactorTitle = 'Two-Factor Authentication',\n twoFactorSubtitle = 'Please enter your verification code',\n passwordResetTitle = 'Reset Password',\n passwordResetSubtitle = 'Please enter your new password'\n}) => {\n // Get authConfig from AppContext\n const { authConfig } = useAppContext();\n const location = useLocation();\n const navigate = useNavigate();\n const [authData, setAuthData] = useState<any>(null);\n const { setBasePath } = useAuthStore();\n\n // Set basePath in store when component mounts or basePath prop changes\n useEffect(() => {\n setBasePath(basePath);\n }, [basePath, setBasePath]);\n\n // Apply auth theme when component mounts and cleanup on unmount\n useEffect(() => {\n if (authConfig) {\n applyAuthTheme(authConfig);\n }\n\n return () => {\n removeAuthTheme();\n };\n }, [authConfig]);\n\n // Merge authConfig with props, giving priority to authConfig\n const mergedConfig = useMemo(() => {\n const loginConfig = authConfig?.login || {};\n const logoConfig = authConfig?.logo || {};\n\n return {\n logo: logoConfig.url ? (\n <img\n src={logoConfig.url}\n alt={logoConfig.alt || 'Logo'}\n style={{\n width: logoConfig.width || 'auto',\n height: logoConfig.height || 'auto',\n ...logoConfig.style\n }}\n className={logoConfig.className}\n />\n ) : logo,\n title: loginConfig.title || title,\n subtitle: loginConfig.subtitle || subtitle,\n roleSelectionTitle: authConfig?.roleSelection?.title || roleSelectionTitle,\n roleSelectionSubtitle: authConfig?.roleSelection?.subtitle || roleSelectionSubtitle,\n twoFactorTitle: authConfig?.twoFactor?.title || twoFactorTitle,\n twoFactorSubtitle: authConfig?.twoFactor?.subtitle || twoFactorSubtitle,\n passwordResetTitle: authConfig?.resetPassword?.resetForm?.title || passwordResetTitle,\n passwordResetSubtitle: authConfig?.resetPassword?.resetForm?.subtitle || passwordResetSubtitle\n };\n }, [authConfig, logo, title, subtitle, roleSelectionTitle, roleSelectionSubtitle, twoFactorTitle, twoFactorSubtitle, passwordResetTitle, passwordResetSubtitle]);\n\n // Background style from authConfig\n const backgroundStyle = useMemo(() => {\n return getAuthBackgroundStyle(authConfig);\n }, [authConfig]);\n\n // Handle successful login\n const handleLogin = async (credentials: any) => {\n try {\n // This would typically call your auth service\n // For now, we'll pass it through to the actual login component\n return credentials;\n } catch (error) {\n throw error;\n }\n };\n\n // Handle auth completion\n const handleAuthComplete = (result: any) => {\n setAuthData(result);\n if (onAuthComplete) {\n onAuthComplete(result);\n } else {\n // Default behavior - could redirect to dashboard or home\n // navigate(\"/dashboard\");\n }\n };\n\n // Login wrapper with custom handler\n const LoginWrapper = () => {\n const navigate = useNavigate();\n\n // Check for pending authentication from composable components\n const pendingAuthResult = sessionStorage.getItem('pendingAuthResult');\n const pendingAuthStep = sessionStorage.getItem('pendingAuthStep');\n\n let initialAuthState = null;\n if (pendingAuthResult) {\n try {\n initialAuthState = JSON.parse(pendingAuthResult);\n\n // Clear the sessionStorage after reading\n sessionStorage.removeItem('pendingAuthResult');\n sessionStorage.removeItem('pendingAuthStep');\n } catch (error) {\n console.error('Failed to parse pending auth result:', error);\n }\n }\n\n const handleAuthComplete = async (result: any) => {\n toast.success(\"Authentication complete!\");\n\n try {\n // Check for 'next' query parameter\n const urlParams = new URLSearchParams(window.location.search);\n const nextPath = urlParams.get('next');\n\n let redirectUrl = \"/app\"; // default redirect to /app\n\n if (nextPath) {\n // Decode and sanitize the next parameter\n const decodedPath = decodeURIComponent(nextPath);\n\n // Security: only allow relative paths starting with /\n // Block javascript:, data:, protocol URLs, and protocol-relative URLs\n const isValidPath =\n decodedPath.startsWith('/') &&\n !decodedPath.startsWith('//') &&\n !decodedPath.toLowerCase().startsWith('javascript:') &&\n !decodedPath.toLowerCase().startsWith('data:') &&\n !decodedPath.toLowerCase().includes('://');\n\n if (isValidPath) {\n redirectUrl = decodedPath;\n } else {\n console.warn(\"Invalid 'next' parameter blocked:\", decodedPath);\n }\n }\n\n // Redirect if on login page\n const currentPath = window.location.pathname;\n\n if (currentPath.startsWith('/app/login')) {\n // On login route, force a page reload to ensure AuthProvider checks authentication status\n // with the new session cookies\n window.location.href = redirectUrl;\n }\n // Otherwise, do nothing - stay on current page (for embedded auth flows)\n } catch (error) {\n console.error(\"Error handling auth completion:\", error);\n // Fallback to /app on error\n window.location.href = \"/app\";\n }\n };\n\n return (\n <div style={{ ...backgroundStyle, minHeight: \"100vh\" }}>\n <CompleteAuthFlow\n onAuthComplete={handleAuthComplete}\n logo={mergedConfig.logo}\n title={mergedConfig.title}\n subtitle={mergedConfig.subtitle}\n apiConfig={createMockApiConfig(\"all-methods\")}\n useDynamicConfig={true}\n roleSelectionTitle={mergedConfig.roleSelectionTitle}\n roleSelectionSubtitle={mergedConfig.roleSelectionSubtitle}\n twoFactorTitle={mergedConfig.twoFactorTitle}\n twoFactorSubtitle={mergedConfig.twoFactorSubtitle}\n passwordResetTitle={mergedConfig.passwordResetTitle}\n passwordResetSubtitle={mergedConfig.passwordResetSubtitle}\n initialAuthState={initialAuthState}\n />\n </div>\n );\n };\n\n // Forgot password wrapper\n const ForgotPasswordWrapper = () => {\n const { forgotPassword } = useAuth();\n const cardStyle = getAuthCardStyle(authConfig);\n\n const handleForgotPassword = async (values) => {\n try {\n await forgotPassword(values);\n const successMessage = authConfig?.resetPassword?.forgotPassword?.successMessage || \"Reset email sent successfully!\";\n toast.success(successMessage);\n } catch (error: any) {\n const errorMessage = authConfig?.resetPassword?.forgotPassword?.errorMessage || error.message || \"Failed to send reset email\";\n toast.error(errorMessage);\n }\n };\n\n return (\n <Layout style={{ ...backgroundStyle, minHeight: \"100vh\" }}>\n <Content\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"20px\",\n }}\n >\n <ForgotPasswordForm onSubmit={handleForgotPassword} authConfig={authConfig} logo={mergedConfig.logo} />\n </Content>\n </Layout>\n );\n };\n\n // Reset password wrapper\n const ResetPasswordWrapper = () => {\n const { resetPassword } = useAuth();\n const { key } = useParams();\n const cardStyle = getAuthCardStyle(authConfig);\n const navigate = useNavigate();\n\n // Redirect if no key provided\n useEffect(() => {\n if (!key) {\n navigate(basePath);\n }\n }, [key, navigate]);\n\n if (!key) return null;\n\n const handleResetPassword = async (values) => {\n // The form now handles the API call directly using authService\n // But if we want to keep using the hook or just pass a success handler\n // We can leave this empty or show a success message if the form doesn't\n // But the form handles success state internally.\n // So we might just pass a dummy handler or one that redirects after some time.\n // The form calls onSubmit with { ...values, token }.\n // We can just log it here or do nothing if the form handles the API call.\n // However, the form implementation I wrote calls authService.confirmResetPassword directly.\n // And it calls onSubmit if provided.\n // So we can just pass a no-op or a logging function.\n console.log(\"Password reset submitted for key:\", key);\n };\n\n return (\n <Layout style={{ ...backgroundStyle, minHeight: \"100vh\" }}>\n <Content\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"20px\",\n }}\n >\n <ResetPasswordForm\n onSubmit={handleResetPassword}\n authConfig={authConfig}\n token={key}\n logo={mergedConfig.logo}\n />\n </Content>\n </Layout>\n );\n };\n\n // Normalize the base path\n const normalizedBasePath = basePath.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath;\n\n return (\n <AuthConfigProvider authConfig={authConfig}>\n <AuthProvider config={createMockApiConfig(\"all-methods\")}>\n <Routes>\n {/* Main login route */}\n <Route\n path=\"/\"\n element={<LoginWrapper />}\n />\n\n {/* Forgot password route */}\n <Route path=\"forgot-password\" element={<ForgotPasswordWrapper />} />\n\n {/* Reset password route with key */}\n <Route path=\"reset-password/:key\" element={<ResetPasswordWrapper />} />\n {/* Legacy route support or redirect */}\n <Route path=\"reset-password\" element={<Navigate to=\"/app\" replace />} />\n\n {/* OAuth callback route */}\n <Route\n path=\"/oauth/callback\"\n element={\n <div style={{ ...backgroundStyle, minHeight: \"100vh\" }}>\n <OAuthCallbackPage\n logo={mergedConfig.logo}\n apiConfig={createMockApiConfig(\"all-methods\")}\n onAuthComplete={(result: any) => {\n // Use the same authentication completion logic as regular login\n const handleOAuthComplete = async () => {\n const redirect_url = result?.response?.data?.redirect_url;\n if (redirect_url) {\n window.location.href = redirect_url;\n }\n };\n handleOAuthComplete();\n }}\n roleSelectionTitle={mergedConfig.roleSelectionTitle}\n roleSelectionSubtitle={mergedConfig.roleSelectionSubtitle}\n twoFactorTitle={mergedConfig.twoFactorTitle}\n twoFactorSubtitle={mergedConfig.twoFactorSubtitle}\n passwordResetTitle={mergedConfig.passwordResetTitle}\n passwordResetSubtitle={mergedConfig.passwordResetSubtitle}\n />\n </div>\n }\n />\n\n {/* SAML callback route */}\n <Route\n path=\"/saml\"\n element={\n <SAMLCallbackPage\n logo={<Home size={48} style={{ color: \"#1890ff\" }} />}\n onAuthComplete={(result: any) => {\n // Check for 'next' query parameter with security validation\n const urlParams = new URLSearchParams(window.location.search);\n const nextParam = urlParams.get('next');\n\n const redirectUrl = getValidRedirectUrl(\n nextParam,\n result?.redirect_url,\n '/app'\n );\n\n window.location.href = redirectUrl;\n }}\n roleSelectionTitle=\"Select Your Role\"\n roleSelectionSubtitle=\"Choose a role to continue\"\n twoFactorTitle=\"Two-Factor Authentication\"\n twoFactorSubtitle=\"For your security, please verify your identity\"\n passwordResetTitle=\"Password Update Required\"\n passwordResetSubtitle=\"Please create a new password to continue\"\n />\n }\n />\n\n {/* Complete auth flow route (for role selection, 2FA, etc.) */}\n <Route\n path=\"/complete\"\n element={\n <CompleteAuthFlow\n authData={authData}\n apiConfig={apiConfig}\n logo={logo}\n onComplete={handleAuthComplete}\n roleSelectionTitle={roleSelectionTitle}\n roleSelectionSubtitle={roleSelectionSubtitle}\n twoFactorTitle={twoFactorTitle}\n twoFactorSubtitle={twoFactorSubtitle}\n passwordResetTitle={passwordResetTitle}\n passwordResetSubtitle={passwordResetSubtitle}\n />\n }\n />\n\n {/* Redirect to app's 404 page for unmatched routes */}\n <Route path=\"*\" element={<Navigate to=\"/404\" replace />} />\n </Routes >\n </AuthProvider >\n </AuthConfigProvider >\n );\n};\n\nexport default LoginRouter;","import React, { useState, useEffect } from 'react';\nimport { Spin } from '@zango-core/components';\nimport ProviderButton from '../ProviderButton';\nimport { authService } from '../../services/authService';\nimport { useAuthConfig } from '../../../framework/contexts/AuthConfigContext';\n\nexport interface SSOButtonsProps {\n /**\n * Layout mode for multiple providers\n * - 'column': Stack buttons vertically (default)\n * - 'grid': Display in a responsive grid (2 columns on desktop, 1 on mobile)\n * - 'row': Display side by side (horizontal)\n *\n * Note: Single button always takes full width regardless of layout\n */\n layout?: 'column' | 'grid' | 'row';\n\n /**\n * Gap between buttons (in Tailwind spacing units)\n * @default 2 for column/row, 3 for grid\n */\n gap?: number;\n\n /**\n * Custom class name for the container\n */\n className?: string;\n\n /**\n * Prefix text for the provider buttons\n * @default \"Continue with\"\n */\n buttonTextPrefix?: string;\n\n /**\n * Postfix text for the provider buttons\n * @default \"\"\n */\n buttonTextPostfix?: string;\n}\n\n/**\n * SSOButtons - Self-contained component that renders SSO/OIDC provider buttons\n *\n * This component automatically:\n * - Fetches auth configuration from API\n * - Checks if SSO/OIDC is enabled\n * - Renders provider buttons if available\n * - Handles OAuth/SAML redirects\n * - Returns null if no providers are configured\n * - Single button takes full width automatically\n * - Multiple buttons can be laid out in column/grid/row\n *\n * @example\n * ```tsx\n * import { SSOButtons } from '@zango/auth/composable';\n *\n * // Default: Column layout\n * <SSOButtons />\n *\n * // Grid layout (2 columns)\n * <SSOButtons layout=\"grid\" />\n *\n * // Row layout (side by side)\n * <SSOButtons layout=\"row\" />\n *\n * // Custom gap\n * <SSOButtons layout=\"grid\" gap={4} />\n * ```\n */\nconst SSOButtons: React.FC<SSOButtonsProps> = ({\n layout = 'column',\n gap,\n className,\n buttonTextPrefix = 'Continue with',\n buttonTextPostfix = ''\n}) => {\n const [loading, setLoading] = useState(true);\n const [authConfig, setAuthConfig] = useState<any>(null);\n const { getProvidersConfig, getCustomComponents } = useAuthConfig();\n\n useEffect(() => {\n // Fetch auth config on mount\n const fetchConfig = async () => {\n try {\n const config = await authService.getAuthConfig();\n setAuthConfig(config);\n } catch (error) {\n console.error('Failed to load auth config:', error);\n } finally {\n setLoading(false);\n }\n };\n\n fetchConfig();\n }, []);\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center p-4\">\n <Spin size=\"small\" />\n </div>\n );\n }\n\n if (!authConfig) {\n return null;\n }\n\n const hasSSOEnabled = authService.isSSOEnabled();\n const hasOIDCEnabled = authService.isOIDCEnabled();\n const ssoProviders = authService.getSSOProviders();\n const oidcProviders = authService.getOIDCProviders();\n\n // If neither SSO nor OIDC is enabled, return null\n if (!hasSSOEnabled && !hasOIDCEnabled) {\n return null;\n }\n\n // If no providers are configured, return null\n if (ssoProviders.length === 0 && oidcProviders.length === 0) {\n return null;\n }\n\n // Check for custom provider button component\n const customComponents = getCustomComponents();\n const CustomProviderButton = customComponents?.ProviderButton;\n\n // Combine all providers\n const allProviders = [\n ...ssoProviders.map((p: any) => ({ ...p, providerType: 'sso' })),\n ...oidcProviders.map((p: any) => ({ ...p, providerType: 'oidc' }))\n ];\n\n const totalProviders = allProviders.length;\n const isSingleButton = totalProviders === 1;\n\n // Determine gap spacing\n const defaultGap = layout === 'grid' ? 3 : 2;\n const gapClass = `gap-${gap ?? defaultGap}`;\n\n // Determine layout classes\n const getLayoutClasses = () => {\n // Single button always takes full width\n if (isSingleButton) {\n return ''; // No flex/grid needed for single button\n }\n\n // Multiple buttons - apply layout\n switch (layout) {\n case 'grid':\n return `grid grid-cols-1 sm:grid-cols-2 ${gapClass}`;\n case 'row':\n return `flex flex-row flex-wrap ${gapClass}`;\n case 'column':\n default:\n return `flex flex-col ${gapClass}`;\n }\n };\n\n const containerClasses = `w-full ${getLayoutClasses()} ${className || ''}`.trim();\n\n // For column layout or single button, buttons should take full width\n // For grid/row, buttons are controlled by the grid/flex container\n const shouldWrapButtons = false; // Let ProviderButton's block prop handle width\n\n return (\n <div className={containerClasses}>\n {allProviders.map((provider: any, index: number) => {\n const ButtonComponent = CustomProviderButton || ProviderButton;\n return (\n <ButtonComponent\n key={`${provider.providerType}-${index}`}\n provider={provider}\n type={provider.providerType}\n prefix={buttonTextPrefix}\n postfix={buttonTextPostfix}\n />\n );\n })}\n </div>\n );\n};\n\nexport default SSOButtons;\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, Input, PasswordInput, Button, Checkbox, Alert, Spin, Tabs } from '@zango-core/components';\nimport { Link } from 'react-router-dom';\nimport { authService } from '../../services/authService';\nimport { useAuthContext } from '../AuthProvider';\nimport { useAuthConfig } from '../../../framework/contexts/AuthConfigContext';\nimport { getAuthTextStyle, getAuthSecondaryTextStyle, getAuthLinkStyle } from '../../../framework/utils/authThemeUtils';\nimport { useLoginContext } from '../../contexts/LoginContext';\n\ninterface PasswordLoginFormProps {\n onSuccess?: (data: any) => void;\n showRememberMe?: boolean;\n submitButtonText?: string;\n}\n\n/**\n * PasswordLoginForm - Composable component for password-based login\n * \n * Automatically handles:\n * - Auth configuration loading\n * - Email/mobile tabs based on allowed usernames\n * - Form validation\n * - Delegates multi-step authentication to parent via LoginContext or onSuccess\n */\nconst PasswordLoginForm: React.FC<PasswordLoginFormProps> = ({\n onSuccess,\n showRememberMe = true,\n submitButtonText\n}) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<'email' | 'mobile'>('email');\n const [formKey, setFormKey] = useState(0);\n const [authConfigLoaded, setAuthConfigLoaded] = useState(false);\n\n const { authConfig } = useAuthContext();\n const { getLoginConfig, getMessagesConfig, authConfig: configContext } = useAuthConfig();\n const loginContext = useLoginContext();\n\n // Get text styles from authConfig\n const effectiveAuthConfig = configContext || authConfig;\n const textStyle = getAuthTextStyle(effectiveAuthConfig);\n const secondaryTextStyle = getAuthSecondaryTextStyle(effectiveAuthConfig);\n const linkStyle = getAuthLinkStyle(effectiveAuthConfig);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n await authService.getAuthConfig();\n const allowedUsernames = authService.getAllowedUsernames();\n\n if (allowedUsernames && allowedUsernames.length > 0) {\n const hasEmail = allowedUsernames.includes('email');\n const hasMobile = allowedUsernames.includes('mobile');\n if (hasEmail) {\n setActiveTab('email');\n } else if (hasMobile) {\n setActiveTab('mobile');\n }\n }\n setAuthConfigLoaded(true);\n } catch (error) {\n console.error('Failed to load auth config:', error);\n setAuthConfigLoaded(true);\n }\n };\n\n fetchConfig();\n }, []);\n\n if (!authConfigLoaded) {\n return (\n <div className=\"flex justify-center items-center min-h-[200px]\">\n <Spin size=\"large\" />\n </div>\n );\n }\n\n const allowedUsernames = authService.getAllowedUsernames();\n const hasEmail = allowedUsernames.includes('email');\n const hasMobile = allowedUsernames.includes('mobile');\n const needsTabs = hasEmail && hasMobile;\n\n const getUsernameRules = (type: string) => {\n const messagesConfig = getMessagesConfig();\n\n if (type === 'email') {\n return [\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please enter your email address'\n },\n {\n type: 'email' as const,\n message: messagesConfig?.validation?.invalidEmail || 'Please enter a valid email address!'\n }\n ];\n } else {\n return [\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please input your mobile number!'\n },\n {\n pattern: /^\\+?[1-9]\\d{1,14}$/,\n message: messagesConfig?.validation?.invalidMobile || 'Please enter a valid mobile number with country code (e.g., +919876543210)'\n }\n ];\n }\n };\n\n const handlePasswordLogin = async (values: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const loginPayload = activeTab === 'email'\n ? { email: values.username, password: values.password }\n : { phone: values.username, password: values.password };\n\n const response = await authService.login(loginPayload);\n\n // Enrich result with loginUser data (like OTPForm does)\n // This is needed for role selection screen to display user info\n const enrichedResult = {\n ...response,\n loginUser: {\n email: activeTab === 'email' ? values.username : undefined,\n phone: activeTab === 'mobile' ? values.username : undefined,\n username: values.username,\n display: values.username\n }\n };\n\n // ALWAYS delegate to parent - NEVER redirect internally\n // This matches OTPForm behavior exactly\n // Parent (CompleteAuthFlow or custom handler) will:\n // - Handle role selection if next_step.id === 'role_selection'\n // - Handle 2FA if next_step.id === 'mfa_authenticate'\n // - Handle password reset if next_step.id === 'set_password'\n // - Redirect to /app if authentication is complete\n\n // 1. Try onSuccess prop first (user override)\n if (onSuccess) {\n onSuccess(enrichedResult);\n return;\n }\n\n // 2. Try LoginContext (standard flow for custom cards)\n if (loginContext?.onLogin) {\n loginContext.onLogin(enrichedResult);\n return;\n }\n\n // 3. No parent handlers - log warning\n console.warn('PasswordLoginForm: No onSuccess prop or LoginContext found. Authentication result not handled.');\n } catch (error: any) {\n const messagesConfig = getMessagesConfig();\n const errorMessage = error?.response?.data?.message ||\n error?.message ||\n messagesConfig?.error?.login ||\n 'Login failed. Please check your credentials and try again.';\n setError(errorMessage);\n } finally {\n setLoading(false);\n }\n };\n\n // Render login form\n const renderPasswordForm = (type: 'email' | 'mobile') => {\n const loginConfig = getLoginConfig();\n const messagesConfig = getMessagesConfig();\n\n return (\n <Form\n key={`${type}-${formKey}`}\n name={`${type}-password-login`}\n className=\"w-full\"\n onFinish={handlePasswordLogin}\n layout=\"vertical\"\n initialValues={{ remember: false, username: '' }}\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n closable\n onClose={() => setError(null)}\n className=\"mb-4\"\n />\n )}\n\n <FormItem\n name=\"username\"\n rules={getUsernameRules(type)}\n >\n <Input\n placeholder={\n type === 'email'\n ? loginConfig?.formPlaceholders?.email || 'Email address'\n : loginConfig?.formPlaceholders?.mobile || 'Mobile number (+919876543210)'\n }\n autoComplete={type === 'email' ? 'email' : 'tel'}\n onKeyDown={type === 'mobile' ? (e) => {\n const allowedKeys = ['Backspace', 'Delete', 'Tab', 'Enter', 'ArrowLeft', 'ArrowRight'];\n const char = e.key;\n if (!allowedKeys.includes(char) && !/[0-9+]/.test(char)) {\n e.preventDefault();\n }\n } : undefined}\n />\n </FormItem>\n\n <FormItem\n name=\"password\"\n rules={[\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please input your password!'\n },\n {\n min: authConfig?.password_policy?.min_length || 6,\n message: messagesConfig?.validation?.passwordTooShort || `Password must be at least ${authConfig?.password_policy?.min_length || 6} characters long`\n }\n ]}\n >\n <PasswordInput\n placeholder={loginConfig?.formPlaceholders?.password || \"Password\"}\n autoComplete=\"current-password\"\n />\n </FormItem>\n\n <FormItem>\n <div className=\"flex justify-between items-center w-full\">\n <div>\n {(loginConfig?.showRememberMe !== false && showRememberMe) && authService.isRememberMeEnabled() && (\n <FormItem name=\"remember\" valuePropName=\"checked\" noStyle>\n <div\n className=\"auth-remember-me\"\n style={secondaryTextStyle}\n >\n <Checkbox label={loginConfig?.rememberMeText || \"Remember me\"} />\n </div>\n </FormItem>\n )}\n </div>\n <div>\n {authService.isForgotPasswordEnabled() && (\n <Link to=\"forgot-password\" className=\"text-sm transition-colors duration-300\" style={linkStyle}>\n {loginConfig?.forgotPasswordText || \"Forgot password?\"}\n </Link>\n )}\n </div>\n </div>\n </FormItem>\n\n <FormItem>\n <Button\n variant=\"primary\"\n type=\"submit\"\n className=\"w-full text-base font-medium\"\n disabled={loading}\n fullWidth\n >\n {submitButtonText || loginConfig?.submitButtonText || \"Sign in\"}\n </Button>\n </FormItem>\n </Form>\n );\n };\n\n // If tabs are needed (both email and mobile)\n if (needsTabs) {\n const tabItems = [\n ...(hasEmail ? [{\n key: 'email',\n label: 'Email',\n children: renderPasswordForm('email')\n }] : []),\n ...(hasMobile ? [{\n key: 'mobile',\n label: 'Mobile',\n children: renderPasswordForm('mobile')\n }] : [])\n ];\n\n return (\n <div className=\"w-full\">\n <Tabs\n activeKey={activeTab}\n onChange={(key) => {\n setActiveTab(key as 'email' | 'mobile');\n setFormKey(prev => prev + 1);\n setError(null);\n }}\n items={tabItems}\n className=\"password-login-tabs\"\n />\n </div>\n );\n }\n\n // If only one method is enabled, render form directly\n const type = hasEmail ? 'email' : 'mobile';\n return renderPasswordForm(type);\n};\n\nexport default PasswordLoginForm;\n","import React, { useState } from 'react';\nimport OTPForm from '../OTPForm';\nimport { authService } from '../../services/authService';\nimport { useLoginContext } from '../../contexts/LoginContext';\n\ninterface OTPLoginFormProps {\n onSuccess?: (data: any) => void;\n onBack?: () => void;\n submitButtonText?: string;\n verifyButtonText?: string;\n resendButtonText?: string;\n}\n\n/**\n * OTPLoginForm - Composable component for OTP-based login\n * \n * Automatically handles:\n * - OTP request and verification\n * - Delegates multi-step authentication to parent via LoginContext or onSuccess\n */\nconst OTPLoginForm: React.FC<OTPLoginFormProps> = ({\n onSuccess,\n onBack,\n submitButtonText,\n verifyButtonText,\n resendButtonText\n}) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const loginContext = useLoginContext();\n\n const handleSuccess = (result: any) => {\n // Extract next_step from various response formats\n let nextStep = null;\n if (result?.status === 401 && result?.data) {\n nextStep = result.data?.next_step;\n } else if (result?.next_step) {\n nextStep = result.next_step;\n } else {\n const responseData = result?.response?.data || result?.data || result;\n nextStep = responseData?.next_step;\n }\n\n // Check for pending next_step (role selection, MFA, password reset, etc.)\n // This must be checked BEFORE the is_authenticated check\n if (nextStep && nextStep.is_pending) {\n\n // Delegate to parent component to handle next_step\n // 1. Try onSuccess prop first (user override)\n if (onSuccess) {\n onSuccess(result);\n return;\n }\n\n // 2. Try LoginContext (standard flow for custom cards)\n if (loginContext?.onLogin) {\n loginContext.onLogin(result);\n return;\n }\n\n // If no parent handlers, log warning\n console.warn('OTPLoginForm: Multi-step auth required but no parent handler found');\n return;\n }\n\n // Check if authentication is complete (no pending steps)\n const isAuthenticated = result?.meta?.is_authenticated ||\n result?.response?.meta?.is_authenticated;\n const statusCode = result?.status || result?.response?.status;\n\n if (statusCode === 200 && isAuthenticated) {\n window.location.href = '/app';\n return;\n }\n\n // Fallback: delegate to parent if available\n if (onSuccess) {\n onSuccess(result);\n return;\n }\n\n if (loginContext?.onLogin) {\n loginContext.onLogin(result);\n return;\n }\n\n // If no parent handlers, log warning\n console.warn('OTPLoginForm: No onSuccess prop or LoginContext found. Authentication result not handled.');\n };\n\n // Render OTP login form\n return (\n <OTPForm\n onSuccess={handleSuccess}\n onBack={onBack}\n submitButtonText={submitButtonText}\n verifyButtonText={verifyButtonText}\n resendButtonText={resendButtonText}\n />\n );\n};\n\nexport default OTPLoginForm;\n","import { LoginRouter } from '../../auth';\nimport { useApiConfig } from '../utils/apiConfigHelper';\n\ninterface LoginPageProps {\n basePath?: string;\n}\n\nconst LoginPage: React.FC<LoginPageProps> = ({ basePath = '/app' }) => {\n // Get API configuration using the simplified hook\n const apiConfig = useApiConfig();\n\n return (\n <div className=\"page-container\"> \n <LoginRouter \n basePath={basePath}\n apiConfig={apiConfig}\n /> \n </div>\n );\n };\n \n export default LoginPage;\n \n ","/**\n * Dynamic Page Registry\n *\n * Creates a page type registry dynamically based on:\n * 1. Available @zango-core packages\n * 2. Requested page types from API routes\n * 3. Framework page availability\n */\n\nimport React from 'react';\nimport {\n getAvailablePageTypes,\n getFrameworkPageComponent,\n type FrameworkPageType,\n FRAMEWORK_PAGES\n} from './pagePackageMapping';\n\n// Import static pages (always available)\nimport CustomPageLoader from '../components/CustomPageLoader';\nimport NotFoundPage from '../pages/NotFoundPage';\nimport LoginPage from '../pages/LoginPage';\n\n// Registry interfaces (keeping same structure as original)\ninterface PageTypeConfig {\n component?: React.ComponentType<any> | React.LazyExoticComponent<React.ComponentType<any>> | null;\n includeBasePath?: boolean;\n standalone?: boolean;\n propsBuilder?: (params: any) => any;\n handler?: (params: any) => React.ReactElement;\n}\n\ninterface PageTypeRegistry {\n [key: string]: PageTypeConfig;\n}\n\n/**\n * Create dynamic page registry based on available packages and requested page types\n */\nexport const createDynamicPageRegistry = async (requestedPageTypes: string[] = []): Promise<PageTypeRegistry> => {\n\n // Simple: Get page types that exist in our config (assume packages are installed)\n const availablePageTypes = getAvailablePageTypes(requestedPageTypes);\n\n // Step 3: Build the base registry (static pages always available)\n const registry: PageTypeRegistry = {\n // Login page - always available (matches old PageTypeRegistry)\n login: {\n component: LoginPage,\n includeBasePath: true, // Login needs basePath for sub-routes\n standalone: true, // Render without layout (no sidebar/topbar)\n propsBuilder: ({ matchedRoutePath }: any) => ({ basePath: matchedRoutePath }),\n },\n\n // Custom pages - always available (matches old PageTypeRegistry)\n custom: {\n component: null,\n includeBasePath: false, // Explicitly disable basePath for custom pages\n handler: ({ customPages, customPagePath, location }: any) => {\n const CustomComponent = customPages[customPagePath];\n if (CustomComponent) {\n return React.createElement(CustomComponent);\n }\n // Fallback to CustomPageLoader with component name from route config\n return React.createElement(CustomPageLoader, { componentName: customPagePath });\n },\n },\n\n // 404 page - always available (matches old PageTypeRegistry)\n 404: {\n component: NotFoundPage,\n standalone: true,\n includeBasePath: false, // Explicitly disable basePath for 404\n propsBuilder: () => ({}),\n },\n\n // Default configuration for unknown page types (matches old PageTypeRegistry)\n default: {\n component: NotFoundPage,\n includeBasePath: false, // Explicitly disable for unknown types\n standalone: true,\n propsBuilder: ({ pageType }: any) => ({\n message: `Unknown page type: ${pageType}`,\n }),\n },\n };\n\n // Step 4: Add static framework pages that are available\n for (const pageType of availablePageTypes) {\n const Component = getFrameworkPageComponent(pageType as FrameworkPageType);\n\n if (Component) {\n registry[pageType] = {\n component: Component,\n includeBasePath: true,\n propsBuilder: ({ matchedRoutePath }: any) => ({ basePath: matchedRoutePath }),\n };\n\n } else {\n console.warn(`⚠️ Failed to get component for page type: ${pageType}`);\n }\n }\n\n // Step 5: Log summary\n const dynamicPageTypes = availablePageTypes.length;\n const staticPageTypes = 4; // login, custom, 404, default\n const totalPageTypes = dynamicPageTypes + staticPageTypes;\n\n // Step 6: Log any requested but unconfigured page types\n const unconfiguredPageTypes = requestedPageTypes.filter(pageType => !availablePageTypes.includes(pageType));\n if (unconfiguredPageTypes.length > 0) {\n console.warn(`⚠️ Unconfigured page types (not in PAGE_CONFIG): ${unconfiguredPageTypes.join(', ')}`);\n }\n\n return registry;\n};\n\n/**\n * Extract unique page types from route configuration\n */\nexport const extractPageTypesFromRoutes = (routes: Array<{ page_type: string }>): string[] => {\n const pageTypes = new Set<string>();\n\n routes.forEach(route => {\n if (route.page_type && route.page_type !== 'custom' && route.page_type !== 'login') {\n pageTypes.add(route.page_type);\n }\n });\n\n return Array.from(pageTypes);\n};\n\n/**\n * Create registry based on API route configuration\n */\nexport const createRegistryFromRoutes = async (routes: Array<{ page_type: string }>): Promise<PageTypeRegistry> => {\n const requestedPageTypes = extractPageTypesFromRoutes(routes);\n return createDynamicPageRegistry(requestedPageTypes);\n};\n\n/**\n * Validate that a registry has the required page type\n */\nexport const hasPageType = (registry: PageTypeRegistry, pageType: string): boolean => {\n return pageType in registry;\n};\n\n/**\n * Get registry statistics for debugging\n */\nexport const getRegistryStats = (registry: PageTypeRegistry): {\n totalPages: number;\n dynamicPages: number;\n staticPages: string[];\n availablePageTypes: string[];\n} => {\n const staticPageTypes = ['login', 'custom', '404', 'default'];\n const allPageTypes = Object.keys(registry);\n const dynamicPageTypes = allPageTypes.filter(type => !staticPageTypes.includes(type));\n\n return {\n totalPages: allPageTypes.length,\n dynamicPages: dynamicPageTypes.length,\n staticPages: staticPageTypes,\n availablePageTypes: allPageTypes,\n };\n};","import React, { createContext, useContext, useState, useEffect, ReactNode } from \"react\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { fetchAppInitData } from \"../../services/api\";\nimport { generateCSSVariables } from \"../utils/colorUtils\";\nimport { logoCache } from \"../utils/logoCache\";\nimport { createRegistryFromRoutes } from \"../routing/dynamicPageRegistry\";\nimport type { AppConfig, RouteConfig, MenuItemConfig, ThemeConfig, ApiConfig, AuthConfig, SessionSecurityConfig } from \"../../types\";\n\ninterface AppData {\n app_name?: string;\n is_user_anonymous?: boolean;\n routes?: RouteConfig[];\n menu?: MenuItemConfig[];\n profile_info?: Record<string, any>;\n app_logo?: string;\n metadata?: Record<string, any>;\n theme?: ThemeConfig;\n session_security?: SessionSecurityConfig;\n [key: string]: any;\n}\n\ninterface AppContextType {\n appData: AppData | null;\n loading: boolean;\n error: string | null;\n config: AppConfig;\n apiConfig: ApiConfig;\n menu: MenuItemConfig[];\n routes: RouteConfig[];\n profileInfo: Record<string, any>;\n appLogo: string;\n appName: string;\n metadata: Record<string, any>;\n theme: ThemeConfig;\n layoutConfig: Record<string, any>;\n topbarConfig: Record<string, any>;\n navbarConfig: Record<string, any>;\n customComponents: Record<string, any>;\n authConfig: AuthConfig;\n sessionSecurity: SessionSecurityConfig | null;\n // Dynamic page registry\n pageTypeRegistry: Record<string, any> | null;\n registryLoading: boolean;\n registryError: string | null;\n // Endpoint information for error messaging\n initializerEndpoint: string;\n}\n\ninterface AppProviderProps {\n children: ReactNode;\n config?: AppConfig;\n layoutConfig?: Record<string, any>;\n topbarConfig?: Record<string, any>;\n navbarConfig?: Record<string, any>;\n customComponents?: Record<string, any>;\n authConfig?: AuthConfig;\n}\n\nconst AppContext = createContext<AppContextType | undefined>(undefined);\n\n// Module-level fetch tracking to prevent duplicate concurrent requests\n// Always reset on module load to prevent stuck state after page navigation\nlet fetchInProgress = false;\n\n// Reset flag on page load/reload to prevent stuck loading state\nif (typeof window !== 'undefined') {\n fetchInProgress = false;\n}\n\nexport const useAppContext = (): AppContextType => {\n const context = useContext(AppContext);\n if (!context) {\n throw new Error(\"useAppContext must be used within AppProvider\");\n }\n return context;\n};\n\nexport const AppProvider: React.FC<AppProviderProps> = ({\n children,\n config = {} as AppConfig,\n layoutConfig = {},\n topbarConfig = {},\n navbarConfig = {},\n customComponents = {},\n authConfig = {}\n}) => {\n const navigate = useNavigate();\n const location = useLocation();\n const [appData, setAppData] = useState<AppData | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [cachedLogo, setCachedLogo] = useState<string | null>(null);\n\n\n // Dynamic page registry state\n const [pageTypeRegistry, setPageTypeRegistry] = useState<Record<string, any> | null>(null);\n const [registryLoading, setRegistryLoading] = useState<boolean>(false);\n const [registryError, setRegistryError] = useState<string | null>(null);\n\n // Get initializer endpoint for error messaging\n const getInitializerEndpoint = (): string => {\n // 1. Check global window variable (set by Django template)\n if (typeof window !== 'undefined' && (window as any).app_initializer_endpoint) {\n return (window as any).app_initializer_endpoint;\n }\n\n // 2. Check environment variable (for development)\n // if (import.meta.env.VITE_APP_INITIALIZER_ENDPOINT) {\n // return import.meta.env.VITE_APP_INITIALIZER_ENDPOINT;\n // }\n\n // 3. Default fallback\n return '/app/initializer';\n };\n\n // Use the passed config directly\n const appConfig = config;\n\n // Extract API config for easy access\n const apiConfig = appConfig.apiConfig || {};\n\n // Set default theme CSS variables immediately (minimal fallback)\n useEffect(() => {\n const defaultTheme = {\n colors: {\n primary: \"#5048ed\",\n secondary: \"#6d7280\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#f04438\",\n gray: \"#6d7280\",\n background: \"#f9fafb\",\n text: \"#252b37\",\n },\n };\n\n // Create initial style element with minimal default theme\n // This will be replaced when the API returns the actual theme\n const defaultStyleId = \"default-theme-variables\";\n let defaultStyle = document.getElementById(defaultStyleId);\n if (!defaultStyle) {\n defaultStyle = document.createElement(\"style\");\n defaultStyle.id = defaultStyleId;\n document.head.appendChild(defaultStyle);\n }\n defaultStyle.innerHTML = `:root { ${generateCSSVariables(defaultTheme)} }`;\n }, []);\n\n // Initialize cached logo immediately on mount\n useEffect(() => {\n const cached = logoCache.getCachedLogo();\n if (cached) {\n setCachedLogo(cached.base64Data || cached.url);\n }\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchAppData = async () => {\n const currentPath = window.location.pathname;\n const isLoginPage = currentPath.startsWith(\"/app/login\");\n\n\n // Prevent multiple simultaneous fetches\n if (fetchInProgress) {\n return;\n }\n\n fetchInProgress = true;\n\n try {\n const result = await fetchAppInitData();\n const data = result.success ? result.response : null;\n\n\n if (!result.success) {\n throw new Error(\n result.response?.message || \"Failed to fetch app data\",\n );\n }\n\n // Simply set the data - let the Router handle all redirects\n // Always set data, even if component unmounted (it's safe with React 18)\n setAppData(data);\n\n if (data?.theme) {\n // Update the default theme style element\n const defaultStyle = document.getElementById(\n \"default-theme-variables\",\n );\n if (defaultStyle) {\n defaultStyle.innerHTML = `:root { ${generateCSSVariables(data.theme)} }`;\n } else {\n // Fallback if default style element doesn't exist\n const style = document.createElement(\"style\");\n style.id = \"default-theme-variables\";\n style.innerHTML = `:root { ${generateCSSVariables(data.theme)} }`;\n document.head.appendChild(style);\n }\n // Cache logo in background if available\n if (data?.app_logo) {\n logoCache.updateInBackground(\n data.app_logo,\n data.app_name,\n (newCache: any) => {\n if (newCache.base64Data) {\n setCachedLogo(newCache.base64Data);\n }\n },\n );\n }\n }\n } catch (error: any) {\n console.error(\"❌ fetchAppInitData error:\", error);\n setError(error.message);\n } finally {\n // ALWAYS set loading to false when fetch completes, regardless of cancelled state\n // This is safe in React 18 and necessary to prevent stuck loading screen\n setLoading(false);\n fetchInProgress = false;\n }\n };\n\n fetchAppData();\n\n // Cleanup function - just mark as cancelled for logging purposes\n return () => {\n cancelled = true;\n };\n }, []); // Only fetch once when the app mounts\n\n // Handle redirects after data is loaded (separate from fetch to avoid loading state issues)\n useEffect(() => {\n // Only run redirects after loading is complete\n if (loading || !appData) {\n return;\n }\n\n const currentPath = location.pathname;\n const currentSearch = location.search;\n const isConfigPage = currentPath === \"/app/configuration-error\";\n const isLogoutPage = currentPath === \"/app/logout\";\n\n // Helper to clean URL by removing token and request_id params\n const cleanUrlParams = (search: string): string => {\n if (!search) return '';\n const params = new URLSearchParams(search);\n params.delete('token');\n params.delete('request_id');\n const cleaned = params.toString();\n return cleaned ? `?${cleaned}` : '';\n };\n\n // Clean token/request_id from URL if present (to prevent token auth workflow from triggering)\n const cleanedSearch = cleanUrlParams(currentSearch);\n if (cleanedSearch !== currentSearch && !isLogoutPage) {\n navigate(currentPath + cleanedSearch, { replace: true });\n return;\n }\n\n // Skip redirects for special pages\n if (isLogoutPage) {\n return;\n }\n\n const hasMenu = appData.menu && appData.menu.length > 0;\n const hasRoutes = appData.routes && appData.routes.length > 0;\n const userRole = appData.profile_info?.user_role;\n const isAnonymous = appData.is_user_anonymous;\n const isAuthenticated = !appData.is_user_anonymous;\n\n // Check if current path is valid (exists in routes)\n const isValidPath = hasRoutes && appData.routes!.some(route => {\n const routePath = route.path;\n \n // 1. Check exact match\n if (currentPath === routePath) {\n return true;\n }\n \n // 2. Check if it's a parameterized route (contains :)\n if (routePath?.includes(':')) {\n // Convert route pattern to regex (e.g., /app/submit/:uuid -> /app/submit/[^/]+)\n const pattern = routePath.replace(/:[^/]+/g, '[^/]+');\n const regex = new RegExp(`^${pattern}(/.*)?$`);\n if (regex.test(currentPath)) {\n return true;\n }\n }\n \n // 3. Check if current path starts with route path (for sub-routes)\n if (currentPath.startsWith(routePath + '/')) {\n return true;\n }\n \n return false;\n });\n\n\n // Helper to navigate with query params preserved, but clean token/request_id\n const navigateWithParams = (path: string) => {\n const cleanedSearch = cleanUrlParams(currentSearch);\n const fullPath = cleanedSearch ? `${path}${cleanedSearch}` : path;\n navigate(fullPath, { replace: true });\n };\n\n // Flow 1: Menu empty + Authenticated → /app/configuration-error\n if (isAuthenticated && !hasMenu && !isConfigPage) {\n navigateWithParams(\"/app/configuration-error\");\n return;\n }\n\n // Flow 2: Menu empty + Anonymous → /app/login\n // BUT skip redirect if already on login page or sub-routes (forgot-password, reset-password, etc.)\n const isLoginPage = currentPath === \"/app/login\" || currentPath.startsWith(\"/app/login/\");\n if (isAnonymous && !hasMenu && !isLoginPage) {\n // Save the current path as the 'next' parameter so user is redirected back after login\n const params = new URLSearchParams(currentSearch);\n\n // Only add 'next' parameter if not already on /app or /app/\n if (currentPath !== '/app' && currentPath !== '/app/') {\n params.set('next', currentPath + currentSearch);\n }\n\n const queryString = params.toString();\n navigate(`/app/login${queryString ? `?${queryString}` : ''}`, { replace: true });\n return;\n }\n\n // Flow 3 & 4: Menu exists → redirect to first menu item if on /app root or invalid path\n if (hasMenu && appData.menu) {\n // Check if SAML auth is in progress - if so, skip redirect to avoid double redirect\n const samlAuthInProgress = sessionStorage.getItem('saml_auth_in_progress');\n if (samlAuthInProgress) {\n // Clear the flag as we're past the SAML redirect phase\n sessionStorage.removeItem('saml_auth_in_progress');\n return;\n }\n\n const firstMenuPath = appData.menu[0]?.path || (appData.menu[0] as any)?.uri;\n\n // Redirect if: on /app root OR on invalid path\n const shouldRedirectToMenu =\n currentPath === '/app' ||\n currentPath === '/app/' ||\n (!isValidPath && !isConfigPage);\n\n if (firstMenuPath && shouldRedirectToMenu) {\n navigateWithParams(firstMenuPath);\n return;\n }\n }\n }, [loading, appData, location.pathname, location.search, navigate]);\n\n // Create dynamic page registry after app data (routes) is loaded\n useEffect(() => {\n let cancelled = false;\n\n const createRegistry = async () => {\n // Skip registry creation if still loading app data\n if (loading) {\n return;\n }\n\n // Skip if no app data yet\n if (!appData) {\n return;\n }\n\n // For login pages (anonymous users), create static registry from routes if available\n if (appData.is_user_anonymous) {\n const { default: staticRegistry } = await import('../routing/PageTypeRegistry');\n\n // If routes are available, create registry from them (for SAML callback pages)\n if (appData.routes && appData.routes.length > 0) {\n try {\n if (!cancelled) {\n setRegistryLoading(true);\n }\n const registry = await createRegistryFromRoutes(appData.routes);\n if (!cancelled) {\n setPageTypeRegistry(registry);\n setRegistryLoading(false);\n }\n return;\n } catch (error: any) {\n console.error('❌ Failed to create registry from routes for anonymous user:', error);\n // Fall through to minimal registry on error\n }\n }\n\n // Fallback to minimal registry if no routes or error occurred\n const minimalRegistry = {\n login: { component: null },\n custom: { component: null },\n 404: { component: null },\n default: { component: null },\n };\n if (!cancelled) {\n setPageTypeRegistry(staticRegistry);\n setRegistryLoading(false);\n }\n return;\n }\n\n // For authenticated users without routes, create fallback registry\n if (!appData.routes || appData.routes.length === 0) {\n if (!cancelled) {\n setPageTypeRegistry({\n login: { component: null },\n custom: { component: null },\n 404: { component: null },\n default: { component: null },\n });\n setRegistryLoading(false);\n }\n return;\n }\n\n // Create full registry from routes\n try {\n if (!cancelled) {\n setRegistryLoading(true);\n setRegistryError(null);\n }\n\n const registry = await createRegistryFromRoutes(appData.routes);\n\n if (!cancelled) {\n setPageTypeRegistry(registry);\n setRegistryLoading(false);\n }\n } catch (error: any) {\n console.error('❌ Failed to create dynamic page registry:', error);\n if (!cancelled) {\n setRegistryError(error.message || 'Failed to create page registry');\n // Set a basic fallback registry so the app can still function\n setPageTypeRegistry({\n login: { component: null },\n custom: { component: null },\n 404: { component: null },\n default: { component: null },\n });\n setRegistryLoading(false);\n }\n }\n };\n\n createRegistry();\n\n return () => {\n cancelled = true;\n };\n }, [appData, loading]); // Re-run when appData or loading changes\n\n const value: AppContextType = {\n appData,\n loading,\n error,\n config: appConfig,\n apiConfig,\n menu: appData?.menu || [],\n routes: appData?.routes || [],\n profileInfo: appData?.profile_info || {},\n appLogo: cachedLogo || appData?.app_logo || \"\",\n appName: appData?.app_name || \"Zango CRM\",\n metadata: appData?.metadata || {},\n theme: appData?.theme || {},\n // Layout configurations\n layoutConfig,\n topbarConfig,\n navbarConfig,\n customComponents,\n authConfig,\n sessionSecurity: appData?.session_security_config || null,\n // Dynamic page registry\n pageTypeRegistry,\n registryLoading,\n registryError,\n // Endpoint information\n initializerEndpoint: getInitializerEndpoint(),\n };\n\n return <AppContext.Provider value={value}>{children}</AppContext.Provider>;\n};","import { useNavigate } from 'react-router-dom';\nimport { useAppContext } from '../contexts/AppContext';\nimport { useCallback } from 'react';\nimport type { RouteConfig } from '../../types';\n\ninterface NavigationOptions {\n replace?: boolean;\n state?: any;\n newTab?: boolean;\n}\n\ninterface SmartNavigationReturn {\n navigateTo: (path: string, options?: NavigationOptions) => void;\n isInternalRoute: (path: string) => boolean;\n}\n\n/**\n * Custom hook for smart navigation that handles both React Router routes\n * and external navigation based on available routes from API\n */\nexport const useSmartNavigation = (): SmartNavigationReturn => {\n const navigate = useNavigate();\n const { routes } = useAppContext();\n \n /**\n * Check if a path is available in React Router routes\n */\n const isInternalRoute = useCallback((path: string): boolean => {\n if (!path) return false;\n \n // Normalize the path (remove trailing slash, ensure leading slash)\n const normalizedPath = path.endsWith('/') && path !== '/' \n ? path.slice(0, -1) \n : path;\n \n // Check if the path matches any of the routes from API\n return routes.some((route: RouteConfig) => {\n const routePath = route.path;\n \n // Normalize the route path too (remove trailing slash)\n const normalizedRoutePath = routePath.endsWith('/') && routePath !== '/' \n ? routePath.slice(0, -1) \n : routePath;\n \n // Exact match\n if (normalizedRoutePath === normalizedPath) return true;\n \n // Check if it's a parameterized route (contains :)\n if (normalizedRoutePath.includes(':')) {\n // Convert route pattern to regex\n const pattern = normalizedRoutePath\n .split('/')\n .map(segment => segment.startsWith(':') ? '[^/]+' : segment)\n .join('/');\n const regex = new RegExp(`^${pattern}(/.*)?$`);\n return regex.test(normalizedPath);\n }\n \n // Check if the route is marked as not exact (allows sub-routes)\n if (route.exact === false) {\n return normalizedPath.startsWith(normalizedRoutePath);\n }\n \n return false;\n });\n }, [routes]);\n \n /**\n * Navigate to a path, using React Router for internal routes\n * and window.location for external routes\n */\n const navigateTo = useCallback((path: string, options: NavigationOptions = {}): void => {\n if (!path) return;\n \n // Check if it's an absolute URL (external link)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n if (options.newTab) {\n window.open(path, '_blank');\n } else {\n window.location.href = path;\n }\n return;\n }\n \n // Check if the route is available in our React Router routes\n if (isInternalRoute(path)) {\n // Use React Router navigation for internal routes\n navigate(path, options);\n } else {\n // Use normal navigation for routes not in React Router\n // This handles server-side routes or static pages\n if (options.newTab) {\n window.open(path, '_blank');\n } else {\n window.location.href = path;\n }\n }\n }, [navigate, isInternalRoute]);\n \n return {\n navigateTo,\n isInternalRoute\n };\n};\n\nexport default useSmartNavigation;","import React, { MouseEvent, ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport useSmartNavigation from '../hooks/useSmartNavigation';\n\ninterface SmartLinkProps {\n to: string;\n children: ReactNode;\n className?: string;\n onClick?: (e: MouseEvent<HTMLElement>) => void;\n [key: string]: any;\n}\n\n/**\n * SmartLink component that automatically chooses between React Router Link\n * and regular anchor tag based on the route availability\n */\nconst SmartLink: React.FC<SmartLinkProps> = ({ to, children, className, onClick, ...props }) => {\n const { isInternalRoute } = useSmartNavigation();\n \n // Handle click for both Link and anchor\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n if (onClick) {\n onClick(e);\n }\n };\n \n // Check if it's an absolute URL\n const isAbsoluteUrl = to && (to.startsWith('http://') || to.startsWith('https://'));\n \n // Use React Router Link for internal routes\n if (!isAbsoluteUrl && isInternalRoute(to)) {\n return (\n <Link \n to={to} \n className={className}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Link>\n );\n }\n \n // Use regular anchor tag for external routes or server-side routes\n return (\n <a \n href={to} \n className={className}\n onClick={handleClick}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nexport default SmartLink;","/**\n * Utility function to update SVG colors intelligently\n * Handles SVGs with various fill/stroke configurations including currentColor\n */\nexport const updateSvgColors = (element: HTMLElement | null, color: string): void => {\n if (!element) return;\n\n const svgElements = element.querySelectorAll('svg');\n svgElements.forEach(svg => {\n // Process the SVG element itself\n if (svg.getAttribute('fill') && svg.getAttribute('fill') !== 'none') {\n svg.setAttribute('fill', color);\n }\n if (svg.getAttribute('stroke') && svg.getAttribute('stroke') !== 'none') {\n svg.setAttribute('stroke', color);\n }\n\n // Process all child elements\n const children = svg.querySelectorAll('*');\n children.forEach(child => {\n if (child.getAttribute('fill') && child.getAttribute('fill') !== 'none') {\n child.setAttribute('fill', color);\n }\n if (child.getAttribute('stroke') && child.getAttribute('stroke') !== 'none') {\n child.setAttribute('stroke', color);\n }\n });\n });\n};","import React, { useState, useEffect, useRef } from 'react';\nimport { Link, useLocation } from 'react-router-dom';\nimport CachedLogo from '../CachedLogo';\nimport { useAppContext } from '../../contexts/AppContext';\nimport SmartLink from '../SmartLink';\nimport { updateSvgColors } from '../../utils/svgUtils';\nimport type { MenuItemConfig } from '../../../types';\nimport './navbar.css';\n\ninterface NavbarLogoProps {\n appLogo?: string;\n appName?: string;\n linkTo?: string;\n collapsed?: boolean;\n}\n\n// Export individual components for flexible usage\nexport const NavbarLogo: React.FC<NavbarLogoProps> = ({ appLogo, appName, linkTo = \"/app\", collapsed = false }) => {\n if (collapsed) {\n // Show only app name initial when collapsed\n const initial = appName ? appName.charAt(0).toUpperCase() : 'A';\n return (\n <div className=\"navbar-logo-container frame-logo-container\" style={{ padding: '16px', justifyContent: 'center' }}>\n <SmartLink to={linkTo} style={{ textDecoration: 'none' }}>\n <div \n className=\"collapsed-logo-initial\"\n style={{\n width: '32px',\n height: '32px',\n backgroundColor: 'var(--color-brand-500, #5048ED)',\n color: 'white',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n fontWeight: 'bold'\n }}\n >\n {initial}\n </div>\n </SmartLink>\n </div>\n );\n }\n\n return (\n <div className=\"navbar-logo-container frame-logo-container\">\n <CachedLogo\n logoUrl={appLogo}\n appName={appName}\n height=\"28px\"\n linkTo={linkTo}\n />\n </div>\n );\n};\n\ninterface NavbarMenuProps {\n menuItems?: MenuItemConfig[];\n location: any;\n expandedItems: Record<string, boolean>;\n setExpandedItems: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\n renderIcon: (item: MenuItemConfig) => React.ReactNode;\n collapsed?: boolean;\n}\n\nexport const NavbarMenu: React.FC<NavbarMenuProps> = ({ menuItems = [], location, expandedItems, setExpandedItems, renderIcon, collapsed = false }) => {\n // Check if current path matches menu item or its children\n const isPathMatched = (item: MenuItemConfig, currentPath: string): boolean => {\n // Normalize paths for comparison\n const normalizedItemUrl = item.url || item.uri;\n const itemPath = normalizedItemUrl?.endsWith('/') ? normalizedItemUrl : `${normalizedItemUrl}/`;\n const comparePath = currentPath.endsWith('/') ? currentPath : `${currentPath}/`;\n \n // Check direct match\n if (itemPath === comparePath) return true;\n \n // Check children matches\n if (item.children?.length) {\n return item.children.some(child => {\n const childUrl = child.url || child.uri;\n const childPath = childUrl?.endsWith('/') ? childUrl : `${childUrl}/`;\n return childPath === comparePath;\n });\n }\n \n return false;\n };\n\n // Toggle submenu expansion\n const toggleExpanded = (itemName: string) => {\n setExpandedItems(prev => ({\n ...prev,\n [itemName]: !prev[itemName]\n }));\n };\n\n return (\n <ul className=\"navbar-menu wide-sidebar-menu\" id=\"wideSidebarMenu\">\n {menuItems.map((item) => {\n const itemUrl = item.url || item.uri;\n const isActive = isPathMatched(item, location.pathname);\n const isExpanded = expandedItems[item.name] || false;\n const hasChildren = item.children && item.children.length > 0;\n\n return (\n <React.Fragment key={item.name}>\n <li\n className={`menu-list-item ${\n hasChildren ? \"menu-list-item-with-sub-menu\" : \"\"\n } ${isActive ? \"active\" : \"\"}`}\n >\n {hasChildren ? (\n <div\n className=\"menu-item\"\n onClick={() => !collapsed && toggleExpanded(item.name)}\n style={{\n justifyContent: collapsed ? 'center' : 'flex-start',\n padding: collapsed ? '8px' : undefined\n }}\n title={collapsed ? item.name : undefined}\n >\n {renderIcon(item)}\n {!collapsed && (\n <>\n <span className={`menu-title ${isActive ? \"font-semibold\" : \"\"}`}>{item.name}</span>\n <div\n className={`flex justify-center items-center h-full transition-transform duration-300 ease-in-out ${\n isActive && isExpanded ? \"rotate-180\" : \"\"\n }`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M9.74976 3.99963C9.81538 3.99963 9.88053 4.01263 9.94116 4.03772C10.0018 4.06282 10.0569 4.09977 10.1033 4.14612C10.1496 4.19249 10.1865 4.24766 10.2117 4.30823C10.2368 4.36885 10.2497 4.43402 10.2498 4.49963C10.2498 4.56531 10.2368 4.63036 10.2117 4.69104C10.1865 4.75173 10.1497 4.8067 10.1033 4.85315L6.35327 8.60315C6.30685 8.64961 6.25184 8.68639 6.19116 8.71155C6.13048 8.73669 6.06544 8.75061 5.99976 8.75061C5.93412 8.75058 5.86899 8.73668 5.80835 8.71155C5.77819 8.69902 5.74944 8.6837 5.72241 8.66565L5.64624 8.60315L1.89624 4.85315C1.80256 4.75936 1.74976 4.6322 1.74976 4.49963C1.74981 4.36705 1.80248 4.23988 1.89624 4.14612C1.99 4.05236 2.11717 3.99969 2.24976 3.99963C2.38232 3.99963 2.50948 4.05244 2.60327 4.14612L5.99976 7.5426L9.39624 4.14612C9.44265 4.09971 9.49773 4.06286 9.55835 4.03772C9.61897 4.01261 9.68414 3.99966 9.74976 3.99963Z\"\n fill=\"#414651\"\n stroke=\"#414651\"\n strokeWidth=\"0.25\"\n />\n </svg>\n </div>\n </>\n )}\n </div>\n ) : (\n <SmartLink\n to={itemUrl}\n className=\"menu-item\"\n style={{\n justifyContent: collapsed ? 'center' : 'flex-start',\n padding: collapsed ? '8px' : undefined\n }}\n title={collapsed ? item.name : undefined}\n >\n {renderIcon(item)}\n {!collapsed && <span className={`menu-title ${isActive ? \"font-semibold\" : \"\"}`}>{item.name}</span>}\n </SmartLink>\n )}\n </li>\n\n {hasChildren && !collapsed && (\n <ul className={`submenu-list ${isExpanded ? \"active\" : \"\"}`}>\n {item.children.map((subItem) => {\n const subItemUrl = subItem.url || subItem.uri;\n const isSubActive =\n location.pathname === subItemUrl ||\n location.pathname === `${subItemUrl}/`;\n\n return (\n <li key={subItemUrl} className=\"submenu-list-item\">\n <SmartLink\n to={subItemUrl}\n className={`submenu-item d-flex ${\n isSubActive ? \"selected-each-wide-submenu\" : \"\"\n }`}\n >\n <span className=\"submenu-item-icon-container\">\n {isSubActive ? (\n <svg\n className=\"w-3.5 h-2.5 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"10\"\n viewBox=\"0 0 14 10\"\n fill=\"none\"\n >\n <path\n d=\"M13.3538 6.85375L10.3538 9.85375C10.2599 9.94757 10.1327 10.0003 10 10.0003C9.86732 10.0003 9.74007 9.94757 9.64625 9.85375C9.55243 9.75993 9.49972 9.63268 9.49972 9.5C9.49972 9.36732 9.55243 9.24007 9.64625 9.14625L11.7931 7H7C5.27665 6.99818 3.62441 6.31278 2.40582 5.09418C1.18722 3.87559 0.50182 2.22335 0.5 0.5C0.5 0.367392 0.552678 0.240215 0.646447 0.146447C0.740215 0.0526785 0.867392 0 1 0C1.13261 0 1.25979 0.0526785 1.35355 0.146447C1.44732 0.240215 1.5 0.367392 1.5 0.5C1.50165 1.95818 2.08165 3.35617 3.11274 4.38726C4.14383 5.41835 5.54182 5.99835 7 6H11.7931L9.64625 3.85375C9.55243 3.75993 9.49972 3.63268 9.49972 3.5C9.49972 3.36732 9.55243 3.24007 9.64625 3.14625C9.74007 3.05243 9.86732 2.99972 10 2.99972C10.1327 2.99972 10.2599 3.05243 10.3538 3.14625L13.3538 6.14625C13.4002 6.19269 13.4371 6.24783 13.4623 6.30853C13.4874 6.36923 13.5004 6.43429 13.5004 6.5C13.5004 6.56571 13.4874 6.63077 13.4623 6.69147C13.4371 6.75217 13.4002 6.80731 13.3538 6.85375Z\"\n fill=\"var(--color-brand-500, #5048ED)\"\n />\n </svg>\n ) : (\n <span className=\"hidden\"></span>\n )}\n </span>\n <span\n className={`text-xs ${\n isSubActive\n ? \"text-[var(--color-brand-500,#5048ED)]\"\n : \"text-[var(--color-gray-700,#414651)]\"\n }`}\n >\n {subItem.name}\n </span>\n </SmartLink>\n </li>\n );\n })}\n </ul>\n )}\n </React.Fragment>\n );\n })}\n </ul>\n );\n};\n\ninterface NavbarProps {\n menuItems?: MenuItemConfig[];\n appLogo?: string;\n theme?: Record<string, any>;\n config?: Record<string, any>;\n}\n\nconst Navbar: React.FC<NavbarProps> = ({ menuItems = [], appLogo, theme = {}, config = {} }) => {\n const location = useLocation();\n const [expandedItems, setExpandedItems] = useState<Record<string, boolean>>({});\n const { appName } = useAppContext();\n const navRef = useRef<HTMLElement | null>(null);\n\n\n // Apply colors based on state\n useEffect(() => {\n if (!navRef.current) return;\n \n const menuElement = navRef.current.querySelector('#wideSidebarMenu');\n if (!menuElement) return;\n \n const listItems = menuElement.querySelectorAll('li');\n \n listItems.forEach(li => {\n const isActive = li.classList.contains('active');\n const defaultColor = 'var(--color-gray-700, #414651)';\n const activeColor = 'var(--color-brand-500, #5048ED)';\n \n // Set initial color\n updateSvgColors(li, isActive ? activeColor : defaultColor);\n \n // Add hover listeners\n const handleMouseEnter = () => {\n if (!li.classList.contains('active')) {\n updateSvgColors(li, activeColor);\n }\n };\n \n const handleMouseLeave = () => {\n if (!li.classList.contains('active')) {\n updateSvgColors(li, defaultColor);\n }\n };\n \n li.addEventListener('mouseenter', handleMouseEnter);\n li.addEventListener('mouseleave', handleMouseLeave);\n \n // Cleanup\n return () => {\n li.removeEventListener('mouseenter', handleMouseEnter);\n li.removeEventListener('mouseleave', handleMouseLeave);\n };\n });\n }, [location.pathname, menuItems]);\n\n // Check if current path matches menu item or its children\n const isPathMatched = (item: MenuItemConfig, currentPath: string): boolean => {\n // Normalize paths for comparison\n const normalizedItemUrl = item.url || item.uri;\n const itemPath = normalizedItemUrl?.endsWith('/') ? normalizedItemUrl : `${normalizedItemUrl}/`;\n const comparePath = currentPath.endsWith('/') ? currentPath : `${currentPath}/`;\n \n // Check direct match\n if (itemPath === comparePath) return true;\n \n // Check children matches\n if (item.children?.length) {\n return item.children.some(child => {\n const childUrl = child.url || child.uri;\n const childPath = childUrl?.endsWith('/') ? childUrl : `${childUrl}/`;\n return childPath === comparePath;\n });\n }\n \n return false;\n };\n\n // Toggle submenu expansion\n const toggleExpanded = (itemName: string) => {\n setExpandedItems(prev => ({\n ...prev,\n [itemName]: !prev[itemName]\n }));\n };\n\n // Initialize expanded state for active items\n React.useEffect(() => {\n const newExpandedItems = {};\n menuItems.forEach(item => {\n if (item.children?.length && isPathMatched(item, location.pathname)) {\n newExpandedItems[item.name] = true;\n }\n });\n setExpandedItems(newExpandedItems);\n }, [location.pathname, menuItems]);\n\n // Render menu icon\n const renderIcon = (item) => {\n if (!item.icon) {\n return (\n <span className=\"navbar-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M1.66675 8.00002C1.66675 5.1802 1.66675 3.77029 2.46539 2.83519C2.5788 2.70241 2.70247 2.57874 2.83525 2.46533C3.77035 1.66669 5.18026 1.66669 8.00008 1.66669C10.8199 1.66669 12.2298 1.66669 13.1649 2.46533C13.2977 2.57874 13.4213 2.70241 13.5347 2.83519C14.3334 3.77029 14.3334 5.1802 14.3334 8.00002C14.3334 10.8198 14.3334 12.2298 13.5347 13.1648C13.4213 13.2976 13.2977 13.4213 13.1649 13.5347C12.2298 14.3334 10.8199 14.3334 8.00008 14.3334C5.18026 14.3334 3.77035 14.3334 2.83525 13.5347C2.70247 13.4213 2.5788 13.2976 2.46539 13.1648C1.66675 12.2298 1.66675 10.8198 1.66675 8.00002Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.69235 4.83562C7.83568 4.61038 8.16448 4.61038 8.30782 4.83562L8.72255 5.48724C9.18115 6.20782 9.79228 6.81896 10.5129 7.27756L11.1645 7.69229C11.3897 7.83562 11.3897 8.16442 11.1645 8.30776L10.5129 8.72249C9.79228 9.18109 9.18115 9.79222 8.72255 10.5128L8.30782 11.1644C8.16448 11.3897 7.83568 11.3897 7.69235 11.1644L7.27762 10.5128C6.81902 9.79222 6.20788 9.18109 5.4873 8.72249L4.83568 8.30776C4.61044 8.16442 4.61044 7.83562 4.83568 7.69229L5.4873 7.27756C6.20788 6.81896 6.81902 6.20782 7.27762 5.48724L7.69235 4.83562Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n );\n }\n\n // Check if icon is SVG string\n const isIconSvg = item.icon.includes('<svg');\n \n if (isIconSvg) {\n return (\n <span\n className=\"navbar-icon\"\n dangerouslySetInnerHTML={{ __html: item.icon }}\n />\n );\n }\n \n // Check if icon is emoji (single character or emoji sequence)\n const isEmoji = /^[\\u{1F300}-\\u{1F9FF}\\u{1F600}-\\u{1F64F}\\u{1F680}-\\u{1F6FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F900}-\\u{1F9FF}\\u{1F1E0}-\\u{1F1FF}]|[\\u{1F300}-\\u{1F5FF}\\u{1F600}-\\u{1F64F}\\u{1F680}-\\u{1F6FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}]/u.test(item.icon);\n \n if (isEmoji || item.icon.length <= 4) {\n // Render emoji directly\n return <span className=\"navbar-icon navbar-icon-emoji\">{item.icon}</span>;\n }\n \n // Icon is an image URL\n return (\n <span className=\"navbar-icon\">\n <img src={item.icon} alt={item.name} width=\"16\" height=\"16\" />\n </span>\n );\n };\n\n // Get configuration settings\n const {\n showLogo = true,\n showMenu = true,\n isCollapsed = false,\n collapsible = false,\n customLogo = null,\n customMenuContent = null,\n customBottomContent = null,\n customNavbar = null,\n customMenu = null,\n menuConfig = {},\n className = '',\n style = {}\n } = config;\n\n // State for collapsible functionality\n const [collapsed, setCollapsed] = React.useState(isCollapsed);\n\n // Determine width based on collapsed state\n const navbarWidth = collapsed ? '80px' : '244px';\n\n return (\n <nav \n ref={navRef} \n className={`navbar ${collapsed ? 'collapsed-sidebar' : 'wide-sidebar'} ${className}`} \n style={{ \n width: navbarWidth, \n ...style, \n display: 'flex', \n flexDirection: 'column',\n transition: 'width 0.3s ease'\n }}\n >\n {showLogo && (\n customLogo ? (\n <div className=\"navbar-logo-container frame-logo-container\">\n {customLogo}\n </div>\n ) : (\n <NavbarLogo appLogo={appLogo} appName={appName} collapsed={collapsed} />\n )\n )}\n\n {/* Toggle button for collapsible navbar */}\n {collapsible && (\n <div className=\"navbar-toggle-container\" style={{ padding: '8px 16px', borderBottom: '1px solid var(--color-gray-200, #e5e7eb)' }}>\n <button\n onClick={() => setCollapsed(!collapsed)}\n className=\"navbar-toggle-btn\"\n style={{\n width: '100%',\n padding: '8px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '4px',\n transition: 'background-color 0.2s ease'\n }}\n onMouseEnter={(e) => e.target.style.backgroundColor = 'var(--color-gray-100, #f3f4f6)'}\n onMouseLeave={(e) => e.target.style.backgroundColor = 'transparent'}\n title={collapsed ? 'Expand navbar' : 'Collapse navbar'}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{\n transform: collapsed ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.3s ease'\n }}\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"var(--color-gray-600, #4b5563)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n )}\n\n <div className=\"navbar-menu-container frame-menu-container complete-hidden-scroll-style\" style={{ flex: 1, overflow: 'auto' }}>\n {showMenu && (\n customMenu ? (\n customMenu\n ) : (\n <>\n <ul\n className=\"navbar-menu wide-sidebar-menu\"\n id=\"wideSidebarMenu\"\n >\n {menuItems.map((item) => {\n const itemUrl = item.url || item.uri;\n const isActive = isPathMatched(item, location.pathname);\n const isExpanded = expandedItems[item.name] || false;\n const hasChildren = item.children && item.children.length > 0;\n\n return (\n <React.Fragment key={item.name}>\n <li\n className={`menu-list-item ${\n hasChildren ? \"menu-list-item-with-sub-menu\" : \"\"\n } ${isActive ? \"active\" : \"\"}`}\n >\n {hasChildren ? (\n <div\n className=\"menu-item\"\n onClick={() => !collapsed && toggleExpanded(item.name)}\n style={{\n justifyContent: collapsed ? 'center' : 'flex-start',\n padding: collapsed ? '8px' : undefined\n }}\n title={collapsed ? item.name : undefined}\n >\n {renderIcon(item)}\n {!collapsed && (\n <>\n <span className={`menu-title ${isActive ? \"font-semibold\" : \"\"}`}>{item.name}</span>\n <div\n className={`flex justify-center items-center h-full transition-transform duration-300 ease-in-out ${\n isActive && isExpanded ? \"rotate-180\" : \"\"\n }`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M9.74976 3.99963C9.81538 3.99963 9.88053 4.01263 9.94116 4.03772C10.0018 4.06282 10.0569 4.09977 10.1033 4.14612C10.1496 4.19249 10.1865 4.24766 10.2117 4.30823C10.2368 4.36885 10.2497 4.43402 10.2498 4.49963C10.2498 4.56531 10.2368 4.63036 10.2117 4.69104C10.1865 4.75173 10.1497 4.8067 10.1033 4.85315L6.35327 8.60315C6.30685 8.64961 6.25184 8.68639 6.19116 8.71155C6.13048 8.73669 6.06544 8.75061 5.99976 8.75061C5.93412 8.75058 5.86899 8.73668 5.80835 8.71155C5.77819 8.69902 5.74944 8.6837 5.72241 8.66565L5.64624 8.60315L1.89624 4.85315C1.80256 4.75936 1.74976 4.6322 1.74976 4.49963C1.74981 4.36705 1.80248 4.23988 1.89624 4.14612C1.99 4.05236 2.11717 3.99969 2.24976 3.99963C2.38232 3.99963 2.50948 4.05244 2.60327 4.14612L5.99976 7.5426L9.39624 4.14612C9.44265 4.09971 9.49773 4.06286 9.55835 4.03772C9.61897 4.01261 9.68414 3.99966 9.74976 3.99963Z\"\n fill=\"#414651\"\n stroke=\"#414651\"\n strokeWidth=\"0.25\"\n />\n </svg>\n </div>\n </>\n )}\n </div>\n ) : (\n <SmartLink\n to={itemUrl}\n className=\"menu-item\"\n style={{\n justifyContent: collapsed ? 'center' : 'flex-start',\n padding: collapsed ? '8px' : undefined\n }}\n title={collapsed ? item.name : undefined}\n >\n {renderIcon(item)}\n {!collapsed && <span className={`menu-title ${isActive ? \"font-semibold\" : \"\"}`}>{item.name}</span>}\n </SmartLink>\n )}\n </li>\n\n {hasChildren && !collapsed && (\n <ul className={`submenu-list ${isExpanded ? \"active\" : \"\"}`}>\n {item.children.map((subItem) => {\n const subItemUrl = subItem.url || subItem.uri;\n const isSubActive =\n location.pathname === subItemUrl ||\n location.pathname === `${subItemUrl}/`;\n\n return (\n <li key={subItemUrl} className=\"submenu-list-item\">\n <SmartLink\n to={subItemUrl}\n className={`submenu-item d-flex ${\n isSubActive ? \"selected-each-wide-submenu\" : \"\"\n }`}\n >\n <span className=\"submenu-item-icon-container\">\n {isSubActive ? (\n <svg\n className=\"w-3.5 h-2.5 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"10\"\n viewBox=\"0 0 14 10\"\n fill=\"none\"\n >\n <path\n d=\"M13.3538 6.85375L10.3538 9.85375C10.2599 9.94757 10.1327 10.0003 10 10.0003C9.86732 10.0003 9.74007 9.94757 9.64625 9.85375C9.55243 9.75993 9.49972 9.63268 9.49972 9.5C9.49972 9.36732 9.55243 9.24007 9.64625 9.14625L11.7931 7H7C5.27665 6.99818 3.62441 6.31278 2.40582 5.09418C1.18722 3.87559 0.50182 2.22335 0.5 0.5C0.5 0.367392 0.552678 0.240215 0.646447 0.146447C0.740215 0.0526785 0.867392 0 1 0C1.13261 0 1.25979 0.0526785 1.35355 0.146447C1.44732 0.240215 1.5 0.367392 1.5 0.5C1.50165 1.95818 2.08165 3.35617 3.11274 4.38726C4.14383 5.41835 5.54182 5.99835 7 6H11.7931L9.64625 3.85375C9.55243 3.75993 9.49972 3.63268 9.49972 3.5C9.49972 3.36732 9.55243 3.24007 9.64625 3.14625C9.74007 3.05243 9.86732 2.99972 10 2.99972C10.1327 2.99972 10.2599 3.05243 10.3538 3.14625L13.3538 6.14625C13.4002 6.19269 13.4371 6.24783 13.4623 6.30853C13.4874 6.36923 13.5004 6.43429 13.5004 6.5C13.5004 6.56571 13.4874 6.63077 13.4623 6.69147C13.4371 6.75217 13.4002 6.80731 13.3538 6.85375Z\"\n fill=\"var(--color-brand-500, #5048ED)\"\n />\n </svg>\n ) : (\n <span className=\"hidden\"></span>\n )}\n </span>\n <span\n className={`text-xs ${\n isSubActive\n ? \"text-[var(--color-brand-500,#5048ED)]\"\n : \"text-[var(--color-gray-700,#414651)]\"\n }`}\n >\n {subItem.name}\n </span>\n </SmartLink>\n </li>\n );\n })}\n </ul>\n )}\n </React.Fragment>\n );\n })}\n </ul>\n \n {/* Custom menu content appended directly below menu items */}\n {customMenuContent && !collapsed && (\n <div className=\"custom-menu-content\" style={{ paddingTop: '8px' }}>\n {customMenuContent}\n </div>\n )}\n </>\n )\n )}\n </div>\n \n {/* Sticky bottom content - stays at the bottom of navbar */}\n {customBottomContent && (\n <div className=\"navbar-bottom-content\" style={{ marginTop: 'auto', flexShrink: 0 }}>\n {customBottomContent}\n </div>\n )}\n </nav>\n );\n};\n\nexport default Navbar;","import { useState, useEffect } from 'react';\nimport { fetchUserProfile } from '../../services/api';\n\ninterface ProfileData {\n name: string;\n email: string;\n mobile: string;\n profile_pic: string | null;\n last_password_changed?: string;\n roles: Array<{\n id: number;\n name: string;\n is_active: boolean;\n is_default: boolean;\n auth_config: {\n redirect_url: string;\n };\n policies: number[];\n policy_groups: number[];\n }>;\n auth_config: {\n login_methods: Record<string, any>;\n password_policy: {\n reset: {\n method: string[];\n enabled: boolean;\n expiry_hours: number;\n };\n min_length: number;\n allow_change: boolean;\n require_numbers: boolean;\n require_lowercase: boolean;\n require_uppercase: boolean;\n password_expiry_days: number;\n require_special_chars: boolean;\n password_history_count: number;\n };\n two_factor_auth: {\n required: boolean;\n can_enable: boolean;\n can_disable?: boolean;\n issue?: string;\n };\n redirect_url: string;\n };\n password_policy: {\n reset: {\n method: string[];\n enabled: boolean;\n expiry_hours: number;\n };\n min_length: number;\n allow_change: boolean;\n require_numbers: boolean;\n require_lowercase: boolean;\n require_uppercase: boolean;\n password_expiry_days: number;\n require_special_chars: boolean;\n password_history_count: number;\n };\n tokens: any[];\n}\n\ninterface UseProfileDataReturn {\n profileData: ProfileData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n shouldSetPassword: boolean;\n}\n\n/**\n * Custom hook for fetching user profile data from the API\n * @param shouldFetch - Whether to automatically fetch data on mount\n * @returns Profile data, loading state, error state, and refetch function\n */\nexport const useProfileData = (shouldFetch: boolean = true): UseProfileDataReturn => {\n const [profileData, setProfileData] = useState<ProfileData | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [hasAttemptedFetch, setHasAttemptedFetch] = useState<boolean>(false);\n const [shouldSetPassword, setShouldSetPassword] = useState<boolean>(false);\n\n const fetchData = async () => {\n if (!shouldFetch || (profileData && !hasAttemptedFetch)) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await fetchUserProfile();\n\n if (result.success && result.response) {\n // Extract profile_data from the nested response structure\n const profileInfo = result.response.profile_data || result.response;\n\n // Also include password_policy from root level if it exists\n if (result.response.password_policy && !profileInfo.password_policy) {\n profileInfo.password_policy = result.response.password_policy;\n }\n\n // Extract should_set_password flag\n setShouldSetPassword(result.response.should_set_password || false);\n\n setProfileData(profileInfo);\n setError(null);\n } else {\n const errorMessage = result.response?.message || 'Failed to fetch profile data';\n setError(errorMessage);\n console.error('Profile API Error:', result);\n }\n } catch (err: any) {\n const errorMessage = err.message || 'Network error while fetching profile';\n setError(errorMessage);\n console.error('Profile fetch error:', err);\n } finally {\n setLoading(false);\n setHasAttemptedFetch(true);\n }\n };\n\n const refetch = () => {\n setHasAttemptedFetch(false);\n fetchData();\n };\n\n useEffect(() => {\n if (shouldFetch && !hasAttemptedFetch) {\n fetchData();\n }\n }, [shouldFetch]);\n\n return {\n profileData,\n loading,\n error,\n refetch,\n shouldSetPassword,\n };\n};\n\nexport default useProfileData;","/**\n * Cookie utility functions for managing browser cookies\n */\n\n/**\n * Delete a cookie by name\n */\nexport const deleteCookie = (name: string, path = '/', domain: string | null = null): void => {\n let cookieString = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path};`;\n\n if (domain) {\n cookieString += ` domain=${domain};`;\n }\n\n document.cookie = cookieString;\n\n // Also try to delete with current domain\n if (!domain) {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}; domain=${window.location.hostname};`;\n // Try without domain as well\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path};`;\n }\n};\n\n/**\n * Get a cookie value by name\n */\nexport const getCookie = (name: string): string | null => {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n\n return null;\n};\n\n/**\n * Set a cookie\n */\nexport const setCookie = (\n name: string,\n value: string,\n days: number | null = null,\n path = '/',\n domain: string | null = null\n): void => {\n let expires = \"\";\n\n if (days) {\n const date = new Date();\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n expires = \"; expires=\" + date.toUTCString();\n }\n\n let cookieString = `${name}=${value}${expires}; path=${path}`;\n\n if (domain) {\n cookieString += `; domain=${domain}`;\n }\n\n document.cookie = cookieString;\n};\n\n/**\n * Check if user is authenticated by verifying the presence of zangocookie\n * This is a fast, client-side check that doesn't require API calls\n */\nexport const isAuthenticatedViaCookie = (): boolean => {\n const zangoCookie = getCookie('zangocookie');\n return zangoCookie !== null && zangoCookie !== '';\n};","import { toast } from \"@zango-core/components\";\nimport { performAppLogout } from \"../../services/api\";\nimport { deleteCookie } from \"./cookieUtils\";\n\ninterface LogoutOptions {\n theme?: { login_url?: string };\n redirectUrl?: string;\n preserveCurrentPath?: boolean; // If true, add next param to redirect back after login\n}\n\nexport const performLogout = async (options: LogoutOptions = {}) => {\n try {\n // Make GET request to logout endpoint\n const response = await performAppLogout();\n\n if (response.success || response.responseStatus === 401) {\n // Delete the zangocookie with various configurations to ensure it's removed\n deleteCookie(\"zangocookie\", \"/\");\n deleteCookie(\"zangocookie\", \"/app\");\n deleteCookie(\"zangocookie\", \"/app/\");\n deleteCookie(\"zangocookie\");\n\n // Try deleting with domain variations\n const hostname = window.location.hostname;\n deleteCookie(\"zangocookie\", \"/\", hostname);\n deleteCookie(\"zangocookie\", \"/app\", hostname);\n\n // If hostname includes subdomain, try parent domain too\n if (hostname.includes(\".\")) {\n const parentDomain = \".\" + hostname.split(\".\").slice(-2).join(\".\");\n deleteCookie(\"zangocookie\", \"/\", parentDomain);\n deleteCookie(\"zangocookie\", \"/app\", parentDomain);\n }\n\n // Clear localStorage and sessionStorage\n localStorage.removeItem(\"authToken\");\n localStorage.clear();\n sessionStorage.clear();\n\n // Determine redirect URL\n const redirectUrl =\n options.redirectUrl || options.theme?.login_url || \"/app/login\";\n\n // Build final redirect URL\n let finalRedirectUrl = redirectUrl;\n\n // Only add next param if preserveCurrentPath is true (e.g., session timeout)\n if (options.preserveCurrentPath) {\n const currentPath = window.location.pathname + window.location.search;\n const separator = redirectUrl.includes(\"?\") ? \"&\" : \"?\";\n finalRedirectUrl = `${redirectUrl}${separator}next=${encodeURIComponent(\n currentPath\n )}`;\n }\n\n // Small delay to ensure cookies are deleted before redirect\n setTimeout(() => {\n window.location.href = finalRedirectUrl;\n }, 100);\n } else {\n // Show error toast notification\n toast.error({\n title: \"Logout Failed\",\n description:\n response.response?.message || \"Unable to logout. Please try again.\",\n duration: 5000,\n });\n }\n } catch (error) {\n console.error(\"Logout error:\", error);\n\n // Show error toast notification\n toast.error({\n title: \"Logout Error\",\n description: \"An error occurred while logging out. Please try again.\",\n duration: 5000,\n });\n\n // Redirect to login page even on error\n const redirectUrl =\n options.redirectUrl || options.theme?.login_url || \"/app/login\";\n\n // Build final redirect URL\n let finalRedirectUrl = redirectUrl;\n\n // Only add next param if preserveCurrentPath is true (e.g., session timeout)\n if (options.preserveCurrentPath) {\n const currentPath = window.location.pathname + window.location.search;\n const separator = redirectUrl.includes(\"?\") ? \"&\" : \"?\";\n finalRedirectUrl = `${redirectUrl}${separator}next=${encodeURIComponent(\n currentPath\n )}`;\n }\n\n setTimeout(() => {\n window.location.href = finalRedirectUrl;\n }, 100);\n }\n};\n\nexport const showLogoutConfirmation = (onConfirm: () => void): void => {\n // Create modal overlay\n const overlay = document.createElement(\"div\");\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n `;\n\n // Create modal content\n const modal = document.createElement(\"div\");\n modal.style.cssText = `\n background: white;\n border-radius: 8px;\n padding: 24px;\n max-width: 400px;\n width: 90%;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n `;\n\n modal.innerHTML = `\n <div style=\"margin-bottom: 16px;\">\n <h3 style=\"margin: 0 0 8px 0; font-size: 18px; font-weight: 600; color: #111827;\">Confirm Logout</h3>\n <p style=\"margin: 0; color: #6b7280; font-size: 14px;\">Are you sure you want to log out? You will need to sign in again to access your account.</p>\n </div>\n <div style=\"display: flex; gap: 12px; justify-content: flex-end;\">\n <button id=\"cancel-logout\" style=\"\n padding: 8px 16px;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n \">Cancel</button>\n <button id=\"confirm-logout\" style=\"\n padding: 8px 16px;\n border: none;\n background: #dc2626;\n color: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n \">Log Out</button>\n </div>\n `;\n\n // Add hover effects\n const cancelBtn = modal.querySelector(\"#cancel-logout\") as HTMLButtonElement;\n const confirmBtn = modal.querySelector(\n \"#confirm-logout\"\n ) as HTMLButtonElement;\n\n cancelBtn.addEventListener(\"mouseenter\", () => {\n cancelBtn.style.backgroundColor = \"#f9fafb\";\n cancelBtn.style.borderColor = \"#9ca3af\";\n });\n\n cancelBtn.addEventListener(\"mouseleave\", () => {\n cancelBtn.style.backgroundColor = \"white\";\n cancelBtn.style.borderColor = \"#d1d5db\";\n });\n\n confirmBtn.addEventListener(\"mouseenter\", () => {\n confirmBtn.style.backgroundColor = \"#b91c1c\";\n });\n\n confirmBtn.addEventListener(\"mouseleave\", () => {\n confirmBtn.style.backgroundColor = \"#dc2626\";\n });\n\n // Add event listeners\n cancelBtn.addEventListener(\"click\", () => {\n document.body.removeChild(overlay);\n });\n\n confirmBtn.addEventListener(\"click\", () => {\n document.body.removeChild(overlay);\n onConfirm();\n });\n\n // Close on overlay click\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) {\n document.body.removeChild(overlay);\n }\n });\n\n // Close on escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n document.removeEventListener(\"keydown\", handleEscape);\n if (document.body.contains(overlay)) {\n document.body.removeChild(overlay);\n }\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n\n // Add to DOM\n overlay.appendChild(modal);\n document.body.appendChild(overlay);\n\n // Focus the cancel button for accessibility\n setTimeout(() => cancelBtn.focus(), 100);\n};\n","import React, { useState, useEffect } from 'react';\nimport { Spin } from '@zango-core/components';\nimport { toast } from '@zango-core/components';\nimport { useAppContext } from '../../contexts/AppContext';\nimport { useProfileData } from '../../hooks/useProfileData';\nimport { performLogout, showLogoutConfirmation } from '../../utils/logoutUtils';\nimport {\n uploadPhoto,\n removeSession,\n removeAllSessions,\n saveUserProfile,\n updatePassword,\n changeRole,\n fetchUserSessions\n} from '../../../services/api';\nimport './UserProfileDrawer.css';\n\ninterface UserProfileDrawerProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst UserProfileDrawer: React.FC<UserProfileDrawerProps> = ({ isOpen, onClose }) => {\n const [activeTab, setActiveTab] = useState('account');\n const [isEditingName, setIsEditingName] = useState(false);\n const [isEditingPassword, setIsEditingPassword] = useState(false);\n const [profilePhoto, setProfilePhoto] = useState<string | null>(null);\n const [twoFactorEnabled, setTwoFactorEnabled] = useState(false);\n const [canSetPassword, setCanSetPassword] = useState(true); // Default to true for backward compatibility\n const [activeSessions, setActiveSessions] = useState<any[]>([]);\n const [sessionsLoading, setSessionsLoading] = useState<boolean>(false);\n const [sessionsError, setSessionsError] = useState<string | null>(null);\n const [tokens, setTokens] = useState<any[]>([]);\n const [passwordPolicy, setPasswordPolicy] = useState<any>(null);\n const { appData } = useAppContext();\n\n // Fetch profile data from API\n const { profileData, loading: profileLoading, error: profileError, refetch: refetchProfile, shouldSetPassword } = useProfileData(isOpen);\n const [formData, setFormData] = useState({\n name: '',\n email: '',\n mobile: '',\n roles: [] as Array<{\n id: number;\n name: string;\n is_active: boolean;\n is_default: boolean;\n auth_config: {\n redirect_url: string;\n };\n policies: number[];\n policy_groups: number[];\n }>,\n currentRole: '',\n lastPasswordChange: 'Never' as string,\n nextPasswordDue: null as string | null\n });\n const [passwordData, setPasswordData] = useState({\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [passwordErrors, setPasswordErrors] = useState<Record<string, string>>({});\n const [serverMessage, setServerMessage] = useState('');\n const [loading, setLoading] = useState(false);\n const [roleSwitchLoading, setRoleSwitchLoading] = useState<number | null>(null);\n const [passwordValidation, setPasswordValidation] = useState({\n minLength: false,\n hasUpperCase: false,\n hasLowerCase: false,\n hasNumber: false,\n hasSpecialChar: false\n });\n\n\n\n // Fetch sessions data from dedicated API\n const fetchSessions = async () => {\n setSessionsLoading(true);\n setSessionsError(null);\n\n try {\n const result = await fetchUserSessions();\n\n if (result.success && result.response) {\n // Extract sessions from response.data array\n const sessionsData = result.response.data || result.response;\n setActiveSessions(sessionsData);\n setSessionsError(null);\n } else {\n const errorMessage = result.response?.message || 'Failed to fetch sessions';\n setSessionsError(errorMessage);\n console.error('Sessions API Error:', result);\n }\n } catch (err: any) {\n const errorMessage = err.message || 'Network error while fetching sessions';\n setSessionsError(errorMessage);\n console.error('Sessions fetch error:', err);\n } finally {\n setSessionsLoading(false);\n }\n };\n\n useEffect(() => {\n if (profileData) {\n // Use last_password_changed from API response\n let lastPasswordChange = profileData.last_password_changed || 'Never';\n let nextPasswordDue = null;\n\n // Calculate next password due date if policy has expiry and last password change exists\n if (profileData.last_password_changed && profileData?.password_policy?.password_expiry_days) {\n // Parse the date string (e.g., \"30 September 2025 12:26 PM\")\n const lastChangedDate = new Date(profileData.last_password_changed);\n const expiryDate = new Date(lastChangedDate);\n expiryDate.setDate(expiryDate.getDate() + profileData.password_policy.password_expiry_days);\n\n const now = new Date();\n if (expiryDate > now) {\n nextPasswordDue = expiryDate.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n } else {\n nextPasswordDue = 'Expired';\n }\n }\n\n setFormData({\n name: profileData.name || '',\n email: profileData.email || '',\n mobile: profileData.mobile || '',\n roles: profileData.roles || [],\n currentRole: appData?.profile_info?.user_role || profileData.roles?.[0]?.name || 'Admin',\n lastPasswordChange: lastPasswordChange,\n nextPasswordDue: nextPasswordDue\n });\n setTwoFactorEnabled(profileData.auth_config?.two_factor_auth?.required || false);\n\n // Check if user can set password (backward compatible - default to true if not present)\n const canSetPasswordFlag = profileData?.can_set_password;\n setCanSetPassword(canSetPasswordFlag);\n\n // Set profile photo if available\n if (profileData.profile_pic) {\n setProfilePhoto(profileData.profile_pic);\n }\n\n // Set password policy from profile data - prioritize auth_config location\n let policyToUse = null;\n\n // Prioritize auth_config.password_policy as requested\n if (profileData.auth_config?.password_policy) {\n policyToUse = profileData.auth_config.password_policy;\n } else if (profileData.password_policy) {\n policyToUse = profileData.password_policy;\n }\n\n if (policyToUse) {\n setPasswordPolicy(policyToUse);\n } else {\n }\n\n // Set tokens from profile data\n if (profileData.tokens) {\n setTokens(profileData.tokens);\n }\n }\n\n // Also check for tokens in the root response (from profile API)\n if (profileData && profileData.tokens) {\n setTokens(profileData.tokens);\n }\n\n // Use tokens from app-initialize API\n if (appData?.sessions?.tokens) {\n setTokens(appData.sessions.tokens);\n }\n\n\n // Use password policy from app-initialize API\n if (appData?.password_policy) {\n setPasswordPolicy(appData.password_policy);\n }\n }, [profileData, appData]);\n\n // Helper function to format session data\n const formatSession = (session: any, index: number) => {\n // Use appropriate field names based on API spec\n const browserInfo = session.user_agent || session.browser_agent || 'Unknown Browser';\n const location = session.ip || session.location || 'Unknown Location';\n const createdAt = session.created_at;\n const lastSeenAt = session.last_seen_at;\n\n // Parse browser info to get browser name\n const getBrowserName = (agent: string) => {\n if (agent.includes('Chrome')) return 'Chrome';\n if (agent.includes('Firefox')) return 'Firefox';\n if (agent.includes('Safari')) return 'Safari';\n if (agent.includes('Edge')) return 'Edge';\n return 'Unknown Browser';\n };\n\n // Parse OS from user agent\n const getOS = (agent: string) => {\n if (agent.includes('Mac')) return 'macOS';\n if (agent.includes('Windows')) return 'Windows';\n if (agent.includes('Linux')) return 'Linux';\n if (agent.includes('iPhone') || agent.includes('iOS')) return 'iOS';\n if (agent.includes('Android')) return 'Android';\n return 'Unknown OS';\n };\n\n // Format time difference - handle IST timezone in the date string\n const formatTimeAgo = (dateStr: string) => {\n if (!dateStr) return 'Unknown';\n // Remove IST from the date string and parse it\n const cleanDateStr = dateStr.replace(' IST', '');\n const date = new Date(cleanDateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n if (diffHours > 0) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n if (diffMins > 0) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`;\n if (diffSecs > 0) return `${diffSecs} second${diffSecs > 1 ? 's' : ''} ago`;\n return 'Just now';\n };\n\n const browserName = getBrowserName(browserInfo);\n const os = getOS(browserInfo);\n\n // Consider session active if it was used in the last hour or is marked as current\n const isActive = () => {\n // Check if session is marked as current in API response\n if (session.is_current) {\n return true;\n }\n\n if (!lastSeenAt) return false;\n\n const cleanDateStr = typeof lastSeenAt === 'string' ? lastSeenAt.replace(' IST', '') : lastSeenAt;\n const sessionDate = new Date(cleanDateStr);\n const hourAgo = new Date(Date.now() - 60 * 60 * 1000);\n return sessionDate > hourAgo;\n };\n\n return {\n ...session,\n deviceName: `${browserName} on ${os}`,\n os: os,\n location: location === '127.0.0.1' ? 'Local Device' : location,\n sessionStartTime: formatTimeAgo(createdAt),\n lastSeen: formatTimeAgo(lastSeenAt),\n isActive: isActive()\n };\n };\n\n useEffect(() => {\n const { newPassword } = passwordData;\n\n if (passwordPolicy) {\n setPasswordValidation({\n minLength: newPassword.length >= (passwordPolicy.min_length || 8),\n hasUpperCase: passwordPolicy.require_uppercase ? /[A-Z]/.test(newPassword) : true,\n hasLowerCase: passwordPolicy.require_lowercase ? /[a-z]/.test(newPassword) : true,\n hasNumber: passwordPolicy.require_numbers ? /[0-9]/.test(newPassword) : true,\n hasSpecialChar: passwordPolicy.require_special_chars ? /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(newPassword) : true\n });\n } else {\n // Default validation if no policy\n setPasswordValidation({\n minLength: newPassword.length >= 8,\n hasUpperCase: /[A-Z]/.test(newPassword),\n hasLowerCase: /[a-z]/.test(newPassword),\n hasNumber: /[0-9]/.test(newPassword),\n hasSpecialChar: /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(newPassword)\n });\n }\n }, [passwordData.newPassword, passwordPolicy]);\n\n // Track previous isOpen state to detect when drawer reopens\n const [prevIsOpen, setPrevIsOpen] = useState(isOpen);\n\n // Refetch profile data and sessions when drawer reopens\n useEffect(() => {\n if (isOpen && !prevIsOpen) {\n // Drawer just opened - refetch profile data and sessions\n if (refetchProfile) {\n refetchProfile();\n }\n fetchSessions();\n\n // Reset all states when drawer reopens\n setIsEditingName(false);\n setIsEditingPassword(false);\n setErrors({});\n setPasswordErrors({});\n setServerMessage('');\n setPasswordData({\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n }\n setPrevIsOpen(isOpen);\n }, [isOpen, prevIsOpen, refetchProfile]);\n\n // Fetch sessions on initial load when activeTab is security\n useEffect(() => {\n if (activeTab === 'security' && isOpen) {\n fetchSessions();\n }\n }, [activeTab, isOpen]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: value\n }));\n setErrors(prev => ({\n ...prev,\n [name]: ''\n }));\n };\n\n const handlePasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target;\n setPasswordData(prev => ({\n ...prev,\n [name]: value\n }));\n setPasswordErrors(prev => ({\n ...prev,\n [name]: ''\n }));\n };\n\n const validateNameForm = () => {\n const newErrors: Record<string, string> = {};\n if (!formData.name.trim()) {\n newErrors.name = 'Name is required';\n }\n return newErrors;\n };\n\n const handlePhotoUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n const formData = new FormData();\n formData.append('profile_pic', file);\n\n try {\n const result = await saveUserProfile(formData);\n\n if (result.success) {\n setProfilePhoto(result.response?.profile_pic || URL.createObjectURL(file));\n setServerMessage('Profile photo updated successfully!');\n } else {\n setServerMessage(result.response?.message || 'Failed to upload photo');\n }\n } catch (error) {\n setServerMessage('Failed to upload photo');\n }\n }\n };\n\n const handleToggleTwoFactor = async () => {\n try {\n const newTwoFactorState = !twoFactorEnabled;\n\n // Create auth_config with only two_factor_auth.required\n const authConfig = {\n two_factor_auth: {\n required: newTwoFactorState\n }\n };\n\n // Create FormData for multipart/form-data request\n const formData = new FormData();\n formData.append('auth_config', JSON.stringify(authConfig));\n\n const result = await saveUserProfile(formData);\n\n if (result.success) {\n setTwoFactorEnabled(newTwoFactorState);\n setServerMessage(`Two-factor authentication ${newTwoFactorState ? 'enabled' : 'disabled'}`);\n\n // Show success toast\n toast.success({\n title: 'Two-Factor Authentication Updated',\n description: `Two-factor authentication ${newTwoFactorState ? 'enabled' : 'disabled'} successfully`,\n duration: 3000\n });\n } else {\n setServerMessage(result.response?.message || 'Failed to update two-factor authentication');\n\n // Show error toast\n toast.error({\n title: 'Update Failed',\n description: result.response?.message || 'Failed to update two-factor authentication',\n duration: 5000\n });\n }\n } catch (error) {\n setServerMessage('Failed to update two-factor authentication');\n\n // Show error toast\n toast.error({\n title: 'Update Error',\n description: 'An error occurred while updating two-factor authentication',\n duration: 5000\n });\n }\n };\n\n const handleLogoutSession = async (sessionId: any) => {\n try {\n const result = await removeSession(sessionId);\n\n if (result.success) {\n // Refresh sessions by calling API again\n fetchSessions();\n setServerMessage('Session logged out successfully');\n } else {\n setServerMessage(result.response?.message || 'Failed to logout session');\n }\n } catch (error) {\n setServerMessage('Failed to logout session');\n }\n };\n\n const handleLogoutAllSessions = async () => {\n try {\n // Collect all session IDs except current session\n const otherSessionIds = activeSessions\n .filter(session => !session.is_current)\n .map(session => session.id);\n\n const result = await removeAllSessions(otherSessionIds);\n\n if (result.success) {\n setServerMessage('All other sessions logged out successfully');\n // Refresh sessions list to show updated state\n fetchSessions();\n } else {\n setServerMessage(result.response?.message || 'Failed to logout all sessions');\n }\n } catch (error) {\n setServerMessage('Failed to logout all sessions');\n }\n };\n\n const validatePasswordForm = () => {\n const newErrors: Record<string, string> = {};\n // Only require current password if not setting password for the first time\n if (!shouldSetPassword && !passwordData.currentPassword) {\n newErrors.currentPassword = 'Current password is required';\n }\n if (!passwordData.newPassword) {\n newErrors.newPassword = shouldSetPassword ? 'Password is required' : 'New password is required';\n } else {\n // Check all password policy requirements\n const validationFailed = Object.values(passwordValidation).some(valid => !valid);\n if (validationFailed) {\n newErrors.newPassword = 'Password must meet all requirements';\n }\n }\n if (passwordData.newPassword !== passwordData.confirmPassword) {\n newErrors.confirmPassword = 'Passwords do not match';\n }\n return newErrors;\n };\n\n const handleNameSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const validationErrors = validateNameForm();\n if (Object.keys(validationErrors).length > 0) {\n setErrors(validationErrors);\n return;\n }\n\n setLoading(true);\n setServerMessage('');\n\n try {\n const payload = new FormData();\n payload.append('name', formData.name);\n const result = await saveUserProfile(payload);\n\n if (result.success) {\n setServerMessage('Name updated successfully!');\n setIsEditingName(false);\n setTimeout(() => {\n setServerMessage('');\n }, 3000);\n } else {\n setServerMessage(result.response?.message || 'Failed to update name');\n }\n } catch (error) {\n setServerMessage('An error occurred. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasswordSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const validationErrors = validatePasswordForm();\n if (Object.keys(validationErrors).length > 0) {\n setPasswordErrors(validationErrors);\n return;\n }\n\n setLoading(true);\n setServerMessage('');\n\n try {\n // Only send current_password if not setting password for the first time\n const payload: any = {\n new_password: passwordData.newPassword\n };\n\n if (!shouldSetPassword) {\n payload.current_password = passwordData.currentPassword;\n }\n\n const result = await updatePassword(payload);\n\n if (result.success) {\n setServerMessage(shouldSetPassword ? 'Password set successfully!' : 'Password changed successfully!');\n setPasswordData({\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n setIsEditingPassword(false);\n // Refetch profile data to get updated last_password_changed\n if (refetchProfile) {\n refetchProfile();\n }\n setTimeout(() => {\n setServerMessage('');\n }, 3000);\n } else {\n setServerMessage(result.response?.message || 'Failed to change password');\n }\n } catch (error) {\n setServerMessage('An error occurred. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleRoleSwitch = async (roleId: number) => {\n // Handle role switching\n setRoleSwitchLoading(roleId);\n\n try {\n const result = await changeRole(roleId);\n\n if (result.success) {\n // Show success toast\n toast.success({\n title: 'Role Switched',\n description: 'Role switched successfully! Redirecting...',\n duration: 2000\n });\n\n setTimeout(() => {\n // Redirect to /app after successful role switch\n window.location.href = '/app';\n }, 1000);\n } else {\n // Show error toast\n toast.error({\n title: 'Role Switch Failed',\n description: result.response?.message || 'Failed to switch role',\n duration: 5000\n });\n setRoleSwitchLoading(null);\n }\n } catch (error) {\n // Show error toast\n toast.error({\n title: 'Role Switch Error',\n description: 'An error occurred while switching role',\n duration: 5000\n });\n setRoleSwitchLoading(null);\n }\n };\n\n const handleLogout = () => {\n showLogoutConfirmation(() => {\n performLogout({ redirectUrl: '/app/login' });\n });\n };\n\n const getCookie = (name: string) => {\n let cookieValue = null;\n if (document.cookie && document.cookie !== '') {\n const cookies = document.cookie.split(';');\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n if (cookie.substring(0, name.length + 1) === (name + '=')) {\n cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n break;\n }\n }\n }\n return cookieValue;\n };\n\n return (\n <div className={`user-profile-drawer ${isOpen ? 'open' : ''}`}>\n {/* Header with gradient background */}\n <div className=\"profile-header-gradient\">\n <button className=\"profile-close-btn\" onClick={onClose}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M6 6L18 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n {/* Profile Loading State */}\n {profileLoading && (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: '2rem' }}>\n <Spin size=\"large\" />\n <span style={{ marginLeft: '12px', color: '#6b7280' }}>Loading profile...</span>\n </div>\n )}\n\n {/* Password Update Loading Overlay */}\n {loading && (\n <div style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999\n }}>\n <div style={{\n backgroundColor: 'white',\n padding: '2rem',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 10px 25px rgba(0, 0, 0, 0.1)'\n }}>\n <Spin size=\"large\" />\n <span style={{ marginLeft: '12px', color: '#6b7280', fontSize: '16px' }}>Updating password...</span>\n </div>\n </div>\n )}\n\n {/* Error State */}\n {profileError && !profileLoading && (\n <div style={{\n margin: '1rem 1.5rem',\n padding: '1rem',\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: '8px'\n }}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <svg style={{ height: '20px', width: '20px', color: '#f87171', marginRight: '8px' }} viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n <span style={{ color: '#b91c1c', fontWeight: '500' }}>Failed to load profile</span>\n </div>\n <p style={{ color: '#dc2626', fontSize: '14px', marginTop: '4px', marginBottom: '8px' }}>{profileError}</p>\n <button\n onClick={refetchProfile}\n style={{\n fontSize: '14px',\n color: '#dc2626',\n textDecoration: 'underline',\n background: 'none',\n border: 'none',\n cursor: 'pointer'\n }}\n >\n Try again\n </button>\n </div>\n )}\n\n {/* Profile Info Section - Only show when not loading and no error */}\n {!profileLoading && !profileError && (\n <>\n <div className=\"profile-info-section\">\n <div className=\"profile-avatar-container\">\n <div className=\"profile-avatar-circle\">\n {profilePhoto ? (\n <img src={profilePhoto} alt=\"Profile\" className=\"profile-avatar-img\" />\n ) : formData.name ? (\n <span className=\"profile-initials\">\n {formData.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)}\n </span>\n ) : (\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 20C23.6819 20 26.6667 17.0152 26.6667 13.3333C26.6667 9.65143 23.6819 6.66667 20 6.66667C16.3181 6.66667 13.3333 9.65143 13.3333 13.3333C13.3333 17.0152 16.3181 20 20 20ZM20 20C13.3726 20 8 25.3726 8 32C8 33.1046 8.89543 34 10 34H30C31.1046 34 32 33.1046 32 32C32 25.3726 26.6274 20 20 20Z\" stroke=\"#6B7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n <label className=\"profile-avatar-edit\">\n <input type=\"file\" accept=\"image/*\" onChange={handlePhotoUpload} hidden />\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.52121 10.8728L2 14L5.12724 13.4788C5.67029 13.3883 6.1715 13.1304 6.56079 12.7411L13.6132 5.68859C14.1289 5.17281 14.1289 4.3366 13.6131 3.82084L12.1791 2.38682C11.6633 1.87105 10.8271 1.87106 10.3113 2.38685L3.25894 9.43933C2.86965 9.8286 2.61171 10.3298 2.52121 10.8728Z\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </label>\n </div>\n </div>\n\n <div className=\"profile-name-section\">\n <h2 className=\"profile-user-name\">{formData.name || 'Welcome!'}</h2>\n <div className=\"profile-user-role-badge\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.5 6.5V4.5C9.5 3.39543 8.60457 2.5 7.5 2.5H6.5C5.39543 2.5 4.5 3.39543 4.5 4.5V6.5M3 6.5H11C11.5523 6.5 12 6.94772 12 7.5V10.5C12 11.0523 11.5523 11.5 11 11.5H3C2.44772 11.5 2 11.0523 2 10.5V7.5C2 6.94772 2.44772 6.5 3 6.5Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"7\" cy=\"9\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span>{formData.currentRole}</span>\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div className=\"profile-main-content\">\n <div className=\"profile-content-wrapper\">\n {/* Tab Navigation */}\n <div className=\"profile-tabs\">\n <button\n className={`profile-tab ${activeTab === 'account' ? 'active' : ''}`}\n onClick={() => {\n setActiveTab('account');\n setIsEditingName(false);\n setServerMessage('');\n }}\n >\n Account\n </button>\n <button\n className={`profile-tab ${activeTab === 'security' ? 'active' : ''}`}\n onClick={() => {\n setActiveTab('security');\n setIsEditingPassword(false);\n setServerMessage('');\n }}\n >\n Security\n </button>\n </div>\n\n {/* Alert Messages */}\n {serverMessage && (\n <div className={`profile-alert ${serverMessage.includes('successfully') ? 'success' : 'error'}`}>\n <span>{serverMessage}</span>\n </div>\n )}\n\n {errors.general && (\n <div className=\"profile-alert error\">\n <span>{errors.general}</span>\n </div>\n )}\n\n {/* Tab Content */}\n <div className=\"profile-tab-content\">\n {activeTab === 'account' ? (\n <div className=\"account-section\">\n {/* Welcome Banner for New Users */}\n {!formData.name && !formData.email && !formData.mobile && (\n <div className=\"welcome-banner\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"24\" cy=\"24\" r=\"24\" fill=\"rgba(80, 72, 237, 0.1)\" />\n <path d=\"M24 16V20M24 28H24.01M34 24C34 29.5228 29.5228 34 24 34C18.4772 34 14 29.5228 14 24C14 18.4772 18.4772 14 24 14C29.5228 14 34 18.4772 34 24Z\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <h3>Complete Your Profile</h3>\n <p>Add your name and other details to personalize your account. Click the edit button next to each field to get started.</p>\n </div>\n )}\n {/* Name Field */}\n <div className=\"profile-field-section\">\n <div className=\"profile-field-header\">\n <label className=\"profile-field-label\">Name</label>\n {!isEditingName && (\n <button\n className=\"profile-field-edit-btn\"\n onClick={() => setIsEditingName(true)}\n >\n Edit\n </button>\n )}\n </div>\n {!isEditingName ? (\n <div className=\"profile-field-value\">\n {formData.name || <span className=\"empty-value\">Click edit to add your name</span>}\n </div>\n ) : (\n <form onSubmit={handleNameSubmit} className=\"profile-inline-form\">\n <input\n type=\"text\"\n name=\"name\"\n className=\"profile-form-input\"\n value={formData.name}\n onChange={handleInputChange}\n placeholder=\"Enter your full name\"\n autoFocus\n />\n <div className=\"profile-inline-actions\">\n <button type=\"button\" className=\"profile-cancel-btn\" onClick={() => {\n setIsEditingName(false);\n setErrors({});\n setFormData(prev => ({ ...prev, name: profileData?.name || '' }));\n }}>Cancel</button>\n <button type=\"submit\" className=\"profile-save-btn\" disabled={loading}>\n {loading ? 'Saving...' : 'Save'}\n </button>\n </div>\n {errors.name && <div className=\"profile-form-error\">{errors.name}</div>}\n </form>\n )}\n </div>\n\n {/* Email Field - Read Only - Only show if email exists */}\n {formData.email && (\n <div className=\"profile-field-section\">\n <label className=\"profile-field-label\">Email</label>\n <div className=\"profile-field-value readonly\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"field-icon\">\n <path d=\"M2.66667 5.33333L7.2786 8.60289C7.67788 8.86886 8.32212 8.86886 8.7214 8.60289L13.3333 5.33333M4 12H12C12.7364 12 13.3333 11.4031 13.3333 10.6667V5.33333C13.3333 4.59695 12.7364 4 12 4H4C3.26362 4 2.66667 4.59695 2.66667 5.33333V10.6667C2.66667 11.4031 3.26362 12 4 12Z\" stroke=\"#6B7280\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n {formData.email}\n </div>\n </div>\n )}\n\n {/* Mobile Field - Read Only - Only show if mobile exists */}\n {formData.mobile && (\n <div className=\"profile-field-section\">\n <label className=\"profile-field-label\">Mobile Number</label>\n <div className=\"profile-field-value readonly\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"field-icon\">\n <path d=\"M5.33333 2.66667H10.6667C11.4031 2.66667 12 3.26362 12 4V12C12 12.7364 11.4031 13.3333 10.6667 13.3333H5.33333C4.59695 13.3333 4 12.7364 4 12V4C4 3.26362 4.59695 2.66667 5.33333 2.66667ZM5.33333 2.66667V3.33333C5.33333 3.70152 5.63181 4 6 4H10C10.3682 4 10.6667 3.70152 10.6667 3.33333V2.66667M8 11.3333H8.00667\" stroke=\"#6B7280\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n {formData.mobile}\n </div>\n </div>\n )}\n\n {/* Roles */}\n <div className=\"profile-field-section\">\n <label className=\"profile-field-label\">Roles</label>\n <div className=\"roles-list\">\n {formData.roles && formData.roles.length > 0 ? (\n formData.roles.map((role, index) => (\n <div\n key={role.id}\n className={`role-item ${role.name === formData.currentRole ? 'active' : ''}`}\n >\n <div className=\"role-info\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.6667 7V5C10.6667 3.89543 9.77124 3 8.66667 3H7.33333C6.22876 3 5.33333 3.89543 5.33333 5V7M4 7H12C12.5523 7 13 7.44772 13 8V12C13 12.5523 12.5523 13 12 13H4C3.44772 13 3 12.5523 3 12V8C3 7.44772 3.44772 7 4 7Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"8\" cy=\"10\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span className=\"role-name\">{role.name}</span>\n </div>\n {role.name === formData.currentRole ? (\n <span className=\"role-badge\">Current</span>\n ) : (\n <button\n className=\"role-switch-btn\"\n onClick={() => handleRoleSwitch(role.id)}\n disabled={roleSwitchLoading !== null}\n >\n {roleSwitchLoading === role.id ? 'Switching...' : 'Switch'}\n </button>\n )}\n </div>\n ))\n ) : (\n <div className=\"role-item active\">\n <div className=\"role-info\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.6667 7V5C10.6667 3.89543 9.77124 3 8.66667 3H7.33333C6.22876 3 5.33333 3.89543 5.33333 5V7M4 7H12C12.5523 7 13 7.44772 13 8V12C13 12.5523 12.5523 13 12 13H4C3.44772 13 3 12.5523 3 12V8C3 7.44772 3.44772 7 4 7Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"8\" cy=\"10\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span className=\"role-name\">{formData.currentRole || 'Admin'}</span>\n </div>\n <span className=\"role-badge\">Current</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Logout Section */}\n <div className=\"profile-field-section logout-section\">\n <button\n className=\"logout-button\"\n onClick={handleLogout}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 11.75C9.95093 12.9846 8.92207 14.0329 7.54373 13.9992C7.22307 13.9913 6.82673 13.8796 6.03408 13.656C4.12641 13.1179 2.47037 12.2135 2.07304 10.1877C2 9.81533 2 9.39627 2 8.5582V7.4418C2 6.60374 2 6.1847 2.07304 5.81231C2.47037 3.78643 4.12641 2.8821 6.03408 2.34402C6.82673 2.12042 7.22307 2.00863 7.54373 2.00079C8.92207 1.96707 9.95093 3.01538 10 4.25\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n <path d=\"M14 7.99998H6.66663M14 7.99998C14 7.53318 12.6704 6.661 12.3333 6.33331M14 7.99998C14 8.46678 12.6704 9.33898 12.3333 9.66665\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span>Log Out</span>\n </button>\n </div>\n </div>\n ) : (\n <div className=\"security-section\">\n {/* Password Section - only show if can_set_password is true or not present */}\n {canSetPassword && (\n <div className=\"security-block\">\n <div className=\"security-header\">\n <div>\n <h4 className=\"security-title\">\n Password\n {passwordPolicy && !passwordPolicy.allow_change && (\n <span className=\"password-disabled-badge\">Disabled</span>\n )}\n </h4>\n {!shouldSetPassword && (\n <p className=\"security-subtitle\">\n Last changed: {formData.lastPasswordChange}\n {formData.nextPasswordDue && (\n <>\n {' • '}\n <span className={formData.nextPasswordDue === 'Expired' ? 'password-expired' : ''}>\n Next due: {formData.nextPasswordDue}\n </span>\n </>\n )}\n </p>\n )}\n {shouldSetPassword && (\n <p className=\"security-subtitle\">\n Set your password to secure your account\n </p>\n )}\n </div>\n {!isEditingPassword && passwordPolicy?.allow_change !== false && (\n <button\n className=\"profile-field-edit-btn\"\n onClick={() => {\n setIsEditingPassword(true);\n // Clear password fields when opening the form\n setPasswordData({\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n setPasswordErrors({});\n }}\n >\n {shouldSetPassword ? 'Set Password' : 'Change Password'}\n </button>\n )}\n </div>\n\n {isEditingPassword && (\n <form onSubmit={handlePasswordSubmit} className=\"password-form\">\n {/* Show current password field only if not shouldSetPassword */}\n {!shouldSetPassword && (\n <div className=\"profile-form-group\">\n <label className=\"profile-form-label\">Current Password</label>\n <input\n type=\"password\"\n name=\"currentPassword\"\n className=\"profile-form-input\"\n value={passwordData.currentPassword}\n onChange={handlePasswordChange}\n placeholder=\"Enter current password\"\n autoComplete=\"new-password\"\n />\n {passwordErrors.currentPassword && (\n <div className=\"profile-form-error\">{passwordErrors.currentPassword}</div>\n )}\n </div>\n )}\n\n <div className=\"profile-form-group\">\n <label className=\"profile-form-label\">{shouldSetPassword ? 'Password' : 'New Password'}</label>\n <input\n type=\"password\"\n name=\"newPassword\"\n className=\"profile-form-input\"\n value={passwordData.newPassword}\n onChange={handlePasswordChange}\n placeholder={shouldSetPassword ? 'Enter password' : 'Enter new password'}\n autoComplete=\"new-password\"\n />\n {passwordErrors.newPassword && (\n <div className=\"profile-form-error\">{passwordErrors.newPassword}</div>\n )}\n </div>\n\n <div className=\"password-requirements\">\n {passwordPolicy && (\n <>\n <div className={`password-requirement ${passwordValidation.minLength ? 'met' : ''}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\" fill=\"currentColor\" />\n </svg>\n <span>Minimum {passwordPolicy.min_length} characters</span>\n </div>\n {passwordPolicy.require_uppercase && (\n <div className={`password-requirement ${passwordValidation.hasUpperCase ? 'met' : ''}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\" fill=\"currentColor\" />\n </svg>\n <span>One uppercase character</span>\n </div>\n )}\n {passwordPolicy.require_lowercase && (\n <div className={`password-requirement ${passwordValidation.hasLowerCase ? 'met' : ''}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\" fill=\"currentColor\" />\n </svg>\n <span>One lowercase character</span>\n </div>\n )}\n {passwordPolicy.require_numbers && (\n <div className={`password-requirement ${passwordValidation.hasNumber ? 'met' : ''}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\" fill=\"currentColor\" />\n </svg>\n <span>One number</span>\n </div>\n )}\n {passwordPolicy.require_special_chars && (\n <div className={`password-requirement ${passwordValidation.hasSpecialChar ? 'met' : ''}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\" fill=\"currentColor\" />\n </svg>\n <span>One special character</span>\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"profile-form-group\">\n <label className=\"profile-form-label\">Confirm Password</label>\n <input\n type=\"password\"\n name=\"confirmPassword\"\n className=\"profile-form-input\"\n value={passwordData.confirmPassword}\n onChange={handlePasswordChange}\n placeholder={shouldSetPassword ? 'Confirm password' : 'Confirm new password'}\n autoComplete=\"new-password\"\n />\n {passwordErrors.confirmPassword && (\n <div className=\"profile-form-error\">{passwordErrors.confirmPassword}</div>\n )}\n </div>\n\n <div className=\"profile-form-actions\">\n <button type=\"button\" className=\"profile-cancel-btn\" onClick={() => {\n setIsEditingPassword(false);\n setPasswordErrors({});\n setPasswordData({ currentPassword: '', newPassword: '', confirmPassword: '' });\n }}>Cancel</button>\n <button type=\"submit\" className=\"profile-submit-btn\" disabled={loading}>\n {loading ? (shouldSetPassword ? 'Setting...' : 'Updating...') : (shouldSetPassword ? 'Set Password' : 'Update Password')}\n </button>\n </div>\n </form>\n )}\n </div>\n )}\n\n {/* Two Factor Authentication */}\n <div className=\"security-block\">\n <div className=\"security-header\">\n <div>\n <h4 className=\"security-title\">Two-Factor Authentication</h4>\n <p className=\"security-subtitle\">\n {twoFactorEnabled ? 'Enabled' : 'Disabled'} {!twoFactorEnabled ? ' - Add an extra layer of security' : ''}\n </p>\n {/* Show error message if can_enable is false and 2FA is disabled */}\n {!twoFactorEnabled && profileData?.auth_config?.two_factor_auth?.can_enable === false && profileData?.auth_config?.two_factor_auth?.issue && (\n <p style={{ color: '#dc2626', fontSize: '14px', marginTop: '8px' }}>\n {profileData.auth_config.two_factor_auth.issue}\n </p>\n )}\n </div>\n {/* Show Enable button only if can_enable is true */}\n {!twoFactorEnabled && profileData?.auth_config?.two_factor_auth?.can_enable === true && (\n <button\n className=\"toggle-btn\"\n onClick={handleToggleTwoFactor}\n >\n Enable\n </button>\n )}\n {/* Show Disable button only if 2FA is enabled and can_disable is true */}\n {twoFactorEnabled && profileData?.auth_config?.two_factor_auth?.can_disable === true && (\n <button\n className=\"toggle-btn enabled\"\n onClick={handleToggleTwoFactor}\n >\n Disable\n </button>\n )}\n </div>\n </div>\n\n {/* Active Sessions */}\n <div className=\"security-block\">\n <div className=\"security-header\">\n <div>\n <h4 className=\"security-title\">Where you're logged in</h4>\n <p className=\"security-subtitle\">Manage your active sessions</p>\n </div>\n </div>\n\n <div className=\"sessions-list\">\n {sessionsLoading ? (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem' }}>\n <Spin size=\"small\" />\n <span style={{ marginLeft: '8px', color: '#6b7280' }}>Loading sessions...</span>\n </div>\n ) : sessionsError ? (\n <div style={{\n padding: '1rem',\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: '8px',\n textAlign: 'center'\n }}>\n <p style={{ color: '#b91c1c', margin: '0 0 8px 0' }}>Failed to load sessions</p>\n <p style={{ color: '#dc2626', fontSize: '14px', margin: '0 0 8px 0' }}>{sessionsError}</p>\n <button\n onClick={fetchSessions}\n style={{\n fontSize: '14px',\n color: '#dc2626',\n textDecoration: 'underline',\n background: 'none',\n border: 'none',\n cursor: 'pointer'\n }}\n >\n Try again\n </button>\n </div>\n ) : activeSessions.length > 0 ? (\n activeSessions.map((session, index) => {\n const formattedSession = formatSession(session, index);\n return (\n <div key={session.id || index} className=\"session-item\">\n <div className=\"session-info\">\n <div className=\"session-device\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.5 4.16667C2.5 3.24619 3.24619 2.5 4.16667 2.5H15.8333C16.7538 2.5 17.5 3.24619 17.5 4.16667V12.5C17.5 13.4205 16.7538 14.1667 15.8333 14.1667H4.16667C3.24619 14.1667 2.5 13.4205 2.5 12.5V4.16667Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M6.66667 17.5H13.3333\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 14.1667V17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <div>\n <div className=\"session-device-header\">\n <p className=\"session-device-name\">{formattedSession.deviceName}</p>\n {session.is_current ? (\n <span className=\"session-status-tag current\">\n Current\n </span>\n ) : formattedSession.isActive ? (\n <button\n className=\"logout-tag-btn logout-tag-btn-ghost\"\n onClick={() => handleLogoutSession(session.id)}\n >\n Logout\n </button>\n ) : (\n <button\n className=\"logout-tag-btn\"\n onClick={() => handleLogoutSession(session.id)}\n >\n Logout\n </button>\n )}\n </div>\n <p className=\"session-details\">\n {formattedSession.os} • {formattedSession.location}\n </p>\n </div>\n </div>\n </div>\n <div className=\"session-time\">\n <div className=\"session-time-info\">\n <p className=\"session-start-time\">\n Started: {formattedSession.sessionStartTime}\n </p>\n <p className=\"session-last-active\">\n {formattedSession.isActive ? 'Active now' : `Last seen: ${formattedSession.lastSeen}`}\n </p>\n </div>\n </div>\n </div>\n );\n })\n ) : (\n <p className=\"no-sessions\">No active sessions found</p>\n )}\n </div>\n\n {activeSessions.length > 1 && (\n <button\n className=\"logout-all-btn\"\n onClick={handleLogoutAllSessions}\n >\n Sign me out of all other sessions\n </button>\n )}\n </div>\n\n {/* API Tokens */}\n <div className=\"security-block\">\n <div className=\"security-header\">\n <div>\n <h4 className=\"security-title\">Authentication Tokens</h4>\n <p className=\"security-subtitle\">Manage your bearer tokens for API authentication</p>\n </div>\n </div>\n\n <div className=\"tokens-list\">\n {tokens && tokens.length > 0 ? (\n tokens.map((token, index) => (\n <div key={index} className=\"token-item\">\n <div className=\"token-info\">\n <div className=\"token-details\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 8.33333V6.66667C15 4.08934 12.9107 2 10.3333 2H9.66667C7.08934 2 5 4.08934 5 6.66667V8.33333M6.66667 8.33333H13.3333C14.2538 8.33333 15 9.07953 15 10V15C15 15.9205 14.2538 16.6667 13.3333 16.6667H6.66667C5.74619 16.6667 5 15.9205 5 15V10C5 9.07953 5.74619 8.33333 6.66667 8.33333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"10\" cy=\"12.5\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n <div>\n <p className=\"token-name\">{token.role} - Bearer Token</p>\n <p className=\"token-type\">Type: Bearer Authentication Token</p>\n <p className=\"token-created\">Created: {new Date(token.created).toLocaleDateString()}</p>\n {token.expiry ? (\n <p className=\"token-expiry\">Expires: {new Date(token.expiry).toLocaleDateString()}</p>\n ) : (\n <p className=\"token-expiry\">Expires: Never</p>\n )}\n </div>\n </div>\n\n </div>\n </div>\n ))\n ) : (\n <div className=\"no-tokens\">\n <p>No authentication tokens found</p>\n <p className=\"no-tokens-hint\">Bearer tokens will appear here for API authentication</p>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport default UserProfileDrawer;","import React, { useState, useRef, useEffect, MouseEvent } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport UserProfileDrawer from './UserProfileDrawer';\nimport { performLogout, showLogoutConfirmation } from '../../utils/logoutUtils';\nimport './Topbar.css';\nimport { getColor } from '../../utils/colorUtils';\n\ninterface TopbarLogoutButtonProps {\n onLogout: () => void;\n className?: string;\n}\n\n// Export individual components for flexible usage\nexport const TopbarLogoutButton: React.FC<TopbarLogoutButtonProps> = ({ onLogout, className = \"\" }) => (\n <a\n className={`dropdown-item profile-logout ${className}`}\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onLogout();\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M10 11.75C9.95093 12.9846 8.92207 14.0329 7.54373 13.9992C7.22307 13.9913 6.82673 13.8796 6.03408 13.656C4.12641 13.1179 2.47037 12.2135 2.07304 10.1877C2 9.81533 2 9.39627 2 8.5582V7.4418C2 6.60374 2 6.1847 2.07304 5.81231C2.47037 3.78643 4.12641 2.8821 6.03408 2.34402C6.82673 2.12042 7.22307 2.00863 7.54373 2.00079C8.92207 1.96707 9.95093 3.01538 10 4.25\"\n stroke=\"#717680\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M14 7.99998H6.66663M14 7.99998C14 7.53318 12.6704 6.661 12.3333 6.33331M14 7.99998C14 8.46678 12.6704 9.33898 12.3333 9.66665\"\n stroke=\"#717680\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"profile-name\">Log Out</span>\n </a>\n);\n\nexport const TopbarViewProfileButton = ({ onViewProfile, className = \"\" }) => (\n <a\n className={`dropdown-item profile-view ${className}`}\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onViewProfile();\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M8.00004 7.33329C9.47281 7.33329 10.6667 6.13948 10.6667 4.66663C10.6667 3.19377 9.47281 1.99996 8.00004 1.99996C6.52719 1.99996 5.33337 3.19377 5.33337 4.66663C5.33337 6.13948 6.52719 7.33329 8.00004 7.33329Z\"\n stroke=\"#717680\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.00004 14V12.6666C4.00004 11.9594 4.28099 11.2811 4.78109 10.781C5.28119 10.2809 5.95947 9.99996 6.66671 9.99996H9.33337C10.0406 9.99996 10.7189 10.2809 11.219 10.781C11.7191 11.2811 12 11.9594 12 12.6666V14\"\n stroke=\"#717680\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"profile-name\">View Profile</span>\n </a>\n);\n\nconst Topbar = ({ profileInfo, theme = {}, config = {} }) => {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [roleDropdownExpanded, setRoleDropdownExpanded] = useState(false);\n const [userDrawerOpen, setUserDrawerOpen] = useState(false);\n const [profileData, setProfileData] = useState(null);\n const dropdownRef = useRef(null);\n const navigate = useNavigate();\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setDropdownOpen(false);\n setRoleDropdownExpanded(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const toggleDropdown = () => {\n setDropdownOpen(!dropdownOpen);\n if (!dropdownOpen) {\n setRoleDropdownExpanded(false);\n }\n };\n\n const toggleRoleDropdown = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setRoleDropdownExpanded(!roleDropdownExpanded);\n };\n\n const handleLogout = () => {\n showLogoutConfirmation(() => {\n performLogout({ theme });\n });\n };\n\n\n const handleRoleSwitch = (roleUrl) => {\n // Handle role switching\n window.location.href = roleUrl;\n };\n\n // Display settings\n const currentRole = profileInfo?.current_role || profileInfo?.user_role;\n const otherRoles = profileInfo?.other_roles || [];\n \n // Get configuration settings\n const {\n showProfile = true,\n showLeftSection = true,\n showRightSection = true,\n customLeftContent = null,\n customRightContent = null,\n customProfileMenu = null,\n customViewProfile = null,\n profileMenuConfig = {},\n className = '',\n style = {}\n } = config;\n \n const {\n showViewProfile = true,\n showLogout = true,\n showRoleSwitch = true,\n customMenuItems = []\n } = profileMenuConfig;\n\n // Handle view profile with custom component\n const handleViewProfile = () => {\n if (customViewProfile) {\n // Use custom view profile component (render prop pattern)\n setUserDrawerOpen(true);\n setDropdownOpen(false);\n } else {\n // Use default drawer\n setUserDrawerOpen(true);\n setDropdownOpen(false);\n }\n };\n\n return (\n <header className={`topbar header-container ${className}`} style={style}>\n <div className=\"topbar-content\">\n {showLeftSection && (\n <div className=\"topbar-left\">\n {customLeftContent || null}\n </div>\n )}\n\n {showRightSection && (\n <div className=\"topbar-right\">\n {/* Custom right content before profile */}\n {customRightContent}\n \n {/* Profile section */}\n {showProfile && (\n <div\n className=\"dropdown profile-dropdown-container\"\n ref={dropdownRef}\n >\n <div\n className=\"profile-dropdown-menu-button\"\n onClick={toggleDropdown}\n >\n <div className=\"profile-info-wrapper\">\n <img\n src={profileInfo?.profile_pic || `https://ui-avatars.com/api/?name=${encodeURIComponent(\n profileInfo?.name || \"User\"\n )}&background=${getColor('brand', 500).split('#')[1]}&color=fff`}\n alt=\"Profile\"\n className=\"profile-avatar\"\n />\n <div className=\"flex flex-col\">\n\n <span className=\"profile-name\">\n {profileInfo?.name || \"User\"}\n </span>\n <span className=\"text-[12px] text-gray-600\">\n {currentRole}\n </span>\n </div>\n </div>\n <svg\n className={`dropdown-arrow ${dropdownOpen ? \"open\" : \"\"}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.3538 6.35354L8.35378 11.3535C8.30735 11.4 8.2522 11.4369 8.1915 11.4621C8.13081 11.4872 8.06574 11.5002 8.00003 11.5002C7.93433 11.5002 7.86926 11.4872 7.80856 11.4621C7.74786 11.4369 7.69272 11.4 7.64628 11.3535L2.64628 6.35354C2.55246 6.25972 2.49976 6.13247 2.49976 5.99979C2.49976 5.86711 2.55246 5.73986 2.64628 5.64604C2.7401 5.55222 2.86735 5.49951 3.00003 5.49951C3.13272 5.49951 3.25996 5.55222 3.35378 5.64604L8.00003 10.2929L12.6463 5.64604C12.6927 5.59958 12.7479 5.56273 12.8086 5.53759C12.8693 5.51245 12.9343 5.49951 13 5.49951C13.0657 5.49951 13.1308 5.51245 13.1915 5.53759C13.2522 5.56273 13.3073 5.59958 13.3538 5.64604C13.4002 5.69249 13.4371 5.74764 13.4622 5.80834C13.4874 5.86904 13.5003 5.93409 13.5003 5.99979C13.5003 6.06549 13.4874 6.13054 13.4622 6.19124C13.4371 6.25193 13.4002 6.30708 13.3538 6.35354Z\"\n fill=\"#414651\"\n />\n </svg>\n </div>\n\n {/* Dropdown Menu */}\n <ul\n className={`profile-dropdown-menu ${dropdownOpen ? \"show\" : \"\"}`}\n >\n {/* Current Role Section */}\n {/* {currentRole && (\n <li>\n {otherRoles.length > 0 ? (\n <a\n href=\"#\"\n className=\"dropdown-item profile-info clickable\"\n onClick={(e) => {\n e.preventDefault();\n toggleRoleDropdown(e);\n }}\n >\n <div className=\"d-flex justify-content-between\">\n <div className=\"d-flex flex-row user-info-content\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.64663 0.838623H8.43663C8.64797 0.838623 8.84663 0.838623 9.01263 0.85729C9.19797 0.878623 9.39263 0.927956 9.57463 1.05929C9.75597 1.18996 9.86397 1.35996 9.94263 1.52862C10.0133 1.68062 10.076 1.86929 10.1426 2.06996L10.15 2.09129L10.3686 2.74462C10.432 2.90396 10.542 3.03996 10.6846 3.13396L10.8866 3.24996C11.0553 3.33396 11.2473 3.35796 11.4313 3.31796L12.232 3.09262L12.2553 3.08596C12.474 3.02396 12.678 2.96596 12.854 2.93796C13.05 2.90662 13.2646 2.90262 13.486 2.99262C13.7073 3.08262 13.858 3.23529 13.9766 3.39396C14.0833 3.53662 14.19 3.72129 14.3033 3.91862L14.6566 4.53196C14.7633 4.71662 14.8633 4.88996 14.93 5.04462C15.0046 5.21662 15.06 5.41129 15.036 5.63596C15.0126 5.85996 14.9186 6.03929 14.8093 6.19196C14.712 6.32929 14.578 6.47862 14.4353 6.63662L14.4206 6.65329L14.4193 6.65462L13.7453 7.40796C13.6613 7.52196 13.5733 7.77062 13.5733 8.00529C13.5733 8.23996 13.6613 8.48796 13.7453 8.60196L14.4206 9.35662L14.4353 9.37329C14.578 9.53196 14.712 9.68062 14.8093 9.81796C14.9186 9.97129 15.0126 10.15 15.036 10.3746C15.06 10.5986 15.0046 10.7933 14.93 10.966C14.8633 11.1206 14.7633 11.294 14.6566 11.4786L14.3033 12.092C14.19 12.2893 14.0833 12.4733 13.9766 12.616C13.858 12.7753 13.7073 12.9273 13.486 13.0173C13.2646 13.108 13.05 13.104 12.854 13.0726C12.678 13.0446 12.474 12.9866 12.2553 12.9246L12.232 12.918L11.4313 12.6926C11.2473 12.6526 11.0553 12.6766 10.8866 12.7606L10.6846 12.8766C10.542 12.9706 10.432 13.106 10.3686 13.2653L10.15 13.918L10.1426 13.94C10.076 14.1413 10.0133 14.3293 9.94263 14.4813C9.86397 14.6506 9.75597 14.82 9.57463 14.9513C9.39263 15.0826 9.19797 15.132 9.01263 15.1526C8.84663 15.172 8.64797 15.172 8.43663 15.172H7.64663C7.4353 15.172 7.2373 15.172 7.07063 15.1526C6.8853 15.132 6.69063 15.0826 6.50863 14.9513C6.3273 14.82 6.2193 14.6506 6.14063 14.4813C6.06997 14.3293 6.0073 14.1413 5.94063 13.94L5.9333 13.918L5.71463 13.2653C5.6513 13.106 5.5413 12.9706 5.39863 12.8766L5.19663 12.7606C5.02797 12.6766 4.83597 12.6526 4.65197 12.6926L3.8513 12.918L3.82797 12.9246C3.6093 12.9866 3.4053 13.0446 3.2293 13.0726C3.0333 13.104 2.81863 13.108 2.5973 13.0173C2.37597 12.9273 2.2253 12.7753 2.10663 12.616C1.99997 12.4733 1.8933 12.2893 1.77997 12.092L1.7673 12.07L1.42663 11.4786C1.31997 11.294 1.21997 11.1206 1.1533 10.966C1.07863 10.7933 1.0233 10.5986 1.0473 10.3746C1.07063 10.15 1.1653 9.97129 1.27397 9.81796C1.3713 9.68062 1.5053 9.53196 1.64797 9.37329L1.66263 9.35662L1.66397 9.35596L2.33797 8.60196C2.42197 8.48796 2.50997 8.23996 2.50997 8.00529C2.50997 7.77062 2.42197 7.52196 2.33797 7.40796L1.66397 6.65462L1.66263 6.65329L1.64797 6.63662C1.5053 6.47862 1.3713 6.32929 1.27397 6.19196C1.1653 6.03929 1.07063 5.85996 1.0473 5.63596C1.0233 5.41129 1.07863 5.21662 1.1533 5.04462C1.21997 4.88996 1.31997 4.71662 1.42663 4.53196L1.43863 4.51129L1.7673 3.93996L1.77997 3.91862C1.89397 3.72129 1.99997 3.53662 2.10663 3.39396C2.2253 3.23529 2.37597 3.08262 2.5973 2.99262C2.81863 2.90262 3.0333 2.90662 3.2293 2.93796C3.4053 2.96596 3.6093 3.02396 3.82797 3.08596L3.85197 3.09262L4.65197 3.31796C4.83597 3.35796 5.02797 3.33396 5.19663 3.24996L5.39863 3.13396C5.5413 3.03996 5.6513 2.90396 5.71463 2.74462L5.9333 2.09262L5.94063 2.06996C6.0073 1.86929 6.06997 1.68062 6.14063 1.52862C6.2193 1.35996 6.3273 1.18996 6.50863 1.05929C6.69063 0.927956 6.8853 0.878623 7.07063 0.85729C7.23663 0.838623 7.4353 0.838623 7.64663 0.838623ZM7.09397 1.86996C7.09397 1.86996 7.0913 1.87262 7.08797 1.87662C7.08063 1.88662 7.0673 1.90796 7.0473 1.94996C7.00397 2.04396 6.95863 2.17729 6.88197 2.40796L6.65597 3.08396L6.65197 3.09396C6.51197 3.45929 6.25863 3.77062 5.9293 3.98129L5.9193 3.98729L5.67463 4.12929L5.6633 4.13462C5.2793 4.33196 4.83797 4.38729 4.41663 4.28996L4.4053 4.28729L3.5793 4.05462C3.32797 3.98329 3.18197 3.94262 3.07197 3.92529C3.02263 3.91729 2.99597 3.91729 2.9833 3.91796C2.9773 3.91796 2.97463 3.91862 2.97463 3.91862L2.97397 3.91929C2.97397 3.91929 2.9713 3.92062 2.96663 3.92462C2.95663 3.93329 2.93797 3.95196 2.90797 3.99262C2.8413 4.08196 2.76463 4.21329 2.63397 4.43929L2.30463 5.01062C2.18263 5.22329 2.11263 5.34596 2.07063 5.44196C2.05197 5.48529 2.0453 5.50929 2.0433 5.52129C2.04197 5.52729 2.04197 5.53062 2.04197 5.53062V5.53129V5.53262C2.04197 5.53262 2.04263 5.53529 2.0453 5.54062C2.04997 5.55196 2.0613 5.57396 2.08863 5.61262C2.1493 5.69796 2.2433 5.80329 2.4073 5.98596L2.40797 5.98662L3.10597 6.76662L3.1153 6.77862C3.36463 7.09462 3.50997 7.57996 3.50997 8.00529C3.50997 8.42996 3.36463 8.91529 3.1153 9.23196L3.10597 9.24396L2.40797 10.0233L2.4073 10.0246C2.2433 10.2066 2.1493 10.3126 2.08863 10.398C2.0613 10.436 2.04997 10.4586 2.0453 10.4693C2.04263 10.4746 2.04197 10.478 2.04197 10.478V10.4786V10.48C2.04197 10.48 2.04197 10.4833 2.0433 10.4886C2.0453 10.5006 2.05197 10.5253 2.07063 10.5686C2.11263 10.664 2.18263 10.7873 2.30463 11L2.63397 11.5706C2.76463 11.7973 2.8413 11.9286 2.90797 12.018C2.93797 12.058 2.95663 12.0773 2.96663 12.0853C2.9713 12.0893 2.97397 12.0913 2.97397 12.0913C2.97397 12.0913 2.9773 12.092 2.9833 12.0926C2.99597 12.0933 3.02263 12.0926 3.07197 12.0853C3.18197 12.0673 3.32797 12.0266 3.5793 11.956L4.4053 11.7226L4.41663 11.72C4.83797 11.6233 5.2793 11.6786 5.66397 11.876L5.67463 11.8813L5.9193 12.0226L5.9293 12.0293C6.25863 12.24 6.51197 12.5506 6.65197 12.916L6.65597 12.926L6.88197 13.602C6.95863 13.8333 7.00397 13.9666 7.0473 14.0606C7.0673 14.1026 7.08063 14.124 7.08797 14.1333C7.0913 14.138 7.09397 14.14 7.09397 14.14V14.1406C7.09397 14.1406 7.0973 14.1426 7.10263 14.144C7.11397 14.148 7.13797 14.154 7.18463 14.1593C7.28663 14.1713 7.4273 14.172 7.66997 14.172H8.4133C8.65597 14.172 8.79663 14.1713 8.8993 14.1593C8.9453 14.154 8.9693 14.148 8.98063 14.144C8.98263 14.1433 8.98463 14.1426 8.98597 14.142C8.9873 14.1413 8.98863 14.1413 8.98863 14.1413L8.98997 14.14C8.98997 14.14 8.99197 14.138 8.9953 14.1333C9.00263 14.124 9.01597 14.1026 9.03597 14.0606C9.0793 13.9666 9.12463 13.8333 9.2013 13.602L9.42797 12.926L9.4313 12.916C9.5713 12.5506 9.82463 12.24 10.154 12.0293L10.164 12.0226L10.4086 11.8813L10.42 11.876C10.804 11.6786 11.2453 11.6233 11.6666 11.72L11.678 11.7226L12.504 11.956C12.7553 12.0266 12.9013 12.0673 13.0113 12.0853C13.0606 12.0926 13.0873 12.0933 13.1 12.0926C13.106 12.092 13.1086 12.0913 13.1086 12.0913C13.1086 12.0913 13.112 12.0893 13.1166 12.0853C13.1266 12.0773 13.1453 12.058 13.1753 12.018C13.242 11.9286 13.3186 11.7973 13.4493 11.5706L13.7786 11C13.9006 10.7873 13.9706 10.664 14.0126 10.5686C14.0313 10.5253 14.038 10.5006 14.04 10.4886C14.0413 10.4833 14.0413 10.48 14.0413 10.48V10.4786V10.478C14.0413 10.478 14.0406 10.4746 14.0386 10.4693C14.0333 10.4586 14.022 10.436 13.9946 10.398C13.934 10.3126 13.84 10.2066 13.676 10.0246L12.9773 9.24396L12.968 9.23196C12.7186 8.91529 12.5733 8.42996 12.5733 8.00529C12.5733 7.57996 12.7186 7.09462 12.968 6.77862L12.9773 6.76662L13.6753 5.98662L13.676 5.98596C13.84 5.80329 13.934 5.69796 13.9946 5.61262C14.022 5.57396 14.0333 5.55196 14.0386 5.54062C14.0406 5.53529 14.0413 5.53262 14.0413 5.53262V5.53129V5.53062C14.0413 5.53062 14.0413 5.52729 14.04 5.52129C14.038 5.50929 14.0313 5.48529 14.0126 5.44196C13.9706 5.34596 13.9006 5.22329 13.7786 5.01062L13.4493 4.43929C13.3186 4.21329 13.242 4.08196 13.1753 3.99262C13.1453 3.95196 13.1266 3.93329 13.1166 3.92462C13.112 3.92062 13.1093 3.91929 13.1093 3.91929L13.1086 3.91862C13.1086 3.91862 13.106 3.91796 13.1 3.91796C13.0873 3.91729 13.0606 3.91729 13.0113 3.92529C12.9013 3.94262 12.7553 3.98329 12.504 4.05462L11.678 4.28729L11.6666 4.28996C11.2453 4.38729 10.804 4.33196 10.42 4.13462L10.4093 4.12929L10.164 3.98729L10.154 3.98129C9.82463 3.77062 9.5713 3.45929 9.4313 3.09396L9.42797 3.08396L9.2013 2.40796C9.12463 2.17729 9.0793 2.04396 9.03597 1.94996C9.01597 1.90796 9.00263 1.88662 8.9953 1.87662C8.99197 1.87262 8.98997 1.86996 8.98997 1.86996C8.98997 1.86996 8.98597 1.86796 8.98063 1.86596C8.9693 1.86262 8.9453 1.85596 8.8993 1.85129C8.79663 1.83929 8.65597 1.83862 8.4133 1.83862H7.66997C7.4273 1.83862 7.28663 1.83929 7.18463 1.85129C7.13797 1.85596 7.11397 1.86262 7.10263 1.86596C7.0973 1.86796 7.09397 1.86996 7.09397 1.86996ZM7.99997 4.49996C9.01263 4.49996 9.8333 5.32062 9.8333 6.33329C9.8333 7.34596 9.01263 8.16662 7.99997 8.16662C6.9873 8.16662 6.16663 7.34596 6.16663 6.33329C6.16663 5.32062 6.9873 4.49996 7.99997 4.49996ZM6.0993 10.9166C5.9613 11.156 5.6553 11.238 5.41663 11.0993C5.1773 10.9613 5.09597 10.6553 5.23397 10.416C5.7853 9.46262 6.8173 8.81996 7.99997 8.81996C9.18263 8.81996 10.2146 9.46262 10.766 10.416C10.9046 10.6553 10.8226 10.9613 10.584 11.0993C10.3446 11.238 10.0386 11.156 9.90063 10.9166C9.52063 10.26 8.8113 9.81996 7.99997 9.81996C7.18863 9.81996 6.4793 10.26 6.0993 10.9166ZM7.16663 6.33329C7.16663 6.79329 7.53997 7.16662 7.99997 7.16662C8.46063 7.16662 8.8333 6.79329 8.8333 6.33329C8.8333 5.87329 8.46063 5.49996 7.99997 5.49996C7.53997 5.49996 7.16663 5.87329 7.16663 6.33329Z\"\n fill=\"#717680\"\n />\n </svg>\n <span className=\"profile-role\">{currentRole}</span>\n </div>\n <div className=\"d-flex flex-row\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke=\"var(--color-brand-500, #22C55E)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div\n className={`role-arrow ${\n roleDropdownExpanded ? \"expanded\" : \"\"\n }`}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.74976 8.00037C9.81538 8.00037 9.88053 7.98737 9.94116 7.96228C10.0018 7.93718 10.0569 7.90023 10.1033 7.85388C10.1496 7.80751 10.1865 7.75234 10.2117 7.69177C10.2368 7.63115 10.2497 7.56598 10.2498 7.50037C10.2498 7.43469 10.2368 7.36964 10.2117 7.30896C10.1865 7.24827 10.1497 7.1933 10.1033 7.14685L6.35327 3.39685C6.30685 3.35039 6.25184 3.31361 6.19116 3.28845C6.13048 3.26331 6.06544 3.24939 5.99976 3.24939C5.93412 3.24942 5.86899 3.26332 5.80835 3.28845C5.77819 3.30098 5.74944 3.3163 5.72241 3.33435L5.64624 3.39685L1.89624 7.14685C1.80256 7.24064 1.74976 7.3678 1.74976 7.50037C1.74981 7.63295 1.80248 7.76012 1.89624 7.85388C1.99 7.94764 2.11717 8.00031 2.24976 8.00037C2.38232 8.00037 2.50948 7.94756 2.60327 7.85388L5.99976 4.4574L9.39624 7.85388C9.44265 7.90029 9.49773 7.93714 9.55835 7.96228C9.61897 7.98739 9.68414 8.00034 9.74976 8.00037Z\"\n fill=\"#414651\"\n stroke=\"#414651\"\n strokeWidth=\"0.25\"\n />\n </svg>\n </div>\n </div>\n </div>\n </a>\n ) : (\n <div className=\"dropdown-item profile-info w-full\">\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"d-flex flex-row user-info-content\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.64663 0.838623H8.43663C8.64797 0.838623 8.84663 0.838623 9.01263 0.85729C9.19797 0.878623 9.39263 0.927956 9.57463 1.05929C9.75597 1.18996 9.86397 1.35996 9.94263 1.52862C10.0133 1.68062 10.076 1.86929 10.1426 2.06996L10.15 2.09129L10.3686 2.74462C10.432 2.90396 10.542 3.03996 10.6846 3.13396L10.8866 3.24996C11.0553 3.33396 11.2473 3.35796 11.4313 3.31796L12.232 3.09262L12.2553 3.08596C12.474 3.02396 12.678 2.96596 12.854 2.93796C13.05 2.90662 13.2646 2.90262 13.486 2.99262C13.7073 3.08262 13.858 3.23529 13.9766 3.39396C14.0833 3.53662 14.19 3.72129 14.3033 3.91862L14.6566 4.53196C14.7633 4.71662 14.8633 4.88996 14.93 5.04462C15.0046 5.21662 15.06 5.41129 15.036 5.63596C15.0126 5.85996 14.9186 6.03929 14.8093 6.19196C14.712 6.32929 14.578 6.47862 14.4353 6.63662L14.4206 6.65329L14.4193 6.65462L13.7453 7.40796C13.6613 7.52196 13.5733 7.77062 13.5733 8.00529C13.5733 8.23996 13.6613 8.48796 13.7453 8.60196L14.4206 9.35662L14.4353 9.37329C14.578 9.53196 14.712 9.68062 14.8093 9.81796C14.9186 9.97129 15.0126 10.15 15.036 10.3746C15.06 10.5986 15.0046 10.7933 14.93 10.966C14.8633 11.1206 14.7633 11.294 14.6566 11.4786L14.3033 12.092C14.19 12.2893 14.0833 12.4733 13.9766 12.616C13.858 12.7753 13.7073 12.9273 13.486 13.0173C13.2646 13.108 13.05 13.104 12.854 13.0726C12.678 13.0446 12.474 12.9866 12.2553 12.9246L12.232 12.918L11.4313 12.6926C11.2473 12.6526 11.0553 12.6766 10.8866 12.7606L10.6846 12.8766C10.542 12.9706 10.432 13.106 10.3686 13.2653L10.15 13.918L10.1426 13.94C10.076 14.1413 10.0133 14.3293 9.94263 14.4813C9.86397 14.6506 9.75597 14.82 9.57463 14.9513C9.39263 15.0826 9.19797 15.132 9.01263 15.1526C8.84663 15.172 8.64797 15.172 8.43663 15.172H7.64663C7.4353 15.172 7.2373 15.172 7.07063 15.1526C6.8853 15.132 6.69063 15.0826 6.50863 14.9513C6.3273 14.82 6.2193 14.6506 6.14063 14.4813C6.06997 14.3293 6.0073 14.1413 5.94063 13.94L5.9333 13.918L5.71463 13.2653C5.6513 13.106 5.5413 12.9706 5.39863 12.8766L5.19663 12.7606C5.02797 12.6766 4.83597 12.6526 4.65197 12.6926L3.8513 12.918L3.82797 12.9246C3.6093 12.9866 3.4053 13.0446 3.2293 13.0726C3.0333 13.104 2.81863 13.108 2.5973 13.0173C2.37597 12.9273 2.2253 12.7753 2.10663 12.616C1.99997 12.4733 1.8933 12.2893 1.77997 12.092L1.7673 12.07L1.42663 11.4786C1.31997 11.294 1.21997 11.1206 1.1533 10.966C1.07863 10.7933 1.0233 10.5986 1.0473 10.3746C1.07063 10.15 1.1653 9.97129 1.27397 9.81796C1.3713 9.68062 1.5053 9.53196 1.64797 9.37329L1.66263 9.35662L1.66397 9.35596L2.33797 8.60196C2.42197 8.48796 2.50997 8.23996 2.50997 8.00529C2.50997 7.77062 2.42197 7.52196 2.33797 7.40796L1.66397 6.65462L1.66263 6.65329L1.64797 6.63662C1.5053 6.47862 1.3713 6.32929 1.27397 6.19196C1.1653 6.03929 1.07063 5.85996 1.0473 5.63596C1.0233 5.41129 1.07863 5.21662 1.1533 5.04462C1.21997 4.88996 1.31997 4.71662 1.42663 4.53196L1.43863 4.51129L1.7673 3.93996L1.77997 3.91862C1.89397 3.72129 1.99997 3.53662 2.10663 3.39396C2.2253 3.23529 2.37597 3.08262 2.5973 2.99262C2.81863 2.90262 3.0333 2.90662 3.2293 2.93796C3.4053 2.96596 3.6093 3.02396 3.82797 3.08596L3.85197 3.09262L4.65197 3.31796C4.83597 3.35796 5.02797 3.33396 5.19663 3.24996L5.39863 3.13396C5.5413 3.03996 5.6513 2.90396 5.71463 2.74462L5.9333 2.09262L5.94063 2.06996C6.0073 1.86929 6.06997 1.68062 6.14063 1.52862C6.2193 1.35996 6.3273 1.18996 6.50863 1.05929C6.69063 0.927956 6.8853 0.878623 7.07063 0.85729C7.23663 0.838623 7.4353 0.838623 7.64663 0.838623ZM7.09397 1.86996C7.09397 1.86996 7.0913 1.87262 7.08797 1.87662C7.08063 1.88662 7.0673 1.90796 7.0473 1.94996C7.00397 2.04396 6.95863 2.17729 6.88197 2.40796L6.65597 3.08396L6.65197 3.09396C6.51197 3.45929 6.25863 3.77062 5.9293 3.98129L5.9193 3.98729L5.67463 4.12929L5.6633 4.13462C5.2793 4.33196 4.83797 4.38729 4.41663 4.28996L4.4053 4.28729L3.5793 4.05462C3.32797 3.98329 3.18197 3.94262 3.07197 3.92529C3.02263 3.91729 2.99597 3.91729 2.9833 3.91796C2.9773 3.91796 2.97463 3.91862 2.97463 3.91862L2.97397 3.91929C2.97397 3.91929 2.9713 3.92062 2.96663 3.92462C2.95663 3.93329 2.93797 3.95196 2.90797 3.99262C2.8413 4.08196 2.76463 4.21329 2.63397 4.43929L2.30463 5.01062C2.18263 5.22329 2.11263 5.34596 2.07063 5.44196C2.05197 5.48529 2.0453 5.50929 2.0433 5.52129C2.04197 5.52729 2.04197 5.53062 2.04197 5.53062V5.53129V5.53262C2.04197 5.53262 2.04263 5.53529 2.0453 5.54062C2.04997 5.55196 2.0613 5.57396 2.08863 5.61262C2.1493 5.69796 2.2433 5.80329 2.4073 5.98596L2.40797 5.98662L3.10597 6.76662L3.1153 6.77862C3.36463 7.09462 3.50997 7.57996 3.50997 8.00529C3.50997 8.42996 3.36463 8.91529 3.1153 9.23196L3.10597 9.24396L2.40797 10.0233L2.4073 10.0246C2.2433 10.2066 2.1493 10.3126 2.08863 10.398C2.0613 10.436 2.04997 10.4586 2.0453 10.4693C2.04263 10.4746 2.04197 10.478 2.04197 10.478V10.4786V10.48C2.04197 10.48 2.04197 10.4833 2.0433 10.4886C2.0453 10.5006 2.05197 10.5253 2.07063 10.5686C2.11263 10.664 2.18263 10.7873 2.30463 11L2.63397 11.5706C2.76463 11.7973 2.8413 11.9286 2.90797 12.018C2.93797 12.058 2.95663 12.0773 2.96663 12.0853C2.9713 12.0893 2.97397 12.0913 2.97397 12.0913C2.97397 12.0913 2.9773 12.092 2.9833 12.0926C2.99597 12.0933 3.02263 12.0926 3.07197 12.0853C3.18197 12.0673 3.32797 12.0266 3.5793 11.956L4.4053 11.7226L4.41663 11.72C4.83797 11.6233 5.2793 11.6786 5.66397 11.876L5.67463 11.8813L5.9193 12.0226L5.9293 12.0293C6.25863 12.24 6.51197 12.5506 6.65197 12.916L6.65597 12.926L6.88197 13.602C6.95863 13.8333 7.00397 13.9666 7.0473 14.0606C7.0673 14.1026 7.08063 14.124 7.08797 14.1333C7.0913 14.138 7.09397 14.14 7.09397 14.14V14.1406C7.09397 14.1406 7.0973 14.1426 7.10263 14.144C7.11397 14.148 7.13797 14.154 7.18463 14.1593C7.28663 14.1713 7.4273 14.172 7.66997 14.172H8.4133C8.65597 14.172 8.79663 14.1713 8.8993 14.1593C8.9453 14.154 8.9693 14.148 8.98063 14.144C8.98263 14.1433 8.98463 14.1426 8.98597 14.142C8.9873 14.1413 8.98863 14.1413 8.98863 14.1413L8.98997 14.14C8.98997 14.14 8.99197 14.138 8.9953 14.1333C9.00263 14.124 9.01597 14.1026 9.03597 14.0606C9.0793 13.9666 9.12463 13.8333 9.2013 13.602L9.42797 12.926L9.4313 12.916C9.5713 12.5506 9.82463 12.24 10.154 12.0293L10.164 12.0226L10.4086 11.8813L10.42 11.876C10.804 11.6786 11.2453 11.6233 11.6666 11.72L11.678 11.7226L12.504 11.956C12.7553 12.0266 12.9013 12.0673 13.0113 12.0853C13.0606 12.0926 13.0873 12.0933 13.1 12.0926C13.106 12.092 13.1086 12.0913 13.1086 12.0913C13.1086 12.0913 13.112 12.0893 13.1166 12.0853C13.1266 12.0773 13.1453 12.058 13.1753 12.018C13.242 11.9286 13.3186 11.7973 13.4493 11.5706L13.7786 11C13.9006 10.7873 13.9706 10.664 14.0126 10.5686C14.0313 10.5253 14.038 10.5006 14.04 10.4886C14.0413 10.4833 14.0413 10.48 14.0413 10.48V10.4786V10.478C14.0413 10.478 14.0406 10.4746 14.0386 10.4693C14.0333 10.4586 14.022 10.436 13.9946 10.398C13.934 10.3126 13.84 10.2066 13.676 10.0246L12.9773 9.24396L12.968 9.23196C12.7186 8.91529 12.5733 8.42996 12.5733 8.00529C12.5733 7.57996 12.7186 7.09462 12.968 6.77862L12.9773 6.76662L13.6753 5.98662L13.676 5.98596C13.84 5.80329 13.934 5.69796 13.9946 5.61262C14.022 5.57396 14.0333 5.55196 14.0386 5.54062C14.0406 5.53529 14.0413 5.53262 14.0413 5.53262V5.53129V5.53062C14.0413 5.53062 14.0413 5.52729 14.04 5.52129C14.038 5.50929 14.0313 5.48529 14.0126 5.44196C13.9706 5.34596 13.9006 5.22329 13.7786 5.01062L13.4493 4.43929C13.3186 4.21329 13.242 4.08196 13.1753 3.99262C13.1453 3.95196 13.1266 3.93329 13.1166 3.92462C13.112 3.92062 13.1093 3.91929 13.1093 3.91929L13.1086 3.91862C13.1086 3.91862 13.106 3.91796 13.1 3.91796C13.0873 3.91729 13.0606 3.91729 13.0113 3.92529C12.9013 3.94262 12.7553 3.98329 12.504 4.05462L11.678 4.28729L11.6666 4.28996C11.2453 4.38729 10.804 4.33196 10.42 4.13462L10.4093 4.12929L10.164 3.98729L10.154 3.98129C9.82463 3.77062 9.5713 3.45929 9.4313 3.09396L9.42797 3.08396L9.2013 2.40796C9.12463 2.17729 9.0793 2.04396 9.03597 1.94996C9.01597 1.90796 9.00263 1.88662 8.9953 1.87662C8.99197 1.87262 8.98997 1.86996 8.98997 1.86996C8.98997 1.86996 8.98597 1.86796 8.98063 1.86596C8.9693 1.86262 8.9453 1.85596 8.8993 1.85129C8.79663 1.83929 8.65597 1.83862 8.4133 1.83862H7.66997C7.4273 1.83862 7.28663 1.83929 7.18463 1.85129C7.13797 1.85596 7.11397 1.86262 7.10263 1.86596C7.0973 1.86796 7.09397 1.86996 7.09397 1.86996ZM7.99997 4.49996C9.01263 4.49996 9.8333 5.32062 9.8333 6.33329C9.8333 7.34596 9.01263 8.16662 7.99997 8.16662C6.9873 8.16662 6.16663 7.34596 6.16663 6.33329C6.16663 5.32062 6.9873 4.49996 7.99997 4.49996ZM6.0993 10.9166C5.9613 11.156 5.6553 11.238 5.41663 11.0993C5.1773 10.9613 5.09597 10.6553 5.23397 10.416C5.7853 9.46262 6.8173 8.81996 7.99997 8.81996C9.18263 8.81996 10.2146 9.46262 10.766 10.416C10.9046 10.6553 10.8226 10.9613 10.584 11.0993C10.3446 11.238 10.0386 11.156 9.90063 10.9166C9.52063 10.26 8.8113 9.81996 7.99997 9.81996C7.18863 9.81996 6.4793 10.26 6.0993 10.9166ZM7.16663 6.33329C7.16663 6.79329 7.53997 7.16662 7.99997 7.16662C8.46063 7.16662 8.8333 6.79329 8.8333 6.33329C8.8333 5.87329 8.46063 5.49996 7.99997 5.49996C7.53997 5.49996 7.16663 5.87329 7.16663 6.33329Z\"\n fill=\"#717680\"\n />\n </svg>\n <span className=\"text-[12px] profile-role\">\n {currentRole}\n </span>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <g clip-path=\"url(#clip0_1427_340)\">\n <path\n d=\"M6 11.375C3.0315 11.375 0.625 8.9685 0.625 6C0.625 3.0315 3.0315 0.625 6 0.625C8.9685 0.625 11.375 3.0315 11.375 6C11.375 8.9685 8.9685 11.375 6 11.375ZM1.375 6C1.375 8.5545 3.4455 10.625 6 10.625C8.5545 10.625 10.625 8.5545 10.625 6C10.625 3.4455 8.5545 1.375 6 1.375C3.4455 1.375 1.375 3.4455 1.375 6ZM8.2765 4.7535L5.5265 7.7535C5.4575 7.829 5.3605 7.8725 5.258 7.875C5.156 7.877 5.057 7.8375 4.985 7.765L3.735 6.515C3.5885 6.3685 3.5885 6.1315 3.735 5.985C3.8815 5.8385 4.1185 5.8385 4.265 5.985L5.238 6.958L7.7235 4.2465C7.8635 4.094 8.1005 4.0835 8.2535 4.2235C8.406 4.3635 8.4165 4.6005 8.2765 4.7535Z\"\n fill=\"#17B26A\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1427_340\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </div>\n </div>\n )}\n </li>\n )} */}\n\n {/* Other Roles Section */}\n {otherRoles.length > 0 && roleDropdownExpanded && (\n <li>\n <div className=\"profile-roles complete-hidden-scroll-style\">\n {otherRoles.map((role, index) => (\n <div\n key={index}\n className=\"dropdown-item profile-each-role\"\n onClick={() => handleRoleSwitch(role.url)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <g clipPath=\"url(#clip0_1427_392)\">\n <path\n d=\"M0.833374 7.99998C0.833374 4.04198 4.04204 0.833313 8.00004 0.833313C11.958 0.833313 15.1667 4.04198 15.1667 7.99998C15.1667 11.958 11.958 15.1666 8.00004 15.1666C4.04204 15.1666 0.833374 11.958 0.833374 7.99998ZM8.00004 1.83331C4.59404 1.83331 1.83337 4.59398 1.83337 7.99998C1.83337 9.58131 2.42804 11.0233 3.40671 12.1146L3.60604 11.7646C4.28871 10.5706 5.55871 9.83331 6.93471 9.83331H9.06604C10.4414 9.83331 11.7114 10.5706 12.394 11.7646L12.5934 12.114C13.572 11.0226 14.1667 9.58065 14.1667 7.99998C14.1667 4.59398 11.406 1.83331 8.00004 1.83331ZM11.8454 12.8206L11.5254 12.2606C11.0214 11.378 10.0827 10.8333 9.06604 10.8333H6.93471C5.91804 10.8333 4.97871 11.378 4.47471 12.2606L4.15471 12.8213C5.20871 13.6633 6.54537 14.1666 8.00004 14.1666C9.45471 14.1666 10.7914 13.6633 11.8454 12.8206ZM5.66671 6.33331C5.66671 5.04465 6.71137 3.99998 8.00004 3.99998C9.28871 3.99998 10.3334 5.04465 10.3334 6.33331C10.3334 7.62198 9.28871 8.66665 8.00004 8.66665C6.71137 8.66665 5.66671 7.62198 5.66671 6.33331ZM8.00004 4.99998C7.26337 4.99998 6.66671 5.59665 6.66671 6.33331C6.66671 7.06998 7.26337 7.66665 8.00004 7.66665C8.73671 7.66665 9.33337 7.06998 9.33337 6.33331C9.33337 5.59665 8.73671 4.99998 8.00004 4.99998Z\"\n fill=\"#717680\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1427_392\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <span className=\"label\">{role.label}</span>\n </div>\n ))}\n </div>\n </li>\n )}\n\n {/* Divider */}\n <li>\n <hr className=\"profile-dropdown-divider\" />\n </li>\n\n {/* Custom menu items */}\n {customMenuItems.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n \n {/* View Profile */}\n {showViewProfile && (\n <li>\n <TopbarViewProfileButton onViewProfile={handleViewProfile} />\n </li>\n )}\n\n {/* Log Out */}\n {showLogout && (\n <li>\n <TopbarLogoutButton onLogout={handleLogout} />\n </li>\n )}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* User Profile Drawer or Custom View Profile */}\n {customViewProfile ? (\n customViewProfile({\n user: profileInfo,\n isOpen: userDrawerOpen,\n onClose: () => setUserDrawerOpen(false)\n })\n ) : (\n <UserProfileDrawer\n isOpen={userDrawerOpen}\n onClose={() => setUserDrawerOpen(false)}\n profileData={profileData}\n />\n )}\n </header>\n );\n};\n\nexport default Topbar;","import type { LayoutConfigType, TopbarConfigType, NavbarConfigType, CustomComponentsType } from '../types/layout.types';\n\n/**\n * Default Layout Configuration\n *\n * Provides default values for all layout configuration options.\n * These defaults ensure backward compatibility and sensible fallbacks.\n */\n\nexport const defaultLayoutConfig: LayoutConfigType = {\n showTopbar: true,\n showNavbar: true,\n layoutType: 'wide',\n};\n\nexport const defaultTopbarConfig: TopbarConfigType = {\n showProfile: true,\n showLeftSection: true,\n showRightSection: true,\n customLeftContent: null,\n customRightContent: null,\n customProfileMenu: null,\n customTopbar: null,\n customViewProfile: null,\n profileMenuConfig: {\n showViewProfile: true,\n showLogout: true,\n showRoleSwitch: true,\n customMenuItems: [],\n },\n className: '',\n style: {},\n};\n\nexport const defaultNavbarConfig: NavbarConfigType = {\n showLogo: true,\n showMenu: true,\n isCollapsed: false,\n collapsible: false,\n customLogo: null,\n customMenuContent: null,\n customBottomContent: null,\n customNavbar: null,\n customMenu: null,\n menuConfig: {\n showIcons: true,\n showSubmenus: true,\n expandOnHover: false,\n customMenuItemRenderer: null,\n },\n className: '',\n style: {},\n};\n\nexport const defaultCustomComponents: CustomComponentsType = {\n Layout: null,\n Topbar: null,\n Navbar: null,\n ViewProfile: null,\n Logo: null,\n};\n\n/**\n * Merge configurations with defaults\n * Deep merges user config with defaults to ensure all properties exist\n */\nexport const mergeWithDefaults = (userConfig: any = {}, defaultConfig: any = {}): any => {\n const merged = { ...defaultConfig };\n \n Object.keys(userConfig).forEach(key => {\n if (userConfig[key] === undefined || userConfig[key] === null) {\n // Use default value if user value is null or undefined\n return;\n }\n \n // Check if it's a React element/component (has $$typeof or is a function component)\n const isReactElement = userConfig[key] && (\n userConfig[key].$$typeof || \n typeof userConfig[key] === 'function'\n );\n \n // Don't try to merge React elements, functions, or arrays\n if (isReactElement || \n typeof userConfig[key] === 'function' || \n Array.isArray(userConfig[key])) {\n merged[key] = userConfig[key];\n } else if (typeof userConfig[key] === 'object' && \n typeof defaultConfig[key] === 'object' && \n !Array.isArray(defaultConfig[key])) {\n // Recursively merge nested objects (but not React elements)\n merged[key] = mergeWithDefaults(userConfig[key], defaultConfig[key]);\n } else {\n // Direct assignment for primitives\n merged[key] = userConfig[key];\n }\n });\n \n return merged;\n};\n\n/**\n * Get complete configuration\n * Merges all user configurations with defaults\n */\ninterface GetCompleteConfigParams {\n layoutConfig?: LayoutConfigType;\n topbarConfig?: TopbarConfigType;\n navbarConfig?: NavbarConfigType;\n customComponents?: CustomComponentsType;\n}\n\nexport const getCompleteConfig = ({\n layoutConfig = {},\n topbarConfig = {},\n navbarConfig = {},\n customComponents = {},\n}: GetCompleteConfigParams = {}): any => {\n return {\n layout: mergeWithDefaults(layoutConfig, defaultLayoutConfig),\n topbar: mergeWithDefaults(topbarConfig, defaultTopbarConfig),\n navbar: mergeWithDefaults(navbarConfig, defaultNavbarConfig),\n components: mergeWithDefaults(customComponents, defaultCustomComponents),\n };\n};","import React, { useEffect } from 'react';\nimport { Outlet, useLocation } from 'react-router-dom';\nimport Navbar from './Navbar';\nimport Topbar from './Topbar';\nimport { useAppContext } from '../../contexts/AppContext';\nimport { mergeWithDefaults, defaultLayoutConfig, defaultTopbarConfig, defaultNavbarConfig } from '../../config/defaultLayoutConfig';\nimport './Layout.css';\n\nconst Layout: React.FC = () => {\n const { \n loading, \n error, \n menu, \n profileInfo, \n appLogo, \n theme = {},\n layoutConfig = {},\n topbarConfig = {},\n navbarConfig = {},\n customComponents = {}\n } = useAppContext();\n const location = useLocation();\n \n // Merge configurations with defaults\n const finalLayoutConfig = mergeWithDefaults(layoutConfig, defaultLayoutConfig);\n const finalTopbarConfig = mergeWithDefaults(topbarConfig, defaultTopbarConfig);\n const finalNavbarConfig = mergeWithDefaults(navbarConfig, defaultNavbarConfig);\n \n // Use global navigation handler for internal links\n // useGlobalNavigationHandler();\n \n // Show/hide loader functions\n const showLoader = () => {\n const contentSpinner = document.getElementById('contentSpinner');\n \n if (contentSpinner) {\n contentSpinner.classList.add('active');\n }\n };\n \n const hideLoader = () => {\n const contentSpinner = document.getElementById('contentSpinner');\n \n if (contentSpinner) {\n contentSpinner.classList.remove('active');\n }\n };\n \n // Handle route changes\n useEffect(() => {\n \n // Show loader immediately when route changes\n showLoader();\n \n // Minimum loader display time to prevent flashing\n const minDisplayTime = 300;\n const startTime = Date.now();\n \n // Hide loader after ensuring minimum display time\n const timer = setTimeout(() => {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime >= minDisplayTime) {\n hideLoader();\n } else {\n // Wait for remaining time before hiding\n setTimeout(hideLoader, minDisplayTime - elapsedTime);\n }\n }, 500); // Reduced from 800ms for better UX\n \n return () => {\n clearTimeout(timer);\n };\n }, [location.pathname]);\n \n // Show page loader on navigation (for page refresh)\n useEffect(() => {\n // Listen for navigation events\n window.addEventListener('beforeunload', showLoader);\n \n return () => {\n window.removeEventListener('beforeunload', showLoader);\n };\n }, []);\n\n // Theme CSS variables are now handled in AppContext\n\n if (loading) {\n return <div className=\"layout-loading\">Loading...</div>;\n }\n\n if (error) {\n return <div className=\"layout-error\">Error: {error}</div>;\n }\n\n // Determine layout type from config or theme\n const layoutType = finalLayoutConfig.layoutType || theme?.layout || 'wide';\n // Check if navbar should be displayed\n const displaySidebar = finalLayoutConfig.showNavbar && theme?.menu_config?.display_sidebar !== false;\n // Check if topbar should be displayed\n const displayTopbar = finalLayoutConfig.showTopbar;\n\n // Check for custom component overrides\n const CustomLayout = customComponents?.Layout;\n const CustomTopbar = customComponents?.Topbar || finalTopbarConfig.customTopbar;\n const CustomNavbar = customComponents?.Navbar || finalNavbarConfig.customNavbar;\n \n // If custom layout is provided, use it\n if (CustomLayout) {\n return (\n <CustomLayout \n menu={menu}\n profileInfo={profileInfo}\n appLogo={appLogo}\n theme={theme}\n layoutConfig={finalLayoutConfig}\n topbarConfig={finalTopbarConfig}\n navbarConfig={finalNavbarConfig}\n >\n <Outlet />\n </CustomLayout>\n );\n }\n \n return (\n <div className={`layout layout-${layoutType}`}>\n <main className=\"layout-wrapper\">\n {displaySidebar && (\n CustomNavbar ? (\n <CustomNavbar \n menuItems={menu} \n appLogo={appLogo}\n theme={theme}\n config={finalNavbarConfig}\n />\n ) : (\n <Navbar \n menuItems={menu} \n appLogo={appLogo}\n theme={theme}\n config={finalNavbarConfig}\n />\n )\n )}\n <div className=\"layout-main\" style={{\n width: displaySidebar ? `calc(100vw - ${finalNavbarConfig.isCollapsed ? '80px' : '244px'})` : '100vw',\n transition: 'width 0.3s ease'\n }}>\n {displayTopbar && (\n CustomTopbar ? (\n <CustomTopbar \n profileInfo={profileInfo}\n theme={theme}\n config={finalTopbarConfig}\n />\n ) : (\n <Topbar \n profileInfo={profileInfo}\n theme={theme}\n config={finalTopbarConfig}\n />\n )\n )}\n <div className=\"layout-content\">\n <div className=\"content-spinner-container\" id=\"contentSpinner\">\n <div className=\"spinner\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\">\n <path d=\"M32 5.33331V16\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M43.2002 20.7999L50.9335 13.0665\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M48 32H58.6667\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M43.2002 43.2L50.9335 50.9333\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M32 48V58.6667\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.0664 50.9333L20.7997 43.2\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.33301 32H15.9997\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.0664 13.0665L20.7997 20.7999\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <Outlet />\n </div>\n </div>\n </main>\n </div>\n );\n};\n\nexport default Layout;","import React from 'react';\n\n/**\n * Get the appropriate component to render based on page type\n */\nexport const getRenderComponent = (\n pageType: string | null,\n registry: Record<string, any>,\n context: Record<string, any>\n): React.ReactElement => {\n // Handle null/undefined pageType\n if (!pageType) {\n const defaultConfig = registry.default;\n if (defaultConfig?.component) {\n return React.createElement(defaultConfig.component, { message: 'No page type specified' });\n }\n return React.createElement('div', { style: { padding: '24px', color: '#f04438' } }, 'No page type specified');\n }\n\n const config = registry[pageType] || registry.default;\n\n // Handle missing config\n if (!config) {\n return React.createElement('div', { style: { padding: '24px', color: '#f04438' } }, `Unknown page type: ${pageType}`);\n }\n\n // If there's a custom handler, use it\n if (config.handler) {\n return config.handler(context);\n }\n\n // Check if component exists\n if (!config.component) {\n // If no component and no handler, fall back to default\n const defaultConfig = registry.default;\n if (defaultConfig?.component) {\n const defaultProps = defaultConfig.propsBuilder\n ? defaultConfig.propsBuilder({ ...context, pageType })\n : { message: `No component configured for page type: ${pageType}` };\n return React.createElement(defaultConfig.component, defaultProps);\n }\n return React.createElement('div', { style: { padding: '24px', color: '#f04438' } }, `No component configured for page type: ${pageType}`);\n }\n\n // Build props using the propsBuilder if provided\n let props = config.propsBuilder ? config.propsBuilder({ ...context, pageType }) : {};\n\n // Add basePath by default unless explicitly set to false\n // Default to true if includeBasePath is not specified\n const includeBasePath = config.includeBasePath !== false;\n\n if (includeBasePath && context.matchedRoutePath) {\n props = {\n basePath: context.matchedRoutePath,\n ...props\n };\n }\n\n // Render the component\n const Component = config.component;\n return React.createElement(Component, props);\n};","import React, { useState, useEffect } from 'react';\nimport { useLocation, matchPath } from 'react-router-dom';\nimport { useAppContext } from '../contexts/AppContext';\nimport { useApiConfig } from '../utils/apiConfigHelper';\nimport { getRenderComponent } from './getRenderComponent';\nimport type { RouteConfig } from '../../types';\n\ninterface PageTypeRouterProps {\n customPages?: Record<string, any>;\n forceRoute?: RouteConfig;\n}\n\ninterface RouteConfigState {\n pageType: string | null;\n customPagePath: string | null;\n matchedRoutePath: string | null;\n loading: boolean;\n}\n\n/**\n * PageTypeRouter - Dynamic routing component that determines which page component to render\n * based on the current URL and route configuration from the API\n */\nconst PageTypeRouter: React.FC<PageTypeRouterProps> = ({ customPages = {}, forceRoute }) => {\n const location = useLocation();\n const { routes, pageTypeRegistry, registryLoading, registryError, initializerEndpoint } = useAppContext();\n const apiConfig = useApiConfig();\n \n // Route configuration state\n const [routeConfig, setRouteConfig] = useState<RouteConfigState>({\n pageType: null,\n customPagePath: null,\n matchedRoutePath: null,\n loading: true\n });\n\n useEffect(() => {\n // Set loading state immediately when route changes\n setRouteConfig(prev => ({ ...prev, loading: true }));\n\n const determinePageType = () => {\n const currentPath = location.pathname;\n\n // If forceRoute is provided, use it directly (for standalone pages)\n if (forceRoute) {\n setRouteConfig({\n pageType: forceRoute.page_type,\n customPagePath: forceRoute.component || null,\n matchedRoutePath: forceRoute.path,\n loading: false\n });\n return;\n }\n \n // Priority 1: Check if page_type was passed via navigation state\n // This allows direct navigation with pre-determined page types\n if (location.state && location.state.page_type && \n (location.state.page_type !== 'custom' || location.state.custom_page_path)) {\n \n // Find the matching route to get the base path\n let matchedRoutePath = currentPath;\n if (routes && routes.length > 0) {\n for (const route of routes) {\n if (currentPath === route.path || currentPath.startsWith(route.path + '/')) {\n matchedRoutePath = route.path;\n break;\n }\n }\n }\n \n setRouteConfig({\n pageType: location.state.page_type,\n customPagePath: location.state.custom_page_path || null,\n matchedRoutePath: matchedRoutePath,\n loading: false\n });\n return;\n }\n \n // Priority 2: Match current path with routes from API configuration\n if (routes && routes.length > 0) {\n \n \n // Sort routes by specificity - routes with more segments are checked first\n // This ensures /app/patients/profile matches before /app/patients\n const sortedRoutes = [...routes].sort((a, b) => {\n const aSegments = a.path.split('/').filter(s => s).length;\n const bSegments = b.path.split('/').filter(s => s).length;\n return bSegments - aSegments;\n });\n \n for (const route of sortedRoutes) {\n // Try exact match first\n let match = matchPath(\n { path: route.path, exact: true },\n currentPath\n );\n \n // For all page types: allow prefix matching for nested routes\n if (!match && currentPath.startsWith(route.path + '/')) {\n const prefixPath = route.path.endsWith('/*') ? route.path : `${route.path}/*`;\n match = matchPath(\n { path: prefixPath, exact: false },\n currentPath\n );\n }\n \n if (match) {\n // Route matched - set the configuration\n setRouteConfig({\n pageType: route.page_type,\n customPagePath: route.component || null,\n matchedRoutePath: route.path,\n loading: false\n });\n return;\n }\n }\n }\n \n // No route matched - show 404 page\n setRouteConfig({\n pageType: '404',\n customPagePath: null,\n matchedRoutePath: null,\n loading: false\n });\n };\n\n determinePageType();\n }, [location, routes, forceRoute]);\n\n // Show loading state while determining route or loading registry\n if (routeConfig.loading || registryLoading) {\n return (\n <div className=\"content-spinner-container active\">\n <div className=\"spinner\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\">\n <path d=\"M32 5.33331V16\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M43.2002 20.7999L50.9335 13.0665\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M48 32H58.6667\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M43.2002 43.2L50.9335 50.9333\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M32 48V58.6667\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.0664 50.9333L20.7997 43.2\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.33301 32H15.9997\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.0664 13.0665L20.7997 20.7999\" stroke=\"var(--color-brand-500, #5048ED)\" strokeWidth=\"5.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n </div>\n );\n }\n\n // Show error state if registry failed to load\n if (registryError) {\n return (\n <div style={{ padding: '24px', color: '#f04438' }}>\n Failed to load page registry: {registryError}\n </div>\n );\n }\n\n // Show error state if registry is not available\n if (!pageTypeRegistry) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '60vh',\n textAlign: 'center',\n padding: '24px'\n }}>\n <div style={{\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '32px',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.05)',\n maxWidth: '500px',\n width: '100%',\n border: '1px solid #e1e3e6'\n }}>\n <h1 style={{\n fontSize: '32px',\n margin: '0',\n color: '#f04438',\n fontWeight: 'bold',\n lineHeight: '1'\n }}>\n ⚠️\n </h1>\n <h3 style={{\n fontSize: '18px',\n margin: '12px 0',\n color: '#252b37',\n fontWeight: '600'\n }}>\n Configuration Issue\n </h3>\n <p style={{\n fontSize: '14px',\n color: '#717680',\n marginBottom: '16px',\n lineHeight: '1.5'\n }}>\n Unable to load page configuration from:\n </p>\n <code style={{\n display: 'block',\n backgroundColor: '#f9fafb',\n border: '1px solid #e1e3e6',\n borderRadius: '4px',\n padding: '8px 12px',\n fontSize: '12px',\n color: '#252b37',\n fontFamily: 'Monaco, Menlo, monospace',\n marginBottom: '16px',\n wordBreak: 'break-all'\n }}>\n {initializerEndpoint}\n </code>\n <p style={{\n fontSize: '13px',\n color: '#8b909a',\n margin: '0'\n }}>\n Please check your configuration or contact your administrator.\n </p>\n </div>\n </div>\n );\n }\n\n const { pageType, customPagePath, matchedRoutePath } = routeConfig;\n\n // Create a unique key for each page type and path combination to force re-render\n const componentKey = `${pageType}-${customPagePath || 'default'}-${matchedRoutePath || 'none'}`;\n\n // Use the dynamic registry to render the appropriate component with key for proper re-rendering\n return (\n <div className='h-full' key={componentKey}>\n {getRenderComponent(pageType, pageTypeRegistry, {\n matchedRoutePath,\n customPagePath,\n customPages,\n location,\n apiConfig\n })}\n </div>\n );\n};\n\nexport default PageTypeRouter;","import { useEffect, useRef } from 'react';\nimport { useAppContext } from '../contexts/AppContext';\nimport { getApiUrl } from '../utils/apiHelpers';\n\n/**\n * Component that manages document head elements (title, favicon, meta tags)\n * based on metadata from the app-initialize API with error handling and performance optimization\n */\nconst DocumentHead: React.FC = () => {\n const { metadata, appName, apiConfig, theme } = useAppContext();\n const cleanupRefs = useRef<Set<HTMLElement>>(new Set());\n\n // Cleanup function to remove dynamically created elements\n const cleanupElements = () => {\n cleanupRefs.current.forEach(element => {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n });\n cleanupRefs.current.clear();\n };\n\n // Helper function to create or update element with cleanup tracking\n const createOrUpdateElement = <T extends HTMLElement>(\n selector: string,\n createElement: () => T,\n updateElement: (element: T) => void\n ): T => {\n let element = document.querySelector(selector) as T | null;\n if (!element) {\n element = createElement();\n document.head.appendChild(element);\n cleanupRefs.current.add(element);\n }\n updateElement(element);\n return element;\n };\n\n // Helper function to preload assets with error handling\n const preloadAsset = (url: string, type: 'image' | 'font' = 'image'): Promise<void> => {\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = type;\n link.href = url;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Failed to preload ${type}: ${url}`));\n\n // Add to cleanup refs for potential removal\n cleanupRefs.current.add(link);\n document.head.appendChild(link);\n\n // Remove preload link after 10 seconds to avoid cluttering the head\n setTimeout(() => {\n if (link.parentNode) {\n link.parentNode.removeChild(link);\n cleanupRefs.current.delete(link);\n }\n }, 10000);\n });\n };\n\n useEffect(() => {\n if (!metadata) return;\n\n // Cleanup previous elements when metadata changes\n cleanupElements();\n\n // Helper function to get full URL for assets with fallback\n const getAssetUrl = (path: string | undefined, fallback?: string): string | null => {\n if (!path) return fallback || null;\n // If path is already absolute, return as is\n if (path.startsWith('http://') || path.startsWith('https://') || path.startsWith('//')) {\n return path;\n }\n // Otherwise, use the API helper to build the URL\n try {\n return getApiUrl(path, apiConfig);\n } catch (error) {\n console.warn(`Failed to build asset URL for ${path}:`, error);\n return fallback || null;\n }\n };\n\n // Update document title\n if (metadata.title) {\n document.title = metadata.title;\n } else if (appName) {\n document.title = appName;\n }\n\n // Update or create meta description\n if (metadata.description) {\n createOrUpdateElement(\n 'meta[name=\"description\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'description';\n return meta;\n },\n (meta) => {\n meta.content = metadata.description;\n }\n );\n }\n\n // Update or create meta keywords\n if (metadata.keywords) {\n createOrUpdateElement(\n 'meta[name=\"keywords\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'keywords';\n return meta;\n },\n (meta) => {\n meta.content = metadata.keywords;\n }\n );\n }\n\n // Add viewport meta tag if not present\n createOrUpdateElement(\n 'meta[name=\"viewport\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'viewport';\n return meta;\n },\n (meta) => {\n meta.content = 'width=device-width, initial-scale=1.0';\n }\n );\n\n // Add theme-color meta tag based on primary color\n if (theme?.colors?.primary) {\n createOrUpdateElement(\n 'meta[name=\"theme-color\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'theme-color';\n return meta;\n },\n (meta) => {\n meta.content = theme.colors.primary;\n }\n );\n }\n\n // Update favicon (ico format) with error handling\n if (metadata.favicon) {\n const faviconUrl = getAssetUrl(metadata.favicon, '/favicon.ico');\n if (faviconUrl) {\n createOrUpdateElement(\n 'link[rel=\"icon\"][type=\"image/x-icon\"], link[rel=\"shortcut icon\"]',\n () => {\n const link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/x-icon';\n return link;\n },\n (link) => {\n link.href = faviconUrl;\n // Preload favicon for better performance\n preloadAsset(faviconUrl).catch(error =>\n console.warn('Failed to preload favicon:', error.message)\n );\n }\n );\n }\n }\n\n // Update favicon (png format) with error handling\n if (metadata.favicon_png) {\n const faviconPngUrl = getAssetUrl(metadata.favicon_png, '/favicon-32x32.png');\n if (faviconPngUrl) {\n createOrUpdateElement(\n 'link[rel=\"icon\"][type=\"image/png\"]',\n () => {\n const link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/png';\n link.sizes = '32x32';\n return link;\n },\n (link) => {\n link.href = faviconPngUrl;\n // Preload PNG favicon\n preloadAsset(faviconPngUrl).catch(error =>\n console.warn('Failed to preload PNG favicon:', error.message)\n );\n }\n );\n }\n }\n\n // Update Apple touch icon with error handling\n if (metadata.apple_touch_icon) {\n const appleTouchIconUrl = getAssetUrl(metadata.apple_touch_icon, '/apple-touch-icon.png');\n if (appleTouchIconUrl) {\n createOrUpdateElement(\n 'link[rel=\"apple-touch-icon\"]',\n () => {\n const link = document.createElement('link');\n link.rel = 'apple-touch-icon';\n return link;\n },\n (link) => {\n link.href = appleTouchIconUrl;\n // Preload Apple touch icon\n preloadAsset(appleTouchIconUrl).catch(error =>\n console.warn('Failed to preload Apple touch icon:', error.message)\n );\n }\n );\n }\n }\n\n // Update Open Graph meta tags with error handling\n if (metadata.og_image) {\n const ogImageUrl = getAssetUrl(metadata.og_image, '/og-image.png');\n\n if (ogImageUrl) {\n // Preload OG image for better social sharing performance\n preloadAsset(ogImageUrl).catch(error =>\n console.warn('Failed to preload OG image:', error.message)\n );\n\n // OG Image\n createOrUpdateElement(\n 'meta[property=\"og:image\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:image');\n return meta;\n },\n (meta) => {\n meta.content = ogImageUrl;\n }\n );\n\n // OG Image Alt\n if (metadata.og_image_alt || metadata.title) {\n createOrUpdateElement(\n 'meta[property=\"og:image:alt\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:image:alt');\n return meta;\n },\n (meta) => {\n meta.content = metadata.og_image_alt || metadata.title || appName || 'Zango CRM';\n }\n );\n }\n }\n }\n\n // OG Title - always set\n createOrUpdateElement(\n 'meta[property=\"og:title\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:title');\n return meta;\n },\n (meta) => {\n meta.content = metadata.title || appName || 'Zango CRM';\n }\n );\n\n // OG Description\n if (metadata.description) {\n createOrUpdateElement(\n 'meta[property=\"og:description\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:description');\n return meta;\n },\n (meta) => {\n meta.content = metadata.description;\n }\n );\n }\n\n // OG Type\n createOrUpdateElement(\n 'meta[property=\"og:type\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:type');\n return meta;\n },\n (meta) => {\n meta.content = 'website';\n }\n );\n\n // OG URL - current page URL\n createOrUpdateElement(\n 'meta[property=\"og:url\"]',\n () => {\n const meta = document.createElement('meta');\n meta.setAttribute('property', 'og:url');\n return meta;\n },\n (meta) => {\n meta.content = window.location.href;\n }\n );\n\n // Add Twitter Card meta tags with enhanced handling\n createOrUpdateElement(\n 'meta[name=\"twitter:card\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'twitter:card';\n return meta;\n },\n (meta) => {\n meta.content = metadata.og_image ? 'summary_large_image' : 'summary';\n }\n );\n\n // Twitter Title\n createOrUpdateElement(\n 'meta[name=\"twitter:title\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'twitter:title';\n return meta;\n },\n (meta) => {\n meta.content = metadata.title || appName || 'Zango CRM';\n }\n );\n\n // Twitter Description\n if (metadata.description) {\n createOrUpdateElement(\n 'meta[name=\"twitter:description\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'twitter:description';\n return meta;\n },\n (meta) => {\n meta.content = metadata.description;\n }\n );\n }\n\n // Twitter Image\n if (metadata.og_image) {\n const twitterImageUrl = getAssetUrl(metadata.og_image, '/og-image.png');\n if (twitterImageUrl) {\n createOrUpdateElement(\n 'meta[name=\"twitter:image\"]',\n () => {\n const meta = document.createElement('meta');\n meta.name = 'twitter:image';\n return meta;\n },\n (meta) => {\n meta.content = twitterImageUrl;\n }\n );\n }\n }\n\n // Add canonical URL\n createOrUpdateElement(\n 'link[rel=\"canonical\"]',\n () => {\n const link = document.createElement('link');\n link.rel = 'canonical';\n return link;\n },\n (link) => {\n link.href = window.location.href.split('?')[0];\n }\n );\n\n // Add manifest link if available\n if (metadata.manifest || metadata.webmanifest) {\n const manifestUrl = getAssetUrl(metadata.manifest || metadata.webmanifest, '/manifest.json');\n if (manifestUrl) {\n createOrUpdateElement(\n 'link[rel=\"manifest\"]',\n () => {\n const link = document.createElement('link');\n link.rel = 'manifest';\n return link;\n },\n (link) => {\n link.href = manifestUrl;\n }\n );\n }\n }\n\n // Cleanup function when component unmounts or metadata changes\n return cleanupElements;\n\n }, [metadata, appName, theme]);\n\n // This component doesn't render anything\n return null;\n};\n\nexport default DocumentHead;","import { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\nimport { pingSession } from '../../services/api';\nimport { performLogout } from '../utils/logoutUtils';\nimport type { SessionSecurityConfig } from '../../types';\n\ninterface UseSessionSecurityOptions {\n config: SessionSecurityConfig;\n onExpire?: () => void;\n onWarning?: () => void;\n onActivity?: () => void;\n}\n\ninterface UseSessionSecurityReturn {\n showWarning: boolean;\n countdown: number;\n hideWarning: () => void;\n renewSession: () => void;\n logoutNow: () => void;\n}\n\nexport const useSessionSecurity = ({\n config,\n onExpire,\n onWarning,\n onActivity,\n}: UseSessionSecurityOptions): UseSessionSecurityReturn => {\n const [showWarning, setShowWarning] = useState(false);\n const [countdown, setCountdown] = useState(0);\n\n // Refs to track state across renders\n const lastActivityRef = useRef<Date>(new Date());\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const countdownIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const expiredRef = useRef(false);\n const counterStartedRef = useRef(false);\n const showWarningRef = useRef(false);\n\n // Store callbacks in refs to break circular dependencies\n const onExpireRef = useRef(onExpire);\n const onWarningRef = useRef(onWarning);\n const onActivityRef = useRef(onActivity);\n\n // Refs for circular function dependencies\n const applyRef = useRef<() => void>(() => { });\n const pingRef = useRef<() => void>(() => { });\n const pongRef = useRef<(data: any) => void>(() => { });\n const activityRef = useRef<() => void>(() => { });\n\n // Update refs when callbacks change\n useEffect(() => {\n onExpireRef.current = onExpire;\n onWarningRef.current = onWarning;\n onActivityRef.current = onActivity;\n }, [onExpire, onWarning, onActivity]);\n\n // Update showWarning ref when state changes\n useEffect(() => {\n showWarningRef.current = showWarning;\n }, [showWarning]);\n\n // Events to track for user activity\n const activityEvents = [\n 'mousemove',\n 'scroll',\n 'keyup',\n 'click',\n 'touchstart',\n 'touchend',\n 'touchmove',\n ];\n\n // Clear timeout only\n const clearTimer = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n // Handle session expiration\n const expire = useCallback(() => {\n expiredRef.current = true;\n clearTimer();\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n\n if (onExpireRef.current) {\n onExpireRef.current();\n }\n\n // Perform logout with preserveCurrentPath to redirect back after login\n performLogout({ preserveCurrentPath: true });\n }, [clearTimer]);\n\n // Hide warning dialog\n const hideWarning = useCallback(() => {\n setShowWarning(false);\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n counterStartedRef.current = false;\n }, []);\n\n // Start countdown timer when warning is shown\n const startCountdown = useCallback(() => {\n const { warn_after, expire_after } = config;\n const defaultTimeLeft = expire_after - warn_after;\n\n if (counterStartedRef.current) return;\n\n setCountdown(defaultTimeLeft);\n counterStartedRef.current = true;\n\n const targetTime = new Date();\n targetTime.setSeconds(targetTime.getSeconds() + defaultTimeLeft);\n\n countdownIntervalRef.current = setInterval(() => {\n const now = new Date().getTime();\n const distance = targetTime.getTime() - now;\n const seconds = Math.floor(distance / 1000);\n\n if (seconds > 0) {\n setCountdown(seconds);\n } else {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setCountdown(0);\n }\n }, 1000);\n }, [config]);\n\n // Stop countdown\n const stopCountdown = useCallback(() => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n counterStartedRef.current = false;\n const defaultTimeLeft = config.expire_after - config.warn_after;\n setCountdown(defaultTimeLeft);\n }, [config]);\n\n // Process ping response\n const pong = useCallback((data: any) => {\n\n if (data === 'logout' || data?.response === 'logout') {\n expire();\n return;\n }\n\n // Ignore server idle time - use local tracking only\n // Re-apply timer logic\n applyRef.current();\n }, [expire]);\n\n // Update pong ref - use useLayoutEffect to ensure it's set before useEffect runs\n useLayoutEffect(() => {\n pongRef.current = pong;\n }, [pong]);\n\n // Hit the ping endpoint with the number of seconds since last activity\n const ping = useCallback(async () => {\n const idleFor = Math.floor((new Date().getTime() - lastActivityRef.current.getTime()) / 1000);\n\n try {\n const result = await pingSession(config.ping_url, idleFor);\n if (result.success) {\n pongRef.current(result.response);\n } else {\n // On error, still re-apply\n applyRef.current();\n }\n } catch (error) {\n // In case of network error, still re-apply\n applyRef.current();\n }\n }, [config.ping_url]);\n\n // Update ping ref - use useLayoutEffect to ensure it's set before useEffect runs\n useLayoutEffect(() => {\n pingRef.current = ping;\n }, [ping]);\n\n // Main apply function that schedules pings and shows warnings\n const apply = useCallback(() => {\n clearTimer();\n\n const idleFor = Math.floor((new Date().getTime() - lastActivityRef.current.getTime()) / 1000);\n const { warn_after, expire_after } = config;\n\n\n let nextPing: number;\n\n if (idleFor >= expire_after) {\n expire();\n return;\n } else if (idleFor >= warn_after) {\n // Show warning\n if (!counterStartedRef.current) {\n startCountdown();\n }\n setShowWarning(true);\n if (onWarningRef.current) {\n onWarningRef.current();\n }\n nextPing = expire_after - idleFor;\n } else {\n // Hide warning if shown\n hideWarning();\n if (counterStartedRef.current) {\n stopCountdown();\n }\n nextPing = warn_after - idleFor;\n }\n\n // Cap timeout to max 32-bit unsigned int (setTimeout limitation)\n const milliseconds = Math.min(nextPing * 1000, 2147483647);\n\n\n // Schedule next ping\n timeoutRef.current = setTimeout(() => {\n pingRef.current();\n }, milliseconds);\n }, [config, clearTimer, expire, startCountdown, hideWarning, stopCountdown]);\n\n // Update apply ref - use useLayoutEffect to ensure it's set before useEffect runs\n useLayoutEffect(() => {\n applyRef.current = apply;\n }, [apply]);\n\n // Handle user activity\n const activity = useCallback(() => {\n const now = new Date();\n\n // Throttle to once per second\n if (now.getTime() - lastActivityRef.current.getTime() < 1000) {\n return;\n }\n\n const idleFor = Math.floor((now.getTime() - lastActivityRef.current.getTime()) / 1000);\n lastActivityRef.current = now;\n\n // Check if session has expired\n if (idleFor >= config.expire_after) {\n expire();\n return;\n }\n\n // If warning is visible, ping server immediately and hide warning\n if (showWarningRef.current) {\n pingRef.current();\n hideWarning();\n }\n\n if (onActivityRef.current) {\n onActivityRef.current();\n }\n }, [config.expire_after, expire, hideWarning]);\n\n // Update activity ref - use useLayoutEffect to ensure it's set before useEffect runs\n useLayoutEffect(() => {\n activityRef.current = activity;\n }, [activity]);\n\n // Renew session manually (e.g., when user clicks \"Continue Session\")\n const renewSession = useCallback(() => {\n lastActivityRef.current = new Date();\n hideWarning();\n pingRef.current();\n }, [hideWarning]);\n\n // Logout immediately\n const logoutNow = useCallback(() => {\n expire();\n }, [expire]);\n\n // Setup event listeners and initial timer - only run once on mount\n useEffect(() => {\n if (!config.enabled) {\n return;\n }\n\n // Create stable event handler that uses ref\n const handleActivity = () => activityRef.current();\n\n // Bind activity events\n activityEvents.forEach((event) => {\n document.addEventListener(event, handleActivity, true);\n });\n\n // Initialize timer\n applyRef.current();\n\n // Cleanup\n return () => {\n activityEvents.forEach((event) => {\n document.removeEventListener(event, handleActivity, true);\n });\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n };\n }, [config.enabled]); // Only depend on enabled - runs once on mount\n\n return {\n showWarning,\n countdown,\n hideWarning,\n renewSession,\n logoutNow,\n };\n};\n\nexport default useSessionSecurity;\n","// src/primitive.tsx\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nfunction composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {\n return function handleEvent(event) {\n originalEventHandler?.(event);\n if (checkForDefaultPrevented === false || !event.defaultPrevented) {\n return ourEventHandler?.(event);\n }\n };\n}\nfunction getOwnerWindow(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access window outside of the DOM\");\n }\n return element?.ownerDocument?.defaultView ?? window;\n}\nfunction getOwnerDocument(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access document outside of the DOM\");\n }\n return element?.ownerDocument ?? document;\n}\nfunction getActiveElement(node, activeDescendant = false) {\n const { activeElement } = getOwnerDocument(node);\n if (!activeElement?.nodeName) {\n return null;\n }\n if (isFrame(activeElement) && activeElement.contentDocument) {\n return getActiveElement(activeElement.contentDocument.body, activeDescendant);\n }\n if (activeDescendant) {\n const id = activeElement.getAttribute(\"aria-activedescendant\");\n if (id) {\n const element = getOwnerDocument(activeElement).getElementById(id);\n if (element) {\n return element;\n }\n }\n }\n return activeElement;\n}\nfunction isFrame(element) {\n return element.tagName === \"IFRAME\";\n}\nexport {\n canUseDOM,\n composeEventHandlers,\n getActiveElement,\n getOwnerDocument,\n getOwnerWindow,\n isFrame\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/compose-refs/src/compose-refs.tsx\nimport * as React from \"react\";\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\nfunction useComposedRefs(...refs) {\n return React.useCallback(composeRefs(...refs), refs);\n}\nexport {\n composeRefs,\n useComposedRefs\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/context/src/create-context.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createContext2(rootComponentName, defaultContext) {\n const Context = React.createContext(defaultContext);\n const Provider = (props) => {\n const { children, ...context } = props;\n const value = React.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ jsx(Context.Provider, { value, children });\n };\n Provider.displayName = rootComponentName + \"Provider\";\n function useContext2(consumerName) {\n const context = React.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n return [Provider, useContext2];\n}\nfunction createContextScope(scopeName, createContextScopeDeps = []) {\n let defaultContexts = [];\n function createContext3(rootComponentName, defaultContext) {\n const BaseContext = React.createContext(defaultContext);\n const index = defaultContexts.length;\n defaultContexts = [...defaultContexts, defaultContext];\n const Provider = (props) => {\n const { scope, children, ...context } = props;\n const Context = scope?.[scopeName]?.[index] || BaseContext;\n const value = React.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ jsx(Context.Provider, { value, children });\n };\n Provider.displayName = rootComponentName + \"Provider\";\n function useContext2(consumerName, scope) {\n const Context = scope?.[scopeName]?.[index] || BaseContext;\n const context = React.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n return [Provider, useContext2];\n }\n const createScope = () => {\n const scopeContexts = defaultContexts.map((defaultContext) => {\n return React.createContext(defaultContext);\n });\n return function useScope(scope) {\n const contexts = scope?.[scopeName] || scopeContexts;\n return React.useMemo(\n () => ({ [`__scope${scopeName}`]: { ...scope, [scopeName]: contexts } }),\n [scope, contexts]\n );\n };\n };\n createScope.scopeName = scopeName;\n return [createContext3, composeContextScopes(createScope, ...createContextScopeDeps)];\n}\nfunction composeContextScopes(...scopes) {\n const baseScope = scopes[0];\n if (scopes.length === 1) return baseScope;\n const createScope = () => {\n const scopeHooks = scopes.map((createScope2) => ({\n useScope: createScope2(),\n scopeName: createScope2.scopeName\n }));\n return function useComposedScopes(overrideScopes) {\n const nextScopes = scopeHooks.reduce((nextScopes2, { useScope, scopeName }) => {\n const scopeProps = useScope(overrideScopes);\n const currentScope = scopeProps[`__scope${scopeName}`];\n return { ...nextScopes2, ...currentScope };\n }, {});\n return React.useMemo(() => ({ [`__scope${baseScope.scopeName}`]: nextScopes }), [nextScopes]);\n };\n };\n createScope.scopeName = baseScope.scopeName;\n return createScope;\n}\nexport {\n createContext2 as createContext,\n createContextScope\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/use-layout-effect/src/use-layout-effect.tsx\nimport * as React from \"react\";\nvar useLayoutEffect2 = globalThis?.document ? React.useLayoutEffect : () => {\n};\nexport {\n useLayoutEffect2 as useLayoutEffect\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/id/src/id.tsx\nimport * as React from \"react\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nvar useReactId = React[\" useId \".trim().toString()] || (() => void 0);\nvar count = 0;\nfunction useId(deterministicId) {\n const [id, setId] = React.useState(useReactId());\n useLayoutEffect(() => {\n if (!deterministicId) setId((reactId) => reactId ?? String(count++));\n }, [deterministicId]);\n return deterministicId || (id ? `radix-${id}` : \"\");\n}\nexport {\n useId\n};\n//# sourceMappingURL=index.mjs.map\n","// src/use-controllable-state.tsx\nimport * as React from \"react\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nvar useInsertionEffect = React[\" useInsertionEffect \".trim().toString()] || useLayoutEffect;\nfunction useControllableState({\n prop,\n defaultProp,\n onChange = () => {\n },\n caller\n}) {\n const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({\n defaultProp,\n onChange\n });\n const isControlled = prop !== void 0;\n const value = isControlled ? prop : uncontrolledProp;\n if (true) {\n const isControlledRef = React.useRef(prop !== void 0);\n React.useEffect(() => {\n const wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled) {\n const from = wasControlled ? \"controlled\" : \"uncontrolled\";\n const to = isControlled ? \"controlled\" : \"uncontrolled\";\n console.warn(\n `${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`\n );\n }\n isControlledRef.current = isControlled;\n }, [isControlled, caller]);\n }\n const setValue = React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;\n if (value2 !== prop) {\n onChangeRef.current?.(value2);\n }\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, onChangeRef]\n );\n return [value, setValue];\n}\nfunction useUncontrolledState({\n defaultProp,\n onChange\n}) {\n const [value, setValue] = React.useState(defaultProp);\n const prevValueRef = React.useRef(value);\n const onChangeRef = React.useRef(onChange);\n useInsertionEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n return [value, setValue, onChangeRef];\n}\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\n\n// src/use-controllable-state-reducer.tsx\nimport * as React2 from \"react\";\nimport { useEffectEvent } from \"@radix-ui/react-use-effect-event\";\nvar SYNC_STATE = Symbol(\"RADIX:SYNC_STATE\");\nfunction useControllableStateReducer(reducer, userArgs, initialArg, init) {\n const { prop: controlledState, defaultProp, onChange: onChangeProp, caller } = userArgs;\n const isControlled = controlledState !== void 0;\n const onChange = useEffectEvent(onChangeProp);\n if (true) {\n const isControlledRef = React2.useRef(controlledState !== void 0);\n React2.useEffect(() => {\n const wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled) {\n const from = wasControlled ? \"controlled\" : \"uncontrolled\";\n const to = isControlled ? \"controlled\" : \"uncontrolled\";\n console.warn(\n `${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`\n );\n }\n isControlledRef.current = isControlled;\n }, [isControlled, caller]);\n }\n const args = [{ ...initialArg, state: defaultProp }];\n if (init) {\n args.push(init);\n }\n const [internalState, dispatch] = React2.useReducer(\n (state2, action) => {\n if (action.type === SYNC_STATE) {\n return { ...state2, state: action.state };\n }\n const next = reducer(state2, action);\n if (isControlled && !Object.is(next.state, state2.state)) {\n onChange(next.state);\n }\n return next;\n },\n ...args\n );\n const uncontrolledState = internalState.state;\n const prevValueRef = React2.useRef(uncontrolledState);\n React2.useEffect(() => {\n if (prevValueRef.current !== uncontrolledState) {\n prevValueRef.current = uncontrolledState;\n if (!isControlled) {\n onChange(uncontrolledState);\n }\n }\n }, [onChange, uncontrolledState, prevValueRef, isControlled]);\n const state = React2.useMemo(() => {\n const isControlled2 = controlledState !== void 0;\n if (isControlled2) {\n return { ...internalState, state: controlledState };\n }\n return internalState;\n }, [internalState, controlledState]);\n React2.useEffect(() => {\n if (isControlled && !Object.is(controlledState, internalState.state)) {\n dispatch({ type: SYNC_STATE, state: controlledState });\n }\n }, [controlledState, internalState.state, isControlled]);\n return [state, dispatch];\n}\nexport {\n useControllableState,\n useControllableStateReducer\n};\n//# sourceMappingURL=index.mjs.map\n","// src/slot.tsx\nimport * as React from \"react\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { Fragment as Fragment2, jsx } from \"react/jsx-runtime\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== React.Fragment) {\n props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props2);\n }\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ jsx(Fragment2, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","// src/primitive.tsx\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NODES = [\n \"a\",\n \"button\",\n \"div\",\n \"form\",\n \"h2\",\n \"h3\",\n \"img\",\n \"input\",\n \"label\",\n \"li\",\n \"nav\",\n \"ol\",\n \"p\",\n \"select\",\n \"span\",\n \"svg\",\n \"ul\"\n];\nvar Primitive = NODES.reduce((primitive, node) => {\n const Slot = createSlot(`Primitive.${node}`);\n const Node = React.forwardRef((props, forwardedRef) => {\n const { asChild, ...primitiveProps } = props;\n const Comp = asChild ? Slot : node;\n if (typeof window !== \"undefined\") {\n window[Symbol.for(\"radix-ui\")] = true;\n }\n return /* @__PURE__ */ jsx(Comp, { ...primitiveProps, ref: forwardedRef });\n });\n Node.displayName = `Primitive.${node}`;\n return { ...primitive, [node]: Node };\n}, {});\nfunction dispatchDiscreteCustomEvent(target, event) {\n if (target) ReactDOM.flushSync(() => target.dispatchEvent(event));\n}\nvar Root = Primitive;\nexport {\n Primitive,\n Root,\n dispatchDiscreteCustomEvent\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/use-callback-ref/src/use-callback-ref.tsx\nimport * as React from \"react\";\nfunction useCallbackRef(callback) {\n const callbackRef = React.useRef(callback);\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => (...args) => callbackRef.current?.(...args), []);\n}\nexport {\n useCallbackRef\n};\n//# sourceMappingURL=index.mjs.map\n","// packages/react/use-escape-keydown/src/use-escape-keydown.tsx\nimport * as React from \"react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nfunction useEscapeKeydown(onEscapeKeyDownProp, ownerDocument = globalThis?.document) {\n const onEscapeKeyDown = useCallbackRef(onEscapeKeyDownProp);\n React.useEffect(() => {\n const handleKeyDown = (event) => {\n if (event.key === \"Escape\") {\n onEscapeKeyDown(event);\n }\n };\n ownerDocument.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => ownerDocument.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n }, [onEscapeKeyDown, ownerDocument]);\n}\nexport {\n useEscapeKeydown\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/dismissable-layer.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { jsx } from \"react/jsx-runtime\";\nvar DISMISSABLE_LAYER_NAME = \"DismissableLayer\";\nvar CONTEXT_UPDATE = \"dismissableLayer.update\";\nvar POINTER_DOWN_OUTSIDE = \"dismissableLayer.pointerDownOutside\";\nvar FOCUS_OUTSIDE = \"dismissableLayer.focusOutside\";\nvar originalBodyPointerEvents;\nvar DismissableLayerContext = React.createContext({\n layers: /* @__PURE__ */ new Set(),\n layersWithOutsidePointerEventsDisabled: /* @__PURE__ */ new Set(),\n branches: /* @__PURE__ */ new Set()\n});\nvar DismissableLayer = React.forwardRef(\n (props, forwardedRef) => {\n const {\n disableOutsidePointerEvents = false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n ...layerProps\n } = props;\n const context = React.useContext(DismissableLayerContext);\n const [node, setNode] = React.useState(null);\n const ownerDocument = node?.ownerDocument ?? globalThis?.document;\n const [, force] = React.useState({});\n const composedRefs = useComposedRefs(forwardedRef, (node2) => setNode(node2));\n const layers = Array.from(context.layers);\n const [highestLayerWithOutsidePointerEventsDisabled] = [...context.layersWithOutsidePointerEventsDisabled].slice(-1);\n const highestLayerWithOutsidePointerEventsDisabledIndex = layers.indexOf(highestLayerWithOutsidePointerEventsDisabled);\n const index = node ? layers.indexOf(node) : -1;\n const isBodyPointerEventsDisabled = context.layersWithOutsidePointerEventsDisabled.size > 0;\n const isPointerEventsEnabled = index >= highestLayerWithOutsidePointerEventsDisabledIndex;\n const pointerDownOutside = usePointerDownOutside((event) => {\n const target = event.target;\n const isPointerDownOnBranch = [...context.branches].some((branch) => branch.contains(target));\n if (!isPointerEventsEnabled || isPointerDownOnBranch) return;\n onPointerDownOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n }, ownerDocument);\n const focusOutside = useFocusOutside((event) => {\n const target = event.target;\n const isFocusInBranch = [...context.branches].some((branch) => branch.contains(target));\n if (isFocusInBranch) return;\n onFocusOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n }, ownerDocument);\n useEscapeKeydown((event) => {\n const isHighestLayer = index === context.layers.size - 1;\n if (!isHighestLayer) return;\n onEscapeKeyDown?.(event);\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault();\n onDismiss();\n }\n }, ownerDocument);\n React.useEffect(() => {\n if (!node) return;\n if (disableOutsidePointerEvents) {\n if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n originalBodyPointerEvents = ownerDocument.body.style.pointerEvents;\n ownerDocument.body.style.pointerEvents = \"none\";\n }\n context.layersWithOutsidePointerEventsDisabled.add(node);\n }\n context.layers.add(node);\n dispatchUpdate();\n return () => {\n if (disableOutsidePointerEvents && context.layersWithOutsidePointerEventsDisabled.size === 1) {\n ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;\n }\n };\n }, [node, ownerDocument, disableOutsidePointerEvents, context]);\n React.useEffect(() => {\n return () => {\n if (!node) return;\n context.layers.delete(node);\n context.layersWithOutsidePointerEventsDisabled.delete(node);\n dispatchUpdate();\n };\n }, [node, context]);\n React.useEffect(() => {\n const handleUpdate = () => force({});\n document.addEventListener(CONTEXT_UPDATE, handleUpdate);\n return () => document.removeEventListener(CONTEXT_UPDATE, handleUpdate);\n }, []);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...layerProps,\n ref: composedRefs,\n style: {\n pointerEvents: isBodyPointerEventsDisabled ? isPointerEventsEnabled ? \"auto\" : \"none\" : void 0,\n ...props.style\n },\n onFocusCapture: composeEventHandlers(props.onFocusCapture, focusOutside.onFocusCapture),\n onBlurCapture: composeEventHandlers(props.onBlurCapture, focusOutside.onBlurCapture),\n onPointerDownCapture: composeEventHandlers(\n props.onPointerDownCapture,\n pointerDownOutside.onPointerDownCapture\n )\n }\n );\n }\n);\nDismissableLayer.displayName = DISMISSABLE_LAYER_NAME;\nvar BRANCH_NAME = \"DismissableLayerBranch\";\nvar DismissableLayerBranch = React.forwardRef((props, forwardedRef) => {\n const context = React.useContext(DismissableLayerContext);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n context.branches.add(node);\n return () => {\n context.branches.delete(node);\n };\n }\n }, [context.branches]);\n return /* @__PURE__ */ jsx(Primitive.div, { ...props, ref: composedRefs });\n});\nDismissableLayerBranch.displayName = BRANCH_NAME;\nfunction usePointerDownOutside(onPointerDownOutside, ownerDocument = globalThis?.document) {\n const handlePointerDownOutside = useCallbackRef(onPointerDownOutside);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const handleClickRef = React.useRef(() => {\n });\n React.useEffect(() => {\n const handlePointerDown = (event) => {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n let handleAndDispatchPointerDownOutsideEvent2 = function() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n handlePointerDownOutside,\n eventDetail,\n { discrete: true }\n );\n };\n var handleAndDispatchPointerDownOutsideEvent = handleAndDispatchPointerDownOutsideEvent2;\n const eventDetail = { originalEvent: event };\n if (event.pointerType === \"touch\") {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n handleClickRef.current = handleAndDispatchPointerDownOutsideEvent2;\n ownerDocument.addEventListener(\"click\", handleClickRef.current, { once: true });\n } else {\n handleAndDispatchPointerDownOutsideEvent2();\n }\n } else {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n }\n isPointerInsideReactTreeRef.current = false;\n };\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown);\n }, 0);\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown);\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n };\n }, [ownerDocument, handlePointerDownOutside]);\n return {\n // ensures we check React component tree (not just DOM tree)\n onPointerDownCapture: () => isPointerInsideReactTreeRef.current = true\n };\n}\nfunction useFocusOutside(onFocusOutside, ownerDocument = globalThis?.document) {\n const handleFocusOutside = useCallbackRef(onFocusOutside);\n const isFocusInsideReactTreeRef = React.useRef(false);\n React.useEffect(() => {\n const handleFocus = (event) => {\n if (event.target && !isFocusInsideReactTreeRef.current) {\n const eventDetail = { originalEvent: event };\n handleAndDispatchCustomEvent(FOCUS_OUTSIDE, handleFocusOutside, eventDetail, {\n discrete: false\n });\n }\n };\n ownerDocument.addEventListener(\"focusin\", handleFocus);\n return () => ownerDocument.removeEventListener(\"focusin\", handleFocus);\n }, [ownerDocument, handleFocusOutside]);\n return {\n onFocusCapture: () => isFocusInsideReactTreeRef.current = true,\n onBlurCapture: () => isFocusInsideReactTreeRef.current = false\n };\n}\nfunction dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE);\n document.dispatchEvent(event);\n}\nfunction handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {\n const target = detail.originalEvent.target;\n const event = new CustomEvent(name, { bubbles: false, cancelable: true, detail });\n if (handler) target.addEventListener(name, handler, { once: true });\n if (discrete) {\n dispatchDiscreteCustomEvent(target, event);\n } else {\n target.dispatchEvent(event);\n }\n}\nvar Root = DismissableLayer;\nvar Branch = DismissableLayerBranch;\nexport {\n Branch,\n DismissableLayer,\n DismissableLayerBranch,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/focus-scope.tsx\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { jsx } from \"react/jsx-runtime\";\nvar AUTOFOCUS_ON_MOUNT = \"focusScope.autoFocusOnMount\";\nvar AUTOFOCUS_ON_UNMOUNT = \"focusScope.autoFocusOnUnmount\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar FOCUS_SCOPE_NAME = \"FocusScope\";\nvar FocusScope = React.forwardRef((props, forwardedRef) => {\n const {\n loop = false,\n trapped = false,\n onMountAutoFocus: onMountAutoFocusProp,\n onUnmountAutoFocus: onUnmountAutoFocusProp,\n ...scopeProps\n } = props;\n const [container, setContainer] = React.useState(null);\n const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);\n const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);\n const lastFocusedElementRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node));\n const focusScope = React.useRef({\n paused: false,\n pause() {\n this.paused = true;\n },\n resume() {\n this.paused = false;\n }\n }).current;\n React.useEffect(() => {\n if (trapped) {\n let handleFocusIn2 = function(event) {\n if (focusScope.paused || !container) return;\n const target = event.target;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleFocusOut2 = function(event) {\n if (focusScope.paused || !container) return;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget === null) return;\n if (!container.contains(relatedTarget)) {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleMutations2 = function(mutations) {\n const focusedElement = document.activeElement;\n if (focusedElement !== document.body) return;\n for (const mutation of mutations) {\n if (mutation.removedNodes.length > 0) focus(container);\n }\n };\n var handleFocusIn = handleFocusIn2, handleFocusOut = handleFocusOut2, handleMutations = handleMutations2;\n document.addEventListener(\"focusin\", handleFocusIn2);\n document.addEventListener(\"focusout\", handleFocusOut2);\n const mutationObserver = new MutationObserver(handleMutations2);\n if (container) mutationObserver.observe(container, { childList: true, subtree: true });\n return () => {\n document.removeEventListener(\"focusin\", handleFocusIn2);\n document.removeEventListener(\"focusout\", handleFocusOut2);\n mutationObserver.disconnect();\n };\n }\n }, [trapped, container, focusScope.paused]);\n React.useEffect(() => {\n if (container) {\n focusScopesStack.add(focusScope);\n const previouslyFocusedElement = document.activeElement;\n const hasFocusedCandidate = container.contains(previouslyFocusedElement);\n if (!hasFocusedCandidate) {\n const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n container.dispatchEvent(mountEvent);\n if (!mountEvent.defaultPrevented) {\n focusFirst(removeLinks(getTabbableCandidates(container)), { select: true });\n if (document.activeElement === previouslyFocusedElement) {\n focus(container);\n }\n }\n }\n return () => {\n container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n setTimeout(() => {\n const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n container.dispatchEvent(unmountEvent);\n if (!unmountEvent.defaultPrevented) {\n focus(previouslyFocusedElement ?? document.body, { select: true });\n }\n container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n focusScopesStack.remove(focusScope);\n }, 0);\n };\n }\n }, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);\n const handleKeyDown = React.useCallback(\n (event) => {\n if (!loop && !trapped) return;\n if (focusScope.paused) return;\n const isTabKey = event.key === \"Tab\" && !event.altKey && !event.ctrlKey && !event.metaKey;\n const focusedElement = document.activeElement;\n if (isTabKey && focusedElement) {\n const container2 = event.currentTarget;\n const [first, last] = getTabbableEdges(container2);\n const hasTabbableElementsInside = first && last;\n if (!hasTabbableElementsInside) {\n if (focusedElement === container2) event.preventDefault();\n } else {\n if (!event.shiftKey && focusedElement === last) {\n event.preventDefault();\n if (loop) focus(first, { select: true });\n } else if (event.shiftKey && focusedElement === first) {\n event.preventDefault();\n if (loop) focus(last, { select: true });\n }\n }\n }\n },\n [loop, trapped, focusScope.paused]\n );\n return /* @__PURE__ */ jsx(Primitive.div, { tabIndex: -1, ...scopeProps, ref: composedRefs, onKeyDown: handleKeyDown });\n});\nFocusScope.displayName = FOCUS_SCOPE_NAME;\nfunction focusFirst(candidates, { select = false } = {}) {\n const previouslyFocusedElement = document.activeElement;\n for (const candidate of candidates) {\n focus(candidate, { select });\n if (document.activeElement !== previouslyFocusedElement) return;\n }\n}\nfunction getTabbableEdges(container) {\n const candidates = getTabbableCandidates(container);\n const first = findVisible(candidates, container);\n const last = findVisible(candidates.reverse(), container);\n return [first, last];\n}\nfunction getTabbableCandidates(container) {\n const nodes = [];\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node) => {\n const isHiddenInput = node.tagName === \"INPUT\" && node.type === \"hidden\";\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while (walker.nextNode()) nodes.push(walker.currentNode);\n return nodes;\n}\nfunction findVisible(elements, container) {\n for (const element of elements) {\n if (!isHidden(element, { upTo: container })) return element;\n }\n}\nfunction isHidden(node, { upTo }) {\n if (getComputedStyle(node).visibility === \"hidden\") return true;\n while (node) {\n if (upTo !== void 0 && node === upTo) return false;\n if (getComputedStyle(node).display === \"none\") return true;\n node = node.parentElement;\n }\n return false;\n}\nfunction isSelectableInput(element) {\n return element instanceof HTMLInputElement && \"select\" in element;\n}\nfunction focus(element, { select = false } = {}) {\n if (element && element.focus) {\n const previouslyFocusedElement = document.activeElement;\n element.focus({ preventScroll: true });\n if (element !== previouslyFocusedElement && isSelectableInput(element) && select)\n element.select();\n }\n}\nvar focusScopesStack = createFocusScopesStack();\nfunction createFocusScopesStack() {\n let stack = [];\n return {\n add(focusScope) {\n const activeFocusScope = stack[0];\n if (focusScope !== activeFocusScope) {\n activeFocusScope?.pause();\n }\n stack = arrayRemove(stack, focusScope);\n stack.unshift(focusScope);\n },\n remove(focusScope) {\n stack = arrayRemove(stack, focusScope);\n stack[0]?.resume();\n }\n };\n}\nfunction arrayRemove(array, item) {\n const updatedArray = [...array];\n const index = updatedArray.indexOf(item);\n if (index !== -1) {\n updatedArray.splice(index, 1);\n }\n return updatedArray;\n}\nfunction removeLinks(items) {\n return items.filter((item) => item.tagName !== \"A\");\n}\nvar Root = FocusScope;\nexport {\n FocusScope,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/portal.tsx\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { jsx } from \"react/jsx-runtime\";\nvar PORTAL_NAME = \"Portal\";\nvar Portal = React.forwardRef((props, forwardedRef) => {\n const { container: containerProp, ...portalProps } = props;\n const [mounted, setMounted] = React.useState(false);\n useLayoutEffect(() => setMounted(true), []);\n const container = containerProp || mounted && globalThis?.document?.body;\n return container ? ReactDOM.createPortal(/* @__PURE__ */ jsx(Primitive.div, { ...portalProps, ref: forwardedRef }), container) : null;\n});\nPortal.displayName = PORTAL_NAME;\nvar Root = Portal;\nexport {\n Portal,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/presence.tsx\nimport * as React2 from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\n\n// src/use-state-machine.tsx\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n\n// src/presence.tsx\nvar Presence = (props) => {\n const { present, children } = props;\n const presence = usePresence(present);\n const child = typeof children === \"function\" ? children({ present: presence.isPresent }) : React2.Children.only(children);\n const ref = useComposedRefs(presence.ref, getElementRef(child));\n const forceMount = typeof children === \"function\";\n return forceMount || presence.isPresent ? React2.cloneElement(child, { ref }) : null;\n};\nPresence.displayName = \"Presence\";\nfunction usePresence(present) {\n const [node, setNode] = React2.useState();\n const stylesRef = React2.useRef(null);\n const prevPresentRef = React2.useRef(present);\n const prevAnimationNameRef = React2.useRef(\"none\");\n const initialState = present ? \"mounted\" : \"unmounted\";\n const [state, send] = useStateMachine(initialState, {\n mounted: {\n UNMOUNT: \"unmounted\",\n ANIMATION_OUT: \"unmountSuspended\"\n },\n unmountSuspended: {\n MOUNT: \"mounted\",\n ANIMATION_END: \"unmounted\"\n },\n unmounted: {\n MOUNT: \"mounted\"\n }\n });\n React2.useEffect(() => {\n const currentAnimationName = getAnimationName(stylesRef.current);\n prevAnimationNameRef.current = state === \"mounted\" ? currentAnimationName : \"none\";\n }, [state]);\n useLayoutEffect(() => {\n const styles = stylesRef.current;\n const wasPresent = prevPresentRef.current;\n const hasPresentChanged = wasPresent !== present;\n if (hasPresentChanged) {\n const prevAnimationName = prevAnimationNameRef.current;\n const currentAnimationName = getAnimationName(styles);\n if (present) {\n send(\"MOUNT\");\n } else if (currentAnimationName === \"none\" || styles?.display === \"none\") {\n send(\"UNMOUNT\");\n } else {\n const isAnimating = prevAnimationName !== currentAnimationName;\n if (wasPresent && isAnimating) {\n send(\"ANIMATION_OUT\");\n } else {\n send(\"UNMOUNT\");\n }\n }\n prevPresentRef.current = present;\n }\n }, [present, send]);\n useLayoutEffect(() => {\n if (node) {\n let timeoutId;\n const ownerWindow = node.ownerDocument.defaultView ?? window;\n const handleAnimationEnd = (event) => {\n const currentAnimationName = getAnimationName(stylesRef.current);\n const isCurrentAnimation = currentAnimationName.includes(CSS.escape(event.animationName));\n if (event.target === node && isCurrentAnimation) {\n send(\"ANIMATION_END\");\n if (!prevPresentRef.current) {\n const currentFillMode = node.style.animationFillMode;\n node.style.animationFillMode = \"forwards\";\n timeoutId = ownerWindow.setTimeout(() => {\n if (node.style.animationFillMode === \"forwards\") {\n node.style.animationFillMode = currentFillMode;\n }\n });\n }\n }\n };\n const handleAnimationStart = (event) => {\n if (event.target === node) {\n prevAnimationNameRef.current = getAnimationName(stylesRef.current);\n }\n };\n node.addEventListener(\"animationstart\", handleAnimationStart);\n node.addEventListener(\"animationcancel\", handleAnimationEnd);\n node.addEventListener(\"animationend\", handleAnimationEnd);\n return () => {\n ownerWindow.clearTimeout(timeoutId);\n node.removeEventListener(\"animationstart\", handleAnimationStart);\n node.removeEventListener(\"animationcancel\", handleAnimationEnd);\n node.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n } else {\n send(\"ANIMATION_END\");\n }\n }, [node, send]);\n return {\n isPresent: [\"mounted\", \"unmountSuspended\"].includes(state),\n ref: React2.useCallback((node2) => {\n stylesRef.current = node2 ? getComputedStyle(node2) : null;\n setNode(node2);\n }, [])\n };\n}\nfunction getAnimationName(styles) {\n return styles?.animationName || \"none\";\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nvar Root = Presence;\nexport {\n Presence,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/focus-guards.tsx\nimport * as React from \"react\";\nvar count = 0;\nfunction FocusGuards(props) {\n useFocusGuards();\n return props.children;\n}\nfunction useFocusGuards() {\n React.useEffect(() => {\n const edgeGuards = document.querySelectorAll(\"[data-radix-focus-guard]\");\n document.body.insertAdjacentElement(\"afterbegin\", edgeGuards[0] ?? createFocusGuard());\n document.body.insertAdjacentElement(\"beforeend\", edgeGuards[1] ?? createFocusGuard());\n count++;\n return () => {\n if (count === 1) {\n document.querySelectorAll(\"[data-radix-focus-guard]\").forEach((node) => node.remove());\n }\n count--;\n };\n }, []);\n}\nfunction createFocusGuard() {\n const element = document.createElement(\"span\");\n element.setAttribute(\"data-radix-focus-guard\", \"\");\n element.tabIndex = 0;\n element.style.outline = \"none\";\n element.style.opacity = \"0\";\n element.style.position = \"fixed\";\n element.style.pointerEvents = \"none\";\n return element;\n}\nexport {\n FocusGuards,\n FocusGuards as Root,\n useFocusGuards\n};\n//# sourceMappingURL=index.mjs.map\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export var zeroRightClassName = 'right-scroll-bar-position';\nexport var fullWidthClassName = 'width-before-scroll-bar';\nexport var noScrollbarsClassName = 'with-scroll-bars-hidden';\n/**\n * Name of a CSS variable containing the amount of \"hidden\" scrollbar\n * ! might be undefined ! use will fallback!\n */\nexport var removedBarSizeVariable = '--removed-body-scroll-bar-size';\n","/**\n * Assigns a value for a given ref, no matter of the ref format\n * @param {RefObject} ref - a callback function or ref object\n * @param value - a new value\n *\n * @see https://github.com/theKashey/use-callback-ref#assignref\n * @example\n * const refObject = useRef();\n * const refFn = (ref) => {....}\n *\n * assignRef(refObject, \"refValue\");\n * assignRef(refFn, \"refValue\");\n */\nexport function assignRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n }\n else if (ref) {\n ref.current = value;\n }\n return ref;\n}\n","import { useState } from 'react';\n/**\n * creates a MutableRef with ref change callback\n * @param initialValue - initial ref value\n * @param {Function} callback - a callback to run when value changes\n *\n * @example\n * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue);\n * ref.current = 1;\n * // prints 0 -> 1\n *\n * @see https://reactjs.org/docs/hooks-reference.html#useref\n * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref\n * @returns {MutableRefObject}\n */\nexport function useCallbackRef(initialValue, callback) {\n var ref = useState(function () { return ({\n // value\n value: initialValue,\n // last callback\n callback: callback,\n // \"memoized\" public interface\n facade: {\n get current() {\n return ref.value;\n },\n set current(value) {\n var last = ref.value;\n if (last !== value) {\n ref.value = value;\n ref.callback(value, last);\n }\n },\n },\n }); })[0];\n // update callback\n ref.callback = callback;\n return ref.facade;\n}\n","import * as React from 'react';\nimport { assignRef } from './assignRef';\nimport { useCallbackRef } from './useRef';\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nvar currentValues = new WeakMap();\n/**\n * Merges two or more refs together providing a single interface to set their value\n * @param {RefObject|Ref} refs\n * @returns {MutableRefObject} - a new ref, which translates all changes to {refs}\n *\n * @see {@link mergeRefs} a version without buit-in memoization\n * @see https://github.com/theKashey/use-callback-ref#usemergerefs\n * @example\n * const Component = React.forwardRef((props, ref) => {\n * const ownRef = useRef();\n * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together\n * return <div ref={domRef}>...</div>\n * }\n */\nexport function useMergeRefs(refs, defaultValue) {\n var callbackRef = useCallbackRef(defaultValue || null, function (newValue) {\n return refs.forEach(function (ref) { return assignRef(ref, newValue); });\n });\n // handle refs changes - added or removed\n useIsomorphicLayoutEffect(function () {\n var oldValue = currentValues.get(callbackRef);\n if (oldValue) {\n var prevRefs_1 = new Set(oldValue);\n var nextRefs_1 = new Set(refs);\n var current_1 = callbackRef.current;\n prevRefs_1.forEach(function (ref) {\n if (!nextRefs_1.has(ref)) {\n assignRef(ref, null);\n }\n });\n nextRefs_1.forEach(function (ref) {\n if (!prevRefs_1.has(ref)) {\n assignRef(ref, current_1);\n }\n });\n }\n currentValues.set(callbackRef, refs);\n }, [refs]);\n return callbackRef;\n}\n","import { __assign } from \"tslib\";\nfunction ItoI(a) {\n return a;\n}\nfunction innerCreateMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n var buffer = [];\n var assigned = false;\n var medium = {\n read: function () {\n if (assigned) {\n throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.');\n }\n if (buffer.length) {\n return buffer[buffer.length - 1];\n }\n return defaults;\n },\n useMedium: function (data) {\n var item = middleware(data, assigned);\n buffer.push(item);\n return function () {\n buffer = buffer.filter(function (x) { return x !== item; });\n };\n },\n assignSyncMedium: function (cb) {\n assigned = true;\n while (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n }\n buffer = {\n push: function (x) { return cb(x); },\n filter: function () { return buffer; },\n };\n },\n assignMedium: function (cb) {\n assigned = true;\n var pendingQueue = [];\n if (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n pendingQueue = buffer;\n }\n var executeQueue = function () {\n var cbs = pendingQueue;\n pendingQueue = [];\n cbs.forEach(cb);\n };\n var cycle = function () { return Promise.resolve().then(executeQueue); };\n cycle();\n buffer = {\n push: function (x) {\n pendingQueue.push(x);\n cycle();\n },\n filter: function (filter) {\n pendingQueue = pendingQueue.filter(filter);\n return buffer;\n },\n };\n },\n };\n return medium;\n}\nexport function createMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n return innerCreateMedium(defaults, middleware);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function createSidecarMedium(options) {\n if (options === void 0) { options = {}; }\n var medium = innerCreateMedium(null);\n medium.options = __assign({ async: true, ssr: false }, options);\n return medium;\n}\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nvar SideCar = function (_a) {\n var sideCar = _a.sideCar, rest = __rest(_a, [\"sideCar\"]);\n if (!sideCar) {\n throw new Error('Sidecar: please provide `sideCar` property to import the right car');\n }\n var Target = sideCar.read();\n if (!Target) {\n throw new Error('Sidecar medium not found');\n }\n return React.createElement(Target, __assign({}, rest));\n};\nSideCar.isSideCarExport = true;\nexport function exportSidecar(medium, exported) {\n medium.useMedium(exported);\n return SideCar;\n}\n","import { createSidecarMedium } from 'use-sidecar';\nexport var effectCar = createSidecarMedium();\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nimport { fullWidthClassName, zeroRightClassName } from 'react-remove-scroll-bar/constants';\nimport { useMergeRefs } from 'use-callback-ref';\nimport { effectCar } from './medium';\nvar nothing = function () {\n return;\n};\n/**\n * Removes scrollbar from the page and contain the scroll within the Lock\n */\nvar RemoveScroll = React.forwardRef(function (props, parentRef) {\n var ref = React.useRef(null);\n var _a = React.useState({\n onScrollCapture: nothing,\n onWheelCapture: nothing,\n onTouchMoveCapture: nothing,\n }), callbacks = _a[0], setCallbacks = _a[1];\n var forwardProps = props.forwardProps, children = props.children, className = props.className, removeScrollBar = props.removeScrollBar, enabled = props.enabled, shards = props.shards, sideCar = props.sideCar, noRelative = props.noRelative, noIsolation = props.noIsolation, inert = props.inert, allowPinchZoom = props.allowPinchZoom, _b = props.as, Container = _b === void 0 ? 'div' : _b, gapMode = props.gapMode, rest = __rest(props, [\"forwardProps\", \"children\", \"className\", \"removeScrollBar\", \"enabled\", \"shards\", \"sideCar\", \"noRelative\", \"noIsolation\", \"inert\", \"allowPinchZoom\", \"as\", \"gapMode\"]);\n var SideCar = sideCar;\n var containerRef = useMergeRefs([ref, parentRef]);\n var containerProps = __assign(__assign({}, rest), callbacks);\n return (React.createElement(React.Fragment, null,\n enabled && (React.createElement(SideCar, { sideCar: effectCar, removeScrollBar: removeScrollBar, shards: shards, noRelative: noRelative, noIsolation: noIsolation, inert: inert, setCallbacks: setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode: gapMode })),\n forwardProps ? (React.cloneElement(React.Children.only(children), __assign(__assign({}, containerProps), { ref: containerRef }))) : (React.createElement(Container, __assign({}, containerProps, { className: className, ref: containerRef }), children))));\n});\nRemoveScroll.defaultProps = {\n enabled: true,\n removeScrollBar: true,\n inert: false,\n};\nRemoveScroll.classNames = {\n fullWidth: fullWidthClassName,\n zeroRight: zeroRightClassName,\n};\nexport { RemoveScroll };\n","var currentNonce;\nexport var setNonce = function (nonce) {\n currentNonce = nonce;\n};\nexport var getNonce = function () {\n if (currentNonce) {\n return currentNonce;\n }\n if (typeof __webpack_nonce__ !== 'undefined') {\n return __webpack_nonce__;\n }\n return undefined;\n};\n","import { getNonce } from 'get-nonce';\nfunction makeStyleTag() {\n if (!document)\n return null;\n var tag = document.createElement('style');\n tag.type = 'text/css';\n var nonce = getNonce();\n if (nonce) {\n tag.setAttribute('nonce', nonce);\n }\n return tag;\n}\nfunction injectStyles(tag, css) {\n // @ts-ignore\n if (tag.styleSheet) {\n // @ts-ignore\n tag.styleSheet.cssText = css;\n }\n else {\n tag.appendChild(document.createTextNode(css));\n }\n}\nfunction insertStyleTag(tag) {\n var head = document.head || document.getElementsByTagName('head')[0];\n head.appendChild(tag);\n}\nexport var stylesheetSingleton = function () {\n var counter = 0;\n var stylesheet = null;\n return {\n add: function (style) {\n if (counter == 0) {\n if ((stylesheet = makeStyleTag())) {\n injectStyles(stylesheet, style);\n insertStyleTag(stylesheet);\n }\n }\n counter++;\n },\n remove: function () {\n counter--;\n if (!counter && stylesheet) {\n stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet);\n stylesheet = null;\n }\n },\n };\n};\n","import * as React from 'react';\nimport { stylesheetSingleton } from './singleton';\n/**\n * creates a hook to control style singleton\n * @see {@link styleSingleton} for a safer component version\n * @example\n * ```tsx\n * const useStyle = styleHookSingleton();\n * ///\n * useStyle('body { overflow: hidden}');\n */\nexport var styleHookSingleton = function () {\n var sheet = stylesheetSingleton();\n return function (styles, isDynamic) {\n React.useEffect(function () {\n sheet.add(styles);\n return function () {\n sheet.remove();\n };\n }, [styles && isDynamic]);\n };\n};\n","import { styleHookSingleton } from './hook';\n/**\n * create a Component to add styles on demand\n * - styles are added when first instance is mounted\n * - styles are removed when the last instance is unmounted\n * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior\n */\nexport var styleSingleton = function () {\n var useStyle = styleHookSingleton();\n var Sheet = function (_a) {\n var styles = _a.styles, dynamic = _a.dynamic;\n useStyle(styles, dynamic);\n return null;\n };\n return Sheet;\n};\n","export var zeroGap = {\n left: 0,\n top: 0,\n right: 0,\n gap: 0,\n};\nvar parse = function (x) { return parseInt(x || '', 10) || 0; };\nvar getOffset = function (gapMode) {\n var cs = window.getComputedStyle(document.body);\n var left = cs[gapMode === 'padding' ? 'paddingLeft' : 'marginLeft'];\n var top = cs[gapMode === 'padding' ? 'paddingTop' : 'marginTop'];\n var right = cs[gapMode === 'padding' ? 'paddingRight' : 'marginRight'];\n return [parse(left), parse(top), parse(right)];\n};\nexport var getGapWidth = function (gapMode) {\n if (gapMode === void 0) { gapMode = 'margin'; }\n if (typeof window === 'undefined') {\n return zeroGap;\n }\n var offsets = getOffset(gapMode);\n var documentWidth = document.documentElement.clientWidth;\n var windowWidth = window.innerWidth;\n return {\n left: offsets[0],\n top: offsets[1],\n right: offsets[2],\n gap: Math.max(0, windowWidth - documentWidth + offsets[2] - offsets[0]),\n };\n};\n","import * as React from 'react';\nimport { styleSingleton } from 'react-style-singleton';\nimport { fullWidthClassName, zeroRightClassName, noScrollbarsClassName, removedBarSizeVariable } from './constants';\nimport { getGapWidth } from './utils';\nvar Style = styleSingleton();\nexport var lockAttribute = 'data-scroll-locked';\n// important tip - once we measure scrollBar width and remove them\n// we could not repeat this operation\n// thus we are using style-singleton - only the first \"yet correct\" style will be applied.\nvar getStyles = function (_a, allowRelative, gapMode, important) {\n var left = _a.left, top = _a.top, right = _a.right, gap = _a.gap;\n if (gapMode === void 0) { gapMode = 'margin'; }\n return \"\\n .\".concat(noScrollbarsClassName, \" {\\n overflow: hidden \").concat(important, \";\\n padding-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n body[\").concat(lockAttribute, \"] {\\n overflow: hidden \").concat(important, \";\\n overscroll-behavior: contain;\\n \").concat([\n allowRelative && \"position: relative \".concat(important, \";\"),\n gapMode === 'margin' &&\n \"\\n padding-left: \".concat(left, \"px;\\n padding-top: \").concat(top, \"px;\\n padding-right: \").concat(right, \"px;\\n margin-left:0;\\n margin-top:0;\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n \"),\n gapMode === 'padding' && \"padding-right: \".concat(gap, \"px \").concat(important, \";\"),\n ]\n .filter(Boolean)\n .join(''), \"\\n }\\n \\n .\").concat(zeroRightClassName, \" {\\n right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" {\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(zeroRightClassName, \" .\").concat(zeroRightClassName, \" {\\n right: 0 \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" .\").concat(fullWidthClassName, \" {\\n margin-right: 0 \").concat(important, \";\\n }\\n \\n body[\").concat(lockAttribute, \"] {\\n \").concat(removedBarSizeVariable, \": \").concat(gap, \"px;\\n }\\n\");\n};\nvar getCurrentUseCounter = function () {\n var counter = parseInt(document.body.getAttribute(lockAttribute) || '0', 10);\n return isFinite(counter) ? counter : 0;\n};\nexport var useLockAttribute = function () {\n React.useEffect(function () {\n document.body.setAttribute(lockAttribute, (getCurrentUseCounter() + 1).toString());\n return function () {\n var newCounter = getCurrentUseCounter() - 1;\n if (newCounter <= 0) {\n document.body.removeAttribute(lockAttribute);\n }\n else {\n document.body.setAttribute(lockAttribute, newCounter.toString());\n }\n };\n }, []);\n};\n/**\n * Removes page scrollbar and blocks page scroll when mounted\n */\nexport var RemoveScrollBar = function (_a) {\n var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? 'margin' : _b;\n useLockAttribute();\n /*\n gap will be measured on every component mount\n however it will be used only by the \"first\" invocation\n due to singleton nature of <Style\n */\n var gap = React.useMemo(function () { return getGapWidth(gapMode); }, [gapMode]);\n return React.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') });\n};\n","var passiveSupported = false;\nif (typeof window !== 'undefined') {\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function () {\n passiveSupported = true;\n return true;\n },\n });\n // @ts-ignore\n window.addEventListener('test', options, options);\n // @ts-ignore\n window.removeEventListener('test', options, options);\n }\n catch (err) {\n passiveSupported = false;\n }\n}\nexport var nonPassive = passiveSupported ? { passive: false } : false;\n","var alwaysContainsScroll = function (node) {\n // textarea will always _contain_ scroll inside self. It only can be hidden\n return node.tagName === 'TEXTAREA';\n};\nvar elementCanBeScrolled = function (node, overflow) {\n if (!(node instanceof Element)) {\n return false;\n }\n var styles = window.getComputedStyle(node);\n return (\n // not-not-scrollable\n styles[overflow] !== 'hidden' &&\n // contains scroll inside self\n !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible'));\n};\nvar elementCouldBeVScrolled = function (node) { return elementCanBeScrolled(node, 'overflowY'); };\nvar elementCouldBeHScrolled = function (node) { return elementCanBeScrolled(node, 'overflowX'); };\nexport var locationCouldBeScrolled = function (axis, node) {\n var ownerDocument = node.ownerDocument;\n var current = node;\n do {\n // Skip over shadow root\n if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) {\n current = current.host;\n }\n var isScrollable = elementCouldBeScrolled(axis, current);\n if (isScrollable) {\n var _a = getScrollVariables(axis, current), scrollHeight = _a[1], clientHeight = _a[2];\n if (scrollHeight > clientHeight) {\n return true;\n }\n }\n current = current.parentNode;\n } while (current && current !== ownerDocument.body);\n return false;\n};\nvar getVScrollVariables = function (_a) {\n var scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;\n return [\n scrollTop,\n scrollHeight,\n clientHeight,\n ];\n};\nvar getHScrollVariables = function (_a) {\n var scrollLeft = _a.scrollLeft, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth;\n return [\n scrollLeft,\n scrollWidth,\n clientWidth,\n ];\n};\nvar elementCouldBeScrolled = function (axis, node) {\n return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node);\n};\nvar getScrollVariables = function (axis, node) {\n return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node);\n};\nvar getDirectionFactor = function (axis, direction) {\n /**\n * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position,\n * and then increasingly negative as you scroll towards the end of the content.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft\n */\n return axis === 'h' && direction === 'rtl' ? -1 : 1;\n};\nexport var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) {\n var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction);\n var delta = directionFactor * sourceDelta;\n // find scrollable target\n var target = event.target;\n var targetInLock = endTarget.contains(target);\n var shouldCancelScroll = false;\n var isDeltaPositive = delta > 0;\n var availableScroll = 0;\n var availableScrollTop = 0;\n do {\n if (!target) {\n break;\n }\n var _a = getScrollVariables(axis, target), position = _a[0], scroll_1 = _a[1], capacity = _a[2];\n var elementScroll = scroll_1 - capacity - directionFactor * position;\n if (position || elementScroll) {\n if (elementCouldBeScrolled(axis, target)) {\n availableScroll += elementScroll;\n availableScrollTop += position;\n }\n }\n var parent_1 = target.parentNode;\n // we will \"bubble\" from ShadowDom in case we are, or just to the parent in normal case\n // this is the same logic used in focus-lock\n target = (parent_1 && parent_1.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? parent_1.host : parent_1);\n } while (\n // portaled content\n (!targetInLock && target !== document.body) ||\n // self content\n (targetInLock && (endTarget.contains(target) || endTarget === target)));\n // handle epsilon around 0 (non standard zoom levels)\n if (isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScroll) < 1) || (!noOverscroll && delta > availableScroll))) {\n shouldCancelScroll = true;\n }\n else if (!isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScrollTop) < 1) || (!noOverscroll && -delta > availableScrollTop))) {\n shouldCancelScroll = true;\n }\n return shouldCancelScroll;\n};\n","import { __spreadArray } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScrollBar } from 'react-remove-scroll-bar';\nimport { styleSingleton } from 'react-style-singleton';\nimport { nonPassive } from './aggresiveCapture';\nimport { handleScroll, locationCouldBeScrolled } from './handleScroll';\nexport var getTouchXY = function (event) {\n return 'changedTouches' in event ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] : [0, 0];\n};\nexport var getDeltaXY = function (event) { return [event.deltaX, event.deltaY]; };\nvar extractRef = function (ref) {\n return ref && 'current' in ref ? ref.current : ref;\n};\nvar deltaCompare = function (x, y) { return x[0] === y[0] && x[1] === y[1]; };\nvar generateStyle = function (id) { return \"\\n .block-interactivity-\".concat(id, \" {pointer-events: none;}\\n .allow-interactivity-\").concat(id, \" {pointer-events: all;}\\n\"); };\nvar idCounter = 0;\nvar lockStack = [];\nexport function RemoveScrollSideCar(props) {\n var shouldPreventQueue = React.useRef([]);\n var touchStartRef = React.useRef([0, 0]);\n var activeAxis = React.useRef();\n var id = React.useState(idCounter++)[0];\n var Style = React.useState(styleSingleton)[0];\n var lastProps = React.useRef(props);\n React.useEffect(function () {\n lastProps.current = props;\n }, [props]);\n React.useEffect(function () {\n if (props.inert) {\n document.body.classList.add(\"block-interactivity-\".concat(id));\n var allow_1 = __spreadArray([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean);\n allow_1.forEach(function (el) { return el.classList.add(\"allow-interactivity-\".concat(id)); });\n return function () {\n document.body.classList.remove(\"block-interactivity-\".concat(id));\n allow_1.forEach(function (el) { return el.classList.remove(\"allow-interactivity-\".concat(id)); });\n };\n }\n return;\n }, [props.inert, props.lockRef.current, props.shards]);\n var shouldCancelEvent = React.useCallback(function (event, parent) {\n if (('touches' in event && event.touches.length === 2) || (event.type === 'wheel' && event.ctrlKey)) {\n return !lastProps.current.allowPinchZoom;\n }\n var touch = getTouchXY(event);\n var touchStart = touchStartRef.current;\n var deltaX = 'deltaX' in event ? event.deltaX : touchStart[0] - touch[0];\n var deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1];\n var currentAxis;\n var target = event.target;\n var moveDirection = Math.abs(deltaX) > Math.abs(deltaY) ? 'h' : 'v';\n // allow horizontal touch move on Range inputs. They will not cause any scroll\n if ('touches' in event && moveDirection === 'h' && target.type === 'range') {\n return false;\n }\n var canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n if (!canBeScrolledInMainDirection) {\n return true;\n }\n if (canBeScrolledInMainDirection) {\n currentAxis = moveDirection;\n }\n else {\n currentAxis = moveDirection === 'v' ? 'h' : 'v';\n canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n // other axis might be not scrollable\n }\n if (!canBeScrolledInMainDirection) {\n return false;\n }\n if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) {\n activeAxis.current = currentAxis;\n }\n if (!currentAxis) {\n return true;\n }\n var cancelingAxis = activeAxis.current || currentAxis;\n return handleScroll(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true);\n }, []);\n var shouldPrevent = React.useCallback(function (_event) {\n var event = _event;\n if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) {\n // not the last active\n return;\n }\n var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event);\n var sourceEvent = shouldPreventQueue.current.filter(function (e) { return e.name === event.type && (e.target === event.target || event.target === e.shadowParent) && deltaCompare(e.delta, delta); })[0];\n // self event, and should be canceled\n if (sourceEvent && sourceEvent.should) {\n if (event.cancelable) {\n event.preventDefault();\n }\n return;\n }\n // outside or shard event\n if (!sourceEvent) {\n var shardNodes = (lastProps.current.shards || [])\n .map(extractRef)\n .filter(Boolean)\n .filter(function (node) { return node.contains(event.target); });\n var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation;\n if (shouldStop) {\n if (event.cancelable) {\n event.preventDefault();\n }\n }\n }\n }, []);\n var shouldCancel = React.useCallback(function (name, delta, target, should) {\n var event = { name: name, delta: delta, target: target, should: should, shadowParent: getOutermostShadowParent(target) };\n shouldPreventQueue.current.push(event);\n setTimeout(function () {\n shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { return e !== event; });\n }, 1);\n }, []);\n var scrollTouchStart = React.useCallback(function (event) {\n touchStartRef.current = getTouchXY(event);\n activeAxis.current = undefined;\n }, []);\n var scrollWheel = React.useCallback(function (event) {\n shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n var scrollTouchMove = React.useCallback(function (event) {\n shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n React.useEffect(function () {\n lockStack.push(Style);\n props.setCallbacks({\n onScrollCapture: scrollWheel,\n onWheelCapture: scrollWheel,\n onTouchMoveCapture: scrollTouchMove,\n });\n document.addEventListener('wheel', shouldPrevent, nonPassive);\n document.addEventListener('touchmove', shouldPrevent, nonPassive);\n document.addEventListener('touchstart', scrollTouchStart, nonPassive);\n return function () {\n lockStack = lockStack.filter(function (inst) { return inst !== Style; });\n document.removeEventListener('wheel', shouldPrevent, nonPassive);\n document.removeEventListener('touchmove', shouldPrevent, nonPassive);\n document.removeEventListener('touchstart', scrollTouchStart, nonPassive);\n };\n }, []);\n var removeScrollBar = props.removeScrollBar, inert = props.inert;\n return (React.createElement(React.Fragment, null,\n inert ? React.createElement(Style, { styles: generateStyle(id) }) : null,\n removeScrollBar ? React.createElement(RemoveScrollBar, { noRelative: props.noRelative, gapMode: props.gapMode }) : null));\n}\nfunction getOutermostShadowParent(node) {\n var shadowParent = null;\n while (node !== null) {\n if (node instanceof ShadowRoot) {\n shadowParent = node.host;\n node = node.host;\n }\n node = node.parentNode;\n }\n return shadowParent;\n}\n","import { exportSidecar } from 'use-sidecar';\nimport { RemoveScrollSideCar } from './SideEffect';\nimport { effectCar } from './medium';\nexport default exportSidecar(effectCar, RemoveScrollSideCar);\n","import { __assign } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScroll } from './UI';\nimport SideCar from './sidecar';\nvar ReactRemoveScroll = React.forwardRef(function (props, ref) { return (React.createElement(RemoveScroll, __assign({}, props, { ref: ref, sideCar: SideCar }))); });\nReactRemoveScroll.classNames = RemoveScroll.classNames;\nexport default ReactRemoveScroll;\n","var getDefaultParent = function (originalTarget) {\n if (typeof document === 'undefined') {\n return null;\n }\n var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;\n return sampleTarget.ownerDocument.body;\n};\nvar counterMap = new WeakMap();\nvar uncontrolledNodes = new WeakMap();\nvar markerMap = {};\nvar lockCount = 0;\nvar unwrapHost = function (node) {\n return node && (node.host || unwrapHost(node.parentNode));\n};\nvar correctTargets = function (parent, targets) {\n return targets\n .map(function (target) {\n if (parent.contains(target)) {\n return target;\n }\n var correctedTarget = unwrapHost(target);\n if (correctedTarget && parent.contains(correctedTarget)) {\n return correctedTarget;\n }\n console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing');\n return null;\n })\n .filter(function (x) { return Boolean(x); });\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @param {String} [controlAttribute] - html Attribute to control\n * @return {Undo} undo command\n */\nvar applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) {\n var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n if (!markerMap[markerName]) {\n markerMap[markerName] = new WeakMap();\n }\n var markerCounter = markerMap[markerName];\n var hiddenNodes = [];\n var elementsToKeep = new Set();\n var elementsToStop = new Set(targets);\n var keep = function (el) {\n if (!el || elementsToKeep.has(el)) {\n return;\n }\n elementsToKeep.add(el);\n keep(el.parentNode);\n };\n targets.forEach(keep);\n var deep = function (parent) {\n if (!parent || elementsToStop.has(parent)) {\n return;\n }\n Array.prototype.forEach.call(parent.children, function (node) {\n if (elementsToKeep.has(node)) {\n deep(node);\n }\n else {\n try {\n var attr = node.getAttribute(controlAttribute);\n var alreadyHidden = attr !== null && attr !== 'false';\n var counterValue = (counterMap.get(node) || 0) + 1;\n var markerValue = (markerCounter.get(node) || 0) + 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n hiddenNodes.push(node);\n if (counterValue === 1 && alreadyHidden) {\n uncontrolledNodes.set(node, true);\n }\n if (markerValue === 1) {\n node.setAttribute(markerName, 'true');\n }\n if (!alreadyHidden) {\n node.setAttribute(controlAttribute, 'true');\n }\n }\n catch (e) {\n console.error('aria-hidden: cannot operate on ', node, e);\n }\n }\n });\n };\n deep(parentNode);\n elementsToKeep.clear();\n lockCount++;\n return function () {\n hiddenNodes.forEach(function (node) {\n var counterValue = counterMap.get(node) - 1;\n var markerValue = markerCounter.get(node) - 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n if (!counterValue) {\n if (!uncontrolledNodes.has(node)) {\n node.removeAttribute(controlAttribute);\n }\n uncontrolledNodes.delete(node);\n }\n if (!markerValue) {\n node.removeAttribute(markerName);\n }\n });\n lockCount--;\n if (!lockCount) {\n // clear\n counterMap = new WeakMap();\n counterMap = new WeakMap();\n uncontrolledNodes = new WeakMap();\n markerMap = {};\n }\n };\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var hideOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-aria-hidden'; }\n var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n // we should not hide aria-live elements - https://github.com/theKashey/aria-hidden/issues/10\n // and script elements, as they have no impact on accessibility.\n targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live], script')));\n return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden');\n};\n/**\n * Marks everything except given node(or nodes) as inert\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var inertOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-inert-ed'; }\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert');\n};\n/**\n * @returns if current browser supports inert\n */\nexport var supportsInert = function () {\n return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert');\n};\n/**\n * Automatic function to \"suppress\" DOM elements - _hide_ or _inert_ in the best possible way\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var suppressOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-suppressed'; }\n return (supportsInert() ? inertOthers : hideOthers)(originalTarget, parentNode, markerName);\n};\n","\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import React from 'react';\nimport * as Dialog from '@radix-ui/react-dialog';\n\ninterface SessionSecurityDialogProps {\n open: boolean;\n countdown: number;\n onContinue: () => void;\n onLogout: () => void;\n}\n\nexport const SessionSecurityDialog: React.FC<SessionSecurityDialogProps> = ({\n open,\n countdown,\n onContinue,\n onLogout,\n}) => {\n // Format countdown to show minutes and seconds\n const formatCountdown = (seconds: number): string => {\n if (seconds >= 60) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n if (secs === 0) {\n return `${mins} min`;\n }\n return `${mins} min ${secs} sec`;\n }\n return `${seconds} sec`;\n };\n\n return (\n <Dialog.Root open={open} onOpenChange={() => { }}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"session-security-overlay\" />\n <Dialog.Content\n className=\"session-security-modal\"\n aria-describedby=\"session-security-description\"\n onEscapeKeyDown={(e) => e.preventDefault()}\n onPointerDownOutside={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"session-security-title\">\n Your session is about to expire\n </Dialog.Title>\n\n <div id=\"session-security-description\" className=\"session-security-content\">\n <p className=\"session-security-countdown\">\n <span id=\"session_security_counter\">{formatCountdown(countdown)}</span> remaining\n </p>\n <p className=\"session-security-instruction\">\n Click or type to extend your session.\n </p>\n </div>\n\n <div className=\"session-security-actions\">\n <button\n onClick={onContinue}\n className=\"session-security-btn session-security-btn-primary\"\n >\n Continue Session\n </button>\n <button\n onClick={onLogout}\n className=\"session-security-btn session-security-btn-secondary\"\n >\n Logout\n </button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n\n <style>{`\n .session-security-overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.75);\n z-index: 10001;\n animation: fadeIn 200ms ease-out;\n }\n\n .session-security-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: white;\n border-radius: 8px;\n padding: 24px;\n max-width: 420px;\n width: 90%;\n z-index: 10002;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1),\n 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n animation: contentShow 200ms ease-out;\n }\n\n .session-security-modal:focus {\n outline: none;\n }\n\n .session-security-title {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n text-align: center;\n }\n\n .session-security-content {\n text-align: center;\n margin-bottom: 20px;\n }\n\n .session-security-countdown {\n font-size: 24px;\n font-weight: 700;\n color: #dc2626;\n margin: 0 0 12px 0;\n }\n\n .session-security-countdown span {\n font-variant-numeric: tabular-nums;\n }\n\n .session-security-instruction {\n margin: 0;\n color: #6b7280;\n font-size: 14px;\n }\n\n .session-security-actions {\n display: flex;\n gap: 12px;\n justify-content: center;\n }\n\n .session-security-btn {\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n }\n\n .session-security-btn-primary {\n background: var(--color-brand-500, #5048ed);\n color: white;\n }\n\n .session-security-btn-primary:hover {\n filter: brightness(0.9);\n }\n\n .session-security-btn-primary:focus {\n outline: 2px solid var(--color-brand-500, #5048ed);\n outline-offset: 2px;\n }\n\n .session-security-btn-secondary {\n background: #f3f4f6;\n color: #374151;\n border: 1px solid #d1d5db;\n }\n\n .session-security-btn-secondary:hover {\n background: #e5e7eb;\n border-color: #9ca3af;\n }\n\n .session-security-btn-secondary:focus {\n outline: 2px solid #6b7280;\n outline-offset: 2px;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes contentShow {\n from {\n opacity: 0;\n transform: translate(-50%, -48%) scale(0.96);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n }\n `}</style>\n </Dialog.Root>\n );\n};\n\nexport default SessionSecurityDialog;\n","import React from 'react';\nimport { useSessionSecurity } from '../hooks/useSessionSecurity';\nimport { SessionSecurityDialog } from './SessionSecurityDialog';\nimport type { SessionSecurityConfig } from '../../types';\n\ninterface SessionSecurityProviderProps {\n config: SessionSecurityConfig;\n children?: React.ReactNode;\n}\n\nexport const SessionSecurityProvider: React.FC<SessionSecurityProviderProps> = ({\n config,\n children,\n}) => {\n\n const {\n showWarning,\n countdown,\n renewSession,\n logoutNow,\n } = useSessionSecurity({\n config,\n onWarning: () => {\n console.log('Session security warning displayed');\n },\n onExpire: () => {\n console.log('Session expired');\n },\n onActivity: () => {\n // Optional: track activity events\n },\n });\n\n // Don't show dialog if session security is disabled\n if (!config || !config.enabled) {\n return <>{children}</>;\n }\n\n return (\n <>\n {children}\n <SessionSecurityDialog\n open={showWarning}\n countdown={countdown}\n onContinue={renewSession}\n onLogout={logoutNow}\n />\n </>\n );\n};\n\nexport default SessionSecurityProvider;\n","import React, { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { performDirectLogout } from \"../../services/api\";\n\nconst LogoutPage: React.FC = () => {\n const navigate = useNavigate();\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const performLogout = async () => {\n try {\n const result = await performDirectLogout();\n\n if (result.success || result.responseStatus === 401) {\n // Logout successful or already logged out\n // Wait a moment to show the message\n setTimeout(() => {\n // Redirect to login page\n navigate(\"/app/login\");\n }, 1500);\n } else {\n // Handle error\n setError(\n result.response?.message || \"An error occurred while logging out. Redirecting to login...\"\n );\n setTimeout(() => {\n navigate(\"/app/login\");\n }, 2000);\n }\n } catch (err: any) {\n console.error(\"Logout error:\", err);\n setError(\"An error occurred. Redirecting to login...\");\n setTimeout(() => {\n navigate(\"/app/login\");\n }, 2000);\n }\n };\n\n performLogout();\n }, [navigate]);\n\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <div\n style={{\n backgroundColor: \"white\",\n padding: \"40px\",\n borderRadius: \"8px\",\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.1)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n width: \"100%\",\n }}\n >\n {!error ? (\n <>\n <div\n style={{\n marginBottom: \"20px\",\n }}\n >\n {/* Spinner animation */}\n <div\n style={{\n width: \"50px\",\n height: \"50px\",\n border: \"3px solid #f3f3f3\",\n borderTop: \"3px solid var(--primary-color, #3b82f6)\",\n borderRadius: \"50%\",\n margin: \"0 auto\",\n animation: \"spin 1s linear infinite\",\n }}\n ></div>\n </div>\n <h2\n style={{\n fontSize: \"24px\",\n fontWeight: \"600\",\n marginBottom: \"12px\",\n color: \"#333\",\n }}\n >\n Logging you out...\n </h2>\n <p\n style={{\n fontSize: \"16px\",\n color: \"#666\",\n margin: 0,\n }}\n >\n Please wait while we securely log you out.\n </p>\n </>\n ) : (\n <>\n <div\n style={{\n marginBottom: \"20px\",\n color: \"#ef4444\",\n }}\n >\n <svg\n width=\"50\"\n height=\"50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n style={{ margin: \"0 auto\" }}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </div>\n <h2\n style={{\n fontSize: \"24px\",\n fontWeight: \"600\",\n marginBottom: \"12px\",\n color: \"#333\",\n }}\n >\n Logout Error\n </h2>\n <p\n style={{\n fontSize: \"16px\",\n color: \"#666\",\n margin: 0,\n }}\n >\n {error}\n </p>\n </>\n )}\n </div>\n\n <style>{`\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n};\n\nexport default LogoutPage;\n","import React from 'react';\nimport { Button } from '@zango-core/components';\nimport { useAppContext } from '../contexts/AppContext';\n\nconst ConfigurePage: React.FC = () => {\n const { menu, profileInfo, initializerEndpoint } = useAppContext();\n\n // Check if this is a \"no menu\" scenario vs actual configuration error\n const isNoMenuScenario = menu.length === 0 && profileInfo?.user_role && profileInfo.user_role !== 'AnonymousUsers';\n\n return (\n <div className=\"flex flex-col items-center justify-center h-screen text-center p-6 bg-gray-100\">\n <div className=\"bg-white rounded-xl p-12 shadow-md max-w-2xl w-full\">\n <h1 className=\"text-[40px] m-0 text-red-500 font-bold leading-none\">\n ⚙️\n </h1>\n <h2 className=\"text-2xl my-4 text-gray-800 font-semibold\">\n Configuration Error\n </h2>\n <p className=\"text-base text-gray-600 mb-6 leading-relaxed\">\n The application is trying to fetch configuration from:\n </p>\n <code className=\"block bg-gray-50 border border-gray-200 rounded-md p-3 text-sm text-gray-800 font-mono mb-6 break-all\">\n {initializerEndpoint}\n </code>\n <div className=\"text-left mb-8 p-4 bg-gray-50 rounded-lg\">\n <p className=\"text-sm text-gray-600 mb-3 font-semibold\">\n The response is either missing or invalid. Please check:\n </p>\n <ul className=\"text-sm text-gray-600 pl-5 m-0 list-disc space-y-2 pl-4\">\n <li>Appbuilder package routes are configured correctly</li>\n <li>Required policies are properly mapped</li>\n <li>The endpoint is accessible and returns valid data</li>\n </ul>\n </div>\n <div className=\"flex gap-3 justify-center\">\n <Button\n type=\"primary\"\n onClick={() => window.location.reload()}\n >\n Retry\n </Button>\n <Button\n onClick={() => window.location.href = '/app'}\n >\n Go Home\n </Button>\n </div>\n <p className=\"text-xs text-gray-500 mt-6\">\n Contact your administrator if this issue persists.\n </p>\n </div>\n </div>\n );\n};\n\nexport default ConfigurePage;\n","import React, { useMemo } from \"react\";\nimport {\n BrowserRouter as Router,\n Routes,\n Route,\n Navigate,\n useParams,\n useLocation,\n useNavigate,\n} from \"react-router-dom\";\nimport { Button } from \"@zango-core/components\";\nimport Layout from \"./components/layout/Layout\";\nimport PageTypeRouter from \"./routing/PageTypeRouter\";\nimport { AppProvider, useAppContext } from \"./contexts/AppContext\";\nimport DocumentHead from \"./components/DocumentHead\";\nimport { SessionSecurityProvider } from \"./components/SessionSecurityProvider\";\nimport \"./ZangoApp.css\";\nimport LogoutPage from \"./pages/LogoutPage\";\nimport LoginPage from \"./pages/LoginPage\";\nimport ConfigurePage from \"./pages/ConfigurePage\";\nimport type { RouteConfig, AuthConfig, SessionSecurityConfig } from \"../types\";\n\ninterface PageTypeRouterWrapperProps {\n customPages: Record<string, any>;\n}\n\n// Wrapper component to ensure PageTypeRouter re-renders on route change\nconst PageTypeRouterWrapper: React.FC<PageTypeRouterWrapperProps> = ({ customPages }) => {\n const params = useParams();\n const location = useLocation();\n // Create a unique key from path and params to ensure re-render on any change\n const paramKey = `${location.pathname}-${Object.values(params).join(\"-\")}`;\n return <PageTypeRouter key={paramKey} customPages={customPages} />;\n};\n\ninterface DynamicRoutesProps {\n customPages: Record<string, any>;\n}\n\n// Dynamic routes component that separates standalone and regular routes\nconst DynamicRoutes: React.FC<DynamicRoutesProps> = ({ customPages }) => {\n const { routes, loading, menu, pageTypeRegistry, registryError } = useAppContext();\n const firstMenuUri = menu.length > 0 ? menu[0].uri : null;\n\n // Show loading while app data or registry is loading\n if (loading) return <div className=\"zango-loading\">Loading...</div>;\n\n // Show error if registry failed to load\n if (registryError) {\n return <div className=\"zango-error\">Failed to load page registry: {registryError}</div>;\n }\n\n // Show error if registry is not available\n // if (!pageTypeRegistry) {\n // return (\n // <div className=\"flex flex-col items-center justify-center h-screen text-center p-6 bg-gray-100\">\n // <div className=\"bg-white rounded-xl p-12 shadow-md max-w-2xl w-full\">\n // <h1 className=\"text-[40px] m-0 text-red-500 font-bold leading-none\">\n // ⚙️\n // </h1>\n // <h2 className=\"text-2xl my-4 text-gray-800 font-semibold\">\n // Configuration Error\n // </h2>\n // <p className=\"text-base text-gray-600 mb-6 leading-relaxed\">\n // The application is trying to fetch configuration from:\n // </p>\n // <code className=\"block bg-gray-50 border border-gray-200 rounded-md p-3 text-sm text-gray-800 font-mono mb-6 break-all\">\n // {initializerEndpoint}\n // </code>\n // <div className=\"text-left mb-8 p-4 bg-gray-50 rounded-lg\">\n // <p className=\"text-sm text-gray-600 mb-3 font-semibold\">\n // The response is either missing or invalid. Please check:\n // </p>\n // <ul className=\"text-sm text-gray-600 pl-5 m-0 list-disc space-y-2 pl-4\">\n // <li>Appbuilder package routes are configured correctly</li>\n // <li>Required policies are properly mapped</li>\n // <li>The endpoint is accessible and returns valid data</li>\n // </ul>\n // </div>\n // <div className=\"flex gap-3 justify-center\">\n // <Button\n // type=\"primary\"\n // onClick={() => window.location.reload()}\n // >\n // Retry\n // </Button>\n // <Button\n // onClick={() => window.location.href = '/app'}\n // >\n // Go Home\n // </Button>\n // </div>\n // <p className=\"text-xs text-gray-500 mt-6\">\n // Contact your administrator if this issue persists.\n // </p>\n // </div>\n // </div>\n // );\n // }\n\n // Separate routes based on standalone flag in registry\n const standaloneRoutes = [];\n const regularRoutes = [];\n\n if (pageTypeRegistry) {\n routes.forEach((route: RouteConfig) => {\n const pageConfig = pageTypeRegistry[route.page_type];\n \n // Check if route has explicit standalone flag in extra_params\n // This only works for custom page types, other page types use registry default\n let isStandalone = false;\n if (route.page_type === 'custom') {\n const extraParams = route.extra_params || {};\n isStandalone = extraParams.standalone !== undefined\n ? extraParams.standalone === true\n : (pageConfig && pageConfig.standalone === true);\n } else {\n // For non-custom page types, only use registry default\n isStandalone = pageConfig && pageConfig.standalone === true;\n }\n \n if (isStandalone) {\n standaloneRoutes.push(route);\n } else {\n regularRoutes.push(route);\n }\n });\n }\n\n return (\n <Routes>\n {/* Hardcoded login route - standalone without layout */}\n <Route\n path=\"app/login/*\"\n element={\n <LoginPage basePath=\"/app/login\" />\n }\n />\n\n {/* Hardcoded logout route - standalone without layout */}\n <Route\n path=\"app/logout\"\n element={\n <LogoutPage />\n }\n />\n\n {/* Hardcoded configure route - standalone without layout */}\n <Route\n path=\"app/configuration-error\"\n element={\n <ConfigurePage />\n }\n />\n\n {/* Standalone routes (no layout) */}\n {standaloneRoutes.map((route) => {\n // Remove leading slash for React Router v6\n const routePath = route.path.startsWith(\"/\")\n ? route.path.slice(1)\n : route.path;\n\n return (\n <React.Fragment key={route.path}>\n {/* Route with wildcard for sub-routes */}\n <Route\n path={`${routePath}/*`}\n element={\n <PageTypeRouter customPages={customPages} forceRoute={route} />\n }\n />\n {/* Exact route */}\n <Route\n path={routePath}\n element={\n <PageTypeRouter customPages={customPages} forceRoute={route} />\n }\n />\n </React.Fragment>\n );\n })}\n\n {/* Routes with layout */}\n <Route path=\"/\" element={<Layout />}>\n <Route\n index\n element={\n firstMenuUri ? (\n <Navigate to={firstMenuUri} />\n ) : (\n <div>No menu items available</div>\n )\n }\n />\n {/* Add /app route - redirects are handled by AppContext */}\n <Route\n path=\"app\"\n element={\n <div className=\"zango-loading\">Redirecting...</div>\n }\n />\n {/* Dynamic routes based on API routes configuration */}\n {regularRoutes.map((route) => {\n // Remove leading slash and add wildcard for sub-routes\n const routePath = route.path.startsWith(\"/\")\n ? route.path.slice(1)\n : route.path;\n return (\n <React.Fragment key={route.path}>\n <Route\n path={`${routePath}/*`}\n element={<PageTypeRouterWrapper customPages={customPages} />}\n />\n <Route\n path={routePath}\n element={<PageTypeRouterWrapper customPages={customPages} />}\n />\n </React.Fragment>\n );\n })}\n </Route>\n\n {/* Fallback for any unmatched routes - show 404 page without layout */}\n <Route\n path=\"*\"\n element={\n <PageTypeRouter\n customPages={customPages}\n forceRoute={{ path: \"*\", page_type: \"404\" }}\n />\n }\n />\n\n {/* Explicit 404 route - standalone without layout */}\n <Route\n path=\"/404\"\n element={\n <PageTypeRouter\n customPages={customPages}\n forceRoute={{ path: \"/404\", page_type: \"404\" }}\n />\n }\n />\n </Routes>\n );\n};\n\ninterface ZangoAppContentProps {\n customPages: Record<string, any>;\n}\n\n// Inner component that uses the context\nconst ZangoAppContent: React.FC<ZangoAppContentProps> = ({ customPages }) => {\n const { appData, sessionSecurity } = useAppContext();\n\n // Check if user is authenticated (not anonymous)\n const isAuthenticated = appData && !appData.is_user_anonymous;\n\n // Create default session security config if not provided but user is authenticated\n const defaultSessionSecurity = {\n enabled: true,\n ping_url: '/session_security/ping/',\n warn_after: 1700, // 28 minutes (show dialog 2 min before expiry)\n expire_after: 1800, // 30 minutes\n };\n\n const effectiveSessionSecurity: SessionSecurityConfig | null = isAuthenticated\n ? sessionSecurity\n ? { ...defaultSessionSecurity, ...sessionSecurity, enabled: true }\n : defaultSessionSecurity\n : null;\n\n return (\n <>\n <DocumentHead />\n {isAuthenticated && effectiveSessionSecurity ? (\n <SessionSecurityProvider config={effectiveSessionSecurity}>\n <DynamicRoutes customPages={customPages} />\n </SessionSecurityProvider>\n ) : (\n <DynamicRoutes customPages={customPages} />\n )}\n </>\n );\n};\n\ninterface ZangoAppProps {\n config?: Record<string, any>;\n customPages?: Record<string, any>;\n layoutConfig?: Record<string, any>;\n topbarConfig?: Record<string, any>;\n navbarConfig?: Record<string, any>;\n customComponents?: Record<string, any>;\n authConfig?: AuthConfig;\n appInitializerEndpoint?: string;\n}\n\nconst ZangoApp: React.FC<ZangoAppProps> = ({\n config = {},\n customPages = {},\n layoutConfig = {},\n topbarConfig = {},\n navbarConfig = {},\n customComponents = {},\n authConfig = {},\n appInitializerEndpoint\n}) => {\n // Set the app initializer endpoint globally if provided via props\n if (appInitializerEndpoint && typeof window !== 'undefined') {\n (window as any).app_initializer_endpoint = appInitializerEndpoint;\n }\n\n return (\n <Router>\n <AppProvider\n config={config}\n layoutConfig={layoutConfig}\n topbarConfig={topbarConfig}\n navbarConfig={navbarConfig}\n customComponents={customComponents}\n authConfig={authConfig}\n >\n <ZangoAppContent customPages={customPages} />\n </AppProvider>\n </Router>\n );\n};\n\nexport default ZangoApp;\n","import React from \"react\";\nimport ZangoApp from \"./framework/ZangoApp\";\nimport { Toaster } from \"@zango-core/components\";\nimport \"./App.css\";\nimport type { AuthConfig } from \"./types\";\n\ninterface AppProps {\n customPages?: Record<string, any>;\n config?: Record<string, any>;\n layoutConfig?: Record<string, any>;\n topbarConfig?: Record<string, any>;\n navbarConfig?: Record<string, any>;\n customComponents?: Record<string, any>;\n authConfig?: AuthConfig;\n appInitializerEndpoint?: string;\n}\n\nconst App: React.FC<AppProps> = ({\n customPages = {},\n config = {},\n layoutConfig = {},\n topbarConfig = {},\n navbarConfig = {},\n customComponents = {},\n authConfig = {},\n appInitializerEndpoint\n}) => {\n return (\n <>\n <ZangoApp\n config={config}\n customPages={customPages}\n layoutConfig={layoutConfig}\n topbarConfig={topbarConfig}\n navbarConfig={navbarConfig}\n customComponents={customComponents}\n authConfig={authConfig}\n appInitializerEndpoint={appInitializerEndpoint}\n />\n <Toaster position=\"bottom-right\"\n expand={true}\n richColors={true}\n toastOptions={{\n className:\n \"!rounded-[8px]\"\n }} />\n </>\n );\n};\n\nexport default App;\n","// Global API Interceptor for all HTTP requests\nclass ApiInterceptor {\n constructor() {\n this.setupInterceptors();\n }\n\n handleRedirect(location) {\n if (location) {\n // Get current pathname (excluding domain)\n const currentPath =\n window.location.pathname +\n window.location.search +\n window.location.hash;\n\n // Don't add logout page to next parameter\n if (currentPath === \"/app/logout/\" || currentPath === \"/app/logout\") {\n window.location.href = location;\n return;\n }\n\n // Encode the current path as a query parameter\n const encodedPath = encodeURIComponent(currentPath);\n\n // Add the next parameter to the redirect URL\n const redirectUrl = `${location}?next=${encodedPath}`;\n\n // Use window.location for full page redirect\n window.location.href = redirectUrl;\n }\n }\n\n setupInterceptors() {\n // Store the original fetch\n const originalFetch = window.fetch;\n const interceptor = this;\n\n // Override global fetch\n window.fetch = async (...args) => {\n try {\n // Add timestamp header to the request\n const [url, options = {}] = args;\n\n // Check if this is an external URL\n const urlString = typeof url === 'string' ? url : url.toString();\n const isExternalUrl = urlString.startsWith('http') &&\n !urlString.startsWith(window.location.origin);\n\n // For external URLs, use original fetch without modifications\n if (isExternalUrl) {\n return await originalFetch(url, options);\n }\n\n const timestamp = Date.now().toString();\n\n // Ensure headers object exists\n const headers = new Headers(options.headers || {});\n headers.set(\"X-Client-Timestamp\", timestamp);\n headers.set(\n \"X-Client-Timezone\",\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n );\n headers.set(\"X-Client-Platform\", navigator.platform);\n\n // Update the options with the new headers\n const modifiedOptions = {\n ...options,\n headers: headers,\n };\n\n const response = await originalFetch(url, modifiedOptions);\n\n // Check if response URL is exactly window.location.origin + '/login/'\n const loginUrl = window.location.origin + \"/login/\";\n\n if (response.url && response.url === loginUrl) {\n interceptor.handleRedirect(\"/app/login/\");\n }\n\n return response;\n } catch (error) {\n throw error;\n }\n };\n\n // Also intercept XMLHttpRequest for older libraries\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (...args) {\n this._requestUrl = args[1]; // Store the request URL\n return originalOpen.apply(this, args);\n };\n\n XMLHttpRequest.prototype.send = function (...args) {\n const xhr = this;\n\n // Check if this is an external URL\n const requestUrl = this._requestUrl || '';\n const isExternalUrl = requestUrl.startsWith('http') &&\n !requestUrl.startsWith(window.location.origin);\n\n // Only add headers for same-origin requests\n if (!isExternalUrl) {\n // Add logging headers\n const timestamp = Date.now().toString();\n this.setRequestHeader(\"X-Client-Timestamp\", timestamp);\n this.setRequestHeader(\"X-User-Agent\", navigator.userAgent);\n this.setRequestHeader(\n \"X-Client-Timezone\",\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n );\n this.setRequestHeader(\"X-Client-Platform\", navigator.platform);\n }\n\n // Add event listener to check response URL\n this.addEventListener(\"load\", function () {\n // Check if the final response URL is exactly window.location.origin + '/login/'\n const responseUrl = xhr.responseURL || xhr._requestUrl;\n const loginUrl = window.location.origin + \"/login/\";\n if (responseUrl && responseUrl === loginUrl) {\n interceptor.handleRedirect(\"/app/login/\");\n }\n });\n\n return originalSend.apply(this, args);\n };\n }\n}\n\n// Create singleton instance\nconst apiInterceptor = new ApiInterceptor();\n\nexport default apiInterceptor;\n"],"names":["LOGO_CACHE_KEY","CACHE_TTL","LogoCache","cached","data","error","logoUrl","appName","version","existingCache","base64Data","cacheData","url","absoluteUrl","response","contentType","blob","resolve","reject","reader","str","hash","i","char","timestamp","currentUrl","onUpdate","newCache","logoCache","DefaultLogo","jsxs","jsx","CachedLogo","height","linkTo","logoSrc","setLogoSrc","useState","hasError","setHasError","useEffect","handleImageError","useCallback","handleImageLoad","Link","getApiUrl","endpoint","apiConfig","getEndpoint","endpointKey","getApiTimeout","buildApiUrl","baseUrl","params","urlPart","existingQuery","normalizedUrl","allParams","value","key","queryString","baseURL","getCookie","name","cookies","cookie","buildAuthHeaders","callGetApi","fullUrl","callPostApi","payload","callPutApi","callDeleteApi","callPatchApi","callApi","apiDetails","apiRequest","generateQueryString","queryParams","getAppInitData","normalizedEndpoint","getUserProfile","updateUserProfile","uploadProfilePhoto","changePassword","toggleTwoFactor","switchRole","roleId","getUserSessions","logoutSession","sessionId","logoutAllSessions","sessionIds","logout","performLogout","pingSessionSecurity","pingUrl","idleFor","fetchAppInitData","fetchUserProfile","fetchUserSessions","saveUserProfile","uploadPhoto","formData","updatePassword","passwordData","setTwoFactor","enabled","changeRole","removeSession","removeAllSessions","performAppLogout","performDirectLogout","pingSession","_typeof","obj","trimLeft","trimRight","tinycolor","color","opts","rgb","inputToRGB","RsRGB","GsRGB","BsRGB","R","G","B","boundAlpha","hsv","rgbToHsv","h","s","v","hsl","rgbToHsl","l","allow3Char","rgbToHex","allow4Char","rgbaToHex","bound01","hexNames","secondColor","hex8String","rgbaToArgbHex","secondHex8String","gradientType","format","formatSet","formattedString","hasAlpha","needsAlphaFormat","fn","args","_lighten","_brighten","_darken","_desaturate","_saturate","_greyscale","_spin","_analogous","_complement","_monochromatic","_splitcomplement","polyad","newColor","convertToPercentage","a","ok","stringInputToObject","isValidCSSUnit","rgbToRgb","hsvToRgb","hslToRgb","r","g","b","max","min","d","hue2rgb","p","q","t","f","mod","hex","pad2","convertDecimalToHex","color1","color2","amount","clamp01","hue","number","result","step","results","slices","part","ret","modification","rgb1","rgb2","rgba","c1","c2","wcag2","readability","wcag2Parms","out","validateWCAG2Parms","baseColor","colorList","bestColor","bestScore","includeFallbackColors","level","size","names","flip","o","flipped","n","isOnePointZero","processPercent","isPercentage","val","parseIntFromHex","c","convertHexToDecimal","matchers","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","named","match","parms","generatePalette","generateCSSVariables","theme","css","palettes","group","values","shade","cssKey","isLightColor","getContrastColor","bgColor","getColor","colorName","cssVarName","colorValue","rootElement","primaryColor","successColor","errorColor","warningColor","grayColor","colorMap","getBaseUrl","useApiConfig","location","useLocation","routes","useAppContext","entity","sortedRoutes","routeConfig","route","pattern","config","useRouteConfig","getApiConfig","options","CrudPage","basePath","CrudHandler","TrainingPage","TrainingRouter","setTrainingRouter","React","setError","trainingModule","err","PAGE_CONFIG","pageType","FRAMEWORK_PAGES","getAvailablePageTypes","requestedPageTypes","getFrameworkPageComponent","CustomPageFallback","componentName","customPagesDir","fileExtension","copiedIndex","setCopiedIndex","copyToClipboard","text","index","exampleComponentName","dirPath","ext","componentCode","mainIndexExportCode","appJsCode","mkdirCommand","styles","e","CustomPageLoader","customPagesGlob","CustomComponent","setCustomComponent","modules","modulePath","module","Suspense","NotFoundPage","message","target","toKebabCase","string","toCamelCase","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ArrowLeft","CircleCheckBig","Crown","Globe","House","Lock","Mail","Phone","Shield","Smartphone","User","Users","bind","thisArg","toString","getPrototypeOf","iterator","toStringTag","kindOf","cache","thing","kindOfTest","type","typeOfTest","isArray","isUndefined","isBuffer","isFunction","isArrayBuffer","isArrayBufferView","isString","isNumber","isObject","isBoolean","isPlainObject","prototype","isEmptyObject","isDate","isFile","isBlob","isFileList","isStream","isFormData","kind","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","trim","forEach","allOwnKeys","keys","len","findKey","_key","_global","isContextDefined","context","merge","caseless","skipUndefined","assignValue","targetKey","extend","stripBOM","content","inherits","constructor","superConstructor","descriptors","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","lastIndex","toArray","arr","isTypedArray","TypedArray","forEachEntry","_iterator","pair","matchAll","regExp","matches","isHTMLForm","m","hasOwnProperty","isRegExp","reduceDescriptors","reducer","reducedDescriptors","descriptor","freezeMethods","toObjectSet","arrayOrString","delimiter","define","noop","toFiniteNumber","defaultValue","isSpecCompliantForm","toJSONObject","stack","visit","source","reducedValue","isAsyncFn","isThenable","_setImmediate","setImmediateSupported","postMessageSupported","token","callbacks","cb","asap","isIterable","utils$1","AxiosError","code","request","utils","customProps","axiosError","msg","errCode","httpAdapter","isVisitable","removeBrackets","renderKey","path","dots","isFlatArray","predicates","toFormData","option","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","el","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","encoder","_encode","buildURL","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","id","transitionalDefaults","URLSearchParams$1","FormData$1","Blob$1","platform$1","URLSearchParams","FormData","Blob","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","platform","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","rawValue","parser","defaults","headers","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","status","method","ignoreDuplicateOf","parseHeaders","rawHeaders","parsed","line","$internals","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders$1","valueOrRewrite","rewrite","self","setHeader","_value","_header","_rewrite","lHeader","setHeaders","dest","entry","matcher","deleted","deleteHeader","normalized","targets","asStrings","first","computed","accessors","defineAccessor","AxiosHeaders","mapped","headerValue","transformData","fns","isCancel","CanceledError","settle","validateStatus","parseProtocol","speedometer","samplesCount","bytes","timestamps","head","tail","firstSampleTS","chunkLength","now","startedAt","bytesCount","passed","throttle","freq","threshold","lastArgs","timer","invoke","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","loaded","total","progressBytes","rate","inRange","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","expires","domain","secure","sameSite","isAbsoluteURL","combineURLs","relativeURL","buildFullPath","requestedURL","allowAbsoluteUrls","isRelativeUrl","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","newConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","auth","formHeaders","allowedHeaders","xsrfValue","isXHRAdapterSupported","xhrAdapter","_config","requestData","requestHeaders","responseType","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","done","onloadend","responseHeaders","event","timeoutErrorMessage","cancel","protocol","composeSignals","signals","timeout","length","controller","aborted","onabort","reason","unsubscribe","signal","streamChunk","chunk","chunkSize","pos","end","readBytes","iterable","readStream","stream","trackStream","onProgress","onFinish","_onFinish","loadedBytes","DEFAULT_CHUNK_SIZE","globalFetchAPI","Request","Response","ReadableStream","TextEncoder","test","factory","env","envFetch","isFetchSupported","isRequestSupported","isResponseSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","resolvers","res","getBodyLength","body","resolveBodyLength","cancelToken","withCredentials","fetchOptions","_fetch","composedSignal","requestContentLength","_request","contentTypeHeader","flush","isCredentialsSupported","resolvedOptions","isStreamResponse","responseContentLength","responseData","seedCache","getFetch","fetch","seeds","seed","map","knownAdapters","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","getAdapter","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","dispatchRequest","VERSION","validators","deprecatedWarnings","validator","formatMessage","opt","desc","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","onFulfilled","onRejected","fullPath","Axios","generateHTTPMethod","isForm","CancelToken$1","CancelToken","executor","resolvePromise","onfulfilled","_resolve","abort","spread","callback","isAxiosError","HttpStatusCode","createInstance","defaultConfig","instance","axios","promises","all","Cancel","formToJSON","BASE_PATH","BaseAPI","configuration","globalAxios","RequiredError","field","operationServerMap","DUMMY_BASE_URL","assertParamExists","functionName","paramName","paramValue","setFlattenedQueryParams","urlSearchParams","parameter","item","currentKey","setSearchParams","objects","searchParams","serializeDataIfNeeded","requestOptions","nonString","toPathString","createRequestFunction","axiosArgs","axiosRequestArgs","ApplicationConfigurationApiAxiosParamCreator","localVarPath","localVarUrlObj","baseOptions","localVarRequestOptions","localVarHeaderParameter","headersFromBaseOptions","xCSRFToken","authConfig","localVarQueryParameter","localVarFormParams","ApplicationConfigurationApiFp","localVarAxiosParamCreator","localVarAxiosArgs","localVarOperationServerIndex","localVarOperationServerBasePath","ApplicationConfigurationApi","AuthenticationApiAxiosParamCreator","loginUserRequest","AuthenticationApiFp","AuthenticationApi","LoginWithOTPApiAxiosParamCreator","loginOTPRequest","loginOTPVerifyRequest","LoginWithOTPApiFp","LoginWithOTPApi","MultiFactorAuthenticationApiAxiosParamCreator","mfaVerifyRequest","MultiFactorAuthenticationApiFp","MultiFactorAuthenticationApi","OAuthApiAxiosParamCreator","provider","scope","authuser","hd","prompt","xCsrftoken","process","callbackUrl","OAuthApiFp","OAuthApi","PasswordManagementApiAxiosParamCreator","passwordChangeRequest","passwordSetRequest","PasswordManagementApiFp","PasswordManagementApi","RoleManagementApiAxiosParamCreator","role","RoleManagementApiFp","RoleManagementApi","UserProfileApiAxiosParamCreator","mobile","profilePic","UserProfileApiFp","UserProfileApi","Configuration","param","mime","jsonMime","authApi","configApi","otpApi","mfaApi","passwordApi","roleApi","oauthApi","getCsrfToken","metaTag","altMatch","authConfigPromise","extractErrorMessage","authService","rawData","username","credentials","csrfToken","loginRequest","actualResponse","errorMessage","isAuthenticatedViaCookie","cookieUtils","identifier","otpRequest","errorData","firstError","otp","verifyRequest","currentPassword","newPassword","authUser","resp","password","policy","errors","profileConfig","samlId","responseText","requestId","errorText","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","useAuthStore","set","AuthConfigContext","createContext","useAuthConfig","useContext","AuthConfigProvider","defaultAuthConfig","deepMerge","mergedConfig","generateAuthCSSVariables","card","applyAuthTheme","authStyleElement","authComponentCSS","removeAuthTheme","getAuthBackgroundStyle","bg","style","getAuthCardStyle","getAuthLogoStyle","logo","getLogoAlignment","getLogoContainerStyle","logoConfig","getAuthTextStyle","getAuthSecondaryTextStyle","getAuthLinkStyle","ForgotPasswordForm","onSubmit","loading","setLoading","submitted","setSubmitted","formKey","setFormKey","resetMethods","setResetMethods","selectedMethod","setSelectedMethod","getResetPasswordConfig","getMessagesConfig","resetPasswordConfig","messagesConfig","cardStyle","logoContainerStyle","logoStyle","methods","handleSubmit","submitData","prev","getContactPlaceholder","getContactValidationRules","getSuccessMessage","contactType","successMessage","Result","Button","Form","Alert","FormItem","Select","Space","Input","ResetPasswordForm","validating","setValidating","isValidKey","setIsValidKey","validationError","setValidationError","passwordPolicy","setPasswordPolicy","validatePassword","_","validation","toast","PasswordInput","getFieldValue","validateRedirectUrl","trimmed","getNextParam","search","next","getValidRedirectUrl","nextParam","serverRedirectUrl","defaultUrl","OAuthCallback","onSuccess","onError","redirectPath","title","errorTitle","roleSelectionTitle","roleSelectionSubtitle","twoFactorTitle","twoFactorSubtitle","passwordResetTitle","passwordResetSubtitle","showCompleteFlow","setShowCompleteFlow","authResult","setAuthResult","authStep","setAuthStep","authData","setAuthData","twoFactorMethods","setTwoFactorMethods","passwordResetReason","setPasswordResetReason","nextRedirect","setNextRedirect","hasProcessedCallback","useRef","navigate","useNavigate","setAuthToken","handleLoginSuccess","nextStep","loginUser","userInfo","rolesArray","handleOAuthCallback","hashParams","errorDescription","handleRetry","handleAuthComplete","redirectUrl","currentPath","hasAuthParam","Card","Spin","GoogleIcon","MicrosoftIcon","GitHubIcon","LinkedInIcon","FacebookIcon","TwitterIcon","AppleIcon","SlackIcon","SAMLIcon","OktaIcon","getProviderIcon","providerName","ProviderButton","prefix","postfix","handleClick","userMessage","getProviderDisplayName","label","providerIdentifier","icon","OTPInput","onChange","disabled","setOtp","inputRefs","valueArray","newOtp","handleChange","element","handleKeyDown","handlePaste","pastedArray","nextEmptyIndex","digit","AuthContext","useAuthContext","AuthProvider","user","setUser","pendingAuth","setPendingAuth","availableRoles","setAvailableRoles","setAuthConfig","hasInitializedRef","initializeAuth","checkAuth","finalUser","Text","Title","Typography","OTPForm","onBack","submitButtonText","verifyButtonText","resendButtonText","setStep","setUsername","usernameType","setUsernameType","otpError","setOtpError","requestError","setRequestError","resendTimer","setResendTimer","allowedUsernames","getInputPlaceholder","getValidationRules","handleRequestOTP","handleVerifyOTP","otpLength","enrichedResult","handleResendOTP","Segmented","DynamicLoginForm","onLogin","showRememberMe","activeMethod","setActiveMethod","activeTab","setActiveTab","showOTPForm","setShowOTPForm","isLoggedIn","setIsLoggedIn","showPasswordChange","setShowPasswordChange","setNewPassword","confirmPassword","setConfirmPassword","getLoginConfig","getProvidersConfig","configContext","effectiveAuthConfig","textStyle","secondaryTextStyle","linkStyle","checkAuthentication","hasEmail","hasMobile","isAuthenticated","getUsernameRules","handlePasswordLogin","loginData","handleOTPSuccess","handleLogout","handleChangePassword","renderPasswordForm","loginConfig","allowedKeys","Checkbox","renderOTPOption","renderAuthMethods","hasProviders","isPasswordEnabled","isOTPEnabled","providersConfig","Divider","Tabs","Fragment","LoginForm","showForgotPassword","selectedUsernameType","setSelectedUsernameType","getUsernamePlaceholder","getUsernameValidationRules","baseRules","showUsernameSelector","isRememberMeEnabled","isForgotPasswordEnabled","Paragraph","Avatar","src","sizeValue","Empty","description","image","getRoleIcon","roleName","RoleSelection","roles","onRoleSelect","subtitle","selectedRole","setSelectedRole","submitting","setSubmitting","getRoleSelectionConfig","getCardConfig","roleConfig","EmptyComponent","displayTitle","displaySubtitle","gridColumns","CustomRoleCard","cardStyling","isSelected","CheckCircle","Tag","SecondFactorAuth","availableMethods","onVerify","otpDigits","retryInterval","otpSent","setOtpSent","getTwoFactorConfig","twoFactorConfig","getMaskedContact","handleSendOTP","handleVerify","expectedLength","handleResend","renderMethodSelector","PasswordResetRequired","onReset","passwordRules","setPassword","setErrorMessage","effectivePasswordRules","setEffectivePasswordRules","getPasswordStrength","pwd","strength","passwordStrength","Progress","Content","Layout","SAMLCallbackPage","onAuthComplete","useSearchParams","handleSAMLCallback","handleRoleSelection","handleTwoFactorSuccess","handlePasswordResetSuccess","renderContent","shouldRenderOuterCard","LoginContext","useLoginContext","samlErrorShown","LoginPage","useDynamicConfig","staticConfig","setLoginConfig","useLayoutEffect","samlError","getCustomComponents","customComponents","backgroundStyle","cleanUrl","CustomLoginPage","CustomLoginCard","fetchLoginMethods","renderLoginForm","LoginPageWithRoleSelection","onLoginSuccess","initialAuthResult","selectRole","login","loginError","setLoginError","handleLogin","handleRoleSelect","CompleteAuthFlow","initialAuthState","initialRedirectUrl","authToken","statusCode","mfaMethod","handleTwoFactorVerify","handlePasswordReset","OAuthCallbackPage","handleOAuthSuccess","handleOAuthError","finalResult","useAuth","Header","mockOTPs","mock2FAOTPs","USER_CONFIGS","MOCK_ROLES","createMockApiConfig","selectedScenario","userConfig","mockUser","LoginRouter","setBasePath","useMemo","LoginWrapper","pendingAuthResult","nextPath","decodedPath","ForgotPasswordWrapper","forgotPassword","handleForgotPassword","ResetPasswordWrapper","resetPassword","useParams","handleResetPassword","Routes","Route","Navigate","redirect_url","Home","SSOButtons","layout","gap","buttonTextPrefix","buttonTextPostfix","hasSSOEnabled","hasOIDCEnabled","ssoProviders","oidcProviders","CustomProviderButton","allProviders","isSingleButton","gapClass","containerClasses","PasswordLoginForm","authConfigLoaded","setAuthConfigLoaded","loginContext","needsTabs","loginPayload","tabItems","OTPLoginForm","createDynamicPageRegistry","availablePageTypes","registry","matchedRoutePath","customPages","customPagePath","unconfiguredPageTypes","extractPageTypesFromRoutes","pageTypes","createRegistryFromRoutes","AppContext","fetchInProgress","AppProvider","layoutConfig","topbarConfig","navbarConfig","appData","setAppData","cachedLogo","setCachedLogo","pageTypeRegistry","setPageTypeRegistry","registryLoading","setRegistryLoading","registryError","setRegistryError","getInitializerEndpoint","appConfig","defaultTheme","defaultStyleId","defaultStyle","currentSearch","isConfigPage","isLogoutPage","cleanUrlParams","cleaned","cleanedSearch","hasMenu","hasRoutes","isAnonymous","isValidPath","routePath","navigateWithParams","isLoginPage","firstMenuPath","cancelled","staticRegistry","useSmartNavigation","isInternalRoute","normalizedPath","normalizedRoutePath","segment","SmartLink","to","onClick","updateSvgColors","svg","child","NavbarLogo","appLogo","collapsed","initial","Navbar","menuItems","expandedItems","setExpandedItems","navRef","menuElement","li","isActive","defaultColor","activeColor","handleMouseEnter","handleMouseLeave","isPathMatched","normalizedItemUrl","itemPath","comparePath","childUrl","toggleExpanded","itemName","newExpandedItems","renderIcon","showLogo","showMenu","isCollapsed","collapsible","customLogo","customMenuContent","customBottomContent","customNavbar","customMenu","menuConfig","setCollapsed","navbarWidth","itemUrl","isExpanded","hasChildren","subItem","subItemUrl","isSubActive","useProfileData","shouldFetch","profileData","setProfileData","hasAttemptedFetch","setHasAttemptedFetch","shouldSetPassword","setShouldSetPassword","fetchData","profileInfo","refetch","deleteCookie","cookieString","nameEQ","ca","setCookie","days","date","zangoCookie","hostname","parentDomain","finalRedirectUrl","separator","showLogoutConfirmation","onConfirm","overlay","modal","cancelBtn","confirmBtn","handleEscape","UserProfileDrawer","isOpen","onClose","isEditingName","setIsEditingName","isEditingPassword","setIsEditingPassword","profilePhoto","setProfilePhoto","twoFactorEnabled","setTwoFactorEnabled","canSetPassword","setCanSetPassword","activeSessions","setActiveSessions","sessionsLoading","setSessionsLoading","sessionsError","setSessionsError","setTokens","profileLoading","profileError","refetchProfile","setFormData","setPasswordData","setErrors","passwordErrors","setPasswordErrors","serverMessage","setServerMessage","roleSwitchLoading","setRoleSwitchLoading","passwordValidation","setPasswordValidation","fetchSessions","sessionsData","lastPasswordChange","nextPasswordDue","lastChangedDate","expiryDate","canSetPasswordFlag","policyToUse","formatSession","session","browserInfo","createdAt","lastSeenAt","getBrowserName","agent","getOS","formatTimeAgo","dateStr","cleanDateStr","diffMs","diffSecs","diffMins","diffHours","diffDays","browserName","os","sessionDate","hourAgo","prevIsOpen","setPrevIsOpen","handleInputChange","handlePasswordChange","validateNameForm","newErrors","handlePhotoUpload","file","handleToggleTwoFactor","newTwoFactorState","handleLogoutSession","handleLogoutAllSessions","otherSessionIds","validatePasswordForm","valid","handleNameSubmit","validationErrors","handlePasswordSubmit","handleRoleSwitch","formattedSession","TopbarLogoutButton","onLogout","TopbarViewProfileButton","onViewProfile","Topbar","dropdownOpen","setDropdownOpen","roleDropdownExpanded","setRoleDropdownExpanded","userDrawerOpen","setUserDrawerOpen","dropdownRef","handleClickOutside","toggleDropdown","roleUrl","currentRole","otherRoles","showProfile","showLeftSection","showRightSection","customLeftContent","customRightContent","customProfileMenu","customViewProfile","profileMenuConfig","showViewProfile","showLogout","showRoleSwitch","customMenuItems","handleViewProfile","defaultLayoutConfig","defaultTopbarConfig","defaultNavbarConfig","mergeWithDefaults","menu","finalLayoutConfig","finalTopbarConfig","finalNavbarConfig","showLoader","contentSpinner","hideLoader","minDisplayTime","startTime","elapsedTime","layoutType","displaySidebar","displayTopbar","CustomLayout","CustomTopbar","CustomNavbar","Outlet","getRenderComponent","defaultProps","PageTypeRouter","forceRoute","initializerEndpoint","setRouteConfig","aSegments","matchPath","prefixPath","componentKey","DocumentHead","metadata","cleanupRefs","cleanupElements","createOrUpdateElement","updateElement","preloadAsset","link","getAssetUrl","fallback","meta","faviconUrl","faviconPngUrl","appleTouchIconUrl","ogImageUrl","twitterImageUrl","manifestUrl","useSessionSecurity","onExpire","onWarning","onActivity","showWarning","setShowWarning","countdown","setCountdown","lastActivityRef","timeoutRef","countdownIntervalRef","expiredRef","counterStartedRef","showWarningRef","onExpireRef","onWarningRef","onActivityRef","applyRef","pingRef","pongRef","activityRef","activityEvents","clearTimer","expire","hideWarning","startCountdown","warn_after","expire_after","defaultTimeLeft","targetTime","distance","seconds","stopCountdown","pong","ping","apply","nextPing","milliseconds","activity","renewSession","logoutNow","handleActivity","composeEventHandlers","originalEventHandler","ourEventHandler","checkForDefaultPrevented","setRef","composeRefs","refs","node","hasCleanup","cleanups","cleanup","useComposedRefs","createContext2","rootComponentName","defaultContext","Context","Provider","useContext2","consumerName","createContextScope","scopeName","createContextScopeDeps","defaultContexts","createContext3","BaseContext","createScope","scopeContexts","contexts","composeContextScopes","scopes","baseScope","scopeHooks","createScope2","overrideScopes","nextScopes","nextScopes2","useScope","currentScope","useLayoutEffect2","useReactId","count","useId","deterministicId","setId","reactId","useInsertionEffect","useControllableState","defaultProp","caller","uncontrolledProp","setUncontrolledProp","onChangeRef","useUncontrolledState","isControlled","isControlledRef","wasControlled","setValue","nextValue","value2","prevValueRef","createSlot","ownerName","SlotClone","createSlotClone","Slot2","forwardedRef","slotProps","childrenArray","slottable","isSlottable","newElement","newChildren","childrenRef","getElementRef","props2","mergeProps","SLOTTABLE_IDENTIFIER","childProps","overrideProps","propName","slotPropValue","childPropValue","getter","mayWarn","NODES","Primitive","primitive","Slot","Node","asChild","primitiveProps","Comp","dispatchDiscreteCustomEvent","ReactDOM","useCallbackRef","callbackRef","useEscapeKeydown","onEscapeKeyDownProp","ownerDocument","onEscapeKeyDown","DISMISSABLE_LAYER_NAME","CONTEXT_UPDATE","POINTER_DOWN_OUTSIDE","FOCUS_OUTSIDE","originalBodyPointerEvents","DismissableLayerContext","DismissableLayer","disableOutsidePointerEvents","onPointerDownOutside","onFocusOutside","onInteractOutside","onDismiss","layerProps","setNode","force","composedRefs","node2","layers","highestLayerWithOutsidePointerEventsDisabled","highestLayerWithOutsidePointerEventsDisabledIndex","isBodyPointerEventsDisabled","isPointerEventsEnabled","pointerDownOutside","usePointerDownOutside","isPointerDownOnBranch","branch","focusOutside","useFocusOutside","dispatchUpdate","handleUpdate","BRANCH_NAME","DismissableLayerBranch","handlePointerDownOutside","isPointerInsideReactTreeRef","handleClickRef","handlePointerDown","handleAndDispatchPointerDownOutsideEvent2","handleAndDispatchCustomEvent","eventDetail","timerId","handleFocusOutside","isFocusInsideReactTreeRef","handleFocus","handler","detail","discrete","AUTOFOCUS_ON_MOUNT","AUTOFOCUS_ON_UNMOUNT","EVENT_OPTIONS","FOCUS_SCOPE_NAME","FocusScope","loop","trapped","onMountAutoFocusProp","onUnmountAutoFocusProp","scopeProps","container","setContainer","onMountAutoFocus","onUnmountAutoFocus","lastFocusedElementRef","focusScope","handleFocusIn2","focus","handleFocusOut2","relatedTarget","handleMutations2","mutations","mutation","mutationObserver","focusScopesStack","previouslyFocusedElement","mountEvent","focusFirst","removeLinks","getTabbableCandidates","unmountEvent","isTabKey","focusedElement","container2","last","getTabbableEdges","candidates","select","candidate","findVisible","nodes","walker","isHiddenInput","elements","isHidden","upTo","isSelectableInput","createFocusScopesStack","activeFocusScope","arrayRemove","updatedArray","items","PORTAL_NAME","Portal","containerProp","portalProps","mounted","setMounted","useStateMachine","machine","Presence","present","presence","usePresence","React2","stylesRef","prevPresentRef","prevAnimationNameRef","send","currentAnimationName","getAnimationName","wasPresent","prevAnimationName","timeoutId","ownerWindow","handleAnimationEnd","isCurrentAnimation","currentFillMode","handleAnimationStart","useFocusGuards","edgeGuards","createFocusGuard","__assign","__rest","__spreadArray","from","pack","ar","zeroRightClassName","fullWidthClassName","noScrollbarsClassName","removedBarSizeVariable","assignRef","initialValue","useIsomorphicLayoutEffect","currentValues","useMergeRefs","newValue","oldValue","prevRefs_1","nextRefs_1","current_1","ItoI","innerCreateMedium","middleware","buffer","assigned","medium","x","cbs","pendingQueue","executeQueue","cycle","createSidecarMedium","SideCar","_a","sideCar","Target","exportSidecar","exported","effectCar","nothing","RemoveScroll","parentRef","setCallbacks","forwardProps","removeScrollBar","shards","noRelative","noIsolation","inert","allowPinchZoom","_b","Container","gapMode","containerRef","containerProps","getNonce","makeStyleTag","nonce","injectStyles","insertStyleTag","stylesheetSingleton","counter","stylesheet","styleHookSingleton","sheet","isDynamic","styleSingleton","useStyle","Sheet","dynamic","zeroGap","parse","getOffset","cs","left","top","right","getGapWidth","offsets","documentWidth","windowWidth","Style","lockAttribute","getStyles","allowRelative","important","getCurrentUseCounter","useLockAttribute","newCounter","RemoveScrollBar","noImportant","passiveSupported","nonPassive","alwaysContainsScroll","elementCanBeScrolled","overflow","elementCouldBeVScrolled","elementCouldBeHScrolled","locationCouldBeScrolled","axis","current","isScrollable","elementCouldBeScrolled","getScrollVariables","scrollHeight","clientHeight","getVScrollVariables","scrollTop","getHScrollVariables","scrollLeft","scrollWidth","clientWidth","getDirectionFactor","direction","handleScroll","endTarget","sourceDelta","noOverscroll","directionFactor","delta","targetInLock","shouldCancelScroll","isDeltaPositive","availableScroll","availableScrollTop","scroll_1","capacity","elementScroll","parent_1","getTouchXY","getDeltaXY","extractRef","deltaCompare","y","generateStyle","idCounter","lockStack","RemoveScrollSideCar","shouldPreventQueue","touchStartRef","activeAxis","lastProps","allow_1","shouldCancelEvent","parent","touch","touchStart","deltaX","deltaY","currentAxis","moveDirection","canBeScrolledInMainDirection","cancelingAxis","shouldPrevent","_event","sourceEvent","shardNodes","shouldStop","shouldCancel","should","getOutermostShadowParent","scrollTouchStart","scrollWheel","scrollTouchMove","inst","shadowParent","ReactRemoveScroll","getDefaultParent","originalTarget","sampleTarget","counterMap","uncontrolledNodes","markerMap","lockCount","unwrapHost","correctTargets","correctedTarget","applyAttributeToOthers","parentNode","markerName","controlAttribute","markerCounter","hiddenNodes","elementsToKeep","elementsToStop","keep","deep","attr","alreadyHidden","counterValue","markerValue","hideOthers","activeParentNode","DIALOG_NAME","createDialogContext","DialogProvider","useDialogContext","Dialog","__scopeDialog","openProp","defaultOpen","onOpenChange","triggerRef","contentRef","open","setOpen","prevOpen","TRIGGER_NAME","DialogTrigger","triggerProps","composedTriggerRef","PortalProvider","usePortalContext","DialogPortal","forceMount","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","DialogContentImpl","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","trapFocus","onOpenAutoFocus","onCloseAutoFocus","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Overlay","SessionSecurityDialog","onContinue","Dialog.Root","Dialog.Portal","Dialog.Overlay","Dialog.Content","Dialog.Title","mins","secs","SessionSecurityProvider","LogoutPage","ConfigurePage","PageTypeRouterWrapper","paramKey","DynamicRoutes","firstMenuUri","standaloneRoutes","regularRoutes","pageConfig","isStandalone","extraParams","ZangoAppContent","sessionSecurity","defaultSessionSecurity","effectiveSessionSecurity","ZangoApp","appInitializerEndpoint","Router","App","Toaster","ApiInterceptor","encodedPath","originalFetch","urlString","modifiedOptions","loginUrl","originalOpen","originalSend","xhr","requestUrl","responseUrl"],"mappings":"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","x_google_ignoreList":[5,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,85,86,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168]}
|