Skip to content

Commit 9627cde

Browse files
committed
main 🧊 add use size, delete duplicate hook observer
1 parent 420b787 commit 9627cde

File tree

11 files changed

+123
-505
lines changed

11 files changed

+123
-505
lines changed

β€Žpackages/core/src/bundle/hooks/sensors.jsβ€Ž

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ export * from './useDeviceOrientation/useDeviceOrientation';
44
export * from './useDevicePixelRatio/useDevicePixelRatio';
55
export * from './useDocumentEvent/useDocumentEvent';
66
export * from './useDocumentVisibility/useDocumentVisibility';
7-
export * from './useElementSize/useElementSize';
8-
export * from './useElementVisibility/useElementVisibility';
97
export * from './useEventListener/useEventListener';
108
export * from './useHotkeys/useHotkeys';
119
export * from './useIdle/useIdle';
@@ -28,6 +26,7 @@ export * from './useResizeObserver/useResizeObserver';
2826
export * from './useScroll/useScroll';
2927
export * from './useScrollIntoView/useScrollIntoView';
3028
export * from './useScrollTo/useScrollTo';
29+
export * from './useSize/useSize';
3130
export * from './useTextSelection/useTextSelection';
3231
export * from './useVisibility/useVisibility';
3332
export * from './useWindowEvent/useWindowEvent';
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { useState } from 'react';
2+
import { isTarget } from '@/utils/helpers';
3+
import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect/useIsomorphicLayoutEffect';
4+
import { useRefState } from '../useRefState/useRefState';
5+
/**
6+
* @name useSize
7+
* @description - Hook that observes and returns the width and height of element
8+
* @category Elements
9+
* @usage low
10+
*
11+
* @overload
12+
* @param {HookTarget} target The target element to observe
13+
* @returns {UseSizeReturn} An object containing the resize observer, current width and height of the element
14+
*
15+
* @example
16+
* const { value, observer } = useSize(ref);
17+
*
18+
* @overload
19+
* @template Target The target element type
20+
* @returns { { ref: StateRef<Target> } & UseSizeReturn } An object containing the resize observer, current width and height of the element
21+
*
22+
* @example
23+
* const { ref, value, observer } = useSize();
24+
*/
25+
export const useSize = (...params) => {
26+
const target = params[0];
27+
const [size, setSize] = useState({ width: 0, height: 0 });
28+
const [observer, setObserver] = useState();
29+
const internalRef = useRefState();
30+
useIsomorphicLayoutEffect(() => {
31+
const element = target ? isTarget.getElement(target) : internalRef.current;
32+
if (!element) return;
33+
const { width, height } = element.getBoundingClientRect();
34+
setSize({
35+
width,
36+
height
37+
});
38+
const observer = new ResizeObserver(() => {
39+
const { width, height } = element.getBoundingClientRect();
40+
setSize({ width, height });
41+
});
42+
setObserver(observer);
43+
observer.observe(element);
44+
return () => {
45+
observer.disconnect();
46+
};
47+
}, [internalRef.state, target && isTarget.getRawElement(target)]);
48+
if (target) return { observer, value: size };
49+
return {
50+
observer,
51+
ref: internalRef,
52+
value: size
53+
};
54+
};

β€Žpackages/core/src/bundle/hooks/useVisibility/useVisibility.jsβ€Ž

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const useVisibility = (...params) => {
5858
const enabled = options?.enabled ?? true;
5959
const [observer, setObserver] = useState();
6060
const [entry, setEntry] = useState();
61+
const inView = entry?.isIntersecting ?? false;
6162
const internalRef = useRefState();
6263
const internalCallbackRef = useRef(callback);
6364
internalCallbackRef.current = callback;
@@ -67,9 +68,11 @@ export const useVisibility = (...params) => {
6768
if (!element) return;
6869
const observer = new IntersectionObserver(
6970
(entries, observer) => {
70-
const entry = entries.pop();
71-
setEntry(entry);
72-
internalCallbackRef.current?.(entry, observer);
71+
const firstEntry = entries[0];
72+
if (firstEntry) {
73+
setEntry(firstEntry);
74+
internalCallbackRef.current?.(firstEntry, observer);
75+
}
7376
},
7477
{
7578
...options,
@@ -89,11 +92,11 @@ export const useVisibility = (...params) => {
8992
options?.root,
9093
enabled
9194
]);
92-
if (target) return { observer, entry, inView: !!entry?.isIntersecting };
95+
if (target) return { observer, entry, inView };
9396
return {
9497
observer,
9598
ref: internalRef,
9699
entry,
97-
inView: !!entry?.isIntersecting
100+
inView
98101
};
99102
};

β€Žpackages/core/src/hooks/sensors.tsβ€Ž

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ export * from './useDeviceOrientation/useDeviceOrientation';
44
export * from './useDevicePixelRatio/useDevicePixelRatio';
55
export * from './useDocumentEvent/useDocumentEvent';
66
export * from './useDocumentVisibility/useDocumentVisibility';
7-
export * from './useElementSize/useElementSize';
8-
export * from './useElementVisibility/useElementVisibility';
97
export * from './useEventListener/useEventListener';
108
export * from './useHotkeys/useHotkeys';
119
export * from './useIdle/useIdle';
@@ -28,6 +26,7 @@ export * from './useResizeObserver/useResizeObserver';
2826
export * from './useScroll/useScroll';
2927
export * from './useScrollIntoView/useScrollIntoView';
3028
export * from './useScrollTo/useScrollTo';
29+
export * from './useSize/useSize';
3130
export * from './useTextSelection/useTextSelection';
3231
export * from './useVisibility/useVisibility';
3332
export * from './useWindowEvent/useWindowEvent';

β€Žpackages/core/src/hooks/useElementVisibility/useElementVisibility.demo.tsxβ€Ž

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
Β (0)