1+ import { useMemo } from 'react' ;
2+
13import type { Trigger } from '../types/trigger' ;
24import type { Workflow } from '../types/workflow' ;
35
@@ -6,23 +8,51 @@ import { useWorkflowState } from './useWorkflow';
68
79export 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