varminer-app-header 2.2.0 → 2.2.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/DrawerContext.tsx","../src/utils/localStorage.ts","../src/utils/translations.ts","../src/asset/Impactomics.svg","../src/asset/flags/gb.png","../src/asset/flags/es.png","../src/LanguageSelector.tsx","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","// --- IAM app user details (shared from IAM after verify-OTP, same origin) ---\r\n/** localStorage key used by IAM app for user details (GET /v1/userManagement/userDetails response). */\r\nexport const USER_DETAILS_STORAGE_KEY = \"linn-i-am-userDetails\";\r\n\r\n/** Stored value is the full API response from userDetails. */\r\nexport interface UserDetailsStoredResponse {\r\n status: \"SUCCESS\" | \"FAILURE\";\r\n statusinfo: {\r\n code: string;\r\n message: string;\r\n };\r\n data?: {\r\n usersDetails: UserDetailsItem[];\r\n };\r\n errors?: Record<string, string> | null;\r\n}\r\n\r\nexport interface UserDetailsItem {\r\n userId: number;\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n status: string;\r\n roles?: string[];\r\n lastLogin?: string;\r\n createdDate?: string;\r\n contactNumber?: { phoneType: string; phoneNumber: string }[];\r\n timeZone?: string;\r\n workInfo?: {\r\n jobTitle?: string;\r\n department?: string;\r\n supervisor?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Read user details from IAM app localStorage (set after verify-OTP on same origin).\r\n * Does not write or overwrite this key; IAM app is the source of truth.\r\n */\r\nexport function getStoredUserDetails(): UserDetailsItem | null {\r\n try {\r\n const raw = localStorage.getItem(USER_DETAILS_STORAGE_KEY);\r\n if (!raw) return null;\r\n\r\n const parsed = JSON.parse(raw) as UserDetailsStoredResponse;\r\n if (parsed.status !== \"SUCCESS\" || !parsed.data?.usersDetails?.length) {\r\n return null;\r\n }\r\n\r\n return parsed.data.usersDetails[0];\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport const getUserDataFromStorage = () => {\r\n // Prefer IAM user details when available (same origin, after verify-OTP)\r\n const iamUser = getStoredUserDetails();\r\n if (iamUser) {\r\n const name = [iamUser.firstName, iamUser.lastName].filter(Boolean).join(\" \").trim();\r\n const role = iamUser.roles?.length ? iamUser.roles[0] : iamUser.workInfo?.jobTitle ?? \"\";\r\n return {\r\n name: name || \"\",\r\n email: iamUser.email || \"\",\r\n role: role || \"\",\r\n avatar: undefined,\r\n initials: name ? name.split(/\\s+/).map((s) => s[0]).join(\"\").slice(0, 2).toUpperCase() : undefined,\r\n };\r\n }\r\n\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n let userData = null;\r\n \r\n if (parsedOuter.userDetails) {\r\n const parsedUserDetails = parseNested(parsedOuter.userDetails);\r\n userData = parsedUserDetails.user || parsedUserDetails.data || parsedUserDetails;\r\n }\r\n \r\n if (!userData && parsedOuter.user) {\r\n const parsedUser = parseNested(parsedOuter.user);\r\n userData = parsedUser.user || parsedUser.data || parsedUser.currentUser || parsedUser;\r\n }\r\n \r\n if (!userData && parsedOuter.authDetails) {\r\n const parsedAuthDetails = parseNested(parsedOuter.authDetails);\r\n if (parsedAuthDetails.auth) {\r\n userData = parsedAuthDetails.auth.user || parsedAuthDetails.auth.userData;\r\n }\r\n if (!userData) {\r\n userData = parsedAuthDetails.user || parsedAuthDetails.userData || parsedAuthDetails.currentUser;\r\n }\r\n }\r\n \r\n if (!userData && parsedOuter.profile) {\r\n const parsedProfile = parseNested(parsedOuter.profile);\r\n userData = parsedProfile.user || parsedProfile.data || parsedProfile;\r\n }\r\n \r\n if (userData) {\r\n let name = userData.name || userData.fullName || userData.userName || \"\";\r\n if (!name && (userData.firstName || userData.lastName)) {\r\n name = [userData.firstName, userData.lastName].filter(Boolean).join(' ');\r\n }\r\n \r\n return {\r\n name: name || \"\",\r\n email: userData.email || userData.emailAddress || \"\",\r\n role: userData.role || userData.userRole || userData.designation || userData.title || \"\",\r\n avatar: userData.avatar || userData.profilePicture || userData.imageUrl || userData.profileImage,\r\n initials: userData.initials,\r\n };\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing user data from localStorage:\", err);\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const getNotificationCountFromStorage = (): number => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n if (parsedOuter.notifications) {\r\n const parsedNotifications = parseNested(parsedOuter.notifications);\r\n const count = parsedNotifications.count || parsedNotifications.unreadCount || parsedNotifications.total;\r\n if (typeof count === 'number') return count;\r\n }\r\n \r\n if (parsedOuter.app) {\r\n const parsedApp = parseNested(parsedOuter.app);\r\n if (parsedApp.notificationCount !== undefined) {\r\n return parsedApp.notificationCount;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing notification count from localStorage:\", err);\r\n }\r\n }\r\n return 0;\r\n};\r\n\r\nexport const getMessageCountFromStorage = (): number | undefined => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n if (parsedOuter.messages) {\r\n const parsedMessages = parseNested(parsedOuter.messages);\r\n const count = parsedMessages.count || parsedMessages.unreadCount || parsedMessages.total;\r\n if (typeof count === 'number') return count;\r\n }\r\n \r\n if (parsedOuter.app) {\r\n const parsedApp = parseNested(parsedOuter.app);\r\n if (parsedApp.messageCount !== undefined) {\r\n return parsedApp.messageCount;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing message count from localStorage:\", err);\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getI18nLocaleFromStorage = (): string | null => {\r\n try {\r\n return localStorage.getItem(\"lnc-i18n\");\r\n } catch (err) {\r\n console.error(\"Error getting i18n locale from localStorage:\", err);\r\n return null;\r\n }\r\n};\r\n\r\nexport const setI18nLocaleToStorage = (locale: string): void => {\r\n try {\r\n localStorage.setItem(\"lnc-i18n\", locale);\r\n } catch (err) {\r\n console.error(\"Error setting i18n locale to localStorage:\", err);\r\n }\r\n};\r\n\r\n/**\r\n * Decodes a JWT token and returns its payload\r\n * @param token - JWT token string\r\n * @returns Decoded payload object or null if decoding fails\r\n */\r\nconst decodeJWT = (token: string): any => {\r\n try {\r\n if (!token) return null;\r\n \r\n // JWT format: header.payload.signature\r\n const parts = token.split('.');\r\n if (parts.length !== 3) return null;\r\n \r\n // Decode the payload (second part)\r\n const payload = parts[1];\r\n \r\n // Base64 decode and parse JSON\r\n // Replace URL-safe base64 characters and add padding if needed\r\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\r\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\r\n \r\n const decoded = atob(padded);\r\n return JSON.parse(decoded);\r\n } catch (err) {\r\n console.error(\"Error decoding JWT token:\", err);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Get all data from localStorage (persist:userdb) including decoded accessToken\r\n * This function reads all available data without hardcoding and doesn't require any parameters\r\n * @returns Comprehensive object containing all available data from localStorage and decoded JWT payload\r\n */\r\nexport const getAllDataFromStorage = () => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n \r\n if (!userDbString) {\r\n return {\r\n auth: null,\r\n user: null,\r\n authDetails: null,\r\n userDetails: null,\r\n profile: null,\r\n notifications: null,\r\n messages: null,\r\n app: null,\r\n decodedToken: null,\r\n rawData: null,\r\n };\r\n }\r\n\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n // Helper function to parse nested JSON strings\r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n\r\n // Parse all top-level keys dynamically (no hardcoding)\r\n const parsedData: any = {};\r\n let authData: any = null;\r\n \r\n // Helper to recursively find auth data (contains accessToken or refreshToken)\r\n const findAuthData = (obj: any): any => {\r\n if (!obj || typeof obj !== 'object') return null;\r\n \r\n // Check if this object itself is auth data\r\n if (obj.accessToken || obj.refreshToken) {\r\n return obj;\r\n }\r\n \r\n // Recursively search in nested objects\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const nested = findAuthData(obj[key]);\r\n if (nested) return nested;\r\n }\r\n }\r\n \r\n return null;\r\n };\r\n \r\n // Parse all keys in parsedOuter dynamically\r\n Object.keys(parsedOuter).forEach((key) => {\r\n parsedData[key] = parseNested(parsedOuter[key]);\r\n \r\n // Dynamically find auth data in any structure\r\n const foundAuth = findAuthData(parsedData[key]);\r\n if (foundAuth && !authData) {\r\n authData = foundAuth;\r\n parsedData.auth = authData;\r\n }\r\n });\r\n\r\n // Get accessToken and decode it\r\n let decodedToken = null;\r\n const accessToken = authData?.accessToken || parsedData.auth?.accessToken || parsedData.authDetails?.accessToken;\r\n \r\n if (accessToken) {\r\n decodedToken = decodeJWT(accessToken);\r\n }\r\n\r\n // Extract all auth-related fields from authData dynamically (no hardcoding)\r\n const authFields = authData ? Object.keys(authData).reduce((acc: any, key) => {\r\n acc[key] = authData[key] !== undefined ? authData[key] : null;\r\n return acc;\r\n }, {}) : null;\r\n\r\n // Build return object dynamically with all parsed data\r\n const result: any = {\r\n ...Object.keys(parsedData).reduce((acc: any, key) => {\r\n acc[key] = parsedData[key] !== undefined ? parsedData[key] : null;\r\n return acc;\r\n }, {}),\r\n decodedToken: decodedToken ? Object.keys(decodedToken).reduce((acc: any, key) => {\r\n acc[key] = decodedToken[key] !== undefined ? decodedToken[key] : null;\r\n return acc;\r\n }, {}) : null,\r\n rawData: parsedOuter, // Include raw parsed data for any other fields\r\n };\r\n \r\n // Add auth field if we have authData\r\n if (authFields) {\r\n result.auth = authFields;\r\n }\r\n \r\n return result;\r\n } catch (err) {\r\n console.error(\"Error parsing all data from localStorage:\", err);\r\n return {\r\n auth: null,\r\n user: null,\r\n authDetails: null,\r\n userDetails: null,\r\n profile: null,\r\n notifications: null,\r\n messages: null,\r\n app: null,\r\n decodedToken: null,\r\n rawData: null,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n };\r\n }\r\n};\r\n\r\n/**\r\n * Get profile picture URL from object store API using user_id.\r\n * @param baseUrl - Base URL for the object store API (default: http://objectstore.impact0mics.local:9012)\r\n * @returns Profile picture URL or null if user_id is not available\r\n */\r\nexport const getProfilePictureUrl = (baseUrl: string = \"http://objectstore.impact0mics.local:9012\"): string | null => {\r\n try {\r\n const allData = getAllDataFromStorage();\r\n const userId =\r\n allData.decodedToken?.user_id ?? allData.auth?.user_id ?? getStoredUserDetails()?.userId ?? null;\r\n if (userId == null) return null;\r\n return `${baseUrl.replace(/\\/$/, \"\")}/v1/objectStore/profilePicture/path/${userId}`;\r\n } catch (err) {\r\n console.error(\"Error getting profile picture URL:\", err);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Generate AWS S3 presigned URL for accessing S3 object\r\n * @param s3Url - Full S3 URL (e.g., https://bucket.s3.region.amazonaws.com/key)\r\n * @param accessKeyId - AWS Access Key ID\r\n * @param secretAccessKey - AWS Secret Access Key\r\n * @param region - AWS Region (default: ap-south-2)\r\n * @param expiresIn - Expiration time in seconds (default: 3600 = 1 hour)\r\n * @returns Presigned URL string\r\n */\r\nconst generateS3PresignedUrl = async (\r\n s3Url: string,\r\n accessKeyId: string,\r\n secretAccessKey: string,\r\n region: string = \"ap-south-2\",\r\n expiresIn: number = 3600\r\n): Promise<string> => {\r\n try {\r\n // Parse S3 URL to extract bucket, region, and key\r\n // Format: https://bucket.s3.region.amazonaws.com/key or https://bucket.s3-region.amazonaws.com/key\r\n const url = new URL(s3Url);\r\n const hostnameParts = url.hostname.split('.');\r\n let bucket = hostnameParts[0];\r\n let extractedRegion = region;\r\n \r\n // Try to extract region from hostname (format: bucket.s3.region.amazonaws.com)\r\n if (hostnameParts.length >= 3 && hostnameParts[1] === 's3') {\r\n extractedRegion = hostnameParts[2] || region;\r\n } else if (hostnameParts.length >= 2 && hostnameParts[1].startsWith('s3-')) {\r\n // Format: bucket.s3-region.amazonaws.com\r\n extractedRegion = hostnameParts[1].substring(3) || region;\r\n }\r\n \r\n const key = url.pathname.substring(1); // Remove leading slash\r\n \r\n // AWS credentials\r\n const awsAccessKeyId = accessKeyId;\r\n const awsSecretAccessKey = secretAccessKey;\r\n const awsRegion = extractedRegion;\r\n \r\n // Current timestamp\r\n const now = new Date();\r\n const dateStamp = now.toISOString().slice(0, 10).replace(/-/g, '');\r\n const amzDate = dateStamp + 'T' + now.toISOString().slice(11, 19).replace(/[:-]/g, '') + 'Z';\r\n \r\n // Step 1: Create canonical request\r\n const canonicalUri = '/' + encodeURIComponent(key).replace(/%2F/g, '/');\r\n const canonicalQuerystring = `X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=${encodeURIComponent(awsAccessKeyId + '/' + dateStamp + '/' + awsRegion + '/s3/aws4_request')}&X-Amz-Date=${amzDate}&X-Amz-Expires=${expiresIn}&X-Amz-SignedHeaders=host`;\r\n const canonicalHeaders = `host:${bucket}.s3.${awsRegion}.amazonaws.com\\n`;\r\n const signedHeaders = 'host';\r\n const payloadHash = 'UNSIGNED-PAYLOAD';\r\n \r\n const canonicalRequest = `GET\\n${canonicalUri}\\n${canonicalQuerystring}\\n${canonicalHeaders}\\n${signedHeaders}\\n${payloadHash}`;\r\n \r\n // Step 2: Create string to sign\r\n const algorithm = 'AWS4-HMAC-SHA256';\r\n const credentialScope = `${dateStamp}/${awsRegion}/s3/aws4_request`;\r\n const stringToSign = `${algorithm}\\n${amzDate}\\n${credentialScope}\\n${await sha256(canonicalRequest)}`;\r\n \r\n // Step 3: Calculate signature\r\n const kDate = await hmacSha256('AWS4' + awsSecretAccessKey, dateStamp);\r\n const kRegion = await hmacSha256(kDate as ArrayBuffer, awsRegion);\r\n const kService = await hmacSha256(kRegion as ArrayBuffer, 's3');\r\n const kSigning = await hmacSha256(kService as ArrayBuffer, 'aws4_request');\r\n const signature = await hmacSha256(kSigning as ArrayBuffer, stringToSign);\r\n \r\n // Convert signature to hex\r\n const signatureHex = arrayBufferToHex(signature);\r\n \r\n // Step 4: Construct presigned URL\r\n const presignedUrl = `https://${bucket}.s3.${awsRegion}.amazonaws.com${canonicalUri}?${canonicalQuerystring}&X-Amz-Signature=${signatureHex}`;\r\n \r\n return presignedUrl;\r\n } catch (err) {\r\n console.error(\"Error generating S3 presigned URL:\", err);\r\n throw err;\r\n }\r\n};\r\n\r\n// Helper function for SHA-256 hashing\r\nconst sha256 = async (message: string): Promise<string> => {\r\n const msgBuffer = new TextEncoder().encode(message);\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\r\n return Array.from(new Uint8Array(hashBuffer))\r\n .map(b => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n};\r\n\r\n// Helper function for HMAC-SHA256\r\nconst hmacSha256 = async (key: string | ArrayBuffer, message: string): Promise<ArrayBuffer> => {\r\n const encoder = new TextEncoder();\r\n let keyBuffer: Uint8Array;\r\n \r\n if (typeof key === 'string') {\r\n keyBuffer = encoder.encode(key);\r\n } else {\r\n keyBuffer = new Uint8Array(key);\r\n }\r\n \r\n const messageBuffer = encoder.encode(message);\r\n \r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n keyBuffer as any,\r\n { name: 'HMAC', hash: 'SHA-256' },\r\n false,\r\n ['sign']\r\n );\r\n \r\n return await crypto.subtle.sign('HMAC', cryptoKey, messageBuffer);\r\n};\r\n\r\n// Helper function to convert ArrayBuffer to hex string\r\nconst arrayBufferToHex = (buffer: ArrayBuffer): string => {\r\n return Array.from(new Uint8Array(buffer))\r\n .map(b => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n};\r\n\r\n/**\r\n * Fetch profile picture from API with headers, get S3 URL, generate presigned URL, and return as blob URL\r\n * This function:\r\n * 1. Fetches the profile picture path from the API\r\n * 2. Extracts the S3 filePath from the JSON response\r\n * 3. Generates a presigned URL for the S3 object\r\n * 4. Fetches the image using the presigned URL\r\n * 5. Converts it to a blob URL that can be used in img src\r\n * @param baseUrl - Base URL for the object store API (default: http://objectstore.impact0mics.local:9012)\r\n * @param messageId - Optional message ID for X-Message-Id header (default: generated UUID)\r\n * @param correlationId - Optional correlation ID for X-Correlation-Id header (default: generated UUID)\r\n * @param awsConfig - AWS configuration (accessKeyId, secretAccessKey, region, bucket)\r\n * @returns Promise that resolves to blob URL string or null if fetch fails\r\n */\r\nexport const fetchProfilePictureAsBlobUrl = async (\r\n baseUrl: string = \"http://objectstore.impact0mics.local:9012\",\r\n messageId?: string,\r\n correlationId?: string,\r\n awsConfig?: {\r\n accessKeyId: string;\r\n secretAccessKey: string;\r\n region?: string;\r\n bucket?: string;\r\n }\r\n): Promise<string | null> => {\r\n try {\r\n const profilePictureUrl = getProfilePictureUrl(baseUrl);\r\n \r\n if (!profilePictureUrl) {\r\n return null;\r\n }\r\n \r\n // AWS credentials (default values provided by user)\r\n const defaultAwsConfig = {\r\n accessKeyId: \"AKIAVRUVTJGLBCYZEI5L\",\r\n secretAccessKey: \"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\",\r\n region: \"ap-south-2\",\r\n bucket: \"development-varminer-test\"\r\n };\r\n \r\n const finalAwsConfig = awsConfig || defaultAwsConfig;\r\n \r\n // Generate message ID and correlation ID if not provided\r\n const msgId = messageId || `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const corrId = correlationId || `corr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n // Step 1: Fetch the profile picture path from API (returns JSON with filePath)\r\n const apiResponse = await fetch(profilePictureUrl, {\r\n method: 'GET',\r\n headers: {\r\n 'X-Message-Id': msgId,\r\n 'X-Correlation-Id': corrId,\r\n },\r\n });\r\n \r\n // Check if the API response is successful\r\n if (!apiResponse.ok) {\r\n console.warn(`Failed to fetch profile picture path: ${apiResponse.status} ${apiResponse.statusText}`);\r\n return null;\r\n }\r\n \r\n // Parse JSON response\r\n const apiData = await apiResponse.json();\r\n \r\n // Extract filePath from response\r\n const s3Url = apiData?.filePath;\r\n if (!s3Url || typeof s3Url !== 'string') {\r\n console.warn('Profile picture API response does not contain valid filePath');\r\n return null;\r\n }\r\n \r\n // Step 2: Generate presigned URL for S3 object\r\n const presignedUrl = await generateS3PresignedUrl(\r\n s3Url,\r\n finalAwsConfig.accessKeyId,\r\n finalAwsConfig.secretAccessKey,\r\n finalAwsConfig.region\r\n );\r\n \r\n // Step 3: Fetch the image using presigned URL\r\n const imageResponse = await fetch(presignedUrl, {\r\n method: 'GET',\r\n });\r\n \r\n // Check if the image response is successful\r\n if (!imageResponse.ok) {\r\n console.warn(`Failed to fetch profile picture image: ${imageResponse.status} ${imageResponse.statusText}`);\r\n return null;\r\n }\r\n \r\n // Check if the response is an image\r\n const contentType = imageResponse.headers.get('content-type');\r\n if (!contentType || !contentType.startsWith('image/')) {\r\n console.warn(`Profile picture response is not an image: ${contentType}`);\r\n return null;\r\n }\r\n \r\n // Step 4: Convert response to blob\r\n const blob = await imageResponse.blob();\r\n \r\n // Step 5: Create blob URL\r\n const blobUrl = URL.createObjectURL(blob);\r\n \r\n return blobUrl;\r\n } catch (err) {\r\n console.error(\"Error fetching profile picture:\", err);\r\n return null;\r\n }\r\n};\r\n\r\n","export type SupportedLanguage = 'en' | 'es';\r\n\r\nexport interface Translations {\r\n accountSettings: string;\r\n profile: string;\r\n signOut: string;\r\n messages: string;\r\n notifications: string;\r\n online: string;\r\n offline: string;\r\n role: string;\r\n}\r\n\r\nexport const translations: Record<SupportedLanguage, Translations> = {\r\n en: {\r\n accountSettings: 'Account Settings',\r\n profile: 'Profile',\r\n signOut: 'Sign out',\r\n messages: 'Messages',\r\n notifications: 'Notifications',\r\n online: 'Online',\r\n offline: 'Offline',\r\n role: 'Role',\r\n },\r\n es: {\r\n accountSettings: 'Configuración de cuenta',\r\n profile: 'Perfil',\r\n signOut: 'Cerrar sesión',\r\n messages: 'Mensajes',\r\n notifications: 'Notificaciones',\r\n online: 'En línea',\r\n offline: 'Desconectado',\r\n role: 'Rol',\r\n },\r\n};\r\n\r\nexport const getTranslations = (language: SupportedLanguage = 'en'): Translations => {\r\n return translations[language] || translations.en;\r\n};\r\n\r\n","export default \"data:image/svg+xml,%3Csvg%20width%3D%22134%22%20height%3D%2223%22%20viewBox%3D%220%200%20134%2023%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M0%2016.9641V0H2.29277V16.9641H0Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M19.7586%204.39182C20.6034%204.36006%2021.361%204.53721%2022.0278%204.92659C22.3033%205.0887%2022.5771%205.30261%2022.8458%205.57C23.1146%205.83738%2023.3531%206.17663%2023.5647%206.58941C23.7764%207.00219%2023.946%207.49519%2024.077%208.07007C24.2064%208.64495%2024.2719%209.32011%2024.2719%2010.0972V16.9891H22.0765V10.6788C22.0765%209.95014%2021.9909%209.3151%2021.8195%208.77364C21.6482%208.23217%2021.4214%207.77929%2021.1359%207.41497C20.8504%207.05065%2020.5262%206.77992%2020.16%206.60111C19.7938%206.42396%2019.4243%206.33372%2019.0497%206.33372C18.6752%206.33372%2018.2821%206.42229%2017.9159%206.60111C17.5498%206.77992%2017.2205%207.05065%2016.9283%207.41497C16.636%207.77929%2016.3992%208.23217%2016.2211%208.77364C16.0414%209.31677%2015.9524%209.95014%2015.9524%2010.6788V16.9891H13.757V10.6788C13.757%209.95014%2013.6714%209.3151%2013.5017%208.77364C13.3304%208.23217%2013.1036%207.77929%2012.8181%207.41497C12.5342%207.05065%2012.2084%206.77992%2011.8422%206.60111C11.476%206.42396%2011.1065%206.33372%2010.7319%206.33372C10.3573%206.33372%209.9643%206.42229%209.59813%206.60111C9.23196%206.77992%208.90274%207.05065%208.61047%207.41497C8.3182%207.77929%208.08137%208.23217%207.90332%208.77364C7.72359%209.31677%207.63457%209.95014%207.63457%2010.6788V16.9891H5.3418V4.58734H7.63457V6.74817C7.97555%206.13318%208.36692%205.66859%208.80531%205.35274C9.24371%205.03689%209.6586%204.80627%2010.05%204.66088C10.5052%204.49877%2010.9688%204.4102%2011.4407%204.39349C12.027%204.36174%2012.588%204.45031%2013.1238%204.66088C13.5958%204.83969%2014.0627%205.13883%2014.5263%205.5583C14.9899%205.97943%2015.3511%206.62618%2015.6114%207.5002C15.9205%206.69135%2016.3102%206.07636%2016.7821%205.65522C17.2541%205.23409%2017.7093%204.92659%2018.1477%204.73274C18.6684%204.52217%2019.2043%204.40853%2019.7586%204.39349V4.39182Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M32.9558%204.39185C34.0291%204.44031%2034.9882%204.69934%2035.8348%205.16894C36.1926%205.3628%2036.5453%205.61013%2036.8964%205.90927C37.2457%206.20841%2037.5548%206.58108%2037.8236%207.02561C38.0923%207.47015%2038.3073%207.99323%2038.4702%208.59151C38.6332%209.18979%2038.7138%209.88666%2038.7138%2010.6788V10.8727C38.7138%2011.6665%2038.6315%2012.365%2038.4702%2012.9717C38.3073%2013.5783%2038.0923%2014.1047%2037.8236%2014.5492C37.5548%2014.9938%2037.2457%2015.3664%2036.8964%2015.6656C36.547%2015.9647%2036.1926%2016.2121%2035.8348%2016.4059C34.9882%2016.8588%2034.0291%2017.1095%2032.9558%2017.1579C32.5174%2017.1412%2032.0773%2017.061%2031.6389%2016.9156C31.2644%2016.7869%2030.8663%2016.5797%2030.443%2016.2973C30.0197%2016.0149%2029.63%2015.6138%2029.2723%2015.0957V22.8132H26.9795V4.5857H29.2723V6.47914C29.63%205.94604%2030.0197%205.5366%2030.443%205.25417C30.8663%204.97174%2031.2644%204.76452%2031.6389%204.63584C32.0773%204.49044%2032.5174%204.41023%2032.9558%204.39352V4.39185ZM36.4932%2010.6788C36.4932%209.95017%2036.3908%209.31512%2036.1875%208.77366C35.9843%208.2322%2035.7155%207.77931%2035.383%207.415C35.0487%207.05068%2034.6674%206.77995%2034.2357%206.60114C33.8041%206.42399%2033.3606%206.33375%2032.9071%206.33375C32.4536%206.33375%2032.0085%206.42232%2031.5768%206.60114C31.1451%206.77995%2030.7588%207.05068%2030.4178%207.415C30.0768%207.77931%2029.7997%208.2322%2029.588%208.77366C29.3764%209.3168%2029.2706%209.95017%2029.2706%2010.6788V10.8727C29.2706%2011.6013%2029.3764%2012.2363%2029.588%2012.7778C29.7997%2013.3209%2030.0752%2013.7738%2030.4178%2014.1365C30.7588%2014.5008%2031.1451%2014.7715%2031.5768%2014.9503C32.0068%2015.1291%2032.4502%2015.2177%2032.9071%2015.2177C33.364%2015.2177%2033.8057%2015.1291%2034.2357%2014.9503C34.6657%2014.7732%2035.0487%2014.5008%2035.383%2014.1365C35.7155%2013.7721%2035.9843%2013.3193%2036.1875%2012.7778C36.3908%2012.2363%2036.4932%2011.6013%2036.4932%2010.8727V10.6788Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M41.0529%205.99458C41.3301%205.8659%2041.6795%205.70714%2042.1011%205.52164C42.5243%205.33614%2042.9913%205.16234%2043.5036%205.00023C44.0159%204.83813%2044.5568%204.70109%2045.1262%204.58745C45.6956%204.47381%2046.2482%204.41699%2046.7857%204.41699C47.3232%204.41699%2047.8338%204.48551%2048.3226%204.62255C48.8097%204.75958%2049.238%204.99856%2049.6025%205.33781C49.9687%205.67706%2050.2576%206.13162%2050.4693%206.69647C50.6809%207.263%2050.7867%207.97492%2050.7867%208.83223V16.9876H48.6149V14.8769C48.4839%2015.2161%2048.2689%2015.5286%2047.9682%2015.8111C47.6675%2016.0935%2047.3215%2016.3375%2046.9318%2016.5397C46.5422%2016.7419%2046.1138%2016.8956%2045.6502%2017.0009C45.1866%2017.1062%2044.7197%2017.158%2044.2477%2017.158C43.7757%2017.158%2043.292%2017.0928%2042.8452%2016.9642C42.3984%2016.8355%2042.0003%2016.6333%2041.6492%2016.3575C41.2998%2016.0835%2041.0193%2015.7308%2040.8077%2015.3013C40.5961%2014.8735%2040.4902%2014.3505%2040.4902%2013.7355C40.4902%2012.9266%2040.6851%2012.223%2041.0764%2011.6248C41.4661%2011.0265%2042.0154%2010.5201%2042.7225%2010.1073C43.4297%209.69456%2044.2847%209.38372%2045.2841%209.17315C46.2835%208.96258%2047.3937%208.8573%2048.6132%208.8573V8.83223C48.6132%208.36263%2048.5561%207.96991%2048.4419%207.65573C48.3277%207.33987%2048.1647%207.08586%2047.9548%206.892C47.7431%206.69814%2047.5029%206.56111%2047.2359%206.47922C46.9671%206.39901%2046.6715%206.35722%2046.3456%206.35722C45.9072%206.35722%2045.4504%206.41739%2044.98%206.53938C44.508%206.66138%2044.0646%206.80176%2043.6497%206.96386C43.2348%207.12596%2042.8653%207.28306%2042.5395%207.4368C42.2136%207.59055%2041.9784%207.69918%2041.8323%207.76435L41.0512%205.99291L41.0529%205.99458ZM48.6149%2010.7507C48.0287%2010.7507%2047.3904%2010.7875%2046.7%2010.8594C46.008%2010.9329%2045.363%2011.0733%2044.76%2011.2838C44.1587%2011.4944%2043.6581%2011.7936%2043.26%2012.1813C42.862%2012.569%2042.6621%2013.0787%2042.6621%2013.7104C42.6621%2014.2769%2042.8821%2014.7014%2043.3205%2014.9855C43.7589%2015.2679%2044.2796%2015.41%2044.8826%2015.41C45.3059%2015.41%2045.7359%2015.3381%2046.176%2015.191C46.6144%2015.0457%2047.0175%2014.8234%2047.3837%2014.5243C47.7498%2014.2251%2048.0455%2013.8524%2048.2739%2013.4079C48.5007%2012.9634%2048.6149%2012.442%2048.6149%2011.842V10.7507Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M55.1523%2010.7991C55.1523%2011.5595%2055.2665%2012.228%2055.4933%2012.8012C55.72%2013.3761%2056.0207%2013.8523%2056.3953%2014.2334C56.7698%2014.6144%2057.1998%2014.9002%2057.6886%2015.0957C58.1757%2015.2895%2058.6796%2015.3865%2059.2004%2015.3865C59.8185%2015.3865%2060.44%2015.2528%2061.0665%2014.9854C61.693%2014.718%2062.2574%2014.3019%2062.7613%2013.7354L63.9085%2014.9971C63.3391%2015.7257%2062.6286%2016.2722%2061.7736%2016.6348C60.9204%2016.9992%2060.0301%2017.1813%2059.1029%2017.1813C58.3387%2017.1813%2057.5912%2017.051%2056.8589%2016.7936C56.1265%2016.5346%2055.4714%2016.1469%2054.8953%2015.6288C54.3175%2015.1107%2053.8539%2014.4473%2053.5045%2013.6384C53.1552%2012.8296%2052.9805%2011.8837%2052.9805%2010.7991C52.9805%209.71451%2053.1552%208.74857%2053.5045%207.94808C53.8539%207.14759%2054.3175%206.48413%2054.8953%205.95771C55.4731%205.43129%2056.1265%205.04024%2056.8589%204.78121C57.5912%204.52218%2058.3387%204.39349%2059.1029%204.39349C60.0301%204.39349%2060.9204%204.57565%2061.7736%204.93997C62.6269%205.30428%2063.3391%205.85076%2063.9085%206.57772L62.7613%207.83946C62.2574%207.27293%2061.6913%206.8568%2061.0665%206.58942C60.44%206.32203%2059.8185%206.18834%2059.2004%206.18834C58.6796%206.18834%2058.1757%206.28526%2057.6886%206.47912C57.2015%206.67298%2056.7698%206.96376%2056.3953%207.35314C56.0207%207.74086%2055.72%208.22383%2055.4933%208.79704C55.2648%209.37192%2055.1523%2010.0387%2055.1523%2010.7991Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M71.9846%2015.2662L72.1559%2016.8672C71.6352%2016.949%2071.1632%2017.0126%2070.7416%2017.061C70.3184%2017.1095%2069.9438%2017.1345%2069.6196%2017.1345C69.067%2017.1345%2068.6152%2017.066%2068.2658%2016.929C67.9164%2016.792%2067.6443%2016.5814%2067.4495%2016.2973C67.2546%2016.0149%2067.1202%2015.6505%2067.0463%2015.2043C66.9724%2014.7598%2066.9288%2014.2217%2066.912%2013.59V6.35715H64.9854V4.5857H66.912V2.6438H69.2047V4.5857H72.1324V6.35715H69.2047V13.59C69.2047%2013.9459%2069.2165%2014.2334%2069.2417%2014.4523C69.2669%2014.6712%2069.3677%2014.84%2069.5474%2014.962C69.7254%2015.084%2070.0059%2015.1642%2070.3889%2015.2043C70.7702%2015.2444%2071.3043%2015.2645%2071.9863%2015.2645L71.9846%2015.2662Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M100.591%204.39163C101.435%204.35988%20102.193%204.53703%20102.86%204.92641C103.135%205.08851%20103.409%205.30242%20103.678%205.56981C103.947%205.8372%20104.185%206.17645%20104.397%206.58923C104.608%207.00201%20104.778%207.495%20104.909%208.06989C105.038%208.64477%20105.104%209.31993%20105.104%2010.097V16.9889H102.909V10.6786C102.909%209.94996%20102.823%209.31491%20102.652%208.77345C102.48%208.23199%20102.253%207.7791%20101.968%207.41479C101.682%207.05047%20101.358%206.77974%20100.992%206.60093C100.626%206.42378%20100.256%206.33354%2099.8818%206.33354C99.5072%206.33354%2099.1142%206.42211%2098.748%206.60093C98.3818%206.77974%2098.0526%207.05047%2097.7603%207.41479C97.4681%207.7791%2097.2312%208.23199%2097.0532%208.77345C96.8734%209.31658%2096.7844%209.94996%2096.7844%2010.6786V16.9889H94.5891V10.6786C94.5891%209.94996%2094.5034%209.31491%2094.3338%208.77345C94.1624%208.23199%2093.9357%207.7791%2093.6501%207.41479C93.3663%207.05047%2093.0404%206.77974%2092.6742%206.60093C92.308%206.42378%2091.9385%206.33354%2091.564%206.33354C91.1894%206.33354%2090.7963%206.42211%2090.4302%206.60093C90.064%206.77974%2089.7348%207.05047%2089.4425%207.41479C89.1502%207.7791%2088.9134%208.23199%2088.7354%208.77345C88.5556%209.31658%2088.4666%209.94996%2088.4666%2010.6786V16.9889H86.1738V4.58716H88.4666V6.74799C88.8076%206.133%2089.199%205.66841%2089.6374%205.35256C90.0758%205.03671%2090.4906%204.80609%2090.882%204.66069C91.3372%204.49859%2091.8008%204.41002%2092.2728%204.3933C92.859%204.36155%2093.42%204.45013%2093.9558%204.66069C94.4278%204.83951%2094.8948%205.13865%2095.3584%205.55811C95.822%205.97925%2096.1831%206.62599%2096.4434%207.50002C96.7525%206.69117%2097.1422%206.07618%2097.6142%205.65504C98.0862%205.23391%2098.5414%204.92641%2098.9798%204.73255C99.5005%204.52199%20100.036%204.40834%20100.591%204.3933V4.39163Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M108.933%203.34883C108.559%203.34883%20108.241%203.22015%20107.982%202.96112C107.722%202.70209%20107.593%202.38624%20107.593%202.01524C107.593%201.64424%20107.722%201.32838%20107.982%201.06935C108.243%200.810321%20108.56%200.681641%20108.933%200.681641C109.306%200.681641%20109.629%200.811992%20109.897%201.06935C110.166%201.32838%20110.3%201.64424%20110.3%202.01524C110.3%202.38624%20110.166%202.70376%20109.897%202.96112C109.629%203.22015%20109.308%203.34883%20108.933%203.34883ZM107.786%2016.989V4.58717H110.104V16.989H107.786Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M114.569%2010.7989C114.569%2011.5593%20114.684%2012.2278%20114.91%2012.801C115.137%2013.3759%20115.438%2013.8522%20115.812%2014.2332C116.187%2014.6142%20116.617%2014.9%20117.106%2015.0955C117.593%2015.2894%20118.097%2015.3863%20118.617%2015.3863C119.235%2015.3863%20119.857%2015.2526%20120.483%2014.9852C121.11%2014.7178%20121.674%2014.3017%20122.178%2013.7352L123.326%2014.9969C122.756%2015.7255%20122.046%2016.272%20121.191%2016.6347C120.337%2016.999%20119.447%2017.1811%20118.52%2017.1811C117.756%2017.1811%20117.008%2017.0508%20116.276%2016.7934C115.544%2016.5344%20114.888%2016.1467%20114.312%2015.6286C113.734%2015.1106%20113.271%2014.4471%20112.922%2013.6382C112.572%2012.8294%20112.397%2011.8835%20112.397%2010.7989C112.397%209.71433%20112.572%208.74839%20112.922%207.9479C113.271%207.14741%20113.734%206.48395%20114.312%205.95753C114.89%205.43111%20115.544%205.04006%20116.276%204.78102C117.008%204.52199%20117.756%204.39331%20118.52%204.39331C119.447%204.39331%20120.337%204.57547%20121.191%204.93979C122.044%205.3041%20122.756%205.85058%20123.326%206.57754L122.178%207.83927C121.674%207.27274%20121.108%206.85662%20120.483%206.58923C119.857%206.32185%20119.235%206.18815%20118.617%206.18815C118.097%206.18815%20117.593%206.28508%20117.106%206.47894C116.619%206.67279%20116.187%206.96358%20115.812%207.35296C115.438%207.74067%20115.137%208.22364%20114.91%208.79685C114.682%209.37174%20114.569%2010.0385%20114.569%2010.7989Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M127.764%207.62027C127.764%207.94447%20127.914%208.21855%20128.216%208.44583C128.517%208.67311%20128.895%208.89036%20129.35%209.10093C129.805%209.31149%20130.3%209.53376%20130.838%209.76773C131.374%2010.0017%20131.871%2010.2858%20132.326%2010.6167C132.781%2010.9492%20133.159%2011.3537%20133.46%2011.83C133.761%2012.3079%20133.912%2012.8861%20133.912%2013.5646C133.912%2014.1796%20133.789%2014.7177%20133.546%2015.179C133.302%2015.6402%20132.98%2016.0213%20132.581%2016.3204C132.183%2016.6195%20131.72%2016.8468%20131.191%2017.0006C130.662%2017.1543%20130.114%2017.2312%20129.545%2017.2312C128.586%2017.2312%20127.653%2017.0206%20126.751%2016.5995C125.849%2016.1783%20125.146%2015.54%20124.642%2014.6826L125.958%2013.202C126.414%2013.9306%20126.943%2014.4604%20127.544%2014.7913C128.145%2015.1238%20128.732%2015.2893%20129.301%2015.2893C129.87%2015.2893%20130.358%2015.1355%20130.764%2014.828C131.171%2014.5205%20131.374%2014.0994%20131.374%2013.5663C131.374%2013.0967%20131.223%2012.7257%20130.922%2012.45C130.621%2012.1742%20130.252%2011.9369%20129.812%2011.7347C129.373%2011.5325%20128.888%2011.3386%20128.36%2011.1515C127.831%2010.966%20127.348%2010.7303%20126.909%2010.4479C126.471%2010.1655%20126.1%209.80115%20125.799%209.35495C125.498%208.91041%20125.347%208.32383%20125.347%207.5952C125.347%207.06042%20125.456%206.5925%20125.676%206.18807C125.896%205.78365%20126.189%205.44774%20126.555%205.18035C126.921%204.91297%20127.339%204.71075%20127.811%204.57372C128.283%204.43668%20128.77%204.36816%20129.274%204.36816C130.007%204.36816%20130.717%204.50186%20131.409%204.76924C132.099%205.03663%20132.665%205.4444%20133.104%205.99422L131.811%207.32948C131.404%206.8766%20130.989%206.5457%20130.566%206.33514C130.143%206.12457%20129.744%206.01928%20129.37%206.01928C128.898%206.01928%20128.512%206.16133%20128.211%206.44376C127.91%206.72786%20127.759%207.11891%20127.759%207.62027H127.764Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M82.2257%2016.5045C82.7489%2016.5045%2083.173%2016.0825%2083.173%2015.5619C83.173%2015.0414%2082.7489%2014.6194%2082.2257%2014.6194C81.7025%2014.6194%2081.2783%2015.0414%2081.2783%2015.5619C81.2783%2016.0825%2081.7025%2016.5045%2082.2257%2016.5045Z%22%20fill%3D%22%235BC0BE%22%2F%3E%3Cpath%20d%3D%22M83.3365%207.03215C82.799%206.22831%2082.4748%205.97596%2082.4379%205.94421C82.4076%205.97763%2081.86%206.56923%2081.3964%207.65716C81.64%207.98304%2081.7509%208.27215%2081.9071%208.71502C82.1019%209.2665%2082.201%209.91325%2082.201%2010.6402C82.201%2011.414%2082.0986%2012.0975%2081.8953%2012.6724C81.6904%2013.2489%2081.4216%2013.7336%2081.0958%2014.1146C80.7682%2014.4973%2080.3886%2014.7914%2079.9704%2014.9869C79.1322%2015.3797%2078.2067%2015.3797%2077.3686%2014.9869C76.9503%2014.7914%2076.5673%2014.4973%2076.2331%2014.1146C75.8971%2013.7319%2075.6284%2013.2472%2075.4336%2012.6707C75.2387%2012.0975%2075.1396%2011.4223%2075.1396%2010.6636C75.1396%209.90489%2075.2421%209.28823%2075.447%208.73841C75.6502%208.18692%2075.919%207.72234%2076.2465%207.35635C76.5741%206.98869%2076.957%206.70794%2077.3837%206.52077C77.8086%206.33359%2078.2554%206.24001%2078.7022%206.24001C79.149%206.24001%2079.5757%206.32858%2079.9922%206.5074C80.2492%206.61769%2080.3668%206.70125%2080.5919%206.88341C80.9396%206.36702%2081.2016%205.79715%2081.3696%205.18048C81.3528%205.17046%2081.336%205.16043%2081.3175%205.1504C80.5146%204.71088%2079.71%204.53207%2078.6888%204.48193H78.6703H78.6518C77.6306%204.53207%2076.7051%204.7794%2075.9022%205.21725C75.5528%205.40776%2075.2118%205.65008%2074.8877%205.94087C74.5652%206.23165%2074.2679%206.59764%2074.0075%207.03047C73.7455%207.46331%2073.5338%207.98304%2073.3743%208.57464C73.2164%209.16623%2073.1357%209.85977%2073.1357%2010.6369C73.1357%2011.414%2073.2164%2012.1359%2073.3743%2012.7342C73.5322%2013.3341%2073.7455%2013.8622%2074.0075%2014.3034C74.2695%2014.7446%2074.5652%2015.124%2074.8893%2015.4298C75.2135%2015.7373%2075.5562%2015.998%2075.9089%2016.2052C76.7051%2016.6548%2077.6256%2016.9171%2078.6451%2016.984H78.6703H78.6955C79.6748%2016.9205%2080.5633%2016.6731%2081.3444%2016.2503C81.0303%2015.8091%2081.0706%2015.1942%2081.467%2014.7998C81.897%2014.3719%2082.584%2014.3602%2083.0291%2014.7597C83.1332%2014.6159%2083.2357%2014.4655%2083.3314%2014.3034C83.5918%2013.8639%2083.8051%2013.3358%2083.9647%2012.7342C84.1226%2012.1326%2084.2032%2011.4273%2084.2032%2010.6369C84.2032%209.8464%2084.1226%209.16958%2083.963%208.57464C83.8034%207.98137%2083.5901%207.46164%2083.3298%207.03047L83.3365%207.03215Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M77.0141%209.74781C75.4268%2011.7031%2077.7582%2014.2817%2079.7788%2013.2322C81.5173%2012.3298%2080.7883%2010.9343%2080.8152%209.58237C80.8387%208.37076%2081.4955%206.88175%2082.2547%205.94923C83.0626%204.95488%2085.1303%204.66243%2084.7238%202.9712C84.4165%201.6961%2082.6864%201.39529%2081.9104%202.3913C81.3594%203.09654%2081.7542%203.96722%2081.603%204.77607C81.3443%206.17651%2080.6153%207.36639%2079.5135%208.25545C78.7777%208.84872%2077.5365%209.10608%2077.0141%209.74781Z%22%20fill%3D%22%235BC0BE%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAMAAADImI+JAAAANlBMVEX////w8vfyxcx8jbJCWpAOLHFVa5sBIWnIEC7WTGLnv8qAkLTheYpecqHx0digrMfz3+T21dqBS5WQAAAApUlEQVQoz8WTyxpFMAyEpyqOuhTv/7IntImmurAzC59kfsIIhA5wnn6iASMLgzbIT2Fk6joUaAUKBsiJm+kJ0iyuR1mQBam8Cex1dINkZ6EesSZwrR8JfdYWl7AcbCRw5ypytYmPpy6w3X6jL8HXL6PxOODgTPYEcnXmFe94cuBsdJzwpIFrRwK3WPkJLQqL2aUoUVisXjOvLizWWNyMVljrV0gz/wdhEi0lRIbcAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAbCAMAAAA5zj1cAAAApVBMVEX6vQCtFRnBPxP3tgCkSRTxsQC9miCtkjL3ugDcdwrVkwndpwauUEi3k3ecLQyvGx01YomtXy3Zhha+gw+4LiCzn4jKeBKyYgjmoAOkXUK/RhC1kJmmKh+0oKCbYwN5OAWWHxSVi0HypQNcdGsDAgC9g1j6vgSWhnLfsSXCn169cE24eBuaNwzQaiOYagW8bxWIOhqoKhPLdq4yUHR+UgVZLWaBHkAs3esWAAAAk0lEQVQ4y+WTVxLDIAxESQwBAwb33tKc3sv9j5YbWJp8JvurNzsrzYpMkCI/BU6RIt9phqIcJSOpEGBu7c2WA+iXOWmbtTmTACh42PdelSgwp+d2nXdvTjuAc3X5vL6qJo4XQEZ9qd8PXaR7yDE5GFOf6XbNRrmB8cgcKaUraJm5z4NiE4RLH3FyIUaG6Pb85XN9AIg9CvrV7UGSAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport {\n Button,\n Menu,\n MenuItem,\n ListItemIcon,\n ListItemText,\n Box,\n} from \"@mui/material\";\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\nimport { SupportedLanguage } from \"./utils/translations\";\nimport { setI18nLocaleToStorage } from \"./utils/localStorage\";\nimport GBFlag from \"./asset/flags/gb.png\";\nimport ESFlag from \"./asset/flags/es.png\";\n\ninterface LanguageOption {\n code: SupportedLanguage;\n name: string;\n flag: string;\n}\n\nconst languages: LanguageOption[] = [\n { code: \"en\", name: \"English\", flag: GBFlag },\n { code: \"es\", name: \"Spanish\", flag: ESFlag },\n];\n\ninterface LanguageSelectorProps {\n currentLanguage: SupportedLanguage;\n onLanguageChange: (language: SupportedLanguage) => void;\n}\n\nconst LanguageSelector: React.FC<LanguageSelectorProps> = ({\n currentLanguage,\n onLanguageChange: _onLanguageChange, // reserved for parent callback; we reload the page on select\n}) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n const currentLang = languages.find((lang) => lang.code === currentLanguage) || languages[0];\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleLanguageSelect = (languageCode: SupportedLanguage) => {\n // Update localStorage\n setI18nLocaleToStorage(languageCode);\n \n // Get current path\n const currentPath = window.location.pathname;\n const search = window.location.search;\n const hash = window.location.hash;\n \n // Find and replace existing locale /:locale/ with new locale\n const newPath = currentPath.replace(/\\/(en|es)\\//, `/${languageCode}/`);\n \n // Construct full URL and reload the page to apply translations\n const fullUrl = newPath + search + hash;\n window.location.href = fullUrl;\n \n handleClose();\n };\n\n return (\n <>\n <Button\n onClick={handleClick}\n sx={{\n color: \"#1e2f97\",\n textTransform: \"none\",\n padding: \"4px 8px\",\n minWidth: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n \"&:hover\": {\n backgroundColor: \"rgba(30, 47, 151, 0.04)\",\n },\n }}\n aria-label=\"Select language\"\n aria-controls={open ? \"language-menu\" : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? \"true\" : undefined}\n >\n <Box\n component=\"img\"\n src={currentLang.flag}\n alt={currentLang.name}\n sx={{\n width: \"20px\",\n height: \"15px\",\n objectFit: \"cover\",\n borderRadius: \"2px\",\n }}\n />\n <Box\n component=\"span\"\n sx={{\n fontSize: \"14px\",\n fontWeight: 500,\n marginLeft: \"4px\",\n }}\n >\n {currentLang.code.toUpperCase()}\n </Box>\n <ArrowDropDownIcon\n sx={{\n fontSize: \"20px\",\n marginLeft: \"2px\",\n display: \"flex\",\n alignSelf: \"center\",\n }}\n />\n </Button>\n <Menu\n id=\"language-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n slotProps={{\n paper: {\n sx: {\n mt: 1,\n minWidth: 150,\n },\n },\n }}\n >\n {languages.map((language) => (\n <MenuItem\n key={language.code}\n onClick={() => handleLanguageSelect(language.code)}\n selected={language.code === currentLanguage}\n >\n <ListItemIcon>\n <Box\n component=\"img\"\n src={language.flag}\n alt={language.name}\n sx={{\n width: \"24px\",\n height: \"18px\",\n objectFit: \"cover\",\n borderRadius: \"2px\",\n }}\n />\n </ListItemIcon>\n <ListItemText primary={language.name} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\n\nexport default LanguageSelector;\n\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\nimport MailIcon from \"@mui/icons-material/Mail\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\nimport {\n AppBar,\n Avatar,\n Badge,\n Box,\n Divider,\n IconButton,\n List,\n ListItem,\n ListItemAvatar,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n styled,\n Toolbar,\n Typography,\n} from \"@mui/material\";\nimport { deepOrange } from \"@mui/material/colors\";\nimport React from \"react\";\nimport { useDrawer } from \"./DrawerContext\";\nimport { AppHeaderProps, UserProfile } from \"./types\";\nimport { getUserDataFromStorage, getNotificationCountFromStorage, getMessageCountFromStorage, getI18nLocaleFromStorage, setI18nLocaleToStorage, getAllDataFromStorage, fetchProfilePictureAsBlobUrl } from \"./utils/localStorage\";\nimport { getTranslations, SupportedLanguage } from \"./utils/translations\";\nimport ImpactomicsLogo from \"./asset/Impactomics.svg\";\nimport LanguageSelector from \"./LanguageSelector\";\nimport \"./styles/Header.scss\";\n\nconst DEFAULT_ROUTES = {\n settings: \"/account/overview\",\n profile: \"/user/profile\",\n logout: \"/user/login\",\n};\n\nconst AppHeader: React.FC<AppHeaderProps> = ({ language: languageProp }) => {\n // Get initial language from props, URL, localStorage, or default to 'en'\n const getInitialLanguage = (): SupportedLanguage => {\n // Priority 1: Props\n if (languageProp) {\n setI18nLocaleToStorage(languageProp);\n return languageProp as SupportedLanguage;\n }\n \n // Priority 2: URL path - pattern is /:locale/base-name/...\n const currentPath = window.location.pathname;\n const localePattern = /^\\/(en|es)(\\/|$)/;\n const localeMatch = currentPath.match(localePattern);\n if (localeMatch && localeMatch[1]) {\n const urlLocale = localeMatch[1] as SupportedLanguage;\n setI18nLocaleToStorage(urlLocale);\n return urlLocale;\n }\n \n // Priority 3: localStorage\n const storedLocale = getI18nLocaleFromStorage();\n if (storedLocale && (storedLocale === 'en' || storedLocale === 'es')) {\n return storedLocale as SupportedLanguage;\n }\n \n // Default\n return 'en';\n };\n\n const [currentLanguage, setCurrentLanguage] = React.useState<SupportedLanguage>(getInitialLanguage);\n const t = getTranslations(currentLanguage);\n \n const { isDrawerOpen, toggleDrawer } = useDrawer();\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\n React.useState<null | HTMLElement>(null);\n \n const [user, setUser] = React.useState<UserProfile>(() => {\n const allData = getAllDataFromStorage();\n let userName = \"\";\n let userEmail = \"\";\n let userRole = \"\";\n\n const buildNameFromFirstLast = (obj: Record<string, unknown> | null | undefined): string => {\n if (!obj || typeof obj !== \"object\") return \"\";\n const first = (obj.firstName ?? obj.given_name ?? obj.first_name) as string | undefined;\n const last = (obj.lastName ?? obj.family_name ?? obj.last_name) as string | undefined;\n return [first, last].filter(Boolean).join(\" \").trim();\n };\n\n // Prefer getUserDataFromStorage first (IAM firstName+lastName or persist:userdb name)\n const storedUser = getUserDataFromStorage();\n if (storedUser) {\n userName = storedUser.name || \"\";\n userEmail = userEmail || storedUser.email || \"\";\n userRole = userRole || storedUser.role || \"\";\n }\n\n // Then enrich from decoded token (email from sub; name only if token has name/given_name/family_name, never use sub as name)\n if (allData.decodedToken) {\n const token = allData.decodedToken as Record<string, unknown>;\n userEmail = userEmail || (token.sub as string) || (token.email as string) || \"\";\n const tokenName = (token.name as string) || buildNameFromFirstLast(token);\n userName = userName || (tokenName || \"\");\n userRole = userRole || (token.role as string) || \"\";\n }\n\n if (allData.auth) {\n const auth = allData.auth as Record<string, unknown>;\n userEmail = userEmail || (auth.email as string) || (auth.sub as string) || \"\";\n userName = userName || (auth.name as string) || buildNameFromFirstLast(auth) || \"\";\n userRole = userRole || (auth.role as string) || (auth.activeRole as string) || \"\";\n }\n\n if (allData.userDetails) {\n const userDetails = (allData.userDetails as Record<string, unknown>).user\n || (allData.userDetails as Record<string, unknown>).data\n || allData.userDetails;\n const details = userDetails as Record<string, unknown> | undefined;\n if (details) {\n userEmail = userEmail || (details.email as string) || (details.emailAddress as string) || \"\";\n userName = userName || (details.name as string) || (details.fullName as string) || buildNameFromFirstLast(details) || \"\";\n userRole = userRole || (details.role as string) || (details.userRole as string) || \"\";\n }\n }\n\n if (allData.user) {\n const u = (allData.user as Record<string, unknown>).user\n || (allData.user as Record<string, unknown>).data\n || (allData.user as Record<string, unknown>).currentUser\n || allData.user;\n const userData = u as Record<string, unknown> | undefined;\n if (userData) {\n userEmail = userEmail || (userData.email as string) || (userData.emailAddress as string) || \"\";\n userName = userName || (userData.name as string) || (userData.fullName as string) || buildNameFromFirstLast(userData) || \"\";\n userRole = userRole || (userData.role as string) || (userData.userRole as string) || \"\";\n }\n }\n\n if (allData.profile) {\n const p = (allData.profile as Record<string, unknown>).user\n || (allData.profile as Record<string, unknown>).data\n || allData.profile;\n const profileData = p as Record<string, unknown> | undefined;\n if (profileData) {\n userEmail = userEmail || (profileData.email as string) || (profileData.emailAddress as string) || \"\";\n userName = userName || (profileData.name as string) || (profileData.fullName as string) || buildNameFromFirstLast(profileData) || \"\";\n userRole = userRole || (profileData.role as string) || (profileData.userRole as string) || \"\";\n }\n }\n\n return {\n name: userName || \"\",\n email: userEmail || \"\",\n role: userRole || \"\",\n avatar: storedUser?.avatar || (allData.auth as Record<string, unknown> | undefined)?.avatar || (allData.profile as Record<string, unknown> | undefined)?.avatar || undefined,\n initials: storedUser?.initials || (allData.auth as Record<string, unknown> | undefined)?.initials || (allData.profile as Record<string, unknown> | undefined)?.initials || undefined,\n };\n });\n\n const [notificationCount, setNotificationCount] = React.useState<number>(() => {\n const count = getNotificationCountFromStorage();\n return count !== null && count !== undefined ? count : 0;\n });\n \n const [messageCount, setMessageCount] = React.useState<number | undefined>(() => {\n return getMessageCountFromStorage() ?? undefined;\n });\n\n // State for profile picture blob URL\n const [profilePictureBlobUrl, setProfilePictureBlobUrl] = React.useState<string | null>(null);\n\n // Fetch profile picture from API when component mounts or user data changes\n React.useEffect(() => {\n const fetchProfilePicture = async () => {\n // Try to fetch profile picture from API\n const blobUrl = await fetchProfilePictureAsBlobUrl();\n if (blobUrl) {\n // Clean up previous blob URL if it exists\n setProfilePictureBlobUrl((prevUrl) => {\n if (prevUrl) {\n URL.revokeObjectURL(prevUrl);\n }\n return blobUrl;\n });\n }\n };\n\n fetchProfilePicture();\n\n // Cleanup function to revoke blob URL when component unmounts or effect re-runs\n return () => {\n setProfilePictureBlobUrl((prevUrl) => {\n if (prevUrl) {\n URL.revokeObjectURL(prevUrl);\n }\n return null;\n });\n };\n }, []); // Only run once on mount - fetch when component loads\n\n React.useEffect(() => {\n const allData = getAllDataFromStorage();\n let userName = \"\";\n let userEmail = \"\";\n let userRole = \"\";\n let userAvatar: string | undefined;\n let userInitials: string | undefined;\n\n const buildNameFromFirstLast = (obj: Record<string, unknown> | null | undefined): string => {\n if (!obj || typeof obj !== \"object\") return \"\";\n const first = (obj.firstName ?? obj.given_name ?? obj.first_name) as string | undefined;\n const last = (obj.lastName ?? obj.family_name ?? obj.last_name) as string | undefined;\n return [first, last].filter(Boolean).join(\" \").trim();\n };\n\n const storedUser = getUserDataFromStorage();\n if (storedUser) {\n userName = storedUser.name || \"\";\n userEmail = userEmail || storedUser.email || \"\";\n userRole = userRole || storedUser.role || \"\";\n userAvatar = storedUser.avatar;\n userInitials = storedUser.initials;\n }\n\n if (allData.decodedToken) {\n const token = allData.decodedToken as Record<string, unknown>;\n userEmail = userEmail || (token.sub as string) || (token.email as string) || \"\";\n const tokenName = (token.name as string) || buildNameFromFirstLast(token);\n userName = userName || (tokenName || \"\");\n userRole = userRole || (token.role as string) || \"\";\n }\n\n if (allData.auth) {\n const auth = allData.auth as Record<string, unknown>;\n userEmail = userEmail || (auth.email as string) || (auth.sub as string) || \"\";\n userName = userName || (auth.name as string) || buildNameFromFirstLast(auth) || \"\";\n userRole = userRole || (auth.role as string) || (auth.activeRole as string) || \"\";\n userAvatar = userAvatar || (auth.avatar as string) || undefined;\n userInitials = userInitials || (auth.initials as string) || undefined;\n }\n\n if (allData.userDetails) {\n const userDetails = (allData.userDetails as Record<string, unknown>).user\n || (allData.userDetails as Record<string, unknown>).data\n || allData.userDetails;\n const details = userDetails as Record<string, unknown> | undefined;\n if (details) {\n userEmail = userEmail || (details.email as string) || (details.emailAddress as string) || \"\";\n userName = userName || (details.name as string) || (details.fullName as string) || buildNameFromFirstLast(details) || \"\";\n userRole = userRole || (details.role as string) || (details.userRole as string) || \"\";\n userAvatar = userAvatar || (details.avatar as string) || (details.profilePicture as string) || undefined;\n userInitials = userInitials || (details.initials as string) || undefined;\n }\n }\n\n if (allData.user) {\n const u = (allData.user as Record<string, unknown>).user\n || (allData.user as Record<string, unknown>).data\n || (allData.user as Record<string, unknown>).currentUser\n || allData.user;\n const userData = u as Record<string, unknown> | undefined;\n if (userData) {\n userEmail = userEmail || (userData.email as string) || (userData.emailAddress as string) || \"\";\n userName = userName || (userData.name as string) || (userData.fullName as string) || buildNameFromFirstLast(userData) || \"\";\n userRole = userRole || (userData.role as string) || (userData.userRole as string) || \"\";\n userAvatar = userAvatar || (userData.avatar as string) || (userData.profilePicture as string) || undefined;\n userInitials = userInitials || (userData.initials as string) || undefined;\n }\n }\n\n if (allData.profile) {\n const p = (allData.profile as Record<string, unknown>).user\n || (allData.profile as Record<string, unknown>).data\n || allData.profile;\n const profileData = p as Record<string, unknown> | undefined;\n if (profileData) {\n userEmail = userEmail || (profileData.email as string) || (profileData.emailAddress as string) || \"\";\n userName = userName || (profileData.name as string) || (profileData.fullName as string) || buildNameFromFirstLast(profileData) || \"\";\n userRole = userRole || (profileData.role as string) || (profileData.userRole as string) || \"\";\n userAvatar = userAvatar || (profileData.avatar as string) || (profileData.profilePicture as string) || undefined;\n userInitials = userInitials || (profileData.initials as string) || undefined;\n }\n }\n\n setUser({\n name: userName || \"\",\n email: userEmail || \"\",\n role: userRole || \"\",\n avatar: profilePictureBlobUrl || userAvatar,\n initials: userInitials,\n });\n \n // Update online status\n if (allData.auth?.isOnline !== undefined) {\n setIsOnlineStatus(allData.auth.isOnline);\n } else if (allData.userDetails?.isOnline !== undefined) {\n setIsOnlineStatus(allData.userDetails.isOnline);\n } else if (allData.user?.isOnline !== undefined) {\n setIsOnlineStatus(allData.user.isOnline);\n } else if (allData.profile?.isOnline !== undefined) {\n setIsOnlineStatus(allData.profile.isOnline);\n }\n \n const notifCount = getNotificationCountFromStorage();\n setNotificationCount(notifCount !== null && notifCount !== undefined ? notifCount : 0);\n \n const msgCount = getMessageCountFromStorage();\n setMessageCount(msgCount ?? undefined);\n\n // Initialize language from props if provided\n if (languageProp && languageProp !== currentLanguage) {\n setCurrentLanguage(languageProp as SupportedLanguage);\n setI18nLocaleToStorage(languageProp);\n }\n }, [languageProp, profilePictureBlobUrl]); // Also update when profile picture is fetched\n\n const finalRoutes = DEFAULT_ROUTES;\n \n // Get online status from localStorage dynamically\n const [isOnlineStatus, setIsOnlineStatus] = React.useState<boolean>(() => {\n const allData = getAllDataFromStorage();\n if (allData.auth?.isOnline !== undefined) {\n return allData.auth.isOnline;\n }\n if (allData.userDetails?.isOnline !== undefined) {\n return allData.userDetails.isOnline;\n }\n if (allData.user?.isOnline !== undefined) {\n return allData.user.isOnline;\n }\n if (allData.profile?.isOnline !== undefined) {\n return allData.profile.isOnline;\n }\n // Default to true if not specified (for backward compatibility)\n return true;\n });\n \n const notificationCountValue = notificationCount;\n \n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\n\n const OnlineBadge = styled(Badge)(({ theme }) => ({\n \"& .MuiBadge-badge\": {\n backgroundColor: \"#44b700\",\n color: \"#44b700\",\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n },\n }));\n\n const OfflineBadge = styled(Badge)(({ theme }) => ({\n \"& .MuiBadge-badge\": {\n backgroundColor: \"gray\",\n color: \"gray\",\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n },\n }));\n\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMobileMenuClose = () => {\n setMobileMoreAnchorEl(null);\n };\n\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setMobileMoreAnchorEl(event.currentTarget);\n };\n\n const open = Boolean(anchorEl);\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSettingsClick = () => {\n handleClose();\n const path = finalRoutes.settings.startsWith('/') \n ? finalRoutes.settings \n : `/${finalRoutes.settings}`;\n window.location.href = path;\n };\n\n const handleProfileClick = () => {\n handleClose();\n const path = finalRoutes.profile.startsWith('/') \n ? finalRoutes.profile \n : `/${finalRoutes.profile}`;\n window.location.href = path;\n };\n\n const handleSignOutClick = () => {\n handleClose();\n try {\n localStorage.clear();\n sessionStorage.clear();\n } catch (e) {\n console.warn(\"Clear storage on logout:\", e);\n }\n const path = finalRoutes.logout.startsWith('/') \n ? finalRoutes.logout \n : `/${finalRoutes.logout}`;\n window.location.href = path;\n };\n\n const menuId = \"primary-account-menu\";\n\n const getInitials = () => {\n if (user.initials) return user.initials;\n return user.name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n };\n\n // Check if user has permission to see settings (Account Owner, Account Admin, or Global Admin)\n const canViewSettings = React.useMemo(() => {\n const allData = getAllDataFromStorage();\n let userRole = \"\";\n \n // Get role from decoded token\n if (allData.decodedToken?.role) {\n userRole = allData.decodedToken.role;\n }\n // Get role from auth data\n else if (allData.auth?.role) {\n userRole = allData.auth.role;\n }\n // Get role from user data\n else if (user.role) {\n userRole = user.role;\n }\n // Get role from userDetails\n else if (allData.userDetails) {\n const userDetails = allData.userDetails.user || allData.userDetails.data || allData.userDetails;\n userRole = userDetails?.role || userDetails?.userRole || \"\";\n }\n // Get role from user\n else if (allData.user) {\n const userData = allData.user.user || allData.user.data || allData.user.currentUser || allData.user;\n userRole = userData?.role || userData?.userRole || \"\";\n }\n \n // Normalize role for comparison (case-insensitive, handle spaces/underscores/hyphens)\n const normalizedRole = userRole.toLowerCase().trim().replace(/[_\\s-]+/g, \" \");\n const allowedRoles = [\n \"account owner\",\n \"account admin\",\n \"global admin\"\n ];\n \n // Check for exact match or if role starts with allowed role\n // This handles variations like \"Account Owner\", \"ACCOUNT_OWNER\", \"Account-Owner\", \"Account Owner - Manager\"\n return allowedRoles.some(allowedRole => {\n return normalizedRole === allowedRole || normalizedRole.startsWith(allowedRole + \" \");\n });\n }, [user.role]);\n\n const profileList = (\n <List\n className=\"profile-menu-section\"\n sx={{\n width: \"100%\",\n maxWidth: 360,\n pointerEvents: \"none\",\n }}\n component=\"div\"\n aria-hidden=\"true\"\n tabIndex={-1}\n >\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\n <ListItemAvatar>\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <Avatar\n sx={{ bgcolor: deepOrange[500] }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <Avatar\n sx={{ bgcolor: deepOrange[500] }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OfflineBadge>\n )}\n </ListItemAvatar>\n <ListItemText\n primary={\n <Typography className=\"profile-name\" component=\"span\">\n {user.name || user.email}\n </Typography>\n }\n secondary={\n <React.Fragment>\n {user.name && user.email ? (\n <Typography className=\"profile-email\" component=\"p\">\n {user.email}\n </Typography>\n ) : null}\n <Typography className=\"profile-role\" component=\"p\">\n {t.role}: {user.role}\n </Typography>\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n );\n\n const renderMenu = (\n <Menu\n anchorEl={anchorEl}\n id=\"account-menu\"\n open={open}\n onClose={handleClose}\n onClick={handleClose}\n slotProps={{\n paper: {\n elevation: 0,\n sx: {\n overflow: \"visible\",\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\n mt: 1.5,\n \"& .MuiAvatar-root\": {\n width: 32,\n height: 32,\n ml: -0.5,\n mr: 1,\n },\n \"&::before\": {\n content: '\"\"',\n display: \"block\",\n position: \"absolute\",\n top: 0,\n right: 14,\n width: 10,\n height: 10,\n bgcolor: \"background.paper\",\n transform: \"translateY(-50%) rotate(45deg)\",\n zIndex: 0,\n },\n },\n },\n }}\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\n >\n {profileList}\n <Divider />\n <MenuItem onClick={handleProfileClick}>\n <ListItemIcon>\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.profile}\n </MenuItem>\n {canViewSettings && (\n <MenuItem onClick={handleSettingsClick}>\n <ListItemIcon>\n <SettingsOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.accountSettings}\n </MenuItem>\n )}\n <MenuItem onClick={handleSignOutClick}>\n <ListItemIcon>\n <LogoutOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.signOut}\n </MenuItem>\n </Menu>\n );\n\n const mobileMenuId = \"primary-account-menu-mobile\";\n const renderMobileMenu = (\n <Menu\n anchorEl={mobileMoreAnchorEl}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n id={mobileMenuId}\n keepMounted\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n open={isMobileMenuOpen}\n onClose={handleMobileMenuClose}\n >\n {messageCount !== undefined && (\n <MenuItem>\n <IconButton \n size=\"large\" \n aria-label={`show ${messageCount} new mails`}\n sx={{ color: '#1e2f97' }}\n >\n <Badge badgeContent={messageCount} color=\"error\">\n <MailIcon />\n </Badge>\n </IconButton>\n <p>{t.messages}</p>\n </MenuItem>\n )}\n {notificationCountValue > 0 && (\n <MenuItem>\n <IconButton\n size=\"large\"\n aria-label={`show ${notificationCountValue} new notifications`}\n sx={{ color: '#1e2f97' }}\n >\n <Badge badgeContent={notificationCount} color=\"error\">\n <NotificationsActiveOutlined />\n </Badge>\n </IconButton>\n <p>{t.notifications}</p>\n </MenuItem>\n )}\n <MenuItem onClick={handleProfileMenuOpen}>\n <IconButton\n size=\"large\"\n aria-label=\"account of current user\"\n aria-controls=\"primary-account-menu\"\n aria-haspopup=\"true\"\n sx={{ color: '#1e2f97' }}\n >\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <AccountCircle\n titleAccess={user.name}\n aria-label=\"User avatar\"\n />\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <AccountCircle\n titleAccess={user.name}\n aria-label=\"User avatar\"\n />\n </OfflineBadge>\n )}\n </IconButton>\n <p>{t.profile}</p>\n </MenuItem>\n </Menu>\n );\n\n return (\n <Box sx={{ flexGrow: 1 }} className=\"app-header\">\n <AppBar\n elevation={0}\n sx={{\n backgroundColor: \"#ffffff\",\n boxShadow: 'none !important',\n position: 'fixed',\n zIndex: 200,\n height: '65px',\n }}\n >\n <Toolbar sx={{ minHeight: '65px !important', height: '65px' }}>\n <IconButton\n size=\"large\"\n edge=\"start\"\n aria-label=\"open drawer\"\n sx={{ \n mr: '10px !important',\n color: '#1e2f97',\n padding: 0,\n paddingLeft: '14px',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n onClick={() => {\n toggleDrawer();\n }}\n >\n {isDrawerOpen ? (\n <MenuOpenIcon fontSize=\"large\" />\n ) : (\n <MenuIcon fontSize=\"large\" />\n )}\n </IconButton>\n <Box\n component=\"div\"\n sx={{ \n display: { xs: \"none\", sm: \"flex\" },\n alignItems: 'center',\n height: '65px',\n }}\n data-testid=\"impactomics-logo-wrapper\"\n >\n <img \n src={ImpactomicsLogo} \n alt=\"Impactomics\" \n style={{ height: '23px', width: 'auto', display: 'block' }}\n />\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n <Box sx={{ display: { xs: \"none\", md: \"flex\" }, alignItems: \"center\", gap: \"4px\" }}>\n <LanguageSelector\n currentLanguage={currentLanguage}\n onLanguageChange={(lang) => {\n setCurrentLanguage(lang);\n // The LanguageSelector component handles URL and localStorage updates\n }}\n />\n <IconButton\n size=\"large\"\n aria-label={notificationCountValue > 0 ? `show ${notificationCountValue} new notifications` : \"show notifications\"}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n <Badge badgeContent={notificationCountValue > 0 ? notificationCountValue : 0} color=\"error\">\n <NotificationsActiveOutlined />\n </Badge>\n </IconButton>\n <IconButton\n size=\"large\"\n edge=\"end\"\n aria-label=\"account of current user\"\n aria-controls={menuId}\n aria-haspopup=\"true\"\n onClick={handleProfileMenuOpen}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <Avatar\n sx={{\n bgcolor: deepOrange[500],\n width: 20,\n height: 20,\n p: 1,\n }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n sizes=\"large\"\n >\n {getInitials()}\n </Avatar>\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <Avatar\n sx={{\n bgcolor: deepOrange[500],\n width: 20,\n height: 20,\n p: 1,\n }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OfflineBadge>\n )}\n </IconButton>\n </Box>\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\n <IconButton\n size=\"large\"\n aria-label=\"show more\"\n aria-controls={mobileMenuId}\n aria-haspopup=\"true\"\n onClick={handleMobileMenuOpen}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n <MoreIcon />\n </IconButton>\n </Box>\n </Toolbar>\n </AppBar>\n {renderMobileMenu}\n {renderMenu}\n </Box>\n );\n};\n\nexport default AppHeader;\n\n"],"names":["_jsx","React","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/DrawerContext.tsx","../src/utils/localStorage.ts","../src/utils/translations.ts","../src/asset/Impactomics.svg","../src/asset/flags/gb.png","../src/asset/flags/es.png","../src/LanguageSelector.tsx","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","// --- IAM app user details (shared from IAM after verify-OTP, same origin) ---\r\n/** localStorage key used by IAM app for user details (GET /v1/userManagement/userDetails response). */\r\nexport const USER_DETAILS_STORAGE_KEY = \"linn-i-am-userDetails\";\r\n\r\n/** Stored value is the full API response from userDetails. */\r\nexport interface UserDetailsStoredResponse {\r\n status: \"SUCCESS\" | \"FAILURE\";\r\n statusinfo: {\r\n code: string;\r\n message: string;\r\n };\r\n data?: {\r\n usersDetails: UserDetailsItem[];\r\n };\r\n errors?: Record<string, string> | null;\r\n}\r\n\r\nexport interface UserDetailsItem {\r\n userId: number;\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n status: string;\r\n roles?: string[];\r\n lastLogin?: string;\r\n createdDate?: string;\r\n contactNumber?: { phoneType: string; phoneNumber: string }[];\r\n timeZone?: string;\r\n workInfo?: {\r\n jobTitle?: string;\r\n department?: string;\r\n supervisor?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Read user details from IAM app localStorage (set after verify-OTP on same origin).\r\n * Does not write or overwrite this key; IAM app is the source of truth.\r\n */\r\nexport function getStoredUserDetails(): UserDetailsItem | null {\r\n try {\r\n const raw = localStorage.getItem(USER_DETAILS_STORAGE_KEY);\r\n if (!raw) return null;\r\n\r\n const parsed = JSON.parse(raw) as UserDetailsStoredResponse;\r\n if (parsed.status !== \"SUCCESS\" || !parsed.data?.usersDetails?.length) {\r\n return null;\r\n }\r\n\r\n return parsed.data.usersDetails[0];\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// --- Header-owned persist store (unique key, no conflict with other apps) ---\r\n/** Unique localStorage key for this header package. Used only for access token; user details come from IAM (linn-i-am-userDetails). */\r\nexport const PERSIST_HEADER_KEY = \"persist:varminer-app-header\";\r\n\r\n/** Auth shape stored under PERSIST_HEADER_KEY. Host app should call setHeaderAuth after login so the header can make authenticated calls. */\r\nexport interface HeaderAuthState {\r\n accessToken?: string;\r\n refreshToken?: string;\r\n user_id?: number | string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Store auth (e.g. accessToken) in the header's own persist key. Call this after login so the header can use the token for profile picture etc.\r\n * User details are not stored here; they come from IAM (linn-i-am-userDetails).\r\n */\r\nexport function setHeaderAuth(auth: HeaderAuthState | null): void {\r\n try {\r\n const payload = auth ? { auth } : {};\r\n localStorage.setItem(PERSIST_HEADER_KEY, JSON.stringify(payload));\r\n } catch (err) {\r\n console.error(\"Error setting header auth:\", err);\r\n }\r\n}\r\n\r\n/**\r\n * User display data: from IAM only (linn-i-am-userDetails). No dependency on persist:userdb.\r\n */\r\nexport const getUserDataFromStorage = (): { name: string; email: string; role: string; avatar?: string; initials?: string } | null => {\r\n const iamUser = getStoredUserDetails();\r\n if (!iamUser) return null;\r\n const name = [iamUser.firstName, iamUser.lastName].filter(Boolean).join(\" \").trim();\r\n const role = iamUser.roles?.length ? iamUser.roles[0] : iamUser.workInfo?.jobTitle ?? \"\";\r\n return {\r\n name: name || \"\",\r\n email: iamUser.email || \"\",\r\n role: role || \"\",\r\n avatar: undefined,\r\n initials: name ? name.split(/\\s+/).map((s) => s[0]).join(\"\").slice(0, 2).toUpperCase() : undefined,\r\n };\r\n};\r\n\r\nexport const getNotificationCountFromStorage = (): number => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n if (parsedOuter.notifications) {\r\n const parsedNotifications = parseNested(parsedOuter.notifications);\r\n const count = parsedNotifications.count || parsedNotifications.unreadCount || parsedNotifications.total;\r\n if (typeof count === 'number') return count;\r\n }\r\n \r\n if (parsedOuter.app) {\r\n const parsedApp = parseNested(parsedOuter.app);\r\n if (parsedApp.notificationCount !== undefined) {\r\n return parsedApp.notificationCount;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing notification count from localStorage:\", err);\r\n }\r\n }\r\n return 0;\r\n};\r\n\r\nexport const getMessageCountFromStorage = (): number | undefined => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n if (parsedOuter.messages) {\r\n const parsedMessages = parseNested(parsedOuter.messages);\r\n const count = parsedMessages.count || parsedMessages.unreadCount || parsedMessages.total;\r\n if (typeof count === 'number') return count;\r\n }\r\n \r\n if (parsedOuter.app) {\r\n const parsedApp = parseNested(parsedOuter.app);\r\n if (parsedApp.messageCount !== undefined) {\r\n return parsedApp.messageCount;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing message count from localStorage:\", err);\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getI18nLocaleFromStorage = (): string | null => {\r\n try {\r\n return localStorage.getItem(\"lnc-i18n\");\r\n } catch (err) {\r\n console.error(\"Error getting i18n locale from localStorage:\", err);\r\n return null;\r\n }\r\n};\r\n\r\nexport const setI18nLocaleToStorage = (locale: string): void => {\r\n try {\r\n localStorage.setItem(\"lnc-i18n\", locale);\r\n } catch (err) {\r\n console.error(\"Error setting i18n locale to localStorage:\", err);\r\n }\r\n};\r\n\r\n/**\r\n * Decodes a JWT token and returns its payload\r\n * @param token - JWT token string\r\n * @returns Decoded payload object or null if decoding fails\r\n */\r\nconst decodeJWT = (token: string): any => {\r\n try {\r\n if (!token) return null;\r\n \r\n // JWT format: header.payload.signature\r\n const parts = token.split('.');\r\n if (parts.length !== 3) return null;\r\n \r\n // Decode the payload (second part)\r\n const payload = parts[1];\r\n \r\n // Base64 decode and parse JSON\r\n // Replace URL-safe base64 characters and add padding if needed\r\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\r\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\r\n \r\n const decoded = atob(padded);\r\n return JSON.parse(decoded);\r\n } catch (err) {\r\n console.error(\"Error decoding JWT token:\", err);\r\n return null;\r\n }\r\n};\r\n\r\nconst emptyStorageResult = () => ({\r\n auth: null,\r\n user: null,\r\n authDetails: null,\r\n userDetails: null,\r\n profile: null,\r\n notifications: null,\r\n messages: null,\r\n app: null,\r\n decodedToken: null,\r\n rawData: null,\r\n});\r\n\r\n/**\r\n * Get auth (and decoded token) for header use. Reads from header's own persist key first; falls back to persist:userdb only for access token.\r\n * User details are not read from userdb—use getStoredUserDetails / getUserDataFromStorage (IAM) for that.\r\n * @returns Object with auth, decodedToken, and other keys (user/userDetails/profile null when using header key)\r\n */\r\nexport const getAllDataFromStorage = () => {\r\n // Prefer header-owned persist key (unique, no conflict with other apps)\r\n const headerStr = localStorage.getItem(PERSIST_HEADER_KEY);\r\n if (headerStr) {\r\n try {\r\n const parsed = JSON.parse(headerStr) as { auth?: HeaderAuthState };\r\n const auth = parsed?.auth;\r\n const accessToken = auth?.accessToken;\r\n if (accessToken) {\r\n const decodedToken = decodeJWT(accessToken);\r\n return {\r\n ...emptyStorageResult(),\r\n auth: auth as Record<string, unknown>,\r\n decodedToken: decodedToken ? Object.fromEntries(Object.entries(decodedToken).map(([k, v]) => [k, v ?? null])) : null,\r\n rawData: parsed,\r\n };\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing header persist:\", err);\r\n }\r\n }\r\n\r\n // Fallback: read access token from persist:userdb (e.g. legacy or shared auth)\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (!userDbString) {\r\n return emptyStorageResult();\r\n }\r\n\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n // Helper function to parse nested JSON strings\r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n\r\n // Parse all top-level keys dynamically (no hardcoding)\r\n const parsedData: any = {};\r\n let authData: any = null;\r\n \r\n // Helper to recursively find auth data (contains accessToken or refreshToken)\r\n const findAuthData = (obj: any): any => {\r\n if (!obj || typeof obj !== 'object') return null;\r\n \r\n // Check if this object itself is auth data\r\n if (obj.accessToken || obj.refreshToken) {\r\n return obj;\r\n }\r\n \r\n // Recursively search in nested objects\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const nested = findAuthData(obj[key]);\r\n if (nested) return nested;\r\n }\r\n }\r\n \r\n return null;\r\n };\r\n \r\n // Parse all keys in parsedOuter dynamically\r\n Object.keys(parsedOuter).forEach((key) => {\r\n parsedData[key] = parseNested(parsedOuter[key]);\r\n \r\n // Dynamically find auth data in any structure\r\n const foundAuth = findAuthData(parsedData[key]);\r\n if (foundAuth && !authData) {\r\n authData = foundAuth;\r\n parsedData.auth = authData;\r\n }\r\n });\r\n\r\n // Get accessToken and decode it\r\n let decodedToken = null;\r\n const accessToken = authData?.accessToken || parsedData.auth?.accessToken || parsedData.authDetails?.accessToken;\r\n \r\n if (accessToken) {\r\n decodedToken = decodeJWT(accessToken);\r\n }\r\n\r\n // Extract all auth-related fields from authData dynamically (no hardcoding)\r\n const authFields = authData ? Object.keys(authData).reduce((acc: any, key) => {\r\n acc[key] = authData[key] !== undefined ? authData[key] : null;\r\n return acc;\r\n }, {}) : null;\r\n\r\n // Build return object dynamically with all parsed data\r\n const result: any = {\r\n ...Object.keys(parsedData).reduce((acc: any, key) => {\r\n acc[key] = parsedData[key] !== undefined ? parsedData[key] : null;\r\n return acc;\r\n }, {}),\r\n decodedToken: decodedToken ? Object.keys(decodedToken).reduce((acc: any, key) => {\r\n acc[key] = decodedToken[key] !== undefined ? decodedToken[key] : null;\r\n return acc;\r\n }, {}) : null,\r\n rawData: parsedOuter, // Include raw parsed data for any other fields\r\n };\r\n \r\n // Add auth field if we have authData\r\n if (authFields) {\r\n result.auth = authFields;\r\n }\r\n \r\n return result;\r\n } catch (err) {\r\n console.error(\"Error parsing all data from localStorage:\", err);\r\n return { ...emptyStorageResult(), error: err instanceof Error ? err.message : \"Unknown error\" };\r\n }\r\n};\r\n\r\n/**\r\n * Get profile picture URL from object store API using user_id.\r\n * @param baseUrl - Base URL for the object store API (default: http://objectstore.impact0mics.local:9012)\r\n * @returns Profile picture URL or null if user_id is not available\r\n */\r\nexport const getProfilePictureUrl = (baseUrl: string = \"http://objectstore.impact0mics.local:9012\"): string | null => {\r\n try {\r\n const allData = getAllDataFromStorage();\r\n const userId =\r\n allData.decodedToken?.user_id ?? allData.auth?.user_id ?? getStoredUserDetails()?.userId ?? null;\r\n if (userId == null) return null;\r\n return `${baseUrl.replace(/\\/$/, \"\")}/v1/objectStore/profilePicture/path/${userId}`;\r\n } catch (err) {\r\n console.error(\"Error getting profile picture URL:\", err);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Generate AWS S3 presigned URL for accessing S3 object\r\n * @param s3Url - Full S3 URL (e.g., https://bucket.s3.region.amazonaws.com/key)\r\n * @param accessKeyId - AWS Access Key ID\r\n * @param secretAccessKey - AWS Secret Access Key\r\n * @param region - AWS Region (default: ap-south-2)\r\n * @param expiresIn - Expiration time in seconds (default: 3600 = 1 hour)\r\n * @returns Presigned URL string\r\n */\r\nconst generateS3PresignedUrl = async (\r\n s3Url: string,\r\n accessKeyId: string,\r\n secretAccessKey: string,\r\n region: string = \"ap-south-2\",\r\n expiresIn: number = 3600\r\n): Promise<string> => {\r\n try {\r\n // Parse S3 URL to extract bucket, region, and key\r\n // Format: https://bucket.s3.region.amazonaws.com/key or https://bucket.s3-region.amazonaws.com/key\r\n const url = new URL(s3Url);\r\n const hostnameParts = url.hostname.split('.');\r\n let bucket = hostnameParts[0];\r\n let extractedRegion = region;\r\n \r\n // Try to extract region from hostname (format: bucket.s3.region.amazonaws.com)\r\n if (hostnameParts.length >= 3 && hostnameParts[1] === 's3') {\r\n extractedRegion = hostnameParts[2] || region;\r\n } else if (hostnameParts.length >= 2 && hostnameParts[1].startsWith('s3-')) {\r\n // Format: bucket.s3-region.amazonaws.com\r\n extractedRegion = hostnameParts[1].substring(3) || region;\r\n }\r\n \r\n const key = url.pathname.substring(1); // Remove leading slash\r\n \r\n // AWS credentials\r\n const awsAccessKeyId = accessKeyId;\r\n const awsSecretAccessKey = secretAccessKey;\r\n const awsRegion = extractedRegion;\r\n \r\n // Current timestamp\r\n const now = new Date();\r\n const dateStamp = now.toISOString().slice(0, 10).replace(/-/g, '');\r\n const amzDate = dateStamp + 'T' + now.toISOString().slice(11, 19).replace(/[:-]/g, '') + 'Z';\r\n \r\n // Step 1: Create canonical request\r\n const canonicalUri = '/' + encodeURIComponent(key).replace(/%2F/g, '/');\r\n const canonicalQuerystring = `X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=${encodeURIComponent(awsAccessKeyId + '/' + dateStamp + '/' + awsRegion + '/s3/aws4_request')}&X-Amz-Date=${amzDate}&X-Amz-Expires=${expiresIn}&X-Amz-SignedHeaders=host`;\r\n const canonicalHeaders = `host:${bucket}.s3.${awsRegion}.amazonaws.com\\n`;\r\n const signedHeaders = 'host';\r\n const payloadHash = 'UNSIGNED-PAYLOAD';\r\n \r\n const canonicalRequest = `GET\\n${canonicalUri}\\n${canonicalQuerystring}\\n${canonicalHeaders}\\n${signedHeaders}\\n${payloadHash}`;\r\n \r\n // Step 2: Create string to sign\r\n const algorithm = 'AWS4-HMAC-SHA256';\r\n const credentialScope = `${dateStamp}/${awsRegion}/s3/aws4_request`;\r\n const stringToSign = `${algorithm}\\n${amzDate}\\n${credentialScope}\\n${await sha256(canonicalRequest)}`;\r\n \r\n // Step 3: Calculate signature\r\n const kDate = await hmacSha256('AWS4' + awsSecretAccessKey, dateStamp);\r\n const kRegion = await hmacSha256(kDate as ArrayBuffer, awsRegion);\r\n const kService = await hmacSha256(kRegion as ArrayBuffer, 's3');\r\n const kSigning = await hmacSha256(kService as ArrayBuffer, 'aws4_request');\r\n const signature = await hmacSha256(kSigning as ArrayBuffer, stringToSign);\r\n \r\n // Convert signature to hex\r\n const signatureHex = arrayBufferToHex(signature);\r\n \r\n // Step 4: Construct presigned URL\r\n const presignedUrl = `https://${bucket}.s3.${awsRegion}.amazonaws.com${canonicalUri}?${canonicalQuerystring}&X-Amz-Signature=${signatureHex}`;\r\n \r\n return presignedUrl;\r\n } catch (err) {\r\n console.error(\"Error generating S3 presigned URL:\", err);\r\n throw err;\r\n }\r\n};\r\n\r\n// Helper function for SHA-256 hashing\r\nconst sha256 = async (message: string): Promise<string> => {\r\n const msgBuffer = new TextEncoder().encode(message);\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\r\n return Array.from(new Uint8Array(hashBuffer))\r\n .map(b => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n};\r\n\r\n// Helper function for HMAC-SHA256\r\nconst hmacSha256 = async (key: string | ArrayBuffer, message: string): Promise<ArrayBuffer> => {\r\n const encoder = new TextEncoder();\r\n let keyBuffer: Uint8Array;\r\n \r\n if (typeof key === 'string') {\r\n keyBuffer = encoder.encode(key);\r\n } else {\r\n keyBuffer = new Uint8Array(key);\r\n }\r\n \r\n const messageBuffer = encoder.encode(message);\r\n \r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n keyBuffer as any,\r\n { name: 'HMAC', hash: 'SHA-256' },\r\n false,\r\n ['sign']\r\n );\r\n \r\n return await crypto.subtle.sign('HMAC', cryptoKey, messageBuffer);\r\n};\r\n\r\n// Helper function to convert ArrayBuffer to hex string\r\nconst arrayBufferToHex = (buffer: ArrayBuffer): string => {\r\n return Array.from(new Uint8Array(buffer))\r\n .map(b => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n};\r\n\r\n/**\r\n * Fetch profile picture from API with headers, get S3 URL, generate presigned URL, and return as blob URL\r\n * This function:\r\n * 1. Fetches the profile picture path from the API\r\n * 2. Extracts the S3 filePath from the JSON response\r\n * 3. Generates a presigned URL for the S3 object\r\n * 4. Fetches the image using the presigned URL\r\n * 5. Converts it to a blob URL that can be used in img src\r\n * @param baseUrl - Base URL for the object store API (default: http://objectstore.impact0mics.local:9012)\r\n * @param messageId - Optional message ID for X-Message-Id header (default: generated UUID)\r\n * @param correlationId - Optional correlation ID for X-Correlation-Id header (default: generated UUID)\r\n * @param awsConfig - AWS configuration (accessKeyId, secretAccessKey, region, bucket)\r\n * @returns Promise that resolves to blob URL string or null if fetch fails\r\n */\r\nexport const fetchProfilePictureAsBlobUrl = async (\r\n baseUrl: string = \"http://objectstore.impact0mics.local:9012\",\r\n messageId?: string,\r\n correlationId?: string,\r\n awsConfig?: {\r\n accessKeyId: string;\r\n secretAccessKey: string;\r\n region?: string;\r\n bucket?: string;\r\n }\r\n): Promise<string | null> => {\r\n try {\r\n const profilePictureUrl = getProfilePictureUrl(baseUrl);\r\n \r\n if (!profilePictureUrl) {\r\n return null;\r\n }\r\n \r\n // AWS credentials (default values provided by user)\r\n const defaultAwsConfig = {\r\n accessKeyId: \"AKIAVRUVTJGLBCYZEI5L\",\r\n secretAccessKey: \"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\",\r\n region: \"ap-south-2\",\r\n bucket: \"development-varminer-test\"\r\n };\r\n \r\n const finalAwsConfig = awsConfig || defaultAwsConfig;\r\n \r\n // Generate message ID and correlation ID if not provided\r\n const msgId = messageId || `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const corrId = correlationId || `corr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n const allData = getAllDataFromStorage();\r\n const accessToken = (allData.auth as Record<string, unknown> | null)?.accessToken as string | undefined;\r\n const headers: Record<string, string> = {\r\n 'X-Message-Id': msgId,\r\n 'X-Correlation-Id': corrId,\r\n };\r\n if (accessToken) {\r\n headers['Authorization'] = `Bearer ${accessToken}`;\r\n }\r\n\r\n // Step 1: Fetch the profile picture path from API (returns JSON with filePath)\r\n const apiResponse = await fetch(profilePictureUrl, {\r\n method: 'GET',\r\n headers,\r\n });\r\n \r\n // Check if the API response is successful\r\n if (!apiResponse.ok) {\r\n console.warn(`Failed to fetch profile picture path: ${apiResponse.status} ${apiResponse.statusText}`);\r\n return null;\r\n }\r\n \r\n // Parse JSON response\r\n const apiData = await apiResponse.json();\r\n \r\n // Extract filePath from response\r\n const s3Url = apiData?.filePath;\r\n if (!s3Url || typeof s3Url !== 'string') {\r\n console.warn('Profile picture API response does not contain valid filePath');\r\n return null;\r\n }\r\n \r\n // Step 2: Generate presigned URL for S3 object\r\n const presignedUrl = await generateS3PresignedUrl(\r\n s3Url,\r\n finalAwsConfig.accessKeyId,\r\n finalAwsConfig.secretAccessKey,\r\n finalAwsConfig.region\r\n );\r\n \r\n // Step 3: Fetch the image using presigned URL\r\n const imageResponse = await fetch(presignedUrl, {\r\n method: 'GET',\r\n });\r\n \r\n // Check if the image response is successful\r\n if (!imageResponse.ok) {\r\n console.warn(`Failed to fetch profile picture image: ${imageResponse.status} ${imageResponse.statusText}`);\r\n return null;\r\n }\r\n \r\n // Check if the response is an image\r\n const contentType = imageResponse.headers.get('content-type');\r\n if (!contentType || !contentType.startsWith('image/')) {\r\n console.warn(`Profile picture response is not an image: ${contentType}`);\r\n return null;\r\n }\r\n \r\n // Step 4: Convert response to blob\r\n const blob = await imageResponse.blob();\r\n \r\n // Step 5: Create blob URL\r\n const blobUrl = URL.createObjectURL(blob);\r\n \r\n return blobUrl;\r\n } catch (err) {\r\n console.error(\"Error fetching profile picture:\", err);\r\n return null;\r\n }\r\n};\r\n\r\n","export type SupportedLanguage = 'en' | 'es';\r\n\r\nexport interface Translations {\r\n accountSettings: string;\r\n profile: string;\r\n signOut: string;\r\n messages: string;\r\n notifications: string;\r\n online: string;\r\n offline: string;\r\n role: string;\r\n}\r\n\r\nexport const translations: Record<SupportedLanguage, Translations> = {\r\n en: {\r\n accountSettings: 'Account Settings',\r\n profile: 'Profile',\r\n signOut: 'Sign out',\r\n messages: 'Messages',\r\n notifications: 'Notifications',\r\n online: 'Online',\r\n offline: 'Offline',\r\n role: 'Role',\r\n },\r\n es: {\r\n accountSettings: 'Configuración de cuenta',\r\n profile: 'Perfil',\r\n signOut: 'Cerrar sesión',\r\n messages: 'Mensajes',\r\n notifications: 'Notificaciones',\r\n online: 'En línea',\r\n offline: 'Desconectado',\r\n role: 'Rol',\r\n },\r\n};\r\n\r\nexport const getTranslations = (language: SupportedLanguage = 'en'): Translations => {\r\n return translations[language] || translations.en;\r\n};\r\n\r\n","export default \"data:image/svg+xml,%3Csvg%20width%3D%22134%22%20height%3D%2223%22%20viewBox%3D%220%200%20134%2023%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M0%2016.9641V0H2.29277V16.9641H0Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M19.7586%204.39182C20.6034%204.36006%2021.361%204.53721%2022.0278%204.92659C22.3033%205.0887%2022.5771%205.30261%2022.8458%205.57C23.1146%205.83738%2023.3531%206.17663%2023.5647%206.58941C23.7764%207.00219%2023.946%207.49519%2024.077%208.07007C24.2064%208.64495%2024.2719%209.32011%2024.2719%2010.0972V16.9891H22.0765V10.6788C22.0765%209.95014%2021.9909%209.3151%2021.8195%208.77364C21.6482%208.23217%2021.4214%207.77929%2021.1359%207.41497C20.8504%207.05065%2020.5262%206.77992%2020.16%206.60111C19.7938%206.42396%2019.4243%206.33372%2019.0497%206.33372C18.6752%206.33372%2018.2821%206.42229%2017.9159%206.60111C17.5498%206.77992%2017.2205%207.05065%2016.9283%207.41497C16.636%207.77929%2016.3992%208.23217%2016.2211%208.77364C16.0414%209.31677%2015.9524%209.95014%2015.9524%2010.6788V16.9891H13.757V10.6788C13.757%209.95014%2013.6714%209.3151%2013.5017%208.77364C13.3304%208.23217%2013.1036%207.77929%2012.8181%207.41497C12.5342%207.05065%2012.2084%206.77992%2011.8422%206.60111C11.476%206.42396%2011.1065%206.33372%2010.7319%206.33372C10.3573%206.33372%209.9643%206.42229%209.59813%206.60111C9.23196%206.77992%208.90274%207.05065%208.61047%207.41497C8.3182%207.77929%208.08137%208.23217%207.90332%208.77364C7.72359%209.31677%207.63457%209.95014%207.63457%2010.6788V16.9891H5.3418V4.58734H7.63457V6.74817C7.97555%206.13318%208.36692%205.66859%208.80531%205.35274C9.24371%205.03689%209.6586%204.80627%2010.05%204.66088C10.5052%204.49877%2010.9688%204.4102%2011.4407%204.39349C12.027%204.36174%2012.588%204.45031%2013.1238%204.66088C13.5958%204.83969%2014.0627%205.13883%2014.5263%205.5583C14.9899%205.97943%2015.3511%206.62618%2015.6114%207.5002C15.9205%206.69135%2016.3102%206.07636%2016.7821%205.65522C17.2541%205.23409%2017.7093%204.92659%2018.1477%204.73274C18.6684%204.52217%2019.2043%204.40853%2019.7586%204.39349V4.39182Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M32.9558%204.39185C34.0291%204.44031%2034.9882%204.69934%2035.8348%205.16894C36.1926%205.3628%2036.5453%205.61013%2036.8964%205.90927C37.2457%206.20841%2037.5548%206.58108%2037.8236%207.02561C38.0923%207.47015%2038.3073%207.99323%2038.4702%208.59151C38.6332%209.18979%2038.7138%209.88666%2038.7138%2010.6788V10.8727C38.7138%2011.6665%2038.6315%2012.365%2038.4702%2012.9717C38.3073%2013.5783%2038.0923%2014.1047%2037.8236%2014.5492C37.5548%2014.9938%2037.2457%2015.3664%2036.8964%2015.6656C36.547%2015.9647%2036.1926%2016.2121%2035.8348%2016.4059C34.9882%2016.8588%2034.0291%2017.1095%2032.9558%2017.1579C32.5174%2017.1412%2032.0773%2017.061%2031.6389%2016.9156C31.2644%2016.7869%2030.8663%2016.5797%2030.443%2016.2973C30.0197%2016.0149%2029.63%2015.6138%2029.2723%2015.0957V22.8132H26.9795V4.5857H29.2723V6.47914C29.63%205.94604%2030.0197%205.5366%2030.443%205.25417C30.8663%204.97174%2031.2644%204.76452%2031.6389%204.63584C32.0773%204.49044%2032.5174%204.41023%2032.9558%204.39352V4.39185ZM36.4932%2010.6788C36.4932%209.95017%2036.3908%209.31512%2036.1875%208.77366C35.9843%208.2322%2035.7155%207.77931%2035.383%207.415C35.0487%207.05068%2034.6674%206.77995%2034.2357%206.60114C33.8041%206.42399%2033.3606%206.33375%2032.9071%206.33375C32.4536%206.33375%2032.0085%206.42232%2031.5768%206.60114C31.1451%206.77995%2030.7588%207.05068%2030.4178%207.415C30.0768%207.77931%2029.7997%208.2322%2029.588%208.77366C29.3764%209.3168%2029.2706%209.95017%2029.2706%2010.6788V10.8727C29.2706%2011.6013%2029.3764%2012.2363%2029.588%2012.7778C29.7997%2013.3209%2030.0752%2013.7738%2030.4178%2014.1365C30.7588%2014.5008%2031.1451%2014.7715%2031.5768%2014.9503C32.0068%2015.1291%2032.4502%2015.2177%2032.9071%2015.2177C33.364%2015.2177%2033.8057%2015.1291%2034.2357%2014.9503C34.6657%2014.7732%2035.0487%2014.5008%2035.383%2014.1365C35.7155%2013.7721%2035.9843%2013.3193%2036.1875%2012.7778C36.3908%2012.2363%2036.4932%2011.6013%2036.4932%2010.8727V10.6788Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M41.0529%205.99458C41.3301%205.8659%2041.6795%205.70714%2042.1011%205.52164C42.5243%205.33614%2042.9913%205.16234%2043.5036%205.00023C44.0159%204.83813%2044.5568%204.70109%2045.1262%204.58745C45.6956%204.47381%2046.2482%204.41699%2046.7857%204.41699C47.3232%204.41699%2047.8338%204.48551%2048.3226%204.62255C48.8097%204.75958%2049.238%204.99856%2049.6025%205.33781C49.9687%205.67706%2050.2576%206.13162%2050.4693%206.69647C50.6809%207.263%2050.7867%207.97492%2050.7867%208.83223V16.9876H48.6149V14.8769C48.4839%2015.2161%2048.2689%2015.5286%2047.9682%2015.8111C47.6675%2016.0935%2047.3215%2016.3375%2046.9318%2016.5397C46.5422%2016.7419%2046.1138%2016.8956%2045.6502%2017.0009C45.1866%2017.1062%2044.7197%2017.158%2044.2477%2017.158C43.7757%2017.158%2043.292%2017.0928%2042.8452%2016.9642C42.3984%2016.8355%2042.0003%2016.6333%2041.6492%2016.3575C41.2998%2016.0835%2041.0193%2015.7308%2040.8077%2015.3013C40.5961%2014.8735%2040.4902%2014.3505%2040.4902%2013.7355C40.4902%2012.9266%2040.6851%2012.223%2041.0764%2011.6248C41.4661%2011.0265%2042.0154%2010.5201%2042.7225%2010.1073C43.4297%209.69456%2044.2847%209.38372%2045.2841%209.17315C46.2835%208.96258%2047.3937%208.8573%2048.6132%208.8573V8.83223C48.6132%208.36263%2048.5561%207.96991%2048.4419%207.65573C48.3277%207.33987%2048.1647%207.08586%2047.9548%206.892C47.7431%206.69814%2047.5029%206.56111%2047.2359%206.47922C46.9671%206.39901%2046.6715%206.35722%2046.3456%206.35722C45.9072%206.35722%2045.4504%206.41739%2044.98%206.53938C44.508%206.66138%2044.0646%206.80176%2043.6497%206.96386C43.2348%207.12596%2042.8653%207.28306%2042.5395%207.4368C42.2136%207.59055%2041.9784%207.69918%2041.8323%207.76435L41.0512%205.99291L41.0529%205.99458ZM48.6149%2010.7507C48.0287%2010.7507%2047.3904%2010.7875%2046.7%2010.8594C46.008%2010.9329%2045.363%2011.0733%2044.76%2011.2838C44.1587%2011.4944%2043.6581%2011.7936%2043.26%2012.1813C42.862%2012.569%2042.6621%2013.0787%2042.6621%2013.7104C42.6621%2014.2769%2042.8821%2014.7014%2043.3205%2014.9855C43.7589%2015.2679%2044.2796%2015.41%2044.8826%2015.41C45.3059%2015.41%2045.7359%2015.3381%2046.176%2015.191C46.6144%2015.0457%2047.0175%2014.8234%2047.3837%2014.5243C47.7498%2014.2251%2048.0455%2013.8524%2048.2739%2013.4079C48.5007%2012.9634%2048.6149%2012.442%2048.6149%2011.842V10.7507Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M55.1523%2010.7991C55.1523%2011.5595%2055.2665%2012.228%2055.4933%2012.8012C55.72%2013.3761%2056.0207%2013.8523%2056.3953%2014.2334C56.7698%2014.6144%2057.1998%2014.9002%2057.6886%2015.0957C58.1757%2015.2895%2058.6796%2015.3865%2059.2004%2015.3865C59.8185%2015.3865%2060.44%2015.2528%2061.0665%2014.9854C61.693%2014.718%2062.2574%2014.3019%2062.7613%2013.7354L63.9085%2014.9971C63.3391%2015.7257%2062.6286%2016.2722%2061.7736%2016.6348C60.9204%2016.9992%2060.0301%2017.1813%2059.1029%2017.1813C58.3387%2017.1813%2057.5912%2017.051%2056.8589%2016.7936C56.1265%2016.5346%2055.4714%2016.1469%2054.8953%2015.6288C54.3175%2015.1107%2053.8539%2014.4473%2053.5045%2013.6384C53.1552%2012.8296%2052.9805%2011.8837%2052.9805%2010.7991C52.9805%209.71451%2053.1552%208.74857%2053.5045%207.94808C53.8539%207.14759%2054.3175%206.48413%2054.8953%205.95771C55.4731%205.43129%2056.1265%205.04024%2056.8589%204.78121C57.5912%204.52218%2058.3387%204.39349%2059.1029%204.39349C60.0301%204.39349%2060.9204%204.57565%2061.7736%204.93997C62.6269%205.30428%2063.3391%205.85076%2063.9085%206.57772L62.7613%207.83946C62.2574%207.27293%2061.6913%206.8568%2061.0665%206.58942C60.44%206.32203%2059.8185%206.18834%2059.2004%206.18834C58.6796%206.18834%2058.1757%206.28526%2057.6886%206.47912C57.2015%206.67298%2056.7698%206.96376%2056.3953%207.35314C56.0207%207.74086%2055.72%208.22383%2055.4933%208.79704C55.2648%209.37192%2055.1523%2010.0387%2055.1523%2010.7991Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M71.9846%2015.2662L72.1559%2016.8672C71.6352%2016.949%2071.1632%2017.0126%2070.7416%2017.061C70.3184%2017.1095%2069.9438%2017.1345%2069.6196%2017.1345C69.067%2017.1345%2068.6152%2017.066%2068.2658%2016.929C67.9164%2016.792%2067.6443%2016.5814%2067.4495%2016.2973C67.2546%2016.0149%2067.1202%2015.6505%2067.0463%2015.2043C66.9724%2014.7598%2066.9288%2014.2217%2066.912%2013.59V6.35715H64.9854V4.5857H66.912V2.6438H69.2047V4.5857H72.1324V6.35715H69.2047V13.59C69.2047%2013.9459%2069.2165%2014.2334%2069.2417%2014.4523C69.2669%2014.6712%2069.3677%2014.84%2069.5474%2014.962C69.7254%2015.084%2070.0059%2015.1642%2070.3889%2015.2043C70.7702%2015.2444%2071.3043%2015.2645%2071.9863%2015.2645L71.9846%2015.2662Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M100.591%204.39163C101.435%204.35988%20102.193%204.53703%20102.86%204.92641C103.135%205.08851%20103.409%205.30242%20103.678%205.56981C103.947%205.8372%20104.185%206.17645%20104.397%206.58923C104.608%207.00201%20104.778%207.495%20104.909%208.06989C105.038%208.64477%20105.104%209.31993%20105.104%2010.097V16.9889H102.909V10.6786C102.909%209.94996%20102.823%209.31491%20102.652%208.77345C102.48%208.23199%20102.253%207.7791%20101.968%207.41479C101.682%207.05047%20101.358%206.77974%20100.992%206.60093C100.626%206.42378%20100.256%206.33354%2099.8818%206.33354C99.5072%206.33354%2099.1142%206.42211%2098.748%206.60093C98.3818%206.77974%2098.0526%207.05047%2097.7603%207.41479C97.4681%207.7791%2097.2312%208.23199%2097.0532%208.77345C96.8734%209.31658%2096.7844%209.94996%2096.7844%2010.6786V16.9889H94.5891V10.6786C94.5891%209.94996%2094.5034%209.31491%2094.3338%208.77345C94.1624%208.23199%2093.9357%207.7791%2093.6501%207.41479C93.3663%207.05047%2093.0404%206.77974%2092.6742%206.60093C92.308%206.42378%2091.9385%206.33354%2091.564%206.33354C91.1894%206.33354%2090.7963%206.42211%2090.4302%206.60093C90.064%206.77974%2089.7348%207.05047%2089.4425%207.41479C89.1502%207.7791%2088.9134%208.23199%2088.7354%208.77345C88.5556%209.31658%2088.4666%209.94996%2088.4666%2010.6786V16.9889H86.1738V4.58716H88.4666V6.74799C88.8076%206.133%2089.199%205.66841%2089.6374%205.35256C90.0758%205.03671%2090.4906%204.80609%2090.882%204.66069C91.3372%204.49859%2091.8008%204.41002%2092.2728%204.3933C92.859%204.36155%2093.42%204.45013%2093.9558%204.66069C94.4278%204.83951%2094.8948%205.13865%2095.3584%205.55811C95.822%205.97925%2096.1831%206.62599%2096.4434%207.50002C96.7525%206.69117%2097.1422%206.07618%2097.6142%205.65504C98.0862%205.23391%2098.5414%204.92641%2098.9798%204.73255C99.5005%204.52199%20100.036%204.40834%20100.591%204.3933V4.39163Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M108.933%203.34883C108.559%203.34883%20108.241%203.22015%20107.982%202.96112C107.722%202.70209%20107.593%202.38624%20107.593%202.01524C107.593%201.64424%20107.722%201.32838%20107.982%201.06935C108.243%200.810321%20108.56%200.681641%20108.933%200.681641C109.306%200.681641%20109.629%200.811992%20109.897%201.06935C110.166%201.32838%20110.3%201.64424%20110.3%202.01524C110.3%202.38624%20110.166%202.70376%20109.897%202.96112C109.629%203.22015%20109.308%203.34883%20108.933%203.34883ZM107.786%2016.989V4.58717H110.104V16.989H107.786Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M114.569%2010.7989C114.569%2011.5593%20114.684%2012.2278%20114.91%2012.801C115.137%2013.3759%20115.438%2013.8522%20115.812%2014.2332C116.187%2014.6142%20116.617%2014.9%20117.106%2015.0955C117.593%2015.2894%20118.097%2015.3863%20118.617%2015.3863C119.235%2015.3863%20119.857%2015.2526%20120.483%2014.9852C121.11%2014.7178%20121.674%2014.3017%20122.178%2013.7352L123.326%2014.9969C122.756%2015.7255%20122.046%2016.272%20121.191%2016.6347C120.337%2016.999%20119.447%2017.1811%20118.52%2017.1811C117.756%2017.1811%20117.008%2017.0508%20116.276%2016.7934C115.544%2016.5344%20114.888%2016.1467%20114.312%2015.6286C113.734%2015.1106%20113.271%2014.4471%20112.922%2013.6382C112.572%2012.8294%20112.397%2011.8835%20112.397%2010.7989C112.397%209.71433%20112.572%208.74839%20112.922%207.9479C113.271%207.14741%20113.734%206.48395%20114.312%205.95753C114.89%205.43111%20115.544%205.04006%20116.276%204.78102C117.008%204.52199%20117.756%204.39331%20118.52%204.39331C119.447%204.39331%20120.337%204.57547%20121.191%204.93979C122.044%205.3041%20122.756%205.85058%20123.326%206.57754L122.178%207.83927C121.674%207.27274%20121.108%206.85662%20120.483%206.58923C119.857%206.32185%20119.235%206.18815%20118.617%206.18815C118.097%206.18815%20117.593%206.28508%20117.106%206.47894C116.619%206.67279%20116.187%206.96358%20115.812%207.35296C115.438%207.74067%20115.137%208.22364%20114.91%208.79685C114.682%209.37174%20114.569%2010.0385%20114.569%2010.7989Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M127.764%207.62027C127.764%207.94447%20127.914%208.21855%20128.216%208.44583C128.517%208.67311%20128.895%208.89036%20129.35%209.10093C129.805%209.31149%20130.3%209.53376%20130.838%209.76773C131.374%2010.0017%20131.871%2010.2858%20132.326%2010.6167C132.781%2010.9492%20133.159%2011.3537%20133.46%2011.83C133.761%2012.3079%20133.912%2012.8861%20133.912%2013.5646C133.912%2014.1796%20133.789%2014.7177%20133.546%2015.179C133.302%2015.6402%20132.98%2016.0213%20132.581%2016.3204C132.183%2016.6195%20131.72%2016.8468%20131.191%2017.0006C130.662%2017.1543%20130.114%2017.2312%20129.545%2017.2312C128.586%2017.2312%20127.653%2017.0206%20126.751%2016.5995C125.849%2016.1783%20125.146%2015.54%20124.642%2014.6826L125.958%2013.202C126.414%2013.9306%20126.943%2014.4604%20127.544%2014.7913C128.145%2015.1238%20128.732%2015.2893%20129.301%2015.2893C129.87%2015.2893%20130.358%2015.1355%20130.764%2014.828C131.171%2014.5205%20131.374%2014.0994%20131.374%2013.5663C131.374%2013.0967%20131.223%2012.7257%20130.922%2012.45C130.621%2012.1742%20130.252%2011.9369%20129.812%2011.7347C129.373%2011.5325%20128.888%2011.3386%20128.36%2011.1515C127.831%2010.966%20127.348%2010.7303%20126.909%2010.4479C126.471%2010.1655%20126.1%209.80115%20125.799%209.35495C125.498%208.91041%20125.347%208.32383%20125.347%207.5952C125.347%207.06042%20125.456%206.5925%20125.676%206.18807C125.896%205.78365%20126.189%205.44774%20126.555%205.18035C126.921%204.91297%20127.339%204.71075%20127.811%204.57372C128.283%204.43668%20128.77%204.36816%20129.274%204.36816C130.007%204.36816%20130.717%204.50186%20131.409%204.76924C132.099%205.03663%20132.665%205.4444%20133.104%205.99422L131.811%207.32948C131.404%206.8766%20130.989%206.5457%20130.566%206.33514C130.143%206.12457%20129.744%206.01928%20129.37%206.01928C128.898%206.01928%20128.512%206.16133%20128.211%206.44376C127.91%206.72786%20127.759%207.11891%20127.759%207.62027H127.764Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M82.2257%2016.5045C82.7489%2016.5045%2083.173%2016.0825%2083.173%2015.5619C83.173%2015.0414%2082.7489%2014.6194%2082.2257%2014.6194C81.7025%2014.6194%2081.2783%2015.0414%2081.2783%2015.5619C81.2783%2016.0825%2081.7025%2016.5045%2082.2257%2016.5045Z%22%20fill%3D%22%235BC0BE%22%2F%3E%3Cpath%20d%3D%22M83.3365%207.03215C82.799%206.22831%2082.4748%205.97596%2082.4379%205.94421C82.4076%205.97763%2081.86%206.56923%2081.3964%207.65716C81.64%207.98304%2081.7509%208.27215%2081.9071%208.71502C82.1019%209.2665%2082.201%209.91325%2082.201%2010.6402C82.201%2011.414%2082.0986%2012.0975%2081.8953%2012.6724C81.6904%2013.2489%2081.4216%2013.7336%2081.0958%2014.1146C80.7682%2014.4973%2080.3886%2014.7914%2079.9704%2014.9869C79.1322%2015.3797%2078.2067%2015.3797%2077.3686%2014.9869C76.9503%2014.7914%2076.5673%2014.4973%2076.2331%2014.1146C75.8971%2013.7319%2075.6284%2013.2472%2075.4336%2012.6707C75.2387%2012.0975%2075.1396%2011.4223%2075.1396%2010.6636C75.1396%209.90489%2075.2421%209.28823%2075.447%208.73841C75.6502%208.18692%2075.919%207.72234%2076.2465%207.35635C76.5741%206.98869%2076.957%206.70794%2077.3837%206.52077C77.8086%206.33359%2078.2554%206.24001%2078.7022%206.24001C79.149%206.24001%2079.5757%206.32858%2079.9922%206.5074C80.2492%206.61769%2080.3668%206.70125%2080.5919%206.88341C80.9396%206.36702%2081.2016%205.79715%2081.3696%205.18048C81.3528%205.17046%2081.336%205.16043%2081.3175%205.1504C80.5146%204.71088%2079.71%204.53207%2078.6888%204.48193H78.6703H78.6518C77.6306%204.53207%2076.7051%204.7794%2075.9022%205.21725C75.5528%205.40776%2075.2118%205.65008%2074.8877%205.94087C74.5652%206.23165%2074.2679%206.59764%2074.0075%207.03047C73.7455%207.46331%2073.5338%207.98304%2073.3743%208.57464C73.2164%209.16623%2073.1357%209.85977%2073.1357%2010.6369C73.1357%2011.414%2073.2164%2012.1359%2073.3743%2012.7342C73.5322%2013.3341%2073.7455%2013.8622%2074.0075%2014.3034C74.2695%2014.7446%2074.5652%2015.124%2074.8893%2015.4298C75.2135%2015.7373%2075.5562%2015.998%2075.9089%2016.2052C76.7051%2016.6548%2077.6256%2016.9171%2078.6451%2016.984H78.6703H78.6955C79.6748%2016.9205%2080.5633%2016.6731%2081.3444%2016.2503C81.0303%2015.8091%2081.0706%2015.1942%2081.467%2014.7998C81.897%2014.3719%2082.584%2014.3602%2083.0291%2014.7597C83.1332%2014.6159%2083.2357%2014.4655%2083.3314%2014.3034C83.5918%2013.8639%2083.8051%2013.3358%2083.9647%2012.7342C84.1226%2012.1326%2084.2032%2011.4273%2084.2032%2010.6369C84.2032%209.8464%2084.1226%209.16958%2083.963%208.57464C83.8034%207.98137%2083.5901%207.46164%2083.3298%207.03047L83.3365%207.03215Z%22%20fill%3D%22black%22%2F%3E%3Cpath%20d%3D%22M77.0141%209.74781C75.4268%2011.7031%2077.7582%2014.2817%2079.7788%2013.2322C81.5173%2012.3298%2080.7883%2010.9343%2080.8152%209.58237C80.8387%208.37076%2081.4955%206.88175%2082.2547%205.94923C83.0626%204.95488%2085.1303%204.66243%2084.7238%202.9712C84.4165%201.6961%2082.6864%201.39529%2081.9104%202.3913C81.3594%203.09654%2081.7542%203.96722%2081.603%204.77607C81.3443%206.17651%2080.6153%207.36639%2079.5135%208.25545C78.7777%208.84872%2077.5365%209.10608%2077.0141%209.74781Z%22%20fill%3D%22%235BC0BE%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAMAAADImI+JAAAANlBMVEX////w8vfyxcx8jbJCWpAOLHFVa5sBIWnIEC7WTGLnv8qAkLTheYpecqHx0digrMfz3+T21dqBS5WQAAAApUlEQVQoz8WTyxpFMAyEpyqOuhTv/7IntImmurAzC59kfsIIhA5wnn6iASMLgzbIT2Fk6joUaAUKBsiJm+kJ0iyuR1mQBam8Cex1dINkZ6EesSZwrR8JfdYWl7AcbCRw5ypytYmPpy6w3X6jL8HXL6PxOODgTPYEcnXmFe94cuBsdJzwpIFrRwK3WPkJLQqL2aUoUVisXjOvLizWWNyMVljrV0gz/wdhEi0lRIbcAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAbCAMAAAA5zj1cAAAApVBMVEX6vQCtFRnBPxP3tgCkSRTxsQC9miCtkjL3ugDcdwrVkwndpwauUEi3k3ecLQyvGx01YomtXy3Zhha+gw+4LiCzn4jKeBKyYgjmoAOkXUK/RhC1kJmmKh+0oKCbYwN5OAWWHxSVi0HypQNcdGsDAgC9g1j6vgSWhnLfsSXCn169cE24eBuaNwzQaiOYagW8bxWIOhqoKhPLdq4yUHR+UgVZLWaBHkAs3esWAAAAk0lEQVQ4y+WTVxLDIAxESQwBAwb33tKc3sv9j5YbWJp8JvurNzsrzYpMkCI/BU6RIt9phqIcJSOpEGBu7c2WA+iXOWmbtTmTACh42PdelSgwp+d2nXdvTjuAc3X5vL6qJo4XQEZ9qd8PXaR7yDE5GFOf6XbNRrmB8cgcKaUraJm5z4NiE4RLH3FyIUaG6Pb85XN9AIg9CvrV7UGSAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport {\n Button,\n Menu,\n MenuItem,\n ListItemIcon,\n ListItemText,\n Box,\n} from \"@mui/material\";\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\nimport { SupportedLanguage } from \"./utils/translations\";\nimport { setI18nLocaleToStorage } from \"./utils/localStorage\";\nimport GBFlag from \"./asset/flags/gb.png\";\nimport ESFlag from \"./asset/flags/es.png\";\n\ninterface LanguageOption {\n code: SupportedLanguage;\n name: string;\n flag: string;\n}\n\nconst languages: LanguageOption[] = [\n { code: \"en\", name: \"English\", flag: GBFlag },\n { code: \"es\", name: \"Spanish\", flag: ESFlag },\n];\n\ninterface LanguageSelectorProps {\n currentLanguage: SupportedLanguage;\n onLanguageChange: (language: SupportedLanguage) => void;\n}\n\nconst LanguageSelector: React.FC<LanguageSelectorProps> = ({\n currentLanguage,\n onLanguageChange: _onLanguageChange, // reserved for parent callback; we reload the page on select\n}) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n const currentLang = languages.find((lang) => lang.code === currentLanguage) || languages[0];\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleLanguageSelect = (languageCode: SupportedLanguage) => {\n // Update localStorage\n setI18nLocaleToStorage(languageCode);\n \n // Get current path\n const currentPath = window.location.pathname;\n const search = window.location.search;\n const hash = window.location.hash;\n \n // Find and replace existing locale /:locale/ with new locale\n const newPath = currentPath.replace(/\\/(en|es)\\//, `/${languageCode}/`);\n \n // Construct full URL and reload the page to apply translations\n const fullUrl = newPath + search + hash;\n window.location.href = fullUrl;\n \n handleClose();\n };\n\n return (\n <>\n <Button\n onClick={handleClick}\n sx={{\n color: \"#1e2f97\",\n textTransform: \"none\",\n padding: \"4px 8px\",\n minWidth: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n \"&:hover\": {\n backgroundColor: \"rgba(30, 47, 151, 0.04)\",\n },\n }}\n aria-label=\"Select language\"\n aria-controls={open ? \"language-menu\" : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? \"true\" : undefined}\n >\n <Box\n component=\"img\"\n src={currentLang.flag}\n alt={currentLang.name}\n sx={{\n width: \"20px\",\n height: \"15px\",\n objectFit: \"cover\",\n borderRadius: \"2px\",\n }}\n />\n <Box\n component=\"span\"\n sx={{\n fontSize: \"14px\",\n fontWeight: 500,\n marginLeft: \"4px\",\n }}\n >\n {currentLang.code.toUpperCase()}\n </Box>\n <ArrowDropDownIcon\n sx={{\n fontSize: \"20px\",\n marginLeft: \"2px\",\n display: \"flex\",\n alignSelf: \"center\",\n }}\n />\n </Button>\n <Menu\n id=\"language-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n slotProps={{\n paper: {\n sx: {\n mt: 1,\n minWidth: 150,\n },\n },\n }}\n >\n {languages.map((language) => (\n <MenuItem\n key={language.code}\n onClick={() => handleLanguageSelect(language.code)}\n selected={language.code === currentLanguage}\n >\n <ListItemIcon>\n <Box\n component=\"img\"\n src={language.flag}\n alt={language.name}\n sx={{\n width: \"24px\",\n height: \"18px\",\n objectFit: \"cover\",\n borderRadius: \"2px\",\n }}\n />\n </ListItemIcon>\n <ListItemText primary={language.name} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\n\nexport default LanguageSelector;\n\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\nimport MailIcon from \"@mui/icons-material/Mail\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\nimport {\n AppBar,\n Avatar,\n Badge,\n Box,\n Divider,\n IconButton,\n List,\n ListItem,\n ListItemAvatar,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n styled,\n Toolbar,\n Typography,\n} from \"@mui/material\";\nimport { deepOrange } from \"@mui/material/colors\";\nimport React from \"react\";\nimport { useDrawer } from \"./DrawerContext\";\nimport { AppHeaderProps, UserProfile } from \"./types\";\nimport { getUserDataFromStorage, getNotificationCountFromStorage, getMessageCountFromStorage, getI18nLocaleFromStorage, setI18nLocaleToStorage, getAllDataFromStorage, fetchProfilePictureAsBlobUrl } from \"./utils/localStorage\";\nimport { getTranslations, SupportedLanguage } from \"./utils/translations\";\nimport ImpactomicsLogo from \"./asset/Impactomics.svg\";\nimport LanguageSelector from \"./LanguageSelector\";\nimport \"./styles/Header.scss\";\n\nconst DEFAULT_ROUTES = {\n settings: \"/account/overview\",\n profile: \"/user/profile\",\n logout: \"/user/login\",\n};\n\nconst AppHeader: React.FC<AppHeaderProps> = ({ language: languageProp }) => {\n // Get initial language from props, URL, localStorage, or default to 'en'\n const getInitialLanguage = (): SupportedLanguage => {\n // Priority 1: Props\n if (languageProp) {\n setI18nLocaleToStorage(languageProp);\n return languageProp as SupportedLanguage;\n }\n \n // Priority 2: URL path - pattern is /:locale/base-name/...\n const currentPath = window.location.pathname;\n const localePattern = /^\\/(en|es)(\\/|$)/;\n const localeMatch = currentPath.match(localePattern);\n if (localeMatch && localeMatch[1]) {\n const urlLocale = localeMatch[1] as SupportedLanguage;\n setI18nLocaleToStorage(urlLocale);\n return urlLocale;\n }\n \n // Priority 3: localStorage\n const storedLocale = getI18nLocaleFromStorage();\n if (storedLocale && (storedLocale === 'en' || storedLocale === 'es')) {\n return storedLocale as SupportedLanguage;\n }\n \n // Default\n return 'en';\n };\n\n const [currentLanguage, setCurrentLanguage] = React.useState<SupportedLanguage>(getInitialLanguage);\n const t = getTranslations(currentLanguage);\n \n const { isDrawerOpen, toggleDrawer } = useDrawer();\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\n React.useState<null | HTMLElement>(null);\n \n const [user, setUser] = React.useState<UserProfile>(() => {\n const allData = getAllDataFromStorage();\n let userName = \"\";\n let userEmail = \"\";\n let userRole = \"\";\n\n const buildNameFromFirstLast = (obj: Record<string, unknown> | null | undefined): string => {\n if (!obj || typeof obj !== \"object\") return \"\";\n const first = (obj.firstName ?? obj.given_name ?? obj.first_name) as string | undefined;\n const last = (obj.lastName ?? obj.family_name ?? obj.last_name) as string | undefined;\n return [first, last].filter(Boolean).join(\" \").trim();\n };\n\n // Prefer getUserDataFromStorage first (IAM firstName+lastName or persist:userdb name)\n const storedUser = getUserDataFromStorage();\n if (storedUser) {\n userName = storedUser.name || \"\";\n userEmail = userEmail || storedUser.email || \"\";\n userRole = userRole || storedUser.role || \"\";\n }\n\n // Then enrich from decoded token (email from sub; name only if token has name/given_name/family_name, never use sub as name)\n if (allData.decodedToken) {\n const token = allData.decodedToken as Record<string, unknown>;\n userEmail = userEmail || (token.sub as string) || (token.email as string) || \"\";\n const tokenName = (token.name as string) || buildNameFromFirstLast(token);\n userName = userName || (tokenName || \"\");\n userRole = userRole || (token.role as string) || \"\";\n }\n\n if (allData.auth) {\n const auth = allData.auth as Record<string, unknown>;\n userEmail = userEmail || (auth.email as string) || (auth.sub as string) || \"\";\n userName = userName || (auth.name as string) || buildNameFromFirstLast(auth) || \"\";\n userRole = userRole || (auth.role as string) || (auth.activeRole as string) || \"\";\n }\n\n if (allData.userDetails) {\n const userDetails = (allData.userDetails as Record<string, unknown>).user\n || (allData.userDetails as Record<string, unknown>).data\n || allData.userDetails;\n const details = userDetails as Record<string, unknown> | undefined;\n if (details) {\n userEmail = userEmail || (details.email as string) || (details.emailAddress as string) || \"\";\n userName = userName || (details.name as string) || (details.fullName as string) || buildNameFromFirstLast(details) || \"\";\n userRole = userRole || (details.role as string) || (details.userRole as string) || \"\";\n }\n }\n\n if (allData.user) {\n const u = (allData.user as Record<string, unknown>).user\n || (allData.user as Record<string, unknown>).data\n || (allData.user as Record<string, unknown>).currentUser\n || allData.user;\n const userData = u as Record<string, unknown> | undefined;\n if (userData) {\n userEmail = userEmail || (userData.email as string) || (userData.emailAddress as string) || \"\";\n userName = userName || (userData.name as string) || (userData.fullName as string) || buildNameFromFirstLast(userData) || \"\";\n userRole = userRole || (userData.role as string) || (userData.userRole as string) || \"\";\n }\n }\n\n if (allData.profile) {\n const p = (allData.profile as Record<string, unknown>).user\n || (allData.profile as Record<string, unknown>).data\n || allData.profile;\n const profileData = p as Record<string, unknown> | undefined;\n if (profileData) {\n userEmail = userEmail || (profileData.email as string) || (profileData.emailAddress as string) || \"\";\n userName = userName || (profileData.name as string) || (profileData.fullName as string) || buildNameFromFirstLast(profileData) || \"\";\n userRole = userRole || (profileData.role as string) || (profileData.userRole as string) || \"\";\n }\n }\n\n return {\n name: userName || \"\",\n email: userEmail || \"\",\n role: userRole || \"\",\n avatar: storedUser?.avatar || (allData.auth as Record<string, unknown> | undefined)?.avatar || (allData.profile as Record<string, unknown> | undefined)?.avatar || undefined,\n initials: storedUser?.initials || (allData.auth as Record<string, unknown> | undefined)?.initials || (allData.profile as Record<string, unknown> | undefined)?.initials || undefined,\n };\n });\n\n const [notificationCount, setNotificationCount] = React.useState<number>(() => {\n const count = getNotificationCountFromStorage();\n return count !== null && count !== undefined ? count : 0;\n });\n \n const [messageCount, setMessageCount] = React.useState<number | undefined>(() => {\n return getMessageCountFromStorage() ?? undefined;\n });\n\n // State for profile picture blob URL\n const [profilePictureBlobUrl, setProfilePictureBlobUrl] = React.useState<string | null>(null);\n\n // Fetch profile picture from API when component mounts or user data changes\n React.useEffect(() => {\n const fetchProfilePicture = async () => {\n // Try to fetch profile picture from API\n const blobUrl = await fetchProfilePictureAsBlobUrl();\n if (blobUrl) {\n // Clean up previous blob URL if it exists\n setProfilePictureBlobUrl((prevUrl) => {\n if (prevUrl) {\n URL.revokeObjectURL(prevUrl);\n }\n return blobUrl;\n });\n }\n };\n\n fetchProfilePicture();\n\n // Cleanup function to revoke blob URL when component unmounts or effect re-runs\n return () => {\n setProfilePictureBlobUrl((prevUrl) => {\n if (prevUrl) {\n URL.revokeObjectURL(prevUrl);\n }\n return null;\n });\n };\n }, []); // Only run once on mount - fetch when component loads\n\n React.useEffect(() => {\n const allData = getAllDataFromStorage();\n let userName = \"\";\n let userEmail = \"\";\n let userRole = \"\";\n let userAvatar: string | undefined;\n let userInitials: string | undefined;\n\n const buildNameFromFirstLast = (obj: Record<string, unknown> | null | undefined): string => {\n if (!obj || typeof obj !== \"object\") return \"\";\n const first = (obj.firstName ?? obj.given_name ?? obj.first_name) as string | undefined;\n const last = (obj.lastName ?? obj.family_name ?? obj.last_name) as string | undefined;\n return [first, last].filter(Boolean).join(\" \").trim();\n };\n\n const storedUser = getUserDataFromStorage();\n if (storedUser) {\n userName = storedUser.name || \"\";\n userEmail = userEmail || storedUser.email || \"\";\n userRole = userRole || storedUser.role || \"\";\n userAvatar = storedUser.avatar;\n userInitials = storedUser.initials;\n }\n\n if (allData.decodedToken) {\n const token = allData.decodedToken as Record<string, unknown>;\n userEmail = userEmail || (token.sub as string) || (token.email as string) || \"\";\n const tokenName = (token.name as string) || buildNameFromFirstLast(token);\n userName = userName || (tokenName || \"\");\n userRole = userRole || (token.role as string) || \"\";\n }\n\n if (allData.auth) {\n const auth = allData.auth as Record<string, unknown>;\n userEmail = userEmail || (auth.email as string) || (auth.sub as string) || \"\";\n userName = userName || (auth.name as string) || buildNameFromFirstLast(auth) || \"\";\n userRole = userRole || (auth.role as string) || (auth.activeRole as string) || \"\";\n userAvatar = userAvatar || (auth.avatar as string) || undefined;\n userInitials = userInitials || (auth.initials as string) || undefined;\n }\n\n if (allData.userDetails) {\n const userDetails = (allData.userDetails as Record<string, unknown>).user\n || (allData.userDetails as Record<string, unknown>).data\n || allData.userDetails;\n const details = userDetails as Record<string, unknown> | undefined;\n if (details) {\n userEmail = userEmail || (details.email as string) || (details.emailAddress as string) || \"\";\n userName = userName || (details.name as string) || (details.fullName as string) || buildNameFromFirstLast(details) || \"\";\n userRole = userRole || (details.role as string) || (details.userRole as string) || \"\";\n userAvatar = userAvatar || (details.avatar as string) || (details.profilePicture as string) || undefined;\n userInitials = userInitials || (details.initials as string) || undefined;\n }\n }\n\n if (allData.user) {\n const u = (allData.user as Record<string, unknown>).user\n || (allData.user as Record<string, unknown>).data\n || (allData.user as Record<string, unknown>).currentUser\n || allData.user;\n const userData = u as Record<string, unknown> | undefined;\n if (userData) {\n userEmail = userEmail || (userData.email as string) || (userData.emailAddress as string) || \"\";\n userName = userName || (userData.name as string) || (userData.fullName as string) || buildNameFromFirstLast(userData) || \"\";\n userRole = userRole || (userData.role as string) || (userData.userRole as string) || \"\";\n userAvatar = userAvatar || (userData.avatar as string) || (userData.profilePicture as string) || undefined;\n userInitials = userInitials || (userData.initials as string) || undefined;\n }\n }\n\n if (allData.profile) {\n const p = (allData.profile as Record<string, unknown>).user\n || (allData.profile as Record<string, unknown>).data\n || allData.profile;\n const profileData = p as Record<string, unknown> | undefined;\n if (profileData) {\n userEmail = userEmail || (profileData.email as string) || (profileData.emailAddress as string) || \"\";\n userName = userName || (profileData.name as string) || (profileData.fullName as string) || buildNameFromFirstLast(profileData) || \"\";\n userRole = userRole || (profileData.role as string) || (profileData.userRole as string) || \"\";\n userAvatar = userAvatar || (profileData.avatar as string) || (profileData.profilePicture as string) || undefined;\n userInitials = userInitials || (profileData.initials as string) || undefined;\n }\n }\n\n setUser({\n name: userName || \"\",\n email: userEmail || \"\",\n role: userRole || \"\",\n avatar: profilePictureBlobUrl || userAvatar,\n initials: userInitials,\n });\n \n // Update online status\n if (allData.auth?.isOnline !== undefined) {\n setIsOnlineStatus(allData.auth.isOnline);\n } else if (allData.userDetails?.isOnline !== undefined) {\n setIsOnlineStatus(allData.userDetails.isOnline);\n } else if (allData.user?.isOnline !== undefined) {\n setIsOnlineStatus(allData.user.isOnline);\n } else if (allData.profile?.isOnline !== undefined) {\n setIsOnlineStatus(allData.profile.isOnline);\n }\n \n const notifCount = getNotificationCountFromStorage();\n setNotificationCount(notifCount !== null && notifCount !== undefined ? notifCount : 0);\n \n const msgCount = getMessageCountFromStorage();\n setMessageCount(msgCount ?? undefined);\n\n // Initialize language from props if provided\n if (languageProp && languageProp !== currentLanguage) {\n setCurrentLanguage(languageProp as SupportedLanguage);\n setI18nLocaleToStorage(languageProp);\n }\n }, [languageProp, profilePictureBlobUrl]); // Also update when profile picture is fetched\n\n const finalRoutes = DEFAULT_ROUTES;\n \n // Get online status from localStorage dynamically\n const [isOnlineStatus, setIsOnlineStatus] = React.useState<boolean>(() => {\n const allData = getAllDataFromStorage();\n if (allData.auth?.isOnline !== undefined) {\n return allData.auth.isOnline;\n }\n if (allData.userDetails?.isOnline !== undefined) {\n return allData.userDetails.isOnline;\n }\n if (allData.user?.isOnline !== undefined) {\n return allData.user.isOnline;\n }\n if (allData.profile?.isOnline !== undefined) {\n return allData.profile.isOnline;\n }\n // Default to true if not specified (for backward compatibility)\n return true;\n });\n \n const notificationCountValue = notificationCount;\n \n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\n\n const OnlineBadge = styled(Badge)(({ theme }) => ({\n \"& .MuiBadge-badge\": {\n backgroundColor: \"#44b700\",\n color: \"#44b700\",\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n },\n }));\n\n const OfflineBadge = styled(Badge)(({ theme }) => ({\n \"& .MuiBadge-badge\": {\n backgroundColor: \"gray\",\n color: \"gray\",\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n },\n }));\n\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMobileMenuClose = () => {\n setMobileMoreAnchorEl(null);\n };\n\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setMobileMoreAnchorEl(event.currentTarget);\n };\n\n const open = Boolean(anchorEl);\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSettingsClick = () => {\n handleClose();\n const path = finalRoutes.settings.startsWith('/') \n ? finalRoutes.settings \n : `/${finalRoutes.settings}`;\n window.location.href = path;\n };\n\n const handleProfileClick = () => {\n handleClose();\n const path = finalRoutes.profile.startsWith('/') \n ? finalRoutes.profile \n : `/${finalRoutes.profile}`;\n window.location.href = path;\n };\n\n const handleSignOutClick = () => {\n handleClose();\n try {\n localStorage.clear();\n sessionStorage.clear();\n } catch (e) {\n console.warn(\"Clear storage on logout:\", e);\n }\n const path = finalRoutes.logout.startsWith('/') \n ? finalRoutes.logout \n : `/${finalRoutes.logout}`;\n window.location.href = path;\n };\n\n const menuId = \"primary-account-menu\";\n\n const getInitials = () => {\n if (user.initials) return user.initials;\n return user.name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n };\n\n // Check if user has permission to see settings (Account Owner, Account Admin, or Global Admin)\n const canViewSettings = React.useMemo(() => {\n const allData = getAllDataFromStorage();\n let userRole = \"\";\n \n // Get role from decoded token\n if (allData.decodedToken?.role) {\n userRole = allData.decodedToken.role;\n }\n // Get role from auth data\n else if (allData.auth?.role) {\n userRole = allData.auth.role;\n }\n // Get role from user data\n else if (user.role) {\n userRole = user.role;\n }\n // Get role from userDetails\n else if (allData.userDetails) {\n const userDetails = allData.userDetails.user || allData.userDetails.data || allData.userDetails;\n userRole = userDetails?.role || userDetails?.userRole || \"\";\n }\n // Get role from user\n else if (allData.user) {\n const userData = allData.user.user || allData.user.data || allData.user.currentUser || allData.user;\n userRole = userData?.role || userData?.userRole || \"\";\n }\n \n // Normalize role for comparison (case-insensitive, handle spaces/underscores/hyphens)\n const normalizedRole = userRole.toLowerCase().trim().replace(/[_\\s-]+/g, \" \");\n const allowedRoles = [\n \"account owner\",\n \"account admin\",\n \"global admin\"\n ];\n \n // Check for exact match or if role starts with allowed role\n // This handles variations like \"Account Owner\", \"ACCOUNT_OWNER\", \"Account-Owner\", \"Account Owner - Manager\"\n return allowedRoles.some(allowedRole => {\n return normalizedRole === allowedRole || normalizedRole.startsWith(allowedRole + \" \");\n });\n }, [user.role]);\n\n const profileList = (\n <List\n className=\"profile-menu-section\"\n sx={{\n width: \"100%\",\n maxWidth: 360,\n pointerEvents: \"none\",\n }}\n component=\"div\"\n aria-hidden=\"true\"\n tabIndex={-1}\n >\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\n <ListItemAvatar>\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <Avatar\n sx={{ bgcolor: deepOrange[500] }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <Avatar\n sx={{ bgcolor: deepOrange[500] }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OfflineBadge>\n )}\n </ListItemAvatar>\n <ListItemText\n primary={\n <Typography className=\"profile-name\" component=\"span\">\n {user.name || user.email}\n </Typography>\n }\n secondary={\n <React.Fragment>\n {user.name && user.email ? (\n <Typography className=\"profile-email\" component=\"p\">\n {user.email}\n </Typography>\n ) : null}\n <Typography className=\"profile-role\" component=\"p\">\n {t.role}: {user.role}\n </Typography>\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n );\n\n const renderMenu = (\n <Menu\n anchorEl={anchorEl}\n id=\"account-menu\"\n open={open}\n onClose={handleClose}\n onClick={handleClose}\n slotProps={{\n paper: {\n elevation: 0,\n sx: {\n overflow: \"visible\",\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\n mt: 1.5,\n \"& .MuiAvatar-root\": {\n width: 32,\n height: 32,\n ml: -0.5,\n mr: 1,\n },\n \"&::before\": {\n content: '\"\"',\n display: \"block\",\n position: \"absolute\",\n top: 0,\n right: 14,\n width: 10,\n height: 10,\n bgcolor: \"background.paper\",\n transform: \"translateY(-50%) rotate(45deg)\",\n zIndex: 0,\n },\n },\n },\n }}\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\n >\n {profileList}\n <Divider />\n <MenuItem onClick={handleProfileClick}>\n <ListItemIcon>\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.profile}\n </MenuItem>\n {canViewSettings && (\n <MenuItem onClick={handleSettingsClick}>\n <ListItemIcon>\n <SettingsOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.accountSettings}\n </MenuItem>\n )}\n <MenuItem onClick={handleSignOutClick}>\n <ListItemIcon>\n <LogoutOutlinedIcon fontSize=\"small\" />\n </ListItemIcon>\n {t.signOut}\n </MenuItem>\n </Menu>\n );\n\n const mobileMenuId = \"primary-account-menu-mobile\";\n const renderMobileMenu = (\n <Menu\n anchorEl={mobileMoreAnchorEl}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n id={mobileMenuId}\n keepMounted\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n open={isMobileMenuOpen}\n onClose={handleMobileMenuClose}\n >\n {messageCount !== undefined && (\n <MenuItem>\n <IconButton \n size=\"large\" \n aria-label={`show ${messageCount} new mails`}\n sx={{ color: '#1e2f97' }}\n >\n <Badge badgeContent={messageCount} color=\"error\">\n <MailIcon />\n </Badge>\n </IconButton>\n <p>{t.messages}</p>\n </MenuItem>\n )}\n {notificationCountValue > 0 && (\n <MenuItem>\n <IconButton\n size=\"large\"\n aria-label={`show ${notificationCountValue} new notifications`}\n sx={{ color: '#1e2f97' }}\n >\n <Badge badgeContent={notificationCount} color=\"error\">\n <NotificationsActiveOutlined />\n </Badge>\n </IconButton>\n <p>{t.notifications}</p>\n </MenuItem>\n )}\n <MenuItem onClick={handleProfileMenuOpen}>\n <IconButton\n size=\"large\"\n aria-label=\"account of current user\"\n aria-controls=\"primary-account-menu\"\n aria-haspopup=\"true\"\n sx={{ color: '#1e2f97' }}\n >\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <AccountCircle\n titleAccess={user.name}\n aria-label=\"User avatar\"\n />\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <AccountCircle\n titleAccess={user.name}\n aria-label=\"User avatar\"\n />\n </OfflineBadge>\n )}\n </IconButton>\n <p>{t.profile}</p>\n </MenuItem>\n </Menu>\n );\n\n return (\n <Box sx={{ flexGrow: 1 }} className=\"app-header\">\n <AppBar\n elevation={0}\n sx={{\n backgroundColor: \"#ffffff\",\n boxShadow: 'none !important',\n position: 'fixed',\n zIndex: 200,\n height: '65px',\n }}\n >\n <Toolbar sx={{ minHeight: '65px !important', height: '65px' }}>\n <IconButton\n size=\"large\"\n edge=\"start\"\n aria-label=\"open drawer\"\n sx={{ \n mr: '10px !important',\n color: '#1e2f97',\n padding: 0,\n paddingLeft: '14px',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n onClick={() => {\n toggleDrawer();\n }}\n >\n {isDrawerOpen ? (\n <MenuOpenIcon fontSize=\"large\" />\n ) : (\n <MenuIcon fontSize=\"large\" />\n )}\n </IconButton>\n <Box\n component=\"div\"\n sx={{ \n display: { xs: \"none\", sm: \"flex\" },\n alignItems: 'center',\n height: '65px',\n }}\n data-testid=\"impactomics-logo-wrapper\"\n >\n <img \n src={ImpactomicsLogo} \n alt=\"Impactomics\" \n style={{ height: '23px', width: 'auto', display: 'block' }}\n />\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n <Box sx={{ display: { xs: \"none\", md: \"flex\" }, alignItems: \"center\", gap: \"4px\" }}>\n <LanguageSelector\n currentLanguage={currentLanguage}\n onLanguageChange={(lang) => {\n setCurrentLanguage(lang);\n // The LanguageSelector component handles URL and localStorage updates\n }}\n />\n <IconButton\n size=\"large\"\n aria-label={notificationCountValue > 0 ? `show ${notificationCountValue} new notifications` : \"show notifications\"}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n <Badge badgeContent={notificationCountValue > 0 ? notificationCountValue : 0} color=\"error\">\n <NotificationsActiveOutlined />\n </Badge>\n </IconButton>\n <IconButton\n size=\"large\"\n edge=\"end\"\n aria-label=\"account of current user\"\n aria-controls={menuId}\n aria-haspopup=\"true\"\n onClick={handleProfileMenuOpen}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n {isOnlineStatus ? (\n <OnlineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.online}\n aria-label={`${t.online} status badge`}\n data-testid=\"online-badge\"\n >\n <Avatar\n sx={{\n bgcolor: deepOrange[500],\n width: 20,\n height: 20,\n p: 1,\n }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n sizes=\"large\"\n >\n {getInitials()}\n </Avatar>\n </OnlineBadge>\n ) : (\n <OfflineBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n variant=\"dot\"\n title={t.offline}\n aria-label={`${t.offline} status badge`}\n data-testid=\"offline-badge\"\n >\n <Avatar\n sx={{\n bgcolor: deepOrange[500],\n width: 20,\n height: 20,\n p: 1,\n }}\n alt={user.name}\n title={user.name}\n src={user.avatar}\n >\n {getInitials()}\n </Avatar>\n </OfflineBadge>\n )}\n </IconButton>\n </Box>\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\n <IconButton\n size=\"large\"\n aria-label=\"show more\"\n aria-controls={mobileMenuId}\n aria-haspopup=\"true\"\n onClick={handleMobileMenuOpen}\n sx={{\n color: '#1e2f97',\n '&:hover': {\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\n }\n }}\n >\n <MoreIcon />\n </IconButton>\n </Box>\n </Toolbar>\n </AppBar>\n {renderMobileMenu}\n {renderMenu}\n </Box>\n );\n};\n\nexport default AppHeader;\n\n"],"names":["_jsx","React","_jsxs","_Fragment"],"mappings":"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"}