@dxos/react-hooks 0.8.3 → 0.8.4-main.1da679c

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 (54) hide show
  1. package/dist/lib/browser/index.mjs +185 -77
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +185 -77
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/index.d.ts +4 -1
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/useAsyncEffect.d.ts +5 -29
  10. package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
  11. package/dist/types/src/useAsyncEffect.stories.d.ts +9 -0
  12. package/dist/types/src/useAsyncEffect.stories.d.ts.map +1 -0
  13. package/dist/types/src/useAsyncState.d.ts.map +1 -1
  14. package/dist/types/src/useControlledState.d.ts +2 -1
  15. package/dist/types/src/useControlledState.d.ts.map +1 -1
  16. package/dist/types/src/useDebugDeps.d.ts +6 -0
  17. package/dist/types/src/useDebugDeps.d.ts.map +1 -0
  18. package/dist/types/src/useDefaultValue.d.ts.map +1 -1
  19. package/dist/types/src/useDefaults.d.ts +6 -0
  20. package/dist/types/src/useDefaults.d.ts.map +1 -0
  21. package/dist/types/src/useDynamicRef.d.ts +6 -1
  22. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  23. package/dist/types/src/useForwardedRef.d.ts +1 -1
  24. package/dist/types/src/useIsFocused.d.ts.map +1 -1
  25. package/dist/types/src/useSignals.d.ts +10 -0
  26. package/dist/types/src/useSignals.d.ts.map +1 -0
  27. package/dist/types/src/useTimeout.d.ts +3 -0
  28. package/dist/types/src/useTimeout.d.ts.map +1 -0
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +6 -3
  31. package/src/index.ts +4 -1
  32. package/src/useAsyncEffect.stories.tsx +34 -0
  33. package/src/useAsyncEffect.ts +19 -49
  34. package/src/useAsyncState.ts +2 -1
  35. package/src/useControlledState.ts +10 -1
  36. package/src/useDebugDeps.ts +26 -0
  37. package/src/useDefaultValue.ts +1 -2
  38. package/src/useDefaults.ts +14 -0
  39. package/src/useDynamicRef.ts +27 -5
  40. package/src/useForwardedRef.ts +2 -2
  41. package/src/useIsFocused.ts +1 -1
  42. package/src/useSignals.ts +27 -0
  43. package/src/useTimeout.ts +46 -0
  44. package/src/useTrackProps.ts +1 -1
  45. package/src/useTransitions.ts +1 -1
  46. package/dist/lib/node/index.cjs +0 -413
  47. package/dist/lib/node/index.cjs.map +0 -7
  48. package/dist/lib/node/meta.json +0 -1
  49. package/dist/types/src/useAsyncEffect.test.d.ts +0 -2
  50. package/dist/types/src/useAsyncEffect.test.d.ts.map +0 -1
  51. package/dist/types/src/useDebugReactDeps.d.ts +0 -6
  52. package/dist/types/src/useDebugReactDeps.d.ts.map +0 -1
  53. package/src/useAsyncEffect.test.tsx +0 -51
  54. package/src/useDebugReactDeps.ts +0 -27
