chore(SW-194): HotelPage Faq

This commit is contained in:
Matilda Landström
2024-10-08 15:02:25 +02:00
parent 6265d6b7dc
commit 6ca75f43c6
5 changed files with 162 additions and 24 deletions

View File

@@ -48,7 +48,7 @@ export default async function HotelPage() {
activitiesCard,
pointsOfInterest,
facilities,
//accordion,
faq,
} = hotelData
const topThreePois = pointsOfInterest.slice(0, 3)
@@ -82,7 +82,7 @@ export default async function HotelPage() {
</div>
<Rooms rooms={roomCategories} />
<Facilities facilities={facilities} activitiesCard={activitiesCard} />
{/*accordion && <AccordionSection accordion={accordion} />*/}
{faq && <AccordionSection accordion={faq.faq} title={faq.title} />}
</main>
{googleMapsApiKey ? (
<>

View File

@@ -11,7 +11,8 @@ query GetHotelPage($locale: String!, $uid: String!) {
faq {
__typename
title
global_hotel_faqConnection {
global_faqConnection {
__typename
edges {
node {
... on Accordion {
@@ -25,17 +26,7 @@ query GetHotelPage($locale: String!, $uid: String!) {
edges {
node {
__typename
... on ContentPage {
__typename
title
url
system {
...System
}
web {
original_url
}
}
...ContentPageLink
}
}
}
@@ -45,7 +36,8 @@ query GetHotelPage($locale: String!, $uid: String!) {
}
}
}
hotel_specific_faq {
specific_faq {
__typename
questions {
answer {
json
@@ -53,6 +45,7 @@ query GetHotelPage($locale: String!, $uid: String!) {
edges {
node {
__typename
...ContentPageLink
}
}
}

View File

@@ -2,8 +2,8 @@ import { z } from "zod"
import { discriminatedUnionArray } from "@/lib/discriminatedUnion"
import { accordionSchema } from "../schemas/blocks/accordion"
import { activitiesCard } from "../schemas/blocks/activitiesCard"
import { accordionSchema } from "../schemas/blocks/faq"
import { HotelPageEnum } from "@/types/enums/hotelPage"
@@ -17,16 +17,10 @@ export const contentBlock = z.discriminatedUnion("__typename", [
contentBlockActivities,
])
export const hotelPageAccordion = z
.object({
__typename: z.literal(HotelPageEnum.ContentStack.blocks.Accordion),
})
.merge(accordionSchema)
export const hotelPageSchema = z.object({
hotel_page: z.object({
content: discriminatedUnionArray(contentBlock.options).nullable(),
faq: hotelPageAccordion,
faq: accordionSchema,
hotel_page_id: z.string(),
title: z.string(),
url: z.string(),

View File

@@ -0,0 +1,150 @@
import { z } from "zod"
import * as pageLinks from "@/server/routers/contentstack/schemas/pageLinks"
import { HotelPageEnum } from "@/types/enums/hotelPage"
export const faqSchema = z.array(
z.object({
answer: z.object({
json: z.any(),
embedded_itemsConnection: z.object({
edges: z.array(
z.object({
node: z
.discriminatedUnion("__typename", [
pageLinks.contentPageSchema,
pageLinks.hotelPageSchema,
pageLinks.loyaltyPageSchema,
])
.transform((data) => {
const link = pageLinks.transform(data)
if (link) {
return link
}
return data
}),
})
),
}),
}),
question: z.string(),
})
)
export type FAQtype = z.infer<typeof accordionSchema> // MOVE
enum AccordionEnum {
HotelPageFaqGlobalFaqConnection = "HotelPageFaqGlobalFaqConnection",
GlobalAccordion = "GlobalAccordion",
}
export const accordionSchema = z
.object({
__typename: z.enum([HotelPageEnum.ContentStack.blocks.Accordion]),
title: z.string().optional().default(""),
global_faqConnection: z
.object({
__typename: z.enum([AccordionEnum.HotelPageFaqGlobalFaqConnection]),
edges: z.array(
z.object({
node: z.object({
questions: faqSchema,
}),
})
),
})
.optional(),
specific_faq: z
.object({
__typename: z.enum([AccordionEnum.GlobalAccordion]),
questions: faqSchema,
})
.optional(),
})
.transform((data) => {
const array = []
array.push(
data.global_faqConnection?.edges.flatMap(({ node: faqConnection }) => {
return faqConnection.questions
}) || []
)
array.push(data.specific_faq?.questions || [])
return { ...data, faq: array.flat(2) }
})
const actualRefs = z.discriminatedUnion("__typename", [
pageLinks.accountPageRefSchema,
pageLinks.contentPageRefSchema,
pageLinks.hotelPageRefSchema,
pageLinks.loyaltyPageRefSchema,
])
export const accordionRefsSchema = z.object({
global_faqConnection: z
.object({
edges: z.array(
z.object({
node: z.object({
questions: z.array(
z.object({
answer: z.object({
embedded_itemsConnection: z.object({
edges: z.array(
z.object({
node: actualRefs,
})
),
}),
}),
})
),
}),
})
),
})
.optional(),
specific_faq: z
.object({
questions: z.array(
z.object({
answer: z.object({
embedded_itemsConnection: z.object({
edges: z.array(
z.object({
node: actualRefs,
})
),
}),
}),
})
),
})
.optional(),
/*.transform((data) => {
return data.faq.flatMap((faq) => {
switch (faq.__typename) {
case AccordionEnum.ContentPageBlocksAccordionBlockFaqGlobalFaq:
return (
faq.global_faq?.global_faqConnection.edges.flatMap(
({ node: faqConnection }) => {
return faqConnection.questions.flatMap((question) =>
question.answer.embedded_itemsConnection.edges.flatMap(
({ node }) => node.system
)
)
}
) || []
)
case AccordionEnum.ContentPageBlocksAccordionBlockFaqSpecificFaq:
return (
faq.specific_faq?.questions.flatMap((question) =>
question.answer.embedded_itemsConnection.edges.flatMap(
({ node }) => node.system
)
) || []
)
}
})
}),*/
})

View File

@@ -101,7 +101,7 @@ export const hotelQueryRouter = router({
.query(async ({ ctx, input }) => {
const { lang, uid } = ctx
const { include } = input
console.log("då")
const contentstackData = await getContentstackData(lang, uid)
console.log("då", contentstackData)
const hotelId = contentstackData?.hotel_page_id
@@ -232,6 +232,7 @@ export const hotelQueryRouter = router({
roomCategories,
activitiesCard: activities?.upcoming_activities_card,
facilities,
faq: contentstackData?.faq,
}
}),
availability: router({