| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | import { type ReactNode, createContext, useContext, useMemo, useState } from 'react'import { type StoreApi, create } from 'zustand'import { type TemporalState, temporal } from 'zundo'import isDeepEqual from 'fast-deep-equal'import type { Edge, Node } from './types'import type { WorkflowHistoryEvent } from './hooks'export const WorkflowHistoryStoreContext = createContext<WorkflowHistoryStoreContextType>({ store: null, shortcutsEnabled: true, setShortcutsEnabled: () => {} })export const Provider = WorkflowHistoryStoreContext.Providerexport function WorkflowHistoryProvider({  nodes,  edges,  children,}: WorkflowWithHistoryProviderProps) {  const [shortcutsEnabled, setShortcutsEnabled] = useState(true)  const [store] = useState(() =>    createStore({      nodes,      edges,    }),  )  const contextValue = {    store,    shortcutsEnabled,    setShortcutsEnabled,  }  return (    <Provider value={contextValue}>      {children}    </Provider>  )}export function useWorkflowHistoryStore() {  const {    store,    shortcutsEnabled,    setShortcutsEnabled,  } = useContext(WorkflowHistoryStoreContext)  if (store === null)    throw new Error('useWorkflowHistoryStoreApi must be used within a WorkflowHistoryProvider')  return {    store: useMemo(      () => ({        getState: store.getState,        setState: (state: WorkflowHistoryState) => {          store.setState({            workflowHistoryEvent: state.workflowHistoryEvent,            nodes: state.nodes.map((node: Node) => ({ ...node, data: { ...node.data, selected: false } })),            edges: state.edges.map((edge: Edge) => ({ ...edge, selected: false }) as Edge),          })        },        subscribe: store.subscribe,        temporal: store.temporal,      }),      [store],    ),    shortcutsEnabled,    setShortcutsEnabled,  }}function createStore({  nodes: storeNodes,  edges: storeEdges,}: {  nodes: Node[]  edges: Edge[]}): WorkflowHistoryStoreApi {  const store = create(temporal<WorkflowHistoryState>(    (set, get) => {      return {        workflowHistoryEvent: undefined,        nodes: storeNodes,        edges: storeEdges,        getNodes: () => get().nodes,        setNodes: (nodes: Node[]) => set({ nodes }),        setEdges: (edges: Edge[]) => set({ edges }),      }    },    {      equality: (pastState, currentState) =>        isDeepEqual(pastState, currentState),    },  ),  )  return store}export type WorkflowHistoryStore = {  nodes: Node[]  edges: Edge[]  workflowHistoryEvent: WorkflowHistoryEvent | undefined}export type WorkflowHistoryActions = {  setNodes?: (nodes: Node[]) => void  setEdges?: (edges: Edge[]) => void}export type WorkflowHistoryState = WorkflowHistoryStore & WorkflowHistoryActionstype WorkflowHistoryStoreContextType = {  store: ReturnType<typeof createStore> | null  shortcutsEnabled: boolean  setShortcutsEnabled: (enabled: boolean) => void}export type WorkflowHistoryStoreApi = StoreApi<WorkflowHistoryState> & { temporal: StoreApi<TemporalState<WorkflowHistoryState>> }export type WorkflowWithHistoryProviderProps = {  nodes: Node[]  edges: Edge[]  children: ReactNode}
 |