@mic-rexjs/usecases-react 4.0.0-beta.0 → 4.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.LICENSE.txt +2 -0
  3. package/es/components/UseCaseFragment/index.js +2 -2
  4. package/es/enums/Statuses/index.d.ts +86 -10
  5. package/es/enums/Statuses/index.js +86 -10
  6. package/es/hooks/useAlternateStatuses/index.d.ts +2 -0
  7. package/es/hooks/useAlternateStatuses/index.js +16 -0
  8. package/es/hooks/useChanged/index.d.ts +2 -0
  9. package/es/hooks/useChanged/index.js +17 -0
  10. package/es/hooks/useChanged/types.d.ts +3 -0
  11. package/es/hooks/useContext/index.d.ts +3 -4
  12. package/es/hooks/useContext/index.js +17 -15
  13. package/es/hooks/useContext/index.test.js +13 -24
  14. package/es/hooks/useContextValue/index.d.ts +3 -4
  15. package/es/hooks/useContextValue/index.js +9 -16
  16. package/es/hooks/useDepsKey/index.js +11 -9
  17. package/es/hooks/useEntity/index.d.ts +3 -2
  18. package/es/hooks/useEntity/index.js +62 -59
  19. package/es/hooks/useEntityReturn/index.d.ts +5 -0
  20. package/es/hooks/useEntityReturn/index.js +15 -0
  21. package/es/hooks/useEntityReturn/types.d.ts +7 -0
  22. package/es/hooks/useEntityRootExec/index.d.ts +5 -0
  23. package/es/hooks/useEntityRootExec/index.js +7 -0
  24. package/es/hooks/useEntityRootExec/types.d.ts +7 -0
  25. package/es/hooks/useEntityRootReturn/index.d.ts +5 -0
  26. package/es/hooks/useEntityRootReturn/index.js +14 -0
  27. package/es/hooks/useEntityRootReturn/types.d.ts +7 -0
  28. package/es/hooks/useEntityRootReturn/types.js +1 -0
  29. package/es/hooks/useExec/index.d.ts +2 -3
  30. package/es/hooks/useExec/index.js +3 -25
  31. package/es/hooks/useExec/types.d.ts +7 -2
  32. package/es/hooks/useFullArguments/index.d.ts +2 -3
  33. package/es/hooks/useFullArguments/index.js +4 -6
  34. package/es/hooks/useIfExec/index.d.ts +2 -0
  35. package/es/hooks/useIfExec/index.js +20 -0
  36. package/es/hooks/useIfExec/types.d.ts +6 -0
  37. package/es/hooks/useIfExec/types.js +1 -0
  38. package/es/hooks/useIfReturn/index.d.ts +2 -0
  39. package/es/hooks/useIfReturn/index.js +22 -0
  40. package/es/hooks/useIfReturn/types.d.ts +6 -0
  41. package/es/hooks/useIfReturn/types.js +1 -0
  42. package/es/hooks/useProvider/index.d.ts +3 -3
  43. package/es/hooks/useProvider/index.js +15 -13
  44. package/es/hooks/useProviders/index.js +4 -4
  45. package/es/hooks/useReducers/index.d.ts +5 -4
  46. package/es/hooks/useReducers/index.js +47 -10
  47. package/es/hooks/useReturn/index.d.ts +2 -0
  48. package/es/hooks/useReturn/index.js +33 -0
  49. package/es/hooks/useReturn/types.d.ts +11 -0
  50. package/es/hooks/useReturn/types.js +1 -0
  51. package/es/hooks/useRootInitializing/index.d.ts +2 -0
  52. package/es/hooks/useRootInitializing/index.js +14 -0
  53. package/es/hooks/useRootReturn/index.d.ts +5 -0
  54. package/es/hooks/useRootReturn/index.js +22 -0
  55. package/es/hooks/useRootReturn/types.d.ts +14 -0
  56. package/es/hooks/useRootReturn/types.js +1 -0
  57. package/es/hooks/useStatuses/index.d.ts +4 -4
  58. package/es/hooks/useStatuses/index.js +46 -21
  59. package/es/hooks/useStore/index.d.ts +3 -3
  60. package/es/hooks/useStore/index.js +24 -47
  61. package/es/hooks/useThrottleUpdate/index.d.ts +2 -0
  62. package/es/hooks/useThrottleUpdate/index.js +31 -0
  63. package/es/hooks/useThrottleUpdate/types.d.ts +3 -0
  64. package/es/hooks/useThrottleUpdate/types.js +1 -0
  65. package/es/hooks/useUseCase/index.js +18 -27
  66. package/es/hooks/useUseCase/index.test.js +415 -236
  67. package/es/hooks/useUseCase/types.d.ts +13 -2
  68. package/es/types.d.ts +2 -1
  69. package/es/usecases/contextUseCase/index.js +21 -38
  70. package/es/usecases/contextUseCase/types.d.ts +6 -9
  71. package/es/usecases/lifecycleEventUseCase/index.js +37 -9
  72. package/es/usecases/lifecycleEventUseCase/types.d.ts +11 -8
  73. package/lib/components/UseCaseFragment/index.js +2 -2
  74. package/lib/enums/Statuses/index.js +86 -10
  75. package/lib/hooks/useAlternateStatuses/index.js +22 -0
  76. package/lib/hooks/useChanged/index.js +23 -0
  77. package/lib/hooks/useContext/index.js +19 -17
  78. package/lib/hooks/useContext/index.test.js +13 -24
  79. package/lib/hooks/useContextValue/index.js +8 -15
  80. package/lib/hooks/useDepsKey/index.js +10 -8
  81. package/lib/hooks/useEntity/index.js +93 -62
  82. package/lib/hooks/useEntityReturn/index.js +22 -0
  83. package/lib/hooks/useEntityRootExec/index.js +13 -0
  84. package/lib/hooks/useEntityRootReturn/index.js +21 -0
  85. package/lib/hooks/useEntityRootReturn/types.js +5 -0
  86. package/lib/hooks/useExec/index.js +3 -25
  87. package/lib/hooks/useFullArguments/index.js +4 -6
  88. package/lib/hooks/useIfExec/index.js +27 -0
  89. package/lib/hooks/useIfExec/types.js +5 -0
  90. package/lib/hooks/useIfReturn/index.js +29 -0
  91. package/lib/hooks/useIfReturn/types.js +5 -0
  92. package/lib/hooks/useProvider/index.js +15 -13
  93. package/lib/hooks/useProviders/index.js +3 -3
  94. package/lib/hooks/useReducers/index.js +50 -10
  95. package/lib/hooks/useReturn/index.js +40 -0
  96. package/lib/hooks/useReturn/types.js +5 -0
  97. package/lib/hooks/useRootInitializing/index.js +20 -0
  98. package/lib/hooks/useRootReturn/index.js +30 -0
  99. package/lib/hooks/useRootReturn/types.js +5 -0
  100. package/lib/hooks/useStatuses/index.js +47 -21
  101. package/lib/hooks/useStore/index.js +22 -46
  102. package/lib/hooks/useThrottleUpdate/index.js +37 -0
  103. package/lib/hooks/useThrottleUpdate/types.js +5 -0
  104. package/lib/hooks/useUseCase/index.js +18 -27
  105. package/lib/hooks/useUseCase/index.test.js +458 -280
  106. package/lib/usecases/contextUseCase/index.js +21 -38
  107. package/lib/usecases/lifecycleEventUseCase/index.js +48 -8
  108. package/package.json +1 -1
  109. package/es/classes/OptionsSet/index.d.ts +0 -6
  110. package/es/classes/OptionsSet/index.js +0 -44
  111. package/es/classes/OptionsSet/types.d.ts +0 -8
  112. package/es/enums/ArgumentTypes/index.d.ts +0 -4
  113. package/es/enums/ArgumentTypes/index.js +0 -5
  114. package/es/hooks/useArgumentTypes/index.d.ts +0 -3
  115. package/es/hooks/useArgumentTypes/index.js +0 -14
  116. package/es/hooks/useConstantEntityReducers/index.d.ts +0 -3
  117. package/es/hooks/useConstantEntityReducers/index.js +0 -7
  118. package/es/hooks/useConstantFn/index.d.ts +0 -1
  119. package/es/hooks/useConstantFn/index.js +0 -10
  120. package/es/hooks/useConstantReducers/index.d.ts +0 -3
  121. package/es/hooks/useConstantReducers/index.js +0 -6
  122. package/es/hooks/useContextualItem/index.d.ts +0 -4
  123. package/es/hooks/useContextualItem/index.js +0 -11
  124. package/es/hooks/useEntityInitializing/index.d.ts +0 -2
  125. package/es/hooks/useEntityInitializing/index.js +0 -16
  126. package/es/hooks/useOptions/index.d.ts +0 -5
  127. package/es/hooks/useOptions/index.js +0 -54
  128. package/es/hooks/useOptions/types.d.ts +0 -5
  129. package/es/hooks/useOptionsSet/index.d.ts +0 -5
  130. package/es/hooks/useOptionsSet/index.js +0 -16
  131. package/es/hooks/useRootCreation/index.d.ts +0 -4
  132. package/es/hooks/useRootCreation/index.js +0 -20
  133. package/es/hooks/useRootCreation/types.d.ts +0 -3
  134. package/lib/classes/OptionsSet/index.js +0 -94
  135. package/lib/enums/ArgumentTypes/index.js +0 -11
  136. package/lib/hooks/useArgumentTypes/index.js +0 -22
  137. package/lib/hooks/useConstantEntityReducers/index.js +0 -13
  138. package/lib/hooks/useConstantFn/index.js +0 -17
  139. package/lib/hooks/useConstantReducers/index.js +0 -12
  140. package/lib/hooks/useContextualItem/index.js +0 -17
  141. package/lib/hooks/useEntityInitializing/index.js +0 -22
  142. package/lib/hooks/useOptions/index.js +0 -61
  143. package/lib/hooks/useOptionsSet/index.js +0 -22
  144. package/lib/hooks/useRootCreation/index.js +0 -26
  145. /package/es/{classes/OptionsSet → hooks/useChanged}/types.js +0 -0
  146. /package/es/hooks/{useOptions → useEntityReturn}/types.js +0 -0
  147. /package/es/hooks/{useRootCreation → useEntityRootExec}/types.js +0 -0
  148. /package/lib/{classes/OptionsSet → hooks/useChanged}/types.js +0 -0
  149. /package/lib/hooks/{useOptions → useEntityReturn}/types.js +0 -0
  150. /package/lib/hooks/{useRootCreation → useEntityRootExec}/types.js +0 -0
