diff --git a/components/Forms/BookingWidget/FormContent/Search/index.tsx b/components/Forms/BookingWidget/FormContent/Search/index.tsx index 3df3f9c7c..1f91f57ca 100644 --- a/components/Forms/BookingWidget/FormContent/Search/index.tsx +++ b/components/Forms/BookingWidget/FormContent/Search/index.tsx @@ -22,7 +22,10 @@ import SearchList from "./SearchList" import styles from "./search.module.css" import type { BookingWidgetSchema } from "@/types/components/bookingWidget" -import { ActionType } from "@/types/components/form/bookingwidget" +import { + ActionType, + SetStorageData, +} from "@/types/components/form/bookingwidget" import type { SearchProps } from "@/types/components/search" import type { Location } from "@/types/trpc/routers/hotel/locations" @@ -40,7 +43,7 @@ export default function Search({ locations, handlePressEnter }: SearchProps) { : null const [state, dispatch] = useReducer( reducer, - { defaultLocations: locations }, + { defaultLocations: locations, initialValue: value }, init ) const handleMatchLocations = useCallback( @@ -122,30 +125,19 @@ export default function Search({ locations, handlePressEnter }: SearchProps) { } useEffect(() => { - const searchData = - typeof window !== "undefined" - ? sessionStorage.getItem(sessionStorageKey) - : undefined - - const searchHistory = - typeof window !== "undefined" - ? localStorage.getItem(localStorageKey) - : null - if (searchData || searchHistory) { - dispatch({ - payload: { - searchData: - isValidJson(searchData) && searchData - ? JSON.parse(searchData) - : undefined, - searchHistory: - isValidJson(searchHistory) && searchHistory - ? JSON.parse(searchHistory) - : null, - }, - type: ActionType.SET_STORAGE_DATA, - }) + const searchData = sessionStorage.getItem(sessionStorageKey) + const searchHistory = localStorage.getItem(localStorageKey) + const payload: SetStorageData["payload"] = {} + if (searchData) { + payload.searchData = JSON.parse(searchData) } + if (searchHistory) { + payload.searchHistory = JSON.parse(searchHistory) + } + dispatch({ + payload, + type: ActionType.SET_STORAGE_DATA, + }) }, [dispatch]) const stayType = state.searchData?.type === "cities" ? "city" : "hotel" diff --git a/components/Forms/BookingWidget/FormContent/Search/reducer.ts b/components/Forms/BookingWidget/FormContent/Search/reducer.ts index dd7bb1f8c..3ca0e2b93 100644 --- a/components/Forms/BookingWidget/FormContent/Search/reducer.ts +++ b/components/Forms/BookingWidget/FormContent/Search/reducer.ts @@ -10,11 +10,20 @@ export const localStorageKey = "searchHistory" export const sessionStorageKey = "searchData" export function init(initState: InitState): State { + const locations = [] + if (initState.initialValue) { + const location = initState.defaultLocations.find( + (loc) => loc.name.toLowerCase() === initState.initialValue!.toLowerCase() + ) + if (location) { + locations.push(location) + } + } return { defaultLocations: initState.defaultLocations, - locations: [], - search: "", - searchData: undefined, + locations, + search: locations.length ? locations[0].name : "", + searchData: locations.length ? locations[0] : undefined, searchHistory: null, } } @@ -73,8 +82,12 @@ export function reducer(state: State, action: Action) { case ActionType.SET_STORAGE_DATA: { return { ...state, - searchData: action.payload.searchData, - searchHistory: action.payload.searchHistory, + searchData: action.payload.searchData + ? action.payload.searchData + : state.searchData, + searchHistory: action.payload.searchHistory + ? action.payload.searchHistory + : state.searchHistory, } } default: diff --git a/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx index 3d2e5dc9a..5a7a1a9f8 100644 --- a/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx @@ -30,7 +30,11 @@ export default function Confirmation({ - +
diff --git a/components/HotelReservation/BookingConfirmation/Promos/Promo/index.tsx b/components/HotelReservation/BookingConfirmation/Promos/Promo/index.tsx index f8319c644..6373a9570 100644 --- a/components/HotelReservation/BookingConfirmation/Promos/Promo/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Promos/Promo/index.tsx @@ -1,4 +1,5 @@ import Button from "@/components/TempDesignSystem/Button" +import Link from "@/components/TempDesignSystem/Link" import Body from "@/components/TempDesignSystem/Text/Body" import Title from "@/components/TempDesignSystem/Text/Title" @@ -6,7 +7,7 @@ import styles from "./promo.module.css" import type { PromoProps } from "@/types/components/hotelReservation/bookingConfirmation/promo" -export default function Promo({ buttonText, text, title }: PromoProps) { +export default function Promo({ buttonText, href, text, title }: PromoProps) { return (
@@ -15,8 +16,10 @@ export default function Promo({ buttonText, text, title }: PromoProps) { <Body className={styles.text} color="white" textAlign="center"> {text} </Body> - <Button intent="primary" size="small" theme="primaryStrong"> - {buttonText} + <Button asChild intent="primary" size="small" theme="primaryStrong"> + <Link color="none" href={href}> + {buttonText} + </Link> </Button> </article> ) diff --git a/components/HotelReservation/BookingConfirmation/Promos/Promo/promo.module.css b/components/HotelReservation/BookingConfirmation/Promos/Promo/promo.module.css index ed4714228..1fa553838 100644 --- a/components/HotelReservation/BookingConfirmation/Promos/Promo/promo.module.css +++ b/components/HotelReservation/BookingConfirmation/Promos/Promo/promo.module.css @@ -15,22 +15,22 @@ .promo:nth-of-type(1) { background-image: linear-gradient( - 180deg, - rgba(0, 0, 0, 0) 0%, - rgba(0, 0, 0, 0.36) 37.88%, - rgba(0, 0, 0, 0.75) 100% - ); - /* , url(""); uncomment and add image once we have it */ + 180deg, + rgba(0, 0, 0, 0) 0%, + rgba(0, 0, 0, 0.36) 37.88%, + rgba(0, 0, 0, 0.75) 100% + ), + url("/_static/img/Scandic_Park_Party_Lipstick.jpg"); } .promo:nth-of-type(2) { background-image: linear-gradient( - 180deg, - rgba(0, 0, 0, 0) 0%, - rgba(0, 0, 0, 0.36) 37.88%, - rgba(0, 0, 0, 0.75) 100% - ); - /* , url(""); uncomment and add image once we have it */ + 180deg, + rgba(0, 0, 0, 0) 0%, + rgba(0, 0, 0, 0.36) 37.88%, + rgba(0, 0, 0, 0.75) 100% + ), + url("/_static/img/Scandic_Family_Breakfast.jpg"); } .text { diff --git a/components/HotelReservation/BookingConfirmation/Promos/index.tsx b/components/HotelReservation/BookingConfirmation/Promos/index.tsx index 4cf6d9076..1ee922763 100644 --- a/components/HotelReservation/BookingConfirmation/Promos/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Promos/index.tsx @@ -1,16 +1,32 @@ "use client" import { useIntl } from "react-intl" +import { homeHrefs } from "@/constants/homeHrefs" +import { myBooking } from "@/constants/myBooking" +import { env } from "@/env/client" + +import useLang from "@/hooks/useLang" + import Promo from "./Promo" import styles from "./promos.module.css" -export default function Promos() { +import type { PromosProps } from "@/types/components/hotelReservation/bookingConfirmation/promos" + +export default function Promos({ + confirmationNumber, + hotelId, + lastName, +}: PromosProps) { const intl = useIntl() + const lang = useLang() + const homeUrl = homeHrefs[env.NEXT_PUBLIC_NODE_ENV][lang] + const myBookingUrl = myBooking[env.NEXT_PUBLIC_NODE_ENV][lang] return ( <div className={styles.promos}> <Promo buttonText={intl.formatMessage({ id: "View and buy add-ons" })} + href={`${myBookingUrl}?bookingId=${confirmationNumber}&lastName=${lastName}`} text={intl.formatMessage({ id: "Discover the little extra touches to make your upcoming stay even more unforgettable.", })} @@ -18,6 +34,7 @@ export default function Promos() { /> <Promo buttonText={intl.formatMessage({ id: "Book another stay" })} + href={`${homeUrl}?hotel=${hotelId}`} text={intl.formatMessage({ id: "Get inspired and start dreaming beyond your next trip. Explore more Scandic destinations.", })} diff --git a/constants/myBooking.ts b/constants/myBooking.ts new file mode 100644 index 000000000..dab4e3423 --- /dev/null +++ b/constants/myBooking.ts @@ -0,0 +1,26 @@ +export const myBooking = { + development: { + da: "https://stage.scandichotels.dk/hotelreservation/min-booking", + de: "https://stage.scandichotels.de/hotelreservation/my-booking", + en: "https://stage.scandichotels.com/hotelreservation/my-booking", + fi: "https://stage.scandichotels.fi/varaa-hotelli/varauksesi", + no: "https://stage.scandichotels.no/hotelreservation/my-booking", + sv: "https://stage.scandichotels.se/hotelreservation/din-bokning", + }, + production: { + da: "https://www.scandichotels.dk/hotelreservation/min-booking", + de: "https://www.scandichotels.de/hotelreservation/my-booking", + en: "https://www.scandichotels.com/hotelreservation/my-booking", + fi: "https://www.scandichotels.fi/varaa-hotelli/varauksesi", + no: "https://www.scandichotels.no/hotelreservation/my-booking", + sv: "https://www.scandichotels.se/hotelreservation/din-bokning", + }, + test: { + da: "https://test2.scandichotels.dk/hotelreservation/min-booking", + de: "https://test2.scandichotels.de/hotelreservation/my-booking", + en: "https://test2.scandichotels.com/hotelreservation/my-booking", + fi: "https://test2.scandichotels.fi/varaa-hotelli/varauksesi", + no: "https://test2.scandichotels.no/hotelreservation/my-booking", + sv: "https://test2.scandichotels.se/hotelreservation/din-bokning", + }, +} diff --git a/public/_static/img/Scandic_Family_Breakfast.jpg b/public/_static/img/Scandic_Family_Breakfast.jpg new file mode 100644 index 000000000..dca5e463b Binary files /dev/null and b/public/_static/img/Scandic_Family_Breakfast.jpg differ diff --git a/public/_static/img/Scandic_Park_Party_Lipstick.jpg b/public/_static/img/Scandic_Park_Party_Lipstick.jpg new file mode 100644 index 000000000..4473c1bbe Binary files /dev/null and b/public/_static/img/Scandic_Park_Party_Lipstick.jpg differ diff --git a/types/components/form/bookingwidget.ts b/types/components/form/bookingwidget.ts index e04a1ec9a..15712f2e9 100644 --- a/types/components/form/bookingwidget.ts +++ b/types/components/form/bookingwidget.ts @@ -44,10 +44,10 @@ interface SetItemAction { type: ActionType.SELECT_ITEM } -interface SetStorageData { +export interface SetStorageData { payload: { - searchData: Location - searchHistory: Locations + searchData?: Location + searchHistory?: Locations } type: ActionType.SET_STORAGE_DATA } @@ -67,4 +67,6 @@ export interface State { searchHistory: Locations | null } -export interface InitState extends Pick<State, "defaultLocations"> {} +export interface InitState extends Pick<State, "defaultLocations"> { + initialValue?: string +} diff --git a/types/components/hotelReservation/bookingConfirmation/promo.ts b/types/components/hotelReservation/bookingConfirmation/promo.ts index 22cf695d8..03fdf07bc 100644 --- a/types/components/hotelReservation/bookingConfirmation/promo.ts +++ b/types/components/hotelReservation/bookingConfirmation/promo.ts @@ -1,5 +1,6 @@ export interface PromoProps { buttonText: string + href: string text: string title: string } diff --git a/types/components/hotelReservation/bookingConfirmation/promos.ts b/types/components/hotelReservation/bookingConfirmation/promos.ts new file mode 100644 index 000000000..097f55cdb --- /dev/null +++ b/types/components/hotelReservation/bookingConfirmation/promos.ts @@ -0,0 +1,5 @@ +export interface PromosProps { + confirmationNumber: string | null + hotelId: string + lastName: string | null +}