@dxos/react-hooks 0.8.4-main.f5c0578 → 0.8.4-main.fbb7a13

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 (50) hide show
  1. package/dist/lib/browser/index.mjs +169 -124
  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 +169 -124
  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 +3 -3
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/useAsyncEffect.d.ts +7 -1
  10. package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
  11. package/dist/types/src/useControlledState.d.ts +2 -1
  12. package/dist/types/src/useControlledState.d.ts.map +1 -1
  13. package/dist/types/src/useDebugDeps.d.ts +6 -0
  14. package/dist/types/src/useDebugDeps.d.ts.map +1 -0
  15. package/dist/types/src/useDynamicRef.d.ts +6 -1
  16. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  17. package/dist/types/src/useForwardedRef.d.ts +23 -3
  18. package/dist/types/src/useForwardedRef.d.ts.map +1 -1
  19. package/dist/types/src/useId.d.ts.map +1 -1
  20. package/dist/types/src/useIsFocused.d.ts +1 -1
  21. package/dist/types/src/useIsFocused.d.ts.map +1 -1
  22. package/dist/types/src/useMediaQuery.d.ts +1 -1
  23. package/dist/types/src/useMediaQuery.d.ts.map +1 -1
  24. package/dist/types/src/useMulticastObservable.test.d.ts.map +1 -1
  25. package/dist/types/src/useTransitions.d.ts +2 -1
  26. package/dist/types/src/useTransitions.d.ts.map +1 -1
  27. package/dist/types/src/useViewportResize.d.ts +3 -0
  28. package/dist/types/src/useViewportResize.d.ts.map +1 -0
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +16 -11
  31. package/src/index.ts +4 -3
  32. package/src/useAsyncEffect.ts +24 -6
  33. package/src/useControlledState.ts +22 -11
  34. package/src/useDebugDeps.ts +35 -0
  35. package/src/useDynamicRef.ts +26 -5
  36. package/src/useForwardedRef.ts +48 -13
  37. package/src/useId.ts +3 -2
  38. package/src/useIsFocused.ts +1 -1
  39. package/src/useMediaQuery.ts +8 -9
  40. package/src/{useMulticastObservable.test.tsx → useMulticastObservable.test.ts} +1 -3
  41. package/src/useTransitions.ts +3 -1
  42. package/src/{useResize.ts → useViewportResize.ts} +4 -4
  43. package/dist/types/src/useDebugReactDeps.d.ts +0 -6
  44. package/dist/types/src/useDebugReactDeps.d.ts.map +0 -1
  45. package/dist/types/src/useResize.d.ts +0 -3
  46. package/dist/types/src/useResize.d.ts.map +0 -1
  47. package/dist/types/src/useTrackProps.d.ts +0 -5
  48. package/dist/types/src/useTrackProps.d.ts.map +0 -1
  49. package/src/useDebugReactDeps.ts +0 -27
  50. package/src/useTrackProps.ts +0 -40
