fix: trpc endpoint for footer data

This commit is contained in:
Christel Westerberg
2024-05-30 14:25:11 +02:00
parent fbb29c93c9
commit 2c102c62e0
16 changed files with 154 additions and 90 deletions

View File

@@ -132,4 +132,111 @@ const validateHeaderRefConfigSchema = z.object({
}),
})
const validateAppDownload = z.object({
href: z.string(),
imageConnection: z.object({
edges: z.array(
z.object({
node: z.object({
description: z.string().optional().nullable(),
dimension: z.object({
height: z.number(),
width: z.number(),
}),
metadata: z.any().nullable(),
system: z.object({
uid: z.string(),
}),
title: z.string(),
url: z.string(),
}),
})
),
}),
})
export type HeaderRefDataRaw = z.infer<typeof validateHeaderRefConfigSchema>
const validateNavigationItem = z.object({
links: z.array(z.object({ href: z.string(), title: z.string() })),
title: z.string(),
})
export type NavigationItem = z.infer<typeof validateNavigationItem>
export const validateFooterConfigSchema = z.object({
all_current_footer: z.object({
items: z.array(
z.object({
title: z.string(),
about: z.object({
title: z.string(),
text: z.string(),
}),
app_downloads: z.object({
title: z.string(),
app_store: validateAppDownload,
google_play: validateAppDownload,
}),
logoConnection: z.object({
edges: z.array(
z.object({
node: z.object({
description: z.string().optional().nullable(),
dimension: z.object({
height: z.number(),
width: z.number(),
}),
metadata: z.any().nullable(),
system: z.object({
uid: z.string(),
}),
title: z.string(),
url: z.string(),
}),
})
),
}),
navigation: z.array(validateNavigationItem),
social_media: z.object({
title: z.string(),
facebook: z.object({ href: z.string(), title: z.string() }),
instagram: z.object({ href: z.string(), title: z.string() }),
twitter: z.object({ href: z.string(), title: z.string() }),
}),
trip_advisor: z.object({
title: z.string(),
logoConnection: z.object({
edges: z.array(
z.object({
node: z.object({
description: z.string().optional().nullable(),
dimension: z.object({
height: z.number(),
width: z.number(),
}),
metadata: z.any().nullable(),
system: z.object({
uid: z.string(),
}),
title: z.string(),
url: z.string(),
}),
})
),
}),
}),
})
),
}),
})
export type FooterDataRaw = z.infer<typeof validateFooterConfigSchema>
export type FooterData = Omit<
FooterDataRaw["all_current_footer"]["items"][0],
"logoConnection"
> & {
logo: Image
}

View File

@@ -1,4 +1,5 @@
import { GetContactConfig } from "@/lib/graphql/Query/ContactConfig.graphql"
import { GetCurrentFooter } from "@/lib/graphql/Query/CurrentFooter.graphql"
import {
GetCurrentHeader,
GetCurrentHeaderRef,
@@ -11,10 +12,12 @@ import { generateTag } from "@/utils/generateTag"
import {
type ContactConfigData,
FooterDataRaw,
HeaderData,
HeaderDataRaw,
HeaderRefDataRaw,
validateContactConfigSchema,
validateFooterConfigSchema,
validateHeaderConfigSchema,
} from "./output"
@@ -81,4 +84,25 @@ export const configQueryRouter = router({
logo,
} as HeaderData
}),
footer: contentstackProcedure.query(async ({ ctx }) => {
const response = await request<FooterDataRaw>(
GetCurrentFooter,
{
locale: ctx.lang,
},
{
next: { tags: [`footer-${ctx.lang}`] },
}
)
const validatedFooterConfig = validateFooterConfigSchema.safeParse(
response.data
)
if (!validatedFooterConfig.success) {
throw internalServerError(validatedFooterConfig.error)
}
return validatedFooterConfig.data.all_current_footer.items[0]
}),
})