feat(SW-2528): add restaurant type icon to sidepeek * feat(SW-2528): add restaurant type icon to sidepeek Approved-by: Anton Gunnarsson
98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { CurrencyEnum } from "@scandic-hotels/common/constants/currency"
|
|
import {
|
|
nullableIntValidator,
|
|
nullableNumberValidator,
|
|
} from "@scandic-hotels/common/utils/zod/numberValidator"
|
|
import {
|
|
nullableStringUrlValidator,
|
|
nullableStringValidator,
|
|
} from "@scandic-hotels/common/utils/zod/stringValidator"
|
|
|
|
import { imageSchema } from "../../image"
|
|
import { specialAlertsSchema } from "../specialAlerts"
|
|
|
|
const descriptionSchema = z.object({
|
|
medium: nullableStringValidator,
|
|
short: nullableStringValidator,
|
|
})
|
|
|
|
const textSchema = z.object({
|
|
descriptions: descriptionSchema,
|
|
facilityInformation: nullableStringValidator,
|
|
meetingDescription: descriptionSchema.optional(),
|
|
surroundingInformation: nullableStringValidator,
|
|
})
|
|
|
|
const contentSchema = z.object({
|
|
images: z.array(imageSchema).default([]),
|
|
texts: textSchema,
|
|
})
|
|
|
|
const restaurantPriceSchema = z.object({
|
|
amount: nullableNumberValidator,
|
|
currency: z.nativeEnum(CurrencyEnum).default(CurrencyEnum.SEK),
|
|
})
|
|
|
|
const externalBreakfastSchema = z.object({
|
|
isAvailable: z.boolean().default(false),
|
|
localPriceForExternalGuests: restaurantPriceSchema.optional(),
|
|
requestedPriceForExternalGuests: restaurantPriceSchema.optional(),
|
|
})
|
|
|
|
const menuItemSchema = z.object({
|
|
name: nullableStringValidator,
|
|
url: nullableStringUrlValidator,
|
|
})
|
|
|
|
export const openingHoursDetailsSchema = z.object({
|
|
alwaysOpen: z.boolean().default(false),
|
|
closingTime: nullableStringValidator,
|
|
isClosed: z.boolean().default(false),
|
|
openingTime: nullableStringValidator,
|
|
sortOrder: nullableIntValidator,
|
|
})
|
|
|
|
export const openingHoursSchema = z.object({
|
|
friday: openingHoursDetailsSchema.optional(),
|
|
isActive: z.boolean().default(false),
|
|
monday: openingHoursDetailsSchema.optional(),
|
|
name: nullableStringValidator,
|
|
nameEnglish: nullableStringValidator,
|
|
saturday: openingHoursDetailsSchema.optional(),
|
|
sunday: openingHoursDetailsSchema.optional(),
|
|
thursday: openingHoursDetailsSchema.optional(),
|
|
tuesday: openingHoursDetailsSchema.optional(),
|
|
wednesday: openingHoursDetailsSchema.optional(),
|
|
})
|
|
|
|
const openingDetailsSchema = z.object({
|
|
alternateOpeningHours: openingHoursSchema.optional(),
|
|
openingHours: openingHoursSchema,
|
|
ordinary: openingHoursSchema.optional(),
|
|
weekends: openingHoursSchema.optional(),
|
|
})
|
|
|
|
export const restaurantsSchema = z.object({
|
|
attributes: z.object({
|
|
bookTableUrl: nullableStringValidator,
|
|
content: contentSchema,
|
|
elevatorPitch: z.string().optional(),
|
|
email: z.string().email().optional(),
|
|
externalBreakfast: externalBreakfastSchema,
|
|
isPublished: z.boolean().default(false),
|
|
mainBody: z.string().optional(),
|
|
menus: z.array(menuItemSchema).default([]),
|
|
name: z.string().default(""),
|
|
nameInUrl: z.string().optional(),
|
|
openingDetails: z.array(openingDetailsSchema).default([]),
|
|
phoneNumber: z.string().optional(),
|
|
restaurantPage: z.boolean().default(false),
|
|
specialAlerts: specialAlertsSchema,
|
|
type: z.string(),
|
|
}),
|
|
id: z.string(),
|
|
type: z.literal("restaurants"),
|
|
})
|