Merged in feat/SW-217-teaser-card-new (pull request #607)

feat(SW-217): Create Teaser component

Approved-by: Erik Tiekstra
Approved-by: Matilda Landström
This commit is contained in:
Pontus Dreij
2024-09-27 08:33:57 +00:00
11 changed files with 199 additions and 60 deletions

View File

@@ -15,17 +15,10 @@ export const cardBlockSchema = z.object({
body_text: z.string().optional().default(""),
has_primary_button: z.boolean().default(false),
has_secondary_button: z.boolean().default(false),
has_sidepeek_button: z.boolean().optional().default(false),
heading: z.string().optional().default(""),
is_content_card: z.boolean().optional().default(false),
primary_button: buttonSchema,
scripted_top_title: z.string().optional(),
secondary_button: buttonSchema,
sidepeek_button: z
.object({
call_to_action_text: z.string().optional(),
})
.optional(),
system: systemSchema,
title: z.string().optional(),
})
@@ -36,23 +29,53 @@ export function transformCardBlock(card: typeof cardBlockSchema._type) {
backgroundImage: card.background_image,
body_text: card.body_text,
heading: card.heading,
isContentCard: card.is_content_card,
primaryButton: card.has_primary_button ? card.primary_button : undefined,
scripted_top_title: card.scripted_top_title,
secondaryButton: card.has_secondary_button
? card.secondary_button
: undefined,
sidePeekButton:
card.has_sidepeek_button && card.sidepeek_button?.call_to_action_text
? {
title: card.sidepeek_button.call_to_action_text,
}
: undefined,
system: card.system,
title: card.title,
}
}
export const teaserCardBlockSchema = z.object({
__typename: z.literal(CardsGridEnum.cards.TeaserCard),
heading: z.string().default(""),
body_text: z.string().default(""),
image: tempImageVaultAssetSchema,
primary_button: buttonSchema,
secondary_button: buttonSchema,
has_primary_button: z.boolean().default(false),
has_secondary_button: z.boolean().default(false),
has_sidepeek_button: z.boolean().default(false),
side_peek_button: z
.object({
title: z.string().optional().default(""),
})
.optional(),
system: systemSchema,
})
export function transformTeaserCardBlock(
card: typeof teaserCardBlockSchema._type
) {
return {
__typename: card.__typename,
body_text: card.body_text,
heading: card.heading,
primaryButton: card.has_primary_button ? card.primary_button : undefined,
secondaryButton: card.has_secondary_button
? card.secondary_button
: undefined,
sidePeekButton: card.has_sidepeek_button
? card.side_peek_button
: undefined,
image: card.image,
system: card.system,
}
}
const loyaltyCardBlockSchema = z.object({
__typename: z.literal(CardsGridEnum.cards.LoyaltyCard),
body_text: z.string().optional(),
@@ -77,6 +100,7 @@ export const cardsGridSchema = z.object({
node: z.discriminatedUnion("__typename", [
cardBlockSchema,
loyaltyCardBlockSchema,
teaserCardBlockSchema,
]),
})
),
@@ -95,6 +119,8 @@ export const cardsGridSchema = z.object({
cards: data.cardConnection.edges.map((card) => {
if (card.node.__typename === CardsGridEnum.cards.Card) {
return transformCardBlock(card.node)
} else if (card.node.__typename === CardsGridEnum.cards.TeaserCard) {
return transformTeaserCardBlock(card.node)
} else {
return {
__typename: card.node.__typename,
@@ -118,7 +144,11 @@ export const cardBlockRefsSchema = z.object({
system: systemSchema,
})
export function transformCardBlockRefs(card: typeof cardBlockRefsSchema._type) {
export function transformCardBlockRefs(
card:
| typeof cardBlockRefsSchema._type
| typeof teaserCardBlockRefsSchema._type
) {
const cards = [card.system]
if (card.primary_button) {
cards.push(card.primary_button)
@@ -135,6 +165,13 @@ const loyaltyCardBlockRefsSchema = z.object({
system: systemSchema,
})
export const teaserCardBlockRefsSchema = z.object({
__typename: z.literal(CardsGridEnum.cards.TeaserCard),
primary_button: linkConnectionRefsSchema,
secondary_button: linkConnectionRefsSchema,
system: systemSchema,
})
export const cardGridRefsSchema = z.object({
cards_grid: z
.object({
@@ -144,6 +181,7 @@ export const cardGridRefsSchema = z.object({
node: z.discriminatedUnion("__typename", [
cardBlockRefsSchema,
loyaltyCardBlockRefsSchema,
teaserCardBlockRefsSchema,
]),
})
),
@@ -152,7 +190,10 @@ export const cardGridRefsSchema = z.object({
.transform((data) => {
return data.cardConnection.edges
.map(({ node }) => {
if (node.__typename === CardsGridEnum.cards.Card) {
if (
node.__typename === CardsGridEnum.cards.Card ||
node.__typename === CardsGridEnum.cards.TeaserCard
) {
return transformCardBlockRefs(node)
} else {
const loyaltyCards = [node.system]