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

@@ -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
)
) || []
)
}
})
}),*/
})