feat: parseAcfMedia
This commit is contained in:
@@ -34,7 +34,7 @@ const classes = tvSectionHeroSplit({
|
|||||||
<section :class="classes.base()">
|
<section :class="classes.base()">
|
||||||
<div :class="classes.container()">
|
<div :class="classes.container()">
|
||||||
<UiProse :content="content" :class="classes.content()" />
|
<UiProse :content="content" :class="classes.content()" />
|
||||||
<AcfMedia :media="$props" :class="classes.media()" />
|
<AcfMedia :media="parseAcfMedia(props)" :class="classes.media()" />
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
29
wp-content/themes/moonshine/app/utils/acf-media.ts
Normal file
29
wp-content/themes/moonshine/app/utils/acf-media.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import type { AcfMediaFragment } from "#graphql/operations";
|
||||||
|
import * as z from "zod";
|
||||||
|
|
||||||
|
export const acfImageSchema = z.object({
|
||||||
|
src: z.url(),
|
||||||
|
alt: z.string(),
|
||||||
|
mediaDetails: z.object({
|
||||||
|
width: z.number(),
|
||||||
|
height: z.number(),
|
||||||
|
}),
|
||||||
|
objectPosition: z.string().optional().default("center"),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acfMediaSchema = z.object({
|
||||||
|
image: z.object({
|
||||||
|
node: acfImageSchema,
|
||||||
|
}),
|
||||||
|
aspectRatio: z.enum(["square", "video", "portrait", "auto"]).optional().default("auto"),
|
||||||
|
objectFit: z.enum(["cover", "contain"]).optional().default("cover"),
|
||||||
|
});
|
||||||
|
|
||||||
|
export function parseAcfMedia(data?: Partial<AcfMediaFragment>) {
|
||||||
|
try {
|
||||||
|
return acfMediaSchema.parse(data);
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user