import { type SliceContent, isCompositeSliceContent, isSharedSliceContent, isSimpleSliceContent, } from "@prismicio/types-internal/lib/content" import { type StaticSlice, CompositeSlice as CompositeSliceDef, LegacySlice, SharedSlice as SharedSliceDef, } from "@prismicio/types-internal/lib/customtypes" import * as O from "fp-ts/lib/Option" import type { RenderContext } from "../../models" import { CompositeSlice, CompositeSliceType, GroupOrField, SharedSlice, SharedSliceType, Slice, } from "../../models/fetch" import type { SliceRenderer } from "../../models/Renderer" import CompositeSliceRenderer from "./CompositeSliceRenderer" import SharedSliceRenderer from "./SharedSliceRenderer" import SimpleSliceRenderer from "./SimpleSliceRenderer" const Fetch = { extractCompositeSlice(fetch: GroupOrField | Slice | undefined): CompositeSlice | undefined { if (fetch !== undefined && fetch.TYPE === CompositeSliceType) { return fetch } return undefined }, extractSharedSlice(fetch: GroupOrField | Slice | undefined): SharedSlice | undefined { if (fetch !== undefined && fetch.TYPE === SharedSliceType) { return fetch } return undefined }, extractGroupOrField(fetch: GroupOrField | Slice | undefined): GroupOrField | undefined { if (fetch !== undefined && fetch.TYPE !== CompositeSliceType && fetch.TYPE !== SharedSliceType) { return fetch } return undefined }, } const SliceWidgetRenderer: (ctx: RenderContext) => SliceRenderer = ( ctx, ) => ({ renderV1(content: SliceContent, fetch: Slice | GroupOrField | undefined): unknown { if (isCompositeSliceContent(content)) { return O.some(CompositeSliceRenderer(ctx).renderV1(content, Fetch.extractCompositeSlice(fetch))) } else if (isSharedSliceContent(content)) { return O.some(SharedSliceRenderer(ctx).renderV1(content, Fetch.extractSharedSlice(fetch))) } else { return SimpleSliceRenderer(ctx).renderV1(content, Fetch.extractGroupOrField(fetch)) } }, renderV2(def: StaticSlice, content: SliceContent, fetch: Slice | GroupOrField | undefined): unknown { if (isCompositeSliceContent(content) && CompositeSliceDef.is(def)) { return O.some(CompositeSliceRenderer(ctx).renderV2(def, content, Fetch.extractCompositeSlice(fetch))) } else if (isSharedSliceContent(content) && SharedSliceDef.is(def)) { return O.some(SharedSliceRenderer(ctx).renderV2(def, content, Fetch.extractSharedSlice(fetch))) } else if (isSimpleSliceContent(content) && LegacySlice.is(def)) { return SimpleSliceRenderer(ctx).renderV2(def, content, Fetch.extractGroupOrField(fetch)) } return O.some(this.renderDefault(def)) }, renderDefault(_def: StaticSlice): unknown { return {} }, renderMocks(def: StaticSlice, content: SliceContent): unknown { if (isCompositeSliceContent(content) && CompositeSliceDef.is(def)) { return O.some(CompositeSliceRenderer(ctx).renderMocks(def, content)) } else if (isSharedSliceContent(content) && SharedSliceDef.is(def)) { return O.some(SharedSliceRenderer(ctx).renderMocks(def, content)) } else if (isSimpleSliceContent(content) && LegacySlice.is(def)) { return SimpleSliceRenderer(ctx).renderMocks(def, content) } return O.some(this.renderDefault(def)) }, }) export default SliceWidgetRenderer