You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

store.ts 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useContext } from 'react'
  2. import {
  3. noop,
  4. } from 'lodash-es'
  5. import {
  6. useStore as useZustandStore,
  7. } from 'zustand'
  8. import { createStore } from 'zustand/vanilla'
  9. import { HooksStoreContext } from './provider'
  10. type CommonHooksFnMap = {
  11. doSyncWorkflowDraft: (
  12. notRefreshWhenSyncError?: boolean,
  13. callback?: {
  14. onSuccess?: () => void
  15. onError?: () => void
  16. onSettled?: () => void
  17. }
  18. ) => Promise<void>
  19. syncWorkflowDraftWhenPageClose: () => void
  20. handleBackupDraft: () => void
  21. handleLoadBackupDraft: () => void
  22. handleRestoreFromPublishedWorkflow: (...args: any[]) => void
  23. handleRun: (...args: any[]) => void
  24. handleStopRun: (...args: any[]) => void
  25. handleStartWorkflowRun: () => void
  26. handleWorkflowStartRunInWorkflow: () => void
  27. handleWorkflowStartRunInChatflow: () => void
  28. }
  29. export type Shape = {
  30. refreshAll: (props: Partial<CommonHooksFnMap>) => void
  31. } & CommonHooksFnMap
  32. export const createHooksStore = ({
  33. doSyncWorkflowDraft = async () => noop(),
  34. syncWorkflowDraftWhenPageClose = noop,
  35. handleBackupDraft = noop,
  36. handleLoadBackupDraft = noop,
  37. handleRestoreFromPublishedWorkflow = noop,
  38. handleRun = noop,
  39. handleStopRun = noop,
  40. handleStartWorkflowRun = noop,
  41. handleWorkflowStartRunInWorkflow = noop,
  42. handleWorkflowStartRunInChatflow = noop,
  43. }: Partial<Shape>) => {
  44. return createStore<Shape>(set => ({
  45. refreshAll: props => set(state => ({ ...state, ...props })),
  46. doSyncWorkflowDraft,
  47. syncWorkflowDraftWhenPageClose,
  48. handleBackupDraft,
  49. handleLoadBackupDraft,
  50. handleRestoreFromPublishedWorkflow,
  51. handleRun,
  52. handleStopRun,
  53. handleStartWorkflowRun,
  54. handleWorkflowStartRunInWorkflow,
  55. handleWorkflowStartRunInChatflow,
  56. }))
  57. }
  58. export function useHooksStore<T>(selector: (state: Shape) => T): T {
  59. const store = useContext(HooksStoreContext)
  60. if (!store)
  61. throw new Error('Missing HooksStoreContext.Provider in the tree')
  62. return useZustandStore(store, selector)
  63. }
  64. export const useHooksStoreApi = () => {
  65. return useContext(HooksStoreContext)!
  66. }