import type { SharedSliceContent } from "@prismicio/types-internal/lib/content" import type { SharedSlice as SharedSliceDef, Variation } from "@prismicio/types-internal/lib/customtypes" import type { RenderContext } from "../../models" import type { GroupOrField, SharedSlice } from "../../models/fetch" import type { SliceRenderer } from "../../models/Renderer" import StaticWidgetRenderer from "../StaticWidgetRenderer" function getFetchField( variation: string, part: Part, fetch: SharedSlice | undefined, ): Record | undefined { return fetch?.variations?.[variation]?.[part]?.fields as Record | undefined } const SharedSliceRenderer: (ctx: RenderContext) => SliceRenderer = ( ctx, ) => ({ renderV1(content: SharedSliceContent, fetch: SharedSlice | undefined): unknown { const itemsValue = content.items.map((groupItem) => { return StaticWidgetRenderer(ctx).renderV1Object( groupItem.value, getFetchField(content.variation, "repeat", fetch), ) }) const primaryValue = StaticWidgetRenderer(ctx).renderV1Object( content.primary, getFetchField(content.variation, "nonRepeat", fetch), ) return { variation: content.variation, items: itemsValue, primary: primaryValue, } }, renderV2(def: SharedSliceDef, content: SharedSliceContent, fetch: SharedSlice | undefined): unknown { const variation = def.variations.find((variation: Variation) => variation.id === content.variation) if (variation === undefined) { return this.renderDefault(def) } const itemsValue = content.items.map((groupItem) => { return StaticWidgetRenderer(ctx).renderV2Object( groupItem.value, getFetchField(content.variation, "repeat", fetch), variation.items || {}, { withFetch: "filter", }, { default: "default", withFetch: "filter", withFetchField: "render", }, ) }) const primaryValue = StaticWidgetRenderer(ctx).renderV2Object( content.primary, getFetchField(content.variation, "nonRepeat", fetch), variation.primary || {}, { withFetch: "filter", }, { default: "default", withFetch: "filter", withFetchField: "render", }, ) return { variation: content.variation, version: variation.version, items: itemsValue, primary: primaryValue, } }, renderDefault(_def: SharedSliceDef): unknown { return {} }, renderMocks(def: SharedSliceDef, content: SharedSliceContent): unknown { const variation = def.variations.find((variation: Variation) => variation.id === content.variation) if (variation === undefined) { return this.renderDefault(def) } const itemsValue = content.items.map((groupItem) => { return StaticWidgetRenderer(ctx).renderMocksObject(groupItem.value, variation.items || {}) }) const primaryValue = StaticWidgetRenderer(ctx).renderMocksObject(content.primary, variation.primary || {}) return { variation: content.variation, version: variation.version, items: itemsValue, primary: primaryValue, } }, }) export default SharedSliceRenderer