import { useContext } from 'react' import { noop, } from 'lodash-es' import { useStore as useZustandStore, } from 'zustand' import { createStore } from 'zustand/vanilla' import { HooksStoreContext } from './provider' type CommonHooksFnMap = { doSyncWorkflowDraft: ( notRefreshWhenSyncError?: boolean, callback?: { onSuccess?: () => void onError?: () => void onSettled?: () => void } ) => Promise syncWorkflowDraftWhenPageClose: () => void handleRefreshWorkflowDraft: () => void handleBackupDraft: () => void handleLoadBackupDraft: () => void handleRestoreFromPublishedWorkflow: (...args: any[]) => void handleRun: (...args: any[]) => void handleStopRun: (...args: any[]) => void handleStartWorkflowRun: () => void handleWorkflowStartRunInWorkflow: () => void handleWorkflowStartRunInChatflow: () => void } export type Shape = { refreshAll: (props: Partial) => void } & CommonHooksFnMap export const createHooksStore = ({ doSyncWorkflowDraft = async () => noop(), syncWorkflowDraftWhenPageClose = noop, handleRefreshWorkflowDraft = noop, handleBackupDraft = noop, handleLoadBackupDraft = noop, handleRestoreFromPublishedWorkflow = noop, handleRun = noop, handleStopRun = noop, handleStartWorkflowRun = noop, handleWorkflowStartRunInWorkflow = noop, handleWorkflowStartRunInChatflow = noop, }: Partial) => { return createStore(set => ({ refreshAll: props => set(state => ({ ...state, ...props })), doSyncWorkflowDraft, syncWorkflowDraftWhenPageClose, handleRefreshWorkflowDraft, handleBackupDraft, handleLoadBackupDraft, handleRestoreFromPublishedWorkflow, handleRun, handleStopRun, handleStartWorkflowRun, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow, })) } export function useHooksStore(selector: (state: Shape) => T): T { const store = useContext(HooksStoreContext) if (!store) throw new Error('Missing HooksStoreContext.Provider in the tree') return useZustandStore(store, selector) } export const useHooksStoreApi = () => { return useContext(HooksStoreContext)! }