Skip to content

Commit 38a91ae

Browse files
committed
chore: use memoization
1 parent 43117f3 commit 38a91ae

File tree

1 file changed

+46
-16
lines changed

1 file changed

+46
-16
lines changed

assets/js/collaborative-editor/hooks/useUnsavedChanges.ts

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { useMemo } from 'react';
2+
13
import type { Trigger } from '../types/trigger';
24
import type { Workflow } from '../types/workflow';
35

@@ -6,23 +8,51 @@ import { useWorkflowState } from './useWorkflow';
68

79
export function useUnsavedChanges() {
810
const { workflow } = useSessionContext();
9-
const storeWorkflow = useWorkflowState(state => ({
10-
jobs: state.jobs,
11-
triggers: state.triggers,
12-
edges: state.edges,
13-
positions: state.positions || {},
14-
name: state.workflow?.name,
15-
concurrency: state.workflow?.concurrency,
16-
enable_job_logs: state.workflow?.enable_job_logs,
17-
}));
1811

19-
if (!workflow || !storeWorkflow) return { hasChanges: false };
20-
return {
21-
hasChanges: isDiffWorkflow(
22-
transformWorkflow(workflow),
23-
transformWorkflow(storeWorkflow as Workflow)
24-
),
25-
};
12+
// Individual selectors - stable references
13+
const jobs = useWorkflowState(state => state.jobs);
14+
const triggers = useWorkflowState(state => state.triggers);
15+
const edges = useWorkflowState(state => state.edges);
16+
const positions = useWorkflowState(state => state.positions);
17+
const name = useWorkflowState(state => state.workflow?.name);
18+
const concurrency = useWorkflowState(state => state.workflow?.concurrency);
19+
const enable_job_logs = useWorkflowState(
20+
state => state.workflow?.enable_job_logs
21+
);
22+
23+
// Memoize store workflow object to prevent recreating on every render
24+
const storeWorkflow = useMemo(
25+
() => ({
26+
jobs,
27+
triggers,
28+
edges,
29+
positions: positions || {},
30+
name,
31+
concurrency,
32+
enable_job_logs,
33+
}),
34+
[jobs, triggers, edges, positions, name, concurrency, enable_job_logs]
35+
);
36+
37+
// Memoize transformed base workflow (from session context)
38+
const transformedBaseWorkflow = useMemo(
39+
() => (workflow ? transformWorkflow(workflow) : null),
40+
[workflow]
41+
);
42+
43+
// Memoize transformed store workflow
44+
const transformedStoreWorkflow = useMemo(
45+
() => transformWorkflow(storeWorkflow as Workflow),
46+
[storeWorkflow]
47+
);
48+
49+
// Memoize comparison
50+
const hasChanges = useMemo(() => {
51+
if (!transformedBaseWorkflow) return false;
52+
return isDiffWorkflow(transformedBaseWorkflow, transformedStoreWorkflow);
53+
}, [transformedBaseWorkflow, transformedStoreWorkflow]);
54+
55+
return { hasChanges };
2656
}
2757

2858
// transform workflow to normalized structure for comparison

0 commit comments

Comments
 (0)