@dxos/react-hooks 0.7.5-main.499c70c → 0.7.5-main.5ae2ba8

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 (38) hide show
  1. package/dist/lib/browser/index.mjs +69 -10
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +68 -11
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +69 -10
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/index.d.ts +3 -1
  11. package/dist/types/src/index.d.ts.map +1 -1
  12. package/dist/types/src/useAsyncEffect.d.ts +2 -0
  13. package/dist/types/src/useAsyncEffect.d.ts.map +1 -1
  14. package/dist/types/src/useAsyncState.d.ts.map +1 -1
  15. package/dist/types/src/useControlledState.d.ts +6 -0
  16. package/dist/types/src/useControlledState.d.ts.map +1 -0
  17. package/dist/types/src/useDynamicRef.d.ts +3 -0
  18. package/dist/types/src/useDynamicRef.d.ts.map +1 -1
  19. package/dist/types/src/useForwardedRef.d.ts +4 -0
  20. package/dist/types/src/useForwardedRef.d.ts.map +1 -1
  21. package/dist/types/src/useMediaQuery.d.ts.map +1 -1
  22. package/dist/types/src/useResize.d.ts +3 -0
  23. package/dist/types/src/useResize.d.ts.map +1 -0
  24. package/dist/types/src/useTrackProps.d.ts +5 -0
  25. package/dist/types/src/useTrackProps.d.ts.map +1 -0
  26. package/dist/types/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +4 -3
  28. package/src/index.ts +3 -1
  29. package/src/useAsyncEffect.ts +2 -1
  30. package/src/useAsyncState.ts +1 -0
  31. package/src/{useControlledValue.ts → useControlledState.ts} +2 -5
  32. package/src/useDynamicRef.ts +3 -0
  33. package/src/useForwardedRef.ts +4 -1
  34. package/src/useMediaQuery.ts +1 -0
  35. package/src/useResize.ts +27 -0
  36. package/src/useTrackProps.ts +40 -0
  37. package/dist/types/src/useControlledValue.d.ts +0 -6
  38. package/dist/types/src/useControlledValue.d.ts.map +0 -1
@@ -4,9 +4,12 @@
4
4
 
5
5
  import { type ForwardedRef, useRef, useEffect } from 'react';
6
6
 
7
+ /**
8
+ * Combines a possibly undefined forwarded ref with a locally defined ref.
9
+ * See also: react-merge-refs
10
+ */
7
11
  export const useForwardedRef = <T>(ref: ForwardedRef<T>) => {
8
12
  const innerRef = useRef<T>(null);
9
-
10
13
  useEffect(() => {
11
14
  if (!ref) {
12
15
  return;
@@ -29,6 +29,7 @@ const breakpointMediaQueries: Record<string, string> = {
29
29
  * @see Docs https://chakra-ui.com/docs/hooks/use-media-query
30
30
  */
31
31
  export const useMediaQuery = (query: string | string[], options: UseMediaQueryOptions = {}): boolean[] => {
32
+ // TODO(wittjosiah): Why is the default here true?
32
33
  const { ssr = true, fallback } = options;
33
34
 
34
35
  const queries = (Array.isArray(query) ? query : [query]).map((query) =>
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useLayoutEffect, useMemo } from 'react';
6
+
7
+ export const useResize = (
8
+ handler: (event?: Event) => void,
9
+ deps: Parameters<typeof useLayoutEffect>[1] = [],
10
+ delay: number = 800,
11
+ ) => {
12
+ const debouncedHandler = useMemo(() => {
13
+ let timeout: ReturnType<typeof setTimeout>;
14
+ return (event?: Event) => {
15
+ clearTimeout(timeout);
16
+ timeout = setTimeout(() => {
17
+ handler(event);
18
+ }, delay);
19
+ };
20
+ }, [handler, delay]);
21
+
22
+ return useLayoutEffect(() => {
23
+ window.visualViewport?.addEventListener('resize', debouncedHandler);
24
+ debouncedHandler();
25
+ return () => window.visualViewport?.removeEventListener('resize', debouncedHandler);
26
+ }, [debouncedHandler, ...deps]);
27
+ };
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useRef, useEffect } from 'react';
6
+
7
+ import { log } from '@dxos/log';
8
+
9
+ /**
10
+ * Use to debug which props have changed to trigger re-renders in a React component.
11
+ */
12
+ export const useTrackProps = <T extends Record<string, unknown>>(
13
+ props: T,
14
+ componentName = 'Component',
15
+ active = true,
16
+ ) => {
17
+ const prevProps = useRef<T>(props);
18
+ useEffect(() => {
19
+ const changes = Object.entries(props).filter(([key]) => props[key] !== prevProps.current[key]);
20
+ if (changes.length > 0) {
21
+ if (active) {
22
+ log.info('props changed', {
23
+ componentName,
24
+ keys: changes.map(([key]) => key).join(','),
25
+ props: Object.fromEntries(
26
+ changes.map(([key]) => [
27
+ key,
28
+ {
29
+ from: prevProps.current[key],
30
+ to: props[key],
31
+ },
32
+ ]),
33
+ ),
34
+ });
35
+ }
36
+ }
37
+
38
+ prevProps.current = props;
39
+ });
40
+ };
@@ -1,6 +0,0 @@
1
- import { type Dispatch, type SetStateAction } from 'react';
2
- /**
3
- * A stateful hook with a controlled value.
4
- */
5
- export declare const useControlledValue: <TValue>(controlledValue: TValue, ...deps: any[]) => [TValue, Dispatch<SetStateAction<TValue>>];
6
- //# sourceMappingURL=useControlledValue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useControlledValue.d.ts","sourceRoot":"","sources":["../../../src/useControlledValue.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAuB,MAAM,OAAO,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,mBACtB,MAAM,WACd,GAAG,EAAE,KACb,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAS3C,CAAC"}