@@ -1 +1 @@
1
- {"inputs":{"packages/ui/primitives/react-hooks/src/useAsyncEffect.ts":{"bytes":4968,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useAsyncState.ts":{"bytes":2463,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useControlledState.ts":{"bytes":1980,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useDebugReactDeps.ts":{"bytes":3132,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useDefaultValue.ts":{"bytes":4050,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useDynamicRef.ts":{"bytes":1339,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useFileDownload.ts":{"bytes":2684,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useForwardedRef.ts":{"bytes":2016,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useId.ts":{"bytes":2479,"imports":[{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useIsFocused.ts":{"bytes":3922,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useMediaQuery.ts":{"bytes":9409,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useMulticastObservable.ts":{"bytes":2985,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useRefCallback.ts":{"bytes":1831,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useResize.ts":{"bytes":2839,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useTrackProps.ts":{"bytes":4010,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/useTransitions.ts":{"bytes":7763,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/primitives/react-hooks/src/index.ts":{"bytes":2052,"imports":[{"path":"packages/ui/primitives/react-hooks/src/useAsyncEffect.ts","kind":"import-statement","original":"./useAsyncEffect"},{"path":"packages/ui/primitives/react-hooks/src/useAsyncState.ts","kind":"import-statement","original":"./useAsyncState"},{"path":"packages/ui/primitives/react-hooks/src/useControlledState.ts","kind":"import-statement","original":"./useControlledState"},{"path":"packages/ui/primitives/react-hooks/src/useDebugReactDeps.ts","kind":"import-statement","original":"./useDebugReactDeps"},{"path":"packages/ui/primitives/react-hooks/src/useDefaultValue.ts","kind":"import-statement","original":"./useDefaultValue"},{"path":"packages/ui/primitives/react-hooks/src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"},{"path":"packages/ui/primitives/react-hooks/src/useFileDownload.ts","kind":"import-statement","original":"./useFileDownload"},{"path":"packages/ui/primitives/react-hooks/src/useForwardedRef.ts","kind":"import-statement","original":"./useForwardedRef"},{"path":"packages/ui/primitives/react-hooks/src/useId.ts","kind":"import-statement","original":"./useId"},{"path":"packages/ui/primitives/react-hooks/src/useIsFocused.ts","kind":"import-statement","original":"./useIsFocused"},{"path":"packages/ui/primitives/react-hooks/src/useMediaQuery.ts","kind":"import-statement","original":"./useMediaQuery"},{"path":"packages/ui/primitives/react-hooks/src/useMulticastObservable.ts","kind":"import-statement","original":"./useMulticastObservable"},{"path":"packages/ui/primitives/react-hooks/src/useRefCallback.ts","kind":"import-statement","original":"./useRefCallback"},{"path":"packages/ui/primitives/react-hooks/src/useResize.ts","kind":"import-statement","original":"./useResize"},{"path":"packages/ui/primitives/react-hooks/src/useTrackProps.ts","kind":"import-statement","original":"./useTrackProps"},{"path":"packages/ui/primitives/react-hooks/src/useTransitions.ts","kind":"import-statement","original":"./useTransitions"}],"format":"esm"}},"outputs":{"packages/ui/primitives/react-hooks/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":28350},"packages/ui/primitives/react-hooks/dist/lib/browser/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["makeId","randomString","useAsyncEffect","useAsyncState","useControlledState","useDebugReactDeps","useDefaultValue","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useIsFocused","useMediaQuery","useMulticastObservable","useOnTransition","useRefCallback","useResize","useTrackProps"],"entryPoint":"packages/ui/primitives/react-hooks/src/index.ts","inputs":{"packages/ui/primitives/react-hooks/src/useAsyncEffect.ts":{"bytesInOutput":581},"packages/ui/primitives/react-hooks/src/index.ts":{"bytesInOutput":0},"packages/ui/primitives/react-hooks/src/useAsyncState.ts":{"bytesInOutput":418},"packages/ui/primitives/react-hooks/src/useControlledState.ts":{"bytesInOutput":372},"packages/ui/primitives/react-hooks/src/useDebugReactDeps.ts":{"bytesInOutput":567},"packages/ui/primitives/react-hooks/src/useDefaultValue.ts":{"bytesInOutput":422},"packages/ui/primitives/react-hooks/src/useDynamicRef.ts":{"bytesInOutput":217},"packages/ui/primitives/react-hooks/src/useFileDownload.ts":{"bytesInOutput":416},"packages/ui/primitives/react-hooks/src/useForwardedRef.ts":{"bytesInOutput":343},"packages/ui/primitives/react-hooks/src/useId.ts":{"bytesInOutput":403},"packages/ui/primitives/react-hooks/src/useIsFocused.ts":{"bytesInOutput":833},"packages/ui/primitives/react-hooks/src/useMediaQuery.ts":{"bytesInOutput":1940},"packages/ui/primitives/react-hooks/src/useMulticastObservable.ts":{"bytesInOutput":368},"packages/ui/primitives/react-hooks/src/useRefCallback.ts":{"bytesInOutput":197},"packages/ui/primitives/react-hooks/src/useResize.ts":{"bytesInOutput":619},"packages/ui/primitives/react-hooks/src/useTrackProps.ts":{"bytesInOutput":986},"packages/ui/primitives/react-hooks/src/useTransitions.ts":{"bytesInOutput":1406}},"bytes":11440}}}
1
+ {"inputs":{"src/useAsyncEffect.ts":{"bytes":2988,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useAsyncState.ts":{"bytes":2577,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useControlledState.ts":{"bytes":2462,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDebugDeps.ts":{"bytes":3041,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaultValue.ts":{"bytes":4033,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaults.ts":{"bytes":1591,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDynamicRef.ts":{"bytes":3728,"imports":[{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useFileDownload.ts":{"bytes":2671,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useForwardedRef.ts":{"bytes":2045,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useId.ts":{"bytes":2466,"imports":[{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useIsFocused.ts":{"bytes":3909,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMediaQuery.ts":{"bytes":9396,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMulticastObservable.ts":{"bytes":2972,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useRefCallback.ts":{"bytes":1818,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useResize.ts":{"bytes":2826,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useSignals.ts":{"bytes":2923,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTimeout.ts":{"bytes":3956,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTrackProps.ts":{"bytes":3997,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/useTransitions.ts":{"bytes":7750,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":2309,"imports":[{"path":"src/useAsyncEffect.ts","kind":"import-statement","original":"./useAsyncEffect"},{"path":"src/useAsyncState.ts","kind":"import-statement","original":"./useAsyncState"},{"path":"src/useControlledState.ts","kind":"import-statement","original":"./useControlledState"},{"path":"src/useDebugDeps.ts","kind":"import-statement","original":"./useDebugDeps"},{"path":"src/useDefaultValue.ts","kind":"import-statement","original":"./useDefaultValue"},{"path":"src/useDefaults.ts","kind":"import-statement","original":"./useDefaults"},{"path":"src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"},{"path":"src/useFileDownload.ts","kind":"import-statement","original":"./useFileDownload"},{"path":"src/useForwardedRef.ts","kind":"import-statement","original":"./useForwardedRef"},{"path":"src/useId.ts","kind":"import-statement","original":"./useId"},{"path":"src/useIsFocused.ts","kind":"import-statement","original":"./useIsFocused"},{"path":"src/useMediaQuery.ts","kind":"import-statement","original":"./useMediaQuery"},{"path":"src/useMulticastObservable.ts","kind":"import-statement","original":"./useMulticastObservable"},{"path":"src/useRefCallback.ts","kind":"import-statement","original":"./useRefCallback"},{"path":"src/useResize.ts","kind":"import-statement","original":"./useResize"},{"path":"src/useSignals.ts","kind":"import-statement","original":"./useSignals"},{"path":"src/useTimeout.ts","kind":"import-statement","original":"./useTimeout"},{"path":"src/useTrackProps.ts","kind":"import-statement","original":"./useTrackProps"},{"path":"src/useTransitions.ts","kind":"import-statement","original":"./useTransitions"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33287},"dist/lib/browser/index.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["makeId","randomString","useAsyncEffect","useAsyncState","useControlledState","useDebugDeps","useDefaultValue","useDefaults","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useInterval","useIsFocused","useMediaQuery","useMulticastObservable","useOnTransition","useRefCallback","useResize","useSignalsEffect","useSignalsMemo","useStateWithRef","useTimeout","useTrackProps"],"entryPoint":"src/index.ts","inputs":{"src/useAsyncEffect.ts":{"bytesInOutput":405},"src/index.ts":{"bytesInOutput":0},"src/useAsyncState.ts":{"bytesInOutput":447},"src/useControlledState.ts":{"bytesInOutput":463},"src/useDebugDeps.ts":{"bytesInOutput":606},"src/useDefaultValue.ts":{"bytesInOutput":422},"src/useDefaults.ts":{"bytesInOutput":228},"src/useDynamicRef.ts":{"bytesInOutput":779},"src/useFileDownload.ts":{"bytesInOutput":416},"src/useForwardedRef.ts":{"bytesInOutput":343},"src/useId.ts":{"bytesInOutput":403},"src/useIsFocused.ts":{"bytesInOutput":833},"src/useMediaQuery.ts":{"bytesInOutput":1940},"src/useMulticastObservable.ts":{"bytesInOutput":368},"src/useRefCallback.ts":{"bytesInOutput":197},"src/useResize.ts":{"bytesInOutput":619},"src/useSignals.ts":{"bytesInOutput":664},"src/useTimeout.ts":{"bytesInOutput":946},"src/useTrackProps.ts":{"bytesInOutput":964},"src/useTransitions.ts":{"bytesInOutput":1406}},"bytes":13399}}}
@@ -1,37 +1,31 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
- // packages/ui/primitives/react-hooks/src/useAsyncEffect.ts
3
+ // src/useAsyncEffect.ts
4
4
  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
- ];
5
+ var useAsyncEffect = (cb, deps) => {
14
6
  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);
7
+ const controller = new AbortController();
8
+ let cleanup;
9
+ const t = setTimeout(async () => {
10
+ if (!controller.signal.aborted) {
11
+ cleanup = await cb(controller);
12
+ }
13
+ });
21
14
  return () => {
22
- mounted = false;
23
- effectDestructor?.(value);
15
+ clearTimeout(t);
16
+ controller.abort();
17
+ cleanup?.();
24
18
  };
25
- }, effectDeps);
19
+ }, deps ?? []);
26
20
  };
27
21
 
28
- // packages/ui/primitives/react-hooks/src/useAsyncState.ts
22
+ // src/useAsyncState.ts
29
23
  import { useEffect as useEffect2, useState } from "react";
30
24
  var useAsyncState = (cb, deps = []) => {
31
25
  const [value, setValue] = useState();
32
26
  useEffect2(() => {
33
27
  let disposed = false;
34
- queueMicrotask(async () => {
28
+ const t = setTimeout(async () => {
35
29
  const data = await cb();
36
30
  if (!disposed) {
37
31
  setValue(data);
@@ -39,6 +33,7 @@ var useAsyncState = (cb, deps = []) => {
39
33
  });
40
34
  return () => {
41
35
  disposed = true;
36
+ clearTimeout(t);
42
37
  };
43
38
  }, deps);
44
39
  return [
@@ -47,9 +42,9 @@ var useAsyncState = (cb, deps = []) => {
47
42
  ];
48
43
  };
49
44
 
50
- // packages/ui/primitives/react-hooks/src/useControlledState.ts
45
+ // src/useControlledState.ts
51
46
  import { useEffect as useEffect3, useState as useState2 } from "react";
52
- var useControlledState = (controlledValue, ...deps) => {
47
+ var useControlledState = (controlledValue, onChange, ...deps) => {
53
48
  const [value, setValue] = useState2(controlledValue);
54
49
  useEffect3(() => {
55
50
  if (controlledValue !== void 0) {
@@ -59,34 +54,43 @@ var useControlledState = (controlledValue, ...deps) => {
59
54
  controlledValue,
60
55
  ...deps
61
56
  ]);
57
+ useEffect3(() => {
58
+ onChange?.(value);
59
+ }, [
60
+ value,
61
+ onChange
62
+ ]);
62
63
  return [
63
64
  value,
64
65
  setValue
65
66
  ];
66
67
  };
67
68
 
68
- // packages/ui/primitives/react-hooks/src/useDebugReactDeps.ts
69
+ // src/useDebugDeps.ts
69
70
  import { useEffect as useEffect4, useRef } from "react";
70
- var useDebugReactDeps = (deps = []) => {
71
+ var useDebugDeps = (deps = []) => {
71
72
  const lastDeps = useRef([]);
72
73
  useEffect4(() => {
73
74
  console.group("deps changed", {
74
- old: lastDeps.current.length,
75
- new: deps.length
75
+ previous: lastDeps.current.length,
76
+ current: deps.length
76
77
  });
77
78
  for (let i = 0; i < Math.max(lastDeps.current.length ?? 0, deps.length ?? 0); i++) {
78
- console.log(i, lastDeps.current[i] === deps[i] ? "SAME" : "CHANGED", {
79
- previous: lastDeps.current[i],
80
- current: deps[i]
81
- });
79
+ if (lastDeps.current[i] !== deps[i]) {
80
+ console.log("changed", {
81
+ index: i,
82
+ previous: lastDeps.current[i],
83
+ current: deps[i]
84
+ });
85
+ }
82
86
  }
83
87
  console.groupEnd();
84
88
  lastDeps.current = deps;
85
89
  }, deps);
86
90
  };
87
91
 
88
- // packages/ui/primitives/react-hooks/src/useDefaultValue.ts
89
- import { useEffect as useEffect5, useState as useState3, useMemo } from "react";
92
+ // src/useDefaultValue.ts
93
+ import { useEffect as useEffect5, useMemo, useState as useState3 } from "react";
90
94
  var useDefaultValue = (reactiveValue, getDefaultValue) => {
91
95
  const stableDefaultValue = useMemo(getDefaultValue, []);
92
96
  const [value, setValue] = useState3(reactiveValue ?? stableDefaultValue);
@@ -99,22 +103,53 @@ var useDefaultValue = (reactiveValue, getDefaultValue) => {
99
103
  return value;
100
104
  };
101
105
 
102
- // packages/ui/primitives/react-hooks/src/useDynamicRef.ts
103
- import { useEffect as useEffect6, useRef as useRef2 } from "react";
106
+ // src/useDefaults.ts
107
+ import defaultsDeep from "lodash.defaultsdeep";
108
+ import { useMemo as useMemo2 } from "react";
109
+ var useDefaults = (value, defaults) => {
110
+ return useMemo2(() => defaultsDeep({}, defaults, value), [
111
+ value,
112
+ defaults
113
+ ]);
114
+ };
115
+
116
+ // src/useDynamicRef.ts
117
+ import { useCallback } from "@preact-signals/safe-react/react";
118
+ import { useEffect as useEffect6, useRef as useRef2, useState as useState4 } from "react";
119
+ var useStateWithRef = (value$) => {
120
+ const [value, setValue] = useState4(value$);
121
+ const valueRef = useRef2(value$);
122
+ const setter = useCallback((value2) => {
123
+ if (typeof value2 === "function") {
124
+ setValue((current) => {
125
+ valueRef.current = value2(current);
126
+ return valueRef.current;
127
+ });
128
+ } else {
129
+ valueRef.current = value2;
130
+ setValue(value2);
131
+ }
132
+ }, []);
133
+ return [
134
+ value,
135
+ setter,
136
+ valueRef
137
+ ];
138
+ };
104
139
  var useDynamicRef = (value) => {
105
- const ref = useRef2(value);
140
+ const valueRef = useRef2(value);
106
141
  useEffect6(() => {
107
- ref.current = value;
142
+ valueRef.current = value;
108
143
  }, [
109
144
  value
110
145
  ]);
111
- return ref;
146
+ return valueRef;
112
147
  };
113
148
 
114
- // packages/ui/primitives/react-hooks/src/useFileDownload.ts
115
- import { useMemo as useMemo2 } from "react";
149
+ // src/useFileDownload.ts
150
+ import { useMemo as useMemo3 } from "react";
116
151
  var useFileDownload = () => {
117
- return useMemo2(() => (data, filename) => {
152
+ return useMemo3(() => (data, filename) => {
118
153
  const url = typeof data === "string" ? data : URL.createObjectURL(data);
119
154
  const element = document.createElement("a");
120
155
  element.setAttribute("href", url);
@@ -124,8 +159,8 @@ var useFileDownload = () => {
124
159
  }, []);
125
160
  };
126
161
 
127
- // packages/ui/primitives/react-hooks/src/useForwardedRef.ts
128
- import { useRef as useRef3, useEffect as useEffect7 } from "react";
162
+ // src/useForwardedRef.ts
163
+ import { useEffect as useEffect7, useRef as useRef3 } from "react";
129
164
  var useForwardedRef = (ref) => {
130
165
  const innerRef = useRef3(null);
131
166
  useEffect7(() => {
@@ -141,21 +176,21 @@ var useForwardedRef = (ref) => {
141
176
  return innerRef;
142
177
  };
143
178
 
144
- // packages/ui/primitives/react-hooks/src/useId.ts
179
+ // src/useId.ts
145
180
  import alea from "alea";
146
- import { useMemo as useMemo3 } from "react";
181
+ import { useMemo as useMemo4 } from "react";
147
182
  var Alea = alea;
148
183
  var prng = new Alea("@dxos/react-hooks");
149
184
  var randomString = (n = 4) => prng().toString(16).slice(2, n + 2);
150
- var useId = (namespace, propsId, opts) => useMemo3(() => makeId(namespace, propsId, opts), [
185
+ var useId = (namespace, propsId, opts) => useMemo4(() => makeId(namespace, propsId, opts), [
151
186
  propsId
152
187
  ]);
153
188
  var makeId = (namespace, propsId, opts) => propsId ?? `${namespace}-${randomString(opts?.n ?? 4)}`;
154
189
 
155
- // packages/ui/primitives/react-hooks/src/useIsFocused.ts
156
- import { useEffect as useEffect8, useRef as useRef4, useState as useState4 } from "react";
190
+ // src/useIsFocused.ts
191
+ import { useEffect as useEffect8, useRef as useRef4, useState as useState5 } from "react";
157
192
  var useIsFocused = (inputRef) => {
158
- const [isFocused, setIsFocused] = useState4(void 0);
193
+ const [isFocused, setIsFocused] = useState5(void 0);
159
194
  const isFocusedRef = useRef4(isFocused);
160
195
  isFocusedRef.current = isFocused;
161
196
  useEffect8(() => {
@@ -181,8 +216,8 @@ var useIsFocused = (inputRef) => {
181
216
  return isFocused;
182
217
  };
183
218
 
184
- // packages/ui/primitives/react-hooks/src/useMediaQuery.ts
185
- import { useEffect as useEffect9, useState as useState5 } from "react";
219
+ // src/useMediaQuery.ts
220
+ import { useEffect as useEffect9, useState as useState6 } from "react";
186
221
  var breakpointMediaQueries = {
187
222
  sm: "(min-width: 640px)",
188
223
  md: "(min-width: 768px)",
@@ -199,7 +234,7 @@ var useMediaQuery = (query, options = {}) => {
199
234
  fallback
200
235
  ];
201
236
  fallbackValues = fallbackValues.filter((v) => v != null);
202
- const [value, setValue] = useState5(() => {
237
+ const [value, setValue] = useState6(() => {
203
238
  return queries.map((query2, index) => ({
204
239
  media: query2,
205
240
  matches: ssr ? !!fallbackValues[index] : document.defaultView?.matchMedia(query2).matches
@@ -246,10 +281,10 @@ var useMediaQuery = (query, options = {}) => {
246
281
  return value.map((item) => !!item.matches);
247
282
  };
248
283
 
249
- // packages/ui/primitives/react-hooks/src/useMulticastObservable.ts
250
- import { useMemo as useMemo4, useSyncExternalStore } from "react";
284
+ // src/useMulticastObservable.ts
285
+ import { useMemo as useMemo5, useSyncExternalStore } from "react";
251
286
  var useMulticastObservable = (observable) => {
252
- const subscribeFn = useMemo4(() => (listener) => {
287
+ const subscribeFn = useMemo5(() => (listener) => {
253
288
  const subscription = observable.subscribe(listener);
254
289
  return () => subscription.unsubscribe();
255
290
  }, [
@@ -258,20 +293,20 @@ var useMulticastObservable = (observable) => {
258
293
  return useSyncExternalStore(subscribeFn, () => observable.get());
259
294
  };
260
295
 
261
- // packages/ui/primitives/react-hooks/src/useRefCallback.ts
262
- import { useState as useState6 } from "react";
296
+ // src/useRefCallback.ts
297
+ import { useState as useState7 } from "react";
263
298
  var useRefCallback = () => {
264
- const [value, setValue] = useState6(null);
299
+ const [value, setValue] = useState7(null);
265
300
  return {
266
301
  refCallback: (value2) => setValue(value2),
267
302
  value
268
303
  };
269
304
  };
270
305
 
271
- // packages/ui/primitives/react-hooks/src/useResize.ts
272
- import { useLayoutEffect, useMemo as useMemo5 } from "react";
306
+ // src/useResize.ts
307
+ import { useLayoutEffect, useMemo as useMemo6 } from "react";
273
308
  var useResize = (handler, deps = [], delay = 800) => {
274
- const debouncedHandler = useMemo5(() => {
309
+ const debouncedHandler = useMemo6(() => {
275
310
  let timeout;
276
311
  return (event) => {
277
312
  clearTimeout(timeout);
@@ -293,17 +328,84 @@ var useResize = (handler, deps = [], delay = 800) => {
293
328
  ]);
294
329
  };
295
330
 
296
- // packages/ui/primitives/react-hooks/src/useTrackProps.ts
297
- import { useRef as useRef5, useEffect as useEffect10 } from "react";
298
- import { log as log2 } from "@dxos/log";
299
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/primitives/react-hooks/src/useTrackProps.ts";
300
- var useTrackProps = (props, componentName = "Component", active = true) => {
301
- const prevProps = useRef5(props);
331
+ // src/useSignals.ts
332
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
333
+ import { computed, effect } from "@preact-signals/safe-react";
334
+ import { useRef as useRef5 } from "@preact-signals/safe-react/react";
335
+ import { useEffect as useEffect10, useMemo as useMemo7 } from "react";
336
+ var useSignalsEffect = (cb, deps) => {
337
+ const callback = useRef5(cb);
338
+ callback.current = cb;
302
339
  useEffect10(() => {
340
+ return effect(() => {
341
+ return callback.current();
342
+ });
343
+ }, deps ?? []);
344
+ };
345
+ var useSignalsMemo = (cb, deps) => {
346
+ var _effect = _useSignals();
347
+ try {
348
+ return useMemo7(() => computed(cb), deps ?? []).value;
349
+ } finally {
350
+ _effect.f();
351
+ }
352
+ };
353
+
354
+ // src/useTimeout.ts
355
+ import { useEffect as useEffect11, useRef as useRef6 } from "react";
356
+ var useTimeout = (callback, delay = 0, deps = []) => {
357
+ const callbackRef = useRef6(callback);
358
+ useEffect11(() => {
359
+ callbackRef.current = callback;
360
+ }, [
361
+ callback
362
+ ]);
363
+ useEffect11(() => {
364
+ if (delay == null) {
365
+ return;
366
+ }
367
+ const t = setTimeout(() => callbackRef.current?.(), delay);
368
+ return () => clearTimeout(t);
369
+ }, [
370
+ delay,
371
+ ...deps
372
+ ]);
373
+ };
374
+ var useInterval = (callback, delay = 0, deps = []) => {
375
+ const callbackRef = useRef6(callback);
376
+ useEffect11(() => {
377
+ callbackRef.current = callback;
378
+ }, [
379
+ callback
380
+ ]);
381
+ useEffect11(() => {
382
+ if (delay == null) {
383
+ return;
384
+ }
385
+ const i = setInterval(async () => {
386
+ const result = await callbackRef.current?.();
387
+ if (result === false) {
388
+ clearInterval(i);
389
+ }
390
+ }, delay);
391
+ return () => clearInterval(i);
392
+ }, [
393
+ delay,
394
+ ...deps
395
+ ]);
396
+ };
397
+
398
+ // src/useTrackProps.ts
399
+ import { useEffect as useEffect12, useRef as useRef7 } from "react";
400
+ import { log } from "@dxos/log";
401
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/primitives/react-hooks/src/useTrackProps.ts";
402
+ var useTrackProps = (props, componentName = "Component", active = true) => {
403
+ const prevProps = useRef7(props);
404
+ useEffect12(() => {
303
405
  const changes = Object.entries(props).filter(([key]) => props[key] !== prevProps.current[key]);
304
406
  if (changes.length > 0) {
305
407
  if (active) {
306
- log2.info("props changed", {
408
+ log.info("props changed", {
307
409
  componentName,
308
410
  keys: changes.map(([key]) => key).join(","),
309
411
  props: Object.fromEntries(changes.map(([key]) => [
@@ -325,15 +427,15 @@ var useTrackProps = (props, componentName = "Component", active = true) => {
325
427
  });
326
428
  };
327
429
 
328
- // packages/ui/primitives/react-hooks/src/useTransitions.ts
329
- import { useRef as useRef6, useEffect as useEffect11, useState as useState7 } from "react";
430
+ // src/useTransitions.ts
431
+ import { useEffect as useEffect13, useRef as useRef8, useState as useState8 } from "react";
330
432
  var isFunction = (functionToCheck) => {
331
433
  return functionToCheck instanceof Function;
332
434
  };
333
435
  var useDidTransition = (currentValue, fromValue, toValue) => {
334
- const [hasTransitioned, setHasTransitioned] = useState7(false);
335
- const previousValue = useRef6(currentValue);
336
- useEffect11(() => {
436
+ const [hasTransitioned, setHasTransitioned] = useState8(false);
437
+ const previousValue = useRef8(currentValue);
438
+ useEffect13(() => {
337
439
  const toValueValid = isFunction(toValue) ? toValue(currentValue) : toValue === currentValue;
338
440
  const fromValueValid = isFunction(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
339
441
  if (fromValueValid && toValueValid && !hasTransitioned) {
@@ -351,15 +453,15 @@ var useDidTransition = (currentValue, fromValue, toValue) => {
351
453
  return hasTransitioned;
352
454
  };
353
455
  var useOnTransition = (currentValue, fromValue, toValue, callback) => {
354
- const dirty = useRef6(false);
456
+ const dirty = useRef8(false);
355
457
  const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
356
- useEffect11(() => {
458
+ useEffect13(() => {
357
459
  dirty.current = false;
358
460
  }, [
359
461
  currentValue,
360
462
  dirty
361
463
  ]);
362
- useEffect11(() => {
464
+ useEffect13(() => {
363
465
  if (hasTransitioned && !dirty.current) {
364
466
  callback();
365
467
  dirty.current = true;
@@ -376,19 +478,25 @@ export {
376
478
  useAsyncEffect,
377
479
  useAsyncState,
378
480
  useControlledState,
379
- useDebugReactDeps,
481
+ useDebugDeps,
380
482
  useDefaultValue,
483
+ useDefaults,
381
484
  useDidTransition,
382
485
  useDynamicRef,
383
486
  useFileDownload,
384
487
  useForwardedRef,
385
488
  useId,
489
+ useInterval,
386
490
  useIsFocused,
387
491
  useMediaQuery,
388
492
  useMulticastObservable,
389
493
  useOnTransition,
390
494
  useRefCallback,
391
495
  useResize,
496
+ useSignalsEffect,
497
+ useSignalsMemo,
498
+ useStateWithRef,
499
+ useTimeout,
392
500
  useTrackProps
393
501
  };
394
502
  //# sourceMappingURL=index.mjs.map