diff --git a/components/ContentType/HotelPage/HotelPage.tsx b/components/ContentType/HotelPage/HotelPage.tsx index af170493f..f6f011c0c 100644 --- a/components/ContentType/HotelPage/HotelPage.tsx +++ b/components/ContentType/HotelPage/HotelPage.tsx @@ -6,6 +6,8 @@ import AmenitiesList from "./AmenitiesList" import IntroSection from "./IntroSection" import { Rooms } from "./Rooms" import SidePeek from "@/components/TempDesignSystem/SidePeek" +import SidePeekContent from "@/components/TempDesignSystem/SidePeek/Content" +import SidePeekContainer from "./SidePeekContainer" import styles from "./hotelPage.module.css" @@ -38,6 +40,7 @@ export default async function HotelPage({ lang }: LangParams) { + Restaurant and bar @@ -47,6 +50,25 @@ export default async function HotelPage({ lang }: LangParams) { Meetings + + + Food + + +
    +
  • Some
  • +
  • JSX
  • +
  • Conent
  • +
  • here
  • +
+
+ + Meetings + +
) } diff --git a/components/ContentType/HotelPage/SidePeekContainer.tsx b/components/ContentType/HotelPage/SidePeekContainer.tsx new file mode 100644 index 000000000..9517a9fd1 --- /dev/null +++ b/components/ContentType/HotelPage/SidePeekContainer.tsx @@ -0,0 +1,51 @@ +"use client" + +import { usePathname, useRouter, useSearchParams } from "next/navigation" +import React, { Children, cloneElement, useEffect, useState } from "react" + +import SidePeek from "@/components/TempDesignSystem/SidePeek" + +export default function SidePeekContainer({ + children, +}: React.PropsWithChildren) { + const router = useRouter() + const pathname = usePathname() + const searchParams = useSearchParams() + const [activeSidePeek, setActiveSidePeek] = useState(() => { + const sidePeekParam = searchParams.get("sidepeek") + + return sidePeekParam || null + }) + + useEffect(() => { + const sidePeekParam = searchParams.get("sidepeek") + if (sidePeekParam !== activeSidePeek) { + setActiveSidePeek(sidePeekParam) + } + }, [searchParams, activeSidePeek]) + + function handleClose(isOpen: boolean) { + if (!isOpen) { + setActiveSidePeek(null) + + const nextSearchParams = new URLSearchParams(searchParams.toString()) + nextSearchParams.delete("sidepeek") + + router.push(`${pathname}?${nextSearchParams}`, { scroll: false }) + } + } + const childrenWithIsActive = Children.map(children, (child) => { + if (!React.isValidElement(child)) { + return child + } + return cloneElement(child as React.ReactElement, { + isActive: child.props.contentKey === activeSidePeek, + }) + }) + + return ( + + {childrenWithIsActive} + + ) +} diff --git a/components/TempDesignSystem/SidePeek/Content.tsx b/components/TempDesignSystem/SidePeek/Content.tsx new file mode 100644 index 000000000..74f4255cc --- /dev/null +++ b/components/TempDesignSystem/SidePeek/Content.tsx @@ -0,0 +1,42 @@ +"use client" + +import { Children, PropsWithChildren } from "react" +import { X } from "react-feather" + +import Title from "../Text/Title" + +import styles from "./sidePeek.module.css" + +export default function Content({ + title, + children, + contentKey, + isActive = false, + onClose, +}: PropsWithChildren<{ + title?: string + contentKey: string + isActive?: boolean + onClose?: () => void +}>) { + return isActive ? ( + + ) : null +} diff --git a/components/TempDesignSystem/SidePeek/index.tsx b/components/TempDesignSystem/SidePeek/index.tsx index 0b03ed53a..1a6628a16 100644 --- a/components/TempDesignSystem/SidePeek/index.tsx +++ b/components/TempDesignSystem/SidePeek/index.tsx @@ -1,67 +1,37 @@ "use client" -import { usePathname, useRouter, useSearchParams } from "next/navigation" -import { ReactNode, useEffect, useState } from "react" -import { Button, Dialog, DialogTrigger, Modal } from "react-aria-components" -import { X } from "react-feather" +import { Children, cloneElement, PropsWithChildren } from "react" +import { Dialog, DialogTrigger, Modal } from "react-aria-components" import Title from "@/components/TempDesignSystem/Text/Title" import styles from "./sidePeek.module.css" type SidePeekProps = { - content: Record + activeContent: string | null + onClose: (isOpen: boolean) => void } -export default function SidePeek({ content }: SidePeekProps) { - const [sidePeekContent, setSidePeekContent] = useState(null) - - const searchParams = useSearchParams() - const activeSidePeek = searchParams.get("sidepeek") - const router = useRouter() - const pathname = usePathname() - - useEffect(() => { - if (activeSidePeek) { - setSidePeekContent(activeSidePeek) - } - }, [activeSidePeek]) - - const activeContent = sidePeekContent && content[sidePeekContent] - - function handleClose(isOpen: boolean) { - if (!isOpen) { - console.log("closing the modal now") - setSidePeekContent(null) - - const nextSearchParams = new URLSearchParams(searchParams.toString()) - nextSearchParams.delete("sidepeek") - - router.push(`${pathname}?${nextSearchParams}`, { scroll: false }) - } - } - +export default function SidePeek({ + children, + onClose, + activeContent, +}: PropsWithChildren) { return ( {({ close }) => ( - + <> + {Children.map(children, (child) => { + return cloneElement(child as React.ReactElement, { + onClose: close, + }) + })} + )}