@inseefr/lunatic 3.6.0 → 3.6.1

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.
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Run a callback on that will be run on the next render
3
+ */
4
+ export declare function useCallbackOnNextRender<T extends (...args: unknown[]) => void>(cb: T): T;
@@ -0,0 +1,28 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ /**
3
+ * Run a callback on that will be run on the next render
4
+ */
5
+ export function useCallbackOnNextRender(cb) {
6
+ const callOnNextRender = useRef(null);
7
+ const cbRef = useRef(cb);
8
+ cbRef.current = cb;
9
+ // use useEffect to run the callback at the end of the next render
10
+ useEffect(() => {
11
+ if (callOnNextRender.current === null) {
12
+ return;
13
+ }
14
+ try {
15
+ cbRef.current(...callOnNextRender.current);
16
+ }
17
+ catch (e) {
18
+ console.error(e);
19
+ }
20
+ callOnNextRender.current = null;
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- We want to run the callback when the value of the ref changed on the next render
22
+ }, [callOnNextRender.current]);
23
+ // When the function is called, we store the arguments to be called on the next render (when state was really updated)
24
+ return useCallback((...args) => {
25
+ callOnNextRender.current = args;
26
+ }, []);
27
+ }
28
+ //# sourceMappingURL=useCallbackOnNextRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCallbackOnNextRender.js","sourceRoot":"","sources":["../../../src/use-lunatic/hooks/useCallbackOnNextRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACtC,EAAK;IAEL,MAAM,gBAAgB,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;IAEnB,kEAAkE;IAClE,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,KAAK,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,2IAA2I;IAC5I,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/B,sHAAsH;IACtH,OAAO,WAAW,CAAC,CAAC,GAAG,IAAmB,EAAE,EAAE;QAC7C,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;IACjC,CAAC,EAAE,EAAE,CAAM,CAAC;AACb,CAAC"}
@@ -18,6 +18,7 @@ import { mergeDefault } from '../utils/object';
18
18
  import { useRefSync } from '../hooks/useRefSync';
19
19
  import { ConsoleLogger } from './logger/ConsoleLogger';
20
20
  import { useWarnDepChange } from './hooks/useWarnDepChange';
21
+ import { useCallbackOnNextRender } from './hooks/useCallbackOnNextRender';
21
22
  const empty = {}; // Keep the same empty object (to avoid problem with useEffect dependencies)
22
23
  const DEFAULT_DATA = empty;
23
24
  const DEFAULT_FEATURES = ['VTL', 'MD'];
@@ -107,10 +108,11 @@ argOptions = empty) {
107
108
  const goToPage = useCallback(function (payload) {
108
109
  dispatch(goToPageAction(payload));
109
110
  }, [dispatch]);
111
+ const onChangeAfterRender = useCallbackOnNextRender(onChange);
110
112
  const handleChanges = useCallback((responses) => {
111
113
  dispatch(handleChangesAction(responses));
112
- onChange(responses);
113
- }, [dispatch, onChange]);
114
+ onChangeAfterRender(responses);
115
+ }, [dispatch, onChangeAfterRender]);
114
116
  const getData = (withRefreshedCalculated, variableNames) => {
115
117
  return getQuestionnaireData(state.variables, source.variables, withRefreshedCalculated, variableNames);
116
118
  };
