{"version":3,"file":"static/chunks/9071.be26cb852c8883d1.js","mappings":"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","sources":["webpack://_N_E/./node_modules/@auth0/nextjs-auth0/client.js","webpack://_N_E/./src/lib/analytics/handlers/eventLogHandler.ts","webpack://_N_E/./src/lib/analytics/handlers/klaviyoEventHandler.ts","webpack://_N_E/./src/lib/analytics/commonEmitter.ts","webpack://_N_E/./src/lib/analytics/eventEmitter.ts","webpack://_N_E/./src/lib/analytics/handlers/abstractAnalyticsHandler.ts","webpack://_N_E/./src/lib/analytics/handlers/googleTagManagerHandler.ts","webpack://_N_E/./src/lib/dataSource/lostApi/common.ts","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/"],"sourcesContent":["module.exports = require('./dist/client');\n","import AbstractAnalyticsHandler, { IEvent } from './abstractAnalyticsHandler';\n/**\n * EventLogHandler\n *\n * This will console log all the event data\n *\n * YOU WILL NEED TO UPDATE THE next.config.js TO ALLOW CONSOLE LOGS\n *\n * @augments AbstractAnalyticsHandler\n * @class\n */\nexport default class EventLogHandler extends AbstractAnalyticsHandler {\n /**\n * @memberof EventLogHandler\n * @param {IEvent} data - The data to be sent with the event\n */\n send(data: IEvent) {\n const analyticFeature = this.getAnalyticsFeature();\n\n /**\n * The data object to be sent to the console\n *\n * @memberof EventLogHandler\n * @member {object} dataObject\n */\n const dataObject: {\n /** The data associated with the event */\n data: object;\n /** The feature flags that are enabled */\n feature: string;\n } = {\n data: data.data,\n feature: analyticFeature,\n };\n\n console.log('EventLogHandler:', dataObject);\n }\n}\n","import getBasePath from '@/lib/utils/getBasePath/getBasePath';\nimport axios from 'axios';\nimport AbstractAnalyticsHandler, { IEvent } from './abstractAnalyticsHandler';\n\n/**\n * KlaviyoEventHandler\n *\n * @augments AbstractAnalyticsHandler\n */\nexport default class KlaviyoEventHandler extends AbstractAnalyticsHandler {\n /** @param {IEvent} data - The data to be sent with the event */\n async send(data: IEvent) {\n const eventData = {\n data: {\n type: 'event',\n attributes: {\n properties: data.data.attributes,\n time: new Date(),\n metric: {\n data: {\n type: 'metric',\n attributes: {\n name: data.name,\n },\n },\n },\n profile: {\n data: {\n type: 'profile',\n attributes: data.data.profile,\n },\n },\n },\n },\n };\n axios.post(`${getBasePath()}/api/klaviyo/events`, eventData);\n }\n}\n","import { googleTagManagerBrand } from '../constants/constants/analytics';\nimport EventEmitter from './eventEmitter';\nimport EventLogHandler from './handlers/eventLogHandler';\nimport GoogleTagManagerHandler from './handlers/googleTagManagerHandler';\nimport KlaviyoEventHandler from './handlers/klaviyoEventHandler';\n\n/** Instances of each handler class */\nconst logEventHandler = new EventLogHandler(googleTagManagerBrand);\nconst gtmEventHandler = new GoogleTagManagerHandler(googleTagManagerBrand);\nconst klaviyoEventHandler = new KlaviyoEventHandler(googleTagManagerBrand);\n\n/** Instances of each emitter */\nexport const logEventEmitter = new EventEmitter([logEventHandler]);\nexport const gtmEventEmitter = new EventEmitter([gtmEventHandler]);\n\n/** DefaultEventEmitter to contain all handlers */\nexport const defaultEventEmitter = new EventEmitter([\n logEventHandler,\n gtmEventHandler,\n]);\n\n/** KlaviyoEventEmitter to contain Klaviyo related handlers */\nexport const klaviyoEventEmitter = new EventEmitter([\n logEventHandler,\n klaviyoEventHandler,\n]);\n","import AbstractAnalyticsHandler, {\n IEvent,\n} from './handlers/abstractAnalyticsHandler';\n\n/**\n * EventEmitter\n *\n * This will be used to dispatch each event to the appropriate handler\n *\n * @class\n */\nexport default class EventEmitter {\n /**\n * The handlers to be used for each event\n *\n * @memberof EventEmitter\n * @member {AbstractAnalyticsHandler[]} handlers\n */\n private handlers: AbstractAnalyticsHandler[];\n\n /** @param {AbstractAnalyticsHandler[]} handlers - Instances of handlerClasses */\n constructor(handlers: AbstractAnalyticsHandler[]) {\n this.handlers = handlers;\n }\n\n /**\n * The event handler\n *\n * @param {IEvent} data - Information about the event\n */\n handleEvent(data: IEvent) {\n this.handlers.forEach((handler) => {\n handler.send(data);\n });\n }\n}\n","import { notApplicableString } from '@/lib/constants/constants/analytics';\nimport { analyticsFeatureKey } from '@/lib/utils/featureFlags/optimizely/featureFlagOverride';\nimport CookieStorage from '@/lib/utils/storage/cookie-storage';\n\n/** @typedef validTypes - Valid types for event data */\ntype ValidTypes = string | number | boolean | object | null | undefined;\n\n/** @typedef eventData - How to pass the data within the event */\ntype EventData = { [key: string]: ValidTypes };\n\n/**\n * Describes the base event structure\n *\n * @interface IEvent\n */\nexport interface IEvent {\n /**\n * The name of the event\n *\n * @memberof IEvent\n * @member {string} name\n */\n name: string;\n /**\n * The data associated with the event\n *\n * @memberof IEvent\n * @member {EventData} data - The data associated with the event\n */\n data: EventData;\n}\n\n/**\n * Provides an abstract class for analytics handlers\n *\n * @abstract\n * @class\n * @name analyticsHandler\n */\nexport default abstract class AbstractAnalyticsHandler {\n /**\n * The source platform of the event data\n *\n * @memberof AbstractAnalyticsHandler\n * @member {string} brand\n */\n brand: string;\n\n /**\n * @memberof AbstractAnalyticsHandler\n * @param {string} brand - The source platform of the event data\n */\n constructor(brand: string) {\n this.brand = brand;\n }\n\n /**\n * @memberof AbstractAnalyticsHandler\n * @returns {string} - The analytic feature that is enabled\n * @protected\n */\n protected getAnalyticsFeature(): string {\n const cookies = new CookieStorage();\n const optimizelyDecision = cookies.get(analyticsFeatureKey) as {\n /** The analytic feature that is enabled */\n analytic: string;\n };\n let feature: string = notApplicableString;\n if (optimizelyDecision && optimizelyDecision.analytic) {\n // Split the string into an array\n feature = optimizelyDecision.analytic;\n }\n return feature;\n }\n\n /**\n * @memberof AbstractAnalyticsHandler\n * @abstract\n * @param {IEvent} data - The data to be sent with the event\n */\n abstract send(data: IEvent): void;\n}\n","import AbstractAnalyticsHandler, { IEvent } from './abstractAnalyticsHandler';\n\n/**\n * GoogleTagManagerHandler\n *\n * @augments AbstractAnalyticsHandler\n */\nexport default class GoogleTagManagerHandler extends AbstractAnalyticsHandler {\n /** @param {IEvent} data - The data to be sent with the event */\n send(data: IEvent) {\n const feature = this.getAnalyticsFeature();\n /** The data object to be sent to Google Tag Manager */\n const dataObject: { [key: string]: string | string[] } = {\n brand: this.brand,\n ...data.data,\n feature,\n };\n gtag('event', data.name, dataObject);\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 { 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} The list of all\n * conversations\n */\nexport async function totalUnread({\n authToken,\n userEntityId,\n}: IConversationTotalUnreadCountParams): Promise {\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;\n /** The unreadMessageCount setter */\n setUnreadMessageCount: Dispatch>;\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}\n */\nconst UserContext: Context =\n createContext(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(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 \n {children}\n \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":["module","exports","__webpack_require__","EventLogHandler","AbstractAnalyticsHandler","send","data","getAnalyticsFeature","KlaviyoEventHandler","eventData","type","attributes","properties","time","Date","metric","name","profile","axios","concat","getBasePath","logEventHandler","googleTagManagerBrand","gtmEventHandler","GoogleTagManagerHandler","klaviyoEventHandler","EventEmitter","defaultEventEmitter","handleEvent","handlers","forEach","handler","constructor","cookies","CookieStorage","optimizelyDecision","get","analyticsFeatureKey","feature","notApplicableString","analytic","brand","dataObject","gtag","sdk","initSDK","pllApiBaseUrl","process","pllWebsocketBaseUrl","PetcoLoveSDK","totalUnread","param","authToken","userEntityId","conversations","conversationsTotalUnread","contextId","read","error","UserContext","createContext","hasMessage","userType","isFetchingUser","isLoggedIn","isShelter","unreadMessageCount","fetchingUnreadMessageCount","getUnreadMessagesForUser","setUnreadMessageCount","UserContextProvider","children","idToken","me","isError","errorMessage","useMe","useState","setFetchingUnreadMessageCount","useMemo","awos","user","useCallback","id","unread","useEffect","jsx_runtime","jsx","Provider","value","useUserContext","useContext","today","tomorrow","getTime","getDateXMinutesFromNow","minutes","isDateValid","isNaN","date","LocalStorage","AbstractStorage","localStorage","getItem","parsedData","JSON","parse","expiration","delete","set","config","expires","setItem","stringify","removeItem","ObjectsHelpers_getExpirationDate","expirationDate","stringHelpers_parseToJSONSafe","str","SessionStorage","isAvailable","sessionStorage","parseToJSONSafe","getExpirationDate"],"sourceRoot":""}