import type { LinkContent } from "@prismicio/types-internal/lib/content" import type { Link } from "@prismicio/types-internal/lib/customtypes" import type { AnyLinkDef, DocumentLinkDef, MediaLinkDef, WebLinkDef } from "../../../models" import { isAnyLinkDef, isDocumentLinkDef, isMediaLinkDef, isWebLinkDef, LinkRendererOptions, RenderContext, Renderer, } from "../../../models" import type { DocRelation } from "../../../models/fetch" import AnyLinkRenderer from "./AnyLinkRenderer" import DocumentLinkRenderer from "./DocumentLinkRenderer" import ExternalLinkRenderer from "./ExternalLinkRenderer" import FileLinkRenderer from "./FileLinkRenderer" import ImageLinkRenderer from "./ImageLinkRenderer" import MediaLinkRenderer from "./MediaLinkRenderer" const LinkRenderer: (ctx: RenderContext) => Renderer = (ctx) => ({ renderV1(link: LinkContent, fetch: DocRelation | undefined, options?: LinkRendererOptions): unknown { if (link.value.__TYPE__ === "ImageLink") { return ImageLinkRenderer(ctx).renderV1({ ...link, value: link.value }, undefined, options) } else if (link.value.__TYPE__ === "DocumentLink") { return DocumentLinkRenderer(ctx).renderV1({ ...link, value: link.value }, fetch, options) } else if (link.value.__TYPE__ === "FileLink") { return FileLinkRenderer(ctx).renderV1({ ...link, value: link.value }, undefined, options) } else if (link.value.__TYPE__ === "ExternalLink") { return ExternalLinkRenderer.renderV1({ ...link, value: link.value }, undefined, options) } else if (link.value.__TYPE__ === "MediaLink") { return MediaLinkRenderer.renderV1({ ...link, value: link.value }, undefined, options) } else if (link.value.__TYPE__ === "AnyLink") { return AnyLinkRenderer.renderV1({ ...link, value: link.value }, undefined, options) } else { throw new Error(`No rendered found for link ${JSON.stringify(link)}`) // normally unreachable } }, renderV2(def: Link, content: LinkContent, fetch: DocRelation | undefined, options?: LinkRendererOptions): unknown { if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "ImageLink") { return ImageLinkRenderer(ctx).renderV2( def.config as MediaLinkDef | AnyLinkDef, { ...content, value: content.value, }, undefined, options, ) } else if ((isDocumentLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "DocumentLink") { return DocumentLinkRenderer(ctx).renderV2( def.config as DocumentLinkDef | AnyLinkDef, { ...content, value: content.value }, fetch, options, ) } else if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "FileLink") { return FileLinkRenderer(ctx).renderV2( def.config as MediaLinkDef | AnyLinkDef, { ...content, value: content.value, }, undefined, options, ) } else if ((isWebLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "ExternalLink") { return ExternalLinkRenderer.renderV2( def.config as WebLinkDef | AnyLinkDef, { ...content, value: content.value }, undefined, options, ) } else if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "MediaLink") { return MediaLinkRenderer.renderV2( def.config as MediaLinkDef, { ...content, value: content.value }, undefined, options, ) } else if (isAnyLinkDef(def) && content.value.__TYPE__ === "AnyLink") { return AnyLinkRenderer.renderV2( def.config as AnyLinkDef, { ...content, value: content.value }, undefined, options, ) } else { return this.renderDefault(def) } }, renderDefault(def: Link): unknown { switch (def.config?.select) { case "media": return { link_type: "Media", } case "document": return { link_type: "Document", } case "web": return { link_type: "Web", } default: return { link_type: "Any", } } }, renderMocks(def: Link, content: LinkContent, options?: LinkRendererOptions): unknown { if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "ImageLink") { return ImageLinkRenderer(ctx).renderMocks( def.config as MediaLinkDef | AnyLinkDef, { ...content, value: content.value, }, options, ) } else if ((isDocumentLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "DocumentLink") { return DocumentLinkRenderer(ctx).renderMocks( def.config as DocumentLinkDef | AnyLinkDef, { ...content, value: content.value, }, options, ) } else if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "FileLink") { return FileLinkRenderer(ctx).renderMocks( def.config as MediaLinkDef | AnyLinkDef, { ...content, value: content.value, }, options, ) } else if ((isWebLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "ExternalLink") { return ExternalLinkRenderer.renderMocks( def.config as WebLinkDef | AnyLinkDef, { ...content, value: content.value, }, options, ) } else if ((isMediaLinkDef(def) || isAnyLinkDef(def)) && content.value.__TYPE__ === "MediaLink") { return MediaLinkRenderer.renderMocks(def.config as MediaLinkDef, { ...content, value: content.value }, options) } else if (isAnyLinkDef(def) && content.value.__TYPE__ === "AnyLink") { return AnyLinkRenderer.renderMocks(def.config as AnyLinkDef, { ...content, value: content.value }, options) } else { return this.renderDefault(def) } }, }) export default LinkRenderer export { DocumentLinkRenderer, ExternalLinkRenderer, FileLinkRenderer, ImageLinkRenderer }