feat(SW-365): Added focal point to imagevault typings and to image component

This commit is contained in:
Erik Tiekstra
2024-10-15 15:54:39 +02:00
parent b33381d1b4
commit 59ffbef8fb
6 changed files with 56 additions and 9 deletions

View File

@@ -2,7 +2,10 @@
import NextImage from "next/image" import NextImage from "next/image"
import type { ImageLoaderProps, ImageProps } from "next/image" import type { ImageLoaderProps } from "next/image"
import type { CSSProperties } from "react"
import type { ImageProps } from "@/types/components/image"
function imageLoader({ quality, src, width }: ImageLoaderProps) { function imageLoader({ quality, src, width }: ImageLoaderProps) {
const hasQS = src.indexOf("?") !== -1 const hasQS = src.indexOf("?") !== -1
@@ -10,6 +13,14 @@ function imageLoader({ quality, src, width }: ImageLoaderProps) {
} }
// Next/Image adds & instead of ? before the params // Next/Image adds & instead of ? before the params
export default function Image(props: ImageProps) { export default function Image({ focalPoint, style, ...props }: ImageProps) {
return <NextImage {...props} loader={imageLoader} /> const styles: CSSProperties = focalPoint
? {
objectFit: "cover",
objectPosition: `${focalPoint.x}% ${focalPoint.y}%`,
...style,
}
: { ...style }
return <NextImage {...props} style={styles} loader={imageLoader} />
} }

View File

@@ -34,7 +34,7 @@ export default function Card({
imageWidth = imageWidth =
imageWidth || imageWidth ||
(backgroundImage && "dimensions" in backgroundImage (backgroundImage?.dimensions
? backgroundImage.dimensions.aspectRatio * imageHeight ? backgroundImage.dimensions.aspectRatio * imageHeight
: 420) : 420)

View File

@@ -11,6 +11,11 @@ const metaData = z.object({
Value: z.string().nullable(), Value: z.string().nullable(),
}) })
export const focalPointSchema = z.object({
x: z.number(),
y: z.number(),
})
/** /**
* Defines a media asset, original or conversion * Defines a media asset, original or conversion
*/ */
@@ -94,6 +99,7 @@ export const imageVaultAssetSchema = z.object({
* Name of the user that added the asset to ImageVault * Name of the user that added the asset to ImageVault
*/ */
AddedBy: z.string(), AddedBy: z.string(),
FocalPoint: focalPointSchema.optional(),
}) })
export const imageVaultAssetTransformedSchema = imageVaultAssetSchema.transform( export const imageVaultAssetTransformedSchema = imageVaultAssetSchema.transform(
@@ -124,6 +130,7 @@ export const imageVaultAssetTransformedSchema = imageVaultAssetSchema.transform(
height: mediaConversion.Height, height: mediaConversion.Height,
aspectRatio, aspectRatio,
}, },
focalPoint: rawData.FocalPoint || { x: 50, y: 50 },
} }
} }
) )

View File

@@ -1,9 +1,34 @@
export type ApiImage = { import type { ImageProps as NextImageProps } from "next/image"
import type { ImageVaultAsset } from "./imageVault"
export interface FocalPoint {
x: number
y: number
}
export interface Dimensions {
width: number
height: number
aspectRatio: number
}
export interface Meta {
alt: string | undefined | null
caption: string | undefined | null
}
export interface ApiImage {
id: string id: string
url: string url: string
title: string title: string
meta: { meta: Meta
alt: string dimensions?: Dimensions
caption: string focalPoint?: FocalPoint
}
} }
export interface ImageProps extends NextImageProps {
focalPoint?: FocalPoint
}
export type ImageType = ImageVaultAsset | ApiImage

View File

@@ -11,6 +11,8 @@ import { z } from "zod"
import { imageVaultAssetSchema } from "@/server/routers/contentstack/schemas/imageVault" import { imageVaultAssetSchema } from "@/server/routers/contentstack/schemas/imageVault"
import type { FocalPoint } from "./image"
export type ImageVaultAssetResponse = z.infer<typeof imageVaultAssetSchema> export type ImageVaultAssetResponse = z.infer<typeof imageVaultAssetSchema>
export type ImageVaultAsset = { export type ImageVaultAsset = {
@@ -23,4 +25,5 @@ export type ImageVaultAsset = {
aspectRatio: number aspectRatio: number
} }
meta: { alt: string | undefined | null; caption: string | undefined | null } meta: { alt: string | undefined | null; caption: string | undefined | null }
focalPoint: FocalPoint
} }

View File

@@ -33,6 +33,7 @@ export function insertResponseToImageVaultAsset(
height: mediaConversion.Height, height: mediaConversion.Height,
aspectRatio, aspectRatio,
}, },
focalPoint: response.FocalPoint || { x: 50, y: 50 },
} }
} }