import type { ImageContent, ImageContentView } from "@prismicio/types-internal/lib/content" import type { Image } from "@prismicio/types-internal/lib/customtypes" import type { RenderContext, Renderer } from "../../models" import { ApiVersion } from "../../models" import { writeEmptyStringOrNull } from "../../utils" function renderImageContentView(imageContentView: ImageContentView, ctx: RenderContext, apiVersion: ApiVersion) { const contentV2 = apiVersion === "v2" ? { id: imageContentView.origin.id, edit: { x: imageContentView.edit.crop.x, y: imageContentView.edit.crop.y, zoom: imageContentView.edit.zoom, background: imageContentView.edit.background, }, } : {} return { dimensions: { width: imageContentView.width, height: imageContentView.height, }, alt: writeEmptyStringOrNull(imageContentView.alt, ctx.emptyStringInsteadOfNull), copyright: writeEmptyStringOrNull(imageContentView.credits, ctx.emptyStringInsteadOfNull), url: ctx.urlRewriter.rewriteImageUrl(imageContentView), ...contentV2, } } const ImageRenderer: (ctx: RenderContext) => Renderer = (ctx) => ({ renderV1(content: ImageContent): unknown { if (content.thumbnails) { const views = Object.entries(content.thumbnails).reduce((acc, [k, v]) => { return { ...acc, [k.toLowerCase()]: renderImageContentView(v, ctx, ApiVersion.v1), } }, {}) return { type: "Image", value: { main: renderImageContentView(content, ctx, ApiVersion.v1), views }, } } return { type: "Image", value: { main: renderImageContentView(content, ctx, ApiVersion.v1), views: {} }, } }, renderV2(_def: Image, content: ImageContent): unknown { const main = renderImageContentView(content, ctx, ApiVersion.v2) if (content.thumbnails) { const views = Object.entries(content.thumbnails).reduce((acc, [k, v]) => { return Object.assign(acc, { [k]: renderImageContentView(v, ctx, ApiVersion.v2) }) }, {}) return Object.assign(main, views) } return main }, renderDefault(def: Image): unknown { return (def.config?.thumbnails || []).reduce((acc, { name }) => { return { ...acc, [name]: {}, } }, {}) }, renderMocks(def: Image, content: ImageContent): unknown { return this.renderV2(def, content) }, }) export default ImageRenderer