@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.
- package/dist/lib/browser/index.mjs +185 -77
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +185 -77
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/index.d.ts +4 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/useAsyncEffect.d.ts +5 -29
- package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
- package/dist/types/src/useAsyncEffect.stories.d.ts +9 -0
- package/dist/types/src/useAsyncEffect.stories.d.ts.map +1 -0
- package/dist/types/src/useAsyncState.d.ts.map +1 -1
- package/dist/types/src/useControlledState.d.ts +2 -1
- package/dist/types/src/useControlledState.d.ts.map +1 -1
- package/dist/types/src/useDebugDeps.d.ts +6 -0
- package/dist/types/src/useDebugDeps.d.ts.map +1 -0
- package/dist/types/src/useDefaultValue.d.ts.map +1 -1
- package/dist/types/src/useDefaults.d.ts +6 -0
- package/dist/types/src/useDefaults.d.ts.map +1 -0
- package/dist/types/src/useDynamicRef.d.ts +6 -1
- package/dist/types/src/useDynamicRef.d.ts.map +1 -1
- package/dist/types/src/useForwardedRef.d.ts +1 -1
- package/dist/types/src/useIsFocused.d.ts.map +1 -1
- package/dist/types/src/useSignals.d.ts +10 -0
- package/dist/types/src/useSignals.d.ts.map +1 -0
- package/dist/types/src/useTimeout.d.ts +3 -0
- package/dist/types/src/useTimeout.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -3
- package/src/index.ts +4 -1
- package/src/useAsyncEffect.stories.tsx +34 -0
- package/src/useAsyncEffect.ts +19 -49
- package/src/useAsyncState.ts +2 -1
- package/src/useControlledState.ts +10 -1
- package/src/useDebugDeps.ts +26 -0
- package/src/useDefaultValue.ts +1 -2
- package/src/useDefaults.ts +14 -0
- package/src/useDynamicRef.ts +27 -5
- package/src/useForwardedRef.ts +2 -2
- package/src/useIsFocused.ts +1 -1
- package/src/useSignals.ts +27 -0
- package/src/useTimeout.ts +46 -0
- package/src/useTrackProps.ts +1 -1
- package/src/useTransitions.ts +1 -1
- package/dist/lib/node/index.cjs +0 -413
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/types/src/useAsyncEffect.test.d.ts +0 -2
- package/dist/types/src/useAsyncEffect.test.d.ts.map +0 -1
- package/dist/types/src/useDebugReactDeps.d.ts +0 -6
- package/dist/types/src/useDebugReactDeps.d.ts.map +0 -1
- package/src/useAsyncEffect.test.tsx +0 -51
- package/src/useDebugReactDeps.ts +0 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"
|
|
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
|
-
//
|
|
3
|
+
// src/useAsyncEffect.ts
|
|
4
4
|
import { useEffect } from "react";
|
|
5
|
-
|
|
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
|
-
|
|
16
|
-
let
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
15
|
+
clearTimeout(t);
|
|
16
|
+
controller.abort();
|
|
17
|
+
cleanup?.();
|
|
24
18
|
};
|
|
25
|
-
},
|
|
19
|
+
}, deps ?? []);
|
|
26
20
|
};
|
|
27
21
|
|
|
28
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
69
|
+
// src/useDebugDeps.ts
|
|
69
70
|
import { useEffect as useEffect4, useRef } from "react";
|
|
70
|
-
var
|
|
71
|
+
var useDebugDeps = (deps = []) => {
|
|
71
72
|
const lastDeps = useRef([]);
|
|
72
73
|
useEffect4(() => {
|
|
73
74
|
console.group("deps changed", {
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
//
|
|
89
|
-
import { useEffect as useEffect5, useState as useState3
|
|
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
|
-
//
|
|
103
|
-
import
|
|
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
|
|
140
|
+
const valueRef = useRef2(value);
|
|
106
141
|
useEffect6(() => {
|
|
107
|
-
|
|
142
|
+
valueRef.current = value;
|
|
108
143
|
}, [
|
|
109
144
|
value
|
|
110
145
|
]);
|
|
111
|
-
return
|
|
146
|
+
return valueRef;
|
|
112
147
|
};
|
|
113
148
|
|
|
114
|
-
//
|
|
115
|
-
import { useMemo as
|
|
149
|
+
// src/useFileDownload.ts
|
|
150
|
+
import { useMemo as useMemo3 } from "react";
|
|
116
151
|
var useFileDownload = () => {
|
|
117
|
-
return
|
|
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
|
-
//
|
|
128
|
-
import {
|
|
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
|
-
//
|
|
179
|
+
// src/useId.ts
|
|
145
180
|
import alea from "alea";
|
|
146
|
-
import { useMemo as
|
|
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) =>
|
|
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
|
-
//
|
|
156
|
-
import { useEffect as useEffect8, useRef as useRef4, useState as
|
|
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] =
|
|
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
|
-
//
|
|
185
|
-
import { useEffect as useEffect9, useState as
|
|
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] =
|
|
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
|
-
//
|
|
250
|
-
import { useMemo as
|
|
284
|
+
// src/useMulticastObservable.ts
|
|
285
|
+
import { useMemo as useMemo5, useSyncExternalStore } from "react";
|
|
251
286
|
var useMulticastObservable = (observable) => {
|
|
252
|
-
const subscribeFn =
|
|
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
|
-
//
|
|
262
|
-
import { useState as
|
|
296
|
+
// src/useRefCallback.ts
|
|
297
|
+
import { useState as useState7 } from "react";
|
|
263
298
|
var useRefCallback = () => {
|
|
264
|
-
const [value, setValue] =
|
|
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
|
-
//
|
|
272
|
-
import { useLayoutEffect, useMemo as
|
|
306
|
+
// src/useResize.ts
|
|
307
|
+
import { useLayoutEffect, useMemo as useMemo6 } from "react";
|
|
273
308
|
var useResize = (handler, deps = [], delay = 800) => {
|
|
274
|
-
const debouncedHandler =
|
|
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
|
-
//
|
|
297
|
-
import {
|
|
298
|
-
import {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
329
|
-
import {
|
|
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] =
|
|
335
|
-
const previousValue =
|
|
336
|
-
|
|
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 =
|
|
456
|
+
const dirty = useRef8(false);
|
|
355
457
|
const hasTransitioned = useDidTransition(currentValue, fromValue, toValue);
|
|
356
|
-
|
|
458
|
+
useEffect13(() => {
|
|
357
459
|
dirty.current = false;
|
|
358
460
|
}, [
|
|
359
461
|
currentValue,
|
|
360
462
|
dirty
|
|
361
463
|
]);
|
|
362
|
-
|
|
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
|
-
|
|
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
|