@zango-core/crm-framework 0.2.2 → 1.0.11
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/Dashboard-D1EiE6qN.js +26 -0
- package/dist/Dashboard-D1EiE6qN.js.map +1 -0
- package/dist/PageTypeRegistry-DocXEd-Y.js +62 -0
- package/dist/PageTypeRegistry-DocXEd-Y.js.map +1 -0
- package/dist/index-CxRN1-6b.js +5 -0
- package/dist/index-CxRN1-6b.js.map +1 -0
- package/dist/index.framework-BpnUT9fo.js +13277 -0
- package/dist/index.framework-BpnUT9fo.js.map +1 -0
- package/dist/zango-crm-framework.js +88 -10767
- package/dist/zango-crm-framework.js.map +1 -1
- package/dist/zango-crm-framework.umd.cjs +202 -29
- package/dist/zango-crm-framework.umd.cjs.map +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zango-crm-framework.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/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/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/pages/LoginPage.tsx","../src/auth/components/RoleSelection.tsx","../src/auth/pages/LoginPageWithRoleSelection.tsx","../src/auth/components/SecondFactorAuth.tsx","../src/auth/components/PasswordResetRequired.tsx","../src/auth/pages/CompleteAuthFlow.tsx","../src/auth/pages/OAuthCallbackPage.tsx","../src/auth/hooks/useAuth.tsx","../src/auth/components/LoginRouter.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/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 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 // 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 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 const [logoSrc, setLogoSrc] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [hasError, setHasError] = useState<boolean>(false);\n\n // Initialize logo from cache or URL\n useEffect(() => {\n const initializeLogo = async () => {\n try {\n // First, try to get from cache\n const cached = logoCache.getCachedLogo();\n if (cached && (cached.base64Data || cached.url)) {\n setLogoSrc(cached.base64Data || cached.url);\n setIsLoading(false);\n } else if (logoUrl) {\n // If no cache, use the URL directly\n setLogoSrc(logoUrl);\n setIsLoading(false);\n } else {\n // No logo available\n setHasError(true);\n setIsLoading(false);\n }\n\n // Update cache in background if we have a URL\n if (logoUrl) {\n logoCache.updateInBackground(logoUrl, appName, (newCache: any) => {\n if (newCache.base64Data) {\n setLogoSrc(newCache.base64Data);\n }\n });\n }\n } catch (error) {\n console.error('Error initializing logo:', error);\n setHasError(true);\n setIsLoading(false);\n }\n };\n\n initializeLogo();\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 setIsLoading(false);\n setHasError(false);\n }, []);\n\n // Render logo or fallback\n const renderLogo = () => {\n if (hasError || (!logoSrc && !isLoading)) {\n return <DefaultLogo />;\n }\n\n if (logoSrc) {\n return (\n <>\n <img \n src={logoSrc} \n height={height} \n alt={appName || \"Logo\"}\n onError={handleImageError}\n onLoad={handleImageLoad}\n style={{\n display: isLoading ? 'none' : 'block',\n maxHeight: height,\n objectFit: 'contain'\n }}\n />\n {isLoading && <DefaultLogo />}\n </>\n );\n }\n\n return <DefaultLogo />;\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 const logData = {\n message: 'Calling API endpoint',\n data: {\n endpoint: apiDetails.url,\n method: apiDetails.type,\n },\n };\n\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 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 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// =============================================================================\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};","// 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 || routeConfig?.exta_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 [\"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 OauthRedirectPostProviderEnum,\n OauthCallbackProviderEnum\n} from './network';\nimport type { RawAxiosRequestConfig } from 'axios';\n\n// Create API configuration\nconst apiConfig = new Configuration({\n basePath: \"/api/v1/appauth\", // 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\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 console.log('Auth configuration loaded:', authConfig);\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 console.log('OIDC providers:', authConfig?.login_methods?.oidc?.providers);\n return authConfig?.login_methods?.oidc?.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\n console.log(\"Login csrfToken:\", csrfToken);\n const loginRequest: LoginUserRequest = credentials;\n\n const response = await authApi.loginUser(csrfToken, loginRequest);\n console.log('Login response:', response.data);\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 console.log('Multi-step authentication required:', actualResponse);\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 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 console.log('Multi-step authentication required:', actualResponse);\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n console.log('Multi-step authentication required:', responseData);\n return responseData;\n }\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 }\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 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(email: string) {\n try {\n // Forgot password would be implemented using the password API\n // For now, this is a placeholder\n return { message: 'Reset email sent' };\n } catch (error) {\n throw error;\n }\n },\n\n async resetPassword(data: any) {\n try {\n // Reset password would be implemented using the password API\n // For now, this is a placeholder\n return { message: 'Password reset successful' };\n } catch (error) {\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 console.log('Requesting OTP for:', identifier, 'CSRF token:', csrfToken ? 'present' : 'missing');\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 console.log('OTP request payload:', otpRequest);\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 return responseData.response.data || responseData.response;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Request OTP error:', error);\n\n // Extract meaningful error message from response\n if (error.response?.data) {\n const errorData = error.response.data;\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 console.log('Verifying OTP for:', identifier, 'code:', otp, 'CSRF token:', csrfToken ? 'present' : 'missing');\n\n // According to spec, verify only needs the code\n const verifyRequest = { code: otp };\n\n console.log('OTP verify payload:', verifyRequest);\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 console.log('Multi-step authentication required after OTP verification:', responseData);\n return responseData.response;\n }\n\n // Regular successful OTP verification\n return responseData.response.data || responseData.response;\n }\n\n return response.data;\n } catch (error: any) {\n console.error('Verify OTP 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 console.log('Multi-step authentication required after OTP verification:', actualResponse);\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n console.log('Multi-step authentication required after OTP verification:', responseData);\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 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 console.log('Multi-step authentication after role selection:', actualResponse);\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 console.log('Multi-step authentication after role selection:', actualResponse);\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n console.log('Multi-step authentication after role selection:', responseData);\n return responseData;\n }\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 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 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 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 console.log('Set password response:', response.data);\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 console.log('Multi-step authentication after password set:', responseData);\n return responseData; // Return the response data instead of throwing\n }\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 console.log('Multi-step authentication required:', actualResponse);\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 console.log('Multi-step authentication required:', actualResponse);\n return actualResponse;\n }\n }\n\n // Legacy format\n if (responseData?.response?.data?.next_step || responseData?.data?.next_step) {\n console.log('Multi-step authentication required:', responseData);\n return responseData;\n }\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: OauthRedirectPostProviderEnum, callbackUrl: string) {\n try {\n const csrfToken = getCsrfToken() || '';\n const resp = await oauthApi.oauthRedirectPost(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};","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 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 // Debug logging\n if (authConfig?.debug) {\n console.log('🎨 Applying auth theme:', authConfig);\n console.log('🎨 Generated CSS variables:', css);\n }\n\n if (!css) {\n if (authConfig?.debug) {\n console.log('🎨 No CSS variables generated from auth config');\n }\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 if (authConfig?.debug) {\n console.log('🎨 Applied CSS to DOM:', 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 if (authConfig?.debug) {\n console.log('🎨 Generated background style:', style);\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 if (authConfig?.debug) {\n console.log('🎨 Generated card style:', style);\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 if (authConfig?.debug) {\n console.log('🎨 Generated logo container style:', { className, style, position });\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 if (authConfig?.debug) {\n console.log('🎨 Generated text style:', style);\n }\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 {};\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 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 } 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 } from '../../framework/utils/authThemeUtils';\n\ninterface ForgotPasswordFormProps {\n onSubmit: (data: { email?: string; phone?: string; method: string }) => Promise<void>;\n}\n\nconst ForgotPasswordForm: React.FC<ForgotPasswordFormProps> = ({ onSubmit }) => {\n const [loading, setLoading] = useState(false);\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\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 try {\n if (onSubmit) {\n const submitData = {\n method: selectedMethod,\n email: selectedMethod === 'email' ? values.contact : undefined,\n phone: selectedMethod === 'sms' ? values.contact : undefined\n };\n await onSubmit(submitData);\n }\n setSubmitted(true);\n setFormKey(prev => prev + 1);\n } catch (error: any) {\n const methodName = selectedMethod === 'email' ? 'email' : 'SMS';\n const errorMessage = messagesConfig?.errors?.networkError ||\n error.message ||\n `Failed to send reset ${methodName}. Please try again.`;\n toast.error(errorMessage);\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 input your email!'\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\" icon={<ArrowLeft size={16} />}>\n {resetPasswordConfig?.forgotPassword?.backToLoginText || 'Back to Login'}\n </Button>\n </Link>\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 {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 } from 'react';\nimport { Form, FormItem, PasswordInput, Button, toast, Result } 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 } from '../../framework/utils/authThemeUtils';\n\ninterface ResetPasswordFormProps {\n onSubmit: (data: { password: string; confirmPassword: string; token: string }) => Promise<void>;\n token: string;\n}\n\nconst ResetPasswordForm: React.FC<ResetPasswordFormProps> = ({ onSubmit, token }) => {\n const [loading, setLoading] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [formKey, setFormKey] = useState(0);\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\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 // Use authService validation\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 setLoading(true);\n try {\n if (onSubmit) {\n await onSubmit({ ...values, token });\n }\n setSubmitted(true);\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 (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 <h2 className=\"text-2xl font-semibold text-gray-900 mb-3\">\n {resetPasswordConfig?.resetForm?.title || 'Reset Password'}\n </h2>\n <p className=\"text-sm text-gray-600 mb-6\">\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;","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';\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 hasProcessedCallback = useRef(false);\n const location = useLocation();\n const navigate = useNavigate();\n const { basePath, setAuthToken } = useAuthStore();\n\n const handleLoginSuccess = async (result: any) => {\n console.log('Login success result:', result);\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 console.log('OTP login flow required');\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 // 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 console.log('OAuth callback result:', result);\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 console.log('Additional authentication step required after OAuth callback:', nextStep.id);\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 console.log('Authentication complete:', result);\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 let redirectUrl = '/dashboard'; // default fallback\n\n // Check different possible response structures for redirect_url\n if (result?.response?.data?.redirect_url) {\n redirectUrl = result.response.data.redirect_url;\n } else if (result?.data?.redirect_url) {\n redirectUrl = result.data.redirect_url;\n } else if (result?.redirect_url) {\n redirectUrl = result.redirect_url;\n }\n\n console.log('Redirecting to:', redirectUrl);\n\n // Force a page reload to ensure AuthProvider checks authentication status\n // with the new session cookies\n window.location.href = redirectUrl;\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 />\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\">{title}</h2>\n <p className=\"text-gray-500 text-sm mb-0\">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 } 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 getProviderIcon = (providerName) => {\n const name = providerName ? providerName.toLowerCase() : '';\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 return <Globe size={16} />;\n};\n\nconst ProviderButton = ({ provider, type = 'default' }) => {\n const handleClick = async () => {\n const resp = await authService.oauthRedirect(provider.provider, window.location.href);\n console.log(\"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:\")\n }\n };\n\n const icon = getProviderIcon(provider.provider)\n\n return (\n <Button\n className={`flex 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 Continue with {provider.provider}\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 } 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';\n\nconst { Text, Title } = Typography;\n\ninterface OTPFormProps {\n onSuccess: (result: any) => void;\n onBack?: () => void;\n}\n\nconst OTPForm: React.FC<OTPFormProps> = ({ \n onSuccess, \n onBack\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 [resendTimer, setResendTimer] = useState(0);\n const [formKey, setFormKey] = useState(0);\n const [loginResult, setLoginResult] = useState<any>(null);\n const [showPasswordChange, setShowPasswordChange] = useState(false);\n const [newPassword, setNewPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const { authConfig } = useAuthContext();\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 if (allowedUsernames && allowedUsernames.length > 0) {\n setUsernameType(allowedUsernames[0]);\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 if (isAuthenticated && step !== 'success') {\n setStep('success');\n }\n };\n\n checkSession();\n // Removed the setInterval polling - no more repeated API calls\n }, [step]);\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 getInputIcon = (type) => {\n return type === 'email' ? <Mail size={16} /> : <Smartphone size={16} />;\n };\n\n const getInputPlaceholder = (type) => {\n return type === 'email' ? 'Enter your email' : 'Enter your mobile number';\n };\n\n const getValidationRules = (type: string) => {\n if (type === 'email') {\n return [\n { required: true, message: 'Please input your email!' },\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 setLoading(true);\n try {\n await authService.requestOTP(values.username);\n setUsername(values.username);\n setStep('verify');\n setResendTimer(30); // Default 30 seconds\n toast.success('OTP sent successfully!');\n } catch (error: any) {\n // Check if this is a 401 error indicating user is not authenticated\n // This is expected during login flow, so we should still proceed to OTP verification\n const status = error?.response?.status;\n if (status === 401) {\n // Still proceed to verification step for 401 errors\n // as this indicates the user needs to authenticate (expected behavior)\n setUsername(values.username);\n setStep('verify');\n setResendTimer(30);\n toast.success('Please check your email/phone for the OTP code');\n } else {\n toast.error(error.message || 'Failed to send OTP');\n }\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyOTP = async () => {\n const otpLength = 6; // Default OTP length\n if (otp.length !== otpLength) {\n toast.error(`Please enter ${otpLength} digit OTP`);\n return;\n }\n\n setLoading(true);\n try {\n const result = await authService.verifyOTP(username, otp);\n setLoginResult(result);\n setStep('success');\n toast.success('Login successful!');\n } catch (error: any) {\n toast.error(error.message || 'Invalid OTP');\n setOtp('');\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 handleContinue = () => {\n if (loginResult) {\n onSuccess(loginResult);\n }\n };\n\n const handleLogout = async () => {\n setLoading(true);\n try {\n await authService.logout();\n toast.success('Logged out successfully');\n setStep('request');\n setLoginResult(null);\n setUsername('');\n setOtp('');\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 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('OTP resent successfully!');\n } catch (error: any) {\n toast.error(error.message || 'Failed to resend OTP');\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\n if (step === 'success' && isLoggedIn) {\n return (\n <div className=\"w-full\">\n <Title level={4} className=\"!mb-2 text-center\">\n {loginResult ? 'Login Successful!' : 'Already Logged In'}\n </Title>\n <Text className=\"block text-center text-gray-500 mb-6\">\n {loginResult ? 'You have successfully logged in.' : 'You are currently logged in.'}\n </Text>\n\n {!showPasswordChange ? (\n <div className=\"space-y-4\">\n {loginResult && (\n <Button\n type=\"primary\"\n block\n onClick={handleContinue}\n >\n Continue to Dashboard\n </Button>\n )}\n\n <Button\n block\n onClick={() => setShowPasswordChange(true)}\n >\n Change Password\n </Button>\n\n <Button\n block\n danger\n onClick={handleLogout}\n loading={loading}\n >\n Logout\n </Button>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <Title level={5} className=\"!mb-4\">Change Your Password</Title>\n\n <FormItem label=\"New Password\">\n <Input.Password\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 <Input.Password\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 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\"\n >\n Back\n </Button>\n \n <Title level={4} className=\"!mb-2 text-center\">Verify OTP</Title>\n <Text className=\"block text-center text-gray-500 mb-6\">\n We've sent a {otpLength}-digit code to {username}\n </Text>\n\n <div className=\"my-8 flex justify-center\">\n <OTPInput\n length={otpLength}\n value={otp}\n onChange={setOtp}\n disabled={loading}\n />\n </div>\n\n <Button\n type=\"primary\"\n block\n loading={loading}\n onClick={handleVerifyOTP}\n className=\"mt-6\"\n >\n Verify OTP\n </Button>\n\n <div className=\"text-center mt-4\">\n {resendTimer > 0 ? (\n <Text type=\"secondary\">Resend OTP in {resendTimer}s</Text>\n ) : (\n <Button type=\"link\" onClick={handleResendOTP} loading={loading}>\n Resend OTP\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 Back to other methods\n </Button>\n )}\n \n <Title level={4} className=\"!mb-2 text-center\">Sign in with OTP</Title>\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 Send OTP\n </Button>\n </FormItem>\n </Form>\n </div>\n );\n};\n\nexport default OTPForm;","import React, { useState, useEffect } from 'react';\nimport { Form, FormItem, Input, PasswordInput, Button, Checkbox, Divider, Space, Spin, Tabs, Alert, toast } 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 { getAuthTextStyle, getAuthSecondaryTextStyle, getAuthLinkStyle } 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 { getLoginConfig, getMessagesConfig, getProvidersConfig, authConfig: configContext } = 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\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 input your email!'\n },\n {\n type: 'email' as const,\n message: messagesConfig?.validation?.invalidEmail || 'Please enter a valid email!'\n }\n ];\n }\n if (type === 'mobile') {\n return [\n {\n required: true,\n message: messagesConfig?.validation?.required || 'Please input your mobile number!'\n },\n {\n pattern: /^\\+\\d{7,15}$/,\n message: messagesConfig?.validation?.invalidMobile || '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: messagesConfig?.validation?.required || 'Please input your email!'\n },\n {\n type: 'email' as const,\n message: messagesConfig?.validation?.invalidEmail || 'Please enter a valid email!'\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 = (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 await onLogin(loginData);\n } catch (error: any) {\n const messagesConfig = getMessagesConfig();\n const errorMessage = error.message || messagesConfig?.errors?.loginFailed || 'Login failed. Please try again.';\n setError(errorMessage);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOTPSuccess = async (result: any) => {\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\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 onFinishFailed={() => {\n const errorMessage = messagesConfig?.validation?.required || 'Please check your input and try again';\n setError(errorMessage);\n }}\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 || 'Email address'\n : loginConfig?.formPlaceholders?.mobile || 'Mobile number (+919876543210)'\n }\n autoComplete={type === 'email' ? 'email' : 'tel'}\n onKeyDown={type === 'mobile' ? (e) => {\n // Only allow numbers and + for mobile input\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 {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\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 = authService.isSSOEnabled() || authService.isOIDCEnabled();\n const isPasswordEnabled = authService.isPasswordLoginEnabled();\n const isOTPEnabled = authService.isOTPLoginEnabled();\n\n // If neither password nor OTP is enabled, return null\n if (!isPasswordEnabled && !isOTPEnabled) {\n return null;\n }\n\n // If only OTP is enabled (no password login), show OTP form directly\n if (isOTPEnabled && !isPasswordEnabled) {\n return (\n <div className=\"w-full\">\n <OTPForm onSuccess={handleOTPSuccess} />\n </div>\n );\n }\n\n // If password login is not enabled, return null\n if (!isPasswordEnabled) {\n return null;\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>{providersConfig?.separatorText || \"OR\"}</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>{providersConfig?.separatorText || \"OR\"}</Divider>\n\n {authService.isSSOEnabled() && (\n <div className=\"mb-4\">\n {/* SSO providers would be rendered here */}\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n <div className=\"space-y-2\">\n {authService.getOIDCProviders().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 {/* SSO providers would be rendered here */}\n </div>\n )}\n\n {authService.isOIDCEnabled() && (\n <div className=\"mt-4\">\n <div className=\"space-y-2\">\n {authService.getOIDCProviders().map((provider: any, index: number) => (\n <ProviderButton\n key={`oidc-${index}`}\n provider={provider}\n type=\"oidc\"\n onClick={(provider: any) => {\n console.log('OIDC provider clicked:', provider);\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 {/* SSO providers would be rendered here */}\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}>Already Logged In</h3>\n <p className=\"text-sm mt-2\" style={secondaryTextStyle}>You are currently logged in.</p>\n </div>\n\n <Button\n block\n onClick={() => setShowPasswordChange(true)}\n >\n Change Password\n </Button>\n\n <Button\n block\n danger\n onClick={handleLogout}\n loading={loading}\n >\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;","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, useEffect } from 'react';\nimport { Layout, Card, Spin, Alert } from '@zango-core/components';\nimport DynamicLoginForm from '../components/DynamicLoginForm';\nimport LoginForm from '../components/LoginForm';\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';\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 [loginConfig, setLoginConfig] = useState<any>(null);\n const [loading, setLoading] = useState<boolean>(useDynamicConfig);\n const [error, setError] = useState<string | null>(null);\n\n // Get authConfig for styling\n const { authConfig } = useAuthConfig();\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 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 setError('Failed to load login methods. Please refresh the page.');\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 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 { 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 } 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\">\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\">\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 } from 'react';\nimport { Layout } from '@zango-core/components';\nimport LoginPage from './LoginPage';\nimport RoleSelection from '../components/RoleSelection';\nimport { useAuthContext } from '../components/AuthProvider';\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}) => {\n const { pendingAuth, availableRoles, selectRole, login } = useAuthContext();\n const [loginError, setLoginError] = useState(null);\n\n const handleLogin = async (credentials) => {\n setLoginError(null);\n try {\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 return (\n <Layout className=\"min-h-screen bg-gradient-to-br from-purple-600 to-purple-800\">\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 { 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 } 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}\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}) => {\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\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 send 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 <div className=\"text-center mb-8\">\n\n <Title level={3} className=\"!mb-2\">\n {twoFactorConfig?.title || title}\n </Title>\n <Paragraph className=\"!mb-0 text-sm\" type=\"secondary\">\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 } 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}\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}) => {\n const [formKey, setFormKey] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [password, setPassword] = useState('');\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\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 setSubmitting(true);\n try {\n // Use authService to set the new password\n await authService.setPassword(values.password);\n await onReset({\n password: values.password,\n confirmPassword: values.confirmPassword\n });\n } catch (error) {\n // Error handling is done in parent component\n throw error;\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 <div className=\"text-center mb-6\">\n <Title level={3} className=\"!mb-2\">\n {resetPasswordConfig?.resetForm?.title || title}\n </Title>\n <Paragraph className=\"!mb-0 text-sm\" type=\"secondary\">\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 <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, { 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 } from '../../framework/utils/authThemeUtils';\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}\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}) => {\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\n // Handle login success and determine next step\n const handleLoginSuccess = async (result: any) => {\n console.log('Login success result:', result);\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 if (result?.next_step) {\n // Direct next_step from OTP verification or other auth methods\n responseData = result;\n nextStep = result.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 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 console.log('OTP login flow required');\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 console.log('2FA verification result:', result);\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 console.log('Authentication completed successfully after 2FA');\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 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 console.log('Password reset result:', result);\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 console.log('Authentication completed successfully after password reset');\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 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 bg-gradient-to-br from-purple-600 to-purple-800\">\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 console.log('Role selection result:', result);\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 console.log('Authentication completed successfully after role selection');\n toast.success('Role selected successfully!');\n if (onAuthComplete) {\n onAuthComplete({ \n ...result, \n user: { ...authData.user, role },\n authenticated: true \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 console.log('OTP login flow required 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 bg-gradient-to-br from-purple-600 to-purple-800\">\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 bg-gradient-to-br from-purple-600 to-purple-800\">\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <SecondFactorAuth\n user={authData?.user || pendingAuth?.user || user}\n availableMethods={twoFactorMethods}\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 bg-gradient-to-br from-purple-600 to-purple-800\">\n <Content className=\"flex justify-center items-center min-h-screen p-5\">\n <PasswordResetRequired\n reason={passwordResetReason}\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';\n\nconst { Content } = Layout;\n\nconst OAuthCallbackPage = ({\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(null);\n const [showCompleteFlow, setShowCompleteFlow] = React.useState(false);\n\n const handleOAuthSuccess = async (result) => {\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) => {\n console.error('OAuth callback error:', error);\n // The OAuthCallback component will handle error display\n };\n\n const handleAuthComplete = (result) => {\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 bg-gradient-to-br from-purple-600 to-purple-800\">\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 />\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 } from 'react-router-dom';\nimport LoginPage from '../pages/LoginPage';\nimport ForgotPasswordForm from './ForgotPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport OAuthCallbackPage from '../pages/OAuthCallbackPage';\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';\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 console.log(\"Mock API POST:\", 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 console.log(`📱 Mock OTP for ${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 console.log(\"Role selected:\", data);\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 console.log(`📱 2FA OTP for ${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 console.log(\"Password changed:\", data);\n return {\n success: true,\n message: \"Password changed successfully\",\n };\n }\n\n if (endpoint.includes(\"oauth/callback\")) {\n console.log(\"OAuth callback:\", data);\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 console.log(\"Mock API GET:\", endpoint);\n\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: { enabled: false },\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 console.log(\"Inside verify\");\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 console.log(\"basePath\", basePath);\n console.log(\"apiConfig\", apiConfig);\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 const handleAuthComplete = async (result: any) => {\n console.log(\"Authentication complete:\", result);\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 // Use the next parameter if available\n redirectUrl = decodeURIComponent(nextPath);\n console.log(\"Redirecting to 'next' parameter:\", redirectUrl);\n }\n\n console.log(\"Final redirect URL:\", redirectUrl);\n\n // Force a page reload to ensure AuthProvider checks authentication status\n // with the new session cookies\n window.location.href = redirectUrl;\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 />\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 <div\n style={{\n ...cardStyle,\n width: \"100%\",\n }}\n >\n <ForgotPasswordForm onSubmit={handleForgotPassword} authConfig={authConfig} />\n </div>\n </Content>\n </Layout>\n );\n };\n\n // Reset password wrapper\n const ResetPasswordWrapper = () => {\n const { resetPassword } = useAuth();\n const cardStyle = getAuthCardStyle(authConfig);\n\n const handleResetPassword = async (values) => {\n await resetPassword(values);\n const successMessage = authConfig?.resetPassword?.resetForm?.successMessage || \"Password reset successfully!\";\n toast.success(successMessage);\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 <div\n style={{\n ...cardStyle,\n width: \"100%\",\n }}\n >\n <ResetPasswordForm\n onSubmit={handleResetPassword}\n token=\"demo-reset-token\"\n authConfig={authConfig}\n />\n </div>\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 */}\n <Route path=\"reset-password\" element={<ResetPasswordWrapper />} />\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 console.log(\"OAuth auth complete:\", result);\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 {/* Complete auth flow route (for role selection, 2FA, etc.) */}\n <Route\n path=\"/complete\"\n element={\n <div style={{ ...backgroundStyle, minHeight: \"100vh\" }}>\n <CompleteAuthFlow\n authData={authData}\n apiConfig={apiConfig}\n logo={mergedConfig.logo}\n onComplete={handleAuthComplete}\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 {/* 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 { 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 console.log('🚀 Creating dynamic page registry...');\n console.log('📋 Requested page types:', requestedPageTypes);\n\n // Simple: Get page types that exist in our config (assume packages are installed)\n const availablePageTypes = getAvailablePageTypes(requestedPageTypes);\n console.log('✅ Available page types:', availablePageTypes);\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 console.log(`✅ Registered static page type: ${pageType}`);\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 console.log(`📊 Registry created with ${totalPageTypes} page types:`);\n console.log(` • Dynamic framework pages (${dynamicPageTypes}): ${availablePageTypes.join(', ') || 'none'}`);\n console.log(` • Static pages (${staticPageTypes}): login, custom, 404, default`);\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 } 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 [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 // 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 // Debug: Log loading state changes\n useEffect(() => {\n console.log(\"🔄 Loading state changed to:\", loading);\n }, [loading]);\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 console.log(\"🔍 AppContext useEffect triggered:\", {\n currentPath,\n isLoginPage,\n fetchInProgress\n });\n\n\n // Prevent multiple simultaneous fetches\n if (fetchInProgress) {\n console.log(\"⚠️ Fetch already in progress, skipping...\");\n return;\n }\n\n fetchInProgress = true;\n console.log(\"🚀 Starting fetchAppInitData...\");\n\n try {\n const result = await fetchAppInitData();\n const data = result.success ? result.response : null;\n\n console.log(\"✅ fetchAppInitData completed:\", {\n success: result.success,\n hasMenu: data?.menu?.length > 0,\n menuCount: data?.menu?.length,\n userRole: data?.profile_info?.user_role\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 console.log(\"📦 Setting app data\");\n setAppData(data);\n\n if (data?.theme) {\n console.log(\"🎨 Applying 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 console.log(\"🏁 Finally block executing:\", { cancelled, loading });\n console.log(\"✅ Setting loading to FALSE (ignoring cancelled state)\");\n setLoading(false);\n fetchInProgress = false;\n console.log(\"✅ fetchAppInitData finally block completed:\", {\n fetchInProgress,\n cancelled\n });\n }\n };\n\n fetchAppData();\n\n // Cleanup function - just mark as cancelled for logging purposes\n return () => {\n cancelled = true;\n console.log(\"🧹 AppContext cleanup - useEffect unmounting\");\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 isConfigPage = currentPath === \"/app/configuration-error\";\n const isLogoutPage = currentPath === \"/app/logout\";\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 // Check exact match or if current path starts with route path (for sub-routes)\n return currentPath === routePath || currentPath.startsWith(routePath + '/');\n });\n\n console.log(\"🔍 Redirect logic check:\", {\n currentPath,\n hasMenu,\n hasRoutes,\n userRole,\n isAnonymous,\n isAuthenticated,\n isConfigPage,\n isValidPath\n });\n\n // Flow 1: Menu empty + Authenticated → /app/configuration-error\n if (isAuthenticated && !hasMenu && !isConfigPage) {\n console.log(\"🚀 Flow 1: Authenticated user without menu → configuration-error\");\n navigate(\"/app/configuration-error\", { replace: true });\n return;\n }\n\n // Flow 2: Menu empty + Anonymous → /app/login\n if (isAnonymous && !hasMenu) {\n console.log(\"🚀 Flow 2: Anonymous user without menu → login\");\n navigate(\"/app/login\", { 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 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 console.log(\"🚀 Flow 3/4: Redirecting to first menu item:\", firstMenuPath, {\n reason: currentPath === '/app' || currentPath === '/app/' ? '/app root' : 'invalid path'\n });\n navigate(firstMenuPath, { replace: true });\n return;\n }\n }\n }, [loading, appData, location.pathname, 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 console.log('⏳ Still loading app data, skipping registry creation');\n return;\n }\n\n // Skip if no app data yet\n if (!appData) {\n console.log('⏳ No app data yet, skipping registry creation');\n return;\n }\n\n console.log('🚀 Starting registry creation...', {\n isAnonymous: appData.is_user_anonymous,\n hasRoutes: !!appData.routes,\n routesLength: appData.routes?.length\n });\n\n // For login pages (anonymous users), create minimal registry\n if (appData.is_user_anonymous) {\n console.log('✅ Anonymous user - creating minimal registry');\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(minimalRegistry);\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 console.log('⚠️ No routes found - creating fallback registry');\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 console.log('🚀 Creating dynamic page registry from routes...');\n const registry = await createRegistryFromRoutes(appData.routes);\n\n if (!cancelled) {\n setPageTypeRegistry(registry);\n setRegistryLoading(false);\n console.log('✅ Dynamic page registry created successfully');\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 // 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}\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 = options.redirectUrl || options.theme?.login_url || '/app/login';\n\n // Small delay to ensure cookies are deleted before redirect\n setTimeout(() => {\n window.location.href = redirectUrl;\n }, 100);\n } else {\n // Show error toast notification\n toast.error({\n title: 'Logout Failed',\n description: 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 = options.redirectUrl || options.theme?.login_url || '/app/login';\n setTimeout(() => {\n window.location.href = redirectUrl;\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('#confirm-logout') 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};","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 [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 // 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 console.log('Setting password policy from profileData.auth_config.password_policy:', policyToUse);\n setPasswordPolicy(policyToUse);\n } else {\n console.log('No password policy found in profileData:', {\n auth_config_password_policy: profileData.auth_config?.password_policy,\n password_policy: profileData.password_policy\n });\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 console.log('Password validation useEffect triggered:', {\n newPassword,\n passwordPolicy\n });\n\n if (passwordPolicy) {\n console.log('Using password policy for validation:', 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 console.log('No password policy found, using default validation');\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 */}\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 {/* 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,\n registry: Record<string, any>,\n context: Record<string, any>\n): React.ReactElement => {\n const config = registry[pageType] || registry.default;\n \n // If there's a custom handler, use it\n if (config.handler) {\n return config.handler(context);\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 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 \"./ZangoApp.css\";\nimport LogoutPage from \"./pages/LogoutPage\";\nimport LoginPage from \"./pages/LoginPage\";\nimport ConfigurePage from \"./pages/ConfigurePage\";\nimport type { RouteConfig, AuthConfig } 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 if (pageConfig && pageConfig.standalone) {\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 return (\n <>\n <DocumentHead />\n <DynamicRoutes customPages={customPages} />\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 console.log(\"app init endpoint here\", appInitializerEndpoint);\n \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 </>\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","blob","resolve","reject","reader","str","hash","i","char","timestamp","currentUrl","onUpdate","newCache","logoCache","DefaultLogo","jsxs","jsx","CachedLogo","height","linkTo","logoSrc","setLogoSrc","useState","isLoading","setIsLoading","hasError","setHasError","useEffect","handleImageError","useCallback","handleImageLoad","Link","Fragment","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","logData","generateQueryString","queryParams","getAppInitData","normalizedEndpoint","getUserProfile","updateUserProfile","uploadProfilePhoto","changePassword","toggleTwoFactor","switchRole","roleId","getUserSessions","logoutSession","sessionId","logoutAllSessions","sessionIds","logout","performLogout","fetchAppInitData","fetchUserProfile","fetchUserSessions","saveUserProfile","uploadPhoto","formData","updatePassword","passwordData","setTwoFactor","enabled","changeRole","removeSession","removeAllSessions","performAppLogout","performDirectLogout","_typeof","obj","trimLeft","trimRight","tinycolor","color","opts","rgb","inputToRGB","RsRGB","GsRGB","BsRGB","R","G","B","boundAlpha","hsv","rgbToHsv","h","v","hsl","rgbToHsl","l","allow3Char","rgbToHex","allow4Char","rgbaToHex","bound01","hexNames","secondColor","hex8String","rgbaToArgbHex","secondHex8String","gradientType","s","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","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","d","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","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","contentType","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","authService","rawData","username","credentials","csrfToken","loginRequest","actualResponse","isAuthenticatedViaCookie","cookieUtils","email","identifier","otpRequest","errorData","otp","verifyRequest","currentPassword","newPassword","authUser","resp","password","policy","errors","profileConfig","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","methods","handleSubmit","submitData","prev","errorMessage","toast","getContactPlaceholder","getContactValidationRules","getSuccessMessage","contactType","successMessage","Result","Button","Form","FormItem","Select","Space","Input","ResetPasswordForm","validatePassword","_","validation","PasswordInput","getFieldValue","OAuthCallback","onSuccess","onError","redirectPath","title","errorTitle","roleSelectionTitle","roleSelectionSubtitle","twoFactorTitle","twoFactorSubtitle","passwordResetTitle","passwordResetSubtitle","showCompleteFlow","setShowCompleteFlow","authResult","setAuthResult","authStep","setAuthStep","authData","setAuthData","twoFactorMethods","setTwoFactorMethods","passwordResetReason","setPasswordResetReason","hasProcessedCallback","useRef","navigate","useNavigate","setAuthToken","handleLoginSuccess","nextStep","loginUser","userInfo","rolesArray","passwordPolicy","handleOAuthCallback","hashParams","errorDescription","handleRetry","handleAuthComplete","redirectUrl","Card","Spin","Alert","GoogleIcon","MicrosoftIcon","GitHubIcon","LinkedInIcon","FacebookIcon","TwitterIcon","AppleIcon","SlackIcon","getProviderIcon","providerName","ProviderButton","handleClick","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","setStep","setUsername","usernameType","setUsernameType","resendTimer","setResendTimer","loginResult","setLoginResult","showPasswordChange","setShowPasswordChange","setNewPassword","confirmPassword","setConfirmPassword","isLoggedIn","setIsLoggedIn","checkAuthentication","allowedUsernames","isAuthenticated","getInputPlaceholder","getValidationRules","handleRequestOTP","handleVerifyOTP","otpLength","handleChangePassword","handleContinue","handleLogout","handleResendOTP","Segmented","DynamicLoginForm","onLogin","showRememberMe","activeMethod","setActiveMethod","activeTab","setActiveTab","showOTPForm","setShowOTPForm","getLoginConfig","getProvidersConfig","configContext","effectiveAuthConfig","textStyle","secondaryTextStyle","linkStyle","hasEmail","hasMobile","getUsernameRules","handlePasswordLogin","loginData","handleOTPSuccess","renderPasswordForm","loginConfig","allowedKeys","Checkbox","renderOTPOption","renderAuthMethods","hasProviders","isPasswordEnabled","isOTPEnabled","providersConfig","Tabs","Divider","LoginForm","showForgotPassword","selectedUsernameType","setSelectedUsernameType","getUsernamePlaceholder","getUsernameValidationRules","baseRules","showUsernameSelector","isRememberMeEnabled","isForgotPasswordEnabled","LoginPage","subtitle","useDynamicConfig","staticConfig","setLoginConfig","backgroundStyle","logoContainerStyle","logoStyle","fetchLoginMethods","renderLoginForm","Layout","Paragraph","Avatar","src","sizeValue","Empty","description","image","getRoleIcon","roleName","RoleSelection","roles","onRoleSelect","selectedRole","setSelectedRole","submitting","setSubmitting","getRoleSelectionConfig","getCardConfig","roleConfig","EmptyComponent","displayTitle","displaySubtitle","gridColumns","CustomRoleCard","cardStyling","isSelected","CheckCircle","Tag","Content","LoginPageWithRoleSelection","onLoginSuccess","selectRole","login","loginError","setLoginError","handleLogin","handleRoleSelect","SecondFactorAuth","availableMethods","onVerify","otpDigits","retryInterval","otpSent","setOtpSent","getTwoFactorConfig","twoFactorConfig","getMaskedContact","handleSendOTP","handleVerify","expectedLength","handleResend","renderMethodSelector","PasswordResetRequired","onReset","passwordRules","setPassword","effectivePasswordRules","setEffectivePasswordRules","getPasswordStrength","pwd","strength","passwordStrength","Progress","CompleteAuthFlow","onAuthComplete","initialAuthState","authToken","mfaMethod","handleTwoFactorVerify","statusCode","handlePasswordReset","OAuthCallbackPage","handleOAuthSuccess","handleOAuthError","finalResult","useAuth","Header","mockOTPs","mock2FAOTPs","USER_CONFIGS","MOCK_ROLES","createMockApiConfig","selectedScenario","userConfig","mockUser","LoginRouter","setBasePath","useMemo","LoginWrapper","nextPath","ForgotPasswordWrapper","forgotPassword","handleForgotPassword","ResetPasswordWrapper","resetPassword","handleResetPassword","Routes","Route","redirect_url","Navigate","createDynamicPageRegistry","availablePageTypes","registry","matchedRoutePath","customPages","customPagePath","dynamicPageTypes","staticPageTypes","totalPageTypes","unconfiguredPageTypes","extractPageTypesFromRoutes","pageTypes","createRegistryFromRoutes","AppContext","fetchInProgress","AppProvider","layoutConfig","topbarConfig","navbarConfig","customComponents","appData","setAppData","cachedLogo","setCachedLogo","pageTypeRegistry","setPageTypeRegistry","registryLoading","setRegistryLoading","registryError","setRegistryError","getInitializerEndpoint","appConfig","defaultTheme","defaultStyleId","defaultStyle","cancelled","currentPath","isLoginPage","isConfigPage","hasMenu","hasRoutes","userRole","isAnonymous","isValidPath","routePath","firstMenuPath","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","showLogoutConfirmation","onConfirm","overlay","modal","cancelBtn","confirmBtn","handleEscape","UserProfileDrawer","isOpen","onClose","isEditingName","setIsEditingName","isEditingPassword","setIsEditingPassword","profilePhoto","setProfilePhoto","twoFactorEnabled","setTwoFactorEnabled","activeSessions","setActiveSessions","sessionsLoading","setSessionsLoading","sessionsError","setSessionsError","setTokens","setPasswordPolicy","profileLoading","profileError","refetchProfile","setFormData","setPasswordData","setErrors","passwordErrors","setPasswordErrors","serverMessage","setServerMessage","roleSwitchLoading","setRoleSwitchLoading","passwordValidation","setPasswordValidation","fetchSessions","sessionsData","lastPasswordChange","nextPasswordDue","lastChangedDate","expiryDate","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","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","LogoutPage","ConfigurePage","PageTypeRouterWrapper","useParams","paramKey","DynamicRoutes","firstMenuUri","standaloneRoutes","regularRoutes","pageConfig","ZangoAppContent","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,84,85]}
|
|
1
|
+
{"version":3,"file":"zango-crm-framework.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|