Skip to content

Commit 281114d

Browse files
committed
wip: add parent to resolvers
1 parent 643c5bc commit 281114d

File tree

10 files changed

+75
-37
lines changed

10 files changed

+75
-37
lines changed

packages/core/components/DragDropContext/index.tsx

+1-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { PointerSensor } from "../../lib/dnd/PointerSensor";
2929
import { collisionStore } from "../../lib/dnd/collision/dynamic/store";
3030
import { generateId } from "../../lib/generate-id";
3131
import { createStore } from "zustand";
32-
import { usePathData } from "../../lib/use-path-data";
3332

3433
const DEBUG = false;
3534

@@ -104,7 +103,7 @@ const DragDropContextClient = ({
104103
children,
105104
disableAutoScroll,
106105
}: DragDropContextProps) => {
107-
const { state, config, dispatch, resolveData } = useAppContext();
106+
const { state, config, dispatch, resolveData, pathData } = useAppContext();
108107

109108
const id = useId();
110109

@@ -297,8 +296,6 @@ const DragDropContextClient = ({
297296

298297
const dragMode = useRef<"new" | "existing" | null>(null);
299298

300-
const { pathData, registerPath, unregisterPath } = usePathData(data);
301-
302299
const initialSelector = useRef<{ zone: string; index: number }>(undefined);
303300

304301
return (
@@ -550,9 +547,6 @@ const DragDropContextClient = ({
550547
mode: "edit",
551548
areaId: "root",
552549
depth: 0,
553-
registerPath,
554-
unregisterPath,
555-
pathData,
556550
path: [],
557551
}}
558552
>

packages/core/components/DraggableComponent/index.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ export const DraggableComponent = ({
126126
dispatch,
127127
iframe,
128128
state,
129+
registerPath,
130+
unregisterPath,
129131
} = useAppContext();
130132

131133
const ctx = useContext(dropZoneContext);
@@ -298,7 +300,7 @@ export const DraggableComponent = ({
298300
}, [ref.current]);
299301

300302
useEffect(() => {
301-
ctx?.registerPath!(
303+
registerPath!(
302304
id,
303305
{
304306
index,
@@ -308,7 +310,7 @@ export const DraggableComponent = ({
308310
);
309311

310312
return () => {
311-
ctx?.unregisterPath?.(id);
313+
unregisterPath?.(id);
312314
};
313315
}, [id, zoneCompound, index, componentType]);
314316

packages/core/components/DropZone/context.tsx

-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ export type DropZoneContext<UserConfig extends Config = Config> = {
3131
registerZone?: (zoneCompound: string) => void;
3232
unregisterZone?: (zoneCompound: string) => void;
3333
activeZones?: Record<string, boolean>;
34-
pathData?: PathData;
35-
registerPath?: (id: string, selector: ItemSelector, label: string) => void;
36-
unregisterPath?: (id: string) => void;
3734
mode?: "edit" | "render";
3835
depth: number;
3936
registerLocalZone?: (zone: string, active: boolean) => void; // A zone as it pertains to the current area

packages/core/components/LayerTree/index.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { getZoneId } from "../../lib/get-zone-id";
1212
import { isChildOfZone } from "../../lib/is-child-of-zone";
1313
import { getFrame } from "../../lib/get-frame";
1414
import { onScrollEnd } from "../../lib/on-scroll-end";
15+
import { useAppContext } from "../Puck/context";
1516

1617
const getClassName = getClassNameFactory("LayerTree", styles);
1718
const getClassNameLayer = getClassNameFactory("Layer", styles);
@@ -35,6 +36,7 @@ export const LayerTree = ({
3536
}) => {
3637
const zones = data.zones || {};
3738
const ctx = useContext(dropZoneContext);
39+
const appContext = useAppContext();
3840

3941
return (
4042
<>
@@ -67,7 +69,7 @@ export const LayerTree = ({
6769

6870
const isHovering = hoveringComponent === item.props.id;
6971

70-
const childIsSelected = isChildOfZone(item, selectedItem, ctx);
72+
const childIsSelected = isChildOfZone(item, selectedItem, appContext);
7173

7274
const componentConfig: ComponentConfig | undefined =
7375
config.components[item.type];

packages/core/components/Puck/context.tsx

+15-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
UserGenerics,
1818
} from "../../types";
1919
import { PuckAction } from "../../reducer";
20-
import { getItem } from "../../lib/get-item";
20+
import { getItem, ItemSelector } from "../../lib/get-item";
2121
import { PuckHistory } from "../../lib/use-puck-history";
2222
import { defaultViewports } from "../ViewportControls/default-viewports";
2323
import { Viewports } from "../../types";
@@ -27,6 +27,8 @@ import {
2727
useResolvedPermissions,
2828
} from "../../lib/use-resolved-permissions";
2929
import { useResolvedData } from "../../lib/use-resolved-data";
30+
import { usePathData } from "../../lib/use-path-data";
31+
import { PathData } from "../DropZone/context";
3032

3133
export const defaultAppState: AppState = {
3234
data: { content: [], root: {} },
@@ -83,6 +85,9 @@ export type AppContext<
8385
selectedItem?: G["UserData"]["content"][0];
8486
getPermissions: GetPermissions<UserConfig>;
8587
refreshPermissions: RefreshPermissions<UserConfig>;
88+
pathData?: PathData;
89+
registerPath?: (id: string, selector: ItemSelector, label: string) => void;
90+
unregisterPath?: (id: string) => void;
8691
};
8792

8893
export const defaultContext: AppContext = {
@@ -132,6 +137,10 @@ export const AppProvider = ({
132137

133138
const [status, setStatus] = useState<Status>("LOADING");
134139

140+
const { pathData, registerPath, unregisterPath } = usePathData(
141+
value.state.data
142+
);
143+
135144
// App is ready when client has loaded, after initial render
136145
// This triggers DropZones to activate
137146
useEffect(() => {
@@ -171,7 +180,8 @@ export const AppProvider = ({
171180
value.state,
172181
value.globalPermissions || {},
173182
setComponentLoading,
174-
unsetComponentLoading
183+
unsetComponentLoading,
184+
pathData
175185
);
176186

177187
const { resolveData } = useResolvedData(
@@ -197,6 +207,9 @@ export const AppProvider = ({
197207
componentState,
198208
setComponentState,
199209
resolveData,
210+
pathData,
211+
registerPath,
212+
unregisterPath,
200213
}}
201214
>
202215
{children}

packages/core/lib/is-child-of-zone.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { DropZoneContext } from "../components/DropZone/context";
2+
import { AppContext } from "../components/Puck/context";
23
import { Content } from "../types";
34
import { getItem } from "./get-item";
45
import { getZoneId } from "./get-zone-id";
56

67
export const isChildOfZone = (
78
item: Content[0],
89
maybeChild: Content[0] | null | undefined,
9-
ctx: DropZoneContext
10+
ctx: AppContext
1011
) => {
11-
const { data, pathData = {} } = ctx || {};
12+
const { state, pathData = {} } = ctx || {};
1213

13-
return maybeChild && data
14+
return maybeChild && state.data
1415
? !!pathData[maybeChild.props.id]?.path.find((zoneCompound) => {
1516
const [area] = getZoneId(zoneCompound);
1617

packages/core/lib/use-breadcrumbs.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@ export const useBreadcrumbs = (renderCount?: number) => {
8181
const {
8282
state: { data },
8383
selectedItem,
84+
pathData,
8485
} = useAppContext();
85-
const dzContext = useContext(dropZoneContext);
8686

8787
return useMemo<Breadcrumb[]>(() => {
8888
const breadcrumbs = convertPathDataToBreadcrumbs(
8989
selectedItem,
90-
dzContext?.pathData,
90+
pathData,
9191
data
9292
);
9393

@@ -96,5 +96,5 @@ export const useBreadcrumbs = (renderCount?: number) => {
9696
}
9797

9898
return breadcrumbs;
99-
}, [selectedItem, dzContext?.pathData, renderCount]);
99+
}, [selectedItem, pathData, renderCount]);
100100
};

packages/core/lib/use-parent.ts

+33-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
1-
import { useCallback, useContext } from "react";
1+
import { useCallback } from "react";
22
import { useAppContext } from "../components/Puck/context";
33
import { getItem, ItemSelector } from "./get-item";
4-
import { dropZoneContext } from "../components/DropZone";
54
import { convertPathDataToBreadcrumbs } from "./use-breadcrumbs";
65
import { PathData } from "../components/DropZone/context";
7-
import { Data } from "../types";
6+
import { ComponentData, Data } from "../types";
87

9-
export const getParent = (
10-
itemSelector: ItemSelector | null,
8+
export const getParentByItem = (
9+
item: ComponentData | undefined,
1110
pathData: PathData | undefined,
1211
data: Data
1312
) => {
14-
if (!itemSelector) return null;
15-
16-
const item = getItem(itemSelector, data);
1713
const breadcrumbs = convertPathDataToBreadcrumbs(item, pathData, data);
1814

1915
const lastItem = breadcrumbs[breadcrumbs.length - 1];
@@ -24,16 +20,40 @@ export const getParent = (
2420
return parent || null;
2521
};
2622

23+
export const getParent = (
24+
itemSelector: ItemSelector | null,
25+
pathData: PathData | undefined,
26+
data: Data
27+
) => {
28+
if (!itemSelector) return null;
29+
30+
const item = getItem(itemSelector, data);
31+
32+
return getParentByItem(item, pathData, data);
33+
};
34+
2735
export const useGetParent = () => {
28-
const { state } = useAppContext();
29-
const { pathData } = useContext(dropZoneContext) || {};
36+
const { state, pathData } = useAppContext();
37+
38+
return useCallback(
39+
(itemSelector: ItemSelector | null) =>
40+
getParent(itemSelector, pathData, state.data),
41+
[pathData, state.data]
42+
);
43+
};
44+
45+
export const useGetParentByItem = () => {
46+
const { state, pathData } = useAppContext();
3047

3148
return useCallback(
32-
() => getParent(state.ui.itemSelector, pathData, state.data),
33-
[state.ui.itemSelector, pathData, state.data]
49+
(item: ComponentData | undefined) =>
50+
getParentByItem(item, pathData, state.data),
51+
[pathData, state.data]
3452
);
3553
};
3654

3755
export const useParent = () => {
38-
return useGetParent()();
56+
const { state } = useAppContext();
57+
58+
return useGetParent()(state.ui.itemSelector);
3959
};

packages/core/lib/use-resolved-permissions.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import { useCallback, useEffect, useState } from "react";
22
import { flattenData } from "./flatten-data";
33
import { ComponentData, Config, Permissions, UserGenerics } from "../types";
44
import { getChanged } from "./get-changed";
5+
import {
6+
getParentByItem,
7+
useGetParent,
8+
useGetParentByItem,
9+
} from "./use-parent";
10+
import { PathData } from "../components/DropZone/context";
511

612
type PermissionsArgs<
713
UserConfig extends Config = Config,
@@ -42,7 +48,8 @@ export const useResolvedPermissions = <
4248
appState: G["UserAppState"],
4349
globalPermissions: Partial<Permissions>,
4450
setComponentLoading?: (id: string) => void,
45-
unsetComponentLoading?: (id: string) => void
51+
unsetComponentLoading?: (id: string) => void,
52+
pathData?: PathData
4653
) => {
4754
const [cache, setCache] = useState<Cache>({});
4855

@@ -78,6 +85,7 @@ export const useResolvedPermissions = <
7885
permissions: initialPermissions,
7986
appState,
8087
lastData: cache[item.props.id]?.lastData || null,
88+
parent: getParentByItem(item, pathData, appState.data),
8189
}
8290
);
8391

@@ -98,7 +106,7 @@ export const useResolvedPermissions = <
98106
}
99107
}
100108
},
101-
[config, globalPermissions, appState, cache]
109+
[config, globalPermissions, appState, cache, pathData]
102110
);
103111

104112
const resolveDataForRoot = (force = false) => {
@@ -149,7 +157,7 @@ export const useResolvedPermissions = <
149157
resolvePermissions();
150158

151159
// We only trigger this effect on appState.data to avoid triggering on all UI changes
152-
}, [config, appState.data]);
160+
}, [config, appState.data, pathData]);
153161

154162
const getPermissions: GetPermissions = useCallback(
155163
({ item, type, root } = {}) => {

packages/core/types/Config.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export type ComponentConfig<
5656
permissions: Partial<Permissions>;
5757
appState: AppState;
5858
lastData: DataShape | null;
59+
parent: ComponentData | null;
5960
}
6061
) => Promise<Partial<Permissions>> | Partial<Permissions>;
6162
};

0 commit comments

Comments
 (0)