{"version":3,"file":"static/chunks/2369.b85faf71314ade5d.js","mappings":"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","sources":["webpack://_N_E/./core--client--components/src/lib/constants/accents.ts","webpack://_N_E/./core--client--components/src/lib/hooks/accentContext/AccentContext.tsx","webpack://_N_E/./core--client--components/src/lib/hooks/overlayContext/OverlayContext.tsx","webpack://_N_E/./src/lib/hooks/shelterDashboard/usePushAwoDataForInternalClickTracking.ts","webpack://_N_E/./src/components/layouts/ProviderLayout/ProviderLayout.tsx","webpack://_N_E/./src/lib/dataSource/auth/getIdToken.ts","webpack://_N_E/./src/lib/dataSource/lostApi/auth/me.ts","webpack://_N_E/./src/lib/dataSource/lostApi/common.ts","webpack://_N_E/./src/lib/constants/constants/storage.ts","webpack://_N_E/./src/lib/storageClasses/analyticsEventStorage.ts","webpack://_N_E/./src/lib/hooks/analytics/useEventContext.tsx","webpack://_N_E/./src/lib/hooks/useStorybookAuth/StorybookAuth.tsx","webpack://_N_E/./src/lib/hooks/me/useMe.ts","webpack://_N_E/./src/lib/hooks/persistentBanner/PersistentBanner.tsx","webpack://_N_E/./src/lib/hooks/shelterDashboard/ShelterLocation.tsx","webpack://_N_E/./src/lib/hooks/shelterReferral/useReferral.tsx","webpack://_N_E/./src/lib/hooks/shelterReferral/ShelterReferral.tsx","webpack://_N_E/./src/lib/hooks/toasts/Toast.tsx","webpack://_N_E/./src/lib/dataSource/lostApi/chat/conversations/totalUnread.ts","webpack://_N_E/./src/lib/hooks/userContext/UserContext.tsx","webpack://_N_E/./src/lib/utils/helpers/dateHelpers/dates.ts","webpack://_N_E/./src/lib/utils/storage/local-storage.ts","webpack://_N_E/./src/lib/utils/helpers/ObjectsHelpers/getExpirationDate.ts","webpack://_N_E/./src/lib/utils/helpers/stringHelpers/parseToJSONSafe.ts","webpack://_N_E/./src/lib/utils/storage/session-storage.ts","webpack://_N_E/<anon>"],"sourcesContent":["/**\n * The Type of Accent\n */\nexport type AccentProps = 'org' | 'adopt' | 'care';\n/**\n * The Key of Accent\n */\ntype AccentKeys = 'ORG' | 'ADOPT' | 'CARE';\n\nexport const accentProps: Record<AccentKeys, AccentProps> = {\n ORG: 'org',\n ADOPT: 'adopt',\n CARE: 'care',\n};\n","/**\n * This file contains the context object for the accent value. The accent value\n * is used to introduce variations to components styling in a global way to\n * ensure consistency, and to avoid prop drilling. We currently have 3 main\n * accents: care, adopt and org/lost\n */\nimport {\n AccentProps,\n accentProps,\n} from '@/component-library-lib/constants/accents';\nimport { createContext, useContext, useState } from 'react';\n\n/** The context object for the accent value */\ntype AccentValueProps = {\n /** The current accent value */\n accent: AccentProps;\n /** Update the accent value */\n updateAccent: (newAccent: AccentProps) => void;\n};\n\nexport const AccentContext = createContext<AccentValueProps | null>(null);\n\n/**\n * Custom hook to access the current accent value from the AccentContext.\n *\n * @returns {string} - The current accent value.\n */\nexport const useAccent = () => {\n const currentAccentContext = useContext(AccentContext);\n if (!currentAccentContext) {\n throw new Error('useAccent must be used within an AccentProvider');\n }\n return currentAccentContext;\n};\n\n/**\n * The AccentProvider component\n *\n * @param {object} props - The properties passed to the component.\n * @param {React.ReactNode} props.children - The child components.\n * @param {AccentProps} props.defaultAccent - The default accent value.\n * @returns {React.ReactNode} The rendered component.\n */\nconst AccentProvider: React.FC<\n React.PropsWithChildren & {\n /** The default accent value */\n defaultAccent?: AccentProps;\n }\n> = ({ children, defaultAccent }) => {\n // State to hold the current accent value\n const [accent, setAccent] = useState<AccentProps>(\n defaultAccent || accentProps.ORG\n );\n\n /**\n * Updates the accent value.\n *\n * @param {string} newAccent - The new accent value.\n * @returns {void}\n */\n const updateAccent = (newAccent: AccentProps) => {\n setAccent(newAccent);\n };\n\n // Value object to be passed to the context provider\n const accentValue: AccentValueProps = {\n accent,\n updateAccent,\n };\n\n return (\n // Provide the AccentContext with the accentValue\n <AccentContext.Provider value={accentValue}>\n {children}\n </AccentContext.Provider>\n );\n};\n\nexport default AccentProvider;\n","import { createContext, useContext, useState } from 'react';\n\n/** The context object for the overlay value */\ntype OverlayValueProps = {\n /** The current overlay value */\n show: boolean;\n /** Update the overlay value */\n updateShow: (newOverlay: boolean) => void;\n};\n\n// @ts-expect-error: runtime error is preferred here to make it obvious we're missing a provider\nexport const OverlayContext = createContext<OverlayValueProps>(null);\n\n/**\n * Custom hook to access the current overlay value from the OverlayContext.\n *\n * @returns {boolean} - The current overlay value.\n */\nexport const useOverlay = () => {\n const currentOverlayContext = useContext(OverlayContext);\n if (!currentOverlayContext) {\n throw new Error('useOverlay must be used within an OverlayProvider');\n }\n return currentOverlayContext;\n};\n\n/**\n * Generates a function comment for the given function body.\n *\n * @param {object} props - The properties passed to the component.\n * @param {React.ReactNode} props.children - The child components.\n * @param {boolean} props.defaultOverlay - The default overlay value.\n * @returns {React.ReactNode} The rendered component.\n */\nconst OverlayProvider: React.FC<\n React.PropsWithChildren & {\n /** The default overlay value */\n defaultOverlay?: boolean;\n }\n> = ({ children, defaultOverlay }) => {\n // State to hold the current overlay value\n const [show, setShow] = useState<boolean>(defaultOverlay || false);\n\n /**\n * Updates the overlay value.\n *\n * @param {string} newOverlay - The new overlay value.\n * @returns {void}\n */\n const updateShow = (newOverlay: boolean) => {\n setShow(newOverlay);\n };\n\n // Value object to be passed to the context provider\n const overlayValue: OverlayValueProps = {\n show,\n updateShow,\n };\n\n return (\n // Provide the OverlayContext with the overlayValue\n <OverlayContext.Provider value={overlayValue}>\n {children}\n </OverlayContext.Provider>\n );\n};\n\nexport default OverlayProvider;\n","import { useRouter } from 'next/router';\nimport { useEffect } from 'react';\nimport { useShelterLocationContext } from './ShelterLocation';\n\n/**\n * Pushes awo data to the dataLayer for internal click tracking purposed.\n *\n * This should run on page load and when the location is changed.\n *\n * @returns {void}\n */\nexport function usePushAwoDataForInternalClickTracking() {\n const router = useRouter();\n const { selectedShelter } = useShelterLocationContext();\n\n const orgName = selectedShelter?.name;\n const awoId = selectedShelter?.id;\n\n useEffect(() => {\n const dataLayer = getDatalayerInstance();\n\n if (!router.pathname.startsWith('/shelter-dashboard')) {\n return;\n }\n\n if (orgName && awoId) {\n dataLayer.push({\n org_name: orgName,\n awo_id: awoId,\n });\n }\n }, [orgName, awoId, router.pathname]);\n}\n\n/**\n * Gets the dataLayer instance.\n *\n * @returns {object[]} The dataLayer instance.\n */\nexport function getDatalayerInstance() {\n window.dataLayer = window.dataLayer || [];\n\n const dataLayer = window.dataLayer;\n\n return dataLayer;\n}\n","import AccentProvider from '@/component-library-lib/hooks/accentContext/AccentContext';\nimport OverlayProvider from '@/component-library-lib/hooks/overlayContext/OverlayContext';\nimport { EventContextProvider } from '@/lib/hooks/analytics/useEventContext';\nimport { PersistentBannerProvider } from '@/lib/hooks/persistentBanner/PersistentBanner';\nimport { ShelterLocationProvider } from '@/lib/hooks/shelterDashboard/ShelterLocation';\nimport { usePushAwoDataForInternalClickTracking } from '@/lib/hooks/shelterDashboard/usePushAwoDataForInternalClickTracking';\nimport { ShelterReferralProvider } from '@/lib/hooks/shelterReferral/ShelterReferral';\nimport { ToastProvider } from '@/lib/hooks/toasts/Toast';\nimport { UserContextProvider } from '@/lib/hooks/userContext/UserContext';\nimport getBasePath from '@/lib/utils/getBasePath/getBasePath';\nimport CookieStorage from '@/lib/utils/storage/cookie-storage';\nimport { UserProvider } from '@auth0/nextjs-auth0/client';\nimport { createInstance, OptimizelyProvider } from '@optimizely/react-sdk';\nimport { ReactNode } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * IProviderLayout\n *\n * @interface IProviderLayout\n */\nexport interface IProviderLayout {\n /**\n * Content of the Layout\n *\n * @memberof IProviderLayout\n * @member {ReactNode} children\n */\n children: ReactNode;\n}\n\nconst optimizelyClient = createInstance({\n datafile: require('@/lib/utils/featureFlags/optimizely/datafile.json'),\n eventBatchSize: 1,\n eventFlushInterval: 1000,\n logLevel: 4,\n});\n\nconst cookies = new CookieStorage();\n\nconst clientSetUserIdKeyCookie = cookies\n .get('feature-flag-user-id')\n ?.toString();\n// Get the user id from the cookies\nconst userId = clientSetUserIdKeyCookie || uuidv4();\n\nif (!clientSetUserIdKeyCookie) {\n cookies.set('feature-flag-user-id', userId);\n}\n\n/**\n * Handles pushing data to the dataLayer for internal click tracking of the\n * Shelter Dashboard.\n *\n * @returns {null} Doesn't return anything.\n */\nfunction ShelterDashboardInternalClickTracking() {\n usePushAwoDataForInternalClickTracking();\n\n return null;\n}\n\n/**\n * Provider Layout Used to provide all required top level providers to the\n * application\n *\n * @param {IProviderLayout} props - The props for the ProviderLayout component.\n * @returns {React.FC<IProviderLayout>} ProviderLayout Component\n */\nconst ProviderLayout: React.FC<IProviderLayout> = ({\n children,\n}: IProviderLayout) => {\n return (\n <UserProvider profileUrl={`${getBasePath()}/api/auth/me`}>\n <OptimizelyProvider\n optimizely={optimizelyClient}\n user={{ id: userId }}\n isServerSide={true}\n >\n <UserContextProvider>\n <PersistentBannerProvider>\n <EventContextProvider>\n <ToastProvider>\n <OverlayProvider defaultOverlay={false}>\n <AccentProvider>\n <ShelterReferralProvider>\n <ShelterLocationProvider>\n {children}\n <ShelterDashboardInternalClickTracking />\n </ShelterLocationProvider>\n </ShelterReferralProvider>\n </AccentProvider>\n </OverlayProvider>\n </ToastProvider>\n </EventContextProvider>\n </PersistentBannerProvider>\n </UserContextProvider>\n </OptimizelyProvider>\n </UserProvider>\n );\n};\n\nexport default ProviderLayout;\n","import getBasePath from '@/lib/utils/getBasePath/getBasePath';\nimport { getSession } from '@auth0/nextjs-auth0';\nimport { NextApiRequest, NextApiResponse } from 'next';\n\n/**\n * Get the idToken from the session for the current user. This can be used to\n * authenticate api calls. This should be used in the client side code.\n *\n * @returns {Promise<string>} - The idToken for the current user.\n */\nexport const getIdTokenClient = async (): Promise<string> => {\n try {\n /** Fetch the session from the api. */\n const response = await fetch(`${getBasePath()}/api/auth/session/`);\n /** Get the JSON from the response. */\n const jsonResponse = await response.json();\n return Promise.resolve(jsonResponse.session.idToken);\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\n/**\n * Get the idToken from the session for the current user. This can be used to\n * authenticate backend api calls. This should be used in the server side code.\n *\n * @param {NextApiRequest} req - The request object.\n * @param {NextApiResponse} res - The response object.\n * @returns {string | null} The idToken for the current user.\n */\nexport const getIdTokenSSR = async (\n req: NextApiRequest,\n res: NextApiResponse\n): Promise<string | null> => {\n try {\n /** Fetch the session from the api. */\n const session = await getSession(req, res);\n if (session && session.idToken) {\n return session.idToken;\n }\n return null;\n } catch (error) {\n return null;\n }\n};\n","import { sdk } from '@/lib/dataSource/lostApi/common';\nimport { IServiceMethodResponse } from '@petcolove/lost--client--api-sdk/dist/abstract/service/interfaces';\nimport { IMeDto } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/auth/dto';\n\n/**\n * @param {string} authToken - This is the auth token for the current user\n * @returns {Promise<IMeDto>} The details of the current user\n */\nexport default async function getMe(authToken: string): Promise<IMeDto> {\n try {\n const me: IServiceMethodResponse = await sdk\n .me({ authToken: authToken })\n .read();\n const data = me.data as IMeDto;\n return data;\n } catch (error) {\n console.error(error);\n throw error;\n }\n}\n","import { PetcoLoveSDK } from '@petcolove/lost--client--api-sdk';\n\n/**\n * Initialize the SDK\n *\n * @returns {PetcoLoveSDK} The SDK instance\n */\nexport function initSDK(): PetcoLoveSDK {\n /**\n * The PLL API base URL\n *\n * @constant {string | undefined} pllApiBaseUrl\n */\n const pllApiBaseUrl =\n process.env.NEXT_PUBLIC_PLL_API_BASE_URL ??\n process.env.STORYBOOK_PLL_API_BASE_URL;\n /**\n * The PLL Websocket base URL\n *\n * @constant {string | undefined} pllWebsocketBaseUrl\n */\n const pllWebsocketBaseUrl =\n process.env.NEXT_PUBLIC_PLL_WEBSOCKET_BASE_URL ??\n process.env.STORYBOOK_PLL_WEBSOCKET_BASE_URL;\n\n if (!pllApiBaseUrl) {\n throw new Error('NEXT_PUBLIC_PLL_API_BASE_URL is not defined');\n }\n\n if (!pllWebsocketBaseUrl) {\n throw new Error('NEXT_PUBLIC_PLL_WEBSOCKET_BASE_URL is not defined');\n }\n\n const sdk = new PetcoLoveSDK(pllApiBaseUrl, pllWebsocketBaseUrl);\n\n return sdk;\n}\n\nexport const sdk: PetcoLoveSDK = initSDK();\n","import { tomorrow } from '@/lib/utils/helpers/dateHelpers/dates';\n\n/**\n * The default expiration date\n *\n * @constant {Date}\n */\nexport const defaultExpirationDate: Date = tomorrow;\n","import { notApplicableString } from '@/lib/constants/constants/analytics';\nimport { defaultExpirationDate } from '@/lib/constants/constants/storage';\nimport { EventData } from '@/lib/hooks/analytics/useEventContext';\nimport { tomorrow } from '@/lib/utils/helpers/dateHelpers/dates';\nimport LocalStorage from '@/lib/utils/storage/local-storage';\n\n/**\n * The valid type for the initiating component param\n *\n * @type {AnalyticsInitiatingComponent}\n */\nexport type AnalyticsInitiatingComponent =\n | 'I Lost A Pet Button / Homepage'\n | 'I Found A Pet Button / Homepage'\n | 'I Lost A Pet Footer Link / All Pages'\n | 'I Found A Pet Footer Link / All Pages'\n | 'Search All Pets Link / Homepage'\n | 'Search All Pets Link / How To Help Page'\n | 'Search All Pets Button / How To Help Page'\n | 'Sign Up Button / All Pages'\n | 'Search Persistent Banner / All Pages'\n | 'I Found A Pet Button / Shelter Dashboard'\n | 'I Found A Pet Button / Shelter Homepage'\n | 'Search Button / User Dashboard'\n | 'Photo Search Chip / Search Results Page'\n | 'Microchip Search Chip / Search Results Page'\n | 'Distance Search Chip / Search Results Page'\n | 'Photo Search Button / Search Results Page'\n | 'Microchip Search Button / Search Results Page'\n | 'Distance Search Button / Search Results Page'\n | 'Photo Search Link / Search Results Page'\n | 'Microchip Search Link / Search Results Page'\n | 'Distance Search Link / Search Results Page'\n | 'Search By Microchip Link / Lost and Found Tips Page'\n | 'Contact Pet Finder Button'\n | 'Contact Pet Parent Button'\n | 'View Reported Pets Near Me / Alert Matches Page'\n | 'View Matches Button / Shelter Pets Page'\n | 'View Matches Button / Shelter Pet Profile'\n | 'Card Header Link / Photo Search Results Page / Lost'\n | 'Card Header Link / Photo Search Results Page / Found'\n | 'Card Header Link / Distance Search Results Page / Lost'\n | 'Card Header Link / Distance Search Results Page / Found'\n | 'Card Header Link / Microchip Search Results Page / Lost'\n | 'Card Header Link / Microchip Search Results Page / Found'\n | 'Card Header Link / Distance Search Results Page / All'\n | 'Card Header Link / Distance Search Results Map / Lost'\n | 'Card Header Link / Distance Search Results Map / Found'\n | 'Card Header Link / Distance Search Results Map / All'\n | 'Add Pet Button / User Dashboard / Lost'\n | 'Add Pet Button / User Dashboard / Found'\n | 'Report as Lost Button / User Dashboard / Lost'\n | 'Map View Icon'\n | 'List View Icon'\n | typeof notApplicableString;\n\n/**\n * The initiating component data\n *\n * @interface IAnalyticsInitiatingComponentData\n */\ninterface IAnalyticsInitiatingComponentData {\n /** The initiating component */\n component: AnalyticsInitiatingComponent;\n /** The data expiration date */\n expiration: Date;\n}\n\n/**\n * AnalyticsEventStorage class, this is used to store the analytics event\n * information that is not present in the context of certain pages\n *\n * @class AnalyticsEventStorage\n */\nexport class AnalyticsEventStorage {\n /** The session storage instance */\n private readonly analyticsEventStorage = new LocalStorage();\n\n /** The key to store the analytics event data under */\n private readonly analyticsEventStorageKey = 'analyticsEvent';\n\n private readonly initiatingComponentKey = 'initiatingAnalyticsComponent';\n\n /**\n * Set data in session storage\n *\n * @param {EventData} analyticsEvent - The analytics event object to store\n */\n public set = (analyticsEvent: EventData) => {\n this.analyticsEventStorage.set(\n this.analyticsEventStorageKey,\n analyticsEvent,\n { expires: tomorrow }\n );\n };\n\n /**\n * Get data from session storage\n *\n * @returns {EventData | null} The analytics event object\n */\n public get = (): EventData | null => {\n return this.analyticsEventStorage.get(\n this.analyticsEventStorageKey\n ) as EventData;\n };\n\n /** Delete data from session storage */\n public delete = () => {\n this.analyticsEventStorage.delete(this.analyticsEventStorageKey);\n };\n\n /**\n * Set the initiating component\n *\n * @param {string} component - The initiating component\n */\n public setInitiatingComponent = (component: AnalyticsInitiatingComponent) => {\n this.analyticsEventStorage.set(\n this.initiatingComponentKey,\n { component },\n { expires: defaultExpirationDate }\n );\n };\n\n /**\n * Retrieve the initiating component\n *\n * @constant {AnalyticsInitiatingComponent} initiatingComponent\n * @returns {AnalyticsInitiatingComponent} The initiating component\n */\n public getInitiatingComponent = (): AnalyticsInitiatingComponent => {\n /**\n * The analytics initiating component data\n *\n * @constant {IAnalyticsInitiatingComponentData} data\n */\n const data = this.analyticsEventStorage.get(\n this.initiatingComponentKey\n ) as IAnalyticsInitiatingComponentData;\n /**\n * The initiating component\n *\n * @constant {AnalyticsInitiatingComponent} component\n */\n const component = data?.component;\n\n if (component) {\n return component;\n }\n\n return 'NA';\n };\n}\n","import { notApplicableString } from '@/lib/constants/constants/analytics';\nimport { PetStatus } from '@/lib/constants/types/analytics';\nimport {\n AnalyticsEventStorage,\n AnalyticsInitiatingComponent,\n} from '@/lib/storageClasses/analyticsEventStorage';\nimport { PetFlowType } from '@/lib/utils/analytics/petSearch';\nimport {\n ReactNode,\n createContext,\n useCallback,\n useContext,\n useMemo,\n} from 'react';\n\n/**\n * The data structure for the event data, we can add more properties as needed\n *\n * @interface EventData\n */\nexport interface EventData {\n /** The method behind the operation */\n method?: string;\n /** The status of the pet (Lost, Found, Safe at Home) */\n petStatus?: PetStatus;\n /** The text on the button that was clicked to get to this event */\n clickText?: string;\n /** The id of the pet entity */\n petId?: number;\n /** The name of the pet */\n petName?: string;\n /** The zip code associated with the pet */\n locationId?: string;\n /** The species of the pet */\n species?: string;\n /** The start date of the search */\n start?: string | null;\n /** The flow type */\n flowType?: PetFlowType;\n}\n\n/** This is the data structure that can be returned from the provider */\nexport interface IEventContext {\n /** This is the method for updating the data */\n updateData: (newData: EventData) => void;\n /** This is the method for clearing the data */\n clearData: () => void;\n /** Get data */\n getData: () => EventData | undefined;\n /** Set the initiating component state */\n setInitiatingComponent: (component: AnalyticsInitiatingComponent) => void;\n /** The initiating component */\n getInitiatingComponent: () => AnalyticsInitiatingComponent;\n /** Get the pet id */\n getPetId: () => number | undefined;\n}\n\n/**\n * The default event context\n *\n * @constant {IEventContext} defaultEventContext\n */\nexport const defaultEventContext: IEventContext = {\n /** This method is used to update the data */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n updateData: () => {},\n /**\n * This method is used to get the data\n *\n * @returns {undefined} - The data\n */\n getData: () => undefined,\n /** This method is used to clear the data */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n clearData: () => {},\n /** Set the initiating component state */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setInitiatingComponent: () => {},\n /**\n * The default initiating component\n *\n * @returns {string} - The initiating component\n */\n getInitiatingComponent: (): AnalyticsInitiatingComponent =>\n notApplicableString,\n /**\n * The default pet id\n *\n * @returns {number | undefined} - The pet id\n */\n getPetId: () => undefined,\n};\n\n/** This is the context */\nconst EventContext = createContext<IEventContext>(defaultEventContext);\n\n/**\n * The interface for the EventContextProvider props\n *\n * @interface\n */\ninterface IEventContextProvider {\n /** The children wrapped by the provider */\n children: ReactNode;\n}\n\n/**\n * The EventContextProvider component.\n *\n * @param {IEventContextProvider} props - The props for the\n * EventContextProvider.\n * @returns {Element} - The EventContextProvider.\n */\nexport function EventContextProvider({\n children,\n}: IEventContextProvider): JSX.Element {\n // Make instance of AnalyticsEventStorage referentially stable so context methods can be passed to the dependency array\n const analyticsEventStorage = useMemo(() => new AnalyticsEventStorage(), []);\n\n /**\n * Update the state of data\n *\n * @param {EventData} newData - The new data\n * @returns {void}\n */\n const updateData = useCallback(\n (newData: EventData) => {\n const storedData = analyticsEventStorage.get();\n const currentData = storedData || {};\n if (currentData && newData) {\n newData = { ...currentData, ...newData };\n }\n analyticsEventStorage.set(newData);\n },\n [analyticsEventStorage]\n );\n\n /**\n * Clear the state of data\n *\n * @returns {void}\n */\n const clearData = useCallback(() => {\n analyticsEventStorage.delete();\n }, [analyticsEventStorage]);\n\n /**\n * Return the state of data, if it is not there then check the storage\n *\n * @returns {EventData | undefined} - The data\n */\n const getData = useCallback(() => {\n return analyticsEventStorage.get() || undefined;\n }, [analyticsEventStorage]);\n\n /**\n * Return the pet id from the storage if available\n *\n * @returns {number | undefined} - The pet id\n */\n const getPetId = useCallback(() => {\n const data = analyticsEventStorage.get();\n return data?.petId;\n }, [analyticsEventStorage]);\n\n /**\n * Set the initiating component\n *\n * @param {AnalyticsInitiatingComponent} component - The initiating component\n */\n const setInitiatingComponent = useCallback(\n (component: AnalyticsInitiatingComponent) => {\n analyticsEventStorage.setInitiatingComponent(component);\n },\n [analyticsEventStorage]\n );\n\n /**\n * Retrieve the initiating component\n *\n * @returns {AnalyticsInitiatingComponent} - The initiating component\n */\n const getInitiatingComponent = useCallback(() => {\n return analyticsEventStorage.getInitiatingComponent();\n }, [analyticsEventStorage]);\n\n return (\n <EventContext.Provider\n value={{\n clearData,\n getPetId,\n getData,\n getInitiatingComponent,\n setInitiatingComponent,\n updateData,\n }}\n >\n {children}\n </EventContext.Provider>\n );\n}\n\n/**\n * This is the hook for the event context\n *\n * @returns {IEventContext} - The context\n */\nexport const useEventContext = (): IEventContext => useContext(EventContext);\n","import AbstractStorage from '@/lib/utils/storage/abstract-storage';\nimport SessionStorage from '@/lib/utils/storage/session-storage';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\n/**\n * Describe the storybook user context\n *\n * @interface IStorybookAuthContext\n */\ninterface IStorybookAuthContext {\n /**\n * A flag to determine if is storybook\n *\n * @memberof IStorybookAuthContext\n * @member {boolean} isStorybook\n */\n isStorybook: boolean;\n /**\n * The id token\n *\n * @memberof IStorybookAuthContext\n * @member {string | null} [idToken]\n */\n idToken?: string | null;\n /**\n * Set the id token\n *\n * @memberof IStorybookAuthContext\n * @member {(idToken: string) => void} [setIdToken]\n */\n setIdToken?: (idToken: string) => void;\n}\n\n/**\n * The storybook context\n *\n * @constant {React.Context<IStorybookAuthContext>} StorybookContext\n */\nconst StorybookContext = createContext<IStorybookAuthContext>({\n isStorybook: false,\n});\n\n/**\n * The storybook user context provider props\n *\n * @interface IStorybookAuthContextProviderProps\n */\ninterface IStorybookAuthContextProviderProps {\n /**\n * The provider children\n *\n * @memberof IStorybookAuthContextProviderProps\n * @member {React.ReactNode} children\n */\n children: React.ReactNode;\n /**\n * The id token storage\n *\n * @memberof IStorybookAuthContextProviderProps\n * @member {AbstractStorage} [idTokenStorage]\n */\n idTokenStorage?: AbstractStorage;\n}\n\nconst defaultStorage = new SessionStorage();\n\n/**\n * The hook to use the stored id token\n *\n * @interface IUseStoredIdToken\n */\ninterface IUseStoredIdToken {\n /**\n * The id token\n *\n * @memberof IUseStoredIdToken\n * @member {string | null} idToken\n */\n idToken: string | null;\n /**\n * The setter function for the id token that also stores it in the storage\n *\n * @memberof IUseStoredIdToken\n * @member {(idToken: string) => void} setIdToken\n * @param idToken\n * @returns {void}\n */\n setIdToken: (idToken: string | null) => void;\n /**\n * The storage key for the id token\n *\n * @memberof IUseStoredIdToken\n * @member {string} storageKey\n */\n storageKey: string;\n}\n\n/**\n * The hook to use the stored id token\n *\n * @param {AbstractStorage} storage - The storage\n * @returns {IUseStoredIdToken} - The stored id token\n */\nexport const useStoredIdToken = (\n storage: AbstractStorage = defaultStorage\n): IUseStoredIdToken => {\n /**\n * The storage key for the id token\n *\n * @constant {string} storageKey\n */\n const storageKey = 'idToken';\n\n const [idToken, _setIdToken] = useState<string | null>(null);\n\n /** Hook retrieve the stored id token from storage */\n useEffect(() => {\n /**\n * The store id token\n *\n * @constant {string} storedIdToken\n */\n const storedIdToken = storage.get(storageKey);\n\n if (storedIdToken && typeof storedIdToken === 'string') {\n _setIdToken(storedIdToken);\n }\n }, [_setIdToken, storage]);\n\n /**\n * The setter function for the id token that also stores it in the storage\n *\n * @param {string} idToken - The id token\n */\n const setIdToken = (idToken: string | null) => {\n idToken === null\n ? storage.delete(storageKey)\n : storage.set(storageKey, idToken);\n\n _setIdToken(idToken);\n };\n\n return {\n idToken,\n setIdToken,\n storageKey,\n };\n};\n\n/**\n * The storybook provider\n *\n * @param {IStorybookAuthContextProviderProps} props - The props\n * @returns {React.ReactElement} - The storybook provider\n */\nexport const StorybookProvider = ({\n children,\n idTokenStorage,\n}: IStorybookAuthContextProviderProps) => {\n /**\n * The flag to determine if is storybook\n *\n * @constant {boolean} isStorybook\n */\n const isStorybook = process.env.STORYBOOK_BASE_URL !== undefined;\n const { idToken, setIdToken } = useStoredIdToken(idTokenStorage);\n\n return (\n <StorybookContext.Provider\n value={{\n setIdToken,\n idToken,\n isStorybook,\n }}\n >\n {children}\n </StorybookContext.Provider>\n );\n};\n\n/**\n * Use the storybook user context\n *\n * @returns {IStorybookAuthContext} - The storybook user context\n */\nexport const useStorybookAuthContext = (): IStorybookAuthContext => {\n const storybookContext = useContext(StorybookContext);\n const { isStorybook } = storybookContext;\n\n return isStorybook ? storybookContext : { isStorybook };\n};\n","import { getIdTokenClient } from '@/lib/dataSource/auth/getIdToken';\nimport getMe from '@/lib/dataSource/lostApi/auth/me';\nimport { usePersistentBannerContext } from '@/lib/hooks/persistentBanner/PersistentBanner';\nimport { useStorybookAuthContext } from '@/lib/hooks/useStorybookAuth/StorybookAuth';\nimport { tomorrow } from '@/lib/utils/helpers/dateHelpers/dates';\nimport SessionStorage from '@/lib/utils/storage/session-storage';\nimport { useUser } from '@auth0/nextjs-auth0/client';\nimport { IMeDto } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/auth/dto';\nimport { useRouter } from 'next/router';\nimport { useEffect, useState } from 'react';\n\ndeclare global {\n // eslint-disable-next-line jsdoc/require-jsdoc\n interface Window {\n // eslint-disable-next-line jsdoc/require-jsdoc\n dataLayer: Array<{ user_id: number } | object>;\n }\n}\n\n/**\n * Store Me This is used to deal with the session storage for me object\n *\n * @class MeStorage\n */\nexport class MeStorage {\n /** The session storage used in the class */\n readonly meStorage = new SessionStorage();\n\n /** The key to use for the storage */\n readonly meStorageKey = 'me';\n\n /**\n * A method used to store the me data in session storage\n *\n * @param {IMeDto} me - The me data to store\n */\n public set = (me: IMeDto) => {\n this.meStorage.set(this.meStorageKey, me, { expires: tomorrow });\n };\n\n /** A method used to remove the me data from session storage */\n public delete = () => {\n this.meStorage.delete(this.meStorageKey);\n };\n\n /**\n * A method used to get the me data from session storage\n *\n * @returns {IMeDto | null} The me data\n */\n public get = (): IMeDto | null => {\n return this.meStorage.get(this.meStorageKey) as IMeDto;\n };\n}\n\n/**\n * IUseMe\n *\n * @interface IUseMe\n */\nexport interface IUseMe {\n /**\n * The me object\n *\n * @memberof IUseMe\n * @member {IMeDto | null} [me]\n */\n me?: IMeDto | null;\n /**\n * The idToken\n *\n * @memberof IUseMe\n * @member {string} [idToken]\n */\n idToken?: string;\n /**\n * Indicates if the user is being fetched\n *\n * @memberof IUseMe\n * @member {boolean} [isFetchingUser]\n */\n isFetchingUser: boolean;\n /**\n * Is in error state\n *\n * @memberof IUseMe\n * @member {boolean} [isError]\n */\n isError?: boolean;\n /**\n * The error message\n *\n * @memberof IUseMe\n * @member {string} [errorMessage]\n */\n errorMessage?: string;\n}\n\n/** The me storage */\nconst meStorage = new MeStorage();\n\n/**\n * Hook to get the me object and the idToken\n *\n * @returns {IUseMe} Me - The me object\n */\nconst useMe = (): IUseMe => {\n const [idToken, setIdToken] = useState<string>();\n const [me, setMe] = useState<IMeDto | null>();\n const [isFetchingUser, setIsFetchingUser] = useState(true);\n const [isError, setIsError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>();\n const { user, isLoading } = useUser();\n const router = useRouter();\n const { type, setBannerData } = usePersistentBannerContext();\n /**\n * @property {string | null} idTokenOverride - The id token from the storybook\n * auth context to override the id token\n * @property {boolean} isStorybook - The flag to determine if the hook is\n * being used in storybook\n */\n const { idToken: idTokenOverride, isStorybook } = useStorybookAuthContext();\n\n /**\n * A hook to override the id token\n *\n * This hook is setup to be used only inside storybook\n */\n useEffect(() => {\n if (idTokenOverride && isStorybook) {\n setIdToken(idTokenOverride);\n setIsError(false);\n setErrorMessage('');\n }\n }, [idTokenOverride, isStorybook]);\n\n /** Hook to get the idToken */\n useEffect(() => {\n if (!isLoading && user && !isStorybook) {\n getIdTokenClient()\n .then((idToken) => {\n setIdToken(idToken);\n setIsError(false);\n setErrorMessage('');\n })\n .catch((error) => {\n setIsError(true);\n setErrorMessage(error.message);\n console.error(error);\n });\n } else {\n /** If there is no user, than there should never be a warning banner */\n if (type === 'warning') {\n setBannerData();\n }\n /** Clear the me object in session storage if there is no user */\n meStorage.delete();\n }\n\n if (isStorybook) {\n setIsError(false);\n setErrorMessage('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, isLoading, isStorybook]);\n\n /** Hook to clear the isFetchingUser flag when there is no logged in user */\n useEffect(() => {\n if ((!isLoading && !user) || isError) {\n setIsFetchingUser(false);\n }\n }, [isLoading, user, router, isError]);\n\n /** Hook to get the me object */\n useEffect(() => {\n if (!idToken || isError) return;\n\n /** Check if we have the me object in session storage */\n let storedMe = meStorage.get();\n\n /**\n * Check the email of the me object in session storage and the email of the\n * useUser hook to check for equality if they are not equal it will clear\n * the data in storage\n */\n if (storedMe?.user?.email !== user?.email) {\n /** Clear the me object in session storage */\n meStorage.delete();\n /**\n * Set stored me to null, since there is no need to try to fetch it from\n * storage if we know it has just been cleared\n */\n storedMe = null;\n }\n\n /**\n * If idToken is available and the me key in session storage is not\n * available it will use getMe call to set the me key in session storage\n */\n if (!storedMe && idToken && !isError) {\n getMe(idToken)\n .then((me) => {\n setMe(me);\n meStorage.set(me);\n })\n .catch((error) => {\n setIsError(true);\n setErrorMessage(error.message);\n setMe(null);\n meStorage.delete();\n })\n .finally(() => {\n setIsFetchingUser(false);\n });\n } else {\n /**\n * If there is not need to re-fetch the me object, clear the\n * isFetchingUser flag\n */\n setMe(storedMe);\n setIsFetchingUser(false);\n setIsError(false);\n setErrorMessage('');\n }\n }, [idToken, user?.email, isError]);\n\n /** Hook to set the user id in the data layer if available */\n useEffect(() => {\n if (isError) return;\n if (me?.user?.id) {\n // Set dataLayer\n window.dataLayer = window.dataLayer || [];\n // Check if user id is already set\n const userAlreadySet = window.dataLayer.some(\n (el) => 'user_id' in el && el.user_id === me.user.id\n );\n\n if (!userAlreadySet) {\n window.dataLayer.push({\n user_id: me.user.id,\n });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [router, isError]);\n\n return {\n me,\n idToken,\n isFetchingUser,\n isError,\n errorMessage,\n };\n};\n\nexport default useMe;\n","import { PetSpecies } from '@/components/molecules/ShelterPetCard/ShelterPetCard';\nimport { tomorrow } from '@/lib/utils/helpers/dateHelpers/dates';\nimport LocalStorage from '@/lib/utils/storage/local-storage';\nimport {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\n\n/**\n * The banner storage class is used to deal with the storage for the persistent\n * banner\n */\nexport class BannerStorage {\n /** The storage used in the class */\n readonly storage = new LocalStorage();\n\n /** The key used for the storage */\n readonly key = 'banner';\n\n /**\n * A method used to store the banner data in storage\n *\n * @param {IBannerStorage} data - The banner data to store\n */\n public set = (data: IBannerStorage) => {\n this.storage.set(this.key, data, { expires: tomorrow });\n };\n\n /** A method used to remove the banner data from storage */\n public delete = () => {\n this.storage.delete(this.key);\n };\n\n /**\n * A method used to get the banner data from storage\n *\n * @returns {IBannerStorage | null} The banner props data\n */\n public get = (): IBannerStorage | null => {\n return this.storage.get(this.key) as IBannerStorage;\n };\n}\n\n/**\n * The interface for the banner storage\n *\n * @interface IBannerStorage\n */\ninterface IBannerStorage {\n /**\n * The type of banner to display\n *\n * @memberof IBannerStorage\n * @member {PersistentBannerTypes} [type]\n */\n type?: PersistentBannerTypes;\n /**\n * The props for the banner\n *\n * @memberof IBannerStorage\n * @member {BannerProps} [bannerProps]\n */\n bannerProps?: BannerProps;\n}\n\n/**\n * The types of banners that can be returned\n *\n * @typedef {string} PersistentBannerTypes\n */\nexport type PersistentBannerTypes = 'info' | 'warning' | 'partner';\n\n/**\n * The types of searches that can be done\n *\n * @typedef {string} SearchTypes\n */\nexport type SearchTypes = 'distance' | 'photo';\n\n/**\n * The type of pet reports\n *\n * @typedef {string} PetReportTypes\n */\nexport type PetReportTypes = 'lost' | 'found';\n\n/**\n * The type of pet reports\n *\n * @type {CreateAccountBannerProps | PetSearchBannerProps | PartnerBannerProps} BannerProps\n */\nexport type BannerProps =\n | CreateAccountBannerProps\n | PetSearchBannerProps\n | PartnerBannerProps;\n\n/**\n * The interface for the PersistentBannerHandler props used to display the\n * Create Account Banner\n *\n * @interface CreateAccountBannerProps\n */\nexport interface CreateAccountBannerProps {\n /**\n * The type of pet report\n *\n * @memberof CreateAccountBannerProps\n * @member {PetReportTypes} petReportType\n */\n petReportType: PetReportTypes;\n /**\n * The type of search\n *\n * @memberof CreateAccountBannerProps\n * @member {SearchTypes} searchType\n */\n searchType: SearchTypes;\n /**\n * The Pet species\n *\n * @memberof CreateAccountBannerProps\n * @member {PetSpecies} [species]\n */\n species?: PetSpecies;\n}\n\n/**\n * The interface for the PartnerBannerProps props used to display the Partner\n * Banner\n *\n * @interface PartnerBannerProps\n */\nexport interface PartnerBannerProps {\n /**\n * The partner name\n *\n * @memberof PartnerBannerProps\n * @member {string} partner\n */\n partner: string;\n\n /**\n * The type of pet report\n *\n * @memberof PartnerBannerProps\n * @member {PetReportTypes} petReportType\n */\n petReportType: PetReportTypes;\n}\n\n/**\n * The interface for the PersistentBannerHandler props used to display the Pet\n * Search Banner\n *\n * @interface PetSearchBannerProps\n */\nexport interface PetSearchBannerProps {\n /**\n * The Id of the pet, this is used for analytics\n *\n * @memberof PetSearchBannerProps\n * @member {number} [petId]\n */\n petId?: number;\n /**\n * The zip code of the pet, this is used for analytics\n *\n * @memberof PetSearchBannerProps\n * @member {string} [zipCode]\n */\n zipCode?: string;\n /**\n * The name of the pet, this is used for analytics\n *\n * @memberof PetSearchBannerProps\n * @member {string} [petName]\n */\n petName?: string;\n /**\n * The type of pet report\n *\n * @memberof PetSearchBannerProps\n * @member {PetReportTypes} petReportType\n */\n petReportType: PetReportTypes;\n /**\n * The pet data\n *\n * @memberof PetSearchBannerProps\n * @member {object} petData\n */\n petData: {\n /**\n * The Pet photo\n *\n * @memberof PetSearchBannerProps.petData\n * @member {string} photo\n */\n photo: string;\n /**\n * The pet species\n *\n * @memberof PetSearchBannerProps.petData\n * @member {PetSpecies} species\n */\n species: PetSpecies;\n /**\n * The coordinates for the user\n *\n * @memberof PetSearchBannerProps.petData\n * @member {object} coordinates\n */\n coordinates: {\n /**\n * The latitude\n *\n * @memberof PetSearchBannerProps.petData.coordinates\n * @member {number} latitude\n */\n latitude: number;\n /**\n * The longitude\n *\n * @memberof PetSearchBannerProps.petData.coordinates\n * @member {number} longitude\n */\n longitude: number;\n };\n /**\n * The label of the address of the pet\n *\n * @memberof PetSearchBannerProps.petData\n * @member {string} [address]\n */\n address?: string;\n };\n}\n\n/**\n * The interface for the PersistentBannerProvider props\n *\n * @interface IPersistentBannerContext\n */\nexport interface IPersistentBannerContext {\n /**\n * The type of banner\n *\n * @memberof IPersistentBannerContext\n * @member {PersistentBannerTypes} [type]\n */\n type?: PersistentBannerTypes;\n /**\n * The props used to create the banner\n *\n * @memberof IPersistentBannerContext\n * @member {BannerProps} [bannerProps]\n */\n bannerProps?: BannerProps;\n /**\n * The function to set the banner data\n *\n * @memberof IPersistentBannerContext\n * @member {Function} setBannerData\n */\n setBannerData: (\n type?: PersistentBannerTypes,\n bannerProps?: BannerProps\n ) => void;\n}\n\nconst PersistentBannerContext = createContext<IPersistentBannerContext>({\n type: undefined,\n bannerProps: undefined,\n /** The function to set the banner data */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setBannerData: () => {},\n});\n\n/**\n * The interface for the PersistentBannerProvider props\n *\n * @interface IPersistentBannerProvider\n */\ninterface IPersistentBannerProvider {\n /**\n * The children wrapped by the provider\n *\n * @memberof IPersistentBannerProvider\n * @member {ReactNode} children\n */\n children: ReactNode;\n}\n\n/**\n * The PersistentBannerProvider component.\n *\n * @param {IPersistentBannerProvider} props - The props for the\n * PersistentBannerProvider.\n * @returns {Element} - The PersistentBannerProvider.\n */\nexport function PersistentBannerProvider({\n children,\n}: IPersistentBannerProvider): JSX.Element {\n const storage = new BannerStorage();\n const [type, setType] = useState<PersistentBannerTypes>();\n const [bannerProps, setBannerProps] = useState<BannerProps>();\n\n useEffect(() => {\n const data = storage.get();\n if (data && !type && !bannerProps) {\n setType(data.type);\n setBannerProps(data.bannerProps);\n }\n // This only needs to run on render once since we do not want to continuously look in the storage.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * This function is used to set the banner data\n *\n * @param {PersistentBannerTypes} type - The type of banner\n * @param {BannerProps} bannerProps - The props for the banner\n */\n const setBannerData = (\n type?: PersistentBannerTypes,\n bannerProps?: BannerProps\n ): void => {\n setType(type);\n setBannerProps(bannerProps);\n storage.set({ type, bannerProps });\n };\n\n return (\n <PersistentBannerContext.Provider\n value={{ type, bannerProps, setBannerData }}\n >\n {children}\n </PersistentBannerContext.Provider>\n );\n}\n\n/**\n * A hook to access the PersistentBannerContext\n *\n * @returns {IPersistentBannerContext} - The PersistentBannerContext\n */\nexport const usePersistentBannerContext = (): IPersistentBannerContext =>\n useContext(PersistentBannerContext);\n","import useMe from '@/lib/hooks/me/useMe';\nimport CookieStorage from '@/lib/utils/storage/cookie-storage';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nexport const shelterLocationStorageKey = 'selectedShelterLocation';\n\n/**\n * The interface for the shelter location storage\n *\n * @interface\n */\nexport interface IShelterLocationStorage {\n /** The selected shelter id */\n selectedShelterId?: number;\n}\n\n/**\n * The shelter location storage class is used to deal with the storage for the\n * selected shelter location.\n */\nexport class ShelterLocationStorage {\n /** The storage used in the class. */\n readonly storage = new CookieStorage();\n\n /** The key used for the storage. */\n readonly key = shelterLocationStorageKey;\n\n /**\n * A method used to store the shelter location in storage\n *\n * @param {IShelterLocationStorage} data - The shelter location to store\n */\n public set = (data: IShelterLocationStorage) => {\n this.storage.set(this.key, data);\n };\n\n /** A method used to remove the banner data from storage */\n public delete = () => {\n this.storage.delete(this.key);\n };\n\n /**\n * A method used to get the banner data from storage\n *\n * @returns {IShelterLocationStorage | null} The banner props data\n */\n public get = (): IShelterLocationStorage | null => {\n return this.storage.get(this.key) as IShelterLocationStorage;\n };\n}\n\n/** The interface for a shelter item */\nexport interface IShelterLocationItem {\n /** The shelter id */\n id: number;\n /** The shelter name */\n name: string;\n}\n\n/** The interface for the shelter location context */\nexport interface IShelterLocationContext {\n /**\n * The shelter list\n *\n * @memberof IShelterLocationContext\n * @member {IShelterLocationItem[]} [shelterList]\n */\n shelterList?: IShelterLocationItem[];\n /**\n * The selected shelter id\n *\n * @memberof IShelterLocationContext\n * @member {number} [selectedShelterId]\n */\n selectedShelterId?: number;\n /**\n * The selected shelter object\n *\n * @memberof IShelterLocationContext\n * @member {IShelterLocationItem} [selectedShelter]\n */\n selectedShelter?: IShelterLocationItem;\n /**\n * Whether the shelter list is being fetched\n *\n * @memberof IShelterLocationContext\n * @member {boolean} isFetchingShelterList\n */\n isFetchingShelterList: boolean;\n /**\n * The handle shelter selection function\n *\n * @memberof IShelterLocationContext\n * @member {Function} handleShelterSelection\n */\n handleShelterSelection?: (id: number) => void;\n /**\n * Whether the user is switching locations\n *\n * @memberof IShelterLocationContext\n * @member {boolean} isSwitchingLocation\n */\n isSwitchingLocation: boolean;\n /**\n * The set is switching location function\n *\n * @memberof IShelterLocationContext\n * @member {Function} [setIsSwitchingLocation]\n */\n setIsSwitchingLocation?: (isSwitchingLocation: boolean) => void;\n /**\n * The selected shelter id for the shelter reporting\n *\n * @memberof IShelterLocationContext\n * @member {number | null} [selectedShelterIdForShelterReporting]\n */\n selectedShelterIdForShelterReporting?: number | null;\n /**\n * The setter function for the SelectedShelterIdForShelterReporting state\n *\n * @memberof IShelterLocationContext\n * @member {React.Dispatch} [setSelectedShelterIdForShelterReporting]\n */\n setSelectedShelterIdForShelterReporting?: React.Dispatch<\n React.SetStateAction<number | null>\n >;\n}\n\nconst ShelterLocationContext = createContext<IShelterLocationContext>({\n shelterList: undefined,\n selectedShelterId: undefined,\n isFetchingShelterList: true,\n selectedShelter: undefined,\n isSwitchingLocation: false,\n});\n\n/**\n * The interface for the shelter location provider\n *\n * @interface\n */\ninterface IShelterLocationProvider {\n /** The initial shelter list. Used for testing. */\n initialShelterList?: IShelterLocationItem[];\n /** The children wrapped by the provider */\n children: React.ReactNode;\n}\n\n/**\n * The Shelter Location provider\n *\n * @param {React.ReactNode} children - The children of the component\n * @returns {React.ReactNode} The Shelter Location provider\n */\nexport function ShelterLocationProvider({\n initialShelterList,\n children,\n}: IShelterLocationProvider) {\n const { me, isFetchingUser } = useMe();\n\n const storage = new ShelterLocationStorage();\n\n const [selectedShelterId, setSelectedShelterId] =\n useState<IShelterLocationStorage['selectedShelterId']>();\n\n const [isSwitchingLocation, setIsSwitchingLocation] = useState(false);\n\n const [\n selectedShelterIdForShelterReporting,\n setSelectedShelterIdForShelterReporting,\n ] = useState<number | null>(null);\n\n /**\n * Handles the selection of a shelter in the list.\n *\n * @param {string} id - The id of the shelter.\n */\n function handleShelterSelection(id: number) {\n setSelectedShelterId(id);\n storage.set({ selectedShelterId: id });\n }\n\n const shelterList = initialShelterList ? initialShelterList : me?.awos;\n\n const selectedShelter = shelterList?.find(\n (shelter) => shelter.id === Number(selectedShelterId)\n );\n\n // If no data on storage, set the first item of the shelter list array as the selected shelter\n useEffect(() => {\n const firstShelterId = shelterList?.[0]?.id;\n const data = storage.get();\n\n if (!data?.selectedShelterId && firstShelterId) {\n handleShelterSelection(firstShelterId);\n }\n /** Adding other fields would cause an infinite loop. */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shelterList?.length]);\n\n // Check if the selected shelter id is valid and if not, set the first shelter id as the selected shelter\n useEffect(() => {\n const data = storage.get();\n\n if (data?.selectedShelterId && shelterList) {\n const shelterIds = shelterList?.map((shelter) => shelter.id);\n const isValidShelterId = shelterIds?.includes(data?.selectedShelterId);\n\n if (!isValidShelterId) {\n handleShelterSelection(shelterList?.[0].id);\n } else {\n setSelectedShelterId(data.selectedShelterId);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isFetchingUser]);\n\n const value: IShelterLocationContext = {\n shelterList,\n isFetchingShelterList: isFetchingUser,\n selectedShelter,\n selectedShelterId,\n handleShelterSelection,\n isSwitchingLocation,\n setIsSwitchingLocation,\n selectedShelterIdForShelterReporting,\n setSelectedShelterIdForShelterReporting,\n };\n\n return (\n <ShelterLocationContext.Provider value={value}>\n {children}\n </ShelterLocationContext.Provider>\n );\n}\n\n/**\n * A hook to access the ShelterLocationContext\n *\n * @returns {IShelterLocationContext} The shelter location context\n */\nexport const useShelterLocationContext = (): IShelterLocationContext =>\n useContext(ShelterLocationContext);\n","import AbstractStorage from '@/lib/utils/storage/abstract-storage';\nimport LocalStorage from '@/lib/utils/storage/local-storage';\nimport { ReadonlyURLSearchParams, useSearchParams } from 'next/navigation';\nimport { useCallback } from 'react';\n\nconst defaultStorage = new LocalStorage();\nconst defaultReferralSourceKey = 'utm_campaign';\nconst defaultReferralStorageKey = 'shelter_referral';\n\n/** The valid campaign prefixes for a shelter referral. */\nconst campaignPrefixes = [\n 'lost-lostfound-shelter-',\n 'lovelost-map-widget-shelter-',\n 'lovelost-list-widget-shelter-',\n];\n\n/**\n * The use referral props\n *\n * @interface IUseReferralProps\n */\nexport interface IUseReferralProps {\n /**\n * The storage\n *\n * @memberof IUseReferralProps\n * @default defaultStorage\n * @member {AbstractStorage} [storage]\n */\n storage?: AbstractStorage;\n /**\n * The referral storage key\n *\n * @memberof IUseReferralProps\n * @default defaultReferralStorageKey\n * @member {string} [referralStorageKey]\n */\n referralStorageKey?: string;\n /**\n * The referral source key\n *\n * @memberof IUseReferralProps\n * @default defaultReferralSourceKey\n * @member {string} [referralSourceKey]\n */\n referralSourceKey?: string;\n}\n\n/**\n * The use referral interface\n *\n * @interface IUseReferral\n */\nexport interface IUseReferral {\n /**\n * Sets the referral to the storage\n *\n * @memberof IUseReferral\n * @member {Function} setReferral\n * @returns {void}\n */\n setReferral: () => void;\n\n /**\n * Gets the referral from the storage\n *\n * @memberof IUseReferral\n * @member {Function} getReferral\n * @returns {string | null} - The referral\n */\n getReferral: () => number | null;\n}\n\n/**\n * A hook to interact with the referral\n *\n * @param {IUseReferralProps} props - The referral props\n * @returns {IUseReferral} The referral hook\n */\nconst useReferral = ({\n storage = defaultStorage,\n referralStorageKey = defaultReferralStorageKey,\n referralSourceKey = defaultReferralSourceKey,\n}: IUseReferralProps): IUseReferral => {\n /**\n * The search params\n *\n * @constant {ReadonlyURLSearchParams} searchParams\n */\n const searchParams: ReadonlyURLSearchParams = useSearchParams();\n /**\n * A callback to set the referral from the search params to the storage\n *\n * @returns {void}\n */\n const setReferral = useCallback(() => {\n // Only proceed if search params exists\n if (!searchParams) {\n return;\n }\n\n /**\n * The referral from the search params\n *\n * @constant {string | null} referral\n */\n const referral = searchParams.get(referralSourceKey);\n\n if (!referral) {\n return;\n }\n\n /** The awo id from the referral. */\n const awoId = getAwoIdFromUtmCampaign(referral);\n\n if (awoId) {\n storage.set(referralStorageKey, awoId);\n }\n }, [searchParams, referralSourceKey, referralStorageKey, storage]);\n\n /**\n * A callback to get the referral\n *\n * @returns {string | null} - The referral\n */\n const getReferral = useCallback(() => {\n /**\n * The referral from storage\n *\n * @constant {string | object | null}\n */\n const referral = storage.get(referralStorageKey);\n\n if (\n referral &&\n (typeof referral === 'string' || typeof referral === 'number')\n ) {\n return Number(referral);\n }\n\n return null;\n }, [referralStorageKey, storage]);\n\n return {\n setReferral,\n getReferral,\n };\n};\n\nexport default useReferral;\n\n/**\n * Get the awo id from the utm campaign.\n *\n * @param {string} utmCampaign - The utm campaign\n * @returns {string | null} - The awo id\n */\nexport const getAwoIdFromUtmCampaign = (utmCampaign: string): string | null => {\n const campaignPrefix = campaignPrefixes.find((prefix) =>\n utmCampaign.includes(prefix)\n );\n\n if (!campaignPrefix) {\n console.error('invalid referral');\n return null;\n }\n\n const awoId = utmCampaign.split(campaignPrefix).at(-1);\n\n if (\n utmCampaign.includes(campaignPrefix) &&\n awoId &&\n !isNaN(Number(awoId)) &&\n awoId.trim() !== ''\n ) {\n return awoId;\n }\n\n console.error('invalid referral');\n\n return null;\n};\n","import { createContext, ReactNode, useContext, useEffect } from 'react';\nimport useReferral, { IUseReferral, IUseReferralProps } from './useReferral';\n\n/**\n * The default context\n *\n * @constant {IUseReferral}\n */\nexport const defaultContext: IUseReferral = {\n /** The default set referral function */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setReferral: () => {},\n /**\n * The default get referral function\n *\n * @returns {null} - The default referral\n */\n getReferral: (): null => null,\n};\n\n/**\n * The shelter referral context\n *\n * @constant {React.Context<IUseReferral>} ShelterReferralContext\n */\nconst ShelterReferralContext = createContext<IUseReferral>(defaultContext);\n\n/**\n * The default use shelter referral\n *\n * @augments IUseReferralProps\n * @interface IShelterReferralProviderProps\n */\nexport interface IShelterReferralProviderProps extends IUseReferralProps {\n /**\n * The children of the ShelterReferralProvider\n *\n * @memberof IShelterReferralProviderProps\n * @member {ReactNode} children\n */\n children: ReactNode;\n}\n\n/**\n * The ShelterReferralProvider\n *\n * @param {IShelterReferralProviderProps} props - The ShelterReferralProvider\n * props\n * @returns {Element} - The ShelterReferralProvider\n */\nexport function ShelterReferralProvider({\n children,\n ...rest\n}: IShelterReferralProviderProps): JSX.Element {\n /**\n * The referral hook\n *\n * @constant {IUseReferral} referral\n */\n const referral = useReferral(rest);\n\n /** Hook to set the referral on mount */\n useEffect(() => {\n referral.setReferral();\n }, [referral]);\n\n return (\n <ShelterReferralContext.Provider value={referral}>\n {children}\n </ShelterReferralContext.Provider>\n );\n}\n\n/**\n * A hook to access the ShelterReferralContext\n *\n * @returns {IUseReferral} - The shelter referral context\n */\nexport const useShelterReferral = (): IUseReferral =>\n useContext(ShelterReferralContext);\n","import { createContext, ReactNode, useContext, useReducer } from 'react';\n\n/**\n * Toast Type Types of Toasts Allowed\n *\n * @typedef {ToastType}\n */\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\n/** Toast Action Types Actions Allowed for Toast */\nexport type ToastActionType = 'ADD_TOAST' | 'DELETE_TOAST';\n\n/**\n * Toast Toast Type\n *\n * @typedef {Toast}\n */\nexport type Toast = {\n /** Id of Toast */\n id: string;\n /** Message to Display */\n message?: string;\n /** If the Toast is Persistent */\n persistent?: boolean;\n /** If the Toast should show an Icon */\n showIcon?: boolean;\n /** Type of Toast */\n type: ToastType;\n};\n\n/**\n * Toast State State of the Toasts\n *\n * @interface\n */\ninterface IToastState {\n /** Array of Toasts */\n toasts: Toast[];\n}\n\n/**\n * Toast Initial State Value\n *\n * @constant\n */\nexport const toastInitialValue: IToastState = {\n toasts: [],\n};\n\n/**\n * Toast Init Config\n *\n * @param {IToastState} state - The State to Init the Config with\n * @returns {object} - The Initial Config\n */\nexport const initConfig = (state: IToastState) => ({\n ...toastInitialValue,\n ...state,\n});\n\n/**\n * IToastAction Interface for Toast Actions\n *\n * @interface\n */\nexport interface IToastAction {\n /** Type of Action */\n type: ToastActionType;\n /** Toast to Add or Delete */\n toast: Toast;\n}\n\n/**\n * Toast Context Used for creating the Context Object for the useToastContext\n * Function\n *\n * @constant\n */\nexport const ToastContext = createContext<{\n /** The State of the Toasts */\n state: IToastState;\n /** The Dispatch Function for the Toasts */\n dispatch: React.Dispatch<IToastAction>;\n}>({\n state: toastInitialValue,\n /** @returns {null} - Null */\n dispatch: () => null,\n});\n\n/**\n * Toast Reducer Reducer for adding and removing Toasts\n *\n * @param {IToastState} state - The State of the Toasts\n * @param {IToastAction} action - The Action to Perform on the Toasts\n * @returns {object} - The Updated State\n */\nexport function ToastReducer(state: IToastState, action: IToastAction) {\n switch (action.type) {\n case 'ADD_TOAST': {\n return {\n ...state,\n toasts: [...state.toasts, action.toast],\n };\n }\n case 'DELETE_TOAST': {\n const updatedToasts = state.toasts.filter((e) => e.id != action.toast.id);\n return {\n ...state,\n toasts: updatedToasts,\n };\n }\n }\n}\n\n/**\n * IToast Provider The Interface for what the Toast Provider will be expecting\n *\n * @interface\n */\nexport interface IToastProvider {\n /** The Children to Provide Context to */\n children: ReactNode;\n}\n\n/**\n * Toast Provider Used to provide the ability to use Toasts to any children of\n * the provider.\n *\n * @param {IToastProvider} children - The children this will be providing\n * Context to.\n * @returns {Element} ToastContext\n */\nexport function ToastProvider({ children }: IToastProvider): JSX.Element {\n const [state, dispatch] = useReducer(ToastReducer, toastInitialValue);\n\n return (\n <ToastContext.Provider value={{ state, dispatch }}>\n {children}\n </ToastContext.Provider>\n );\n}\n\n/**\n * Use Toast Context Used to allow components to interact with the Toast Context\n *\n * @returns {ToastContext} ToastContext\n */\nexport const useToastContext = () => useContext(ToastContext);\n","import { sdk } from '@/lib/dataSource/lostApi/common';\nimport { IConversationTotalUnreadCountResponseData } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/interfaces/chat';\n\n/**\n * The params for the total unread conversation\n *\n * @interface IConversationTotalUnreadCountParams\n */\ninterface IConversationTotalUnreadCountParams {\n /** The auth token */\n authToken: string;\n /** The user entity id */\n userEntityId: number;\n}\n\n/**\n * Get the total of unread conversation\n *\n * @param {IConversationTotalUnreadCountParams} params - The params for the total unread function\n * @returns {Promise<IConversationTotalUnreadCountResponseData>} The list of all\n * conversations\n */\nexport async function totalUnread({\n authToken,\n userEntityId,\n}: IConversationTotalUnreadCountParams): Promise<IConversationTotalUnreadCountResponseData> {\n try {\n const conversations = await sdk\n .conversationsTotalUnread({\n contextId: userEntityId,\n authToken,\n })\n .read();\n return conversations.data;\n } catch (error) {\n console.error(error);\n throw error;\n }\n}\n","import { totalUnread } from '@/lib/dataSource/lostApi/chat/conversations/totalUnread';\nimport useMe, { IUseMe } from '@/lib/hooks/me/useMe';\nimport {\n Context,\n Dispatch,\n ReactNode,\n SetStateAction,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\n/** The types of users that can be returned */\nexport type UserType = 'shelter' | 'user';\n\n/**\n * The type used to create the context\n *\n * @interface\n */\nexport interface IUserContext extends IUseMe {\n /** If the user has unread messages */\n hasMessage: boolean;\n /** A method for returning the user type */\n userType: UserType | null;\n /** The number of unread messages for the user */\n unreadMessageCount: number;\n /** The fetch state of unread messages count */\n fetchingUnreadMessageCount: boolean;\n /** The logged in state of the user */\n isLoggedIn: boolean;\n /** Whether if the logged in user is a shelter or not */\n isShelter: boolean;\n /** The function to get unread messages for user */\n getUnreadMessagesForUser: () => Promise<void>;\n /** The unreadMessageCount setter */\n setUnreadMessageCount: Dispatch<SetStateAction<number>>;\n}\n\n/**\n * The default user context\n *\n * @constant {IUserContext}\n */\nexport const defaultUserContext: IUserContext = {\n hasMessage: false,\n userType: null,\n isFetchingUser: true,\n isLoggedIn: false,\n isShelter: true,\n unreadMessageCount: 0,\n fetchingUnreadMessageCount: false,\n getUnreadMessagesForUser:\n /** The default function to get unread messages for user */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async () => {},\n setUnreadMessageCount:\n /** The default function to set the unread message count */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {},\n};\n\n/**\n * The UserContext\n *\n * @constant {Context<IUserContext>}\n */\nconst UserContext: Context<IUserContext> =\n createContext<IUserContext>(defaultUserContext);\n\n/**\n * The interface for the UserProvider props\n *\n * @interface\n */\nexport interface IUserProvider {\n /** The children wrapped by the provider */\n children: ReactNode;\n}\n\n/**\n * The UserContextProvider component.\n *\n * @param {IUserProvider} props - The props for the UserContextProvider.\n * @returns {Element} - The UserContextProvider.\n */\nexport function UserContextProvider({ children }: IUserProvider): JSX.Element {\n /**\n * The data from the me hook\n *\n * @see useMe\n */\n const { idToken, me, isFetchingUser, isError, errorMessage } = useMe();\n /**\n * The total unread message count\n *\n * @constant {number}\n */\n const [unreadMessageCount, setUnreadMessageCount] = useState<number>(0);\n /**\n * The fetch state of unread messages count\n *\n * @constant {boolean}\n */\n const [fetchingUnreadMessageCount, setFetchingUnreadMessageCount] =\n useState(true);\n /**\n * If the user has unread messages\n *\n * @constant {boolean}\n */\n const hasMessage = useMemo(\n () => unreadMessageCount > 0,\n [unreadMessageCount]\n );\n\n /** This will determine the type of user that is currently logged in. */\n const userType = useMemo(() => {\n let userType: UserType | null = null;\n\n if (me?.awos) {\n userType = 'shelter';\n } else if (me?.user && !me?.awos) {\n userType = 'user';\n }\n return userType;\n }, [me?.awos, me?.user]);\n\n /**\n * The logged in state of the user We get it by checking if we are able to get\n * a user type from the me object\n *\n * @constant {boolean}\n */\n const isLoggedIn = useMemo(() => {\n return !isFetchingUser && userType !== null;\n }, [isFetchingUser, userType]);\n\n /**\n * Whether if the logged in user is a shelter or not\n *\n * We explicitly check if the user type is of type 'user' so we do not show\n * user specific options while we determine the user type\n *\n * @constant {boolean}\n */\n const isShelter = useMemo(() => {\n if (userType === 'user') {\n return false;\n }\n return true;\n }, [userType]);\n\n /**\n * Callback to get the total unread messages for a user\n *\n * @returns {void}\n */\n const getUnreadMessagesForUser = useCallback(async () => {\n if (!me || !idToken || userType === 'shelter')\n return setUnreadMessageCount(0);\n /**\n * @property {string} id - The user id\n * @property {string} idToken - The user idToken\n */\n const {\n user: { id },\n } = me;\n try {\n /**\n * The response from the totalUnread function\n *\n * @property {number} unread - The total unread messages for a user\n */\n const { unread } = await totalUnread({\n authToken: idToken,\n userEntityId: id,\n });\n\n if (unread !== unreadMessageCount) {\n setUnreadMessageCount(unread);\n }\n } catch (error) {\n console.error('Error fetching unread messages', error);\n } finally {\n setFetchingUnreadMessageCount(false);\n }\n }, [idToken, me, unreadMessageCount, userType]);\n\n /** Make initial call for unread messages */\n useEffect(() => {\n getUnreadMessagesForUser();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [idToken, me]);\n\n return (\n <UserContext.Provider\n value={{\n idToken,\n hasMessage,\n me,\n userType,\n isLoggedIn,\n isShelter,\n isFetchingUser,\n getUnreadMessagesForUser,\n unreadMessageCount,\n setUnreadMessageCount,\n fetchingUnreadMessageCount,\n isError,\n errorMessage,\n }}\n >\n {children}\n </UserContext.Provider>\n );\n}\n\n/**\n * A hook to access the UserContext\n *\n * @returns {IUserContext} - The UserContext\n */\nexport const useUserContext = (): IUserContext => useContext(UserContext);\n","// Today's date\nexport const today = new Date();\n// Tomorrow's Date\nexport const tomorrow = new Date(today.getTime() + 86400000);\n\n/**\n * Get a date object that is X minutes from now\n *\n * @param {number} minutes - Time in minutes\n * @returns {Date} A date object that is X minutes from now\n */\nexport const getDateXMinutesFromNow = (minutes: number) => {\n return new Date(new Date().getTime() + minutes * 60 * 1000);\n};\n\n/**\n * Check if a date is valid\n *\n * @param {string} date - The date to check\n * @returns {boolean} - True if the date is valid, false otherwise\n */\nexport const isDateValid = (date: string) => {\n return !isNaN(new Date(date).getTime());\n};\n","import AbstractStorage, { IStorageConfig } from './abstract-storage';\n\n/**\n * LocalStorage Local Storage is available across all browser tabs. It is not\n * cleared when the tab is closed.\n *\n * @augments AbstractStorage\n * @class\n */\nexport default class LocalStorage extends AbstractStorage {\n /**\n * Get Get the data from the local storage.\n *\n * @param {string} id - The id of the data to get.\n * @returns {object | null} - The data or null if not found.\n */\n get(id: string): object | string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const data = localStorage.getItem(id);\n\n if (!data) return null;\n // Parse the data and check if the expiration date is passed\n let parsedData = null;\n\n parsedData = JSON.parse(data);\n if (parsedData.expiration && new Date(parsedData.expiration) < new Date()) {\n this.delete(id);\n return null;\n }\n return parsedData;\n }\n\n /**\n * Set Set the data in the local storage.\n *\n * @param {string} id - The id of the data to set.\n * @param {object | string} data - The data to set.\n * @param {IStorageConfig} [config] - The configuration for the local storage.\n */\n set(id: string, data: object | string, config?: IStorageConfig): void {\n if (config?.expires) {\n if (typeof data === 'string') {\n data = { data, expiration: config.expires };\n } else {\n data = { ...data, expiration: config.expires };\n }\n }\n localStorage.setItem(id, JSON.stringify(data));\n }\n\n /**\n * Delete Delete the data from the local storage.\n *\n * @param {string} id - The id of the data to delete.\n */\n delete(id: string): void {\n localStorage.removeItem(id);\n }\n}\n","/**\n * Get the expiration date from the data.\n *\n * @param {object | null} data - The data.\n * @returns {Date | null} - The expiration date or null if not found.\n */\nfunction getExpirationDate(\n data: { [key: string]: unknown } | null\n): Date | null {\n if (\n data !== null &&\n 'expiration' in data &&\n data?.expiration &&\n typeof data.expiration === 'string'\n ) {\n /**\n * The expiration date from the data.\n *\n * @constant {Date} expirationDate\n */\n const expirationDate = new Date(data.expiration);\n\n if (!isNaN(expirationDate.getTime())) {\n return expirationDate;\n }\n console.error('Invalid expiration date: ', data.expiration);\n }\n\n return null;\n}\n\nexport default getExpirationDate;\n","/**\n * A helper function to parse a JSON string safely\n *\n * @param {string} str - The string to parse\n * @returns {string | object} - The parsed JSON object or the string\n */\nfunction parseToJSONSafe(str: string): string | { [key: string]: unknown } {\n try {\n return JSON.parse(str);\n } catch (error) {\n console.error('Unable to parse string to JSON: ', str);\n }\n return str;\n}\n\nexport default parseToJSONSafe;\n","import getExpirationDate from '../helpers/ObjectsHelpers/getExpirationDate';\nimport parseToJSONSafe from '../helpers/stringHelpers/parseToJSONSafe';\nimport AbstractStorage, { IStorageConfig } from './abstract-storage';\n\n/**\n * SessionStorage Session Storage is a storage that is available only in the\n * current browser tab. It is cleared when the tab is closed. It is not shared\n * between tabs.\n *\n * @augments AbstractStorage\n * @class\n */\nexport default class SessionStorage extends AbstractStorage {\n /**\n * Whether the session storage is available.\n *\n * @returns {boolean} - Whether the session storage is available.\n */\n private isAvailable(): boolean {\n return typeof window !== 'undefined';\n }\n\n /**\n * Get Get the data from the session storage.\n *\n * @param {string} id - The id of the data to get.\n * @returns {object | null} - The data or null if not found.\n */\n get(id: string): object | string | null {\n if (!this.isAvailable()) {\n return null;\n }\n const data = sessionStorage.getItem(id);\n\n if (!data) {\n return null;\n }\n\n // Parse the data and check if the expiration date is passed\n const parsedData = parseToJSONSafe(data);\n\n if (typeof parsedData === 'string') {\n return parsedData;\n }\n /**\n * The data expiration date.\n *\n * @constant {Date | null} expirationDate\n */\n const expirationDate = getExpirationDate(parsedData);\n\n if (expirationDate && expirationDate < new Date()) {\n this.delete(id);\n return null;\n }\n return parsedData;\n }\n\n /**\n * Set Set the data in the session storage.\n *\n * @param {string} id - The id of the data to set.\n * @param {object | string} data - The data to set.\n * @param {IStorageConfig} [config] - The session configuration.\n */\n set(id: string, data: object | string, config?: IStorageConfig): void {\n if (!this.isAvailable()) {\n return;\n }\n if (config?.expires) {\n if (typeof data === 'string') {\n data = { data, expiration: config.expires };\n } else {\n data = { ...data, expiration: config.expires };\n }\n }\n sessionStorage.setItem(id, JSON.stringify(data));\n }\n\n /**\n * Delete Delete the data from the session storage.\n *\n * @param {string} id - The id of the data to delete.\n */\n delete(id: string): void {\n sessionStorage.removeItem(id);\n }\n}\n"],"names":["accentProps","ORG","ADOPT","CARE","AccentContext","createContext","useAccent","currentAccentContext","useContext","__webpack_exports__","ZP","children","defaultAccent","param","accent","setAccent","useState","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","jsx","Provider","value","updateAccent","newAccent","OverlayContext","useOverlay","currentOverlayContext","defaultOverlay","show","setShow","updateShow","newOverlay","cookies","optimizelyClient","createInstance","datafile","require","eventBatchSize","eventFlushInterval","logLevel","CookieStorage","clientSetUserIdKeyCookie","get","toString","userId","uuidv4","ShelterDashboardInternalClickTracking","usePushAwoDataForInternalClickTracking","router","useRouter","selectedShelter","useShelterLocationContext","orgName","name","awoId","id","useEffect","dataLayer","getDatalayerInstance","window","pathname","startsWith","push","org_name","awo_id","set","ProviderLayout_ProviderLayout","jsx_runtime","UserProvider","profileUrl","concat","getBasePath","OptimizelyProvider","optimizely","user","isServerSide","UserContextProvider","PersistentBannerProvider","EventContextProvider","ToastProvider","OverlayProvider","AccentProvider","ShelterReferralProvider","jsxs","ShelterLocationProvider","getIdTokenClient","response","fetch","jsonResponse","json","Promise","resolve","session","idToken","error","reject","getMe","authToken","me","sdk","read","data","initSDK","pllApiBaseUrl","process","pllWebsocketBaseUrl","PetcoLoveSDK","defaultExpirationDate","tomorrow","AnalyticsEventStorage","analyticsEventStorage","LocalStorage","analyticsEventStorageKey","initiatingComponentKey","analyticsEvent","expires","delete","setInitiatingComponent","component","getInitiatingComponent","EventContext","updateData","getData","undefined","clearData","notApplicableString","getPetId","useMemo","useCallback","storedData","currentData","newData","petId","useEventContext","StorybookContext","isStorybook","SessionStorage","useStorybookAuthContext","storybookContext","meStorage","meStorageKey","me_useMe","setIdToken","setMe","isFetchingUser","setIsFetchingUser","isError","setIsError","errorMessage","setErrorMessage","isLoading","useUser","type","setBannerData","usePersistentBannerContext","idTokenOverride","then","catch","message","storedMe","email","finally","userAlreadySet","some","el","user_id","BannerStorage","storage","key","PersistentBannerContext","bannerProps","setType","setBannerProps","ShelterLocationStorage","ShelterLocationContext","shelterList","selectedShelterId","isFetchingShelterList","isSwitchingLocation","initialShelterList","useMe","setSelectedShelterId","setIsSwitchingLocation","selectedShelterIdForShelterReporting","setSelectedShelterIdForShelterReporting","handleShelterSelection","awos","find","shelter","Number","firstShelterId","length","shelterIds","map","isValidShelterId","includes","defaultStorage","campaignPrefixes","shelterReferral_useReferral","referralStorageKey","referralSourceKey","searchParams","useSearchParams","setReferral","referral","getAwoIdFromUtmCampaign","getReferral","campaignPrefix","utmCampaign","prefix","split","at","isNaN","trim","ShelterReferralContext","rest","useReferral","useShelterReferral","toastInitialValue","toasts","ToastContext","state","dispatch","ToastReducer","action","toast","updatedToasts","filter","e","useReducer","useToastContext","totalUnread","userEntityId","conversations","conversationsTotalUnread","contextId","UserContext","hasMessage","userType","isLoggedIn","isShelter","unreadMessageCount","fetchingUnreadMessageCount","getUnreadMessagesForUser","setUnreadMessageCount","setFetchingUnreadMessageCount","unread","useUserContext","today","Date","getTime","getDateXMinutesFromNow","minutes","isDateValid","date","AbstractStorage","localStorage","getItem","parsedData","JSON","parse","expiration","config","setItem","stringify","removeItem","ObjectsHelpers_getExpirationDate","expirationDate","stringHelpers_parseToJSONSafe","str","isAvailable","sessionStorage","parseToJSONSafe","getExpirationDate"],"sourceRoot":""}