{"version":3,"file":"507.chunk.js","mappings":"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","sources":["webpack://oripersonalmenuapp/../../../src/constants/defaultTranslations.ts","webpack://oripersonalmenuapp/../../../src/constants/defaultTranslationsWithNamespaces.ts","webpack://oripersonalmenuapp/../../../src/components/ApiProvider.tsx","webpack://oripersonalmenuapp/../../../src/constants/LocalizationItem.ts","webpack://oripersonalmenuapp/../../../src/constants/breakpoints.ts","webpack://oripersonalmenuapp/../../../src/constants/sessionStorageKeyPrefix.ts","webpack://oripersonalmenuapp/../../../src/hooks/useLogout.ts","webpack://oripersonalmenuapp/../../../src/utils/clearAllSessionStorageKeys.ts","webpack://oripersonalmenuapp/../../../src/hooks/useMenuItemsFilter.ts","webpack://oripersonalmenuapp/../../../src/contexts/configurationContext.ts","webpack://oripersonalmenuapp/../../src/constants-generated.ts","webpack://oripersonalmenuapp/../../src/logger.ts","webpack://oripersonalmenuapp/../../../src/schemas/menuItemSchema.ts","webpack://oripersonalmenuapp/../../../src/schemas/userSchema.ts","webpack://oripersonalmenuapp/../../../src/utils/createSessionStorageKey.ts","webpack://oripersonalmenuapp/../../../src/constants/queryString.ts","webpack://oripersonalmenuapp/../../../src/utils/isCurrentLocation.ts","webpack://oripersonalmenuapp/../../../src/utils/getQueryParameter.ts","webpack://oripersonalmenuapp/../../../src/utils/findSelectedPath.ts","webpack://oripersonalmenuapp/../../../src/utils/mapCustomerMenuToInternalMenuItems.ts","webpack://oripersonalmenuapp/../../../src/utils/mapOrisalesToInternalMenuItems.ts","webpack://oripersonalmenuapp/../../../src/utils/mergeOrisalesWithPersonalMenuItems.ts","webpack://oripersonalmenuapp/../../../src/utils/withSessionStorageCache.ts","webpack://oripersonalmenuapp/../../../src/hooks/usePersonalMenu.ts","webpack://oripersonalmenuapp/../../../src/utils/isOrisalesAvailable.ts","webpack://oripersonalmenuapp/../../../../src/components/AccordionMenu/Icon.tsx","webpack://oripersonalmenuapp/../../../../src/components/AccordionMenu/AccordionMenuItem.tsx","webpack://oripersonalmenuapp/../../../../src/components/AccordionMenu/AccordionMenu.tsx","webpack://oripersonalmenuapp/../../../src/components/FormattedMessage.tsx","webpack://oripersonalmenuapp/../../../src/models/TranslationKey.ts","webpack://oripersonalmenuapp/../../../src/utils/useConsultantNameFormatters.ts","webpack://oripersonalmenuapp/../../../src/components/Personalisation.tsx","webpack://oripersonalmenuapp/../../../src/utils/getFullNameFormat.ts","webpack://oripersonalmenuapp/../../../src/components/SkeletonLoader.tsx","webpack://oripersonalmenuapp/../../../src/components/PersonalMenuContent.tsx","webpack://oripersonalmenuapp/../../src/PersonalMenu.tsx","webpack://oripersonalmenuapp/./src/constants-generated.ts","webpack://oripersonalmenuapp/./src/logger.ts","webpack://oripersonalmenuapp/./src/useOutlets.ts","webpack://oripersonalmenuapp/./src/appRender.tsx"],"sourcesContent":["/* istanbul ignore file */\n\n/**\n * DO NOT EDIT!\n * This file was autogenerated by npm script `localizations-codegen`.\n * Changes may cause incorrect behavior and will be lost when the file is regenerated.\n *\n * Run `npx localizations-codegen` to regenerate.\n */\nimport type { TranslationKey } from '../models/TranslationKey';\n\nexport type DefaultTranslations = Record;\n\nexport const defaultTranslations: DefaultTranslations = {\n Hello: 'Hello',\n SignOut: 'Sign Out',\n UpgradeToBrandPartner: 'Upgrade to Brand Partner',\n UpgradeToConsultant: 'Upgrade to a consultant',\n};\n\nexport const translationsNamespace = 'personal-menu';\n","import { defaultTranslations, translationsNamespace } from './defaultTranslations';\n\nexport const defaultTranslationsWithNamespaces = {\n [translationsNamespace]: defaultTranslations,\n};\n","import { useToken } from '@ori/auth';\nimport { useServiceUrls } from '@ori/configuration-manager';\nimport { useEnvironment } from '@ori/environment';\nimport { SWRConfig, type SWRConfiguration } from '@ori/fetching';\nimport { ApiClientProvider as GlobalApiClientProvider } from '@ori/global-api-client-react';\nimport { useLanguage } from '@ori/i18n';\nimport { ApiClientProvider as MobileOfficeApiClientProvider } from '@ori/mobile-office-api-client-react';\nimport type { FC, PropsWithChildren } from 'react';\n\nconst TIMEOUT_IN_MS = 10_000;\n\nconst swrConfig: SWRConfiguration = {\n errorRetryCount: 3,\n errorRetryInterval: 10000,\n focusThrottleInterval: 300000,\n shouldRetryOnError: true,\n suspense: true,\n};\n\nexport const ApiProvider: FC = ({ children }) => {\n const { formattedToken } = useToken();\n const { language } = useLanguage();\n const { tenant } = useEnvironment();\n const { mobileOfficeApiUrl, globalApiUrl } = useServiceUrls(['mobileOfficeApi', 'globalApi']);\n\n return (\n \n \n \n {children}\n \n \n \n );\n};\n","export enum LocalizationItem {\n Hello = 'Hello',\n SignOut = 'SignOut',\n UpgradeToConsultant = 'UpgradeToConsultant',\n UpgradeToBrandPartner = 'UpgradeToBrandPartner',\n}\n","export const BREAKPOINT_HORIZONTAL_SIDEPANEL = 1025;\n","export const SESSION_STORAGE_KEY_PREFIX = 'ori-personal-menu-cache';\n","import { UserLogoutRequestEvent } from '@ori-events/user-logout-request';\n\nimport { clearAllSessionStorageKeys } from '../utils/clearAllSessionStorageKeys';\n\nfunction showLogoutModal() {\n clearAllSessionStorageKeys();\n const userLogoutRequestEvent = new CustomEvent(UserLogoutRequestEvent);\n window.dispatchEvent(userLogoutRequestEvent);\n}\n\n/** Hook that exposes function that, when called, shows user logout modal */\nexport const useLogout = () => showLogoutModal;\n","import { SESSION_STORAGE_KEY_PREFIX } from '../constants/sessionStorageKeyPrefix';\n\nexport const clearAllSessionStorageKeys = () => {\n for (const [key] of Object.entries(sessionStorage)) {\n if (key.startsWith(SESSION_STORAGE_KEY_PREFIX)) {\n sessionStorage.removeItem(key);\n }\n }\n};\n","import type { MenuItem } from '../schemas/menuItemSchema';\n\nconst UPGRADE_TO_CONSULTANT_KEY = 'become-consultant';\nconst UPGRADE_TO_BRAND_PARTNER_KEY = 'upgrade-to-brand-partner';\n\nconst filterMenuItems = (items: MenuItem[], isDesktop: boolean): MenuItem[] =>\n isDesktop\n ? items\n : items.filter(\n (x) => !x.url?.includes(UPGRADE_TO_CONSULTANT_KEY) && !x.url?.includes(UPGRADE_TO_BRAND_PARTNER_KEY),\n );\n\nconst findUrl = (menuItems: MenuItem[], key: string): string => menuItems.find((x) => x.url?.includes(key))?.url ?? '';\n\nexport const useMenuItemsFilter = (\n items: MenuItem[],\n isDesktop: boolean,\n): {\n filteredItems: MenuItem[];\n upgradeToConsultantUrl: string;\n upgradeToBrandPartnerUrl: string;\n} => ({\n filteredItems: filterMenuItems(items, isDesktop),\n upgradeToConsultantUrl: findUrl(items, UPGRADE_TO_CONSULTANT_KEY),\n upgradeToBrandPartnerUrl: findUrl(items, UPGRADE_TO_BRAND_PARTNER_KEY),\n});\n","import { useContext, createContext } from 'react';\n\nimport type { AppConfiguration } from '../models';\n\nconst configurationContext = createContext({});\n\nexport const ConfigurationProvider = configurationContext.Provider;\n\nexport const useConfiguration = () => useContext(configurationContext);\n","/* istanbul ignore file */\n//\n// DO NOT EDIT!\n// This file was autogenerated by Eddie.\n// Changes may cause incorrect behavior and will be lost when the file is regenerated.\n//\n// Run `npx eddie update workspace` to regenerate.\n//\n\nexport const APP_NAME = 'personal-menu';\nexport const PACKAGE_NAME = '@ori/personal-menu';\nexport const TEAM_NAME = 'AcquisitionGrowth';\n\nexport const EMOTION_CACHE_KEY = `${APP_NAME}-emotion-cache-key`;\n\nexport const APP_ROOT_ELEMENT_ID = `${APP_NAME}-root`;\n","import { Logger } from '@ori/logger';\n\nimport { PACKAGE_NAME, TEAM_NAME } from './constants-generated';\n\nexport const mainLogger = new Logger(PACKAGE_NAME, { teamName: TEAM_NAME });\n","import { z } from 'zod';\n\nconst itemBaseSchema = z.object({\n itemPath: z.string(),\n title: z.string(),\n url: z.string().nullish(),\n icon: z.string().nullish(),\n openInNewTab: z.boolean().nullish(),\n isViewable: z.boolean().nullish(),\n});\n\nexport type MenuItem = z.infer & {\n subItems: MenuItem[];\n};\n\nexport const menuItemSchema: z.ZodType = itemBaseSchema.extend({\n subItems: z.lazy(() => menuItemSchema.array()),\n});\n","import { GlobalApplicationsPersonalMenuPersonalMenuDtoUserType } from '@ori/global-api-client-react';\nimport { z } from 'zod';\n\nexport const userSchema = z.object({\n firstName: z.string().nullable(),\n lastName: z.string().nullable(),\n userType: z.nativeEnum(GlobalApplicationsPersonalMenuPersonalMenuDtoUserType),\n userHash: z.string(),\n});\n\nexport type User = z.infer;\n","import { SESSION_STORAGE_KEY_PREFIX } from '../constants/sessionStorageKeyPrefix';\n\n/** Create session storage key prefix for personal menu */\nexport const createSessionStorageKey = (parts: (string | number | undefined)[]) =>\n [SESSION_STORAGE_KEY_PREFIX, ...parts.filter((value) => value !== undefined)].join('-');\n","export const QUERYSTRING_IFRAMEURL = 'iframeUrl';\n","import { QUERYSTRING_IFRAMEURL } from '../constants/queryString';\nimport { getQueryParameter } from './getQueryParameter';\n\nconst trailingSlashRegex = /\\/$/;\nconst removeTrailingSlash = (url: string) => url.replace(trailingSlashRegex, '');\n\nexport const isCurrentLocation = (url: string | null | undefined): boolean => {\n if (!url) {\n return false;\n }\n\n const queryStringIndex = url.indexOf('?');\n const cleanUrl = removeTrailingSlash(queryStringIndex > -1 ? url.slice(0, queryStringIndex) : url);\n const cleanPathname = removeTrailingSlash(document.location.pathname.replace(trailingSlashRegex, ''));\n\n if (cleanPathname === cleanUrl) {\n const currentIframeUrl = getQueryParameter(QUERYSTRING_IFRAMEURL);\n const urlSearch = queryStringIndex > -1 ? url.slice(queryStringIndex) : undefined;\n const urlQueryParameters = new URLSearchParams(urlSearch);\n const urlIframeUrl = urlQueryParameters.get(QUERYSTRING_IFRAMEURL);\n\n return currentIframeUrl === urlIframeUrl;\n }\n\n return false;\n};\n","export const getQueryParameter = (param: string): string | null => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return new URLSearchParams(window.location.search).get(param);\n};\n","import type { MenuItem } from '../schemas/menuItemSchema';\nimport { isCurrentLocation } from './isCurrentLocation';\n\nexport const findSelectedPath = (items: MenuItem[]): string => {\n for (const item of items) {\n if (isCurrentLocation(item.url)) {\n return item.itemPath;\n }\n\n if (item.subItems.length) {\n const selectedPath = findSelectedPath(item.subItems);\n\n if (selectedPath) {\n return selectedPath;\n }\n }\n }\n\n return '';\n};\n","import type { GlobalApplicationsPersonalMenuPersonalMenuDto } from '@ori/global-api-client-react';\n\nimport type { MenuItem } from '../schemas/menuItemSchema';\n\nexport const mapCustomerMenuToInternalMenuItems = (\n parentItemPath: string,\n items: GlobalApplicationsPersonalMenuPersonalMenuDto['items'],\n): MenuItem[] =>\n items.reduce((accumulatedValue, item, index) => {\n const { url, isViewable, title, icon, openInNewTab, subItems } = item;\n\n // Ignore items without title or url\n if (!title || !url) {\n return accumulatedValue;\n }\n\n const itemPath = `${parentItemPath}/${index}/`;\n const mappedItem: MenuItem = {\n itemPath,\n title,\n url,\n icon: icon ?? null,\n openInNewTab: openInNewTab ?? null,\n subItems: mapCustomerMenuToInternalMenuItems(itemPath, [\n ...(subItems.length && url && isViewable\n ? [\n {\n url,\n title,\n isViewable: true,\n subItems: [],\n },\n ]\n : []),\n ...subItems,\n ]),\n isViewable,\n };\n\n accumulatedValue.push(mappedItem);\n\n return accumulatedValue;\n }, []);\n","import type { GlobalApplicationsPersonalMenuOrisalesMenuItemDto } from '@ori/global-api-client-react';\n\nimport type { MenuItem } from '../schemas/menuItemSchema';\n\nexport const mapOrisalesToInternalMenuItems = (\n parentItemPath: string,\n items: GlobalApplicationsPersonalMenuOrisalesMenuItemDto[],\n): MenuItem[] =>\n items.map((item, index) => {\n const itemPath = `${parentItemPath}/${index}/`;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- API indeed incorrectly may return value as undefined instead of empty array\n let subItems = item.items ?? [];\n const hasSubitems = !![...subItems].length;\n\n if (hasSubitems && item.url) {\n subItems = [item, ...subItems];\n }\n\n return {\n itemPath,\n title: item.name ?? '',\n url: item.url ?? '',\n icon: null,\n subItems: hasSubitems ? mapOrisalesToInternalMenuItems(itemPath, subItems) : [],\n openInNewTab: item.inNewTab,\n isViewable: true,\n };\n });\n","import { QUERYSTRING_IFRAMEURL } from '../constants/queryString';\nimport type { MenuItem } from '../schemas/menuItemSchema';\n\nconst MYPAGES_NETWORK_URL = '/mypages/network';\nconst MEMBER_CONSULTANT_TYPE = 11;\n\n/* Find position for merging */\nconst findSameNodeIndex = (currentMenu: MenuItem[], newMenuNode: MenuItem): number =>\n currentMenu.findIndex(\n (currentMenuNode: MenuItem) =>\n newMenuNode.title &&\n currentMenuNode.title &&\n newMenuNode.title.trim().toLowerCase() === currentMenuNode.title.trim().toLowerCase(),\n );\n\nconst setupSubItemsItemPaths = (itemPath: string, menuItems: MenuItem[]): void => {\n for (const [i, subItem] of menuItems.entries()) {\n subItem.itemPath = `${itemPath}/${i}/`;\n\n if (subItem.subItems.length > 0) {\n setupSubItemsItemPaths(subItem.itemPath, subItem.subItems);\n }\n }\n};\n\n/* Merge new node to existings menu, recursive */\nconst mergeToNode = (\n currentMenu: MenuItem[],\n newMenu: MenuItem[],\n parentItemPath: string,\n rootItemUrl: string | null,\n consultantType?: number,\n reportsItemName?: string,\n): void => {\n for (const newMenuNode of newMenu) {\n const shouldSkipForMember =\n consultantType === MEMBER_CONSULTANT_TYPE &&\n rootItemUrl === MYPAGES_NETWORK_URL &&\n newMenuNode.title === reportsItemName;\n\n if (shouldSkipForMember) {\n continue;\n }\n\n const relatedNodeIndex = findSameNodeIndex(currentMenu, newMenuNode);\n\n if (relatedNodeIndex !== -1) {\n // needs to merge, subitems\n if (newMenuNode.subItems.length > 0) {\n const parentNode = currentMenu[relatedNodeIndex];\n\n if (parentNode !== undefined) {\n const { subItems, itemPath } = parentNode;\n if (subItems.length > 0) {\n mergeToNode(subItems, newMenuNode.subItems, itemPath, rootItemUrl, consultantType, reportsItemName);\n }\n }\n }\n } else if (newMenuNode.subItems.length > 0 || newMenuNode.url) {\n const itemPath = `${parentItemPath}/${currentMenu.length}/`;\n\n newMenuNode.itemPath = itemPath;\n\n if (newMenuNode.subItems.length > 0) {\n setupSubItemsItemPaths(itemPath, newMenuNode.subItems);\n }\n // needs to add, subitems\n currentMenu.push(newMenuNode);\n }\n }\n};\n\nexport const mergeOrisalesWithPersonalMenuItems = (\n personalMenuItems: MenuItem[],\n orisalesMenuItems: MenuItem[],\n consultantType?: number,\n reportsItemName?: string,\n): MenuItem[] => {\n const result = [...personalMenuItems];\n\n if (!orisalesMenuItems.length) {\n return result;\n }\n\n // Merge root items\n for (const newMenuNode of orisalesMenuItems) {\n const relatedRootIndex = findSameNodeIndex(result, newMenuNode);\n\n if (relatedRootIndex !== -1) {\n const parentNode = result[relatedRootIndex];\n\n if (parentNode !== undefined) {\n const parentUrl = parentNode.url;\n\n // modify eshop iframe links - also in all subitems\n let rootItemStr = JSON.stringify(newMenuNode);\n rootItemStr = rootItemStr.replaceAll(/\"url\":\"(.*?)\"/g, (_: string, url: string): string => {\n const encodedParam = encodeURIComponent(url);\n\n return `\"url\":\"${parentUrl}?${QUERYSTRING_IFRAMEURL}=${encodedParam}\"`;\n });\n\n const adjustedNode = JSON.parse(rootItemStr) as MenuItem;\n\n // Merge both menus\n const { subItems, itemPath } = parentNode;\n if (relatedRootIndex !== -1 && adjustedNode.subItems.length > 0 && subItems.length > 0) {\n mergeToNode(subItems, adjustedNode.subItems, itemPath, parentUrl ?? null, consultantType, reportsItemName);\n }\n }\n }\n }\n\n return result;\n};\n","import { type z } from 'zod';\n\nimport { mainLogger } from '../logger';\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint, @typescript-eslint/no-explicit-any -- musts be any or type is not inherited\ntype MaybePromise = T | Promise;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- musts be any or type is not inherited\ntype CachableValueSchema = z.AnyZodObject | z.ZodArray | z.ZodNullable;\n\nconst logger = mainLogger.createChild('withSessionStorageCache');\n\nclass Storage> {\n readonly schema: TSchema;\n\n constructor(schema: TSchema) {\n this.schema = schema;\n }\n\n set(key: string, value: TValue) {\n sessionStorage.setItem(key, JSON.stringify(value));\n }\n\n get(key: string): TValue | null {\n const valueFromStorage = sessionStorage.getItem(key);\n\n if (!valueFromStorage) {\n return null;\n }\n\n const validated = this.schema.safeParse(JSON.parse(valueFromStorage));\n\n if (!validated.success) {\n logger.error(new Error(`Failed to get the value from session storage by key \"${key}\" as its value is invalid`), {\n issues: validated.error.format(),\n });\n\n // Clear invalid value\n this.clear(key);\n\n return null;\n }\n\n return validated.data as TValue;\n }\n\n clear(key: string) {\n sessionStorage.removeItem(key);\n }\n}\n\ntype CachedFunctionOptions = { pauseCaching?: boolean };\n\nexport const withSessionStorageCache = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- musts be any or type is not inherited\n TFunction extends (...parameters: any[]) => MaybePromise,\n TSchema extends CachableValueSchema,\n TReturnValue extends z.output,\n>(\n options: {\n /** Cache key */\n key: string | ((...parameters: [...Parameters, opt?: CachedFunctionOptions]) => string);\n\n /** Validation schema that is used for validating saved data in session storage */\n schema: TSchema;\n },\n /** Function to be cached */\n functionToBeCached: TFunction,\n) => {\n const { key: keyOrKeyAsFunction, schema } = options;\n const storage = new Storage(schema);\n\n async function cached(...parameters: [...Parameters, opt?: CachedFunctionOptions]): Promise {\n const key = typeof keyOrKeyAsFunction === 'function' ? keyOrKeyAsFunction(...parameters) : keyOrKeyAsFunction;\n\n const lastArgument = parameters.at(-1);\n const isCachingPaused =\n lastArgument !== undefined && 'pauseCaching' in lastArgument && lastArgument.pauseCaching === true;\n if (!isCachingPaused) {\n const cachedValue = storage.get(key);\n\n if (cachedValue !== undefined && cachedValue !== null) {\n return cachedValue as TReturnValue;\n }\n }\n\n const uncachedValue = (await Promise.resolve(functionToBeCached(...parameters))) as TReturnValue;\n\n if (!isCachingPaused && uncachedValue !== null && uncachedValue !== undefined) {\n storage.set(key, uncachedValue);\n }\n\n return uncachedValue;\n }\n\n return cached;\n};\n","/* eslint-disable complexity -- legacy code */\nimport { useToken } from '@ori/auth';\nimport { useSWR } from '@ori/fetching';\nimport type {\n ApiClient as GlobalApiClient,\n GetCustomerMenuOrderType,\n GlobalApplicationsPersonalMenuPersonalMenuDto,\n} from '@ori/global-api-client-react';\nimport {\n getApplicationsPersonalMenuOrisalesMenu,\n getCustomerMenu,\n useApiClient as useGlobalApiClient,\n} from '@ori/global-api-client-react';\nimport { useLanguage } from '@ori/i18n';\nimport { z } from 'zod';\n\nimport { useConfiguration } from '../contexts/configurationContext';\nimport { mainLogger } from '../logger';\nimport type { PersonalMenuInitialData } from '../models';\nimport { type MenuItem, menuItemSchema } from '../schemas/menuItemSchema';\nimport { userSchema, type User } from '../schemas/userSchema';\nimport { createSessionStorageKey } from '../utils/createSessionStorageKey';\nimport { findSelectedPath } from '../utils/findSelectedPath';\nimport { isOrisalesAvailable } from '../utils/isOrisalesAvailable';\nimport { mapCustomerMenuToInternalMenuItems } from '../utils/mapCustomerMenuToInternalMenuItems';\nimport { mapOrisalesToInternalMenuItems } from '../utils/mapOrisalesToInternalMenuItems';\nimport { mergeOrisalesWithPersonalMenuItems } from '../utils/mergeOrisalesWithPersonalMenuItems';\nimport { withSessionStorageCache } from '../utils/withSessionStorageCache';\n\nconst logger = mainLogger.createChild('usePersonalMenu');\n\nexport const getUserFromPersonalMenu = ({\n userHash,\n customerLastName,\n customerFirstName,\n userType,\n}: Omit): User | null =>\n userHash\n ? {\n firstName: customerFirstName ?? null,\n lastName: customerLastName ?? null,\n userHash,\n userType,\n }\n : null;\n\ntype GetUserOptions = {\n globalApiClient: GlobalApiClient;\n customerId: number;\n orderType: GetCustomerMenuOrderType | undefined;\n initialData?: PersonalMenuInitialData;\n};\nconst getUserCached = withSessionStorageCache(\n {\n key: ({ customerId, orderType, initialData }) =>\n createSessionStorageKey(['user', customerId, orderType, initialData?.userHash]),\n schema: userSchema,\n },\n async ({ customerId, globalApiClient, orderType, initialData }: GetUserOptions): Promise => {\n const userFromInitialData = initialData && getUserFromPersonalMenu(initialData);\n\n if (userFromInitialData) {\n return userFromInitialData;\n }\n\n const { data } = await getCustomerMenu(globalApiClient, String(customerId), {\n orderType,\n rootLevelOnly: true,\n });\n\n const userFromMenu = getUserFromPersonalMenu(data);\n\n if (!userFromMenu) {\n throw new Error('Could not get user from personal menu due to missing userHash');\n }\n\n return userFromMenu;\n },\n);\n\ntype GetCustomerMenuItemOptions = {\n globalApiClient: GlobalApiClient;\n customerId: number;\n orderType: GetCustomerMenuOrderType | undefined;\n userHash: string;\n};\nconst getCustomerMenuItemsCached = withSessionStorageCache(\n {\n key: ({ customerId, orderType, userHash }) =>\n createSessionStorageKey(['menu-items', customerId, orderType, userHash]),\n schema: z.array(menuItemSchema),\n },\n async (options: GetCustomerMenuItemOptions) => {\n const { customerId, globalApiClient, orderType, userHash } = options;\n const { data: customerMenu } = await getCustomerMenu(globalApiClient, String(customerId), {\n rootLevelOnly: false,\n orderType,\n userHash,\n });\n\n return mapCustomerMenuToInternalMenuItems('', customerMenu.items);\n },\n);\n\ntype GetCustomerOrisalesMenuOptions = {\n globalApiClient: GlobalApiClient;\n consultantNumber: string | undefined;\n userType: User['userType'];\n language: string;\n};\nconst getCustomerOrisalesMenuCached = withSessionStorageCache(\n {\n key: ({ consultantNumber, userType }) =>\n createSessionStorageKey(['orisales-menu-items', consultantNumber, userType]),\n schema: z.array(menuItemSchema).nullable(),\n },\n async (options: GetCustomerOrisalesMenuOptions) => {\n const { consultantNumber, globalApiClient, userType, language } = options;\n const canFetchOrisalesMenu = consultantNumber !== undefined && isOrisalesAvailable(userType);\n\n if (!canFetchOrisalesMenu) {\n return null;\n }\n\n const { data } = await getApplicationsPersonalMenuOrisalesMenu(\n globalApiClient,\n {},\n {\n params: {\n distNum: consultantNumber,\n // FIXME: Why is orisales route not taking the accept language header?\n locale: language,\n },\n },\n );\n\n return mapOrisalesToInternalMenuItems('', data.items);\n },\n);\n\nexport const usePersonalMenu = () => {\n const { customerId, formattedToken } = useToken();\n const { language } = useLanguage();\n const configuration = useConfiguration();\n const globalApiClient = useGlobalApiClient();\n\n return useSWR(\n // Leave in formattedToken as part of the key so the globalApiClient is passed to fetcher correctly\n [`menu-items`, language, customerId, configuration, formattedToken],\n async ([, currentLanguage, currentCustomerId, currentConfiguration]) => {\n const {\n personalMenuInitialData: initialData,\n consultantNumber,\n consultantType,\n reportsItemName,\n } = currentConfiguration;\n const { orderType, useCaching = true } = initialData ?? {};\n\n const user = await getUserCached(\n {\n globalApiClient,\n customerId: currentCustomerId,\n orderType,\n initialData: initialData ?? undefined,\n },\n {\n pauseCaching: !useCaching,\n },\n );\n\n const customerMenuItems = await getCustomerMenuItemsCached(\n {\n globalApiClient,\n customerId,\n orderType,\n userHash: user.userHash,\n },\n { pauseCaching: !useCaching },\n );\n\n let orisalesMenuItems: MenuItem[] = [];\n\n // Orisales is being deprecated and some environments and some markets does not have enough data and API call are failing\n // Adding try/catch here prevents whole presonal menu from failing. The data are not required and the download will be tried on every request\n try {\n orisalesMenuItems =\n (await getCustomerOrisalesMenuCached(\n {\n globalApiClient,\n consultantNumber,\n userType: user.userType,\n language: currentLanguage,\n },\n {\n pauseCaching: !useCaching,\n },\n )) ?? [];\n } catch (error) {\n logger.error(new Error('Failed to fetch the orisales menu items', { cause: error }));\n }\n\n // Aka personal menu\n const menuItemsWithOrisales = mergeOrisalesWithPersonalMenuItems(\n customerMenuItems,\n orisalesMenuItems,\n consultantType,\n reportsItemName,\n );\n\n return {\n user,\n customerMenuItems,\n orisalesMenuItems,\n items: menuItemsWithOrisales,\n hasSubitems: !!menuItemsWithOrisales.length || !!customerMenuItems.length || !!orisalesMenuItems?.length,\n };\n },\n { refreshInterval: 0, revalidateOnFocus: false, revalidateIfStale: false, revalidateOnReconnect: false },\n );\n};\n\nexport const useSelectedMenuItem = () => {\n const { data } = usePersonalMenu();\n\n return data?.items ? findSelectedPath(data.items) : undefined;\n};\n","import { GlobalApplicationsPersonalMenuPersonalMenuDtoUserType } from '@ori/global-api-client-react';\n\nexport const isOrisalesAvailable = (userType: GlobalApplicationsPersonalMenuPersonalMenuDtoUserType): boolean =>\n userType === GlobalApplicationsPersonalMenuPersonalMenuDtoUserType.Consultant;\n","/** eslint-disable @typescript-eslint/naming-convention -- thats the naming convetion in this case */\nimport {\n Academy,\n Box as BoxIcon,\n Chart,\n Clock,\n Dashboard,\n Favourite,\n Message,\n MyBenefits,\n Network,\n NewUser,\n Oriflame,\n Sales,\n Settings,\n Upgrade,\n WhatsNew,\n} from '@ori-ui/icons';\nimport { Box, styled } from '@ori-ui/mui';\nimport useTestId from '@ori/testid-generator';\nimport type { FC } from 'react';\n\ninterface IconProps {\n icon: string | null;\n}\n\nconst mapping = {\n 'v-icon-dashboard-outlined': Dashboard,\n 'v-icon-sales-outlined': Sales,\n 'v-icon-whats-new': WhatsNew,\n 'v-icon-wallet': BoxIcon,\n 'v-icon-network-outlined': Network,\n 'v-icon-academy': Academy,\n 'v-icon-new-user-outlined': NewUser,\n 'v-icon-favourite-outlined': Favourite,\n 'v-icon-message-outlined': Message,\n 'v-icon-settings-outlined': Settings,\n 'v-icon-upgrade-outlined': Upgrade,\n 'v-icon-clock-outlined': Clock,\n 'v-icon-oriflame-symbol': Oriflame,\n 'v-icon-chart': Chart,\n 'v-icon-earnings': MyBenefits,\n};\n\nconst Root = styled(Box)(({ theme }) => ({\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(3),\n height: theme.spacing(6),\n}));\n\nexport const Icon: FC = ({ icon }) => {\n const { getTestIdProps } = useTestId();\n if (icon === null) {\n return null;\n }\n\n const iconKey = icon.replace(/ [\\w-]+/g, '');\n\n const MenuIcon = iconKey in mapping ? mapping[iconKey as keyof typeof mapping] : undefined;\n\n if (MenuIcon === undefined) {\n return null;\n }\n\n return (\n \n \n \n );\n};\n","import { ArrowRightThin } from '@ori-ui/icons';\nimport { type ButtonProps, Stack, styled } from '@ori-ui/mui';\nimport useTestId from '@ori/testid-generator';\nimport { useMemo } from 'react';\nimport type { FC } from 'react';\n\nimport type { ClickedItem, OnMenuClickCallback } from '../../models';\nimport type { MenuItem } from '../../schemas/menuItemSchema';\nimport { isCurrentLocation } from '../../utils/isCurrentLocation';\nimport { Icon } from './Icon';\n\ninterface AccordionMenuItemProps {\n menuItem: MenuItem;\n menuClickedItem: ClickedItem;\n onMenuClick: OnMenuClickCallback;\n isSubmenu?: boolean;\n}\n\nconst SubList = styled('ul', { shouldForwardProp: (prop) => prop !== 'isOpen' })<{\n isOpen?: boolean;\n}>(({ theme, isOpen = false }) => ({\n maxHeight: 0,\n margin: 0,\n padding: 0,\n overflow: 'hidden',\n transitionDuration: '0.2s',\n transitionTimingFunction: 'cubic-bezier(0, 1, 0.5, 1)',\n background: theme.palette.background.paper,\n listStyle: 'none',\n ...(isOpen && {\n maxHeight: theme.spacing(500),\n transitionDuration: '0.4s',\n transitionTimingFunction: 'ease-in',\n }),\n}));\n\nconst CustomLinkItem = styled('a', {\n shouldForwardProp: (prop) => prop !== 'hasIcon' && prop !== 'isActive',\n})<{\n hasIcon?: boolean;\n isActive?: boolean;\n}>(({ theme, hasIcon = false, isActive = false }) => ({\n display: 'block',\n position: 'relative',\n boxSizing: 'border-box',\n padding: theme.spacing(2, 3, 2, 0),\n overflow: 'hidden',\n color: theme.palette.grey[700],\n backgroundColor: 'transparent',\n fontSize: '15px',\n letterSpacing: '0.5px',\n textAlign: 'left',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n userSelect: 'none',\n ...(hasIcon\n ? {\n lineHeight: theme.spacing(6),\n fontWeight: 'bold',\n '&:hover': {\n color: theme.palette.grey[700],\n backgroundColor: theme.palette.grey[100],\n },\n ...(isActive && {\n backgroundColor: theme.palette.grey[100],\n }),\n }\n : {\n lineHeight: theme.spacing(4),\n '&:hover': {\n color: theme.palette.grey[400],\n },\n ...(isActive && {\n fontWeight: 'bold',\n }),\n }),\n}));\n\nconst CustomButton = styled('button', {\n shouldForwardProp: (prop) => prop !== 'isOpen' && prop !== 'isClicked' && prop !== 'hasIcon',\n})<{\n hasIcon?: boolean;\n isOpen?: boolean;\n isClicked?: boolean;\n}>(({ theme, hasIcon = false, isOpen = false, isClicked = false }) => ({\n display: 'flex',\n position: 'relative',\n justifyContent: 'space-between',\n boxSizing: 'border-box',\n padding: theme.spacing(0, 2, 0, 0),\n color: theme.palette.grey[700],\n backgroundColor: 'transparent',\n fontSize: '15px',\n letterSpacing: '0.5px',\n textAlign: 'left',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n userSelect: 'none',\n ...(hasIcon\n ? {\n fontWeight: 'bold',\n // eslint-disable-next-line @typescript-eslint/naming-convention -- this is the syntax\n ':hover': {\n backgroundColor: theme.palette.grey[100],\n cursor: 'pointer',\n },\n }\n : {\n '&:hover': {\n color: theme.palette.grey[400],\n },\n }),\n ...(isOpen &&\n !isClicked && {\n fontWeight: 'bold',\n }),\n ...(isOpen &&\n !hasIcon && {\n color: theme.palette.grey[700],\n }),\n}));\n\nconst Item = styled('li')(({ theme }) => ({\n borderBottom: `2px solid ${theme.palette.background.paper}`,\n listStyle: 'none',\n padding: 0,\n '& ul': {\n '& li': {\n marginLeft: theme.spacing(3),\n },\n },\n}));\n\nconst SubItem = styled(Item)({\n borderBottom: 'initial',\n});\n\nconst Text = styled('span')({\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n});\n\nconst Caret = styled(ArrowRightThin, {\n shouldForwardProp: (prop) => prop !== 'isOpen' && prop !== 'isSubmenu',\n})<{\n isOpen?: boolean;\n isSubmenu?: boolean;\n}>(({ isOpen = false, isSubmenu = false }) => ({\n transition: 'transform ease-in 0.3s',\n transform: `rotate(${isOpen ? 270 : 90}deg)`,\n fontSize: isSubmenu ? '1.8rem' : '2.4rem',\n}));\n\nexport const AccordionMenuItem: FC = ({\n menuItem,\n menuClickedItem,\n onMenuClick,\n isSubmenu = false,\n}) => {\n const { getTestId } = useTestId();\n const isOpen = useMemo((): boolean => {\n if (menuClickedItem.path === menuItem.itemPath) {\n return menuClickedItem.open;\n }\n\n return menuClickedItem.path.startsWith(menuItem.itemPath);\n }, [menuClickedItem, menuItem]);\n\n const handleItemClick: ButtonProps['onClick'] = (event) =>\n onMenuClick(event, {\n path: menuItem.itemPath,\n open: !isOpen,\n });\n\n let itemContent = null;\n let subItems = null;\n const ItemComponent = isSubmenu ? SubItem : Item;\n\n if (menuItem.subItems.length) {\n itemContent = (\n \n \n \n {menuItem.title}\n \n \n \n );\n\n subItems = (\n \n {menuItem.subItems.map((subitem) => (\n \n ))}\n \n );\n } else {\n itemContent = (\n \n \n \n {menuItem.title}\n \n \n );\n }\n\n return (\n \n {itemContent}\n {subItems}\n \n );\n};\n","import useTestId from '@ori/testid-generator';\nimport type { FC } from 'react';\n\nimport type { ClickedItem, OnMenuClickCallback } from '../../models';\nimport type { MenuItem } from '../../schemas/menuItemSchema';\nimport { AccordionMenuItem } from './AccordionMenuItem';\n\nexport interface AccordionMenuProps {\n menuItems: MenuItem[];\n menuClickedItem: ClickedItem;\n onMenuClick: OnMenuClickCallback;\n}\n\nexport const AccordionMenu: FC = ({ menuItems, menuClickedItem, onMenuClick }) => {\n const { getTestIdProps } = useTestId();\n\n return (\n \n {menuItems.map((item) => (\n \n ))}\n \n );\n};\n","/* istanbul ignore file */\n\n/**\n * DO NOT EDIT!\n * This file was autogenerated by npm script `localizations-codegen`.\n * Changes may cause incorrect behavior and will be lost when the file is regenerated.\n *\n * Run `npx localizations-codegen` to regenerate.\n */\nimport { FormattedMessage as NotTypedFormattedMessage, type FormattedMessageProps } from '@ori/i18n';\n\nimport type { DefaultTranslations } from '../constants/defaultTranslations';\n\n/**\n * Renders a formatted internationalized message using the provided translation data.\n *\n * @returns The FormattedMessage typed with keys within the specified namespace.\n */\nexport const FormattedMessage = (props: FormattedMessageProps) => (\n {...props} />\n);\n","/* istanbul ignore file */\n/**\n * DO NOT EDIT!\n * This file was autogenerated by npm script `localizations-codegen`.\n * Changes may cause incorrect behavior and will be lost when the file is regenerated.\n *\n * Run `npx localizations-codegen` to regenerate.\n */\n\nexport enum TranslationKey {\n Hello = 'Hello',\n SignOut = 'SignOut',\n UpgradeToBrandPartner = 'UpgradeToBrandPartner',\n UpgradeToConsultant = 'UpgradeToConsultant',\n}\n","import { useGetConfigurationDeprecated } from '@ori/mobile-office-api-client-react';\n\nimport { getFullNameFormat } from './getFullNameFormat';\n\nexport interface ConsultantNameFormatters {\n getFormattedConsultantName: (firstName: string | null, lastName: string | null) => string;\n getCapitalisedInitials: (firstName: string | null, lastName: string | null) => string;\n}\n\nexport const useConsultantNameFormatters = (): ConsultantNameFormatters => {\n const { data: configuration } = useGetConfigurationDeprecated();\n const fullNameFormat = getFullNameFormat(configuration);\n\n return {\n getFormattedConsultantName(firstName: string | null, lastName: string | null): string {\n return (\n fullNameFormat\n .replace('{FirstName}', firstName ?? '')\n .replace('{LastName}', lastName ?? '')\n // not supported formats should be cleaned\n .replace('{Greeting}', '')\n .replace('{Gender}', '')\n );\n },\n getCapitalisedInitials(firstName: string | null, lastName: string | null): string {\n return (\n fullNameFormat\n .replaceAll(' ', '')\n .replace('{FirstName}', (firstName ?? '').slice(0, 1).toUpperCase())\n .replace('{LastName}', (lastName ?? '').slice(0, 1).toUpperCase())\n // Gender or Greeting are ignored in initials\n .replace('{Greeting}', '')\n .replace('{Gender}', '')\n );\n },\n };\n};\n","import { styled } from '@ori-ui/mui';\nimport { GlobalApplicationsPersonalMenuPersonalMenuDtoUserType } from '@ori/global-api-client-react';\nimport type { FC } from 'react';\n\nimport { TranslationKey } from '../models/TranslationKey';\nimport type { User } from '../schemas/userSchema';\nimport { useConsultantNameFormatters } from '../utils/useConsultantNameFormatters';\nimport { FormattedMessage } from './FormattedMessage';\n\nexport interface PersonalizationProps {\n user: User;\n upgradeToConsultantUrl: string;\n upgradeToBrandPartnerUrl: string;\n}\n\nconst Container = styled('div')(({ theme }) => ({\n display: 'grid',\n boxSizing: 'border-box',\n gridTemplateColumns: '1fr',\n gridTemplateRows: `auto minmax(${theme.spacing(2)}, auto)`,\n width: '100%',\n borderBottom: `2px solid ${theme.palette.grey[100]}`,\n\n '& link': {\n display: 'block',\n padding: theme.spacing(2, 3, 2, 3),\n },\n}));\n\nconst Info = styled('div')(({ theme }) => ({\n alignSelf: 'center',\n padding: theme.spacing(2, 3, 2, 3),\n color: theme.palette.grey[900],\n fontSize: '12px',\n fontWeight: 'bold',\n}));\n\nconst Name = styled('span')(({ theme }) => ({\n display: 'block',\n overflow: 'hidden',\n fontSize: '18px',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}));\n\nconst Action = styled('div')(({ theme }) => ({\n padding: theme.spacing(0, 3, 3),\n}));\nconst Button = styled('a')(({ theme }) => ({\n display: 'block',\n boxSizing: 'border-box',\n width: '100%',\n height: theme.spacing(6),\n paddingTop: theme.spacing(1),\n borderRadius: theme.spacing(1),\n background: theme.palette.grey[100],\n color: theme.palette.grey[700],\n fontSize: '14px',\n fontWeight: 'bold',\n textAlign: 'center',\n}));\n\nexport const Personalisation: FC = ({\n user,\n upgradeToConsultantUrl,\n upgradeToBrandPartnerUrl,\n}) => {\n const { getFormattedConsultantName } = useConsultantNameFormatters();\n\n if (user.userType === GlobalApplicationsPersonalMenuPersonalMenuDtoUserType.Employee) {\n return null;\n }\n\n let upgradeToConsultant = null;\n\n if (user.userType === GlobalApplicationsPersonalMenuPersonalMenuDtoUserType.EndCustomer && upgradeToConsultantUrl) {\n upgradeToConsultant = (\n \n \n \n );\n }\n\n let upgradeToBrandPartner = null;\n if (user.userType === GlobalApplicationsPersonalMenuPersonalMenuDtoUserType.EndCustomer && upgradeToBrandPartnerUrl) {\n upgradeToBrandPartner = (\n \n \n \n );\n }\n\n return (\n \n \n ,\n
\n {getFormattedConsultantName(user.firstName, user.lastName)}\n
\n {upgradeToConsultant}\n {upgradeToBrandPartner}\n
\n );\n};\n","import type { MobileOfficeConfigurationMobileOfficeConfigurationDto } from '@ori/mobile-office-api-client-react';\n\nexport function getFullNameFormat(\n configuration: MobileOfficeConfigurationMobileOfficeConfigurationDto | undefined,\n): string {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- in this case its preffered\n return configuration?.customerConfiguration?.fullNameFormat || '{LastName} {FirstName}';\n}\n","import { Skeleton, styled } from '@ori-ui/mui';\nimport { memo } from 'react';\n\nimport { BREAKPOINT_HORIZONTAL_SIDEPANEL } from '../constants/breakpoints';\n\nconst MenuItem = styled('div')(({ theme }) => ({\n display: 'grid',\n gridTemplateColumns: `${theme.spacing(5)} 1fr`,\n gridTemplateRows: '1fr',\n gap: theme.spacing(0, 1),\n alignItems: 'center',\n width: '100%',\n}));\nconst MenuText = styled(Skeleton)(({ theme }) => ({\n margin: theme.spacing(2, 2, 2, 6),\n height: '33px',\n}));\nconst MenuIcon = styled(Skeleton)(({ theme }) => ({\n margin: theme.spacing(2, 2, 2, 3),\n height: theme.spacing(6),\n width: theme.spacing(6),\n}));\nconst Logout = styled('div')(({ theme }) => ({\n position: 'absolute',\n zIndex: 999,\n paddingBottom: theme.spacing(3),\n background: '#f0f3f0',\n display: 'grid',\n gridTemplateColumns: `${theme.spacing(5)} 1fr`,\n gridTemplateRows: '1fr',\n alignItems: 'center',\n width: '100%',\n bottom: 0,\n}));\nconst Root = styled('div')(({ theme }) => ({\n display: 'block',\n position: 'relative',\n top: 0,\n right: 0,\n left: 0,\n boxSizing: 'border-box',\n width: '100%',\n minWidth: theme.spacing(56),\n height: '100vh',\n maxHeight: `calc(100vh - ${theme.spacing(10)})`,\n overflow: 'hidden',\n backfaceVisibility: 'hidden',\n background: theme.palette.common.white,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- this is css variable naming\n '--scrollbar-minlength': theme.spacing(2),\n // eslint-disable-next-line @typescript-eslint/naming-convention -- this is css variable naming\n '--scrollbar-ff-width': 'thin',\n marginTop: theme.spacing(3),\n\n [theme.breakpoints.up(BREAKPOINT_HORIZONTAL_SIDEPANEL)]: {\n position: 'fixed',\n zIndex: 999,\n top: 'var(--top-nav-height)',\n right: 'unset',\n bottom: 0,\n left: 0,\n width: theme.spacing(56),\n maxWidth: theme.spacing(56),\n height: '100%',\n transition: 'unset',\n transitionProperty: 'unset',\n boxShadow: theme.shadows[2],\n },\n}));\n\nexport const SkeletonLoader = memo(() => (\n \n {Array.from({ length: 6 }, (_, key) => (\n \n \n \n \n ))}\n \n \n \n \n \n));\n","import { Logout } from '@ori-ui/icons';\nimport { styled, useMediaQuery } from '@ori-ui/mui';\nimport useTestId from '@ori/testid-generator';\nimport { type FC, useCallback, useEffect, useState } from 'react';\n\nimport { LocalizationItem } from '../constants/LocalizationItem';\nimport { BREAKPOINT_HORIZONTAL_SIDEPANEL } from '../constants/breakpoints';\nimport { useLogout } from '../hooks/useLogout';\nimport { useMenuItemsFilter } from '../hooks/useMenuItemsFilter';\nimport { usePersonalMenu, useSelectedMenuItem } from '../hooks/usePersonalMenu';\nimport type { ClickedItem } from '../models';\nimport { AccordionMenu } from './AccordionMenu';\nimport { FormattedMessage } from './FormattedMessage';\nimport { Personalisation } from './Personalisation';\nimport { SkeletonLoader } from './SkeletonLoader';\n\nconst Container = styled('div')(({ theme }) => ({\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n overflow: 'hidden',\n background: theme.palette.background.paper,\n boxShadow: theme.shadows[2],\n boxSizing: 'border-box',\n maxWidth: theme.spacing(66),\n backfaceVisibility: 'initial',\n transition: 'height var(--top-nav-height-animation),background-color 0.1s ease-in-out',\n zIndex: 999,\n '&::WebkitFontSmoothing': 'antialiased',\n '& a': {\n textDecoration: 'none',\n marginLeft: 0,\n },\n '& button': {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: theme.spacing(10),\n border: 'none',\n fontFamily: 'SansOri, Arial, Helvetica, sans-serif',\n cursor: 'pointer',\n '&:before': {\n marginRight: theme.spacing(3),\n fontSize: '27px',\n },\n },\n [theme.breakpoints.up(BREAKPOINT_HORIZONTAL_SIDEPANEL)]: {\n height: 'auto',\n position: 'fixed',\n top: 'var(--top-nav-height, 0)',\n bottom: 0,\n left: 0,\n width: theme.spacing(56),\n maxWidth: '100%',\n backfaceVisibility: 'initial',\n transition: 'unset',\n transitionProperty: 'unset',\n '& a': {\n textDecoration: 'none',\n },\n },\n '& ul': {\n margin: 0,\n padding: 0,\n },\n}));\n\nconst Scroller = styled('div')(({ theme }) => ({\n boxSizing: 'border-box',\n height: '100%',\n paddingTop: theme.spacing(3),\n overflow: 'hidden auto',\n overscrollBehavior: 'contain',\n WebkitOverflowScrolling: 'touch',\n MsOverflowStyle: '-ms-autohiding-scrollbar',\n scrollbarWidth: 'thin',\n scrollbarColor: theme.palette.grey[300],\n '&::-webkit-scrollbar': {\n width: '6px',\n },\n '&::-webkit-scrollbar-thumb': {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.grey[300],\n backgroundClip: 'border-box',\n WebkitBackgroundClip: 'border-box',\n '&:hover': {\n backgroundColor: theme.palette.grey[400],\n },\n '&:active': {\n backgroundColor: theme.palette.blueGrey[200],\n },\n '&:vertical': {\n minHeight: theme.spacing(2),\n },\n '&:horizontal': {\n minWidth: theme.spacing(2),\n },\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: 'transparent',\n },\n [theme.breakpoints.down(500)]: {\n '&::-webkit-scrollbar': {\n width: '3px',\n },\n '&::-webkit-scrollbar-thumb': {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.grey[300],\n },\n },\n}));\n\nconst Button = styled('button')(({ theme }) => ({\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n width: '100%',\n height: theme.spacing(10),\n padding: theme.spacing(2, 3),\n overflow: 'hidden',\n background: '#f0f3f0',\n boxShadow: theme.shadows[2],\n color: theme.palette.grey[700],\n fontSize: '15px',\n fontWeight: 'bold',\n letterSpacing: theme.spacing(0.1),\n cursor: 'pointer',\n userSelect: 'none',\n margin: 0,\n '&:before': {\n marginRight: theme.spacing(3),\n fontSize: '27px',\n },\n '&:hover': {\n background: '#e8ece8',\n boxShadow: theme.shadows[4],\n },\n}));\n\ndeclare global {\n interface Ori {\n vietnamELearning?: {\n updateMenuWithVietnam: () => void;\n };\n }\n}\n\nexport const PersonalMenuContent: FC = () => {\n const isDesktop = useMediaQuery(`(min-width:${BREAKPOINT_HORIZONTAL_SIDEPANEL}px)`);\n const logout = useLogout();\n const { getTestId } = useTestId();\n const [menuClickedItem, setMenuClickedItem] = useState({\n path: '',\n open: false,\n });\n\n const { data } = usePersonalMenu();\n const { user, items, hasSubitems } = data ?? {};\n const selectedPath = useSelectedMenuItem();\n\n const {\n filteredItems: menuItems,\n upgradeToConsultantUrl,\n upgradeToBrandPartnerUrl,\n } = useMenuItemsFilter(items ?? [], isDesktop);\n\n useEffect(() => {\n if (selectedPath) {\n setMenuClickedItem({\n path: selectedPath,\n open: true,\n });\n }\n }, [selectedPath]);\n\n const handleMenuClick = useCallback((event: React.SyntheticEvent, clickedItem: ClickedItem): void => {\n event.preventDefault();\n setMenuClickedItem(clickedItem);\n }, []);\n\n useEffect(() => {\n if (hasSubitems) {\n window.ori?.vietnamELearning?.updateMenuWithVietnam();\n }\n }, [hasSubitems]);\n\n // This will normally be handled with suspense instead and this serves as type cheing\n if (!data) {\n return ;\n }\n\n return (\n \n \n {!isDesktop && user ? (\n \n ) : null}\n \n \n \n {/* eslint-disable-next-line react/jsx-no-bind -- this is an Emotion style */}\n ({ marginRight: theme.spacing(3) })} />\n \n \n \n );\n};\n","import { useToken } from '@ori/auth';\nimport { TranslationsNamespaceProvider } from '@ori/i18n';\nimport { ErrorBoundary, LoggerProvider } from '@ori/logger';\nimport { Team, TestIdProvider } from '@ori/testid-generator';\nimport type { FC } from 'react';\nimport { Suspense } from 'react';\n\nimport { ApiProvider } from './components/ApiProvider';\nimport { PersonalMenuContent } from './components/PersonalMenuContent';\nimport { SkeletonLoader } from './components/SkeletonLoader';\nimport { APP_NAME } from './constants-generated';\nimport { translationsNamespace } from './constants/defaultTranslations';\nimport { ConfigurationProvider } from './contexts/configurationContext';\nimport { mainLogger } from './logger';\nimport type { AppConfiguration } from './models';\n\nexport interface PersonalMenuProps {\n configuration?: AppConfiguration;\n}\n\nexport const PersonalMenu: FC = ({ configuration }) => {\n const { isAnonymousUser, formattedToken } = useToken();\n\n if (isAnonymousUser || !formattedToken) {\n return ;\n }\n\n return (\n \n \n \n \n \n \n }>\n \n \n \n \n \n \n \n \n );\n};\n","/* istanbul ignore file */\n//\n// DO NOT EDIT!\n// This file was autogenerated by Eddie.\n// Changes may cause incorrect behavior and will be lost when the file is regenerated.\n//\n// Run `npx eddie update workspace` to regenerate.\n//\n\nexport const APP_NAME = 'personal-menu-app';\nexport const PACKAGE_NAME = '@ori/personal-menu-app';\nexport const TEAM_NAME = 'AcquisitionGrowth';\n\nexport const EMOTION_CACHE_KEY = `${APP_NAME}-emotion-cache-key`;\n\nexport const APP_ROOT_ELEMENT_ID = `personal-menu-root`;\n","import { Logger } from '@ori/logger';\n\nimport { PACKAGE_NAME, TEAM_NAME } from './constants-generated';\n\nexport const mainLogger = new Logger(PACKAGE_NAME, { teamName: TEAM_NAME });\n","import { useSyncExternalStore } from 'react';\n\nimport { APP_ROOT_ELEMENT_ID } from './constants-generated';\n\ninterface OutletsStore {\n /** Subscribe listener that is being executed once the value is changed */\n subscribe: (listener: () => void) => () => void;\n getSnapshot: () => Element[];\n}\n\n// All personal menu outlet selectors. Personal menu will render its content to these elements with React createPortal\nconst outletSelectors = [\n // This is old outlet that is rendered by the Online\n `#${APP_ROOT_ELEMENT_ID}`,\n // This is new version of outlet selector used by top-area\n '*[data-personal-menu-outlet]',\n];\nconst getPersonalMenuOutlets = () => [...document.querySelectorAll(outletSelectors.join(', '))];\n\nlet listeners: Array<() => void> = [];\n// Find all default outlets currently on the page\nlet outlets: Element[] = getPersonalMenuOutlets();\nconst observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.addedNodes.length) {\n outlets = getPersonalMenuOutlets();\n // Emit change event to all listeners\n for (const listener of listeners) {\n listener();\n }\n }\n }\n});\n\nobserver.observe(document.body, {\n childList: true,\n subtree: true,\n});\n\nconst store: OutletsStore = {\n subscribe(listener: () => void) {\n listeners = [...listeners, listener];\n\n return () => {\n listeners = listeners.filter((l) => l !== listener);\n };\n },\n getSnapshot() {\n return outlets;\n },\n};\n\nexport const useOutlets = () => useSyncExternalStore(store.subscribe, store.getSnapshot);\n","/* istanbul ignore file */\nimport { GlobalStyles, ThemeProvider } from '@ori-ui/mui';\nimport { UniversalTokenProvider, type UniversalTokenProviderProps, doDevelopmentLogin } from '@ori/auth';\nimport { parseClientAppConfig } from '@ori/client-app-config';\nimport type { PickClientAppDataConfigProps } from '@ori/client-app-config';\nimport { ServiceUrlsProvider, type ServiceUrlsProviderProps } from '@ori/configuration-manager';\nimport { type EnvironmentContext, EnvironmentProvider } from '@ori/environment';\nimport { TranslationsProvider } from '@ori/i18n';\nimport { LoggerProvider, ApplicationInsights, getClientApplicationInsightsConfig, ErrorBoundary } from '@ori/logger';\nimport { PersonalMenu, type PersonalMenuProps, defaultTranslationsWithNamespaces } from '@ori/personal-menu';\nimport { Team, TestIdProvider, type TestIdProviderProps } from '@ori/testid-generator';\nimport { type FC, type ComponentProps } from 'react';\nimport { createPortal } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\n\nimport { APP_NAME, APP_ROOT_ELEMENT_ID, EMOTION_CACHE_KEY } from './constants-generated';\nimport { mainLogger } from './logger';\nimport { useOutlets } from './useOutlets';\n\nconst logger = mainLogger.createChild('appRender');\n\n// Keep the casing accurate here!\ntype PersonalMenuInitialDataFromDataConfig = {\n CustomerFirstName: string;\n CustomerLastName: string;\n UserType: string;\n UserHash: string;\n Items: Array<{\n Title: string;\n Url: string;\n Icon: string;\n IsViewabled?: boolean;\n }>;\n UseCaching: boolean;\n OrderType: string;\n};\n\nconst parseTopAreaAppConfig = (config: string) =>\n parseClientAppConfig<\n PickClientAppDataConfigProps<\n | 'currentLanguage'\n | 'customerId'\n | 'globalApiUrl'\n | 'graphqlUrl'\n | 'graphqlNetUrl'\n | 'identityUrl'\n | 'staticApiUrl'\n | 'tenant'\n > & {\n mobileOfficeApiUrl: string;\n personalMenuInitialData?: PersonalMenuInitialDataFromDataConfig;\n consultantNumber?: string;\n consultantType?: number;\n }\n >(config, [\n 'currentLanguage',\n 'globalApiUrl',\n 'graphqlUrl',\n 'graphqlNetUrl',\n 'mobileOfficeApiUrl',\n 'staticApiUrl',\n 'tenant',\n ]);\n\nconst mapClientAppConfigToPersonalMenuConfiguration = (\n data: ReturnType,\n): NonNullable => {\n const { personalMenuInitialData, consultantType, consultantNumber } = data;\n const configuration: NonNullable = {\n consultantType,\n consultantNumber,\n };\n\n if (personalMenuInitialData) {\n const {\n CustomerFirstName: customerFirstName,\n CustomerLastName: customerLastName,\n OrderType,\n UseCaching: useCaching,\n UserHash,\n UserType,\n } = personalMenuInitialData;\n type InitialData = NonNullable['personalMenuInitialData']>;\n\n configuration.personalMenuInitialData = {\n // Items are not needed here\n items: [],\n orderType: OrderType as InitialData['orderType'],\n useCaching,\n userType: UserType as InitialData['userType'],\n userHash: UserHash,\n customerFirstName,\n customerLastName,\n };\n }\n\n return configuration;\n};\n\n/**\n * React app renderer that is used when app is used as a standalone app\n */\nexport async function render(rootElement: HTMLElement) {\n const { config = '' } = rootElement.dataset;\n // When rootElement is created it copies configuration from top-area cap root element\n const clientAppConfig = parseTopAreaAppConfig(config);\n const { customerId, identityUrl, tenant, currentLanguage, staticApiUrl } = clientAppConfig;\n\n // Initialize Application Insights in production\n if (process.env.NODE_ENV === 'production') {\n ApplicationInsights.initialize(getClientApplicationInsightsConfig());\n } else {\n // when using Requestly we do not want to load token\n // eslint-disable-next-line no-lonely-if -- thats okay\n if (process.env.REACT_APP_USE_REQUESTLY === '1') {\n // eslint-disable-next-line no-console -- wanted behavior\n console.log('USING REQUESTLY');\n } else {\n if (!identityUrl) {\n throw new Error('Missing Identity URL!');\n }\n\n await doDevelopmentLogin({ identityUrl, tenant });\n }\n }\n\n const environmentProviderProps: EnvironmentContext = {\n tenant,\n };\n const serviceUrlsProviderProps: ServiceUrlsProviderProps = {\n serviceUrls: clientAppConfig,\n };\n const universalTokenProviderProps: UniversalTokenProviderProps = {\n customerId,\n initialToken: '',\n };\n const testIdProviderProps: TestIdProviderProps = {\n team: Team.AcquisitionGrowth,\n project: APP_NAME,\n };\n const translationsProviderProps: Omit, 'children'> = {\n currentLanguage,\n defaultTranslationsWithNamespaces,\n clientFetchConfiguration: {\n baseUrl: staticApiUrl,\n onError: (cause: unknown) => logger.error(new Error('Error occured while loading translations', { cause })),\n tenant,\n },\n };\n\n const personalMenuConfiguration: PersonalMenuProps['configuration'] =\n mapClientAppConfigToPersonalMenuConfiguration(clientAppConfig);\n\n const ContentComponent: FC = () => {\n const outlets = useOutlets();\n\n const content = (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ({\n [theme.breakpoints.down(1024)]: {\n // Hide sidemenu on mobile as menu is in burger menu on mobile\n [`#${APP_ROOT_ELEMENT_ID}`]: {\n display: 'none',\n },\n },\n })}\n />\n \n );\n\n return (\n <>\n {content}\n {outlets.map((element) => createPortal(content, element))}\n \n );\n };\n createRoot(rootElement).render();\n}\n"],"names":["translationsNamespace","defaultTranslationsWithNamespaces","Hello","SignOut","UpgradeToBrandPartner","UpgradeToConsultant","swrConfig","errorRetryCount","errorRetryInterval","focusThrottleInterval","shouldRetryOnError","suspense","ApiProvider","children","formattedToken","useToken","language","useLanguage","tenant","useEnvironment","mobileOfficeApiUrl","globalApiUrl","useServiceUrls","_jsx","SWRConfig","value","MobileOfficeApiClientProvider","baseUrl","token","timeout","GlobalApiClientProvider","LocalizationItem","BREAKPOINT_HORIZONTAL_SIDEPANEL","SESSION_STORAGE_KEY_PREFIX","showLogoutModal","clearAllSessionStorageKeys","key","Object","entries","sessionStorage","startsWith","removeItem","userLogoutRequestEvent","CustomEvent","UserLogoutRequestEvent","window","dispatchEvent","UPGRADE_TO_CONSULTANT_KEY","UPGRADE_TO_BRAND_PARTNER_KEY","filterMenuItems","items","isDesktop","filter","x","url","includes","findUrl","menuItems","find","configurationContext","createContext","ConfigurationProvider","Provider","APP_NAME","mainLogger","Logger","teamName","menuItemSchema","z","object","itemPath","string","title","nullish","icon","openInNewTab","boolean","isViewable","extend","subItems","lazy","array","userSchema","firstName","nullable","lastName","userType","nativeEnum","GlobalApplicationsPersonalMenuPersonalMenuDtoUserType","userHash","createSessionStorageKey","parts","undefined","join","QUERYSTRING_IFRAMEURL","trailingSlashRegex","removeTrailingSlash","replace","isCurrentLocation","queryStringIndex","indexOf","cleanUrl","slice","document","location","pathname","currentIframeUrl","param","URLSearchParams","search","get","urlSearch","findSelectedPath","item","length","selectedPath","mapCustomerMenuToInternalMenuItems","parentItemPath","reduce","accumulatedValue","index","mappedItem","push","mapOrisalesToInternalMenuItems","map","hasSubitems","name","inNewTab","findSameNodeIndex","currentMenu","newMenuNode","findIndex","currentMenuNode","trim","toLowerCase","setupSubItemsItemPaths","i","subItem","mergeToNode","newMenu","rootItemUrl","consultantType","reportsItemName","relatedNodeIndex","parentNode","logger","createChild","Storage","constructor","schema","_defineProperty","this","set","setItem","JSON","stringify","valueFromStorage","getItem","validated","safeParse","parse","success","data","error","Error","issues","format","clear","withSessionStorageCache","options","functionToBeCached","keyOrKeyAsFunction","storage","async","parameters","lastArgument","at","isCachingPaused","pauseCaching","cachedValue","uncachedValue","Promise","resolve","getUserFromPersonalMenu","customerLastName","customerFirstName","getUserCached","customerId","orderType","initialData","globalApiClient","userFromInitialData","getCustomerMenu","String","rootLevelOnly","userFromMenu","getCustomerMenuItemsCached","customerMenu","getCustomerOrisalesMenuCached","consultantNumber","canFetchOrisalesMenu","Consultant","isOrisalesAvailable","getApplicationsPersonalMenuOrisalesMenu","params","distNum","locale","usePersonalMenu","configuration","useContext","useGlobalApiClient","useSWR","currentLanguage","currentCustomerId","currentConfiguration","personalMenuInitialData","useCaching","user","customerMenuItems","orisalesMenuItems","cause","menuItemsWithOrisales","mergeOrisalesWithPersonalMenuItems","personalMenuItems","result","relatedRootIndex","parentUrl","rootItemStr","replaceAll","_","encodedParam","encodeURIComponent","adjustedNode","refreshInterval","revalidateOnFocus","revalidateIfStale","revalidateOnReconnect","mapping","Dashboard","Sales","WhatsNew","BoxIcon","Network","Academy","NewUser","Favourite","Message","Settings","Upgrade","Clock","Oriflame","Chart","MyBenefits","Root","styled","Box","theme","paddingLeft","spacing","paddingRight","height","Icon","getTestIdProps","useTestId","iconKey","MenuIcon","sx","fontSize","SubList","shouldForwardProp","prop","isOpen","maxHeight","margin","padding","overflow","transitionDuration","transitionTimingFunction","background","palette","paper","listStyle","CustomLinkItem","hasIcon","isActive","display","position","boxSizing","color","grey","backgroundColor","letterSpacing","textAlign","textOverflow","whiteSpace","userSelect","lineHeight","fontWeight","CustomButton","isClicked","justifyContent","cursor","Item","borderBottom","marginLeft","SubItem","Text","Caret","ArrowRightThin","isSubmenu","transition","transform","AccordionMenuItem","menuItem","menuClickedItem","onMenuClick","getTestId","useMemo","path","open","handleItemClick","event","itemContent","ItemComponent","_jsxs","Boolean","onClick","Stack","direction","subitem","href","target","AccordionMenu","FormattedMessage","props","NotTypedFormattedMessage","TranslationKey","Container","gridTemplateColumns","gridTemplateRows","width","Info","alignSelf","Name","Action","Button","paddingTop","borderRadius","Personalisation","upgradeToConsultantUrl","upgradeToBrandPartnerUrl","getFormattedConsultantName","useConsultantNameFormatters","useGetConfigurationDeprecated","fullNameFormat","customerConfiguration","getFullNameFormat","getCapitalisedInitials","toUpperCase","Employee","upgradeToConsultant","EndCustomer","id","upgradeToBrandPartner","MenuItem","gap","alignItems","MenuText","Skeleton","Logout","zIndex","paddingBottom","bottom","top","right","left","minWidth","backfaceVisibility","common","white","marginTop","breakpoints","up","maxWidth","transitionProperty","boxShadow","shadows","SkeletonLoader","memo","Array","from","animation","variant","flexDirection","textDecoration","border","fontFamily","marginRight","Scroller","overscrollBehavior","WebkitOverflowScrolling","MsOverflowStyle","scrollbarWidth","scrollbarColor","backgroundClip","WebkitBackgroundClip","blueGrey","minHeight","down","flexGrow","PersonalMenuContent","useMediaQuery","logout","setMenuClickedItem","useState","useSelectedMenuItem","filteredItems","useMenuItemsFilter","useEffect","handleMenuClick","useCallback","clickedItem","preventDefault","ori","vietnamELearning","updateMenuWithVietnam","type","PersonalMenu","isAnonymousUser","LoggerProvider","ErrorBoundary","areaName","TestIdProvider","team","Team","Growth","project","TranslationsNamespaceProvider","namespace","Suspense","fallback","EMOTION_CACHE_KEY","APP_ROOT_ELEMENT_ID","outletSelectors","getPersonalMenuOutlets","querySelectorAll","listeners","outlets","MutationObserver","mutations","mutation","addedNodes","listener","observe","body","childList","subtree","store","subscribe","l","getSnapshot","useOutlets","useSyncExternalStore","parseTopAreaAppConfig","config","parseClientAppConfig","mapClientAppConfigToPersonalMenuConfiguration","CustomerFirstName","CustomerLastName","OrderType","UseCaching","UserHash","UserType","render","rootElement","dataset","clientAppConfig","identityUrl","staticApiUrl","ApplicationInsights","initialize","getClientApplicationInsightsConfig","environmentProviderProps","serviceUrlsProviderProps","serviceUrls","universalTokenProviderProps","initialToken","testIdProviderProps","AcquisitionGrowth","translationsProviderProps","clientFetchConfiguration","onError","personalMenuConfiguration","ContentComponent","content","ThemeProvider","cacheKey","EnvironmentProvider","ServiceUrlsProvider","UniversalTokenProvider","TranslationsProvider","GlobalStyles","styles","_Fragment","element","createPortal","createRoot"],"sourceRoot":""}