@@ -1,46 +1,40 @@
1
1
  import { useConstant } from '../useConstant';
2
- import { useConstantReducers } from '../useConstantReducers';
3
- import { useEntityInitializing } from '../useEntityInitializing';
4
- import { useExec } from '../useExec';
5
- import { utilsUseCase } from '@mic-rexjs/usecases';
6
- import { useLatest, useMemoizedFn, useUnmount, useUpdate, useUpdateEffect } from 'ahooks';
2
+ import { useEntityReturn } from '../useEntityReturn';
3
+ import { useEntityRootExec } from '../useEntityRootExec';
4
+ import { useThrottleUpdate } from '../useThrottleUpdate';
5
+ import { useLatest, useMemoizedFn, useUpdateEffect } from 'ahooks';
7
6
  import { useRef } from 'react';
8
7
  import { Statuses } from '../../enums/Statuses';
9
8
  import { triggerWatchers } from '../../methods/triggerWatchers';
10
9
  import { lifecycleEventUseCase } from '../../usecases/lifecycleEventUseCase';
11
- export const useEntity = (store, statuses, hookOptions) => {
10
+ export const useEntity = (store,
11
+ // 强制传入 `reducers` 参数,目的是让该 `hook` 一定在 `useReducers` 之后执行
12
+ reducers, statuses, options) => {
12
13
  const entity = store.value;
13
- const update = useUpdate();
14
- const isInitializing = useEntityInitializing(statuses);
15
- const hookOptionsRef = useLatest(hookOptions);
14
+ const update = useThrottleUpdate();
15
+ const optionsRef = useLatest(options);
16
16
  const prevEntityRef = useRef(entity);
17
- const entityEnabled = (statuses & Statuses.EntityEnabled) === Statuses.EntityEnabled;
18
- const entityRootEnabled = (statuses & Statuses.EntityRootEnabled) === Statuses.EntityRootEnabled;
19
- const _useConstantReducers = useConstantReducers(() => {
20
- return lifecycleEventUseCase();
21
- }),
22
- bindLifecycleEventsKey = _useConstantReducers.bindLifecycleEventsKey,
23
- getLifecycleEvents = _useConstantReducers.getLifecycleEvents,
24
- deleteLifecycleEvents = _useConstantReducers.deleteLifecycleEvents;
17
+ const hasEntity = (statuses & Statuses.Entity) === Statuses.Entity;
18
+ const lifecycleReducers = useConstant(lifecycleEventUseCase);
19
+ const createLifecycleKey = lifecycleReducers.createLifecycleKey,
20
+ bindLifecycleEventsKey = lifecycleReducers.bindLifecycleEventsKey,
21
+ getLifecycleEvents = lifecycleReducers.getLifecycleEvents,
22
+ deleteLifecycleEvents = lifecycleReducers.deleteLifecycleEvents;
25
23
  const lifecycleKey = useConstant(() => {
26
- const _utilsUseCase = utilsUseCase(),
27
- createKey = _utilsUseCase.createKey;
28
- return createKey();
24
+ return createLifecycleKey();
29
25
  });
30
26
  const onTriggerWatchers = useMemoizedFn((newEntity, oldEntity) => {
31
- const watch = hookOptionsRef.current.watch;
27
+ const watch = optionsRef.current.watch;
32
28
  if (!watch) {
33
29
  return;
34
30
  }
35
31
  triggerWatchers(watch, newEntity, oldEntity);
36
32
  });
37
- const onEntityUpdate = useMemoizedFn(function () {
38
- let newEntity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : entity;
39
- let oldEntity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : prevEntityRef.current;
40
- if (!entityEnabled) {
33
+ const onEntityUpdate = useMemoizedFn(newEntity => {
34
+ const prevEntity = prevEntityRef.current;
35
+ if (!hasEntity) {
41
36
  return;
42
37
  }
43
- const prevEntity = prevEntityRef.current;
44
38
  if (prevEntity === newEntity) {
45
39
  return;
46
40
  }
@@ -49,46 +43,54 @@ export const useEntity = (store, statuses, hookOptions) => {
49
43
  onAdopt = _getLifecycleEvents.onAdopt,
50
44
  onDiscard = _getLifecycleEvents.onDiscard;
51
45
  prevEntityRef.current = newEntity;
52
- onTriggerWatchers(newEntity, oldEntity);
53
- onDiscard === null || onDiscard === void 0 || onDiscard(oldEntity);
54
- onAdopt === null || onAdopt === void 0 || onAdopt(newEntity, oldEntity);
55
- onUpdate === null || onUpdate === void 0 || onUpdate(newEntity, oldEntity);
46
+ onTriggerWatchers(newEntity, prevEntity);
47
+ onDiscard === null || onDiscard === void 0 || onDiscard(prevEntity);
48
+ onAdopt === null || onAdopt === void 0 || onAdopt(newEntity, prevEntity);
49
+ onUpdate === null || onUpdate === void 0 || onUpdate(newEntity, prevEntity);
56
50
  });
57
- const onEntityChange = useMemoizedFn((newEntity, oldEntity) => {
58
- const currentHookOptions = hookOptionsRef.current;
59
- const onChange1 = currentHookOptions.onChange;
51
+ const onEntityUpdateEffect = useMemoizedFn(() => {
52
+ // 不能使用 `entity` 变量,因为 `effect` 执行的有延迟,`entity` 可能已经被更新了
53
+ onEntityUpdate(store.value);
54
+ });
55
+ const onEntityLifecycleChange = useMemoizedFn(async (newEntity, oldEntity) => {
60
56
  const _getLifecycleEvents2 = getLifecycleEvents(lifecycleKey),
61
- onChange2 = _getLifecycleEvents2.onChange;
62
- onEntityUpdate(newEntity, oldEntity);
63
- onChange1 === null || onChange1 === void 0 || onChange1(newEntity, oldEntity);
64
- onChange2 === null || onChange2 === void 0 || onChange2(newEntity, oldEntity);
65
- if (!entityRootEnabled) {
57
+ onChange = _getLifecycleEvents2.onChange;
58
+ let result = onChange === null || onChange === void 0 ? void 0 : onChange(newEntity, oldEntity);
59
+ if (result instanceof Promise) {
60
+ result = await result;
61
+ }
62
+ switch (typeof result) {
63
+ case 'number':
64
+ update(result);
65
+ return;
66
+ case 'undefined':
67
+ update();
68
+ return;
69
+ }
70
+ if (result) {
66
71
  return;
67
72
  }
68
73
  update();
69
74
  });
70
- useExec(() => {
71
- if (!entityRootEnabled) {
72
- return;
73
- }
75
+ const onEntityOptionsChange = useMemoizedFn((newEntity, oldEntity) => {
76
+ const currentOptions = optionsRef.current;
77
+ const onChange = currentOptions.onChange;
78
+ onChange === null || onChange === void 0 || onChange(newEntity, oldEntity);
79
+ });
80
+ useEntityRootExec(statuses, () => {
74
81
  const _bindLifecycleEventsK = bindLifecycleEventsKey(lifecycleKey),
75
82
  onBind = _bindLifecycleEventsK.onBind,
76
83
  onAdopt = _bindLifecycleEventsK.onAdopt;
77
- if (!isInitializing) {
78
- return;
79
- }
84
+ store.watch(onEntityLifecycleChange);
80
85
  onBind === null || onBind === void 0 || onBind(entity);
81
86
  onAdopt === null || onAdopt === void 0 || onAdopt(entity);
82
- }, null, []);
83
- useUnmount(() => {
84
- if (!entityRootEnabled) {
85
- return;
86
- }
87
+ }, () => {
87
88
  // 要使用最新的 `entity`
88
89
  const currentEntity = store.value;
89
90
  const _getLifecycleEvents3 = getLifecycleEvents(lifecycleKey),
90
91
  onUnbind = _getLifecycleEvents3.onUnbind,
91
92
  onDiscard = _getLifecycleEvents3.onDiscard;
93
+ store.unwatch(onEntityLifecycleChange);
92
94
  deleteLifecycleEvents(lifecycleKey);
93
95
  onUnbind === null || onUnbind === void 0 || onUnbind(currentEntity);
94
96
  onDiscard === null || onDiscard === void 0 || onDiscard(currentEntity);
@@ -97,20 +99,21 @@ export const useEntity = (store, statuses, hookOptions) => {
97
99
  * 需要马上 `watch`,因为 `useEffect` 在子组件内优先执行,
98
100
  * 如果使用了 `setEntity` 则无法监控到变化
99
101
  */
100
- useExec(() => {
101
- if (!entityEnabled) {
102
- return;
103
- }
104
- store.watch(onEntityChange);
102
+ useEntityReturn(statuses, () => {
103
+ store.watch(onEntityOptionsChange);
104
+ store.watch(onEntityUpdate);
105
105
  },
106
106
  /**
107
107
  * 在变化时候,组件更新前,使用 `unwatch`
108
108
  */
109
109
  () => {
110
- store.unwatch(onEntityChange);
111
- }, [store, entityEnabled, onEntityChange]);
110
+ store.unwatch(onEntityOptionsChange);
111
+ store.unwatch(onEntityUpdate);
112
+ }, [store]);
112
113
  useUpdateEffect(() => {
113
- onEntityUpdate();
114
- }, [entity, onEntityUpdate]);
114
+ onEntityUpdateEffect();
115
+ }, [entity, onEntityUpdateEffect]);
116
+ // 强制传入 `reducers` 参数,目的是让该 `hook` 一定在 `useReducers` 之后执行
117
+ void reducers;
115
118
  return entity;
116
119
  };
@@ -0,0 +1,5 @@
1
+ import { EntityReturnHook } from './types';
2
+ /**
3
+ * 只在 `RootCoreCollectionHook` 或 `ContextualCoreCollectionHook` 模式下才会执行相关回调
4
+ */
5
+ export declare const useEntityReturn: EntityReturnHook;
@@ -0,0 +1,15 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useIfReturn } from '../useIfReturn';
3
+ import { Statuses } from '../../enums/Statuses';
4
+ /**
5
+ * 只在 `RootCoreCollectionHook` 或 `ContextualCoreCollectionHook` 模式下才会执行相关回调
6
+ */
7
+ export const useEntityReturn = (statuses, callback, arg3, arg4) => {
8
+ const isDepsArgs = Array.isArray(arg3);
9
+ const _ref = isDepsArgs ? [null, arg3] : [arg3, arg4],
10
+ _ref2 = _slicedToArray(_ref, 2),
11
+ destructor = _ref2[0],
12
+ deps = _ref2[1];
13
+ const hasEntity = (statuses & Statuses.Entity) === Statuses.Entity;
14
+ return useIfReturn(hasEntity, callback, destructor || null, deps);
15
+ };
@@ -0,0 +1,7 @@
1
+ import { ReturnCallback, ReturnDestructor } from '../useReturn/types';
2
+ import { Statuses } from '../../enums/Statuses';
3
+ import { Dependencies } from '../../types';
4
+ export interface EntityReturnHook {
5
+ <T>(statuses: Statuses, callback: ReturnCallback<T>, deps?: Dependencies): T | null;
6
+ <T>(statuses: Statuses, callback: ReturnCallback<T>, destructor: ReturnDestructor | null, deps?: Dependencies): T | null;
7
+ }
@@ -0,0 +1,5 @@
1
+ import { EntityRootExecHook } from './types';
2
+ /**
3
+ * 只在 `RootCoreCollectionHook` 模式下才会执行相关回调
4
+ */
5
+ export declare const useEntityRootExec: EntityRootExecHook;
@@ -0,0 +1,7 @@
1
+ import { useEntityRootReturn } from '../useEntityRootReturn';
2
+ /**
3
+ * 只在 `RootCoreCollectionHook` 模式下才会执行相关回调
4
+ */
5
+ export const useEntityRootExec = function () {
6
+ void useEntityRootReturn(...arguments);
7
+ };
@@ -0,0 +1,7 @@
1
+ import { ExecCallback, ExecDestructor } from '../useExec/types';
2
+ import { Statuses } from '../../enums/Statuses';
3
+ import { Dependencies } from '../../types';
4
+ export interface EntityRootExecHook {
5
+ (statuses: Statuses, callback: ExecCallback, deps?: Dependencies): void;
6
+ (statuses: Statuses, callback: ExecCallback, destructor: ExecDestructor | null, deps?: Dependencies): void;
7
+ }
@@ -0,0 +1,5 @@
1
+ import { EntityRootReturnHook } from './types';
2
+ /**
3
+ * 只在 `RootCoreCollectionHook` 模式下才会执行相关回调
4
+ */
5
+ export declare const useEntityRootReturn: EntityRootReturnHook;
@@ -0,0 +1,14 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useRootReturn } from '../useRootReturn';
3
+ import { Statuses } from '../../enums/Statuses';
4
+ /**
5
+ * 只在 `RootCoreCollectionHook` 模式下才会执行相关回调
6
+ */
7
+ export const useEntityRootReturn = (statuses, callback, arg3, arg4) => {
8
+ const isDepsArgs = Array.isArray(arg3);
9
+ const _ref = isDepsArgs ? [null, arg3] : [arg3, arg4],
10
+ _ref2 = _slicedToArray(_ref, 2),
11
+ destructor = _ref2[0],
12
+ deps = _ref2[1];
13
+ return useRootReturn(statuses, callback, destructor || null, Statuses.EntityRootRuntime, deps);
14
+ };
@@ -0,0 +1,7 @@
1
+ import { RootReturnCallback, RootReturnDestructor } from '../useRootReturn/types';
2
+ import { Statuses } from '../../enums/Statuses';
3
+ import { Dependencies } from '../../types';
4
+ export interface EntityRootReturnHook {
5
+ <T>(statuses: Statuses, callback: RootReturnCallback<T>, deps?: Dependencies): T | null;
6
+ <T>(statuses: Statuses, callback: RootReturnCallback<T>, destructor: RootReturnDestructor | null, deps?: Dependencies): T | null;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,2 @@
1
- import { ExecCallback, ExecDestructor } from './types';
2
- import { RestArguments } from '@mic-rexjs/usecases/es/types';
3
- export declare const useExec: <T>(callback: ExecCallback<T>, destructor?: ExecDestructor | null, deps?: RestArguments) => T;
1
+ import { ExecHook } from './types';
2
+ export declare const useExec: ExecHook;
@@ -1,26 +1,4 @@
1
- import { useDepsKey } from '../useDepsKey';
2
- import { useCreation, useMemoizedFn, useUnmount } from 'ahooks';
3
- import { useRef } from 'react';
4
- export const useExec = function (callback, destructor) {
5
- let deps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [callback];
6
- const depsKey = useDepsKey(deps);
7
- const destructorRef = useRef(null);
8
- const onDestruct = function () {
9
- var _destructorRef$curren;
10
- let isUnmount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11
- (_destructorRef$curren = destructorRef.current) === null || _destructorRef$curren === void 0 || _destructorRef$curren.call(destructorRef, isUnmount);
12
- };
13
- const onExec = useMemoizedFn(() => {
14
- onDestruct();
15
- // `destructor` 一定是在执行回调的时候,同步绑定的,保持两个回调内的闭包变量一致
16
- destructorRef.current = destructor || null;
17
- return callback();
18
- });
19
- useUnmount(() => {
20
- onDestruct(true);
21
- });
22
- return useCreation(() => {
23
- void depsKey;
24
- return onExec();
25
- }, [depsKey, onExec]);
1
+ import { useReturn } from '../useReturn';
2
+ export const useExec = function () {
3
+ void useReturn(...arguments);
26
4
  };
@@ -1,6 +1,11 @@
1
- export interface ExecCallback<T> {
2
- (): T;
1
+ import { Dependencies } from '../../types';
2
+ export interface ExecCallback {
3
+ (): void;
3
4
  }
4
5
  export interface ExecDestructor {
5
6
  (isUnmount: boolean): void;
6
7
  }
8
+ export interface ExecHook {
9
+ (callback: ExecCallback, deps?: Dependencies): void;
10
+ (callback: ExecCallback, destructor: ExecDestructor | null, deps?: Dependencies): void;
11
+ }
@@ -1,5 +1,4 @@
1
1
  import { FullParameters } from './types';
2
- import { ReducerMap } from '@mic-rexjs/usecases/es/types';
3
- import { ArgumentTypes } from '../../enums/ArgumentTypes';
4
2
  import { UseCaseHookParameters } from '../../hooks/useUseCase/types';
5
- export declare const useFullArguments: <T, TReducers extends ReducerMap, TUseCaseOptions extends object>(args: UseCaseHookParameters, argumentTypes: ArgumentTypes) => FullParameters<T, TReducers, TUseCaseOptions>;
3
+ import { UnknownReducerMap } from '../../types';
4
+ export declare const useFullArguments: <T, TReducers extends UnknownReducerMap<T>, TUseCaseOptions extends object>(args: UseCaseHookParameters, isEntityRoot: boolean) => FullParameters<T, TReducers, TUseCaseOptions>;
@@ -1,14 +1,12 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
- import { ArgumentTypes } from '../../enums/ArgumentTypes';
3
- export const useFullArguments = (args, argumentTypes) => {
2
+ export const useFullArguments = (args, isEntityRoot) => {
4
3
  const _args = _slicedToArray(args, 4),
5
4
  arg1 = _args[0],
6
5
  arg2 = _args[1],
7
6
  arg3 = _args[2],
8
7
  arg4 = _args[3];
9
- const withoutEntity = (argumentTypes & ArgumentTypes.Entity) !== ArgumentTypes.Entity;
10
- if (withoutEntity) {
11
- return [null, arg1, arg2 || {}, arg3 || []];
8
+ if (isEntityRoot) {
9
+ return [arg1, arg2, arg3 || {}, arg4 || []];
12
10
  }
13
- return [arg1, arg2, arg3 || {}, arg4 || []];
11
+ return [null, arg1, arg2 || {}, arg3 || []];
14
12
  };
@@ -0,0 +1,2 @@
1
+ import { TrueExecHook } from './types';
2
+ export declare const useIfExec: TrueExecHook;
@@ -0,0 +1,20 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useExec } from '../useExec';
3
+ export const useIfExec = (value, callback, arg3, arg4) => {
4
+ const hasDestructor = typeof arg3 === 'function' || arg3 === null;
5
+ const _ref = hasDestructor ? [arg3, arg4] : [null, arg3],
6
+ _ref2 = _slicedToArray(_ref, 2),
7
+ destructor = _ref2[0],
8
+ deps = _ref2[1];
9
+ return useExec(() => {
10
+ if (!value) {
11
+ return;
12
+ }
13
+ callback();
14
+ }, isUnmount => {
15
+ if (!value) {
16
+ return;
17
+ }
18
+ destructor === null || destructor === void 0 || destructor(isUnmount);
19
+ }, deps);
20
+ };
@@ -0,0 +1,6 @@
1
+ import { ExecCallback, ExecDestructor } from '../useExec/types';
2
+ import { Dependencies } from '../../types';
3
+ export interface TrueExecHook {
4
+ <T>(value: boolean, callback: ExecCallback, deps?: Dependencies): T;
5
+ <T>(value: boolean, callback: ExecCallback, destructor: ExecDestructor | null, deps?: Dependencies): T;
6
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { IfReturnHook } from './types';
2
+ export declare const useIfReturn: IfReturnHook;
@@ -0,0 +1,22 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useReturn } from '../useReturn';
3
+ export const useIfReturn = (value, callback, arg3,
4
+ // 默认:如果 `callback` 没有用 `useMemorizedFn`,就会每次都执行,否则只执行一次
5
+ arg4) => {
6
+ const isDepsArg3 = Array.isArray(arg3);
7
+ const _ref = isDepsArg3 ? [null, arg3] : [arg3, arg4],
8
+ _ref2 = _slicedToArray(_ref, 2),
9
+ destructor = _ref2[0],
10
+ deps = _ref2[1];
11
+ return useReturn(() => {
12
+ if (!value) {
13
+ return null;
14
+ }
15
+ return callback();
16
+ }, isUnmount => {
17
+ if (!value) {
18
+ return;
19
+ }
20
+ destructor === null || destructor === void 0 || destructor(isUnmount);
21
+ }, deps);
22
+ };
@@ -0,0 +1,6 @@
1
+ import { ReturnCallback, ReturnDestructor } from '../useReturn/types';
2
+ import { Dependencies } from '../../types';
3
+ export interface IfReturnHook {
4
+ <T>(value: boolean, callback: ReturnCallback<T>, deps?: Dependencies): T | null;
5
+ <T>(value: boolean, callback: ReturnCallback<T>, destructor: ReturnDestructor | null, deps?: Dependencies): T | null;
6
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
1
  import { UseCaseProvider } from './types';
2
- import { ReducerMap } from '@mic-rexjs/usecases/es/types';
3
- import { UseCaseContext, UseCaseContextValue } from '../../usecases/contextUseCase/types';
4
- export declare const useProvider: <T extends ReducerMap, TContextValue extends UseCaseContextValue<T>>(context: UseCaseContext<TContextValue>, contextValue: TContextValue) => UseCaseProvider;
2
+ import { UnknownReducerMap } from '../../types';
3
+ import { EntityUseCaseContextValue, UseCaseContext } from '../../usecases/contextUseCase/types';
4
+ export declare const useProvider: <T, TReducers extends UnknownReducerMap<T>, TContextValue extends EntityUseCaseContextValue<T, TReducers>>(context: UseCaseContext<TContextValue>, contextValue: TContextValue) => UseCaseProvider;
@@ -1,19 +1,21 @@
1
- import { useConstantFn } from '../useConstantFn';
1
+ import { useConstant } from '../useConstant';
2
2
  import { useLatest } from 'ahooks';
3
3
  import React from 'react';
4
4
  export const useProvider = (context, contextValue) => {
5
5
  const contextValueRef = useLatest(contextValue);
6
- return useConstantFn(_ref => {
7
- let children = _ref.children,
8
- _ref$with = _ref.with,
9
- withProviders = _ref$with === void 0 ? [] : _ref$with;
10
- const ContextProvider = context.Provider;
11
- const value = contextValueRef.current;
12
- const providers = Array.isArray(withProviders) ? withProviders : [withProviders];
13
- return React.createElement(ContextProvider, {
14
- value
15
- }, providers.reduceRight((currentChildren, withProvider) => {
16
- return React.createElement(withProvider, {}, currentChildren);
17
- }, children));
6
+ return useConstant(() => {
7
+ return _ref => {
8
+ let children = _ref.children,
9
+ _ref$with = _ref.with,
10
+ withProviders = _ref$with === void 0 ? [] : _ref$with;
11
+ const ContextProvider = context.Provider;
12
+ const value = contextValueRef.current;
13
+ const providers = Array.isArray(withProviders) ? withProviders : [withProviders];
14
+ return React.createElement(ContextProvider, {
15
+ value
16
+ }, providers.reduceRight((currentChildren, withProvider) => {
17
+ return React.createElement(withProvider, {}, currentChildren);
18
+ }, children));
19
+ };
18
20
  });
19
21
  };
@@ -1,13 +1,13 @@
1
1
  import { useDepsKey } from '../useDepsKey';
2
- import { useCreation, useLatest } from 'ahooks';
2
+ import { useReturn } from '../useReturn';
3
+ import { useLatest } from 'ahooks';
3
4
  export const useProviders = function () {
4
5
  for (var _len = arguments.length, providers = new Array(_len), _key = 0; _key < _len; _key++) {
5
6
  providers[_key] = arguments[_key];
6
7
  }
7
8
  const depsKey = useDepsKey(providers);
8
9
  const providersRef = useLatest(providers);
9
- return useCreation(() => {
10
- void depsKey;
10
+ return useReturn(() => {
11
11
  return providersRef.current;
12
- }, [depsKey, providersRef]);
12
+ }, [depsKey]);
13
13
  };
@@ -1,6 +1,7 @@
1
+ import { ContextualUseCaseHookOptions, UseCaseHookOptions } from '../useUseCase/types';
1
2
  import { EntityStore } from '@mic-rexjs/usecases';
2
- import { EntityReducers, EntityUseCase, ReducerMap, UseCase } from '@mic-rexjs/usecases/es/types';
3
+ import { EntityUseCase, UseCase } from '@mic-rexjs/usecases/es/types';
3
4
  import { Statuses } from '../../enums/Statuses';
4
- import { Dependencies } from '../../types';
5
- import { UseCaseContext, UseCaseContextValue } from '../../usecases/contextUseCase/types';
6
- export declare const useReducers: <T, TReducers extends ReducerMap, TOptions extends object>(usecase: UseCase<TReducers, TOptions> | EntityUseCase<T, TReducers & EntityReducers<T>, TOptions>, store: EntityStore<T>, context: UseCaseContext<UseCaseContextValue<TReducers>>, statuses: Statuses, usecaseOptions: TOptions, deps?: Dependencies) => TReducers;
5
+ import { UnknownReducerMap } from '../../types';
6
+ import { ContextualEntityReducers, EntityUseCaseContextValue, UseCaseContext } from '../../usecases/contextUseCase/types';
7
+ export declare const useReducers: <T, TReducers extends UnknownReducerMap<T>, TOptions extends object>(usecase: UseCase<TReducers, TOptions> | EntityUseCase<T, TReducers, TOptions>, store: EntityStore<T>, context: UseCaseContext<EntityUseCaseContextValue<T, TReducers>>, statuses: Statuses, options: TOptions | UseCaseHookOptions<T, TOptions> | ContextualUseCaseHookOptions<T>) => TReducers | ContextualEntityReducers<T, TReducers>;
@@ -1,24 +1,61 @@
1
- import { useContextualItem } from '../useContextualItem';
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ const _excluded = ["watch", "onChange"];
3
+ import { useReturn } from '../useReturn';
2
4
  import { createEntityReducers } from '@mic-rexjs/usecases';
5
+ import { useLatest } from 'ahooks';
3
6
  import { useContext } from 'react';
4
7
  import { Statuses } from '../../enums/Statuses';
5
- export const useReducers = function (usecase, store, context, statuses, usecaseOptions) {
6
- let deps = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : [];
8
+ export const useReducers = (usecase, store, context, statuses, options) => {
7
9
  const contextValue = useContext(context);
8
10
  const _ref = contextValue || {},
9
11
  _ref$reducers = _ref.reducers,
10
12
  contextReducers = _ref$reducers === void 0 ? null : _ref$reducers;
11
- const entityEnabled = (statuses & Statuses.EntityEnabled) === Statuses.EntityEnabled;
12
- const onCreate = () => {
13
- if (!entityEnabled) {
14
- return usecase(usecaseOptions);
13
+ const watch = options.watch,
14
+ onChange = options.onChange,
15
+ restOptions = _objectWithoutProperties(options, _excluded);
16
+ const _options$options = options.options,
17
+ initailOptions = _options$options === void 0 ? restOptions : _options$options;
18
+ const initailOptionsRef = useLatest(initailOptions);
19
+ const reducersKey = statuses & Statuses.ReducersKey;
20
+ const onOption = key => {
21
+ return function () {
22
+ const currentInitailOptions = initailOptionsRef.current;
23
+ const currentValue = currentInitailOptions[key];
24
+ if (typeof currentValue !== 'function') {
25
+ return;
26
+ }
27
+ return currentValue(...arguments);
28
+ };
29
+ };
30
+ const onOptions = () => {
31
+ const newOptions = {
32
+ ...initailOptions
33
+ };
34
+ for (const key of Object.keys(newOptions)) {
35
+ const optionKey = key;
36
+ const value = newOptions[optionKey];
37
+ if (typeof value !== 'function') {
38
+ continue;
39
+ }
40
+ newOptions[optionKey] = onOption(optionKey);
15
41
  }
42
+ return newOptions;
43
+ };
44
+ return useReturn(() => {
45
+ const hasEntity = (statuses & Statuses.Entity) === Statuses.Entity;
46
+ const isEntityRootRuntime = (statuses & Statuses.EntityRootRuntime) === Statuses.EntityRootRuntime;
47
+ if (!hasEntity) {
48
+ return usecase(options);
49
+ }
50
+ if (!isEntityRootRuntime) {
51
+ return contextReducers;
52
+ }
53
+ const newOptions = onOptions();
16
54
  return createEntityReducers(store, usecase, {
17
- options: usecaseOptions,
55
+ options: newOptions,
18
56
  onGenerate(newEntity, result) {
19
57
  return result;
20
58
  }
21
59
  });
22
- };
23
- return useContextualItem(contextReducers, statuses, onCreate, deps);
60
+ }, [reducersKey]);
24
61
  };
@@ -0,0 +1,2 @@
1
+ import { ReturnHook } from './types';
2
+ export declare const useReturn: ReturnHook;
@@ -0,0 +1,33 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useDepsKey } from '../useDepsKey';
3
+ import { useCreation as useAhooksCreation, useMemoizedFn, useUnmount } from 'ahooks';
4
+ import { useRef } from 'react';
5
+ export const useReturn = function (callback) {
6
+ let arg2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [callback];
7
+ let arg3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [callback];
8
+ const hasDestructor = !Array.isArray(arg2);
9
+ const _ref = hasDestructor ? [arg2, arg3] : [null, arg2],
10
+ _ref2 = _slicedToArray(_ref, 2),
11
+ destructor = _ref2[0],
12
+ deps = _ref2[1];
13
+ const depsKey = useDepsKey(deps);
14
+ const destructorRef = useRef(null);
15
+ const onDestruct = function () {
16
+ var _destructorRef$curren;
17
+ let isUnmount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
18
+ (_destructorRef$curren = destructorRef.current) === null || _destructorRef$curren === void 0 || _destructorRef$curren.call(destructorRef, isUnmount);
19
+ };
20
+ const onCreate = useMemoizedFn(() => {
21
+ onDestruct();
22
+ // `destructor` 一定是在执行回调的时候,同步绑定的,保持两个回调内的闭包变量一致
23
+ destructorRef.current = destructor;
24
+ return callback();
25
+ });
26
+ useUnmount(() => {
27
+ onDestruct(true);
28
+ });
29
+ return useAhooksCreation(() => {
30
+ void depsKey;
31
+ return onCreate();
32
+ }, [depsKey, onCreate]);
33
+ };
@@ -0,0 +1,11 @@
1
+ import { Dependencies } from '../../types';
2
+ export interface ReturnCallback<T> {
3
+ (): T;
4
+ }
5
+ export interface ReturnDestructor {
6
+ (isUnmount: boolean): void;
7
+ }
8
+ export interface ReturnHook {
9
+ <T>(callback: ReturnCallback<T>, deps?: Dependencies): T;
10
+ <T>(callback: ReturnCallback<T>, destructor: ReturnDestructor | null, deps?: Dependencies): T;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Statuses } from '../../enums/Statuses';
2
+ export declare const useRootInitializing: (statuses: Statuses) => boolean;