{"version":3,"file":"static/chunks/9200-7a439f3809b5a92a.js","mappings":"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","sources":["webpack://_N_E/./src/components/atoms/Grid/GridClasses.ts","webpack://_N_E/./src/components/atoms/LostLogo/LostLogo.tsx","webpack://_N_E/./src/components/molecules/ButtonWithIcon/ButtonWithIcon.tsx","webpack://_N_E/./src/components/molecules/DropDownMenu/DropDownMenu.tsx","webpack://_N_E/./src/components/molecules/AnimatedIcon/AnimatedIcon.tsx","webpack://_N_E/./src/components/molecules/NavSideBar/NavSideBar.tsx","webpack://_N_E/./src/components/molecules/NavTopBar/NavTopBar.tsx","webpack://_N_E/./src/components/molecules/NotificationRow/NotificationRow.tsx","webpack://_N_E/./src/components/organisms/NotificationDrawer/NotificationDrawer.tsx","webpack://_N_E/./src/lib/hooks/websocket/useWebSocket.ts","webpack://_N_E/./src/components/organisms/Navbar/sections/Notifications.tsx","webpack://_N_E/./src/components/organisms/Navbar/Navbar.tsx","webpack://_N_E/./src/components/molecules/PersistentBanner/PersistentBanner.tsx","webpack://_N_E/./src/components/organisms/PersistentBannerHandler/PersistentBannerHandler.tsx","webpack://_N_E/./src/lib/hooks/shelterDashboard/ShelterLocation.tsx","webpack://_N_E/./src/lib/utils/analytics/getClientIdFromCookie.ts","webpack://_N_E/./src/lib/utils/analytics/viewPetMatchAlert.ts","webpack://_N_E/./src/lib/utils/helpers/shelterDashboard/isShelterAdmin.ts","webpack://_N_E/./src/lib/utils/helpers/shelterDashboard/navigation.ts","webpack://_N_E/<anon>"],"sourcesContent":["/** Grid Max Width */\nexport const gridMaxWidth =\n 'mx-6 sm:mx-8 md:px-10 md:mx-auto md:max-w-[1440px]';\n\n/** Grid Columns */\nexport const gridColumns =\n 'grid grid-flow-col grid-cols-4 gap-4 sm:grid-cols-6 sm:gap-6 md:grid-cols-12 md:gap-8';\n","import CdnImage from '@/component-library/atoms/CdnImage/CdnImage';\nimport Link from 'next/link';\n\n/**\n * ILostLogo Interface for Lost Logo component.\n *\n * @interface ILostLogo\n */\nexport interface ILostLogo {\n /**\n * The optional classes for the component.\n *\n * @memberof ILostLogo\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n /**\n * Whether to load the image immediately, used if logo is in the LCP.\n *\n * @memberof ILostLogo\n * @default false\n * @member {boolean} [priority]\n */\n priority?: boolean;\n /**\n * The variant for the logo.\n *\n * @memberof ILostLogo\n * @member {'standard' | 'small'} variant\n */\n variant: 'standard' | 'small';\n /**\n * The alt text for the logo.\n *\n * @memberof ILostLogo\n * @default 'Petco Love Lost Logo'\n * @member {string} [alt]\n */\n alt?: string;\n}\n\n/**\n * Logo Size Map This map is used to map the size prop of the Logo Image.\n *\n * @constant\n */\nconst sizes = {\n standard: { width: 253, height: 56 },\n small: { width: 253, height: 56 },\n};\n\n/**\n * Logo Variant Map This map is used to map the different versions of the logo.\n *\n * @constant\n */\nconst variantLogo = {\n standard:\n process.env.NEXT_PUBLIC_CDN_BASE_URL +\n '/assets/lost/lost-logo-standard.svg',\n small:\n process.env.NEXT_PUBLIC_CDN_BASE_URL + '/assets/lost/lost-logo-small.svg',\n};\n\n/**\n * Lost Logo Used to display the Petco Love Lost logo. This is a wrapper around\n * the Next.js Image component.\n *\n * @param {ILostLogo} props - The props for the LostLogo component\n * @returns {React.FC<ILostLogo>} LostLogo Component\n */\nconst LostLogo: React.FC<ILostLogo> = ({\n priority = false,\n classes = '',\n alt = 'Petco Love Lost Logo',\n variant,\n}: ILostLogo) => {\n const dataTestId = `lost-logo-${variant}`;\n return (\n <Link\n href=\"/\"\n className=\"inline-flex h-full focus:outline-none focus-visible:ring-solid focus-visible:ring-[1px] focus-visible:ring-focus-400 rounded\"\n >\n <CdnImage\n src={variantLogo[variant]}\n priority={priority}\n width={sizes[variant].width}\n height={sizes[variant].height}\n layout=\"intrinsic\"\n alt={alt}\n data-testid={dataTestId}\n className={classes}\n />\n </Link>\n );\n};\n\nexport default LostLogo;\n","import { ColorShade } from '@/components/atoms/Colors/Colors';\nimport Icon, { IIcon } from '@/components/atoms/Icon/Icon';\nimport { MouseEventHandler, useState } from 'react';\n\n/**\n * IButtonWithIcon Interface for the ButtonWithIcon Component\n *\n * @interface IButtonWithIcon\n */\nexport interface IButtonWithIcon {\n /**\n * The text to display.\n *\n * @memberof IButtonWithIcon\n * @member {string} children\n */\n children: string;\n /**\n * The icon to display.\n *\n * @memberof IButtonWithIcon\n * @member {IIcon} icon\n */\n icon: IIcon;\n /**\n * The onClick event handler.\n *\n * @memberof IButtonWithIcon\n * @member {MouseEventHandler<HTMLButtonElement>} [onClick]\n */\n onClick?: MouseEventHandler<HTMLButtonElement>;\n /**\n * If the button is disabled.\n *\n * @memberof IButtonWithIcon\n * @member {boolean} [disabled]\n */\n disabled?: boolean;\n /**\n * The optional classes to apply to the button.\n *\n * @memberof IButtonWithIcon\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n}\n\n/**\n * Icon State Styles This is the styles for the icon\n *\n * @constant\n */\nexport const iconStateStyles: {\n /** Color Map of the icon states */\n color: {\n [key: string]: string;\n };\n /** Shade Map of the icon states */\n shade: { [key: string]: ColorShade };\n} = {\n color: {\n hovered: 'base',\n normal: 'neutral',\n disabled: 'neutral',\n },\n shade: {\n hovered: 300,\n normal: 800,\n disabled: 500,\n },\n};\n\n/**\n * Button With Icon Button with Icon is used to display a button with an icon\n *\n * @param {IButtonWithIcon} props - The props for the Button With Icon component\n * @returns {React.FC<IButtonWithIcon>} Button With Icon Component\n */\nconst ButtonWithIcon: React.FC<IButtonWithIcon> = ({\n children,\n icon,\n onClick,\n disabled,\n classes = '',\n}: IButtonWithIcon) => {\n const [hovered, setHovered] = useState(false);\n // Set the icon color default to normal\n let iconColor = iconStateStyles.color.normal;\n let iconShade = iconStateStyles.shade.normal;\n // Determine if the button is hovered or disabled since a disabled button can not also be hovered\n if (disabled) {\n iconColor = iconStateStyles.color.disabled;\n iconShade = iconStateStyles.shade.disabled;\n } else if (hovered) {\n iconColor = iconStateStyles.color.hovered;\n iconShade = iconStateStyles.shade.hovered;\n }\n\n const disabledClass = disabled\n ? 'text-neutral-500 cursor-not-allowed group-hover:text-neutral-500'\n : 'text-neutral-800';\n\n const testId = `button-with-icon-${hovered}-${disabled}`;\n return (\n <button\n data-testid={testId}\n onClick={onClick}\n type=\"button\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n disabled={disabled}\n className={`inline-flex items-center rounded-sm focus-visible:ring-focus-400 ring-0 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-0 focus-visible:outline group text-body5 ${classes}`}\n >\n <Icon\n {...icon}\n colorType={iconColor}\n colorShade={iconShade}\n classes={disabledClass}\n />\n <span className={`pl-1.5 group-hover:text-base-300 ${disabledClass}`}>\n {children}\n </span>\n </button>\n );\n};\n\nexport default ButtonWithIcon;\n","import { ColorShade, ColorType } from '@/components/atoms/Colors/Colors';\nimport Icon, { IIcon } from '@/components/atoms/Icon/Icon';\nimport { Menu } from '@headlessui/react';\nimport Link from 'next/link';\nimport React from 'react';\n\n/**\n * IMenuItem\n *\n * @interface IMenuItem\n */\nexport interface IMenuItem {\n /**\n * The text to display.\n *\n * @memberof IMenuItem\n * @member {string} name\n */\n name: string;\n /**\n * The url to display\n *\n * @memberof IMenuItem\n * @member {string} url\n */\n url: string;\n /**\n * Whether the menu item is active or not.\n *\n * @memberof IMenuItem\n * @member {boolean} [active]\n */\n active?: boolean;\n /**\n * The optional target of the link.\n *\n * @memberof IMenuItem\n * @member {string} [target]\n */\n target?: string;\n /**\n * The optional close function for the link.\n *\n * @memberof IMenuItem\n * @member {() => void} [close]\n */\n close?: () => void;\n /**\n * Whether the item is a destructive action\n *\n * @memberof IMenuItem\n * @member {boolean} [destructive]\n */\n destructive?: boolean;\n}\n\n/**\n * IMenuButton\n *\n * @interface IMenuButton\n */\nexport interface IMenuButton {\n /**\n * The text to display.\n *\n * @memberof IMenuButton\n * @member {string} name\n */\n name: string;\n /**\n * The on click handler.\n *\n * @memberof IMenuButton\n * @member {() => void} onClick\n */\n onClick: () => void;\n /**\n * Whether the item is a destructive action\n *\n * @memberof IMenuButton\n * @member {boolean} [destructive]\n */\n destructive?: boolean;\n}\n\n/**\n * MenuLink This Next Link ref is used to create a link for the menu item. The\n * Next Link element can not be used inside of the headless ui menu component.\n */\nconst MenuLink = React.forwardRef<HTMLAnchorElement, IMenuItem>(\n (props, ref) => {\n const { url, name, active, destructive, close, ...rest } = props;\n return (\n <div\n onClick={() => close && close()}\n data-testid=\"menulink-clickable\"\n className=\"w-full\"\n >\n <Link\n href={url}\n ref={ref}\n {...rest}\n className={[\n 'w-full flex text-body4',\n destructive && '!text-error-200 hover:text-error-300',\n active ? 'text-base-300' : 'text-neutral-800',\n ].join(' ')}\n >\n {name}\n </Link>\n </div>\n );\n }\n);\nMenuLink.displayName = 'MenuLink';\n\n/**\n * IDropDownIcon\n *\n * @augments IIcon\n * @interface IDropDownIcon\n */\nexport interface IDropDownIcon extends IIcon {\n /**\n * The color type of the icon when active or hovered\n *\n * @memberof IDropDownIcon\n * @member {ColorType} activeColorType\n */\n activeColorType: ColorType;\n /**\n * The color shade of the icon when active or hovered\n *\n * @memberof IDropDownIcon\n * @member {ColorShade} activeColorShade\n */\n activeColorShade: ColorShade;\n}\n\n/**\n * IDropDownMenu\n *\n * @interface IDropDownMenu\n */\nexport interface IDropDownMenu {\n /**\n * The items to display.\n *\n * @memberof IDropDownMenu\n * @member {(IMenuItem | IMenuButton)[]} items\n */\n items: Array<IMenuItem | IMenuButton>;\n /**\n * Icon to display for the menu.\n *\n * @memberof IDropDownMenu\n * @member {IDropDownIcon} icon\n */\n icon: IDropDownIcon;\n /**\n * The classes for the menu.\n *\n * @memberof IDropDownMenu\n * @member {string} [menuClasses]\n */\n menuClasses?: string;\n}\n\n/**\n * Drop Down Menu The Drop Down Menu Component that renders a drop down menu.\n *\n * @param {IDropDownMenu} props - The props for the Drop Down Menu Component\n * @returns {React.FC<IDropDownMenu>} Drop Down Menu Component\n */\nconst DropDownMenu: React.FC<IDropDownMenu> = ({\n items,\n menuClasses,\n icon,\n}: IDropDownMenu) => {\n const [iconHover, setIconHover] = React.useState<boolean>(false);\n\n return (\n <Menu\n as=\"div\"\n data-testid=\"drop-down-menu\"\n className=\"relative inline-block\"\n >\n {({ open }) => (\n <>\n <Menu.Button\n data-headlessui-state=\"open\"\n data-testid=\"drop-down-menu-button\"\n className=\"flex align-center\"\n onMouseEnter={() => setIconHover(true)}\n onMouseLeave={() => setIconHover(false)}\n >\n <Icon\n data-testid=\"drop-down-menu-icon\"\n icon={icon.icon}\n size={icon.size}\n colorType={\n open || iconHover ? icon.activeColorType : icon.colorType\n }\n colorShade={\n open || iconHover ? icon.activeColorShade : icon.colorShade\n }\n />\n </Menu.Button>\n <Menu.Items\n className={`${menuClasses} w-[222px] bg-neutral-100 absolute right-0 py-3.5 drop-shadow-[0_2px_8px_rgba(0,0,0,0.04)]`}\n >\n {items.map((item) => (\n <div key={item.name} className=\"w-full\">\n {'url' in item && (\n <Menu.Item\n as=\"div\"\n className=\"w-full hover:text-base-300 cursor-pointer px-5 py-1.5\"\n data-testid={`drop-down-menu-${item.name}`}\n >\n {({ active, close }) => (\n <MenuLink\n url={item.url}\n name={item.name}\n active={active}\n close={close}\n destructive={item.destructive}\n />\n )}\n </Menu.Item>\n )}\n {'onClick' in item && (\n <Menu.Button\n className=\"focus:text-base-300 hover:text-base-300 text-neutral-800 text-body4 w-full text-left px-5 py-1.5\"\n onClick={() => item.onClick()}\n >\n {item.name}\n </Menu.Button>\n )}\n </div>\n ))}\n </Menu.Items>\n </>\n )}\n </Menu>\n );\n};\n\nexport default DropDownMenu;\n","import { IconType, chooseIcon } from '@/components/atoms/Icon/Icon';\nimport Link from 'next/link';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * IAnimatedIcon\n *\n * @augments React.ButtonHTMLAttributes<HTMLButtonElement>\n * @augments React.AnchorHTMLAttributes<HTMLAnchorElement>\n * @interface IAnimatedIcon\n */\nexport interface IAnimatedIcon\n extends React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n /**\n * The icon to display\n *\n * @memberof IAnimatedIcon\n * @member {IconType} iconType\n */\n iconType: IconType;\n /**\n * The srText to display\n *\n * @memberof IAnimatedIcon\n * @member {string} [srText]\n */\n srText?: string;\n /**\n * The showAnimation is true if the animation should be shown\n *\n * @memberof IAnimatedIcon\n * @member {boolean} [showAnimation]\n */\n showAnimation?: boolean;\n /**\n * The href to link to\n *\n * @memberof IAnimatedIcon\n * @member {string} [href]\n */\n href?: string;\n /**\n * The classes to apply to the icon\n *\n * @memberof IAnimatedIcon\n * @member {string} [className]\n */\n className?: string;\n /**\n * The classes to apply to the animation\n *\n * @memberof IAnimatedIcon\n * @member {string} [animationClassName]\n */\n animationClassName?: string;\n}\n\n/**\n * AnimatedIcon A message icon with an alert animation\n *\n * @param {IAnimatedIcon} props - The props for the AnimatedIcon component\n * @returns {React.FC<IAnimatedIcon>} Component\n */\nconst AnimatedIcon: React.FC<IAnimatedIcon> = ({\n iconType,\n srText,\n showAnimation = false,\n href,\n className = '',\n animationClassName,\n ...rest\n}: IAnimatedIcon) => {\n const SelectedIcon = chooseIcon(iconType);\n\n const renderChildren = (\n <>\n <span\n className={\n showAnimation\n ? 'text-base-300 hover:text-base-400'\n : 'text-neutral-800 hover:text-base-300'\n }\n >\n <SelectedIcon color=\"currentColor\" size={24} />\n </span>\n {srText && <span className=\"sr-only\">{srText}</span>}\n {showAnimation && (\n <span\n data-testid=\"animated-icon-animation\"\n className={twMerge(\n 'w-2 h-2 ml-px mt-0.5 rounded-full border border-base-300 animate-pulse-bg-step-medium from-base-200 to-base-400 absolute right-0 -top-0.5 group-hover:animate-none group-hover:bg-base-200 group-hover:border-base-400',\n animationClassName\n )}\n ></span>\n )}\n </>\n );\n\n return (\n <div data-testid=\"animated-icon\" className={className}>\n {href ? (\n <Link\n href={href}\n className=\"inline-flex relative group\"\n data-testid=\"animated-icon-anchor\"\n {...rest}\n >\n {renderChildren}\n </Link>\n ) : (\n <button\n className=\"inline-flex relative group\"\n data-testid=\"animated-icon-button\"\n {...rest}\n >\n {renderChildren}\n </button>\n )}\n </div>\n );\n};\n\nexport default AnimatedIcon;\n","import Heading from '@/components/atoms/Heading/Heading';\nimport Icon from '@/components/atoms/Icon/Icon';\nimport ButtonWithIcon from '@/components/molecules/ButtonWithIcon/ButtonWithIcon';\nimport { LinkType } from '@/components/organisms/Navbar/Navbar';\nimport Link from 'next/link';\nimport { useState } from 'react';\n\n/**\n * INavSideBar Interface for the Nav Side Bar Component\n *\n * @interface INavSideBar\n */\nexport interface INavSideBar {\n /**\n * The Main Links for the NavSideBar\n *\n * @memberof INavSideBar\n * @member {LinkType[]} mainLinks\n */\n mainLinks: LinkType[];\n /**\n * The Lower Links for the NavSideBar\n *\n * @memberof INavSideBar\n * @member {LinkType[]} bottomLinks\n */\n bottomLinks: LinkType[];\n /**\n * The optional classes for the component.\n *\n * @memberof INavSideBar\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n}\n\n/**\n * Nav Side Bar Nav Side Bar Component for displaying the navigation links on\n * the left side of the screen.\n *\n * @param {INavSideBar} props - The props for the component.\n * @returns {React.FC<INavSideBar>} Nav Side Bar Component\n */\nconst NavSideBar: React.FC<INavSideBar> = ({\n mainLinks,\n bottomLinks,\n classes = '',\n}: INavSideBar) => {\n const [showSidebar, setShowSidebar] = useState(false);\n\n return (\n <div data-testid=\"nav-side-bar\" className={classes}>\n <button\n data-collapse-toggle=\"navbar-default\"\n data-testid=\"nav-side-bar-button\"\n type=\"button\"\n onClick={() => setShowSidebar(!showSidebar)}\n className=\"inline-flex items-center mr-[5px] text-sm text-gray-500 rounded-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600\"\n aria-controls=\"navbar-default\"\n aria-expanded=\"false\"\n >\n <span className=\"sr-only\">Open Main Menu</span>\n <Icon icon=\"menu\" colorShade={800} colorType=\"neutral\" size={24} />\n </button>\n <div\n className={`top-0 left-0 bg-neutral-100 fixed transition-all duration-500 h-full z-40 ${\n showSidebar ? 'translate-x-0 w-[100vw]' : '-translate-x-full'\n }`}\n >\n {showSidebar && (\n <div className=\"p-5 relative\" data-testid=\"nav-side-bar-drawer\">\n <span className=\"font-petco text-overline font-bold uppercase text-base-300\">\n Menu\n </span>\n <button\n data-collapse-toggle=\"navbar-default\"\n data-testid=\"nav-side-bar-close-button\"\n type=\"button\"\n onClick={() => setShowSidebar(!showSidebar)}\n className=\"absolute top-6 right-6\"\n aria-controls=\"navbar-default\"\n aria-expanded=\"false\"\n >\n <span className=\"sr-only\">Close Main Menu</span>\n <Icon icon=\"close\" colorShade={400} colorType=\"base\" size={24} />\n </button>\n <ul className=\"mt-[23px]\">\n {mainLinks.map((link) => (\n <li\n className=\"mb-3.5\"\n key={link.name}\n onClick={() => setShowSidebar(!showSidebar)}\n data-testid=\"nav-side-bar-main-link\"\n >\n <Link href={link.url}>\n <Heading size=\"h3\">{link.name}</Heading>\n </Link>\n </li>\n ))}\n </ul>\n <ul className=\"mt-8\">\n <li className=\"font-petco font-bold text-body4 mb-3\">\n Our Family\n </li>\n {bottomLinks.map((link) => (\n <li\n key={link.name}\n className={`font-petco mb-3 ${\n link.classes ? link.classes : ''\n } text-body4`}\n >\n <a\n href={link.url}\n target={link.target}\n rel=\"noopener noreferrer\"\n >\n {link.icon ? (\n <ButtonWithIcon\n icon={link.icon}\n classes={link.buttonClasses}\n >\n {link.name}\n </ButtonWithIcon>\n ) : (\n link.name\n )}\n </a>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NavSideBar;\n","import ButtonWithIcon from '@/components/molecules/ButtonWithIcon/ButtonWithIcon';\nimport { LinkType } from '@/components/organisms/Navbar/Navbar';\nimport { cva } from 'cva';\nimport Link from 'next/link';\nimport { Fragment } from 'react';\n\n/**\n * INavTopBar - The props for the NavTopBar component\n *\n * @interface INavTopBar\n */\nexport interface INavTopBar {\n /**\n * The Links to display across the top navigation.\n *\n * @memberof INavTopBar\n * @member {LinkType[]} links\n */\n links: LinkType[];\n}\n\nconst navTopBarLinkClasses = cva(\n 'text-overline font-petco hover:text-base-300 flex',\n {\n variants: {\n state: {\n active: 'text-base-400 font-bold',\n base: '',\n },\n },\n }\n);\n\n/**\n * Nav Top Bar Top Navigation Bar Component for displaying the navigation links\n * across the top of the screen.\n *\n * @param {INavTopBar} props - The props for the component.\n * @returns {React.FC<INavTopBar>} Nav Top Bar Component\n */\nconst NavTopBar: React.FC<INavTopBar> = ({ links }: INavTopBar) => {\n return (\n <div\n className=\"bg-neutral-200 py-2.5 px-10 text-center hidden md:flex items-center justify-center space-x-4 h-10\"\n data-testid=\"nav-top-bar\"\n >\n {links.map((item, index, totalItems) => {\n const isLast = index === totalItems.length - 1;\n return (\n <Fragment key={item.name}>\n <div data-testid=\"nav-top-bar-link\">\n <Link\n href={item.url}\n className={navTopBarLinkClasses({\n state: item.active ? 'active' : 'base',\n })}\n target={item.target}\n >\n {item.icon ? (\n <ButtonWithIcon icon={item.icon} classes={item.buttonClasses}>\n {item.name}\n </ButtonWithIcon>\n ) : (\n item.name\n )}\n </Link>\n </div>\n {!isLast && (\n <div>\n <span className={navTopBarLinkClasses({ state: 'base' })}>\n |\n </span>\n </div>\n )}\n </Fragment>\n );\n })}\n </div>\n );\n};\n\nexport default NavTopBar;\n","import CdnImage from '@/component-library/atoms/CdnImage/CdnImage';\nimport Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport useMe from '@/lib/hooks/me/useMe';\nimport { useUserContext } from '@/lib/hooks/userContext/UserContext';\nimport { NotificationAlertState } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/websocket/uiNotifications/interfaces';\nimport { formatDistanceStrict } from 'date-fns/formatDistanceStrict';\nimport Link from 'next/link';\nimport { useMemo } from 'react';\n\n/**\n * INotificationRow\n *\n * @interface\n */\nexport interface INotificationRow {\n /** The Id of the notification alert */\n alertId: string;\n /** The Image to be displayed on the notification */\n image: string;\n /** The headline text to be displayed on the notification */\n headline: string;\n /** The label of the link */\n linkLabel: string;\n /** The URL of the link */\n linkUrl: string;\n /** The date that this notification was sent */\n date?: Date;\n /** The state of the notification */\n state: NotificationAlertState;\n /** The callback onClick event */\n onClick?: (alertId: string, state: NotificationAlertState) => void;\n /** Close the notification drawer */\n closeDrawer?: () => void;\n /** Event Type */\n eventType?: string;\n /** The pet id */\n petId?: number;\n}\n\n/**\n * NotificationRow A row component used to display notifications\n *\n * @param {INotificationRow} props - The props for the NotificationRow component\n * @returns {React.FC<INotificationRow>} Component\n */\nconst NotificationRow: React.FC<INotificationRow> = ({\n alertId,\n image,\n headline,\n linkLabel,\n linkUrl,\n date,\n state,\n onClick,\n closeDrawer,\n eventType,\n petId,\n}) => {\n const { userType } = useUserContext();\n const { me } = useMe();\n\n /** This is the AWO ID */\n const awoId = useMemo(() => {\n if (me?.awos?.length) {\n return me?.awos[0].id;\n }\n }, [me]);\n\n /** This is the path to the match results page */\n const matchResultsPath = '/dash/match-results';\n\n /** This is the path to the shelter potential matches page */\n const shelterPotentialMatchesPath = `/shelter-dashboard/pets/${petId}/matches/?awoId=${awoId}`;\n\n /**\n * Determine the path to use with the notification link\n *\n * @param {string} linkUrl - The URL to use with the notification link\n * @param {string} eventType - The type of search that resulted in the\n * notification\n * @returns {string} - The path to use with the notification link\n */\n const getLinkPath = (linkUrl: string, eventType?: string) => {\n // If the event is for a microchip search go to the pet details page regardless of the user type\n if (eventType && eventType === 'persistentSearchMicrochipMatch') {\n return linkUrl;\n }\n // If event is of type persistentSearchMatchWithNewPet go to the pet details page\n if (eventType && eventType === 'persistentSearchMatchWithNewPet') {\n return linkUrl;\n }\n // If the user is a shelter user go to the shelter potential matches page\n if (userType === 'shelter') {\n return shelterPotentialMatchesPath;\n }\n // Otherwise go to the match results page\n return matchResultsPath + linkUrl;\n };\n return (\n <div data-testid=\"notification-row\">\n <Link\n href={getLinkPath(linkUrl, eventType)}\n className=\"w-full group\"\n target=\"_blank\"\n onClick={() => {\n onClick?.(alertId, state);\n closeDrawer?.();\n }}\n data-testid={`notification-row-cta-${alertId}`}\n >\n <div className=\"flex flex-row py-4\">\n {(state === 'unread' || state === 'unseen') && (\n <div className=\"mr-3 h-[71px] bg-base-300 w-1 rounded-full\"></div>\n )}\n <div className=\"w-[71px] h-[71px] relative rounded-lg overflow-hidden\">\n <CdnImage\n src={image}\n width={71}\n height={71}\n alt=\"Pet image\"\n className=\"group-hover:transform group-hover:scale-110 transition-all duration-200 object-cover\"\n />\n </div>\n <div className=\"flex flex-col justify-center pl-4 space-y-[3.5px] flex-shrink\">\n <Paragraph size=\"body5\" styling=\"bold\">\n {headline}\n </Paragraph>\n <span className=\"text-[14px] leading-[22px] underline visited:text-base-300 group-hover:text-base-300\">\n {linkLabel}\n </span>\n {date && (\n <Paragraph\n data-testid=\"delta-time\"\n size=\"overline\"\n className=\"text-neutral-600\"\n >\n {formatDistanceStrict(date, new Date())}\n </Paragraph>\n )}\n </div>\n </div>\n </Link>\n </div>\n );\n};\n\nexport default NotificationRow;\n","import Divider from '@/components/atoms/Divider/Divider';\nimport Heading from '@/components/atoms/Heading/Heading';\nimport Icon from '@/components/atoms/Icon/Icon';\nimport Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport NotificationRow, {\n INotificationRow,\n} from '@/components/molecules/NotificationRow/NotificationRow';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * INotificationDrawer\n *\n * @interface INotificationDrawer\n */\nexport interface INotificationDrawer {\n /**\n * The notifications to be displayed in the drawer\n *\n * @memberof INotificationDrawer\n * @member {INotificationRow[]} [notifications]\n */\n notifications?: INotificationRow[];\n /**\n * The optional className\n *\n * @memberof INotificationDrawer\n * @member {string} [className]\n */\n className?: string;\n /**\n * The optional button click handler\n *\n * @memberof INotificationDrawer\n * @member {() => void} [onButtonClick]\n */\n onButtonClick?: () => void;\n /**\n * Close the notification Drawer\n *\n * @memberof INotificationDrawer\n * @member {() => void} [closeDrawer]\n */\n closeDrawer?: () => void;\n}\n\n/**\n * NotificationDrawer A drawer used to contain a list of notifications\n *\n * @param {INotificationDrawer} props - The props for the NotificationDrawer\n * component\n * @returns {React.FC<INotificationDrawer>} Component\n */\nconst NotificationDrawer: React.FC<INotificationDrawer> = ({\n notifications,\n className = '',\n onButtonClick,\n closeDrawer,\n}: INotificationDrawer) => {\n return (\n <div\n data-testid=\"notification-drawer\"\n className={twMerge(\n 'flex flex-col w-screen sm:w-[376px] h-screen sm:h-[550px] bg-neutral-100 pl-6 pr-2 overflow-hidden sm:shadow-[0px_12px_16px_0px_rgba(0,0,0,0.12)] absolute rounded-b-2xl z-[12] top-0',\n className\n )}\n >\n <div className=\"flex justify-between items-center sticky top-0 bg-neutral-100 sm:hidden pb-5 pt-4 pr-4\">\n <Heading size=\"h5\" className=\"text-secondaryBase-400\">\n Notifications\n </Heading>\n <button\n data-testid=\"close-button\"\n className=\"text-secondaryBase-400\"\n onClick={onButtonClick}\n >\n <div className=\"flex flex-row items-center\">\n <Icon\n icon=\"close\"\n size={20}\n colorType=\"neutral\"\n colorShade={800}\n classes=\"px-1\"\n />\n <Paragraph size=\"body5\">Close</Paragraph>\n </div>\n </button>\n </div>\n <div className=\"flex flex-col h-full overflow-y-auto\">\n <div className=\"justify-start items-center bg-neutral-100 pt-6 pb-4 z-[11] hidden sm:flex\">\n <Heading size=\"h5\" className=\"text-secondaryBase-400\">\n Notifications\n </Heading>\n </div>\n {notifications && notifications.length > 0 ? (\n notifications.map((notification, index) => (\n <div key={index} className=\"pr-4\">\n <Divider type=\"lightGrey\" />\n <NotificationRow {...notification} closeDrawer={closeDrawer} />\n </div>\n ))\n ) : (\n <div\n data-testid=\"empty-notifications\"\n className=\"flex flex-col w-full pr-4\"\n >\n <Divider type=\"lightGrey\" />\n <Paragraph size=\"body5\" className=\"text-neutral-800 pt-4\">\n Keep an eye out here for new notifications!\n </Paragraph>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NotificationDrawer;\n","import { WebSocketState } from '@petcolove/lost--client--api-sdk/dist/abstract/service/interfaces/websocket-service';\nimport { BaseWebSocketService } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/websocket/base-websocket-service';\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n IWebSocketConfig,\n IWebSocketServiceState,\n ServerMessageFrom,\n} from './interfaces';\n\nconst defaultWebSocketConfig: IWebSocketConfig = {\n messageBufferSize: Infinity,\n disable: false,\n};\n\n/**\n * WebSocket integration hook.\n *\n * @template TWebSocketService\n * @param {() => TWebSocketService} createWebSocketService - WebSocket service\n * factory for lazy initialization.\n * @param {IWebSocketConfig} configOverrides - Custom connection options.\n * @returns {IWebSocketServiceState<TWebSocketService>} - The processed messages\n * and service instance.\n */\nexport function useWebSocketService<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TWebSocketService extends BaseWebSocketService<any, any>\n>(\n createWebSocketService: () => TWebSocketService,\n configOverrides: IWebSocketConfig\n): IWebSocketServiceState<TWebSocketService> {\n /** Extracted server message generic */\n type TServerMessage = ServerMessageFrom<TWebSocketService>;\n\n // Consolidated config object\n const config = {\n ...defaultWebSocketConfig,\n ...configOverrides,\n } as Required<IWebSocketConfig>;\n\n // React state <-> socket messages connection\n const [buffer, setBuffer] = useState<TServerMessage[]>([]);\n\n // React state <-> status change connection\n const [status, setStatus] = useState<WebSocketState>('void');\n\n // One-off lazy initialization of the service instance\n const service = useMemo(\n () => (config.disable ? null : createWebSocketService()),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.disable]\n );\n\n // Initialize (and cleanup) socket service connection\n useEffect(() => {\n if (!service) {\n return;\n }\n\n service.connect();\n\n const unsubscribe = service.addEventListener((message) => {\n setBuffer((current) =>\n [message, ...current].slice(0, config.messageBufferSize)\n );\n });\n\n /**\n * Void handler to refresh the socket connection status\n *\n * @returns {void}\n */\n const onStatusChange = () => setStatus(service.getStatus());\n\n /*\n * We don't really need to track the status changes since the service\n * already provides a function to check the status in the WebSocket\n * instance itself\n */\n service.connection?.addEventListener('open', onStatusChange);\n service.connection?.addEventListener('close', onStatusChange);\n service.connection?.addEventListener('error', onStatusChange);\n\n return () => {\n service.connection?.removeEventListener('open', onStatusChange);\n service.connection?.removeEventListener('close', onStatusChange);\n service.connection?.removeEventListener('error', onStatusChange);\n unsubscribe();\n };\n }, [config.messageBufferSize, service]);\n\n return useMemo(\n () => ({\n messages: {\n all: buffer,\n last: buffer.at(0),\n },\n status: status,\n service: service,\n }),\n [buffer, status, service]\n );\n}\n","import AnimatedIcon from '@/components/molecules/AnimatedIcon/AnimatedIcon';\nimport { INotificationRow } from '@/components/molecules/NotificationRow/NotificationRow';\nimport NotificationDrawer from '@/components/organisms/NotificationDrawer/NotificationDrawer';\nimport { sdk } from '@/lib/dataSource/lostApi/common';\nimport { useUserContext } from '@/lib/hooks/userContext/UserContext';\nimport { useWebSocketService } from '@/lib/hooks/websocket/useWebSocket';\nimport { getClientIdFromCookie } from '@/lib/utils/analytics/getClientIdFromCookie';\nimport { viewPetMatchAlertEventHandler } from '@/lib/utils/analytics/viewPetMatchAlert';\nimport { useComponentFocused } from '@/lib/utils/ComponentFocused/ComponentFocused';\nimport { NotificationAlertState } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/websocket/uiNotifications/interfaces';\nimport { useCallback, useEffect, useState } from 'react';\n\n/**\n * Helper function to init the websocket hook and retrieve messages\n *\n * @returns {object} - The array of notifications and the websocket service\n * instance\n */\nconst useUiNotifications = () => {\n const { idToken, me } = useUserContext();\n const { service, status, messages } = useWebSocketService(\n () => sdk.uiNotifications({ authToken: idToken }),\n {\n disable: !idToken,\n messageBufferSize: 1,\n }\n );\n\n useEffect(() => {\n if (service && status === 'open') {\n service?.getAlerts();\n }\n }, [service, status]);\n\n /**\n * Updates the message to read status on click\n *\n * @param {string} alertId - The id of the alert\n * @param {NotificationAlertState} state - The state of the alert\n * @returns {void}\n */\n const handleNotificationClick = (\n alertId: string,\n state: NotificationAlertState\n ) => {\n if (me?.user.id && alertId) {\n // Send the view pet match alert event to google analytics\n viewPetMatchAlertEventHandler({\n eventId: alertId,\n platform: 'app',\n userId: me.user.id,\n });\n }\n\n if (\n service &&\n status === 'open' &&\n (state === 'unread' || state === 'unseen')\n ) {\n const clientId = getClientIdFromCookie();\n\n service?.readAlert(alertId, clientId);\n }\n };\n\n /**\n * This will map the values of the alert to an array of INotificationRow\n * interface then filter out any notifications without images, link urls, or\n * dates\n *\n * @constant {INotificationRow[]} notifications - The array of notifications\n */\n const notifications: INotificationRow[] = (messages.last ?? [])\n .map((alert) => ({\n alertId: alert.alertId,\n image: alert.ctaDetails.photoUrl,\n headline: alert.ctaDetails.heading,\n linkLabel: alert.ctaDetails.linkText,\n linkUrl: alert.ctaDetails.url,\n date: alert.ctaDetails?.createdAt\n ? new Date(alert.ctaDetails.createdAt)\n : undefined,\n state: alert.ctaDetails.state,\n onClick: handleNotificationClick,\n eventType: alert.eventType,\n petId: alert.petEntityId,\n }))\n .filter(\n (notification) =>\n notification.image &&\n notification.linkUrl &&\n notification.date &&\n notification.state !== 'dismissed'\n );\n\n return {\n notifications,\n service,\n };\n};\n\n/**\n * Notifications with drawer for the navbar\n *\n * @returns {React.FC} Notifications for the Navbar\n */\nconst Notifications = () => {\n const { notifications: listNotifications, service } = useUiNotifications();\n const { ref, isComponentFocused } = useComponentFocused(false);\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const [showAnimation, setShowAnimation] = useState(\n listNotifications.some((notification) => notification.state === 'unseen')\n );\n\n // Optimistic update\n const [isUpdating, setIsUpdating] = useState(false);\n\n // Updates all the unseen messages when the user opens the drawer\n const handleSeeAlert = useCallback(() => {\n // Optimistic update to hide the animation\n setShowAnimation(false);\n setIsUpdating(true);\n const unseenNotifications = listNotifications.filter(\n (notification) => notification.state === 'unseen'\n );\n if (unseenNotifications.length > 0) {\n unseenNotifications.forEach((notification) => {\n service?.seeAlert(notification.alertId);\n });\n }\n }, [listNotifications, service]);\n\n // On click outside of the component\n useEffect(() => {\n if (!isComponentFocused) {\n setIsDrawerOpen(false);\n }\n }, [isComponentFocused]);\n\n // If we receive new unseen notifications\n useEffect(() => {\n if (!isUpdating) {\n setShowAnimation(\n listNotifications.some(\n (notification) => notification.state === 'unseen'\n )\n );\n }\n }, [listNotifications, isUpdating]);\n\n return (\n <div className=\"relative z-[12]\" ref={ref}>\n <AnimatedIcon\n iconType=\"bell\"\n showAnimation={!isUpdating && showAnimation}\n onClick={() => {\n const _isDrawerOpen = !isDrawerOpen;\n setIsDrawerOpen(_isDrawerOpen);\n handleSeeAlert();\n if (!_isDrawerOpen) {\n // Closing the drawer clears the optimistic update\n setIsUpdating(false);\n }\n }}\n animationClassName=\"mr-0.5 mt-1\"\n />\n <NotificationDrawer\n notifications={listNotifications}\n closeDrawer={() => setIsDrawerOpen(false)}\n className={`right-0 fixed sm:absolute sm:top-11 ${\n isDrawerOpen ? 'flex' : 'hidden'\n }`}\n onButtonClick={() => setIsDrawerOpen(false)}\n />\n </div>\n );\n};\n\nexport default Notifications;\n","import { gridMaxWidth } from '@/components/atoms/Grid/GridClasses';\nimport { IIcon } from '@/components/atoms/Icon/Icon';\nimport LostLogo from '@/components/atoms/LostLogo/LostLogo';\nimport AnimatedIcon from '@/components/molecules/AnimatedIcon/AnimatedIcon';\nimport ButtonWithIcon from '@/components/molecules/ButtonWithIcon/ButtonWithIcon';\nimport DropDownMenu, {\n IDropDownIcon,\n IMenuButton,\n IMenuItem,\n} from '@/components/molecules/DropDownMenu/DropDownMenu';\nimport NavSideBar from '@/components/molecules/NavSideBar/NavSideBar';\nimport NavTopBar from '@/components/molecules/NavTopBar/NavTopBar';\nimport PersistentBannerHandler, {\n usePersistentBannerHandler,\n} from '@/components/organisms/PersistentBannerHandler/PersistentBannerHandler';\nimport { defaultEventEmitter } from '@/lib/analytics/commonEmitter';\nimport { flagShelterPersistentSearch } from '@/lib/constants/constants/featureFlags';\nimport { useOptimizelyFeature } from '@/lib/hooks/featureFlags/useOptimizelyFeature';\nimport useMe from '@/lib/hooks/me/useMe';\nimport { usePersistentBannerContext } from '@/lib/hooks/persistentBanner/PersistentBanner';\nimport { useShelterLocationContext } from '@/lib/hooks/shelterDashboard/ShelterLocation';\nimport getBasePath from '@/lib/utils/getBasePath/getBasePath';\nimport { getIsShelterAdmin } from '@/lib/utils/helpers/shelterDashboard/isShelterAdmin';\nimport { getShelterDashDropdownLinks } from '@/lib/utils/helpers/shelterDashboard/navigation';\nimport Link from 'next/link';\nimport React from 'react';\nimport Notifications from './sections/Notifications';\n\n/**\n * Link Type For Navbar\n *\n * @typedef LinkType - The link type for the navbar.\n */\nexport type LinkType = {\n /** The url of the link. */\n url: string;\n /** The name of the link. */\n name: string;\n /** The optional active state of the link. */\n active?: boolean;\n /** The optional target of the link. */\n target?: string;\n /** The optional element to render instead of a link. */\n icon?: IIcon;\n /** The optional classes to add to the link. */\n classes?: string;\n /** The optional classes to add to the icon button. */\n buttonClasses?: string;\n};\n\n/**\n * Links Links to be used in the navbar.\n *\n * @constant\n */\nconst links = [\n {\n name: 'Lost Pet Tips',\n url: '/lost-tips/',\n },\n {\n name: 'Found Pet Tips',\n url: '/found-tips/',\n },\n {\n name: 'How to Help',\n url: '/how-to-help/',\n },\n {\n name: 'About',\n url: '/about/',\n },\n];\n\n/**\n * Generate Family Links - Links to be used in the navbar for family sites.\n *\n * @param {'top' | 'aside'} variant - Where the links are going to be used.\n * @returns {LinkType[]} - The link types\n */\nfunction generateFamilyLinks(variant: 'top' | 'aside') {\n const sizeMap = {\n top: 20,\n aside: 24,\n };\n\n const classesMap = {\n top: '',\n aside: 'mt-8',\n };\n\n const buttonClasses = {\n top: '!text-[0.75rem]',\n aside: '!text-[1rem]',\n };\n\n const familyLinks: LinkType[] = [\n {\n name: 'Petco Love',\n url: 'https://petcolove.org',\n target: '_blank',\n },\n {\n name: 'Petco Love Adopt',\n url: 'https://petcolove.org/adopt/',\n target: '_blank',\n },\n {\n name: 'Petco Love Care',\n url: 'https://petcolove.org/care/',\n target: '_blank',\n },\n {\n url: '/spanish',\n name: 'Español',\n icon: {\n icon: 'globe',\n size: sizeMap[variant],\n colorType: 'black',\n colorShade: 100,\n },\n classes: classesMap[variant],\n buttonClasses: buttonClasses[variant],\n },\n ];\n\n return familyLinks;\n}\n\n/**\n * IDesktopNavLinks Interface for the Desktop Navigation Links\n *\n * @interface IDesktopNavLinks\n */\ninterface IDesktopNavLinks {\n /**\n * The links to display in the desktop navigation.\n *\n * @memberof IDesktopNavLinks\n * @member {LinkType[]} links\n */\n links: LinkType[];\n}\n\n/**\n * Desktop Nav Links Desktop Navigation Links Component used to display out the\n * links for the desktop navigation.\n *\n * @param {IDesktopNavLinks} props - The props for the DesktopNavLinks\n * component.\n * @returns {React.FC<IDesktopNavLinks>} DesktopNavLinks Component\n */\nconst DesktopNavLinks: React.FC<IDesktopNavLinks> = ({\n links,\n}: IDesktopNavLinks) => {\n return (\n <ul className=\"flex items-center flex-row h-16 space-x-8 \">\n {links.map((link) => (\n <li key={link.name} className=\"h-full flex items-center\">\n <Link\n href={link.url}\n className={`text-body4 font-bold border-b-4 border-invisible hover:border-b-4 hover:border-base-300 hover:border-solid flex items-center h-full transition-all duration-400`}\n >\n {link.name}\n </Link>\n </li>\n ))}\n </ul>\n );\n};\n\n/**\n * INavbar Interface for Navbar component.\n *\n * @interface INavbar\n */\nexport interface INavbar {\n /**\n * If the user is logged in\n *\n * @memberof INavbar\n * @member {boolean} [loggedIn]\n */\n loggedIn?: boolean;\n /**\n * If the user has a message\n *\n * @memberof INavbar\n * @member {boolean} [hasMessage]\n */\n hasMessage?: boolean;\n /**\n * Is the user a shelter\n *\n * @memberof INavbar\n * @member {boolean} [isShelter]\n */\n isShelter?: boolean;\n /**\n * Should this be a minimal navbar\n *\n * @memberof INavbar\n * @member {boolean} [minimal]\n */\n minimal?: boolean;\n /**\n * User type\n *\n * @memberof INavbar\n * @member {boolean} [isFetchingUser]\n */\n isFetchingUser?: boolean;\n}\n\n/**\n * Navbar Used to display the navigation bar.\n *\n * @param {INavbar} props - The props for the Navbar component.\n * @returns {React.FC<INavbar>} Navbar Component\n */\nconst Navbar: React.FC<INavbar> = ({\n loggedIn,\n hasMessage,\n isShelter = false,\n minimal = false,\n isFetchingUser,\n}: INavbar) => {\n const { setBannerData } = usePersistentBannerContext();\n const { me } = useMe();\n\n const { selectedShelterId } = useShelterLocationContext();\n\n const isShelterAdmin = getIsShelterAdmin(me, selectedShelterId);\n\n /** This will perform any tasks need on logout */\n const signOutHandler = () => {\n /** This is the event data being sent */\n const eventData = {\n name: 'logout',\n data: {\n user_type: isShelter ? 'Shelter User' : 'Consumer User',\n user_id: me?.user?.id,\n },\n };\n\n /** This will clear the user id tracking events in google */\n defaultEventEmitter.handleEvent(eventData);\n\n /** Reset the Banner Data */\n setBannerData();\n\n window.location.href = `${getBasePath()}/api/auth/logout-flow/`;\n };\n\n const { bannerChildrenState } = usePersistentBannerHandler();\n const shouldRenderBannerSpacer = !!bannerChildrenState;\n\n return (\n <>\n {!minimal && <NavTopBar links={generateFamilyLinks('top')} />}\n <nav\n className=\"bg-neutral-100 sticky top-0 z-[25] h-[60px] md:h-16 font-petco\"\n data-testid=\"navbar\"\n >\n <div\n className={`h-full flex justify-between items-center ${gridMaxWidth} grid grid-cols-5`}\n >\n <div className=\"col-span-3 md:col-span-1 flex items-center py-3.5\">\n <NavSideBar\n classes=\"flex items-center md:hidden mr-2\"\n bottomLinks={generateFamilyLinks('aside')}\n mainLinks={links}\n />\n <div className=\"flex items-center w-auto h-8 max-w-[144px]\">\n <LostLogo\n variant=\"standard\"\n classes=\"object-contain object-left\"\n />\n </div>\n </div>\n\n <div\n className=\"md:col-span-3 hidden md:flex justify-center items-center\"\n id=\"navbar-default\"\n >\n {!minimal && <DesktopNavLinks links={links} />}\n </div>\n <div className=\"col-span-2 md:col-span-1 flex justify-end items-center\">\n {isFetchingUser ? (\n <div className=\"w-16 h-5 bg-neutral-300 rounded-lg animate-pulse\"></div>\n ) : (\n <DashboardLinks\n signOutHandler={signOutHandler}\n loggedIn={loggedIn}\n isShelter={isShelter}\n hasMessage={hasMessage}\n isShelterAdmin={isShelterAdmin}\n />\n )}\n </div>\n </div>\n <PersistentBannerHandler />\n </nav>\n {/* This is a spacer for when the persistent banner is showing. */}\n {!!shouldRenderBannerSpacer && (\n <div\n id=\"persistent-banner-spacing\"\n data-testid=\"banner-margin-div\"\n className=\"h-8\"\n />\n )}\n </>\n );\n};\n\nexport default Navbar;\n\n/**\n * IDashboardLinks Interface for the Inner component\n *\n * @interface IDashboardLinks\n */\ninterface IDashboardLinks {\n /**\n * Function that handles logging out\n *\n * @memberof IDashboardLinks\n * @member {() => void} signOutHandler\n */\n signOutHandler: () => void;\n /**\n * Whether the user is logged in or not\n *\n * @memberof IDashboardLinks\n * @member {boolean} [loggedIn]\n */\n loggedIn?: boolean;\n /**\n * Whether the user is a shelter user\n *\n * @memberof IDashboardLinks\n * @member {boolean} isShelter\n */\n isShelter: boolean;\n /**\n * Whether the user has messages\n *\n * @memberof IDashboardLinks\n * @member {boolean} [hasMessage]\n */\n hasMessage?: boolean;\n /**\n * Whether the user is a shelter admin.\n *\n * @memberof IDashboardLinks\n * @member {boolean} [isShelterAdmin]\n */\n isShelterAdmin?: boolean;\n}\n\n/**\n * Houses the dashboard links of the NavBar\n *\n * @param {IDashboardLinks} props - The props for the Inner component\n * @returns {React.ReactNode} - The Inner component\n */\nfunction DashboardLinks({\n signOutHandler,\n loggedIn,\n isShelter,\n hasMessage,\n isShelterAdmin,\n}: IDashboardLinks) {\n const shelterPersistentSearchFlag = useOptimizelyFeature(\n flagShelterPersistentSearch\n );\n /**\n * User Links Links to be used in the dropdown menu for logged in users\n *\n * @constant\n */\n const userLinks: Array<IMenuItem | IMenuButton> = [\n {\n name: 'Pet Dashboard',\n url: '/dash/',\n },\n { name: 'Settings', url: '/dash/info/' },\n {\n name: 'Sign Out',\n onClick: signOutHandler,\n },\n ];\n\n /**\n * Shelter Links to be used in the dropdown menu for logged in shelters\n *\n * @constant\n */\n const shelterLinks: Array<IMenuItem | IMenuButton> = [\n ...getShelterDashDropdownLinks({\n isAdmin: isShelterAdmin,\n }),\n { name: 'Sign Out', onClick: signOutHandler },\n ];\n\n const dropDownIcon: IDropDownIcon = {\n icon: 'userCircle',\n size: 24,\n colorType: 'neutral',\n colorShade: 800,\n activeColorShade: 300,\n activeColorType: 'base',\n };\n\n return (\n <div className=\"flex flex-row gap-3\">\n {!loggedIn ? (\n <a\n href={`${getBasePath()}/api/auth/login/?returnTo=${getBasePath()}/dash/?login=true`}\n className=\"flex items-center space-x-1\"\n >\n <ButtonWithIcon\n icon={{\n icon: 'userCircle',\n size: 24,\n colorType: 'base',\n colorShade: 500,\n }}\n >\n Sign In\n </ButtonWithIcon>\n </a>\n ) : (\n <>\n {(!isShelter || shelterPersistentSearchFlag) && <Notifications />}\n {!isShelter && (\n <div data-testid=\"navbar-messages\">\n <AnimatedIcon\n iconType=\"message\"\n href=\"/dash/messages\"\n srText=\"Messages\"\n showAnimation={hasMessage}\n data-testid={\n hasMessage ? 'navbar-has-messages' : 'navbar-no-messages'\n }\n />\n </div>\n )}\n <DropDownMenu\n icon={dropDownIcon}\n items={isShelter ? shelterLinks : userLinks}\n menuClasses=\"-mr-6 md:mr-0 mt-3.5 md:mt-4 lg:mt-[18px] xl:mt-5 z-[3]\"\n />\n </>\n )}\n </div>\n );\n}\n","/**\n * IPersistentBanner Interface for the Persistent Banner component\n *\n * @interface IPersistentBanner\n */\nexport interface IPersistentBanner {\n /**\n * Children to be displayed in the banner\n *\n * @memberof IPersistentBanner\n * @member {React.ReactNode} children\n */\n children: React.ReactNode;\n /**\n * The optional classes for the component\n *\n * @memberof IPersistentBanner\n * @default ''\n * @member {string | null} [classes]\n */\n classes?: string | null;\n}\n\n/**\n * Persistent Banner Persistent Banner Component used to display user feedback\n * in a banner at the top of the page.\n *\n * @param {IPersistentBanner} props - The props for the Persistent Banner\n * component\n * @returns {React.FC<IPersistentBanner>} Persistent Banner Component\n */\nconst PersistentBanner: React.FC<IPersistentBanner> = ({\n children,\n classes = '',\n}: IPersistentBanner) => {\n return (\n <div\n data-testid=\"persistent-banner\"\n className={`text-neutral-100 font-petco text-body5 justify-center py-[5px] flex sticky top-[60px] md:top-16 w-full z-[2] ${classes}`}\n >\n {children}\n </div>\n );\n};\n\nexport default PersistentBanner;\n","import Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport PersistentBanner from '@/components/molecules/PersistentBanner/PersistentBanner';\nimport { typeToFlow } from '@/lib/constants/constants/analytics';\nimport { defaultSearchRadius } from '@/lib/constants/constants/search';\nimport { InferredSpecies } from '@/lib/constants/types/pets';\nimport { useEventContext } from '@/lib/hooks/analytics/useEventContext';\nimport {\n CreateAccountBannerProps,\n PartnerBannerProps,\n PersistentBannerTypes,\n PetSearchBannerProps,\n usePersistentBannerContext,\n} from '@/lib/hooks/persistentBanner/PersistentBanner';\nimport { SpeciesTypes } from '@/lib/utils/analytics/petSearch';\nimport {\n IStartAddPetEventData,\n startAddPetEventHandler,\n} from '@/lib/utils/analytics/startAddPet';\nimport { startPetSearchEventHandler } from '@/lib/utils/analytics/startPetSearch';\nimport appendAttributeIfExists from '@/lib/utils/helpers/ObjectsHelpers/AppendAttributeIfExists';\nimport capitalizeFirstLetter from '@/lib/utils/helpers/stringHelpers/capitalizeFirstLetter';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport React, { useEffect, useMemo, useState } from 'react';\n\n/**\n * The href for the photo search link\n *\n * @constant {string}\n */\nconst photoSearchBaseHref = '/photo-search';\n\n/**\n * The text for the photo search link\n *\n * @constant {string}\n */\nexport const searchClickText = 'Click to Search';\n\n/**\n * The text for the create account link\n *\n * @constant {string}\n */\nexport const createAccountClickText = 'Create an account';\n\n/**\n * Determine the color to pass to the partner banner\n *\n * @param {string} partner - The lowercase partner name/code\n * @returns {string} - The class used to color the banner\n */\nexport const partnerBannerClasses = (partner: string) => {\n const partnerLower = partner.toLowerCase();\n if (partnerLower === 'neighbors') {\n return 'bg-neighbors-100';\n }\n\n if (partnerLower === 'docupet') {\n return 'bg-docupet-300';\n }\n\n return 'bg-base-300';\n};\n\n/**\n * Determine the color to pass to the banner\n *\n * @param {PersistentBannerTypes} type - The type of banner\n * @returns {string | null} - The class used to color the banner\n */\nexport const bannerClasses = (type?: PersistentBannerTypes): string | null => {\n if (type === 'info') {\n return 'bg-info-200';\n }\n if (type === 'warning') {\n return 'bg-warning-200';\n }\n return null;\n};\n\n/**\n * Sends the start add pet event\n *\n * @param {CreateAccountBannerProps} data - The data from the persistent banner\n */\nexport const sendStartAddPetEvent = (data: CreateAccountBannerProps): void => {\n const eventData: IStartAddPetEventData = {\n clickText: createAccountClickText,\n context: 'Sign Up Flow',\n petStatus: data.petReportType === 'found' ? 'Found' : 'Lost',\n listingSource: 'Consumer Pet Listing',\n species: data.species\n ? (capitalizeFirstLetter(data.species) as InferredSpecies)\n : undefined,\n };\n startAddPetEventHandler(eventData);\n};\n\n/**\n * Return the create account banner element\n *\n * @param {CreateAccountBannerProps} data - The data for the info banner\n * @returns {Element} - The info banner children\n */\nconst createAccountBanner = (data: CreateAccountBannerProps): JSX.Element => {\n return (\n <div data-testid=\"create-account-banner\">\n <Link\n href={`/create-account/${data.petReportType}-${data.searchType}/`}\n onClick={() => sendStartAddPetEvent(data)}\n className=\"text-neutral-100 font-petco text-body5 font-bold underline inline-block mr-1\"\n >\n {createAccountClickText}\n </Link>\n <Paragraph\n size=\"body5\"\n styling=\"bold\"\n className=\"text-neutral-100 inline-block\"\n >\n to report a pet.\n </Paragraph>\n </div>\n );\n};\n\n/**\n * Return the neighbors banner element\n *\n * @param {PartnerBannerProps} data - The data for the neighbors banner\n * @returns {Element} - The info banner children\n */\nconst PartnerBanner = (data: PartnerBannerProps): JSX.Element => {\n return (\n <div data-testid=\"neighbors-banner\" className=\"text-center px-6\">\n <Paragraph\n size=\"body5\"\n styling=\"bold\"\n className=\"text-neutral-100 inline-block\"\n data-testid=\"persistent-banner-text\"\n >\n Welcome from{' '}\n <span className=\"capitalize text-inherit\">{data.partner}</span>.\n </Paragraph>{' '}\n <Link\n href={`create-account/${data.petReportType}-photo/`}\n className=\"text-neutral-100 font-petco text-body5 font-bold underline inline-block\"\n >\n Create an account\n </Link>{' '}\n to report a pet on Petco Love Lost.\n </div>\n );\n};\n\n/**\n * The interface for the PersistentBannerHandler props\n *\n * @interface IPersistentBannerHandler\n */\nexport interface IPersistentBannerHandler {\n /**\n * The type of banner\n *\n * @memberof IPersistentBannerHandler\n * @member {PersistentBannerTypes} [type]\n */\n type?: PersistentBannerTypes;\n /**\n * The type of banner to display\n *\n * @memberof IPersistentBannerHandler\n * @member {CreateAccountBannerProps | PetSearchBannerProps} [bannerProps]\n */\n bannerProps?: CreateAccountBannerProps | PetSearchBannerProps;\n}\n\n/** @returns {React.ReactNode} - The PersistentBannerHandler */\nconst PersistentBannerHandler = () => {\n const { type, bannerProps } = usePersistentBannerContext();\n const { bannerChildrenState } = usePersistentBannerHandler();\n\n return (\n <div data-testid=\"persistent-banner-handler\">\n {!!bannerChildrenState && (\n <PersistentBanner\n classes={\n bannerProps && 'partner' in bannerProps\n ? partnerBannerClasses(bannerProps.partner)\n : bannerClasses(type)\n }\n >\n {bannerChildrenState}\n </PersistentBanner>\n )}\n </div>\n );\n};\n\nexport default PersistentBannerHandler;\n\n/**\n * Returns a callback to fire analytics events for the search banner.\n *\n * @returns {(data: PetSearchBannerProps) => void} - The handler function.\n */\nconst useSearchBannerAnalytics = () => {\n const { clearData, updateData, setInitiatingComponent } = useEventContext();\n\n /**\n * Callback that fire analytics events for the search banner.\n *\n * @param {PetSearchBannerProps} data - The data for the pet search banner.\n */\n function searchBannerAnalyticsHandler(data: PetSearchBannerProps) {\n const initiatingComponent = 'Search Persistent Banner / All Pages';\n setInitiatingComponent(initiatingComponent);\n startPetSearchEventHandler({\n clickText: searchClickText,\n component: initiatingComponent,\n flow: data.petReportType === 'lost' ? 'Found' : 'Lost',\n });\n clearData();\n updateData({\n clickText: searchClickText,\n petId: data.petId,\n petName: data.petName,\n petStatus: typeToFlow[data.petReportType],\n locationId: data.zipCode,\n species: capitalizeFirstLetter(data.petData.species) as SpeciesTypes,\n });\n }\n\n return searchBannerAnalyticsHandler;\n};\n\n/**\n * Return the pet search banner element.\n *\n * @param {PetSearchBannerProps} data - The data for the pet search banner.\n * @returns {React.ReactNode} - The pet search banner.\n */\nconst petSearchBanner = (\n data: PetSearchBannerProps,\n searchBannerAnalytics: (data: PetSearchBannerProps) => void\n) => {\n /**\n * The query data for the photo search link\n *\n * @type {object}\n */\n const queryData = {\n species: data.petData.species,\n photoSearchSpecies: data.petData.species,\n latitude: data.petData.coordinates.latitude.toString(),\n longitude: data.petData.coordinates.longitude.toString(),\n searchType: data.petReportType === 'lost' ? 'found' : 'lost',\n imageObjectKey: data.petData.photo,\n searchRadius: String(defaultSearchRadius),\n ...appendAttributeIfExists('address', data.petData.address),\n };\n /**\n * The query string for the photo search link\n *\n * @type {URLSearchParams}\n */\n const query = new URLSearchParams(queryData);\n /**\n * The href for the photo search link\n *\n * @type {string}\n */\n const photoSearchHref = `${photoSearchBaseHref}?${query}`;\n\n return (\n <div data-testid=\"search-pet-banner\">\n <Paragraph\n size=\"body5\"\n styling=\"bold\"\n className=\"text-neutral-100 inline-block\"\n data-testid=\"persistent-banner-text\"\n >\n You have a {data.petReportType} pet.\n </Paragraph>{' '}\n <Link\n href={photoSearchHref}\n className=\"text-neutral-100 font-petco text-body5 font-bold underline inline-block\"\n onClick={() => searchBannerAnalytics(data)}\n >\n {searchClickText}\n </Link>\n </div>\n );\n};\n\n/**\n * Handles the persistent banner rendering logic.\n *\n * @returns {React.ReactNode} The banner to be rendered.\n */\nexport function usePersistentBannerHandler() {\n const router = useRouter();\n\n const { type, bannerProps } = usePersistentBannerContext();\n const searchBannerAnalyticsHandler = useSearchBannerAnalytics();\n\n const [bannerChildrenState, setBannerChildrenState] = useState<\n JSX.Element | undefined\n >(undefined);\n\n /**\n * This will give us the ability to hide the banner on certain pages\n *\n * @returns {boolean} - Whether or not to hide the banner\n */\n const shouldHideBannerCurrentPage = useMemo((): boolean => {\n const warningBannerHidePages: string[] = [\n '/photo-search',\n '/search-results',\n '/microchip-search',\n '/create-account/lost/[...pageId]',\n '/create-account/found/[...pageId]',\n '/dash/match-results',\n ];\n\n const infoBannerHidePages: string[] = [\n '/photo-search',\n '/search-results',\n '/microchip-search',\n '/i-lost-a-pet',\n '/i-found-a-pet',\n '/redirecting',\n '/dash/match-results',\n ];\n\n const partnerBannerShowPages: string[] = [\n '/photo-search',\n '/search-results',\n ];\n\n if (\n type === 'partner' &&\n !partnerBannerShowPages.includes(router.pathname)\n ) {\n return true;\n }\n\n if (type === 'info' && infoBannerHidePages.includes(router.pathname)) {\n return true;\n }\n\n if (\n type === 'warning' &&\n warningBannerHidePages.includes(router.pathname)\n ) {\n return true;\n }\n\n return false;\n }, [type, router.pathname]);\n\n /** Set the banner children state */\n useEffect(() => {\n if (type && bannerProps && !shouldHideBannerCurrentPage) {\n if (type === 'partner' && 'partner' in bannerProps) {\n setBannerChildrenState(PartnerBanner(bannerProps));\n }\n\n if (type === 'info' && 'searchType' in bannerProps) {\n setBannerChildrenState(createAccountBanner(bannerProps));\n }\n\n if (type === 'warning' && 'petData' in bannerProps) {\n setBannerChildrenState(\n petSearchBanner(bannerProps, searchBannerAnalyticsHandler)\n );\n }\n } else {\n setBannerChildrenState(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [type, bannerProps, shouldHideBannerCurrentPage]);\n\n return { bannerChildrenState };\n}\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 { unknownString } from '@/lib/constants/constants/analytics';\nimport { NextApiRequest } from 'next';\n\n/**\n * This will get the gtag client id from cookie value\n *\n * @returns {string} - The gtag client id or not applicable if not found\n */\nexport const getClientIdFromCookie = (): string => {\n // Ensure this runs only in the browser\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.error('This function should only be ran in a browser environment');\n throw new Error(\n 'This function should only be ran in a browser environment'\n );\n }\n\n const gaCookie = document.cookie\n .split('; ')\n .find((row) => row.startsWith('_ga='));\n\n if (!gaCookie) {\n console.error('_ga token not found');\n return unknownString;\n }\n\n const gaCookieValue = gaCookie.split('=')[1];\n // Extract the last two segments of the cookie value\n const clientId = gaCookieValue.split('.').slice(-2).join('.');\n return clientId;\n};\n\n/**\n * Get the Client ID Token From Cookie SSR\n *\n * @param {NextApiRequest} request - The next api request\n * @returns {string} - The client id token\n */\nexport const getClientIdTokenFromCookieSSR = async (\n request: NextApiRequest\n): Promise<string> => {\n try {\n const cookie = request.cookies.get('_ga')?.value;\n if (!cookie) {\n return unknownString;\n }\n const clientId = cookie.split('.').slice(-2).join('.');\n return clientId;\n } catch (error) {\n return unknownString;\n }\n};\n","import { defaultEventEmitter } from '@/lib/analytics/commonEmitter';\nimport { IEvent } from '@/lib/analytics/handlers/abstractAnalyticsHandler';\n\n/**\n * The data object for the view pet match alert event\n *\n * @interface IViewPetMatchAlertEventData\n */\nexport interface IViewPetMatchAlertEventData {\n /**\n * The event Id\n *\n * @memberof IViewPetMatchAlertEventData\n * @member {string} eventId\n */\n eventId: string;\n /**\n * The platform for the alert\n *\n * @memberof IViewPetMatchAlertEventData\n * @member {'app' | 'email' | 'sms'} platform\n */\n platform: 'app' | 'email' | 'sms';\n /**\n * The user Id\n *\n * @memberof IViewPetMatchAlertEventData\n * @member {number} [userId]\n */\n userId: number;\n}\n/**\n * Send the view pet match alert event to google analytics\n *\n * @param {IViewPetMatchAlertEventData} data - The data to send\n */\nexport const viewPetMatchAlertEventHandler = ({\n eventId,\n platform,\n userId,\n}: IViewPetMatchAlertEventData) => {\n /** Create the event data object */\n const eventData: IEvent = {\n name: 'view_pet_match_alert',\n data: {\n user_id: userId,\n items: [\n {\n alert_event_id: eventId,\n platform,\n },\n ],\n },\n };\n defaultEventEmitter.handleEvent(eventData);\n};\n","import { IMeDto } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/auth/dto';\n\n/**\n * Check if the user is an admin of the shelter\n *\n * @param {IMeDto | null} me - The me object\n * @param {number} selectedShelterId - The selected shelter id\n * @returns {boolean} - Whether the user is an admin of the shelter\n */\nexport function getIsShelterAdmin(\n me?: IMeDto | null,\n selectedShelterId?: number\n) {\n const awos = me?.awos;\n\n const matchingAwo = awos?.find((awo) => awo?.id === selectedShelterId);\n\n const role = matchingAwo?.role;\n\n if (role && typeof role === 'string') {\n return role.toLowerCase() === 'admin';\n }\n\n return false;\n}\n","import { IMenuItem } from '@/components/molecules/DropDownMenu/DropDownMenu';\n\n/**\n * GetShelterDashTabLinks's props\n *\n * @typedef GetShelterDashTabLinksProps\n */\ntype GetShelterDashTabLinksProps = {\n /**\n * The active page\n *\n * @memberof GetShelterDashTabLinksProps\n * @member {'pets' | 'admin' | 'profile' | 'toolkit' | 'reporting'} [activePage]\n */\n activePage?: 'pets' | 'admin' | 'profile' | 'toolkit' | 'reporting';\n /**\n * Whether the user has the admin role\n *\n * @memberof GetShelterDashTabLinksProps\n * @member {boolean} [isAdmin]\n */\n isAdmin?: boolean;\n /**\n * Whether the navigation should be a dropdown menu\n *\n * @memberof GetShelterDashTabLinksProps\n * @member {boolean} [isDropdown]\n */\n isDropdown?: boolean;\n};\n\n/**\n * GetShelterDashTabLinks\n *\n * @param {GetShelterDashTabLinksProps} props - The props for the\n * getShelterDashTabLinks function\n * @returns {object[]} - The navigation items for the shelter dashboard\n */\nexport function getShelterDashTabLinks({\n activePage,\n isAdmin,\n isDropdown = false,\n}: GetShelterDashTabLinksProps) {\n const links = {\n pets: {\n label: 'Your Pets',\n link: '/shelter-dashboard/pets/',\n active: activePage === 'pets',\n 'data-action': 'click-internal-tab-your_pets',\n },\n admin: {\n label: 'Admin',\n link: '/shelter-dashboard/admin/',\n active: activePage === 'admin',\n 'data-action': 'click-internal-tab-admin',\n },\n profile: {\n label: 'Your Profile',\n link: '/shelter-dashboard/profile/',\n active: activePage === 'profile',\n 'data-action': 'click-internal-tab-your_profile',\n },\n toolkit: {\n label: 'Toolkit',\n link: `/shelter-dashboard/toolkit/`,\n active: activePage === 'toolkit',\n 'data-action': 'click-internal-tab-toolkit',\n },\n reporting: {\n label: 'Reporting',\n link: '/shelter-dashboard/reporting/',\n active: activePage === 'reporting',\n 'data-action': 'click-internal-tab-reporting',\n },\n helpCenter: {\n label: 'Help Center',\n link: 'https://support.partners.petcolove.org/hc/en-us/',\n },\n };\n\n const adminLinks = [links.pets, links.toolkit, links.helpCenter];\n\n if (isAdmin) {\n // Insert admin link after pets\n adminLinks.splice(1, 0, links.admin);\n }\n\n if (!isAdmin) {\n // Insert profile link after pets\n adminLinks.splice(1, 0, links.profile);\n }\n\n if (!isDropdown) {\n // Remove help center link\n adminLinks.pop();\n }\n\n // Insert reporting link after the admin link\n adminLinks.splice(1, 0, links.reporting);\n\n return adminLinks;\n}\n\n/** GetShelterDashDropdownLinks's props */\ntype GetShelterDashDropdownLinksProps = Pick<\n GetShelterDashTabLinksProps,\n 'isAdmin'\n>;\n\n/**\n * Get links for the shelter dashboard dropdown menu\n *\n * @param {GetShelterDashDropdownLinksProps} props - The props\n * @returns {IMenuItem[]} - The dropdown menu links\n */\nexport function getShelterDashDropdownLinks(\n props: GetShelterDashDropdownLinksProps\n): IMenuItem[] {\n return getShelterDashTabLinks({\n isAdmin: props.isAdmin,\n isDropdown: true,\n }).map((item) => ({\n name: item.label,\n url: item.link,\n }));\n}\n"],"names":["gridMaxWidth","sizes","standard","width","height","small","variantLogo","process","__webpack_exports__","Z","priority","classes","alt","variant","param","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","jsx","Link","href","className","CdnImage","src","layout","iconStateStyles","color","hovered","normal","disabled","shade","children","icon","onClick","setHovered","useState","iconColor","iconShade","disabledClass","concat","jsxs","button","type","onMouseEnter","onMouseLeave","Icon","colorType","colorShade","span","MenuLink","React","props","ref","url","name","active","destructive","close","rest","div","join","displayName","items","menuClasses","iconHover","setIconHover","Menu","as","open","Fragment","Button","data-headlessui-state","size","activeColorType","activeColorShade","Items","map","item","Item","AnimatedIcon_AnimatedIcon","iconType","srText","showAnimation","animationClassName","SelectedIcon","chooseIcon","renderChildren","jsx_runtime","twMerge","NavSideBar_NavSideBar","mainLinks","bottomLinks","showSidebar","setShowSidebar","data-collapse-toggle","aria-controls","aria-expanded","ul","li","link","Heading","a","target","rel","ButtonWithIcon","buttonClasses","navTopBarLinkClasses","cva","variants","state","base","NavTopBar_NavTopBar","links","index","totalItems","isLast","length","NotificationRow_NotificationRow","alertId","image","headline","linkLabel","linkUrl","date","closeDrawer","eventType","petId","userType","useUserContext","me","useMe","awoId","useMemo","awos","id","shelterPotentialMatchesPath","matchResultsPath","Paragraph","styling","formatDistanceStrict","Date","NotificationDrawer_NotificationDrawer","notifications","onButtonClick","notification","Divider","NotificationRow","defaultWebSocketConfig","messageBufferSize","Infinity","disable","useUiNotifications","messages","idToken","service","status","useWebSocketService","createWebSocketService","configOverrides","config","buffer","setBuffer","setStatus","useEffect","connect","unsubscribe","addEventListener","message","current","slice","onStatusChange","getStatus","connection","removeEventListener","all","last","at","sdk","uiNotifications","authToken","getAlerts","handleNotificationClick","user","viewPetMatchAlertEventHandler","eventId","platform","userId","clientId","getClientIdFromCookie","readAlert","alert","ctaDetails","photoUrl","heading","linkText","createdAt","undefined","petEntityId","filter","sections_Notifications","listNotifications","isComponentFocused","useComponentFocused","isDrawerOpen","setIsDrawerOpen","setShowAnimation","some","isUpdating","setIsUpdating","handleSeeAlert","useCallback","unseenNotifications","forEach","seeAlert","AnimatedIcon","_isDrawerOpen","NotificationDrawer","generateFamilyLinks","sizeMap","top","aside","classesMap","DesktopNavLinks","Navbar_Navbar","loggedIn","hasMessage","isShelter","minimal","isFetchingUser","setBannerData","usePersistentBannerContext","selectedShelterId","useShelterLocationContext","isShelterAdmin","getIsShelterAdmin","bannerChildrenState","usePersistentBannerHandler","NavTopBar","nav","NavSideBar","LostLogo","DashboardLinks","signOutHandler","eventData","data","user_type","user_id","defaultEventEmitter","handleEvent","window","location","getBasePath","PersistentBannerHandler","shelterPersistentSearchFlag","useOptimizelyFeature","flagShelterPersistentSearch","shelterLinks","getShelterDashDropdownLinks","isAdmin","Notifications","DropDownMenu","PersistentBanner_PersistentBanner","searchClickText","createAccountClickText","partnerBannerClasses","partnerLower","partner","toLowerCase","bannerClasses","sendStartAddPetEvent","clickText","context","petStatus","petReportType","listingSource","species","capitalizeFirstLetter","startAddPetEventHandler","createAccountBanner","searchType","PartnerBanner","PersistentBannerHandler_PersistentBannerHandler","bannerProps","PersistentBanner","useSearchBannerAnalytics","clearData","updateData","setInitiatingComponent","useEventContext","initiatingComponent","startPetSearchEventHandler","component","flow","petName","typeToFlow","locationId","zipCode","petData","petSearchBanner","searchBannerAnalytics","queryData","photoSearchSpecies","latitude","coordinates","toString","longitude","imageObjectKey","photo","searchRadius","String","defaultSearchRadius","appendAttributeIfExists","address","query","URLSearchParams","photoSearchHref","router","useRouter","searchBannerAnalyticsHandler","setBannerChildrenState","shouldHideBannerCurrentPage","partnerBannerShowPages","includes","pathname","infoBannerHidePages","warningBannerHidePages","ShelterLocationStorage","storage","CookieStorage","key","set","delete","get","ShelterLocationContext","createContext","shelterList","isFetchingShelterList","selectedShelter","isSwitchingLocation","ShelterLocationProvider","initialShelterList","setSelectedShelterId","setIsSwitchingLocation","selectedShelterIdForShelterReporting","setSelectedShelterIdForShelterReporting","handleShelterSelection","find","shelter","Number","firstShelterId","shelterIds","isValidShelterId","Provider","value","useContext","document","gaCookie","cookie","split","row","startsWith","unknownString","gaCookieValue","alert_event_id","matchingAwo","awo","role","getShelterDashTabLinks","activePage","isDropdown","pets","label","admin","profile","toolkit","reporting","helpCenter","adminLinks","splice","pop"],"sourceRoot":""}