{"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":""}