Skip to content

Commit 0b72363

Browse files
committed
fix: apply field transforms to root fields
1 parent 0620b57 commit 0b72363

4 files changed

Lines changed: 47 additions & 20 deletions

File tree

packages/core/components/Puck/components/Preview/components/editor-page.tsx renamed to packages/core/components/Puck/components/Preview/components/edit-page.tsx

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { memo, useMemo } from "react";
1+
import { useMemo } from "react";
22
import { useShallow } from "zustand/react/shallow";
33

44
import { useAppStore } from "../../../../../store";
@@ -10,29 +10,46 @@ import { rootDroppableId } from "../../../../../lib/root-droppable-id";
1010
import {
1111
ComponentData,
1212
DefaultRootRenderProps,
13+
FieldTransforms,
1314
RootData,
1415
} from "../../../../../types";
1516

16-
import { useRichtextProps } from "../../../../RichTextEditor/lib/use-richtext-props";
1717
import { DropZoneEditPure, DropZonePure } from "../../../../DropZone";
18+
import { getInlineTextTransform } from "../../../../../lib/field-transforms/default-transforms/inline-text-transform";
19+
import { getRichTextTransform } from "../../../../../lib/field-transforms/default-transforms/rich-text-transform";
1820

1921
const slotFieldTransforms = getSlotTransform(DropZoneEditPure);
2022

2123
/**
22-
* Renders the puck data in the editor where this component is rendered as an editable page.
24+
* Renders the puck data as an editable page.
2325
*/
24-
const EditorPage = memo(() => {
26+
const EditPage = () => {
2527
// All the props, slot props are defaulted to null
2628
const flatRootProps = useAppStore(
2729
useShallow((s) => s.state.indexes.nodes.root?.flatData.props)
2830
);
2931
const config = useAppStore((s) => s.config);
3032
const metadata = useAppStore((s) => s.metadata);
3133
const userFieldTransforms = useAppStore((s) => s.fieldTransforms);
34+
const plugins = useAppStore((s) => s.plugins);
3235

3336
const combinedFieldTransforms = useMemo(
34-
() => ({ ...slotFieldTransforms, ...userFieldTransforms }),
35-
[userFieldTransforms]
37+
() => ({
38+
...slotFieldTransforms,
39+
...getInlineTextTransform(),
40+
...getRichTextTransform(),
41+
...plugins.reduce<FieldTransforms>((acc, plugin) => {
42+
if (!plugin.fieldTransforms) return acc;
43+
44+
Object.keys(plugin.fieldTransforms).forEach((key) => {
45+
acc[key as keyof typeof acc] = plugin.fieldTransforms![key];
46+
});
47+
48+
return acc;
49+
}, {}),
50+
...userFieldTransforms,
51+
}),
52+
[plugins, userFieldTransforms]
3653
);
3754

3855
// Root as object with slots still defaulted to null
@@ -67,24 +84,14 @@ const EditorPage = memo(() => {
6784
};
6885
}, [propsWithSlots, metadata]);
6986

70-
// Get the richtext props for the root render.
71-
const richtextProps = useRichtextProps(
72-
config.root?.fields ?? {},
73-
renderProps,
74-
userFieldTransforms
75-
);
76-
7787
return config.root?.render ? (
7888
config.root?.render({
7989
...renderProps,
80-
...richtextProps,
8190
id: "puck-root",
8291
})
8392
) : (
8493
<>{renderProps.children}</>
8594
);
86-
});
87-
88-
EditorPage.displayName = "EditorPage";
95+
};
8996

90-
export default EditorPage;
97+
export default EditPage;

packages/core/components/Puck/components/Preview/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { BubbledPointerEvent } from "../../../../lib/bubble-pointer-event";
77
import AutoFrame, { autoFrameContext } from "../../../AutoFrame";
88

99
import InteractivePage from "./components/interactive-page";
10-
import EditorPage from "./components/editor-page";
10+
import EditPage from "./components/edit-page";
1111
import styles from "./styles.module.css";
1212

1313
const getClassName = getClassNameFactory("PuckPreview", styles);
@@ -95,7 +95,7 @@ export const Preview = ({ id = "puck-preview" }: { id?: string }) => {
9595
useBubbleIframeEvents(ref);
9696
usePreviewModeAttribute(ref);
9797

98-
const inner = isEditMode ? <EditorPage /> : <InteractivePage />;
98+
const inner = isEditMode ? <EditPage /> : <InteractivePage />;
9999

100100
useEffect(() => {
101101
if (!iframe.enabled) {

packages/core/lib/data/resolve-and-replace-data.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ComponentData, ResolveDataTrigger, UiState } from "../../types";
44
import { getSelectorForId } from "../get-selector-for-id";
55

66
import { toComponent } from "./to-component";
7+
import { toRoot } from "./to-root";
78

89
/**
910
* Resolves the data of a component and replaces it in the appStore state.
@@ -27,6 +28,19 @@ export async function resolveAndReplaceData(
2728
);
2829
if (!resolvedResult.didChange && !writeThrough) return;
2930

31+
const isRoot =
32+
resolvedResult.node.type === "root" ||
33+
resolvedResult.node.props.id === "root";
34+
35+
if (isRoot) {
36+
getState().dispatch({
37+
type: "replaceRoot",
38+
root: toRoot(resolvedResult.node),
39+
ui,
40+
});
41+
return;
42+
}
43+
3044
const itemSelector = getSelectorForId(
3145
getState().state,
3246
resolvedResult.node.props.id

packages/core/lib/get-selector-for-id.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ export const getSelectorForId = (state: PrivateAppState, id: string) => {
55

66
if (!node) return;
77

8+
const isRoot = node.data.type === "root" || id === "root";
9+
10+
if (isRoot) {
11+
return;
12+
}
13+
814
const zoneCompound = `${node.parentId}:${node.zone}`;
915

1016
const index = state.indexes.zones[zoneCompound].contentIds.indexOf(id);

0 commit comments

Comments
 (0)