import type { CompositeSliceContent } from "@prismicio/types-internal/lib/content" import type { CompositeSlice as CompositeSliceDef } from "@prismicio/types-internal/lib/customtypes" import type { RenderContext } from "../../models" import { CompositeSlice, Group, GroupType } from "../../models/fetch" import type { SliceRenderer } from "../../models/Renderer" import { isEmpty } from "../../utils" import StaticWidgetRenderer from "../StaticWidgetRenderer" const CompositeSliceRenderer: ( ctx: RenderContext, ) => SliceRenderer = (ctx) => ({ renderV1(content: CompositeSliceContent, fetch: CompositeSlice | undefined): unknown { const repeatFetch = fetch?.repeat?.fields const nonRepeatFetch = fetch?.nonRepeat?.fields const itemsValue = content.repeat.flatMap((groupItem) => { const rendered = StaticWidgetRenderer(ctx).renderV1Object(groupItem.value, repeatFetch) if (isEmpty(rendered)) { return [] } return [rendered] }) const primaryValue = StaticWidgetRenderer(ctx).renderV1Object(content.nonRepeat, nonRepeatFetch) return { "non-repeat": primaryValue, repeat: itemsValue, } }, renderV2(def: CompositeSliceDef, content: CompositeSliceContent, fetch: CompositeSlice | undefined): unknown { const repeatFetch: Group | undefined = fetch === undefined ? undefined : { TYPE: GroupType, name: def.type, //doesn't really matter fields: fetch.repeat.fields, } const nonRepeatFetch = fetch?.nonRepeat?.fields const itemsValue = (() => { return content.repeat.map((items) => { return StaticWidgetRenderer(ctx).renderV2Object( items.value, repeatFetch?.fields, def.repeat || {}, { withFetch: "default", }, { default: "render", withFetch: "filter", withFetchField: "render", }, ) }) })() const primaryValue = (() => { return StaticWidgetRenderer(ctx).renderV2Object( content.nonRepeat, nonRepeatFetch, def["non-repeat"] || {}, { withFetch: "default", }, { default: "render", withFetch: "filter", withFetchField: "render", }, ) })() return { primary: primaryValue, items: itemsValue, } }, renderDefault(_def: CompositeSliceDef): unknown { return {} }, renderMocks(def: CompositeSliceDef, content: CompositeSliceContent): unknown { const itemsValue = content.repeat.map((items) => { return StaticWidgetRenderer(ctx).renderMocksObject(items.value, def.repeat || {}) }) const primaryValue = StaticWidgetRenderer(ctx).renderMocksObject(content.nonRepeat, def["non-repeat"] || {}) return { primary: primaryValue, items: itemsValue, } }, }) export default CompositeSliceRenderer