@@ -1 +1 @@
1
- {"version":3,"file":"use-lunatic.js","sourceRoot":"","sources":["../../src/use-lunatic/use-lunatic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-lunatic.js","sourceRoot":"","sources":["../../src/use-lunatic/use-lunatic.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inseefr/lunatic",
3
- "version": "3.6.0",
3
+ "version": "3.6.1",
4
4
  "description": "Library of questionnaire components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -381,6 +381,8 @@
381
381
  "src/use-lunatic/hooks/use-loop-variables.ts",
382
382
  "src/use-lunatic/hooks/use-page-has-response.test.ts",
383
383
  "src/use-lunatic/hooks/use-page-has-response.ts",
384
+ "src/use-lunatic/hooks/useCallbackOnNextRender.test.tsx",
385
+ "src/use-lunatic/hooks/useCallbackOnNextRender.ts",
384
386
  "src/use-lunatic/hooks/useOverview.spec.ts",
385
387
  "src/use-lunatic/hooks/useOverview.ts",
386
388
  "src/use-lunatic/hooks/useWarnDepChange.ts",
@@ -1437,6 +1439,9 @@
1437
1439
  "esm/use-lunatic/hooks/use-page-has-response.d.ts",
1438
1440
  "esm/use-lunatic/hooks/use-page-has-response.js",
1439
1441
  "esm/use-lunatic/hooks/use-page-has-response.js.map",
1442
+ "esm/use-lunatic/hooks/useCallbackOnNextRender.d.ts",
1443
+ "esm/use-lunatic/hooks/useCallbackOnNextRender.js",
1444
+ "esm/use-lunatic/hooks/useCallbackOnNextRender.js.map",
1440
1445
  "esm/use-lunatic/hooks/useOverview.d.ts",
1441
1446
  "esm/use-lunatic/hooks/useOverview.js",
1442
1447
  "esm/use-lunatic/hooks/useOverview.js.map",
@@ -1761,6 +1766,9 @@
1761
1766
  "use-lunatic/hooks/use-page-has-response.d.ts",
1762
1767
  "use-lunatic/hooks/use-page-has-response.js",
1763
1768
  "use-lunatic/hooks/use-page-has-response.js.map",
1769
+ "use-lunatic/hooks/useCallbackOnNextRender.d.ts",
1770
+ "use-lunatic/hooks/useCallbackOnNextRender.js",
1771
+ "use-lunatic/hooks/useCallbackOnNextRender.js.map",
1764
1772
  "use-lunatic/hooks/useOverview.d.ts",
1765
1773
  "use-lunatic/hooks/useOverview.js",
1766
1774
  "use-lunatic/hooks/useOverview.js.map",
@@ -226,7 +226,7 @@ function OrchestratorForStories(props: Readonly<Props>) {
226
226
  {tabs.map((t, k) => (
227
227
  <button
228
228
  tabIndex={-1}
229
- key={JSON.stringify(t.label)}
229
+ key={k}
230
230
  role="tab"
231
231
  onClick={() => setTab(k)}
232
232
  className={`tab gap-2 ${tab === k ? 'tab-active' : ''}`}
@@ -0,0 +1,50 @@
1
+ import { useState } from 'react';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { useCallbackOnNextRender } from './useCallbackOnNextRender.js';
4
+ import { act, fireEvent, render } from '@testing-library/react';
5
+
6
+ describe('useCallbackOnNextRender', () => {
7
+ // Since we want to test when the callback is called, we need to keep track of the count state inside the component
8
+ let countSpy = 0;
9
+
10
+ const FakeComponent = (props: { onChange: () => void }) => {
11
+ const onChange = useCallbackOnNextRender(props.onChange);
12
+ const [count, setCount] = useState(0);
13
+ countSpy = count;
14
+
15
+ const onClick = () => {
16
+ setCount((v) => v + 1);
17
+ onChange();
18
+ };
19
+
20
+ return <button onClick={onClick}>{count}</button>;
21
+ };
22
+
23
+ it('should call the callback on the next render', () => {
24
+ let resolveSpy: (e?: unknown) => void;
25
+ const spyPromise = new Promise((resolve) => {
26
+ resolveSpy = resolve;
27
+ });
28
+ const onChange = vi.fn(() => {
29
+ try {
30
+ expect(countSpy).toBe(1);
31
+ resolveSpy();
32
+ } catch (e) {
33
+ resolveSpy(e);
34
+ }
35
+ });
36
+ const { getByRole } = render(<FakeComponent onChange={onChange} />);
37
+ act(() => {
38
+ fireEvent.click(getByRole('button'));
39
+ });
40
+
41
+ expect(onChange).toHaveBeenCalledTimes(1);
42
+
43
+ return spyPromise.then((r) => {
44
+ if (r instanceof Error) {
45
+ throw r;
46
+ }
47
+ expect(countSpy).toBe(1);
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,31 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+
3
+ /**
4
+ * Run a callback on that will be run on the next render
5
+ */
6
+ export function useCallbackOnNextRender<T extends (...args: unknown[]) => void>(
7
+ cb: T
8
+ ): T {
9
+ const callOnNextRender = useRef<Parameters<T> | null>(null);
10
+ const cbRef = useRef(cb);
11
+ cbRef.current = cb;
12
+
13
+ // use useEffect to run the callback at the end of the next render
14
+ useEffect(() => {
15
+ if (callOnNextRender.current === null) {
16
+ return;
17
+ }
18
+ try {
19
+ cbRef.current(...callOnNextRender.current);
20
+ } catch (e) {
21
+ console.error(e);
22
+ }
23
+ callOnNextRender.current = null;
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- We want to run the callback when the value of the ref changed on the next render
25
+ }, [callOnNextRender.current]);
26
+
27
+ // When the function is called, we store the arguments to be called on the next render (when state was really updated)
28
+ return useCallback((...args: Parameters<T>) => {
29
+ callOnNextRender.current = args;
30
+ }, []) as T;
31
+ }
@@ -32,6 +32,7 @@ import { mergeDefault } from '../utils/object';
32
32
  import { useRefSync } from '../hooks/useRefSync';
33
33
  import { ConsoleLogger } from './logger/ConsoleLogger';
34
34
  import { useWarnDepChange } from './hooks/useWarnDepChange';
35
+ import { useCallbackOnNextRender } from './hooks/useCallbackOnNextRender';
35
36
 
36
37
  const empty = {}; // Keep the same empty object (to avoid problem with useEffect dependencies)
37
38
  const DEFAULT_DATA = empty as LunaticData;
@@ -169,12 +170,14 @@ export function useLunatic(
169
170
  [dispatch]
170
171
  );
171
172
 
173
+ const onChangeAfterRender = useCallbackOnNextRender(onChange);
174
+
172
175
  const handleChanges = useCallback<LunaticChangesHandler>(
173
176
  (responses) => {
174
177
  dispatch(handleChangesAction(responses));
175
- onChange(responses);
178
+ onChangeAfterRender(responses);
176
179
  },
177
- [dispatch, onChange]
180
+ [dispatch, onChangeAfterRender]
178
181
  );
179
182
 
180
183
  const getData: LunaticState['getData'] = (