diff --git a/components/TempDesignSystem/Form/Phone/index.tsx b/components/TempDesignSystem/Form/Phone/index.tsx
index 9c413fc0a..5ff8f3482 100644
--- a/components/TempDesignSystem/Form/Phone/index.tsx
+++ b/components/TempDesignSystem/Form/Phone/index.tsx
@@ -78,67 +78,69 @@ export default function Phone({
}
return (
-
-
(
-
-
- {intl.formatMessage({ id: "Country code" })}
-
-
- {props.children}
-
-
+
+
(
+
+
+ {intl.formatMessage({ id: "Country code" })}
+
+
+ {props.children}
+
+
+
+
-
-
-
-
- )}
- />
-
-
+
+ )}
/>
-
-
+
+
+
+
+
)
}
diff --git a/components/TempDesignSystem/Form/Phone/phone.module.css b/components/TempDesignSystem/Form/Phone/phone.module.css
index f2b75136b..31de5be30 100644
--- a/components/TempDesignSystem/Form/Phone/phone.module.css
+++ b/components/TempDesignSystem/Form/Phone/phone.module.css
@@ -1,3 +1,7 @@
+.wrapper {
+ container-name: phoneContainer;
+ container-type: inline-size;
+}
.phone {
display: grid;
gap: var(--Spacing-x2);
@@ -100,3 +104,10 @@
justify-self: flex-start;
padding: 0;
}
+
+@container phoneContainer (max-width: 350px) {
+ .phone {
+ display: flex;
+ flex-direction: column;
+ }
+}
diff --git a/components/TempDesignSystem/Link/link.module.css b/components/TempDesignSystem/Link/link.module.css
index 138c8094e..3a997bddb 100644
--- a/components/TempDesignSystem/Link/link.module.css
+++ b/components/TempDesignSystem/Link/link.module.css
@@ -16,7 +16,7 @@
.breadcrumb {
font-family: var(--typography-Footnote-Bold-fontFamily);
font-size: var(--typography-Footnote-Bold-fontSize);
- font-weight: var(--typography-Footnote-Bold-fontWeight);
+ font-weight: 500; /* var(--typography-Footnote-Bold-fontWeight); */
letter-spacing: var(--typography-Footnote-Bold-letterSpacing);
line-height: var(--typography-Footnote-Bold-lineHeight);
}
@@ -24,7 +24,7 @@
.link.breadcrumb {
font-family: var(--typography-Footnote-Bold-fontFamily);
font-size: var(--typography-Footnote-Bold-fontSize);
- font-weight: var(--typography-Footnote-Bold-fontWeight);
+ font-weight: 500; /* var(--typography-Footnote-Bold-fontWeight); */
letter-spacing: var(--typography-Footnote-Bold-letterSpacing);
line-height: var(--typography-Footnote-Bold-lineHeight);
}
@@ -128,6 +128,15 @@
color: #000;
}
+.uiTextPlaceholder {
+ color: var(--Base-Text-Placeholder);
+}
+
+.uiTextPlaceholder:hover,
+.uiTextPlaceholder:active {
+ color: var(--Base-Text-Medium-contrast);
+}
+
.burgundy {
color: var(--Base-Text-High-contrast);
}
@@ -211,6 +220,14 @@
line-height: var(--typography-Caption-Regular-lineHeight);
}
+.tiny {
+ font-family: var(--typography-Footnote-Regular-fontFamily);
+ font-size: var(--typography-Footnote-Regular-fontSize);
+ font-weight: var(--typography-Footnote-Regular-fontWeight);
+ letter-spacing: var(--typography-Footnote-Regular-letterSpacing);
+ line-height: var(--typography-Footnote-Regular-lineHeight);
+}
+
.activeSmall {
font-family: var(--typography-Caption-Bold-fontFamily);
font-size: var(--typography-Caption-Bold-fontSize);
diff --git a/components/TempDesignSystem/Link/variants.ts b/components/TempDesignSystem/Link/variants.ts
index 61c7f8493..0a0c1dd6d 100644
--- a/components/TempDesignSystem/Link/variants.ts
+++ b/components/TempDesignSystem/Link/variants.ts
@@ -17,10 +17,12 @@ export const linkVariants = cva(styles.link, {
peach80: styles.peach80,
white: styles.white,
red: styles.red,
+ uiTextPlaceholder: styles.uiTextPlaceholder,
},
size: {
small: styles.small,
regular: styles.regular,
+ tiny: styles.tiny,
},
textDecoration: {
none: styles.noDecoration,
diff --git a/components/TempDesignSystem/Tooltip/index.tsx b/components/TempDesignSystem/Tooltip/index.tsx
index 033fc9a04..d73252161 100644
--- a/components/TempDesignSystem/Tooltip/index.tsx
+++ b/components/TempDesignSystem/Tooltip/index.tsx
@@ -28,6 +28,7 @@ export function Tooltip({
role="tooltip"
aria-label={text}
onClick={handleToggle}
+ onTouchStart={handleToggle}
data-active={isActive}
>
diff --git a/components/TempDesignSystem/Tooltip/tooltip.module.css b/components/TempDesignSystem/Tooltip/tooltip.module.css
index e25433f7c..b0ae8cf4f 100644
--- a/components/TempDesignSystem/Tooltip/tooltip.module.css
+++ b/components/TempDesignSystem/Tooltip/tooltip.module.css
@@ -16,6 +16,7 @@
transition: opacity 0.3s;
max-width: 200px;
min-width: 150px;
+ height: fit-content;
}
.tooltipContainer:hover .tooltip {
diff --git a/constants/routes/hotelReservation.js b/constants/routes/hotelReservation.js
index c7882f159..ed7ae99c5 100644
--- a/constants/routes/hotelReservation.js
+++ b/constants/routes/hotelReservation.js
@@ -48,7 +48,7 @@ export function selectHotel(lang) {
* @param {Lang} lang
*/
export function selectHotelMap(lang) {
- return `${base(lang)}/map`
+ return `${base(lang)}/select-hotel/map`
}
/**
diff --git a/i18n/dictionaries/da.json b/i18n/dictionaries/da.json
index 6a2c12e20..a9fdcfae4 100644
--- a/i18n/dictionaries/da.json
+++ b/i18n/dictionaries/da.json
@@ -154,6 +154,7 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotel faciliteter",
"Hotel surroundings": "Hotel omgivelser",
+ "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hoteller}}",
"Hotels": "Hoteller",
"How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det virker",
@@ -238,6 +239,7 @@
"Number of parking spots": "Antal parkeringspladser",
"OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På din rejse",
+ "Only pay {amount} {currency}": "Betal kun {amount} {currency}",
"Open": "Åben",
"Open gift(s)": "Åbne {amount, plural, one {gave} other {gaver}}",
"Open image gallery": "Åbn billedgalleri",
@@ -335,6 +337,7 @@
"Show wellness & exercise": "Vis velvære og motion",
"Sign up bonus": "Velkomstbonus",
"Sign up to Scandic Friends": "Tilmeld dig Scandic Friends",
+ "Signing up...": "Tilmelder...",
"Skip to main content": "Spring over og gå til hovedindhold",
"Something went wrong and we couldn't add your card. Please try again later.": "Noget gik galt, og vi kunne ikke tilføje dit kort. Prøv venligst igen senere.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Noget gik galt, og vi kunne ikke fjerne dit kort. Prøv venligst igen senere.",
@@ -458,6 +461,5 @@
"to": "til",
"uppercase letter": "stort bogstav",
"{amount} out of {total}": "{amount} ud af {total}",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{amount} {currency}": "{amount} {currency}"
}
diff --git a/i18n/dictionaries/de.json b/i18n/dictionaries/de.json
index 5968f5cee..96bcef2de 100644
--- a/i18n/dictionaries/de.json
+++ b/i18n/dictionaries/de.json
@@ -154,6 +154,7 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotel-Infos",
"Hotel surroundings": "Umgebung des Hotels",
+ "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hotels}}",
"Hotels": "Hotels",
"How do you want to sleep?": "Wie möchtest du schlafen?",
"How it works": "Wie es funktioniert",
@@ -236,6 +237,7 @@
"Number of parking spots": "Anzahl der Parkplätze",
"OTHER PAYMENT METHODS": "ANDERE BEZAHLMETHODE",
"On your journey": "Auf deiner Reise",
+ "Only pay {amount} {currency}": "Nur bezahlen {amount} {currency}",
"Open": "Offen",
"Open gift(s)": "{amount, plural, one {Geschenk} other {Geschenke}} öffnen",
"Open image gallery": "Bildergalerie öffnen",
@@ -334,6 +336,7 @@
"Show wellness & exercise": "Zeige Wellness und Bewegung",
"Sign up bonus": "Anmelde-Bonus",
"Sign up to Scandic Friends": "Treten Sie Scandic Friends bei",
+ "Signing up...": "Registrierung läuft...",
"Skip to main content": "Direkt zum Inhalt",
"Something went wrong and we couldn't add your card. Please try again later.": "Ein Fehler ist aufgetreten und wir konnten Ihre Karte nicht hinzufügen. Bitte versuchen Sie es später erneut.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Ein Fehler ist aufgetreten und wir konnten Ihre Karte nicht entfernen. Bitte versuchen Sie es später noch einmal.",
@@ -456,6 +459,5 @@
"to": "zu",
"uppercase letter": "großbuchstabe",
"{amount} out of {total}": "{amount} von {total}",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{amount} {currency}": "{amount} {currency}"
}
diff --git a/i18n/dictionaries/en.json b/i18n/dictionaries/en.json
index 910af641a..385861316 100644
--- a/i18n/dictionaries/en.json
+++ b/i18n/dictionaries/en.json
@@ -166,6 +166,7 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotel facilities",
"Hotel surroundings": "Hotel surroundings",
+ "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hotels}}",
"Hotels": "Hotels",
"How do you want to sleep?": "How do you want to sleep?",
"How it works": "How it works",
@@ -255,6 +256,7 @@
"Number of parking spots": "Number of parking spots",
"OTHER PAYMENT METHODS": "OTHER PAYMENT METHODS",
"On your journey": "On your journey",
+ "Only pay {amount} {currency}": "Only pay {amount} {currency}",
"Open": "Open",
"Open gift(s)": "Open {amount, plural, one {gift} other {gifts}}",
"Open image gallery": "Open image gallery",
@@ -364,6 +366,7 @@
"Show wellness & exercise": "Show wellness & exercise",
"Sign up bonus": "Sign up bonus",
"Sign up to Scandic Friends": "Sign up to Scandic Friends",
+ "Signing up...": "Signing up...",
"Skip to main content": "Skip to main content",
"Something went wrong and we couldn't add your card. Please try again later.": "Something went wrong and we couldn't add your card. Please try again later.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Something went wrong and we couldn't remove your card. Please try again later.",
@@ -427,7 +430,6 @@
"Which room class suits you the best?": "Which room class suits you the best?",
"Year": "Year",
"Yes": "Yes",
- "Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with",
"Yes, discard changes": "Yes, discard changes",
"Yes, remove my card": "Yes, remove my card",
"You can always change your mind later and add breakfast at the hotel.": "You can always change your mind later and add breakfast at the hotel.",
@@ -490,12 +492,12 @@
"points": "Points",
"room type": "room type",
"room types": "room types",
+ "signup.terms": "By signing up you accept the Scandic Friends Terms and Conditions . Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic’s customer service",
"special character": "special character",
"spendable points expiring by": "{points} spendable points expiring by {date}",
"to": "to",
"uppercase letter": "uppercase letter",
"{amount} out of {total}": "{amount} out of {total}",
"{amount} {currency}": "{amount} {currency}",
- "{card} ending with {cardno}": "{card} ending with {cardno}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{card} ending with {cardno}": "{card} ending with {cardno}"
}
diff --git a/i18n/dictionaries/fi.json b/i18n/dictionaries/fi.json
index bc79d0cf0..09fb8a403 100644
--- a/i18n/dictionaries/fi.json
+++ b/i18n/dictionaries/fi.json
@@ -154,6 +154,7 @@
"Hotel": "Hotelli",
"Hotel facilities": "Hotellin palvelut",
"Hotel surroundings": "Hotellin ympäristö",
+ "Hotel(s)": "{amount} {amount, plural, one {hotelli} other {hotellit}}",
"Hotels": "Hotellit",
"How do you want to sleep?": "Kuinka haluat nukkua?",
"How it works": "Kuinka se toimii",
@@ -238,6 +239,7 @@
"Number of parking spots": "Pysäköintipaikkojen määrä",
"OTHER PAYMENT METHODS": "MUISE KORT",
"On your journey": "Matkallasi",
+ "Only pay {amount} {currency}": "Vain maksaa {amount} {currency}",
"Open": "Avata",
"Open gift(s)": "{amount, plural, one {Avoin lahja} other {Avoimet lahjat}}",
"Open image gallery": "Avaa kuvagalleria",
@@ -336,6 +338,7 @@
"Show wellness & exercise": "Näytä hyvinvointi ja liikunta",
"Sign up bonus": "Liittymisbonus",
"Sign up to Scandic Friends": "Liity Scandic Friends -jäseneksi",
+ "Signing up...": "Rekisteröidytään...",
"Skip to main content": "Siirry pääsisältöön",
"Something went wrong and we couldn't add your card. Please try again later.": "Jotain meni pieleen, emmekä voineet lisätä korttiasi. Yritä myöhemmin uudelleen.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Jotain meni pieleen, emmekä voineet poistaa korttiasi. Yritä myöhemmin uudelleen.",
@@ -456,6 +459,5 @@
"to": "to",
"uppercase letter": "iso kirjain",
"{amount} out of {total}": "{amount}/{total}",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{amount} {currency}": "{amount} {currency}"
}
diff --git a/i18n/dictionaries/no.json b/i18n/dictionaries/no.json
index a5dd81fc4..dcbcdddf4 100644
--- a/i18n/dictionaries/no.json
+++ b/i18n/dictionaries/no.json
@@ -153,6 +153,7 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotelfaciliteter",
"Hotel surroundings": "Hotellomgivelser",
+ "Hotel(s)": "{amount} {amount, plural, one {hotell} other {hoteller}}",
"Hotels": "Hoteller",
"How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det fungerer",
@@ -236,6 +237,7 @@
"Number of parking spots": "Antall parkeringsplasser",
"OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På reisen din",
+ "Only pay {amount} {currency}": "Bare betal {amount} {currency}",
"Open": "Åpen",
"Open gift(s)": "{amount, plural, one {Åpen gave} other {Åpnen gaver}}",
"Open image gallery": "Åpne bildegalleri",
@@ -333,6 +335,7 @@
"Show wellness & exercise": "Vis velvære og trening",
"Sign up bonus": "Velkomstbonus",
"Sign up to Scandic Friends": "Bli med i Scandic Friends",
+ "Signing up...": "Registrerer...",
"Skip to main content": "Gå videre til hovedsiden",
"Something went wrong and we couldn't add your card. Please try again later.": "Noe gikk galt, og vi kunne ikke legge til kortet ditt. Prøv igjen senere.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Noe gikk galt, og vi kunne ikke fjerne kortet ditt. Vennligst prøv igjen senere.",
@@ -454,6 +457,5 @@
"to": "til",
"uppercase letter": "stor bokstav",
"{amount} out of {total}": "{amount} av {total}",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{amount} {currency}": "{amount} {currency}"
}
diff --git a/i18n/dictionaries/sv.json b/i18n/dictionaries/sv.json
index 0c5816f51..404896e15 100644
--- a/i18n/dictionaries/sv.json
+++ b/i18n/dictionaries/sv.json
@@ -153,6 +153,7 @@
"Hotel": "Hotell",
"Hotel facilities": "Hotellfaciliteter",
"Hotel surroundings": "Hotellomgivning",
+ "Hotel(s)": "{amount} hotell",
"Hotels": "Hotell",
"How do you want to sleep?": "Hur vill du sova?",
"How it works": "Hur det fungerar",
@@ -236,6 +237,7 @@
"Number of parking spots": "Antal parkeringsplatser",
"OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På din resa",
+ "Only pay {amount} {currency}": "Betala endast {amount} {currency}",
"Open": "Öppna",
"Open gift(s)": "Öppna {amount, plural, one {gåva} other {gåvor}}",
"Open image gallery": "Öppna bildgalleri",
@@ -333,6 +335,7 @@
"Show wellness & exercise": "Visa välbefinnande och träning",
"Sign up bonus": "Välkomstbonus",
"Sign up to Scandic Friends": "Bli medlem i Scandic Friends",
+ "Signing up...": "Registrerar...",
"Skip to main content": "Fortsätt till huvudinnehåll",
"Something went wrong and we couldn't add your card. Please try again later.": "Något gick fel och vi kunde inte lägga till ditt kort. Försök igen senare.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Något gick fel och vi kunde inte ta bort ditt kort. Försök igen senare.",
@@ -457,6 +460,5 @@
"types": "typer",
"uppercase letter": "stor bokstav",
"{amount} out of {total}": "{amount} av {total}",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}"
+ "{amount} {currency}": "{amount} {currency}"
}
diff --git a/providers/StepsProvider.tsx b/providers/StepsProvider.tsx
index 87594be02..9aaf6166f 100644
--- a/providers/StepsProvider.tsx
+++ b/providers/StepsProvider.tsx
@@ -1,4 +1,5 @@
"use client"
+import { useRouter } from "next/navigation"
import { useRef } from "react"
import { useDetailsStore } from "@/stores/details"
@@ -14,6 +15,7 @@ export default function StepsProvider({
breakfastPackages,
children,
isMember,
+ searchParams,
step,
}: StepsProviderProps) {
const storeRef = useRef()
@@ -21,6 +23,7 @@ export default function StepsProvider({
const updateBreakfast = useDetailsStore(
(state) => state.actions.updateBreakfast
)
+ const router = useRouter()
if (!storeRef.current) {
const noBedChoices = bedTypes.length === 1
@@ -41,7 +44,9 @@ export default function StepsProvider({
step,
isMember,
noBedChoices,
- noBreakfast
+ noBreakfast,
+ searchParams,
+ router.push
)
}
diff --git a/server/routers/hotels/output.ts b/server/routers/hotels/output.ts
index d4f3d89c9..41f9a6b52 100644
--- a/server/routers/hotels/output.ts
+++ b/server/routers/hotels/output.ts
@@ -13,7 +13,6 @@ import { AlertTypeEnum } from "@/types/enums/alert"
import { CurrencyEnum } from "@/types/enums/currency"
import { FacilityEnum } from "@/types/enums/facilities"
import { PackageTypeEnum } from "@/types/enums/packages"
-import { PointOfInterestCategoryNameEnum } from "@/types/hotel"
const ratingsSchema = z
.object({
@@ -199,14 +198,12 @@ const rewardNightSchema = z.object({
}),
})
-const poiCategoryNames = z.nativeEnum(PointOfInterestCategoryNameEnum)
-
export const pointOfInterestSchema = z
.object({
name: z.string(),
distance: z.number(),
category: z.object({
- name: poiCategoryNames,
+ name: z.string(),
group: z.string(),
}),
location: locationSchema,
@@ -515,7 +512,16 @@ export const productTypePriceSchema = z.object({
const productSchema = z.object({
productType: z.object({
- public: productTypePriceSchema,
+ public: productTypePriceSchema.default({
+ rateCode: "",
+ rateType: "",
+ localPrice: {
+ currency: "SEK",
+ pricePerNight: 0,
+ pricePerStay: 0,
+ },
+ requestedPrice: undefined,
+ }),
member: productTypePriceSchema.optional(),
}),
})
diff --git a/server/routers/hotels/query.ts b/server/routers/hotels/query.ts
index 7f2ef84c0..34a1b3722 100644
--- a/server/routers/hotels/query.ts
+++ b/server/routers/hotels/query.ts
@@ -731,7 +731,7 @@ export const hotelQueryRouter = router({
const rateTypes = selectedRoom.products.find(
(rate) =>
- rate.productType.public.rateCode === rateCode ||
+ rate.productType.public?.rateCode === rateCode ||
rate.productType.member?.rateCode === rateCode
)
diff --git a/server/routers/hotels/utils.ts b/server/routers/hotels/utils.ts
index 6d384b3cf..c3e785a59 100644
--- a/server/routers/hotels/utils.ts
+++ b/server/routers/hotels/utils.ts
@@ -12,39 +12,34 @@ import {
type Countries,
} from "./output"
-import type { RequestOptionsWithOutBody } from "@/types/fetch"
-import {
- PointOfInterestCategoryNameEnum,
- PointOfInterestGroupEnum,
-} from "@/types/hotel"
-import { HotelLocation } from "@/types/trpc/routers/hotel/locations"
import type { Lang } from "@/constants/languages"
import type { Endpoint } from "@/lib/api/endpoints"
+import type { RequestOptionsWithOutBody } from "@/types/fetch"
+import { PointOfInterestGroupEnum } from "@/types/hotel"
+import { HotelLocation } from "@/types/trpc/routers/hotel/locations"
-export function getPoiGroupByCategoryName(
- category: PointOfInterestCategoryNameEnum
-) {
+export function getPoiGroupByCategoryName(category: string) {
switch (category) {
- case PointOfInterestCategoryNameEnum.AIRPORT:
- case PointOfInterestCategoryNameEnum.BUS_TERMINAL:
- case PointOfInterestCategoryNameEnum.TRANSPORTATIONS:
+ case "Airport":
+ case "Bus terminal":
+ case "Transportations":
return PointOfInterestGroupEnum.PUBLIC_TRANSPORT
- case PointOfInterestCategoryNameEnum.AMUSEMENT_PARK:
- case PointOfInterestCategoryNameEnum.MUSEUM:
- case PointOfInterestCategoryNameEnum.SPORTS:
- case PointOfInterestCategoryNameEnum.THEATRE:
- case PointOfInterestCategoryNameEnum.TOURIST:
- case PointOfInterestCategoryNameEnum.ZOO:
+ case "Amusement park":
+ case "Museum":
+ case "Sports":
+ case "Theatre":
+ case "Tourist":
+ case "Zoo":
return PointOfInterestGroupEnum.ATTRACTIONS
- case PointOfInterestCategoryNameEnum.NEARBY_COMPANIES:
- case PointOfInterestCategoryNameEnum.FAIR:
+ case "Nearby companies":
+ case "Fair":
return PointOfInterestGroupEnum.BUSINESS
- case PointOfInterestCategoryNameEnum.PARKING_GARAGE:
+ case "Parking / Garage":
return PointOfInterestGroupEnum.PARKING
- case PointOfInterestCategoryNameEnum.SHOPPING:
- case PointOfInterestCategoryNameEnum.RESTAURANT:
+ case "Shopping":
+ case "Restaurant":
return PointOfInterestGroupEnum.SHOPPING_DINING
- case PointOfInterestCategoryNameEnum.HOSPITAL:
+ case "Hospital":
default:
return PointOfInterestGroupEnum.LOCATION
}
diff --git a/server/routers/user/input.ts b/server/routers/user/input.ts
index d84875ea3..1e9fee267 100644
--- a/server/routers/user/input.ts
+++ b/server/routers/user/input.ts
@@ -1,5 +1,9 @@
import { z } from "zod"
+import { Lang } from "@/constants/languages"
+
+import { signUpSchema } from "@/components/Forms/Signup/schema"
+
// Query
export const staysInput = z
.object({
@@ -35,3 +39,19 @@ export const saveCreditCardInput = z.object({
transactionId: z.string(),
merchantId: z.string().optional(),
})
+
+export const signupInput = signUpSchema
+ .extend({
+ language: z.nativeEnum(Lang),
+ })
+ .omit({ termsAccepted: true })
+ .transform((data) => ({
+ ...data,
+ phoneNumber: data.phoneNumber.replace(/\s+/g, ""),
+ address: {
+ ...data.address,
+ city: "",
+ country: "",
+ streetAddress: "",
+ },
+ }))
diff --git a/server/routers/user/mutation.ts b/server/routers/user/mutation.ts
index b03e6a68e..689c43a26 100644
--- a/server/routers/user/mutation.ts
+++ b/server/routers/user/mutation.ts
@@ -1,17 +1,20 @@
import { metrics } from "@opentelemetry/api"
+import { signupVerify } from "@/constants/routes/signup"
import { env } from "@/env/server"
import * as api from "@/lib/api"
+import { serverErrorByStatus } from "@/server/errors/trpc"
import {
initiateSaveCardSchema,
subscriberIdSchema,
} from "@/server/routers/user/output"
-import { protectedProcedure, router } from "@/server/trpc"
+import { protectedProcedure, router, serviceProcedure } from "@/server/trpc"
import {
addCreditCardInput,
deleteCreditCardInput,
saveCreditCardInput,
+ signupInput,
} from "./input"
const meter = metrics.getMeter("trpc.user")
@@ -24,6 +27,9 @@ const generatePreferencesLinkSuccessCounter = meter.createCounter(
const generatePreferencesLinkFailCounter = meter.createCounter(
"trpc.user.generatePreferencesLink-fail"
)
+const signupCounter = meter.createCounter("trpc.user.signup")
+const signupSuccessCounter = meter.createCounter("trpc.user.signup-success")
+const signupFailCounter = meter.createCounter("trpc.user.signup-fail")
export const userMutationRouter = router({
creditCard: router({
@@ -208,4 +214,46 @@ export const userMutationRouter = router({
generatePreferencesLinkSuccessCounter.add(1)
return preferencesLink.toString()
}),
+ signup: serviceProcedure.input(signupInput).mutation(async function ({
+ ctx,
+ input,
+ }) {
+ signupCounter.add(1)
+
+ const apiResponse = await api.post(api.endpoints.v1.Profile.profile, {
+ body: input,
+ headers: {
+ Authorization: `Bearer ${ctx.serviceToken}`,
+ },
+ })
+
+ if (!apiResponse.ok) {
+ const text = await apiResponse.text()
+ signupFailCounter.add(1, {
+ error_type: "http_error",
+ error: JSON.stringify({
+ status: apiResponse.status,
+ statusText: apiResponse.statusText,
+ error: text,
+ }),
+ })
+ console.error(
+ "api.user.signup api error",
+ JSON.stringify({
+ error: {
+ status: apiResponse.status,
+ statusText: apiResponse.statusText,
+ error: text,
+ },
+ })
+ )
+ throw serverErrorByStatus(apiResponse.status, text)
+ }
+ signupSuccessCounter.add(1)
+ console.info("api.user.signup success")
+ return {
+ success: true,
+ redirectUrl: signupVerify[input.language],
+ }
+ }),
})
diff --git a/server/routers/user/output.ts b/server/routers/user/output.ts
index a9e7a0416..616419047 100644
--- a/server/routers/user/output.ts
+++ b/server/routers/user/output.ts
@@ -1,6 +1,8 @@
import { z } from "zod"
import { countriesMap } from "@/components/TempDesignSystem/Form/Country/countries"
+import { passwordValidator } from "@/utils/passwordValidator"
+import { phoneValidator } from "@/utils/phoneValidator"
import { getMembership } from "@/utils/user"
export const membershipSchema = z.object({
diff --git a/server/trpc.ts b/server/trpc.ts
index 688ea01cf..3fc3a10a6 100644
--- a/server/trpc.ts
+++ b/server/trpc.ts
@@ -121,7 +121,7 @@ export const safeProtectedProcedure = t.procedure.use(async function (opts) {
})
})
-export const serviceProcedure = t.procedure.use(async (opts) => {
+export const serviceProcedure = t.procedure.use(async function (opts) {
const { access_token } = await getServiceToken()
if (!access_token) {
throw internalServerError(`[serviceProcedure] No service token`)
diff --git a/stores/details.ts b/stores/details.ts
index 5d23248e5..a382ad7d7 100644
--- a/stores/details.ts
+++ b/stores/details.ts
@@ -94,7 +94,6 @@ export function createDetailsStore(
state.data.membershipNo = data.membershipNo
}
state.data.phoneNumber = data.phoneNumber
- state.data.termsAccepted = data.termsAccepted
state.data.zipCode = data.zipCode
})
)
diff --git a/stores/steps.ts b/stores/steps.ts
index f1e456af2..cf14f6768 100644
--- a/stores/steps.ts
+++ b/stores/steps.ts
@@ -1,6 +1,7 @@
"use client"
import merge from "deepmerge"
import { produce } from "immer"
+import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"
import { useContext } from "react"
import { create, useStore } from "zustand"
@@ -18,17 +19,13 @@ import { StepEnum } from "@/types/enums/step"
import type { DetailsState } from "@/types/stores/details"
import type { StepState } from "@/types/stores/steps"
-function push(data: Record, url: string) {
- if (typeof window !== "undefined") {
- window.history.pushState(data, "", url + window.location.search)
- }
-}
-
export function createStepsStore(
currentStep: StepEnum,
isMember: boolean,
noBedChoices: boolean,
- noBreakfast: boolean
+ noBreakfast: boolean,
+ searchParams: string,
+ push: AppRouterInstance["push"]
) {
const isBrowser = typeof window !== "undefined"
const steps = [
@@ -51,14 +48,14 @@ export function createStepsStore(
steps.splice(1, 1)
if (currentStep === StepEnum.breakfast) {
currentStep = steps[1]
- push({ step: currentStep }, currentStep)
+ push(`${currentStep}?${searchParams}`)
}
}
if (noBedChoices) {
if (currentStep === StepEnum.selectBed) {
currentStep = steps[1]
- push({ step: currentStep }, currentStep)
+ push(`${currentStep}?${searchParams}`)
}
}
@@ -94,7 +91,7 @@ export function createStepsStore(
if (!validPaths.includes(currentStep) && isBrowser) {
// We will always have at least one valid path
currentStep = validPaths.pop()!
- push({ step: currentStep }, currentStep)
+ push(`${currentStep}?${searchParams}`)
}
}
diff --git a/types/components/form/bookingwidget.ts b/types/components/form/bookingwidget.ts
index 887c4eae2..bded82de3 100644
--- a/types/components/form/bookingwidget.ts
+++ b/types/components/form/bookingwidget.ts
@@ -4,7 +4,7 @@ import type { Location, Locations } from "@/types/trpc/routers/hotel/locations"
export interface BookingWidgetFormProps {
locations: Locations
type?: BookingWidgetType
- setIsOpen: (isOpen: boolean) => void
+ onClose: () => void
}
export interface BookingWidgetFormContentProps {
diff --git a/types/components/hotelReservation/enterDetails/details.ts b/types/components/hotelReservation/enterDetails/details.ts
index 685fad18a..25004467a 100644
--- a/types/components/hotelReservation/enterDetails/details.ts
+++ b/types/components/hotelReservation/enterDetails/details.ts
@@ -6,6 +6,14 @@ import type { SafeUser } from "@/types/user"
export type DetailsSchema = z.output
+type MemberPrice = { price: number; currency: string }
+
export interface DetailsProps {
user: SafeUser
+ memberPrice?: MemberPrice
+}
+
+export type JoinScandicFriendsCardProps = {
+ name: string
+ memberPrice?: MemberPrice
}
diff --git a/types/components/hotelReservation/selectHotel/hotelFilters.ts b/types/components/hotelReservation/selectHotel/hotelFilters.ts
index 200b960e5..fbfd926cf 100644
--- a/types/components/hotelReservation/selectHotel/hotelFilters.ts
+++ b/types/components/hotelReservation/selectHotel/hotelFilters.ts
@@ -16,3 +16,7 @@ export type Filter = {
sortOrder: number
filter?: string
}
+
+export type HotelFilterModalProps = {
+ filters: CategorizedFilters
+}
diff --git a/types/components/hotelReservation/selectHotel/map.ts b/types/components/hotelReservation/selectHotel/map.ts
index 810dba573..490f8d06e 100644
--- a/types/components/hotelReservation/selectHotel/map.ts
+++ b/types/components/hotelReservation/selectHotel/map.ts
@@ -6,7 +6,7 @@ import {
} from "@/server/routers/hotels/schemas/image"
import { HotelData } from "./hotelCardListingProps"
-import { Filter } from "./hotelFilters"
+import { CategorizedFilters, Filter } from "./hotelFilters"
import type { Coordinates } from "@/types/components/maps/coordinates"
@@ -21,6 +21,7 @@ export interface SelectHotelMapProps {
hotelPins: HotelPin[]
mapId: string
hotels: HotelData[]
+ filterList: CategorizedFilters
}
type ImageSizes = z.infer
diff --git a/types/components/maps/poiMarker.ts b/types/components/maps/poiMarker.ts
index 34fad0e6f..abab6fc9d 100644
--- a/types/components/maps/poiMarker.ts
+++ b/types/components/maps/poiMarker.ts
@@ -2,14 +2,11 @@ import { poiVariants } from "@/components/Maps/Markers/Poi/variants"
import type { VariantProps } from "class-variance-authority"
-import {
- PointOfInterestCategoryNameEnum,
- PointOfInterestGroupEnum,
-} from "@/types/hotel"
+import type { PointOfInterestGroupEnum } from "@/types/hotel"
export interface PoiMarkerProps extends VariantProps {
group: PointOfInterestGroupEnum
- categoryName?: PointOfInterestCategoryNameEnum
+ categoryName?: string
size?: number
className?: string
}
diff --git a/types/components/tracking.ts b/types/components/tracking.ts
index aa42ae5fe..fa6e82a95 100644
--- a/types/components/tracking.ts
+++ b/types/components/tracking.ts
@@ -80,3 +80,4 @@ export type TrackingPosition =
| "hamburger menu"
| "join scandic friends sidebar"
| "sign up verification"
+ | "enter details"
diff --git a/types/hotel.ts b/types/hotel.ts
index 5052caded..aadaab740 100644
--- a/types/hotel.ts
+++ b/types/hotel.ts
@@ -26,26 +26,6 @@ export type GalleryImage = z.infer
export type PointOfInterest = z.output
-export enum PointOfInterestCategoryNameEnum {
- AIRPORT = "Airport",
- AMUSEMENT_PARK = "Amusement park",
- BUS_TERMINAL = "Bus terminal",
- FAIR = "Fair",
- HOSPITAL = "Hospital",
- HOTEL = "Hotel",
- MARKETING_CITY = "Marketing city",
- MUSEUM = "Museum",
- NEARBY_COMPANIES = "Nearby companies",
- PARKING_GARAGE = "Parking / Garage",
- RESTAURANT = "Restaurant",
- SHOPPING = "Shopping",
- SPORTS = "Sports",
- THEATRE = "Theatre",
- TOURIST = "Tourist",
- TRANSPORTATIONS = "Transportations",
- ZOO = "Zoo",
-}
-
export enum PointOfInterestGroupEnum {
PUBLIC_TRANSPORT = "Public transport",
ATTRACTIONS = "Attractions",
diff --git a/types/providers/steps.ts b/types/providers/steps.ts
index 8c24fdc8f..9ba0361eb 100644
--- a/types/providers/steps.ts
+++ b/types/providers/steps.ts
@@ -6,5 +6,6 @@ export interface StepsProviderProps extends React.PropsWithChildren {
bedTypes: BedTypeSelection[]
breakfastPackages: BreakfastPackage[] | null
isMember: boolean
+ searchParams: string
step: StepEnum
}