Skip to content

Commit 6320715

Browse files
committed
WIP moving filtering into the state
1 parent 0ab3324 commit 6320715

File tree

5 files changed

+214
-128
lines changed

5 files changed

+214
-128
lines changed

apps/webapp/app/components/primitives/TreeView/TreeView.tsx

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { motion } from "framer-motion";
33
import { MutableRefObject, RefObject, useCallback, useEffect, useReducer, useRef } from "react";
44
import { cn } from "~/utils/cn";
55
import { NodeState, NodesState, reducer } from "./reducer";
6-
import { applyFilterToState, concreteStateFromInput, selectedIdFromState } from "./utils";
6+
import { concreteStateFromInput, selectedIdFromState } from "./utils";
77

88
export type TreeViewProps<TData> = {
99
tree: FlatTree<TData>;
@@ -128,6 +128,11 @@ export function TreeView<TData>({
128128
);
129129
}
130130

131+
export type Filter<TData> = {
132+
text?: string;
133+
fn: (text: string, node: FlatTreeItem<TData>) => boolean;
134+
};
135+
131136
type TreeStateHookProps<TData> = {
132137
tree: FlatTree<TData>;
133138
selectedId?: string;
@@ -139,7 +144,7 @@ type TreeStateHookProps<TData> = {
139144
index: number;
140145
}) => number;
141146
parentRef: RefObject<any>;
142-
filter?: (node: FlatTreeItem<TData>) => boolean;
147+
filter?: Filter<TData>;
143148
};
144149

145150
//this is so Framer Motion can be used to render the components
@@ -189,7 +194,7 @@ export function useTree<TData>({
189194

190195
const [state, dispatch] = useReducer(
191196
reducer,
192-
concreteStateFromInput({ tree, selectedId, collapsedIds })
197+
concreteStateFromInput({ tree, selectedId, collapsedIds, filter })
193198
);
194199

195200
useEffect(() => {
@@ -208,8 +213,8 @@ export function useTree<TData>({
208213
}, [previousNodeCount.current, tree.length]);
209214

210215
const virtualizer = useVirtualizer({
211-
count: tree.length,
212-
getItemKey: (index) => tree[index].id,
216+
count: state.visibleNodeIds.length,
217+
getItemKey: (index) => state.visibleNodeIds[index],
213218
getScrollElement: () => parentRef.current,
214219
estimateSize: (index: number) => {
215220
return estimatedRowHeight({
@@ -259,21 +264,21 @@ export function useTree<TData>({
259264

260265
const expandNode = useCallback(
261266
(id: string, scrollToNode = true) => {
262-
dispatch({ type: "EXPAND_NODE", payload: { id, tree, scrollToNode, scrollToNodeFn } });
267+
dispatch({ type: "EXPAND_NODE", payload: { id, scrollToNode, scrollToNodeFn } });
263268
},
264269
[state]
265270
);
266271

267272
const collapseNode = useCallback(
268273
(id: string) => {
269-
dispatch({ type: "COLLAPSE_NODE", payload: { id, tree } });
274+
dispatch({ type: "COLLAPSE_NODE", payload: { id } });
270275
},
271276
[state]
272277
);
273278

274279
const toggleExpandNode = useCallback(
275280
(id: string, scrollToNode = true) => {
276-
dispatch({ type: "TOGGLE_EXPAND_NODE", payload: { id, tree, scrollToNode, scrollToNodeFn } });
281+
dispatch({ type: "TOGGLE_EXPAND_NODE", payload: { id, scrollToNode, scrollToNodeFn } });
277282
},
278283
[state]
279284
);
@@ -282,7 +287,7 @@ export function useTree<TData>({
282287
(scrollToNode = true) => {
283288
dispatch({
284289
type: "SELECT_FIRST_VISIBLE_NODE",
285-
payload: { tree, scrollToNode, scrollToNodeFn },
290+
payload: { scrollToNode, scrollToNodeFn },
286291
});
287292
},
288293
[tree, state]
@@ -292,7 +297,7 @@ export function useTree<TData>({
292297
(scrollToNode = true) => {
293298
dispatch({
294299
type: "SELECT_LAST_VISIBLE_NODE",
295-
payload: { tree, scrollToNode, scrollToNodeFn },
300+
payload: { scrollToNode, scrollToNodeFn },
296301
});
297302
},
298303
[tree, state]
@@ -302,7 +307,7 @@ export function useTree<TData>({
302307
(scrollToNode = true) => {
303308
dispatch({
304309
type: "SELECT_NEXT_VISIBLE_NODE",
305-
payload: { tree, scrollToNode, scrollToNodeFn },
310+
payload: { scrollToNode, scrollToNodeFn },
306311
});
307312
},
308313
[state]
@@ -312,7 +317,7 @@ export function useTree<TData>({
312317
(scrollToNode = true) => {
313318
dispatch({
314319
type: "SELECT_PREVIOUS_VISIBLE_NODE",
315-
payload: { tree, scrollToNode, scrollToNodeFn },
320+
payload: { scrollToNode, scrollToNodeFn },
316321
});
317322
},
318323
[state]
@@ -322,43 +327,43 @@ export function useTree<TData>({
322327
(scrollToNode = true) => {
323328
dispatch({
324329
type: "SELECT_PARENT_NODE",
325-
payload: { tree, scrollToNode, scrollToNodeFn },
330+
payload: { scrollToNode, scrollToNodeFn },
326331
});
327332
},
328333
[state]
329334
);
330335

331336
const expandAllBelowDepth = useCallback(
332337
(depth: number) => {
333-
dispatch({ type: "EXPAND_ALL_BELOW_DEPTH", payload: { tree, depth } });
338+
dispatch({ type: "EXPAND_ALL_BELOW_DEPTH", payload: { depth } });
334339
},
335340
[state]
336341
);
337342

338343
const collapseAllBelowDepth = useCallback(
339344
(depth: number) => {
340-
dispatch({ type: "COLLAPSE_ALL_BELOW_DEPTH", payload: { tree, depth } });
345+
dispatch({ type: "COLLAPSE_ALL_BELOW_DEPTH", payload: { depth } });
341346
},
342347
[state]
343348
);
344349

345350
const expandLevel = useCallback(
346351
(level: number) => {
347-
dispatch({ type: "EXPAND_LEVEL", payload: { tree, level } });
352+
dispatch({ type: "EXPAND_LEVEL", payload: { level } });
348353
},
349354
[state]
350355
);
351356

352357
const collapseLevel = useCallback(
353358
(level: number) => {
354-
dispatch({ type: "COLLAPSE_LEVEL", payload: { tree, level } });
359+
dispatch({ type: "COLLAPSE_LEVEL", payload: { level } });
355360
},
356361
[state]
357362
);
358363

359364
const toggleExpandLevel = useCallback(
360365
(level: number) => {
361-
dispatch({ type: "TOGGLE_EXPAND_LEVEL", payload: { tree, level } });
366+
dispatch({ type: "TOGGLE_EXPAND_LEVEL", payload: { level } });
362367
},
363368
[state]
364369
);
@@ -470,7 +475,7 @@ export function useTree<TData>({
470475

471476
return {
472477
selected: selectedIdFromState(state.nodes),
473-
nodes: filter ? applyFilterToState(tree, state.nodes, filter) : state.nodes,
478+
nodes: state.nodes,
474479
getTreeProps,
475480
getNodeProps,
476481
selectNode,

0 commit comments

Comments
 (0)