@dxos/react-hooks 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 (67) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -0
  3. package/dist/lib/browser/index.mjs +237 -149
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/node-esm/index.mjs +237 -149
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/types/src/index.d.ts +5 -3
  10. package/dist/types/src/index.d.ts.map +1 -1
  11. package/dist/types/src/useAsyncEffect.d.ts +5 -29
  12. package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
  13. package/dist/types/src/useAsyncState.d.ts.map +1 -1
  14. package/dist/types/src/useAtomState.d.ts +12 -0
  15. package/dist/types/src/useAtomState.d.ts.map +1 -0
  16. package/dist/types/src/useControlledState.d.ts +2 -1
  17. package/dist/types/src/useControlledState.d.ts.map +1 -1
  18. package/dist/types/src/useDebugDeps.d.ts +6 -0
  19. package/dist/types/src/useDebugDeps.d.ts.map +1 -0
  20. package/dist/types/src/useDefaultValue.d.ts.map +1 -1
  21. package/dist/types/src/useDefaults.d.ts.map +1 -1
  22. package/dist/types/src/useDynamicRef.d.ts +6 -1
  23. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  24. package/dist/types/src/useForwardedRef.d.ts +23 -3
  25. package/dist/types/src/useForwardedRef.d.ts.map +1 -1
  26. package/dist/types/src/useId.d.ts.map +1 -1
  27. package/dist/types/src/useIsFocused.d.ts +1 -1
  28. package/dist/types/src/useIsFocused.d.ts.map +1 -1
  29. package/dist/types/src/useMediaQuery.d.ts +1 -1
  30. package/dist/types/src/useMediaQuery.d.ts.map +1 -1
  31. package/dist/types/src/useMulticastObservable.d.ts.map +1 -1
  32. package/dist/types/src/useMulticastObservable.test.d.ts.map +1 -1
  33. package/dist/types/src/useTimeout.d.ts +2 -1
  34. package/dist/types/src/useTimeout.d.ts.map +1 -1
  35. package/dist/types/src/useTransitions.d.ts +2 -1
  36. package/dist/types/src/useTransitions.d.ts.map +1 -1
  37. package/dist/types/src/useViewportResize.d.ts +3 -0
  38. package/dist/types/src/useViewportResize.d.ts.map +1 -0
  39. package/dist/types/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +20 -15
  41. package/src/index.ts +6 -3
  42. package/src/useAsyncEffect.ts +19 -49
  43. package/src/useAtomState.ts +23 -0
  44. package/src/useControlledState.ts +22 -11
  45. package/src/useDebugDeps.ts +35 -0
  46. package/src/useDefaultValue.ts +1 -1
  47. package/src/useDynamicRef.ts +26 -5
  48. package/src/useForwardedRef.ts +50 -13
  49. package/src/useId.ts +3 -2
  50. package/src/useIsFocused.ts +3 -3
  51. package/src/useMediaQuery.ts +8 -9
  52. package/src/{useMulticastObservable.test.tsx → useMulticastObservable.test.ts} +1 -3
  53. package/src/useTimeout.ts +28 -3
  54. package/src/useTransitions.ts +4 -2
  55. package/src/useViewportResize.ts +45 -0
  56. package/dist/types/src/useAsyncEffect.test.d.ts +0 -2
  57. package/dist/types/src/useAsyncEffect.test.d.ts.map +0 -1
  58. package/dist/types/src/useDebugReactDeps.d.ts +0 -6
  59. package/dist/types/src/useDebugReactDeps.d.ts.map +0 -1
  60. package/dist/types/src/useResize.d.ts +0 -3
  61. package/dist/types/src/useResize.d.ts.map +0 -1
  62. package/dist/types/src/useTrackProps.d.ts +0 -5
  63. package/dist/types/src/useTrackProps.d.ts.map +0 -1
  64. package/src/useAsyncEffect.test.tsx +0 -51
  65. package/src/useDebugReactDeps.ts +0 -27
  66. package/src/useResize.ts +0 -27
  67. package/src/useTrackProps.ts +0 -40
