@mic-rexjs/usecases-react 4.0.0-beta.0 → 4.0.0-beta.3
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.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.LICENSE.txt +2 -0
- package/es/components/UseCaseFragment/index.js +2 -2
- package/es/enums/Statuses/index.d.ts +86 -10
- package/es/enums/Statuses/index.js +86 -10
- package/es/hooks/useAlternateStatuses/index.d.ts +2 -0
- package/es/hooks/useAlternateStatuses/index.js +16 -0
- package/es/hooks/useChanged/index.d.ts +2 -0
- package/es/hooks/useChanged/index.js +17 -0
- package/es/hooks/useChanged/types.d.ts +3 -0
- package/es/hooks/useContext/index.d.ts +3 -4
- package/es/hooks/useContext/index.js +17 -15
- package/es/hooks/useContext/index.test.js +13 -24
- package/es/hooks/useContextValue/index.d.ts +3 -4
- package/es/hooks/useContextValue/index.js +9 -16
- package/es/hooks/useDepsKey/index.js +11 -9
- package/es/hooks/useEntity/index.d.ts +3 -2
- package/es/hooks/useEntity/index.js +51 -50
- package/es/hooks/useEntityReturn/index.d.ts +5 -0
- package/es/hooks/useEntityReturn/index.js +15 -0
- package/es/hooks/useEntityReturn/types.d.ts +7 -0
- package/es/hooks/useEntityRootExec/index.d.ts +5 -0
- package/es/hooks/useEntityRootExec/index.js +7 -0
- package/es/hooks/useEntityRootExec/types.d.ts +7 -0
- package/es/hooks/useEntityRootReturn/index.d.ts +5 -0
- package/es/hooks/useEntityRootReturn/index.js +14 -0
- package/es/hooks/useEntityRootReturn/types.d.ts +7 -0
- package/es/hooks/useEntityRootReturn/types.js +1 -0
- package/es/hooks/useExec/index.d.ts +2 -3
- package/es/hooks/useExec/index.js +3 -25
- package/es/hooks/useExec/types.d.ts +7 -2
- package/es/hooks/useFullArguments/index.d.ts +2 -3
- package/es/hooks/useFullArguments/index.js +4 -6
- package/es/hooks/useIfExec/index.d.ts +2 -0
- package/es/hooks/useIfExec/index.js +20 -0
- package/es/hooks/useIfExec/types.d.ts +6 -0
- package/es/hooks/useIfExec/types.js +1 -0
- package/es/hooks/useIfReturn/index.d.ts +2 -0
- package/es/hooks/useIfReturn/index.js +22 -0
- package/es/hooks/useIfReturn/types.d.ts +6 -0
- package/es/hooks/useIfReturn/types.js +1 -0
- package/es/hooks/useProvider/index.d.ts +3 -3
- package/es/hooks/useProvider/index.js +15 -13
- package/es/hooks/useProviders/index.js +4 -4
- package/es/hooks/useReducers/index.d.ts +5 -4
- package/es/hooks/useReducers/index.js +47 -10
- package/es/hooks/useReturn/index.d.ts +2 -0
- package/es/hooks/useReturn/index.js +33 -0
- package/es/hooks/useReturn/types.d.ts +11 -0
- package/es/hooks/useReturn/types.js +1 -0
- package/es/hooks/useRootInitializing/index.d.ts +2 -0
- package/es/hooks/useRootInitializing/index.js +14 -0
- package/es/hooks/useRootReturn/index.d.ts +5 -0
- package/es/hooks/useRootReturn/index.js +22 -0
- package/es/hooks/useRootReturn/types.d.ts +14 -0
- package/es/hooks/useRootReturn/types.js +1 -0
- package/es/hooks/useStatuses/index.d.ts +4 -4
- package/es/hooks/useStatuses/index.js +46 -21
- package/es/hooks/useStore/index.d.ts +3 -3
- package/es/hooks/useStore/index.js +24 -47
- package/es/hooks/useThrottleUpdate/index.d.ts +2 -0
- package/es/hooks/useThrottleUpdate/index.js +31 -0
- package/es/hooks/useThrottleUpdate/types.d.ts +3 -0
- package/es/hooks/useThrottleUpdate/types.js +1 -0
- package/es/hooks/useUseCase/index.js +18 -27
- package/es/hooks/useUseCase/index.test.js +357 -227
- package/es/hooks/useUseCase/types.d.ts +13 -2
- package/es/types.d.ts +2 -1
- package/es/usecases/contextUseCase/index.js +21 -38
- package/es/usecases/contextUseCase/types.d.ts +6 -9
- package/es/usecases/lifecycleEventUseCase/index.js +37 -9
- package/es/usecases/lifecycleEventUseCase/types.d.ts +11 -8
- package/lib/components/UseCaseFragment/index.js +2 -2
- package/lib/enums/Statuses/index.js +86 -10
- package/lib/hooks/useAlternateStatuses/index.js +22 -0
- package/lib/hooks/useChanged/index.js +23 -0
- package/lib/hooks/useContext/index.js +19 -17
- package/lib/hooks/useContext/index.test.js +13 -24
- package/lib/hooks/useContextValue/index.js +8 -15
- package/lib/hooks/useDepsKey/index.js +10 -8
- package/lib/hooks/useEntity/index.js +82 -53
- package/lib/hooks/useEntityReturn/index.js +22 -0
- package/lib/hooks/useEntityRootExec/index.js +13 -0
- package/lib/hooks/useEntityRootReturn/index.js +21 -0
- package/lib/hooks/useEntityRootReturn/types.js +5 -0
- package/lib/hooks/useExec/index.js +3 -25
- package/lib/hooks/useFullArguments/index.js +4 -6
- package/lib/hooks/useIfExec/index.js +27 -0
- package/lib/hooks/useIfExec/types.js +5 -0
- package/lib/hooks/useIfReturn/index.js +29 -0
- package/lib/hooks/useIfReturn/types.js +5 -0
- package/lib/hooks/useProvider/index.js +15 -13
- package/lib/hooks/useProviders/index.js +3 -3
- package/lib/hooks/useReducers/index.js +50 -10
- package/lib/hooks/useReturn/index.js +40 -0
- package/lib/hooks/useReturn/types.js +5 -0
- package/lib/hooks/useRootInitializing/index.js +20 -0
- package/lib/hooks/useRootReturn/index.js +30 -0
- package/lib/hooks/useRootReturn/types.js +5 -0
- package/lib/hooks/useStatuses/index.js +47 -21
- package/lib/hooks/useStore/index.js +22 -46
- package/lib/hooks/useThrottleUpdate/index.js +37 -0
- package/lib/hooks/useThrottleUpdate/types.js +5 -0
- package/lib/hooks/useUseCase/index.js +18 -27
- package/lib/hooks/useUseCase/index.test.js +389 -267
- package/lib/usecases/contextUseCase/index.js +21 -38
- package/lib/usecases/lifecycleEventUseCase/index.js +48 -8
- package/package.json +1 -1
- package/es/classes/OptionsSet/index.d.ts +0 -6
- package/es/classes/OptionsSet/index.js +0 -44
- package/es/classes/OptionsSet/types.d.ts +0 -8
- package/es/enums/ArgumentTypes/index.d.ts +0 -4
- package/es/enums/ArgumentTypes/index.js +0 -5
- package/es/hooks/useArgumentTypes/index.d.ts +0 -3
- package/es/hooks/useArgumentTypes/index.js +0 -14
- package/es/hooks/useConstantEntityReducers/index.d.ts +0 -3
- package/es/hooks/useConstantEntityReducers/index.js +0 -7
- package/es/hooks/useConstantFn/index.d.ts +0 -1
- package/es/hooks/useConstantFn/index.js +0 -10
- package/es/hooks/useConstantReducers/index.d.ts +0 -3
- package/es/hooks/useConstantReducers/index.js +0 -6
- package/es/hooks/useContextualItem/index.d.ts +0 -4
- package/es/hooks/useContextualItem/index.js +0 -11
- package/es/hooks/useEntityInitializing/index.d.ts +0 -2
- package/es/hooks/useEntityInitializing/index.js +0 -16
- package/es/hooks/useOptions/index.d.ts +0 -5
- package/es/hooks/useOptions/index.js +0 -54
- package/es/hooks/useOptions/types.d.ts +0 -5
- package/es/hooks/useOptionsSet/index.d.ts +0 -5
- package/es/hooks/useOptionsSet/index.js +0 -16
- package/es/hooks/useRootCreation/index.d.ts +0 -4
- package/es/hooks/useRootCreation/index.js +0 -20
- package/es/hooks/useRootCreation/types.d.ts +0 -3
- package/lib/classes/OptionsSet/index.js +0 -94
- package/lib/enums/ArgumentTypes/index.js +0 -11
- package/lib/hooks/useArgumentTypes/index.js +0 -22
- package/lib/hooks/useConstantEntityReducers/index.js +0 -13
- package/lib/hooks/useConstantFn/index.js +0 -17
- package/lib/hooks/useConstantReducers/index.js +0 -12
- package/lib/hooks/useContextualItem/index.js +0 -17
- package/lib/hooks/useEntityInitializing/index.js +0 -22
- package/lib/hooks/useOptions/index.js +0 -61
- package/lib/hooks/useOptionsSet/index.js +0 -22
- package/lib/hooks/useRootCreation/index.js +0 -26
- /package/es/{classes/OptionsSet → hooks/useChanged}/types.js +0 -0
- /package/es/hooks/{useOptions → useEntityReturn}/types.js +0 -0
- /package/es/hooks/{useRootCreation → useEntityRootExec}/types.js +0 -0
- /package/lib/{classes/OptionsSet → hooks/useChanged}/types.js +0 -0
- /package/lib/hooks/{useOptions → useEntityReturn}/types.js +0 -0
- /package/lib/hooks/{useRootCreation → useEntityRootExec}/types.js +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { UseCaseProvider } from '../useProvider/types';
|
|
2
2
|
import { UseCase } from '@mic-rexjs/usecases';
|
|
3
3
|
import { EntityReducerMap, EntityReducers, InferableEntityUseCase, ReducerMap, RestArguments, SymbolSet, SymbolSetTarget } from '@mic-rexjs/usecases/es/types';
|
|
4
|
-
import { VoidifyEventOptions } from '../../classes/OptionsSet/types';
|
|
5
4
|
import { MatchPropertyFailedResult } from '../../entities/matchPropertyFailedResult/types';
|
|
6
5
|
import { Dependencies, EntityInitializer } from '../../types';
|
|
7
6
|
import { ContextualEntityReducers } from '../../usecases/contextUseCase/types';
|
|
@@ -37,7 +36,19 @@ export type EntityWatchMap<T> = {
|
|
|
37
36
|
[K in FieldPath<T>]?: EntityWatcher<T, ExtractFieldType<T, K>>;
|
|
38
37
|
};
|
|
39
38
|
export interface ContextualUseCaseHookOptions<T> {
|
|
39
|
+
/**
|
|
40
|
+
* 触发机制包括以下两点:
|
|
41
|
+
*
|
|
42
|
+
* 1. 由相关 `reducers` 的调用行为触发 - 非渲染阶段;
|
|
43
|
+
* 2. 由 `useUseCase(entity, usecase)` 中的 `entity` 变化触发 - 渲染阶段。
|
|
44
|
+
*/
|
|
40
45
|
watch?: EntityWatchMap<T>;
|
|
46
|
+
/**
|
|
47
|
+
* 非渲染阶段触发,随后会触发组件的更新:
|
|
48
|
+
*
|
|
49
|
+
* 只由相关 `reducers` 的调用行为触发;
|
|
50
|
+
* 不包括 `useUseCase(entity, usecase)` 中的 `entity` 变化触发。
|
|
51
|
+
*/
|
|
41
52
|
onChange?(newEntity: T, oldEntity: T): void;
|
|
42
53
|
}
|
|
43
54
|
export interface UseCaseHookOwnOptions<T, TUseCaseOptions extends object> extends ContextualUseCaseHookOptions<T> {
|
|
@@ -52,7 +63,7 @@ export interface ReducersHook {
|
|
|
52
63
|
<T extends ReducerMap, TUseCaseOptions extends object = object>(usecase: UseCase<T & SymbolSetTarget<NonEntitySymbolSet>, TUseCaseOptions>, options?: TUseCaseOptions, deps?: Dependencies): T;
|
|
53
64
|
}
|
|
54
65
|
export interface ContextualCoreCollectionHook {
|
|
55
|
-
<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, options?:
|
|
66
|
+
<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, options?: ContextualUseCaseHookOptions<T>): CoreCollection<T, TEntityReducers>;
|
|
56
67
|
}
|
|
57
68
|
export interface RootCoreCollectionHook {
|
|
58
69
|
<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(entity: T | EntityInitializer<T>, usecase: InferableEntityUseCase<T, TEntityReducers & EntityReducers<T>, TUseCaseOptions>, options?: UseCaseHookOptions<T, TUseCaseOptions>, deps?: Dependencies): CoreCollection<T, EntityReducers<T, TEntityReducers>>;
|
package/es/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { AsyncEntityCallbackGenerator, EntityGenerator, RestArguments } from '@mic-rexjs/usecases/es/types';
|
|
1
|
+
import { AsyncEntityCallbackGenerator, EntityGenerator, EntityReducerMap, ReducerMap, RestArguments } from '@mic-rexjs/usecases/es/types';
|
|
2
2
|
export interface Dependencies extends RestArguments {
|
|
3
3
|
}
|
|
4
|
+
export type UnknownReducerMap<T> = ReducerMap | EntityReducerMap<T>;
|
|
4
5
|
export type InitEntityResult<T> = T | EntityGenerator<T> | AsyncEntityCallbackGenerator<T>;
|
|
5
6
|
export interface EntityInitializer<T> {
|
|
6
7
|
(entity: T | undefined): InitEntityResult<T>;
|
|
@@ -1,67 +1,51 @@
|
|
|
1
1
|
import { createUseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { createContext } from 'react';
|
|
3
|
-
import { ArgumentTypes } from '../../enums/ArgumentTypes';
|
|
4
|
-
import { Statuses } from '../../enums/Statuses';
|
|
5
3
|
export const contextUseCase = createUseCase(() => {
|
|
6
4
|
const referenceMap = new Map();
|
|
7
|
-
const defaultUseCaseContext = createContext(null);
|
|
8
5
|
return () => {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
return {
|
|
12
|
-
store,
|
|
13
|
-
reducers,
|
|
14
|
-
statuses
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
reducers,
|
|
19
|
-
statuses
|
|
20
|
-
};
|
|
6
|
+
const getTypedReferenceMap = () => {
|
|
7
|
+
return referenceMap;
|
|
21
8
|
};
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
const getContext = usecase => {
|
|
10
|
+
const map = getTypedReferenceMap();
|
|
11
|
+
if (!map.has(usecase)) {
|
|
12
|
+
return createContext(null);
|
|
25
13
|
}
|
|
26
|
-
const
|
|
27
|
-
value =
|
|
14
|
+
const _map$get = map.get(usecase),
|
|
15
|
+
value = _map$get.value;
|
|
28
16
|
return value;
|
|
29
17
|
};
|
|
30
|
-
const registerUseCase =
|
|
31
|
-
|
|
32
|
-
|
|
18
|
+
const registerUseCase = usecase => {
|
|
19
|
+
const map = getTypedReferenceMap();
|
|
20
|
+
if (map.has(usecase)) {
|
|
21
|
+
const reference = map.get(usecase);
|
|
33
22
|
const value = reference.value,
|
|
34
23
|
times = reference.times;
|
|
35
|
-
|
|
24
|
+
map.set(usecase, {
|
|
36
25
|
value,
|
|
37
26
|
times: times + 1
|
|
38
27
|
});
|
|
39
28
|
return value;
|
|
40
29
|
}
|
|
41
|
-
if ((argumentTypes & ArgumentTypes.Entity) !== ArgumentTypes.Entity) {
|
|
42
|
-
return defaultUseCaseContext;
|
|
43
|
-
}
|
|
44
30
|
const context = createContext(null);
|
|
45
|
-
|
|
31
|
+
map.set(usecase, {
|
|
46
32
|
value: context,
|
|
47
33
|
times: 1
|
|
48
34
|
});
|
|
49
35
|
return context;
|
|
50
36
|
};
|
|
51
|
-
const unregisterUseCase =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
if (!referenceMap.has(usecase)) {
|
|
37
|
+
const unregisterUseCase = usecase => {
|
|
38
|
+
const map = getTypedReferenceMap();
|
|
39
|
+
if (!map.has(usecase)) {
|
|
56
40
|
return false;
|
|
57
41
|
}
|
|
58
|
-
const reference =
|
|
42
|
+
const reference = map.get(usecase);
|
|
59
43
|
const value = reference.value,
|
|
60
44
|
times = reference.times;
|
|
61
45
|
if (times === 1) {
|
|
62
|
-
|
|
46
|
+
map.delete(usecase);
|
|
63
47
|
} else {
|
|
64
|
-
|
|
48
|
+
map.set(usecase, {
|
|
65
49
|
value,
|
|
66
50
|
times: times - 1
|
|
67
51
|
});
|
|
@@ -69,8 +53,7 @@ export const contextUseCase = createUseCase(() => {
|
|
|
69
53
|
return true;
|
|
70
54
|
};
|
|
71
55
|
return {
|
|
72
|
-
|
|
73
|
-
getUseCaseContext,
|
|
56
|
+
getContext,
|
|
74
57
|
registerUseCase,
|
|
75
58
|
unregisterUseCase
|
|
76
59
|
};
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { AsyncEntityGenerator, EntityGenerator, EntityReducer, EntityStore, ReducerKeys, Reducers } from '@mic-rexjs/usecases';
|
|
2
|
-
import { EntityReducerMap,
|
|
3
|
-
import { OptionsSet } from '../../classes/OptionsSet';
|
|
4
|
-
import { ArgumentTypes } from '../../enums/ArgumentTypes';
|
|
2
|
+
import { EntityReducerMap, EntityUseCase, ReducerMap } from '@mic-rexjs/usecases/es/types';
|
|
5
3
|
import { Statuses } from '../../enums/Statuses';
|
|
6
4
|
export interface UseCaseContextValue<T extends ReducerMap> {
|
|
5
|
+
key: React.Key;
|
|
7
6
|
reducers: T;
|
|
8
7
|
statuses: Statuses;
|
|
9
8
|
}
|
|
10
|
-
export interface EntityUseCaseContextValue<T, TEntityReducers extends EntityReducerMap<T
|
|
9
|
+
export interface EntityUseCaseContextValue<T, TEntityReducers extends EntityReducerMap<T>> extends UseCaseContextValue<ContextualEntityReducers<T, TEntityReducers>> {
|
|
11
10
|
store: EntityStore<T>;
|
|
12
|
-
optionsSet: OptionsSet<TOptions>;
|
|
13
11
|
}
|
|
14
12
|
export interface UseCaseContext<T> extends React.Context<T | null> {
|
|
15
13
|
}
|
|
@@ -22,10 +20,9 @@ export type ContextualEntityReducers<T, TEntityReducers extends EntityReducerMap
|
|
|
22
20
|
[K in ReducerKeys<TEntityReducers>]: ContextualEntityReducer<T, TEntityReducers[K]>;
|
|
23
21
|
};
|
|
24
22
|
export type ContextReducers = Reducers<{
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
unregisterUseCase<T extends ReducerMap, TUseCaseOptions extends object>(usecase: InferableUseCase<T, TUseCaseOptions>, argumentTypes: ArgumentTypes): boolean;
|
|
23
|
+
getContext<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object>(usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions>): UseCaseContext<EntityUseCaseContextValue<T, TEntityReducers>>;
|
|
24
|
+
registerUseCase<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object>(usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions>): UseCaseContext<EntityUseCaseContextValue<T, TEntityReducers>>;
|
|
25
|
+
unregisterUseCase<T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object>(usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions>): boolean;
|
|
29
26
|
}>;
|
|
30
27
|
export interface ContextUseCase {
|
|
31
28
|
(): ContextReducers;
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
import { createUseCase } from '@mic-rexjs/usecases';
|
|
1
|
+
import { createUseCase, utilsUseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
export const lifecycleEventUseCase = createUseCase(() => {
|
|
3
3
|
const map = new Map();
|
|
4
|
-
|
|
4
|
+
const eventsList = [];
|
|
5
|
+
const _utilsUseCase = utilsUseCase(),
|
|
6
|
+
createKey = _utilsUseCase.createKey;
|
|
5
7
|
/**
|
|
6
8
|
* 逻辑是:先存,再绑定 `key`,再通过 `key` 获取,最后清除
|
|
7
9
|
*/
|
|
8
10
|
return () => {
|
|
11
|
+
const createLifecycleKey = () => {
|
|
12
|
+
return createKey();
|
|
13
|
+
};
|
|
9
14
|
const deleteLifecycleEvents = key => {
|
|
10
15
|
return map.delete(key);
|
|
11
16
|
};
|
|
12
17
|
const bindLifecycleEventsKey = key => {
|
|
13
|
-
|
|
18
|
+
const length = eventsList.length;
|
|
19
|
+
if (length === 0) {
|
|
14
20
|
return {};
|
|
15
21
|
}
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
const list = eventsList.splice(0);
|
|
23
|
+
const onEvent = (propertyKey, args) => {
|
|
24
|
+
let returnValue = void 0;
|
|
25
|
+
for (const events of list) {
|
|
26
|
+
const event = events[propertyKey];
|
|
27
|
+
if (typeof event !== 'function') {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
returnValue !== null && returnValue !== void 0 ? returnValue : returnValue = Reflect.apply(event, null, args);
|
|
31
|
+
}
|
|
32
|
+
return returnValue;
|
|
33
|
+
};
|
|
34
|
+
const types = ['onBind', 'onUnbind', 'onAdopt', 'onDiscard', 'onChange', 'onUpdate'];
|
|
35
|
+
const entries = types.map(type => {
|
|
36
|
+
const event = function () {
|
|
37
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
38
|
+
args[_key] = arguments[_key];
|
|
39
|
+
}
|
|
40
|
+
return onEvent(type, args);
|
|
41
|
+
};
|
|
42
|
+
return [type, event];
|
|
43
|
+
});
|
|
44
|
+
const events = Object.fromEntries(entries);
|
|
45
|
+
map.set(key, events);
|
|
46
|
+
return events;
|
|
20
47
|
};
|
|
21
48
|
const getLifecycleEvents = key => {
|
|
22
49
|
return map.get(key) || {};
|
|
23
50
|
};
|
|
24
|
-
const setLifecycleEvents =
|
|
25
|
-
events
|
|
51
|
+
const setLifecycleEvents = events => {
|
|
52
|
+
eventsList.push(events);
|
|
26
53
|
};
|
|
27
54
|
return {
|
|
55
|
+
createLifecycleKey,
|
|
28
56
|
deleteLifecycleEvents,
|
|
29
57
|
setLifecycleEvents,
|
|
30
58
|
getLifecycleEvents,
|
|
@@ -17,13 +17,22 @@ export interface LifecycleEvents<T = unknown> {
|
|
|
17
17
|
* 2. `onUpdate` 或 `onChange` 的时候。
|
|
18
18
|
*/
|
|
19
19
|
onAdopt(newEntity: T, oldEntity?: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* 当 `entity` 被废弃时候调用,包括以下两种情况:
|
|
22
|
+
*
|
|
23
|
+
* 1. `onUpdate` 或 `onChange` 的时候;
|
|
24
|
+
* 2. `onUnbind` 的时候。
|
|
25
|
+
*/
|
|
26
|
+
onDiscard(entity: T): void;
|
|
20
27
|
/**
|
|
21
28
|
* 非渲染阶段触发,随后会触发组件的更新:
|
|
22
29
|
*
|
|
23
30
|
* 只由相关 `reducers` 的调用行为触发;
|
|
24
31
|
* 不包括 `useUseCase(entity, usecase)` 中的 `entity` 变化触发。
|
|
32
|
+
*
|
|
33
|
+
* @returns 返回一个布尔值,决定是否跳过组件更新。
|
|
25
34
|
*/
|
|
26
|
-
onChange(newEntity: T, oldEntity: T): void
|
|
35
|
+
onChange(newEntity: T, oldEntity: T): void | number | boolean | Promise<boolean>;
|
|
27
36
|
/**
|
|
28
37
|
* 触发机制包括以下两点:
|
|
29
38
|
*
|
|
@@ -31,18 +40,12 @@ export interface LifecycleEvents<T = unknown> {
|
|
|
31
40
|
* 2. 由 `useUseCase(entity, usecase)` 中的 `entity` 变化触发 - 渲染阶段。
|
|
32
41
|
*/
|
|
33
42
|
onUpdate(newEntity: T, oldEntity: T): void;
|
|
34
|
-
/**
|
|
35
|
-
* 当 `entity` 被废弃时候调用,包括以下两种情况:
|
|
36
|
-
*
|
|
37
|
-
* 1. `onUpdate` 或 `onChange` 的时候;
|
|
38
|
-
* 2. `onUnbind` 的时候。
|
|
39
|
-
*/
|
|
40
|
-
onDiscard(entity: T): void;
|
|
41
43
|
}
|
|
42
44
|
export interface CaptureLifecycleEventsCallback<T> {
|
|
43
45
|
(): T;
|
|
44
46
|
}
|
|
45
47
|
export type LifecycleEventReducers = Reducers<{
|
|
48
|
+
createLifecycleKey(): React.Key;
|
|
46
49
|
deleteLifecycleEvents(key: React.Key): boolean;
|
|
47
50
|
bindLifecycleEventsKey<T>(key: React.Key): Partial<LifecycleEvents<T>>;
|
|
48
51
|
setLifecycleEvents<T>(events: Partial<LifecycleEvents<T>>): void;
|
|
@@ -19,8 +19,8 @@ var UseCaseFragment = exports.UseCaseFragment = function UseCaseFragment(_ref) {
|
|
|
19
19
|
var usecase = _ref.usecase,
|
|
20
20
|
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
21
21
|
var _useUseCase = (0, _useUseCase2.useUseCase)(_contextUseCase.contextUseCase),
|
|
22
|
-
|
|
23
|
-
var context =
|
|
22
|
+
getContext = _useUseCase.getContext;
|
|
23
|
+
var context = getContext(usecase);
|
|
24
24
|
var contextValue = (0, _react.useContext)(context);
|
|
25
25
|
return (0, _jsxRuntime.jsx)(_react.Fragment, {
|
|
26
26
|
children: contextValue === null ? null : (0, _jsxRuntime.jsx)(_SafeUseCaseFragment.SafeUseCaseFragment, _objectSpread({
|
|
@@ -8,23 +8,99 @@ var Statuses;
|
|
|
8
8
|
(function (Statuses) {
|
|
9
9
|
Statuses[Statuses["None"] = 0] = "None";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* 是否启用 `entity`
|
|
12
12
|
*/
|
|
13
|
-
Statuses[Statuses["
|
|
13
|
+
Statuses[Statuses["Entity"] = 4] = "Entity";
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 是否以 `ReducersHook` 或 `RootCoreCollectionHook` 的形式被调用
|
|
16
16
|
*/
|
|
17
|
-
Statuses[Statuses["
|
|
17
|
+
Statuses[Statuses["RootRuntime"] = 8] = "RootRuntime";
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* 是否以 `RootCoreCollectionHook` 的形式被调用
|
|
20
20
|
*/
|
|
21
|
-
Statuses[Statuses["
|
|
21
|
+
Statuses[Statuses["EntityRootRuntime"] = 12] = "EntityRootRuntime";
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* 是否以 `ContextualCoreCollectionHook` 的形式被调用
|
|
24
24
|
*/
|
|
25
|
-
Statuses[Statuses["
|
|
25
|
+
Statuses[Statuses["EntityContextRuntime"] = 20] = "EntityContextRuntime";
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* 当传入的 `entity` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
28
28
|
*/
|
|
29
|
-
Statuses[Statuses["
|
|
29
|
+
Statuses[Statuses["InitialEntityX"] = 32] = "InitialEntityX";
|
|
30
|
+
/**
|
|
31
|
+
* 当传入的 `entity` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
32
|
+
*/
|
|
33
|
+
Statuses[Statuses["InitialEntityY"] = 64] = "InitialEntityY";
|
|
34
|
+
/**
|
|
35
|
+
* 当传入的 `entity` 参数变更时,生成相关的 `key`,可作为 `hooks` 的依赖。
|
|
36
|
+
*
|
|
37
|
+
* 使用方式:
|
|
38
|
+
* * `const entityKey = statuses & Statuses.EntityKey;`
|
|
39
|
+
*/
|
|
40
|
+
Statuses[Statuses["InitialEntityKey"] = 96] = "InitialEntityKey";
|
|
41
|
+
/**
|
|
42
|
+
* 当传入的 `usecase` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
43
|
+
*/
|
|
44
|
+
Statuses[Statuses["UseCaseX"] = 128] = "UseCaseX";
|
|
45
|
+
/**
|
|
46
|
+
* 当传入的 `usecase` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
47
|
+
*/
|
|
48
|
+
Statuses[Statuses["UseCaseY"] = 256] = "UseCaseY";
|
|
49
|
+
/**
|
|
50
|
+
* 当传入的 `usecase` 参数变更时,生成相关的 `key`,可作为 `hooks` 的依赖。
|
|
51
|
+
*
|
|
52
|
+
* 使用方式:
|
|
53
|
+
* * `const usecaseKey = statuses & Statuses.UseCaseKey;`
|
|
54
|
+
*/
|
|
55
|
+
Statuses[Statuses["UseCaseKey"] = 384] = "UseCaseKey";
|
|
56
|
+
/**
|
|
57
|
+
* 当传入的 `deps` 变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
58
|
+
*/
|
|
59
|
+
Statuses[Statuses["DepsX"] = 512] = "DepsX";
|
|
60
|
+
/**
|
|
61
|
+
* 当传入的 `deps` 变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个。
|
|
62
|
+
*/
|
|
63
|
+
Statuses[Statuses["DepsY"] = 1024] = "DepsY";
|
|
64
|
+
/**
|
|
65
|
+
* 当传入的 `deps` 变更时,生成相关的 `key`,可作为 `hooks` 的依赖。
|
|
66
|
+
*
|
|
67
|
+
* 使用方式:
|
|
68
|
+
* * `const depsKey = statuses & Statuses.DepsKey;`
|
|
69
|
+
*/
|
|
70
|
+
Statuses[Statuses["DepsKey"] = 1536] = "DepsKey";
|
|
71
|
+
/**
|
|
72
|
+
* 当传入的 `usecase` 或 `deps` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个;
|
|
73
|
+
* 表示将有新的 `reducers` 将会生成。
|
|
74
|
+
*/
|
|
75
|
+
Statuses[Statuses["ReducersX"] = 2048] = "ReducersX";
|
|
76
|
+
/**
|
|
77
|
+
* 当传入的 `usecase` 或 `deps` 参数变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个;
|
|
78
|
+
* 表示将有新的 `reducers` 将会生成。
|
|
79
|
+
*/
|
|
80
|
+
Statuses[Statuses["ReducersY"] = 4096] = "ReducersY";
|
|
81
|
+
/**
|
|
82
|
+
* 当传入的 `usecase` 或 `deps` 参数变更时,生成相关的 `key`,可作为 `hooks` 的依赖。
|
|
83
|
+
*
|
|
84
|
+
* 使用方式:
|
|
85
|
+
* * `const reducersKey = statuses & Statuses.ReducersKey;`
|
|
86
|
+
*/
|
|
87
|
+
Statuses[Statuses["ReducersKey"] = 6144] = "ReducersKey";
|
|
88
|
+
/**
|
|
89
|
+
* 以下情况变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个:
|
|
90
|
+
* * 传入的 `usecase` 发生变化;
|
|
91
|
+
* * 调用 `useUseCase` 的形式发生变化;
|
|
92
|
+
* * 新增或移除根节点的 `Provider`;
|
|
93
|
+
*/
|
|
94
|
+
Statuses[Statuses["RootX"] = 8192] = "RootX";
|
|
95
|
+
/**
|
|
96
|
+
* 以下情况变更时,状态会轮流切换到 `X` 或 `Y` 其中的一个:
|
|
97
|
+
* * 传入的 `usecase` 发生变化;
|
|
98
|
+
* * 调用 `useUseCase` 的形式发生变化;
|
|
99
|
+
* * 新增或移除根节点的 `Provider`;
|
|
100
|
+
*/
|
|
101
|
+
Statuses[Statuses["RootY"] = 16384] = "RootY";
|
|
102
|
+
/**
|
|
103
|
+
* 根据 `root` 的变化,生成相关的 `key`,可作为 `hooks` 的依赖。
|
|
104
|
+
*/
|
|
105
|
+
Statuses[Statuses["RootKey"] = 24576] = "RootKey";
|
|
30
106
|
})(Statuses || (exports.Statuses = Statuses = {}));
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAlternateStatuses = void 0;
|
|
7
|
+
var _useChanged = require("../useChanged");
|
|
8
|
+
var _useReturn = require("../useReturn");
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var useAlternateStatuses = exports.useAlternateStatuses = function useAlternateStatuses(value, statusesX, statusesY) {
|
|
11
|
+
var statuesRef = (0, _react.useRef)(statusesX);
|
|
12
|
+
var isChanged = (0, _useChanged.useChanged)(value);
|
|
13
|
+
return (0, _useReturn.useReturn)(function () {
|
|
14
|
+
var currentStatuses = statuesRef.current;
|
|
15
|
+
if (!isChanged) {
|
|
16
|
+
return currentStatuses;
|
|
17
|
+
}
|
|
18
|
+
var newStatuses = currentStatuses === statusesX ? statusesY : statusesX;
|
|
19
|
+
statuesRef.current = newStatuses;
|
|
20
|
+
return newStatuses;
|
|
21
|
+
});
|
|
22
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useChanged = void 0;
|
|
7
|
+
var _ahooks = require("ahooks");
|
|
8
|
+
var useChanged = exports.useChanged = function useChanged(value) {
|
|
9
|
+
var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (newValue, oldValue) {
|
|
10
|
+
return newValue !== oldValue;
|
|
11
|
+
};
|
|
12
|
+
var prevValue = (0, _ahooks.usePrevious)(value, function () {
|
|
13
|
+
/**
|
|
14
|
+
* 这里一定要返回 `true`,不然 `value` 没有改变的话,那么 `prevValue` 也不会变,
|
|
15
|
+
* 比如:首次 `value=1`,那么 `prevValue` 的值会一直是 `undefined`,
|
|
16
|
+
* 就算组件刷新了无数次,它也是 `undefined`。
|
|
17
|
+
*
|
|
18
|
+
* 而我们期望的是:当组件第二次刷新,`prevValue` 应该是 `1`。
|
|
19
|
+
*/
|
|
20
|
+
return true;
|
|
21
|
+
});
|
|
22
|
+
return callback(value, prevValue);
|
|
23
|
+
};
|
|
@@ -4,21 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.useContext = void 0;
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
var _useConstant2 = require("../useConstant");
|
|
8
|
+
var _useReturn = require("../useReturn");
|
|
9
|
+
var _contextUseCase = require("../../usecases/contextUseCase");
|
|
10
|
+
var useContext = exports.useContext = function useContext(usecase, isEntityRoot) {
|
|
11
|
+
var _useConstant = (0, _useConstant2.useConstant)(_contextUseCase.contextUseCase),
|
|
12
|
+
getContext = _useConstant.getContext,
|
|
13
|
+
registerUseCase = _useConstant.registerUseCase,
|
|
14
|
+
unregisterUseCase = _useConstant.unregisterUseCase;
|
|
15
|
+
return (0, _useReturn.useReturn)(function () {
|
|
16
|
+
if (isEntityRoot) {
|
|
17
|
+
return registerUseCase(usecase);
|
|
18
|
+
}
|
|
19
|
+
return getContext(usecase);
|
|
20
|
+
}, function () {
|
|
21
|
+
if (!isEntityRoot) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
unregisterUseCase(usecase);
|
|
25
|
+
}, [usecase, isEntityRoot]);
|
|
24
26
|
};
|
|
@@ -6,14 +6,13 @@ var _ = require(".");
|
|
|
6
6
|
var _globals = require("@jest/globals");
|
|
7
7
|
var _react = require("@testing-library/react");
|
|
8
8
|
var _react2 = require("react");
|
|
9
|
-
var _ArgumentTypes = require("../../enums/ArgumentTypes");
|
|
10
9
|
var testUseCase = function testUseCase() {
|
|
11
10
|
return {};
|
|
12
11
|
};
|
|
13
12
|
(0, _globals.describe)('useContext', function () {
|
|
14
|
-
(0, _globals.test)('should return the default context with value `null` if map has not saved a usecase
|
|
13
|
+
(0, _globals.test)('should return the default context with value `null` if map has not saved a usecase without entity root mode', function () {
|
|
15
14
|
var _renderHook = (0, _react.renderHook)(function () {
|
|
16
|
-
var context = (0, _.useContext)(testUseCase);
|
|
15
|
+
var context = (0, _.useContext)(testUseCase, false);
|
|
17
16
|
var value = (0, _react2.useContext)(context);
|
|
18
17
|
return value;
|
|
19
18
|
}),
|
|
@@ -21,41 +20,31 @@ var testUseCase = function testUseCase() {
|
|
|
21
20
|
var current = result.current;
|
|
22
21
|
(0, _globals.expect)(current).toBe(null);
|
|
23
22
|
});
|
|
24
|
-
(0, _globals.test)('should return the default context with value `null`
|
|
23
|
+
(0, _globals.test)('should return the default context with value `null` after unmount this hook', function () {
|
|
25
24
|
var _renderHook2 = (0, _react.renderHook)(function () {
|
|
26
|
-
var context = (0, _.useContext)(testUseCase,
|
|
25
|
+
var context = (0, _.useContext)(testUseCase, false);
|
|
27
26
|
var value = (0, _react2.useContext)(context);
|
|
28
27
|
return value;
|
|
29
28
|
}),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
(0, _globals.expect)(current).toBe(null);
|
|
33
|
-
});
|
|
34
|
-
(0, _globals.test)('should return the default context with value `null` as unmount this hook', function () {
|
|
35
|
-
var _renderHook3 = (0, _react.renderHook)(function () {
|
|
36
|
-
var context = (0, _.useContext)(testUseCase, _ArgumentTypes.ArgumentTypes.None);
|
|
37
|
-
var value = (0, _react2.useContext)(context);
|
|
38
|
-
return value;
|
|
39
|
-
}),
|
|
40
|
-
result1 = _renderHook3.result,
|
|
41
|
-
unmount1 = _renderHook3.unmount;
|
|
29
|
+
result1 = _renderHook2.result,
|
|
30
|
+
unmount1 = _renderHook2.unmount;
|
|
42
31
|
var current1 = result1.current;
|
|
43
32
|
(0, _globals.expect)((0, _typeof2["default"])(current1)).toBe('object');
|
|
44
33
|
unmount1();
|
|
45
|
-
var
|
|
46
|
-
var context = (0, _.useContext)(testUseCase,
|
|
34
|
+
var _renderHook3 = (0, _react.renderHook)(function () {
|
|
35
|
+
var context = (0, _.useContext)(testUseCase, false);
|
|
47
36
|
var value = (0, _react2.useContext)(context);
|
|
48
37
|
return value;
|
|
49
38
|
}),
|
|
50
|
-
result2 =
|
|
39
|
+
result2 = _renderHook3.result;
|
|
51
40
|
var current2 = result2.current;
|
|
52
41
|
(0, _globals.expect)(current2).toBe(null);
|
|
53
42
|
});
|
|
54
|
-
(0, _globals.test)('should return a new context if map has not saved a usecase with
|
|
55
|
-
var
|
|
56
|
-
return (0, _.useContext)(testUseCase,
|
|
43
|
+
(0, _globals.test)('should return a new context if map has not saved a usecase with entity root mode', function () {
|
|
44
|
+
var _renderHook4 = (0, _react.renderHook)(function () {
|
|
45
|
+
return (0, _.useContext)(testUseCase, true);
|
|
57
46
|
}),
|
|
58
|
-
result =
|
|
47
|
+
result = _renderHook4.result;
|
|
59
48
|
var current = result.current;
|
|
60
49
|
(0, _globals.expect)((0, _typeof2["default"])(current)).toBe('object');
|
|
61
50
|
});
|
|
@@ -4,23 +4,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.useContextValue = void 0;
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var useContextValue = exports.useContextValue = function useContextValue(store, reducers,
|
|
10
|
-
var
|
|
11
|
-
return (0,
|
|
12
|
-
void entity;
|
|
13
|
-
if ((statuses & _Statuses.Statuses.EntityEnabled) === _Statuses.Statuses.EntityEnabled) {
|
|
14
|
-
return {
|
|
15
|
-
store: store,
|
|
16
|
-
reducers: reducers,
|
|
17
|
-
optionsSet: optionsSet,
|
|
18
|
-
statuses: statuses
|
|
19
|
-
};
|
|
20
|
-
}
|
|
7
|
+
var _useReturn = require("../useReturn");
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
var useContextValue = exports.useContextValue = function useContextValue(entity, store, reducers, statuses) {
|
|
10
|
+
var key = (0, _react.useId)();
|
|
11
|
+
return (0, _useReturn.useReturn)(function () {
|
|
21
12
|
return {
|
|
13
|
+
key: key,
|
|
14
|
+
store: store,
|
|
22
15
|
reducers: reducers,
|
|
23
16
|
statuses: statuses
|
|
24
17
|
};
|
|
25
|
-
}, [entity, store, reducers,
|
|
18
|
+
}, [key, entity, store, reducers, statuses]);
|
|
26
19
|
};
|
|
@@ -4,24 +4,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.useDepsKey = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _useChanged = require("../useChanged");
|
|
8
|
+
var _useConstant2 = require("../useConstant");
|
|
8
9
|
var _ahooks = require("ahooks");
|
|
9
10
|
var _react = require("react");
|
|
10
11
|
var _objectUtilsUseCase = require("../../usecases/objectUtilsUseCase");
|
|
11
12
|
var useDepsKey = exports.useDepsKey = function useDepsKey(deps) {
|
|
12
13
|
var keyRef = (0, _react.useRef)(0);
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
var _useConstant = (0, _useConstant2.useConstant)(_objectUtilsUseCase.objectUtilsUseCase),
|
|
15
|
+
isEqual = _useConstant.isEqual;
|
|
16
|
+
var isChanged = (0, _useChanged.useChanged)(deps, function (newDeps, oldDeps) {
|
|
17
|
+
return !isEqual(newDeps, oldDeps);
|
|
18
|
+
});
|
|
19
|
+
var onCreate = (0, _ahooks.useMemoizedFn)(function () {
|
|
18
20
|
var key = keyRef.current;
|
|
19
|
-
if (
|
|
21
|
+
if (!isChanged) {
|
|
20
22
|
return key;
|
|
21
23
|
}
|
|
22
24
|
var newKey = key + 1;
|
|
23
25
|
keyRef.current = newKey;
|
|
24
26
|
return newKey;
|
|
25
27
|
});
|
|
26
|
-
return
|
|
28
|
+
return onCreate();
|
|
27
29
|
};
|