diff --git a/apps/scandic-web/components/ContentType/DestinationPage/Sidepeek/index.tsx b/apps/scandic-web/components/ContentType/DestinationPage/Sidepeek/index.tsx index 8f24902b2..f0cf6d182 100644 --- a/apps/scandic-web/components/ContentType/DestinationPage/Sidepeek/index.tsx +++ b/apps/scandic-web/components/ContentType/DestinationPage/Sidepeek/index.tsx @@ -5,9 +5,9 @@ import { useIntl } from "react-intl" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" +import SidePeek from "@scandic-hotels/design-system/SidePeek" import JsonToHtml from "@/components/JsonToHtml" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import { trackOpenSidePeekOnDestinationPagesEvent } from "@/utils/tracking/destinationPage" import type { DestinationCityPageData } from "@scandic-hotels/trpc/types/destinationCityPage" @@ -56,6 +56,9 @@ export default function DestinationPageSidepeek({ isOpen={sidePeekIsOpen} openInRoot handleClose={() => setSidePeekIsOpen(false)} + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} >
{preamble}
diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx index b5ac7c3c9..94f4ec20e 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx @@ -1,10 +1,11 @@ +import SidePeek from "@scandic-hotels/design-system/SidePeek" + import AccessibilityAccordionItem from "@/components/SidePeeks/AmenitiesSidepeekContent/Accordions/Accessibility" import BreakfastAccordionItem from "@/components/SidePeeks/AmenitiesSidepeekContent/Accordions/Breakfast" import CheckInCheckOutAccordionItem from "@/components/SidePeeks/AmenitiesSidepeekContent/Accordions/CheckInCheckOut" import ParkingAccordionItem from "@/components/SidePeeks/AmenitiesSidepeekContent/Accordions/Parking" import AdditionalAmenities from "@/components/SidePeeks/AmenitiesSidepeekContent/AdditionalAmenities" import Accordion from "@/components/TempDesignSystem/Accordion" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import { getIntl } from "@/i18n" import { appendSlugToPathname } from "@/utils/appendSlugToPathname" @@ -32,6 +33,9 @@ export default async function AmenitiesSidePeek({ title={intl.formatMessage({ defaultMessage: "Amenities", })} + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} > +

diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/RestaurantBar/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/RestaurantBar/index.tsx index a2ae9b6bd..51e05b242 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/RestaurantBar/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/RestaurantBar/index.tsx @@ -1,4 +1,6 @@ -import SidePeek from "@/components/TempDesignSystem/SidePeek" +import SidePeek from "@scandic-hotels/design-system/SidePeek" + +import { getIntl } from "@/i18n" import RestaurantBarItem from "./RestaurantBarItem" @@ -7,12 +9,20 @@ import styles from "./restaurantBar.module.css" import { SidepeekSlugs } from "@/types/components/hotelPage/hotelPage" import type { RestaurantBarSidePeekProps } from "@/types/components/hotelPage/sidepeek/restaurantBar" -export default function RestaurantBarSidePeek({ +export default async function RestaurantBarSidePeek({ restaurants, heading, }: RestaurantBarSidePeekProps) { + const intl = await getIntl() + return ( - +
{restaurants.map((restaurant) => (
diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx index 3c408160c..2ad34d1a7 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx @@ -3,10 +3,10 @@ import Link from "next/link" import { selectRateWithParams } from "@scandic-hotels/common/constants/routes/hotelReservation" import { dt } from "@scandic-hotels/common/dt" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" +import SidePeek from "@scandic-hotels/design-system/SidePeek" import { Typography } from "@scandic-hotels/design-system/Typography" import ImageGallery from "@/components/ImageGallery" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" import { mapApiImagesToGalleryImages } from "@/utils/imageGallery" @@ -43,7 +43,13 @@ export default async function RoomSidePeek({ const selectRateURL = selectRateWithParams(lang, hotelId, fromdate, todate) return ( - +
diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Tripadvisor/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Tripadvisor/index.tsx index 4663ab0ed..2adfe4f48 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Tripadvisor/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Tripadvisor/index.tsx @@ -1,7 +1,8 @@ import { notFound } from "next/navigation" +import SidePeek from "@scandic-hotels/design-system/SidePeek" + import Image from "@/components/Image" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" @@ -45,6 +46,9 @@ export default async function TripAdvisorSidePeek({ title={intl.formatMessage({ defaultMessage: "Ratings & reviews", })} + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} >
{hotelHasAwards ? ( diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/index.tsx index 218b2e76b..1b46511c7 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/index.tsx @@ -1,7 +1,8 @@ import { cx } from "class-variance-authority" +import SidePeek from "@scandic-hotels/design-system/SidePeek" + import ButtonLink from "@/components/ButtonLink" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import { getIntl } from "@/i18n" import { appendSlugToPathname } from "@/utils/appendSlugToPathname" @@ -24,7 +25,13 @@ export default async function WellnessAndExerciseSidePeek({ ) return ( - +
{children} + function handleClose() { + const nextSearchParams = new URLSearchParams(searchParams.toString()) + nextSearchParams.delete("s") + router.push(`${pathname}?${nextSearchParams}`, { scroll: false }) + } + + return ( + + {children} + + ) } diff --git a/apps/scandic-web/components/SidePeeks/HotelSidePeek/index.tsx b/apps/scandic-web/components/SidePeeks/HotelSidePeek/index.tsx index 3bc7baef5..c03d7ac76 100644 --- a/apps/scandic-web/components/SidePeeks/HotelSidePeek/index.tsx +++ b/apps/scandic-web/components/SidePeeks/HotelSidePeek/index.tsx @@ -2,13 +2,13 @@ import { useIntl } from "react-intl" +import SidePeek from "@scandic-hotels/design-system/SidePeek" import { Typography } from "@scandic-hotels/design-system/Typography" import ButtonLink from "@/components/ButtonLink" import Contact from "@/components/HotelReservation/Contact" import AdditionalAmenities from "@/components/SidePeeks/AmenitiesSidepeekContent/AdditionalAmenities" import Accordion from "@/components/TempDesignSystem/Accordion" -import SidePeek from "@/components/TempDesignSystem/SidePeek" import AccessibilityAccordionItem from "../AmenitiesSidepeekContent/Accordions/Accessibility" import BreakfastAccordionItem from "../AmenitiesSidepeekContent/Accordions/Breakfast" @@ -34,6 +34,9 @@ export default function HotelSidePeek({ title={hotel.name} isOpen={activeSidePeek === SidePeekEnum.hotelDetails} handleClose={close} + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} >
diff --git a/apps/scandic-web/components/SidePeeks/RoomSidePeek/index.tsx b/apps/scandic-web/components/SidePeeks/RoomSidePeek/index.tsx index c92ecda4d..be5389a3e 100644 --- a/apps/scandic-web/components/SidePeeks/RoomSidePeek/index.tsx +++ b/apps/scandic-web/components/SidePeeks/RoomSidePeek/index.tsx @@ -1,4 +1,6 @@ -import SidePeek from "@/components/TempDesignSystem/SidePeek" +import { useIntl } from "react-intl" + +import SidePeek from "@scandic-hotels/design-system/SidePeek" import { RoomSidePeekContent } from "./RoomSidePeekContent" @@ -10,11 +12,16 @@ export default function RoomSidePeek({ activeSidePeek, close, }: RoomSidePeekProps) { + const intl = useIntl() + return ( diff --git a/apps/scandic-web/components/TempDesignSystem/Alert/Sidepeek/index.tsx b/apps/scandic-web/components/TempDesignSystem/Alert/Sidepeek/index.tsx index b9db62022..6ca836e82 100644 --- a/apps/scandic-web/components/TempDesignSystem/Alert/Sidepeek/index.tsx +++ b/apps/scandic-web/components/TempDesignSystem/Alert/Sidepeek/index.tsx @@ -1,14 +1,14 @@ "use client" import { useState } from "react" +import { useIntl } from "react-intl" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" +import SidePeek from "@scandic-hotels/design-system/SidePeek" import JsonToHtml from "@/components/JsonToHtml" -import SidePeek from "../../SidePeek" - import styles from "./sidepeek.module.css" import type { AlertSidepeekProps } from "./sidepeek" @@ -17,6 +17,7 @@ export default function AlertSidepeek({ ctaText, sidePeekContent, }: AlertSidepeekProps) { + const intl = useIntl() const [sidePeekIsOpen, setSidePeekIsOpen] = useState(false) const { heading, content } = sidePeekContent @@ -38,6 +39,9 @@ export default function AlertSidepeek({ title={heading} isOpen={sidePeekIsOpen} handleClose={() => setSidePeekIsOpen(false)} + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} > void -} diff --git a/apps/scandic-web/components/TempDesignSystem/TeaserCard/Sidepeek/index.tsx b/apps/scandic-web/components/TempDesignSystem/TeaserCard/Sidepeek/index.tsx index 53d5a1320..240228416 100644 --- a/apps/scandic-web/components/TempDesignSystem/TeaserCard/Sidepeek/index.tsx +++ b/apps/scandic-web/components/TempDesignSystem/TeaserCard/Sidepeek/index.tsx @@ -1,15 +1,15 @@ "use client" import { useState } from "react" +import { useIntl } from "react-intl" import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" +import SidePeek from "@scandic-hotels/design-system/SidePeek" import ButtonLink from "@/components/ButtonLink" import JsonToHtml from "@/components/JsonToHtml" -import SidePeek from "../../SidePeek" - import styles from "./sidepeek.module.css" import type { TeaserCardSidepeekProps } from "@/types/components/teaserCard" @@ -18,6 +18,7 @@ export default function TeaserCardSidepeek({ button, sidePeekContent, }: TeaserCardSidepeekProps) { + const intl = useIntl() const [sidePeekIsOpen, setSidePeekIsOpen] = useState(false) const { heading, content, primary_button, secondary_button } = sidePeekContent @@ -38,6 +39,9 @@ export default function TeaserCardSidepeek({ isOpen={sidePeekIsOpen} handleClose={() => setSidePeekIsOpen(false)} openInRoot + closeLabel={intl.formatMessage({ + defaultMessage: "Close", + })} > {content ? ( void + onClose?: () => void + searchParams: URLSearchParams } -interface ISidePeekContext { - handleClose: (isOpen: boolean) => void - activeSidePeek: string | null -} - -export const SidePeekContext = createContext(null) - export default function SidePeekProvider({ children, + searchParams, onOpen, + onClose, }: SidepeekProviderProps) { - const router = useRouter() - const pathname = usePathname() - const searchParams = useSearchParams() const [activeSidePeek, setActiveSidePeek] = useState(null) useEffect(() => { - const sidePeekParam = searchParams.get("s") + const sidePeekParam = searchParams.get('s') if (sidePeekParam !== activeSidePeek) { setActiveSidePeek(sidePeekParam) } @@ -36,9 +30,7 @@ export default function SidePeekProvider({ function handleClose(isOpen: boolean) { if (!isOpen) { - const nextSearchParams = new URLSearchParams(searchParams.toString()) - nextSearchParams.delete("s") - router.push(`${pathname}?${nextSearchParams}`, { scroll: false }) + onClose?.() setActiveSidePeek(null) } } diff --git a/packages/design-system/lib/components/SidePeek/SidePeekContext/index.tsx b/packages/design-system/lib/components/SidePeek/SidePeekContext/index.tsx new file mode 100644 index 000000000..a9419db08 --- /dev/null +++ b/packages/design-system/lib/components/SidePeek/SidePeekContext/index.tsx @@ -0,0 +1,9 @@ +'use client' +import { createContext } from 'react' + +interface ISidePeekContext { + handleClose: (isOpen: boolean) => void + activeSidePeek: string | null +} + +export const SidePeekContext = createContext(null) diff --git a/apps/scandic-web/components/TempDesignSystem/SidePeek/SidePeekSEO.tsx b/packages/design-system/lib/components/SidePeek/SidePeekSEO.tsx similarity index 78% rename from apps/scandic-web/components/TempDesignSystem/SidePeek/SidePeekSEO.tsx rename to packages/design-system/lib/components/SidePeek/SidePeekSEO.tsx index 336c9c69b..56341c847 100644 --- a/apps/scandic-web/components/TempDesignSystem/SidePeek/SidePeekSEO.tsx +++ b/packages/design-system/lib/components/SidePeek/SidePeekSEO.tsx @@ -1,4 +1,6 @@ -import type { SidePeekProps } from "./sidePeek" +interface SidePeekSEOProps { + title: string +} // Sidepeeks generally have important content that should be indexed by search engines. // The content is hidden behind a modal, but it is still important for SEO. @@ -6,7 +8,7 @@ import type { SidePeekProps } from "./sidePeek" export default function SidePeekSEO({ title, children, -}: React.PropsWithChildren>) { +}: React.PropsWithChildren) { return (

{title}

diff --git a/apps/scandic-web/components/TempDesignSystem/SidePeek/index.tsx b/packages/design-system/lib/components/SidePeek/index.tsx similarity index 69% rename from apps/scandic-web/components/TempDesignSystem/SidePeek/index.tsx rename to packages/design-system/lib/components/SidePeek/index.tsx index ac6ac1e8f..faf11c4aa 100644 --- a/apps/scandic-web/components/TempDesignSystem/SidePeek/index.tsx +++ b/packages/design-system/lib/components/SidePeek/index.tsx @@ -1,20 +1,26 @@ -"use client" +'use client' -import { useContext, useRef } from "react" -import { Dialog, Modal, ModalOverlay } from "react-aria-components" -import { useIntl } from "react-intl" +import { useContext, useRef } from 'react' +import { Dialog, Modal, ModalOverlay } from 'react-aria-components' -import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" -import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" -import { Typography } from "@scandic-hotels/design-system/Typography" +import { MaterialIcon } from '../Icons/MaterialIcon' +import { OldDSButton as Button } from '../OldDSButton' +import { Typography } from '../Typography' -import { SidePeekContext } from "@/components/SidePeeks/SidePeekProvider" +import { SidePeekContext } from './SidePeekContext' -import SidePeekSEO from "./SidePeekSEO" +import SidePeekSEO from './SidePeekSEO' -import styles from "./sidePeek.module.css" +import styles from './sidePeek.module.css' -import type { SidePeekProps } from "./sidePeek" +interface SidePeekProps { + contentKey?: string + title: string + isOpen?: boolean + openInRoot?: boolean + handleClose?: (isOpen: boolean) => void + closeLabel: string +} export default function SidePeek({ children, @@ -23,14 +29,14 @@ export default function SidePeek({ handleClose, isOpen, openInRoot = false, + closeLabel, }: React.PropsWithChildren) { - const intl = useIntl() const rootDiv = useRef(null) const context = useContext(SidePeekContext) function onClose() { const closeHandler = handleClose || context?.handleClose - closeHandler && closeHandler(false) + closeHandler?.(false) } return ( @@ -55,9 +61,7 @@ export default function SidePeek({ ) : null}