@@ -1,34 +1,50 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
+ // src/index.ts
4
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
5
+ import { useSize, useScroller } from "mini-virtual-list";
6
+
3
7
  // src/useAsyncEffect.ts
4
8
  import { useEffect } from "react";
5
- import { log } from "@dxos/log";
6
- var useAsyncEffect = (callback, destructor, deps) => {
7
- const [effectDestructor, effectDeps] = typeof destructor === "function" ? [
8
- destructor,
9
- deps
10
- ] : [
11
- void 0,
12
- destructor
13
- ];
9
+ var useAsyncEffect = (cb, deps) => {
14
10
  useEffect(() => {
15
- let mounted = true;
16
- let value;
17
- const asyncResult = callback(() => mounted);
18
- void Promise.resolve(asyncResult).then((result) => {
19
- value = result;
20
- }).catch(log.catch);
11
+ const controller = new AbortController();
12
+ let cleanup;
13
+ const t = setTimeout(async () => {
14
+ if (!controller.signal.aborted) {
15
+ cleanup = await cb(controller);
16
+ }
17
+ });
21
18
  return () => {
22
- mounted = false;
23
- effectDestructor?.(value);
19
+ clearTimeout(t);
20
+ controller.abort();
21
+ cleanup?.();
24
22
  };
25
- }, effectDeps);
23
+ }, deps ?? []);
24
+ };
25
+
26
+ // src/useAtomState.ts
27
+ import { Atom, useAtomSet, useAtomValue } from "@effect-atom/atom-react";
28
+ import { useMemo, useState } from "react";
29
+ var useAtomState = (initialValue) => {
30
+ const [atom] = useState(() => Atom.make(initialValue));
31
+ const value = useAtomValue(atom);
32
+ const set = useAtomSet(atom);
33
+ return useMemo(() => ({
34
+ atom,
35
+ value,
36
+ set
37
+ }), [
38
+ atom,
39
+ value,
40
+ set
41
+ ]);
26
42
  };
27
43
 
28
44
  // src/useAsyncState.ts