@@ -1 +1 @@
1
- {"inputs":{"src/useAsyncEffect.ts":{"bytes":1300,"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":2317,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDebugReactDeps.ts":{"bytes":3119,"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":1326,"imports":[{"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/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":2228,"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/useDebugReactDeps.ts","kind":"import-statement","original":"./useDebugReactDeps"},{"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/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":29681},"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":"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":"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","useDefaults","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useInterval","useIsFocused","useMediaQuery","useMulticastObservable","useOnTransition","useRefCallback","useResize","useTimeout","useTrackProps"],"entryPoint":"src/index.ts","inputs":{"src/useAsyncEffect.ts":{"bytesInOutput":211},"src/index.ts":{"bytesInOutput":0},"src/useAsyncState.ts":{"bytesInOutput":447},"src/useControlledState.ts":{"bytesInOutput":463},"src/useDebugReactDeps.ts":{"bytesInOutput":567},"src/useDefaultValue.ts":{"bytesInOutput":422},"src/useDefaults.ts":{"bytesInOutput":228},"src/useDynamicRef.ts":{"bytesInOutput":217},"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/useTimeout.ts":{"bytesInOutput":946},"src/useTrackProps.ts":{"bytesInOutput":964},"src/useTransitions.ts":{"bytesInOutput":1406}},"bytes":11871}}}
1
+ {"inputs":{"src/useAsyncEffect.ts":{"bytes":2994,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useAsyncState.ts":{"bytes":2583,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDynamicRef.ts":{"bytes":3588,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useControlledState.ts":{"bytes":3703,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/useDynamicRef.ts","kind":"import-statement","original":"./useDynamicRef"}],"format":"esm"},"src/useDebugDeps.ts":{"bytes":3943,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaultValue.ts":{"bytes":4039,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useDefaults.ts":{"bytes":1597,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useFileDownload.ts":{"bytes":2677,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useForwardedRef.ts":{"bytes":6112,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useId.ts":{"bytes":2520,"imports":[{"path":"alea","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useIsFocused.ts":{"bytes":3927,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMediaQuery.ts":{"bytes":9262,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useMulticastObservable.ts":{"bytes":2978,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useRefCallback.ts":{"bytes":1824,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useViewportResize.ts":{"bytes":2841,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTimeout.ts":{"bytes":3962,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/useTransitions.ts":{"bytes":7869,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":2366,"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/useViewportResize.ts","kind":"import-statement","original":"./useViewportResize"},{"path":"src/useTimeout.ts","kind":"import-statement","original":"./useTimeout"},{"path":"src/useTransitions.ts","kind":"import-statement","original":"./useTransitions"},{"path":"mini-virtual-list","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33857},"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":"@dxos/log","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":"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":"react","kind":"import-statement","external":true},{"path":"mini-virtual-list","kind":"import-statement","external":true}],"exports":["makeId","mergeRefs","randomString","setRef","useAsyncEffect","useAsyncState","useControlledState","useDebugDeps","useDefaultValue","useDefaults","useDidTransition","useDynamicRef","useFileDownload","useForwardedRef","useId","useInterval","useIsFocused","useMediaQuery","useMergeRefs","useMulticastObservable","useOnTransition","useRefCallback","useScroller","useSize","useStateWithRef","useTimeout","useViewportResize"],"entryPoint":"src/index.ts","inputs":{"src/useAsyncEffect.ts":{"bytesInOutput":405},"src/index.ts":{"bytesInOutput":58},"src/useAsyncState.ts":{"bytesInOutput":447},"src/useControlledState.ts":{"bytesInOutput":756},"src/useDynamicRef.ts":{"bytesInOutput":724},"src/useDebugDeps.ts":{"bytesInOutput":966},"src/useDefaultValue.ts":{"bytesInOutput":422},"src/useDefaults.ts":{"bytesInOutput":228},"src/useFileDownload.ts":{"bytesInOutput":416},"src/useForwardedRef.ts":{"bytesInOutput":840},"src/useId.ts":{"bytesInOutput":421},"src/useIsFocused.ts":{"bytesInOutput":833},"src/useMediaQuery.ts":{"bytesInOutput":1941},"src/useMulticastObservable.ts":{"bytesInOutput":368},"src/useRefCallback.ts":{"bytesInOutput":197},"src/useViewportResize.ts":{"bytesInOutput":612},"src/useTimeout.ts":{"bytesInOutput":946},"src/useTransitions.ts":{"bytesInOutput":1409}},"bytes":12965}}}
@@ -2,13 +2,21 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
 
3
3
  // src/useAsyncEffect.ts
4
4
  import { useEffect } from "react";
5
- var useAsyncEffect = (callback, deps) => {
5
+ var useAsyncEffect = (cb, deps) => {
6
6
  useEffect(() => {
7
- const t = setTimeout(() => {
8
- void callback();
7
+ const controller = new AbortController();
8
+ let cleanup;
9
+ const t = setTimeout(async () => {
10
+ if (!controller.signal.aborted) {
11
+ cleanup = await cb(controller);
12
+ }
9
13
  });
10
- return () => clearTimeout(t);
11
- }, deps);
14
+ return () => {
15
+ clearTimeout(t);
16
+ controller.abort();
17
+ cleanup?.();
18
+ };
19
+ }, deps ?? []);
12
20
  };
13
21
 
14
22
  // src/useAsyncState.ts
@@ -35,55 +43,107 @@ var useAsyncState = (cb, deps = []) => {
35
43
  };
36
44
 
37
45
  // src/useControlledState.ts
38
- import { useEffect as useEffect3, useState as useState2 } from "react";
39
- var useControlledState = (controlledValue, onChange, ...deps) => {
40
- const [value, setValue] = useState2(controlledValue);
41
- useEffect3(() => {
42
- if (controlledValue !== void 0) {
43
- setValue(controlledValue);
46
+ import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2, useState as useState3 } from "react";
47
+
48
+ // src/useDynamicRef.ts
49
+ import { useCallback, useEffect as useEffect3, useRef, useState as useState2 } from "react";
50
+ var useStateWithRef = (valueProp) => {
51
+ const [value, setValue] = useState2(valueProp);
52
+ const valueRef = useRef(valueProp);
53
+ const setter = useCallback((value2) => {
54
+ if (typeof value2 === "function") {
55
+ setValue((current) => {
56
+ valueRef.current = value2(current);
57
+ return valueRef.current;
58
+ });
59
+ } else {
60
+ valueRef.current = value2;
61
+ setValue(value2);
44
62
  }
63
+ }, []);
64
+ return [
65
+ value,
66
+ setter,
67
+ valueRef
68
+ ];
69
+ };
70
+ var useDynamicRef = (value) => {
71
+ const valueRef = useRef(value);
72
+ useEffect3(() => {
73
+ valueRef.current = value;
45
74
  }, [
46
- controlledValue,
47
- ...deps
75
+ value
48
76
  ]);
49
- useEffect3(() => {
50
- onChange?.(value);
77
+ return valueRef;
78
+ };
79
+
80
+ // src/useControlledState.ts
81
+ var useControlledState = (valueProp, onChange) => {
82
+ const [value, setControlledValue] = useState3(valueProp);
83
+ useEffect4(() => {
84
+ setControlledValue(valueProp);
51
85
  }, [
52
- value,
53
- onChange
86
+ valueProp
87
+ ]);
88
+ const onChangeRef = useRef2(onChange);
89
+ const valueRef = useDynamicRef(valueProp);
90
+ const setValue = useCallback2((nextValue) => {
91
+ const value2 = isFunction(nextValue) ? nextValue(valueRef.current) : nextValue;
92
+ setControlledValue(value2);
93
+ onChangeRef.current?.(value2);
94
+ }, [
95
+ valueRef,
96
+ onChangeRef
54
97
  ]);
55
98
  return [
56
99
  value,
57
100
  setValue
58
101
  ];
59
102
  };
103
+ function isFunction(value) {
104
+ return typeof value === "function";
105
+ }
60
106
 
61
- // src/useDebugReactDeps.ts
62
- import { useEffect as useEffect4, useRef } from "react";
63
- var useDebugReactDeps = (deps = []) => {
64
- const lastDeps = useRef([]);
65
- useEffect4(() => {
66
- console.group("deps changed", {
67
- old: lastDeps.current.length,
68
- new: deps.length
69
- });
107
+ // src/useDebugDeps.ts
108
+ import { useEffect as useEffect5, useRef as useRef3 } from "react";
109
+ import { log } from "@dxos/log";
110
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-primitives/react-hooks/src/useDebugDeps.ts";
111
+ var useDebugDeps = (deps = [], label = "useDebugDeps", active = true) => {
112
+ const lastDeps = useRef3([]);
113
+ useEffect5(() => {
114
+ if (!active) {
115
+ return;
116
+ }
117
+ const diff = {};
70
118
  for (let i = 0; i < Math.max(lastDeps.current.length ?? 0, deps.length ?? 0); i++) {
71
- console.log(i, lastDeps.current[i] === deps[i] ? "SAME" : "CHANGED", {
72
- previous: lastDeps.current[i],
73
- current: deps[i]
119
+ if (lastDeps.current[i] !== deps[i] || i > lastDeps.current.length) {
120
+ diff[i] = {
121
+ previous: lastDeps.current[i],
122
+ current: deps[i]
123
+ };
124
+ }
125
+ }
126
+ if (Object.keys(diff).length > 0) {
127
+ log.warn(`Updated: ${label} [${lastDeps.current.length}/${deps.length}]`, diff, {
128
+ F: __dxlog_file,
129
+ L: 30,
130
+ S: void 0,
131
+ C: (f, a) => f(...a)
74
132
  });
75
133
  }
76
- console.groupEnd();
77
134
  lastDeps.current = deps;
78
- }, deps);
135
+ }, [
136
+ ...deps,
137
+ active
138
+ ]);
79
139
  };
80
140
 
81
141
  // src/useDefaultValue.ts
82
- import { useEffect as useEffect5, useMemo, useState as useState3 } from "react";
142
+ import { useEffect as useEffect6, useMemo, useState as useState4 } from "react";
83
143
  var useDefaultValue = (reactiveValue, getDefaultValue) => {
84
144
  const stableDefaultValue = useMemo(getDefaultValue, []);
85
- const [value, setValue] = useState3(reactiveValue ?? stableDefaultValue);
86
- useEffect5(() => {
145
+ const [value, setValue] = useState4(reactiveValue ?? stableDefaultValue);
146
+ useEffect6(() => {
87
147
  setValue(reactiveValue ?? stableDefaultValue);
88
148
  }, [
89
149
  reactiveValue,
@@ -102,18 +162,6 @@ var useDefaults = (value, defaults) => {
102
162
  ]);
103
163
  };
104
164
 
105
- // src/useDynamicRef.ts
106
- import { useEffect as useEffect6, useRef as useRef2 } from "react";
107
- var useDynamicRef = (value) => {
108
- const ref = useRef2(value);
109
- useEffect6(() => {
110
- ref.current = value;
111
- }, [
112
- value
113
- ]);
114
- return ref;
115
- };
116
-
117
165
  // src/useFileDownload.ts
118
166
  import { useMemo as useMemo3 } from "react";
119
167
  var useFileDownload = () => {
@@ -128,38 +176,59 @@ var useFileDownload = () => {
128
176
  };
129
177
 
130
178
  // src/useForwardedRef.ts
131
- import { useEffect as useEffect7, useRef as useRef3 } from "react";
132
- var useForwardedRef = (ref) => {
133
- const innerRef = useRef3(null);
179
+ import { useEffect as useEffect7, useMemo as useMemo4, useRef as useRef4 } from "react";
180
+ var useForwardedRef = (forwardedRef) => {
181
+ const localRef = useRef4(null);
134
182
  useEffect7(() => {
135
- if (!ref) {
136
- return;
137
- }
138
- if (typeof ref === "function") {
139
- ref(innerRef.current);
140
- } else {
141
- ref.current = innerRef.current;
183
+ setRef(forwardedRef, localRef.current);
184
+ }, [
185
+ forwardedRef
186
+ ]);
187
+ return localRef;
188
+ };
189
+ function setRef(ref, value) {
190
+ if (typeof ref === "function") {
191
+ return ref(value);
192
+ } else if (ref) {
193
+ ref.current = value;
194
+ }
195
+ }
196
+ var mergeRefs = (refs) => {
197
+ return (value) => {
198
+ const cleanups = [];
199
+ for (const ref of refs) {
200
+ const cleanup = setRef(ref, value);
201
+ cleanups.push(typeof cleanup === "function" ? cleanup : () => setRef(ref, null));
142
202
  }
143
- });
144
- return innerRef;
203
+ return () => {
204
+ for (const cleanup of cleanups) cleanup();
205
+ };
206
+ };
207
+ };
208
+ var useMergeRefs = (refs) => {
209
+ return useMemo4(() => mergeRefs(refs), [
210
+ ...refs
211
+ ]);
145
212
  };
146
213
 
147
214
  // src/useId.ts
148
215
  import alea from "alea";
149
- import { useMemo as useMemo4 } from "react";
216
+ import { useMemo as useMemo5 } from "react";
150
217
  var Alea = alea;
151
218
  var prng = new Alea("@dxos/react-hooks");
152
219
  var randomString = (n = 4) => prng().toString(16).slice(2, n + 2);
153
- var useId = (namespace, propsId, opts) => useMemo4(() => makeId(namespace, propsId, opts), [
154
- propsId
155
- ]);
220
+ var useId = (namespace, propsId, opts) => {
221
+ return useMemo5(() => makeId(namespace, propsId, opts), [
222
+ propsId
223
+ ]);
224
+ };
156
225
  var makeId = (namespace, propsId, opts) => propsId ?? `${namespace}-${randomString(opts?.n ?? 4)}`;
157
226
 
158
227
  // src/useIsFocused.ts
159
- import { useEffect as useEffect8, useRef as useRef4, useState as useState4 } from "react";
228
+ import { useEffect as useEffect8, useRef as useRef5, useState as useState5 } from "react";
160
229
  var useIsFocused = (inputRef) => {
161
- const [isFocused, setIsFocused] = useState4(void 0);
162
- const isFocusedRef = useRef4(isFocused);
230
+ const [isFocused, setIsFocused] = useState5(void 0);
231
+ const isFocusedRef = useRef5(isFocused);
163
232
  isFocusedRef.current = isFocused;
164
233
  useEffect8(() => {
165
234
  const input = inputRef.current;
@@ -185,7 +254,7 @@ var useIsFocused = (inputRef) => {
185
254
  };
186
255
 
187
256
  // src/useMediaQuery.ts
188
- import { useEffect as useEffect9, useState as useState5 } from "react";
257
+ import { useEffect as useEffect9, useState as useState6 } from "react";
189
258
  var breakpointMediaQueries = {
190
259
  sm: "(min-width: 640px)",
191
260
  md: "(min-width: 768px)",
@@ -194,7 +263,7 @@ var breakpointMediaQueries = {
194
263
  "2xl": "(min-width: 1536px)"
195
264
  };
196
265
  var useMediaQuery = (query, options = {}) => {
197
- const { ssr = true, fallback } = options;
266
+ const { ssr = false, fallback } = options;
198
267
  const queries = (Array.isArray(query) ? query : [
199
268
  query
200
269
  ]).map((query2) => query2 in breakpointMediaQueries ? breakpointMediaQueries[query2] : query2);
@@ -202,7 +271,7 @@ var useMediaQuery = (query, options = {}) => {
202
271
  fallback
203
272
  ];
204
273
  fallbackValues = fallbackValues.filter((v) => v != null);
205
- const [value, setValue] = useState5(() => {
274
+ const [value, setValue] = useState6(() => {
206
275
  return queries.map((query2, index) => ({
207
276
  media: query2,
208
277
  matches: ssr ? !!fallbackValues[index] : document.defaultView?.matchMedia(query2).matches
@@ -250,9 +319,9 @@ var useMediaQuery = (query, options = {}) => {
250
319
  };
251
320
 
252
321
  // src/useMulticastObservable.ts
253
- import { useMemo as useMemo5, useSyncExternalStore } from "react";
322
+ import { useMemo as useMemo6, useSyncExternalStore } from "react";
254
323
  var useMulticastObservable = (observable) => {
255
- const subscribeFn = useMemo5(() => (listener) => {
324
+ const subscribeFn = useMemo6(() => (listener) => {
256
325
  const subscription = observable.subscribe(listener);
257
326
  return () => subscription.unsubscribe();
258
327
  }, [
@@ -262,28 +331,28 @@ var useMulticastObservable = (observable) => {
262
331
  };
263
332
 
264
333
  // src/useRefCallback.ts
265
- import { useState as useState6 } from "react";
334
+ import { useState as useState7 } from "react";
266
335
  var useRefCallback = () => {
267
- const [value, setValue] = useState6(null);
336
+ const [value, setValue] = useState7(null);
268
337
  return {
269
338
  refCallback: (value2) => setValue(value2),
270
339
  value
271
340
  };
272
341
  };
273
342
 
274
- // src/useResize.ts
275
- import { useLayoutEffect, useMemo as useMemo6 } from "react";
276
- var useResize = (handler, deps = [], delay = 800) => {
277
- const debouncedHandler = useMemo6(() => {
343
+ // src/useViewportResize.ts
344
+ import { useLayoutEffect, useMemo as useMemo7 } from "react";
345
+ var useViewportResize = (cb, deps = [], delay = 800) => {
346
+ const debouncedHandler = useMemo7(() => {
278
347
  let timeout;
279
348
  return (event) => {
280
349
  clearTimeout(timeout);
281
350
  timeout = setTimeout(() => {
282
- handler(event);
351
+ cb(event);
283
352
  }, delay);
284
353
  };
285
354
  }, [
286
- handler,
355
+ cb,
287
356
  delay
288
357
  ]);
289
358
  return useLayoutEffect(() => {
@@ -297,9 +366,9 @@ var useResize = (handler, deps = [], delay = 800) => {
297
366
  };
298
367
 
299
368
  // src/useTimeout.ts
300
- import { useEffect as useEffect10, useRef as useRef5 } from "react";
369
+ import { useEffect as useEffect10, useRef as useRef6 } from "react";
301
370
  var useTimeout = (callback, delay = 0, deps = []) => {
302
- const callbackRef = useRef5(callback);
371
+ const callbackRef = useRef6(callback);
303
372
  useEffect10(() => {
304
373
  callbackRef.current = callback;
305
374
  }, [
@@ -317,7 +386,7 @@ var useTimeout = (callback, delay = 0, deps = []) => {
317
386
  ]);
318
387
  };
319
388
  var useInterval = (callback, delay = 0, deps = []) => {
320
- const callbackRef = useRef5(callback);
389
+ const callbackRef = useRef6(callback);
321
390
  useEffect10(() => {
322
391
  callbackRef.current = callback;
323
392
  }, [
@@ -340,49 +409,17 @@ var useInterval = (callback, delay = 0, deps = []) => {
340
409
  ]);
341
410
  };
342
411
 
343
- // src/useTrackProps.ts
344
- import { useEffect as useEffect11, useRef as useRef6 } from "react";
345
- import { log } from "@dxos/log";
346
- var __dxlog_file = "/__w/dxos/dxos/packages/ui/primitives/react-hooks/src/useTrackProps.ts";
347
- var useTrackProps = (props, componentName = "Component", active = true) => {
348
- const prevProps = useRef6(props);
349
- useEffect11(() => {
350
- const changes = Object.entries(props).filter(([key]) => props[key] !== prevProps.current[key]);
351
- if (changes.length > 0) {
352
- if (active) {
353
- log.info("props changed", {
354
- componentName,
355
- keys: changes.map(([key]) => key).join(","),
356
- props: Object.fromEntries(changes.map(([key]) => [
357
- key,
358
- {
359
- from: prevProps.current[key],
360
- to: props[key]
361
- }
362
- ]))
363
- }, {
364
- F: __dxlog_file,
365
- L: 22,
366
- S: void 0,
367
- C: (f, a) => f(...a)
368
- });
369
- }
370
- }
371
- prevProps.current = props;
372
- });
373
- };
374
-
375
412
  // src/useTransitions.ts
376
- import { useEffect as useEffect12, useRef as useRef7, useState as useState7 } from "react";
377
- var isFunction = (functionToCheck) => {
413
+ import { useEffect as useEffect11, useRef as useRef7, useState as useState8 } from "react";
414
+ var isFunction2 = (functionToCheck) => {
378
415
  return functionToCheck instanceof Function;
379
416
  };
380
417
  var useDidTransition = (currentValue, fromValue, toValue) => {
381
- const [hasTransitioned, setHasTransitioned] = useState7(false);
418
+ const [hasTransitioned, setHasTransitioned] = useState8(false);
382
419
  const previousValue = useRef7(currentValue);
383
- useEffect12(() => {
384
- const toValueValid = isFunction(toValue) ? toValue(currentValue) : toValue === currentValue;
385
- const fromValueValid = isFunction(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
420
+ useEffect11(() => {
421
+ const toValueValid = isFunction2(toValue) ? toValue(currentValue) : toValue === currentValue;
422
+ const fromValueValid = isFunction2(fromValue) ? fromValue(previousValue.current) : fromValue === previousValue.current;
386
423
  if (fromValueValid && toValueValid && !hasTransitioned) {
387
424
  setHasTransitioned(true);
388
425
  } else if ((!fromValueValid || !toValueValid) && hasTransitioned) {
@@ -400,13 +437,13 @@ var useDidTransition = (currentValue, fromValue, toValue) => {
400
437
  var useOnTransition = (currentValue, fromValue, toValue, callback) => {
401
438
  const dirty = useRef7(false);
402
439
  const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
403
- useEffect12(() => {
440
+ useEffect11(() => {
404
441
  dirty.current = false;
405
442
  }, [
406
443
  currentValue,
407
444
  dirty
408
445
  ]);
409
- useEffect12(() => {
446
+ useEffect11(() => {
410
447
  if (hasTransitioned && !dirty.current) {
411
448
  callback();
412
449
  dirty.current = true;
@@ -417,13 +454,18 @@ var useOnTransition = (currentValue, fromValue, toValue, callback) => {
417
454
  callback
418
455
  ]);
419
456
  };
457
+
458
+ // src/index.ts
459
+ import { useSize, useScroller } from "mini-virtual-list";
420
460
  export {
421
461
  makeId,
462
+ mergeRefs,
422
463
  randomString,
464
+ setRef,
423
465
  useAsyncEffect,
424
466
  useAsyncState,
425
467
  useControlledState,
426
- useDebugReactDeps,
468
+ useDebugDeps,
427
469
  useDefaultValue,
428
470
  useDefaults,
429
471
  useDidTransition,
@@ -434,11 +476,14 @@ export {
434
476
  useInterval,
435
477
  useIsFocused,
436
478
  useMediaQuery,
479
+ useMergeRefs,
437
480
  useMulticastObservable,
438
481
  useOnTransition,
439
482
  useRefCallback,
440
- useResize,
483
+ useScroller,
484
+ useSize,
485
+ useStateWithRef,
441
486
  useTimeout,
442
- useTrackProps
487
+ useViewportResize
443
488
  };
444
489
  //# sourceMappingURL=index.mjs.map