@mic-rexjs/usecases-react 2.13.6 → 2.14.0

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.
@@ -1666,13 +1666,14 @@ describe('useUseCase', () => {
1666
1666
  });
1667
1667
  });
1668
1668
  test('`options.watch` should work with field path of array length', () => {
1669
+ const defaultList = [];
1669
1670
  const onEntityLengthChange = jest.fn();
1670
1671
  const onListLengthChange = jest.fn();
1671
1672
  const lengthUseCase = () => {
1672
1673
  return entityUseCase();
1673
1674
  };
1674
1675
  const _renderHook32 = renderHook(() => {
1675
- return useUseCase([], lengthUseCase, {
1676
+ return useUseCase(defaultList, lengthUseCase, {
1676
1677
  watch: {
1677
1678
  length: onEntityLengthChange,
1678
1679
  'list.length': onListLengthChange
@@ -1937,6 +1938,53 @@ describe('useUseCase', () => {
1937
1938
  expect(onStringMount).toHaveBeenCalledWith('hello');
1938
1939
  expect(onBooleanMount).toHaveBeenCalledWith(true);
1939
1940
  });
1941
+ test('`bindEntity` should be called when component mount', () => {
1942
+ const bindEntity = jest.fn(entity => {
1943
+ void entity;
1944
+ });
1945
+ const testUseCase = () => {
1946
+ const entityReducers = entityUseCase();
1947
+ return {
1948
+ ...entityReducers,
1949
+ bindEntity
1950
+ };
1951
+ };
1952
+ renderHook(() => {
1953
+ const _useUseCase24 = useUseCase(5, testUseCase),
1954
+ _useUseCase25 = _slicedToArray(_useUseCase24, 2),
1955
+ setEntity = _useUseCase25[1].setEntity;
1956
+ useMount(() => {
1957
+ setEntity(100);
1958
+ });
1959
+ });
1960
+ expect(bindEntity).toHaveBeenCalledTimes(1);
1961
+ expect(bindEntity).toHaveBeenCalledWith(5);
1962
+ });
1963
+ test('`unbindEntity` should be called when component unmount', () => {
1964
+ const unbindEntity = jest.fn(entity => {
1965
+ void entity;
1966
+ });
1967
+ const testUseCase = () => {
1968
+ const entityReducers = entityUseCase();
1969
+ return {
1970
+ ...entityReducers,
1971
+ unbindEntity
1972
+ };
1973
+ };
1974
+ const _renderHook35 = renderHook(() => {
1975
+ const _useUseCase26 = useUseCase(5, testUseCase),
1976
+ _useUseCase27 = _slicedToArray(_useUseCase26, 2),
1977
+ setEntity = _useUseCase27[1].setEntity;
1978
+ useMount(() => {
1979
+ setEntity(100);
1980
+ });
1981
+ }),
1982
+ unmount = _renderHook35.unmount;
1983
+ expect(unbindEntity).toHaveBeenCalledTimes(0);
1984
+ unmount();
1985
+ expect(unbindEntity).toHaveBeenCalledTimes(1);
1986
+ expect(unbindEntity).toHaveBeenCalledWith(100);
1987
+ });
1940
1988
  });
1941
1989
  describe('`useUseCase` should work the same as `useContextualCoreCollection`', () => {
1942
1990
  test('Provider should be returned in child component', () => {
@@ -1953,14 +2001,14 @@ describe('useUseCase', () => {
1953
2001
  return _jsx(Fragment, {});
1954
2002
  };
1955
2003
  const TestParent = () => {
1956
- const _useUseCase24 = useUseCase(() => {
2004
+ const _useUseCase28 = useUseCase(() => {
1957
2005
  return {
1958
2006
  ...defaultFile,
1959
2007
  ext: EXT_1
1960
2008
  };
1961
2009
  }, fileUseCase),
1962
- _useUseCase25 = _slicedToArray(_useUseCase24, 3),
1963
- Provider = _useUseCase25[2];
2010
+ _useUseCase29 = _slicedToArray(_useUseCase28, 3),
2011
+ Provider = _useUseCase29[2];
1964
2012
  return _jsx(Provider, {
1965
2013
  children: _jsx(TestChild, {})
1966
2014
  });
@@ -1977,10 +2025,10 @@ describe('useUseCase', () => {
1977
2025
  const onPopupFile = jest.fn();
1978
2026
  const buttonText = 'button';
1979
2027
  const Popup = () => {
1980
- const _useUseCase26 = useUseCase(fileUseCase),
1981
- _useUseCase27 = _slicedToArray(_useUseCase26, 2),
1982
- file = _useUseCase27[0],
1983
- setEntity = _useUseCase27[1].setEntity;
2028
+ const _useUseCase30 = useUseCase(fileUseCase),
2029
+ _useUseCase31 = _slicedToArray(_useUseCase30, 2),
2030
+ file = _useUseCase31[0],
2031
+ setEntity = _useUseCase31[1].setEntity;
1984
2032
  const onClick = () => {
1985
2033
  setEntity({
1986
2034
  ext: EXT_2
@@ -1995,15 +2043,15 @@ describe('useUseCase', () => {
1995
2043
  });
1996
2044
  };
1997
2045
  const TestChild = () => {
1998
- const _useUseCase28 = useUseCase(fileUseCase),
1999
- _useUseCase29 = _slicedToArray(_useUseCase28, 3),
2000
- Provider = _useUseCase29[2];
2046
+ const _useUseCase32 = useUseCase(fileUseCase),
2047
+ _useUseCase33 = _slicedToArray(_useUseCase32, 3),
2048
+ Provider = _useUseCase33[2];
2001
2049
  return createPortal(_jsx(Provider, {
2002
2050
  children: _jsx(Popup, {})
2003
2051
  }), document.body);
2004
2052
  };
2005
2053
  const TestParent = () => {
2006
- const _useUseCase30 = useUseCase(() => {
2054
+ const _useUseCase34 = useUseCase(() => {
2007
2055
  return {
2008
2056
  ...defaultFile,
2009
2057
  ext: EXT_1
@@ -2011,9 +2059,9 @@ describe('useUseCase', () => {
2011
2059
  }, fileUseCase, {
2012
2060
  onChange
2013
2061
  }),
2014
- _useUseCase31 = _slicedToArray(_useUseCase30, 3),
2015
- file = _useUseCase31[0],
2016
- Provider = _useUseCase31[2];
2062
+ _useUseCase35 = _slicedToArray(_useUseCase34, 3),
2063
+ file = _useUseCase35[0],
2064
+ Provider = _useUseCase35[2];
2017
2065
  useEffect(() => {
2018
2066
  onRootFile(file);
2019
2067
  }, [file]);
@@ -2078,9 +2126,9 @@ describe('useUseCase', () => {
2078
2126
  return _jsx(Fragment, {});
2079
2127
  };
2080
2128
  const B = () => {
2081
- const _useUseCase32 = useUseCase(defaultFile, mockUseCase),
2082
- _useUseCase33 = _slicedToArray(_useUseCase32, 3),
2083
- Provider = _useUseCase33[2];
2129
+ const _useUseCase36 = useUseCase(defaultFile, mockUseCase),
2130
+ _useUseCase37 = _slicedToArray(_useUseCase36, 3),
2131
+ Provider = _useUseCase37[2];
2084
2132
  return _jsx(Provider, {
2085
2133
  children: _jsx(A, {})
2086
2134
  });
@@ -2101,9 +2149,9 @@ describe('useUseCase', () => {
2101
2149
  };
2102
2150
  };
2103
2151
  const A = () => {
2104
- const _useUseCase34 = useUseCase(stringUseCase),
2105
- _useUseCase35 = _slicedToArray(_useUseCase34, 2),
2106
- add = _useUseCase35[1].add;
2152
+ const _useUseCase38 = useUseCase(stringUseCase),
2153
+ _useUseCase39 = _slicedToArray(_useUseCase38, 2),
2154
+ add = _useUseCase39[1].add;
2107
2155
  const update = useUpdate();
2108
2156
  const onClick = () => {
2109
2157
  update();
@@ -2115,9 +2163,9 @@ describe('useUseCase', () => {
2115
2163
  });
2116
2164
  };
2117
2165
  const B = () => {
2118
- const _useUseCase36 = useUseCase('', stringUseCase),
2119
- _useUseCase37 = _slicedToArray(_useUseCase36, 3),
2120
- Provider = _useUseCase37[2];
2166
+ const _useUseCase40 = useUseCase('', stringUseCase),
2167
+ _useUseCase41 = _slicedToArray(_useUseCase40, 3),
2168
+ Provider = _useUseCase41[2];
2121
2169
  return _jsx(Provider, {
2122
2170
  children: _jsx(A, {})
2123
2171
  });
@@ -2142,9 +2190,9 @@ describe('useUseCase', () => {
2142
2190
  };
2143
2191
  };
2144
2192
  const A = () => {
2145
- const _useUseCase38 = useUseCase(stringUseCase),
2146
- _useUseCase39 = _slicedToArray(_useUseCase38, 2),
2147
- add = _useUseCase39[1].add;
2193
+ const _useUseCase42 = useUseCase(stringUseCase),
2194
+ _useUseCase43 = _slicedToArray(_useUseCase42, 2),
2195
+ add = _useUseCase43[1].add;
2148
2196
  const onClick = () => {
2149
2197
  add('x');
2150
2198
  };
@@ -2158,9 +2206,9 @@ describe('useUseCase', () => {
2158
2206
  });
2159
2207
  };
2160
2208
  const B = () => {
2161
- const _useUseCase40 = useUseCase('', stringUseCase),
2162
- _useUseCase41 = _slicedToArray(_useUseCase40, 3),
2163
- Provider = _useUseCase41[2];
2209
+ const _useUseCase44 = useUseCase('', stringUseCase),
2210
+ _useUseCase45 = _slicedToArray(_useUseCase44, 3),
2211
+ Provider = _useUseCase45[2];
2164
2212
  return _jsx(Provider, {
2165
2213
  children: _jsx(A, {})
2166
2214
  });
@@ -2189,11 +2237,11 @@ describe('useUseCase', () => {
2189
2237
  };
2190
2238
  };
2191
2239
  const A = () => {
2192
- const _useUseCase42 = useUseCase(stringUseCase),
2193
- _useUseCase43 = _slicedToArray(_useUseCase42, 2),
2194
- _useUseCase43$ = _useUseCase43[1],
2195
- add = _useUseCase43$.add,
2196
- setEntity = _useUseCase43$.setEntity;
2240
+ const _useUseCase46 = useUseCase(stringUseCase),
2241
+ _useUseCase47 = _slicedToArray(_useUseCase46, 2),
2242
+ _useUseCase47$ = _useUseCase47[1],
2243
+ add = _useUseCase47$.add,
2244
+ setEntity = _useUseCase47$.setEntity;
2197
2245
  const update = useUpdate();
2198
2246
  add(addedText);
2199
2247
  const onSet = () => {
@@ -2213,9 +2261,9 @@ describe('useUseCase', () => {
2213
2261
  });
2214
2262
  };
2215
2263
  const B = () => {
2216
- const _useUseCase44 = useUseCase('', stringUseCase),
2217
- _useUseCase45 = _slicedToArray(_useUseCase44, 3),
2218
- Provider = _useUseCase45[2];
2264
+ const _useUseCase48 = useUseCase('', stringUseCase),
2265
+ _useUseCase49 = _slicedToArray(_useUseCase48, 3),
2266
+ Provider = _useUseCase49[2];
2219
2267
  return _jsx(Provider, {
2220
2268
  children: _jsx(A, {})
2221
2269
  });
@@ -2260,12 +2308,12 @@ describe('useUseCase', () => {
2260
2308
  return _jsx(Fragment, {});
2261
2309
  };
2262
2310
  const C = () => {
2263
- const _useUseCase46 = useUseCase(defaultFile, fileUseCase, {
2311
+ const _useUseCase50 = useUseCase(defaultFile, fileUseCase, {
2264
2312
  onChange: onChangeC
2265
2313
  }),
2266
- _useUseCase47 = _slicedToArray(_useUseCase46, 3),
2267
- setPath = _useUseCase47[1].setPath,
2268
- Provider = _useUseCase47[2];
2314
+ _useUseCase51 = _slicedToArray(_useUseCase50, 3),
2315
+ setPath = _useUseCase51[1].setPath,
2316
+ Provider = _useUseCase51[2];
2269
2317
  const onFirstClick = () => {
2270
2318
  setPath(PATH_1);
2271
2319
  };
@@ -2292,11 +2340,11 @@ describe('useUseCase', () => {
2292
2340
  const firstButtonText = 'first button';
2293
2341
  const secondButtonText = 'second button';
2294
2342
  const A = () => {
2295
- const _useUseCase48 = useUseCase(fileUseCase, {
2343
+ const _useUseCase52 = useUseCase(fileUseCase, {
2296
2344
  onChange
2297
2345
  }),
2298
- _useUseCase49 = _slicedToArray(_useUseCase48, 2),
2299
- setPath = _useUseCase49[1].setPath;
2346
+ _useUseCase53 = _slicedToArray(_useUseCase52, 2),
2347
+ setPath = _useUseCase53[1].setPath;
2300
2348
  const onFirstClick = () => {
2301
2349
  setPath(PATH_1);
2302
2350
  onChange = onSecondChange;
@@ -2315,9 +2363,9 @@ describe('useUseCase', () => {
2315
2363
  });
2316
2364
  };
2317
2365
  const B = () => {
2318
- const _useUseCase50 = useUseCase(defaultFile, fileUseCase),
2319
- _useUseCase51 = _slicedToArray(_useUseCase50, 3),
2320
- Provider = _useUseCase51[2];
2366
+ const _useUseCase54 = useUseCase(defaultFile, fileUseCase),
2367
+ _useUseCase55 = _slicedToArray(_useUseCase54, 3),
2368
+ Provider = _useUseCase55[2];
2321
2369
  return _jsx(Provider, {
2322
2370
  children: _jsx(A, {})
2323
2371
  });
@@ -2340,13 +2388,13 @@ describe('useUseCase', () => {
2340
2388
  const onExtChange = jest.fn();
2341
2389
  const firstButtonText = 'first button';
2342
2390
  const A = () => {
2343
- const _useUseCase52 = useUseCase(fileUseCase, {
2391
+ const _useUseCase56 = useUseCase(fileUseCase, {
2344
2392
  watch: {
2345
2393
  ext: onExtChange
2346
2394
  }
2347
2395
  }),
2348
- _useUseCase53 = _slicedToArray(_useUseCase52, 2),
2349
- setPath = _useUseCase53[1].setPath;
2396
+ _useUseCase57 = _slicedToArray(_useUseCase56, 2),
2397
+ setPath = _useUseCase57[1].setPath;
2350
2398
  const onFirstClick = () => {
2351
2399
  setPath(PATH_1);
2352
2400
  };
@@ -2356,9 +2404,9 @@ describe('useUseCase', () => {
2356
2404
  });
2357
2405
  };
2358
2406
  const B = () => {
2359
- const _useUseCase54 = useUseCase(defaultFile, fileUseCase, {}),
2360
- _useUseCase55 = _slicedToArray(_useUseCase54, 3),
2361
- Provider = _useUseCase55[2];
2407
+ const _useUseCase58 = useUseCase(defaultFile, fileUseCase, {}),
2408
+ _useUseCase59 = _slicedToArray(_useUseCase58, 3),
2409
+ Provider = _useUseCase59[2];
2362
2410
  return _jsx(Provider, {
2363
2411
  children: _jsx(A, {})
2364
2412
  });
@@ -2409,14 +2457,14 @@ describe('useUseCase', () => {
2409
2457
  return _jsx(Fragment, {});
2410
2458
  };
2411
2459
  const C = () => {
2412
- const _useUseCase56 = useUseCase(defaultFile, fileUseCase, {
2460
+ const _useUseCase60 = useUseCase(defaultFile, fileUseCase, {
2413
2461
  watch: {
2414
2462
  ext: onChangeC
2415
2463
  }
2416
2464
  }),
2417
- _useUseCase57 = _slicedToArray(_useUseCase56, 3),
2418
- setPath = _useUseCase57[1].setPath,
2419
- Provider = _useUseCase57[2];
2465
+ _useUseCase61 = _slicedToArray(_useUseCase60, 3),
2466
+ setPath = _useUseCase61[1].setPath,
2467
+ Provider = _useUseCase61[2];
2420
2468
  const onFirstClick = () => {
2421
2469
  setPath(PATH_1);
2422
2470
  };
@@ -2443,13 +2491,13 @@ describe('useUseCase', () => {
2443
2491
  const firstButtonText = 'first button';
2444
2492
  const secondButtonText = 'second button';
2445
2493
  const A = () => {
2446
- const _useUseCase58 = useUseCase(fileUseCase, {
2494
+ const _useUseCase62 = useUseCase(fileUseCase, {
2447
2495
  watch: {
2448
2496
  ext: onExtChange
2449
2497
  }
2450
2498
  }),
2451
- _useUseCase59 = _slicedToArray(_useUseCase58, 2),
2452
- setPath = _useUseCase59[1].setPath;
2499
+ _useUseCase63 = _slicedToArray(_useUseCase62, 2),
2500
+ setPath = _useUseCase63[1].setPath;
2453
2501
  const onFirstClick = () => {
2454
2502
  setPath(PATH_1);
2455
2503
  onExtChange = onSecondExtChange;
@@ -2468,9 +2516,9 @@ describe('useUseCase', () => {
2468
2516
  });
2469
2517
  };
2470
2518
  const B = () => {
2471
- const _useUseCase60 = useUseCase(defaultFile, fileUseCase),
2472
- _useUseCase61 = _slicedToArray(_useUseCase60, 3),
2473
- Provider = _useUseCase61[2];
2519
+ const _useUseCase64 = useUseCase(defaultFile, fileUseCase),
2520
+ _useUseCase65 = _slicedToArray(_useUseCase64, 3),
2521
+ Provider = _useUseCase65[2];
2474
2522
  return _jsx(Provider, {
2475
2523
  children: _jsx(A, {})
2476
2524
  });
@@ -2498,38 +2546,38 @@ describe('useUseCase', () => {
2498
2546
  });
2499
2547
  describe('`useUseCase` should work the same as `useReducers`', () => {
2500
2548
  test('`entity` should equal `defaultFile`', () => {
2501
- const _renderHook35 = renderHook(() => {
2549
+ const _renderHook36 = renderHook(() => {
2502
2550
  return useUseCase(mathUseCase);
2503
2551
  }),
2504
- result = _renderHook35.result;
2552
+ result = _renderHook36.result;
2505
2553
  const reducers = result.current;
2506
2554
  expect(Array.isArray(reducers)).toBe(false);
2507
2555
  });
2508
2556
  test('returned reducer should work', () => {
2509
- const _renderHook36 = renderHook(() => {
2557
+ const _renderHook37 = renderHook(() => {
2510
2558
  return useUseCase(mathUseCase);
2511
2559
  }),
2512
- result = _renderHook36.result;
2560
+ result = _renderHook37.result;
2513
2561
  const reducers = result.current;
2514
2562
  const add = reducers.add;
2515
2563
  expect(add(1, 2)).toBe(3);
2516
2564
  });
2517
2565
  test('`usecase` should be called only once if deps has not provided', () => {
2518
2566
  const mockUseCase = jest.fn(mathUseCase);
2519
- const _renderHook37 = renderHook(() => {
2567
+ const _renderHook38 = renderHook(() => {
2520
2568
  return useUseCase(mockUseCase);
2521
2569
  }),
2522
- rerender = _renderHook37.rerender;
2570
+ rerender = _renderHook38.rerender;
2523
2571
  expect(mockUseCase).toHaveBeenCalledTimes(1);
2524
2572
  rerender();
2525
2573
  expect(mockUseCase).toHaveBeenCalledTimes(1);
2526
2574
  });
2527
2575
  test('`usecase` should be called only once if deps has not changed', () => {
2528
2576
  const mockUseCase = jest.fn(mathUseCase);
2529
- const _renderHook38 = renderHook(() => {
2577
+ const _renderHook39 = renderHook(() => {
2530
2578
  return useUseCase(mockUseCase, {}, [1, 'x']);
2531
2579
  }),
2532
- rerender = _renderHook38.rerender;
2580
+ rerender = _renderHook39.rerender;
2533
2581
  expect(mockUseCase).toHaveBeenCalledTimes(1);
2534
2582
  rerender();
2535
2583
  expect(mockUseCase).toHaveBeenCalledTimes(1);
@@ -2537,10 +2585,10 @@ describe('useUseCase', () => {
2537
2585
  test('`usecase` should be called if deps has changed', () => {
2538
2586
  let i = 0;
2539
2587
  const mockUseCase = jest.fn(mathUseCase);
2540
- const _renderHook39 = renderHook(() => {
2588
+ const _renderHook40 = renderHook(() => {
2541
2589
  return useUseCase(mockUseCase, {}, [i++, 'x']);
2542
2590
  }),
2543
- rerender = _renderHook39.rerender;
2591
+ rerender = _renderHook40.rerender;
2544
2592
  expect(mockUseCase).toHaveBeenCalledTimes(1);
2545
2593
  rerender();
2546
2594
  expect(mockUseCase).toHaveBeenCalledTimes(2);
@@ -2548,8 +2596,8 @@ describe('useUseCase', () => {
2548
2596
  test('reducer call should not be cached if component is at rendering phase', () => {
2549
2597
  const buttonText = 'button';
2550
2598
  const CacheTestComponent = () => {
2551
- const _useUseCase62 = useUseCase(mathUseCase),
2552
- subtraction = _useUseCase62.subtraction;
2599
+ const _useUseCase66 = useUseCase(mathUseCase),
2600
+ subtraction = _useUseCase66.subtraction;
2553
2601
  const update = useUpdate();
2554
2602
  const onClick = () => {
2555
2603
  update();
@@ -2572,8 +2620,8 @@ describe('useUseCase', () => {
2572
2620
  test('reducer call should not be cached if component is not at rendering phase', () => {
2573
2621
  const buttonText = 'button';
2574
2622
  const CacheTestComponent = () => {
2575
- const _useUseCase63 = useUseCase(mathUseCase),
2576
- subtraction = _useUseCase63.subtraction;
2623
+ const _useUseCase67 = useUseCase(mathUseCase),
2624
+ subtraction = _useUseCase67.subtraction;
2577
2625
  const onClick = () => {
2578
2626
  subtraction(5, 3);
2579
2627
  };
@@ -2601,8 +2649,8 @@ describe('useUseCase', () => {
2601
2649
  let count = 0;
2602
2650
  const buttonText = 'button';
2603
2651
  const StringUseCaseTestComponent = () => {
2604
- const _useUseCase64 = useUseCase(mathUseCase),
2605
- subtraction = _useUseCase64.subtraction;
2652
+ const _useUseCase68 = useUseCase(mathUseCase),
2653
+ subtraction = _useUseCase68.subtraction;
2606
2654
  const update = useUpdate();
2607
2655
  subtraction(5, count++);
2608
2656
  const onUpdate = () => {
@@ -2624,12 +2672,12 @@ describe('useUseCase', () => {
2624
2672
  expect(subtractionReducer).toHaveReturnedWith(4);
2625
2673
  });
2626
2674
  test('`options.extraValue` should be added after call `add` method', () => {
2627
- const _renderHook40 = renderHook(() => {
2675
+ const _renderHook41 = renderHook(() => {
2628
2676
  return useUseCase(mathUseCase, {
2629
2677
  extraValue: 5
2630
2678
  });
2631
2679
  }),
2632
- result = _renderHook40.result;
2680
+ result = _renderHook41.result;
2633
2681
  const reducers = result.current;
2634
2682
  const add = reducers.add;
2635
2683
  expect(add(1, 2)).toBe(8);
@@ -2637,7 +2685,7 @@ describe('useUseCase', () => {
2637
2685
  test('when `options` has changed, it should not trigger update', () => {
2638
2686
  const onUpdate = jest.fn();
2639
2687
  const onDeepUpdate = jest.fn();
2640
- const _renderHook41 = renderHook(() => {
2688
+ const _renderHook42 = renderHook(() => {
2641
2689
  const _useState7 = useState(0),
2642
2690
  _useState8 = _slicedToArray(_useState7, 2),
2643
2691
  extraValue = _useState8[0],
@@ -2653,7 +2701,7 @@ describe('useUseCase', () => {
2653
2701
  }, [reducers]);
2654
2702
  return setExtraValue;
2655
2703
  }),
2656
- result = _renderHook41.result;
2704
+ result = _renderHook42.result;
2657
2705
  expect(onUpdate).toHaveBeenCalledTimes(0);
2658
2706
  expect(onDeepUpdate).toHaveBeenCalledTimes(0);
2659
2707
  act(() => {
@@ -2665,7 +2713,7 @@ describe('useUseCase', () => {
2665
2713
  test('when `deps` change, it should update reducers', () => {
2666
2714
  const onUpdate = jest.fn();
2667
2715
  const onDeepUpdate = jest.fn();
2668
- const _renderHook42 = renderHook(() => {
2716
+ const _renderHook43 = renderHook(() => {
2669
2717
  const _useState9 = useState(0),
2670
2718
  _useState0 = _slicedToArray(_useState9, 2),
2671
2719
  extraValue = _useState0[0],
@@ -2681,7 +2729,7 @@ describe('useUseCase', () => {
2681
2729
  }, [reducers]);
2682
2730
  return setExtraValue;
2683
2731
  }),
2684
- result = _renderHook42.result;
2732
+ result = _renderHook43.result;
2685
2733
  expect(onUpdate).toHaveBeenCalledTimes(0);
2686
2734
  expect(onDeepUpdate).toHaveBeenCalledTimes(0);
2687
2735
  act(() => {
@@ -2693,7 +2741,7 @@ describe('useUseCase', () => {
2693
2741
  test('empty `deps` should not update reducers', () => {
2694
2742
  const onUpdate = jest.fn();
2695
2743
  const onDeepUpdate = jest.fn();
2696
- const _renderHook43 = renderHook(() => {
2744
+ const _renderHook44 = renderHook(() => {
2697
2745
  const _useState1 = useState(0),
2698
2746
  _useState10 = _slicedToArray(_useState1, 2),
2699
2747
  extraValue = _useState10[0],
@@ -2709,7 +2757,7 @@ describe('useUseCase', () => {
2709
2757
  }, [reducers]);
2710
2758
  return setExtraValue;
2711
2759
  }),
2712
- result = _renderHook43.result;
2760
+ result = _renderHook44.result;
2713
2761
  expect(onUpdate).toHaveBeenCalledTimes(0);
2714
2762
  expect(onDeepUpdate).toHaveBeenCalledTimes(0);
2715
2763
  act(() => {
@@ -5,26 +5,97 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useEntity = void 0;
7
7
  var _useConstantEntityReducers = require("../useConstantEntityReducers");
8
+ var _useExec = require("../useExec");
9
+ var _ahooks = require("ahooks");
10
+ var _react = require("react");
8
11
  var _Statuses = require("../../enums/Statuses");
12
+ var _triggerWatchers = require("../../methods/triggerWatchers");
9
13
  var _valueUseCase = require("../../usecases/valueUseCase");
10
- var useEntity = exports.useEntity = function useEntity(store, entityArg, statuses) {
14
+ var useEntity = exports.useEntity = function useEntity(entityArg, store, reducers, statuses, options) {
15
+ var update = (0, _ahooks.useUpdate)();
16
+ var isFunction = typeof entityArg === 'function';
17
+ var entity = store.value;
18
+ var isFirstRef = (0, _react.useRef)(true);
19
+ var optionsRef = (0, _ahooks.useLatest)(options);
20
+ var prevEntityRef = (0, _react.useRef)(entity);
21
+ var entityEnabled = (statuses & _Statuses.Statuses.EntityEnabled) === _Statuses.Statuses.EntityEnabled;
22
+ var entityRootEnabled = (statuses & _Statuses.Statuses.EntityRootEnabled) === _Statuses.Statuses.EntityRootEnabled;
23
+ var bindEntity = reducers.bindEntity,
24
+ unbindEntity = reducers.unbindEntity;
11
25
  var _useConstantEntityRed = (0, _useConstantEntityReducers.useConstantEntityReducers)(entityArg, _valueUseCase.valueUseCase),
12
26
  isValueChanged = _useConstantEntityRed.isValueChanged,
13
27
  recordValue = _useConstantEntityRed.recordValue;
14
- var changed = isValueChanged(entityArg);
15
- var entityRootDisabled = (statuses & _Statuses.Statuses.EntityRootEnabled) !== _Statuses.Statuses.EntityRootEnabled;
16
- var isFunction = typeof entityArg === 'function';
17
- var value = store.value;
18
- switch (true) {
19
- case entityRootDisabled:
20
- case isFunction:
21
- case !changed:
22
- return value;
23
- }
24
- recordValue(entityArg);
25
- store.disableWatchers();
26
- // 执行同步操作
27
- store.setValue(entityArg);
28
- store.enableWatchers();
29
- return entityArg;
28
+ var onTriggerWatchers = (0, _ahooks.useMemoizedFn)(function (newEntity, oldEntity) {
29
+ var watch = optionsRef.current.watch;
30
+ if (!watch) {
31
+ return;
32
+ }
33
+ (0, _triggerWatchers.triggerWatchers)(watch, newEntity, oldEntity);
34
+ });
35
+ var onEntityChange = (0, _ahooks.useMemoizedFn)(function (newEntity, oldEntity) {
36
+ var onChange = optionsRef.current.onChange;
37
+ prevEntityRef.current = newEntity;
38
+ onTriggerWatchers(newEntity, oldEntity);
39
+ onChange === null || onChange === void 0 || onChange(newEntity, oldEntity);
40
+ if (!entityRootEnabled) {
41
+ return;
42
+ }
43
+ update();
44
+ });
45
+ var onValueChange = (0, _ahooks.useMemoizedFn)(function () {
46
+ if (!entityEnabled) {
47
+ return;
48
+ }
49
+ var prevEntity = prevEntityRef.current;
50
+ if (entity === prevEntity) {
51
+ return;
52
+ }
53
+ prevEntityRef.current = entity;
54
+ onTriggerWatchers(entity, prevEntity);
55
+ });
56
+ (0, _useExec.useExec)(function () {
57
+ var currentEntity = entityArg;
58
+ var isFirst = isFirstRef.current;
59
+ isFirstRef.current = false;
60
+ if (isFirst) {
61
+ var _bindEntity;
62
+ currentEntity = (_bindEntity = bindEntity === null || bindEntity === void 0 ? void 0 : bindEntity()) !== null && _bindEntity !== void 0 ? _bindEntity : currentEntity;
63
+ }
64
+ switch (true) {
65
+ case !entityRootEnabled:
66
+ case isFunction:
67
+ case !isValueChanged(currentEntity):
68
+ return;
69
+ }
70
+ recordValue(currentEntity);
71
+ store.disableWatchers();
72
+ // 执行同步操作
73
+ store.setValue(currentEntity);
74
+ store.enableWatchers();
75
+ });
76
+ /**
77
+ * 需要马上 `watch`,因为 `useEffect` 在子组件内优先执行,
78
+ * 如果使用了 `setEntity` 则无法监控到变化
79
+ */
80
+ (0, _useExec.useExec)(function () {
81
+ if (!entityEnabled) {
82
+ return;
83
+ }
84
+ store.watch(onEntityChange);
85
+ }, [entityEnabled, store, onEntityChange]);
86
+ /**
87
+ * 在变化时候,组件更新前,使用 `unwatch`
88
+ */
89
+ (0, _react.useEffect)(function () {
90
+ return function () {
91
+ store.unwatch(onEntityChange);
92
+ };
93
+ }, [entityEnabled, store, onEntityChange]);
94
+ (0, _ahooks.useUnmount)(function () {
95
+ unbindEntity === null || unbindEntity === void 0 || unbindEntity();
96
+ });
97
+ (0, _ahooks.useUpdateEffect)(function () {
98
+ onValueChange();
99
+ }, [entity, onValueChange]);
100
+ return store.value;
30
101
  };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useExec = void 0;
7
+ var _useDepsKey = require("../useDepsKey");
8
+ var _ahooks = require("ahooks");
9
+ var useExec = exports.useExec = function useExec(callback) {
10
+ var deps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [callback];
11
+ var depsKey = (0, _useDepsKey.useDepsKey)(deps);
12
+ var execCallback = (0, _ahooks.useMemoizedFn)(function () {
13
+ callback();
14
+ });
15
+ (0, _ahooks.useCreation)(function () {
16
+ void depsKey;
17
+ execCallback();
18
+ }, [depsKey, execCallback]);
19
+ };
@@ -27,7 +27,7 @@ var useReducers = exports.useReducers = function useReducers(usecase, context, s
27
27
  contextReducers = _ref$reducers === void 0 ? null : _ref$reducers;
28
28
  var _useConstantReducers = (0, _useConstantReducers2.useConstantReducers)(_methodUseCase.methodUseCase),
29
29
  captureCalls = _useConstantReducers.captureCalls;
30
- return (0, _useContextualItem.useContextualItem)(contextReducers, statuses, function () {
30
+ var reducers = (0, _useContextualItem.useContextualItem)(contextReducers, statuses, function () {
31
31
  var opts = captureCalls(options, function (key, callArgs) {
32
32
  var _optionsRef$current$k2;
33
33
  var _optionsRef$current$k, _optionsRef$current;
@@ -47,4 +47,5 @@ var useReducers = exports.useReducers = function useReducers(usecase, context, s
47
47
  }
48
48
  }));
49
49
  }, deps);
50
+ return reducers;
50
51
  };