29
- import { useEffect as useEffect2, useState } from "react";
45
+ import { useEffect as useEffect2, useState as useState2 } from "react";
30
46
  var useAsyncState = (cb, deps = []) => {
31
- const [value, setValue] = useState();
47
+ const [value, setValue] = useState2();
32
48
  useEffect2(() => {
33
49
  let disposed = false;
34
50
  const t = setTimeout(async () => {
@@ -49,55 +65,102 @@ var useAsyncState = (cb, deps = []) => {
49
65
  };
50
66
 
51
67
  // src/useControlledState.ts
52
- import { useEffect as useEffect3, useState as useState2 } from "react";
53
- var useControlledState = (controlledValue, onChange, ...deps) => {
54
- const [value, setValue] = useState2(controlledValue);
55
- useEffect3(() => {
56
- if (controlledValue !== void 0) {
57
- setValue(controlledValue);
68
+ import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
69
+
70
+ // src/useDynamicRef.ts
71
+ import { useCallback, useEffect as useEffect3, useRef, useState as useState3 } from "react";
72
+ var useStateWithRef = (valueProp) => {
73
+ const [value, setValue] = useState3(valueProp);
74
+ const valueRef = useRef(valueProp);
75
+ const setter = useCallback((value2) => {
76
+ if (typeof value2 === "function") {
77
+ setValue((current) => {
78
+ valueRef.current = value2(current);
79
+ return valueRef.current;
80
+ });
81
+ } else {
82
+ valueRef.current = value2;
83
+ setValue(value2);
58
84
  }
85
+ }, []);
86
+ return [
87
+ value,
88
+ setter,
89
+ valueRef
90
+ ];
91
+ };
92
+ var useDynamicRef = (value) => {
93
+ const valueRef = useRef(value);
94
+ useEffect3(() => {
95
+ valueRef.current = value;
59
96
  }, [
60
- controlledValue,
61
- ...deps
97
+ value
62
98
  ]);
63
- useEffect3(() => {
64
- onChange?.(value);
99
+ return valueRef;
100
+ };
101
+
102
+ // src/useControlledState.ts
103
+ var useControlledState = (valueProp, onChange) => {
104
+ const [value, setControlledValue] = useState4(valueProp);
105
+ useEffect4(() => {
106
+ setControlledValue(valueProp);
65
107
  }, [
66
- value,
67
- onChange
108
+ valueProp
109
+ ]);
110
+ const onChangeRef = useRef2(onChange);
111
+ const valueRef = useDynamicRef(valueProp);
112
+ const setValue = useCallback2((nextValue) => {
113
+ const value2 = isFunction(nextValue) ? nextValue(valueRef.current) : nextValue;
114
+ setControlledValue(value2);
115
+ onChangeRef.current?.(value2);
116
+ }, [
117
+ valueRef,
118
+ onChangeRef
68
119
  ]);
69
120
  return [
70
121
  value,
71
122
  setValue
72
123
  ];
73
124
  };
125
+ function isFunction(value) {
126
+ return typeof value === "function";
127
+ }
74
128
 
75
- // src/useDebugReactDeps.ts
76
- import { useEffect as useEffect4, useRef } from "react";
77
- var useDebugReactDeps = (deps = []) => {
78
- const lastDeps = useRef([]);
79
- useEffect4(() => {
80
- console.group("deps changed", {
81
- old: lastDeps.current.length,
82
- new: deps.length
83
- });
129
+ // src/useDebugDeps.ts
130
+ import { useEffect as useEffect5, useRef as useRef3 } from "react";
131
+ import { log } from "@dxos/log";
132
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-primitives/react-hooks/src/useDebugDeps.ts";
133
+ var useDebugDeps = (deps = [], label = "useDebugDeps", active = true) => {
134
+ const lastDeps = useRef3([]);
135
+ useEffect5(() => {
136
+ if (!active) {
137
+ return;
138
+ }
139
+ const diff = {};
84
140
  for (let i = 0; i < Math.max(lastDeps.current.length ?? 0, deps.length ?? 0); i++) {
85
- console.log(i, lastDeps.current[i] === deps[i] ? "SAME" : "CHANGED", {
86
- previous: lastDeps.current[i],
87
- current: deps[i]
88
- });
141
+ if (lastDeps.current[i] !== deps[i] || i > lastDeps.current.length) {
142
+ diff[i] = {
143
+ previous: lastDeps.current[i],
144
+ current: deps[i]
145
+ };
146
+ }
147
+ }
148
+ if (Object.keys(diff).length > 0) {
149
+ log.warn(`Updated: ${label} [${lastDeps.current.length}/${deps.length}]`, diff, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 24, S: void 0 });
89
150
  }
90
- console.groupEnd();
91
151
  lastDeps.current = deps;
92
- }, deps);
152
+ }, [
153
+ ...deps,
154
+ active
155
+ ]);
93
156
  };
94
157
 
95
158
  // src/useDefaultValue.ts
96
- import { useEffect as useEffect5, useState as useState3, useMemo } from "react";
159
+ import { useEffect as useEffect6, useMemo as useMemo2, useState as useState5 } from "react";
97
160
  var useDefaultValue = (reactiveValue, getDefaultValue) => {
98
- const stableDefaultValue = useMemo(getDefaultValue, []);
99
- const [value, setValue] = useState3(reactiveValue ?? stableDefaultValue);
100
- useEffect5(() => {
161
+ const stableDefaultValue = useMemo2(getDefaultValue, []);
162
+ const [value, setValue] = useState5(reactiveValue ?? stableDefaultValue);
163
+ useEffect6(() => {
101
164
  setValue(reactiveValue ?? stableDefaultValue);
102
165
  }, [
103
166
  reactiveValue,
@@ -108,30 +171,18 @@ var useDefaultValue = (reactiveValue, getDefaultValue) => {
108
171
 
109
172
  // src/useDefaults.ts
110
173
  import defaultsDeep from "lodash.defaultsdeep";
111
- import { useMemo as useMemo2 } from "react";
174
+ import { useMemo as useMemo3 } from "react";
112
175
  var useDefaults = (value, defaults) => {
113
- return useMemo2(() => defaultsDeep({}, defaults, value), [
176
+ return useMemo3(() => defaultsDeep({}, defaults, value), [
114
177
  value,
115
178
  defaults
116
179
  ]);
117
180
  };
118
181
 
119
- // src/useDynamicRef.ts
120
- import { useEffect as useEffect6, useRef as useRef2 } from "react";
121
- var useDynamicRef = (value) => {
122
- const ref = useRef2(value);
123
- useEffect6(() => {
124
- ref.current = value;
125
- }, [
126
- value
127
- ]);
128
- return ref;
129
- };
130
-
131
182
  // src/useFileDownload.ts
132
- import { useMemo as useMemo3 } from "react";
183
+ import { useMemo as useMemo4 } from "react";
133
184
  var useFileDownload = () => {
134
- return useMemo3(() => (data, filename) => {
185
+ return useMemo4(() => (data, filename) => {
135
186
  const url = typeof data === "string" ? data : URL.createObjectURL(data);
136
187
  const element = document.createElement("a");
137
188
  element.setAttribute("href", url);
@@ -142,38 +193,61 @@ var useFileDownload = () => {
142
193
  };
143
194
 
144
195
  // src/useForwardedRef.ts
145
- import { useRef as useRef3, useEffect as useEffect7 } from "react";
146
- var useForwardedRef = (ref) => {
147
- const innerRef = useRef3(null);
196
+ import { useEffect as useEffect7, useMemo as useMemo5, useRef as useRef4 } from "react";
197
+ var useForwardedRef = (forwardedRef) => {
198
+ const localRef = useRef4(null);
148
199
  useEffect7(() => {
149
- if (!ref) {
150
- return;
151
- }
152
- if (typeof ref === "function") {
153
- ref(innerRef.current);
154
- } else {
155
- ref.current = innerRef.current;
200
+ setRef(forwardedRef, localRef.current);
201
+ }, [
202
+ forwardedRef
203
+ ]);
204
+ return localRef;
205
+ };
206
+ function setRef(ref, value) {
207
+ if (typeof ref === "function") {
208
+ return ref(value);
209
+ } else if (ref) {
210
+ ref.current = value;
211
+ }
212
+ }
213
+ var mergeRefs = (refs) => {
214
+ return (value) => {
215
+ const cleanups = [];
216
+ for (const ref of refs) {
217
+ const cleanup = setRef(ref, value);
218
+ cleanups.push(typeof cleanup === "function" ? cleanup : () => setRef(ref, null));
156
219
  }
157
- });
158
- return innerRef;
220
+ return () => {
221
+ for (const cleanup of cleanups) {
222
+ cleanup();
223
+ }
224
+ };
225
+ };
226
+ };
227
+ var useMergeRefs = (refs) => {
228
+ return useMemo5(() => mergeRefs(refs), [
229
+ ...refs
230
+ ]);
159
231
  };
160
232
 
161
233
  // src/useId.ts
162
234
  import alea from "alea";
163
- import { useMemo as useMemo4 } from "react";
235
+ import { useMemo as useMemo6 } from "react";
164
236
  var Alea = alea;
165
237
  var prng = new Alea("@dxos/react-hooks");
166
238
  var randomString = (n = 4) => prng().toString(16).slice(2, n + 2);
167
- var useId = (namespace, propsId, opts) => useMemo4(() => makeId(namespace, propsId, opts), [
168
- propsId
169
- ]);
239
+ var useId = (namespace, propsId, opts) => {
240
+ return useMemo6(() => makeId(namespace, propsId, opts), [
241
+ propsId
242
+ ]);
243
+ };
170
244
  var makeId = (namespace, propsId, opts) => propsId ?? `${namespace}-${randomString(opts?.n ?? 4)}`;
171
245
 
172
246
  // src/useIsFocused.ts
173
- import { useEffect as useEffect8, useRef as useRef4, useState as useState4 } from "react";
247
+ import { useEffect as useEffect8, useRef as useRef5, useState as useState6 } from "react";
174
248
  var useIsFocused = (inputRef) => {
175
- const [isFocused, setIsFocused] = useState4(void 0);
176
- const isFocusedRef = useRef4(isFocused);
249
+ const [isFocused, setIsFocused] = useState6(void 0);
250
+ const isFocusedRef = useRef5(isFocused);
177
251
  isFocusedRef.current = isFocused;
178
252
  useEffect8(() => {
179
253
  const input = inputRef.current;
@@ -199,7 +273,7 @@ var useIsFocused = (inputRef) => {
199
273
  };
200
274
 
201
275
  // src/useMediaQuery.ts
202
- import { useEffect as useEffect9, useState as useState5 } from "react";
276
+ import { useEffect as useEffect9, useState as useState7 } from "react";
203
277
  var breakpointMediaQueries = {
204
278
  sm: "(min-width: 640px)",
205
279
  md: "(min-width: 768px)",
@@ -208,7 +282,7 @@ var breakpointMediaQueries = {
208
282
  "2xl": "(min-width: 1536px)"
209
283
  };
210
284
  var useMediaQuery = (query, options = {}) => {
211
- const { ssr = true, fallback } = options;
285
+ const { ssr = false, fallback } = options;
212
286
  const queries = (Array.isArray(query) ? query : [
213
287
  query
214
288
  ]).map((query2) => query2 in breakpointMediaQueries ? breakpointMediaQueries[query2] : query2);
@@ -216,7 +290,7 @@ var useMediaQuery = (query, options = {}) => {
216
290
  fallback
217
291
  ];
218
292
  fallbackValues = fallbackValues.filter((v) => v != null);
219
- const [value, setValue] = useState5(() => {
293
+ const [value, setValue] = useState7(() => {
220
294
  return queries.map((query2, index) => ({
221
295
  media: query2,
222
296
  matches: ssr ? !!fallbackValues[index] : document.defaultView?.matchMedia(query2).matches
@@ -264,9 +338,9 @@ var useMediaQuery = (query, options = {}) => {
264
338
  };
265
339
 
266
340
  // src/useMulticastObservable.ts
267
- import { useMemo as useMemo5, useSyncExternalStore } from "react";
341
+ import { useMemo as useMemo7, useSyncExternalStore } from "react";
268
342
  var useMulticastObservable = (observable) => {
269
- const subscribeFn = useMemo5(() => (listener) => {
343
+ const subscribeFn = useMemo7(() => (listener) => {
270
344
  const subscription = observable.subscribe(listener);
271
345
  return () => subscription.unsubscribe();
272
346
  }, [
@@ -276,44 +350,59 @@ var useMulticastObservable = (observable) => {
276
350
  };
277
351
 
278
352
  // src/useRefCallback.ts
279
- import { useState as useState6 } from "react";
353
+ import { useState as useState8 } from "react";
280
354
  var useRefCallback = () => {
281
- const [value, setValue] = useState6(null);
355
+ const [value, setValue] = useState8(null);
282
356
  return {
283
357
  refCallback: (value2) => setValue(value2),
284
358
  value
285
359
  };
286
360
  };
287
361
 
288
- // src/useResize.ts
289
- import { useLayoutEffect, useMemo as useMemo6 } from "react";
290
- var useResize = (handler, deps = [], delay = 800) => {
291
- const debouncedHandler = useMemo6(() => {
362
+ // src/useViewportResize.ts
363
+ import { useLayoutEffect, useMemo as useMemo8 } from "react";
364
+ var useViewportResize = (cb, deps = [], delay = 800) => {
365
+ const { handler: debouncedHandler, cancel } = useMemo8(() => {
292
366
  let timeout;
293
- return (event) => {
294
- clearTimeout(timeout);
295
- timeout = setTimeout(() => {
296
- handler(event);
297
- }, delay);
367
+ return {
368
+ handler: (event) => {
369
+ if (timeout !== void 0) {
370
+ clearTimeout(timeout);
371
+ }
372
+ timeout = setTimeout(() => {
373
+ timeout = void 0;
374
+ cb(event);
375
+ }, delay);
376
+ },
377
+ cancel: () => {
378
+ if (timeout !== void 0) {
379
+ clearTimeout(timeout);
380
+ timeout = void 0;
381
+ }
382
+ }
298
383
  };
299
384
  }, [
300
- handler,
385
+ cb,
301
386
  delay
302
387
  ]);
303
388
  return useLayoutEffect(() => {
304
389
  window.visualViewport?.addEventListener("resize", debouncedHandler);
305
390
  debouncedHandler();
306
- return () => window.visualViewport?.removeEventListener("resize", debouncedHandler);
391
+ return () => {
392
+ window.visualViewport?.removeEventListener("resize", debouncedHandler);
393
+ cancel();
394
+ };
307
395
  }, [
308
396
  debouncedHandler,
397
+ cancel,
309
398
  ...deps
310
399
  ]);
311
400
  };
312
401
 
313
402
  // src/useTimeout.ts
314
- import { useEffect as useEffect10, useRef as useRef5 } from "react";
403
+ import { useEffect as useEffect10, useRef as useRef6 } from "react";
315
404
  var useTimeout = (callback, delay = 0, deps = []) => {
316
- const callbackRef = useRef5(callback);
405
+ const callbackRef = useRef6(callback);
317
406
  useEffect10(() => {
318
407
  callbackRef.current = callback;
319
408
  }, [
@@ -323,57 +412,48 @@ var useTimeout = (callback, delay = 0, deps = []) => {
323
412
  if (delay == null) {
324
413
  return;
325
414
  }
326
- const timeout = setTimeout(() => callbackRef.current?.(), delay);
327
- return () => clearTimeout(timeout);
415
+ const t = setTimeout(() => callbackRef.current?.(), delay);
416
+ return () => clearTimeout(t);
328
417
  }, [
329
418
  delay,
330
419
  ...deps
331
420
  ]);
332
421
  };
333
-
334
- // src/useTrackProps.ts
335
- import { useRef as useRef6, useEffect as useEffect11 } from "react";
336
- import { log as log2 } from "@dxos/log";
337
- var __dxlog_file = "/__w/dxos/dxos/packages/ui/primitives/react-hooks/src/useTrackProps.ts";
338
- var useTrackProps = (props, componentName = "Component", active = true) => {
339
- const prevProps = useRef6(props);
340
- useEffect11(() => {
341
- const changes = Object.entries(props).filter(([key]) => props[key] !== prevProps.current[key]);
342
- if (changes.length > 0) {
343
- if (active) {
344
- log2.info("props changed", {
345
- componentName,
346
- keys: changes.map(([key]) => key).join(","),
347
- props: Object.fromEntries(changes.map(([key]) => [
348
- key,
349
- {
350
- from: prevProps.current[key],
351
- to: props[key]
352
- }
353
- ]))
354
- }, {
355
- F: __dxlog_file,
356
- L: 22,
357
- S: void 0,
358
- C: (f, a) => f(...a)
359
- });
360
- }
422
+ var useInterval = (callback, delay = 0, deps = []) => {
423
+ const callbackRef = useRef6(callback);
424
+ useEffect10(() => {
425
+ callbackRef.current = callback;
426
+ }, [
427
+ callback
428
+ ]);
429
+ useEffect10(() => {
430
+ if (delay == null) {
431
+ return;
361
432
  }
362
- prevProps.current = props;
363
- });
433
+ const i = setInterval(async () => {
434
+ const result = await callbackRef.current?.();
435
+ if (result === false) {
436
+ clearInterval(i);
437
+ }
438
+ }, delay);
439
+ return () => clearInterval(i);
440
+ }, [
441
+ delay,
442
+ ...deps
443
+ ]);
364
444
  };
365
445
 
366
446
  // src/useTransitions.ts
367
- import { useRef as useRef7, useEffect as useEffect12, useState as useState7 } from "react";
368
- var isFunction = (functionToCheck) => {
447
+ import { useEffect as useEffect11, useRef as useRef7, useState as useState9 } from "react";
448
+ var isFunction2 = (functionToCheck) => {
369
449
  return functionToCheck instanceof Function;
370
450
  };
371
451
  var useDidTransition = (currentValue, fromValue, toValue) => {
372
- const [hasTransitioned, setHasTransitioned] = useState7(false);
452
+ const [hasTransitioned, setHasTransitioned] = useState9(false);
373
453
  const previousValue = useRef7(currentValue);
374
- useEffect12(() => {
375
- const toValueValid = isFunction(toValue) ? toValue(currentValue) : toValue === currentValue;
376
- const fromValueValid = isFunction(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
454
+ useEffect11(() => {
455
+ const toValueValid = isFunction2(toValue) ? toValue(currentValue) : toValue === currentValue;
456
+ const fromValueValid = isFunction2(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
377
457
  if (fromValueValid && toValueValid && !hasTransitioned) {
378
458
  setHasTransitioned(true);
379
459
  } else if ((!fromValueValid || !toValueValid) && hasTransitioned) {
@@ -391,13 +471,13 @@ var useDidTransition = (currentValue, fromValue, toValue) => {
391
471
  var useOnTransition = (currentValue, fromValue, toValue, callback) => {
392
472
  const dirty = useRef7(false);
393
473
  const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
394
- useEffect12(() => {
474
+ useEffect11(() => {
395
475
  dirty.current = false;
396
476
  }, [
397
477
  currentValue,
398
478
  dirty
399
479
  ]);
400
- useEffect12(() => {
480
+ useEffect11(() => {
401
481
  if (hasTransitioned && !dirty.current) {
402
482
  callback();
403
483
  dirty.current = true;
@@ -410,11 +490,15 @@ var useOnTransition = (currentValue, fromValue, toValue, callback) => {
410
490
  };
411
491
  export {
412
492
  makeId,
493
+ mergeRefs,
413
494
  randomString,
495
+ setRef,
414
496
  useAsyncEffect,
415
497
  useAsyncState,
498
+ useAtomState,
499
+ useComposedRefs,
416
500
  useControlledState,
417
- useDebugReactDeps,
501
+ useDebugDeps,
418
502
  useDefaultValue,
419
503
  useDefaults,
420
504
  useDidTransition,
@@ -422,13 +506,17 @@ export {
422
506
  useFileDownload,
423
507
  useForwardedRef,
424
508
  useId,
509
+ useInterval,
425
510
  useIsFocused,
426
511
  useMediaQuery,
512
+ useMergeRefs,
427
513
  useMulticastObservable,
428
514
  useOnTransition,
429
515
  useRefCallback,
430
- useResize,
516
+ useScroller,
517
+ useSize,
518
+ useStateWithRef,
431
519
  useTimeout,
432
- useTrackProps
520
+ useViewportResize
433
521
  };
434
522
  //# sourceMappingURL=index.mjs.map