Created
November 17, 2024 16:07
-
-
Save imCorfitz/54d25397925aaf590bcb28cb2f453180 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Function to get preferred image size from a images data object delivered by Payload CMS. | |
interface ImageSizeData { | |
alt: string; | |
url?: string | null; | |
filename?: string | null; | |
mimeType?: string | null; | |
filesize?: number | null; | |
width?: number | null; | |
height?: number | null; | |
sizes?: { [key: string]: Omit<ImageSizeData, "alt" | "sizes"> }; | |
} | |
type SizeKeys<T> = T extends { sizes?: infer S } | |
? S extends null | undefined | |
? never | |
: keyof NonNullable<S> | |
: never; | |
export function getPreferredImageSize<T extends ImageSizeData>( | |
image: T, | |
preferredSize?: SizeKeys<T>, | |
): Omit<ImageSizeData, "sizes"> { | |
if (preferredSize && image.sizes && preferredSize in image.sizes) { | |
const preferredImage = image.sizes[preferredSize] as Omit<ImageSizeData, "alt" | "sizes">; | |
return { | |
alt: image.alt, | |
...preferredImage, | |
}; | |
} | |
return { | |
alt: image.alt, | |
url: image.url, | |
filename: image.filename, | |
mimeType: image.mimeType, | |
filesize: image.filesize, | |
width: image.width, | |
height: image.height, | |
}; | |
} | |
// ---------------------------------------------- | |
// Usage: Payload Types return the different | |
// image sizes, bringing typesafe image fetching. | |
// Note: getPreferredImageSize(avatar, size) | |
// -- this will know sizes available -- ^ | |
const createAvatarUrl = (avatar?: string | Avatar | null) => | |
avatar && typeof avatar === "object" | |
? (getPreferredImageSize(avatar, "large").url ?? undefined) | |
: undefined; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment