-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathuseViewportSize.ts
33 lines (30 loc) · 938 Bytes
/
useViewportSize.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { useEffect, useState } from 'react';
import { canUseDOM, managedEventListener } from './utils';
/**
* Tracks visual viewport size.
*
* ⚗️ _The underlying technology is experimental. Please be aware about browser compatibility before using this in production._
*
* @returns Dimensions `[width, height]`, falling back to `[0, 0]` when unavailable.
*
* @example
* function Example() {
* const [viewportWidth, viewportHeight] = useViewportSize();
* // ...
* }
*/
export default function useViewportSize(): Readonly<[number, number]> {
const [size, setSize] = useState<Readonly<[number, number]>>(
canUseDOM
? [window.visualViewport.width, window.visualViewport.height]
: [0, 0],
);
useEffect(
() =>
managedEventListener(window.visualViewport, 'resize', () => {
setSize([window.visualViewport.width, window.visualViewport.height]);
}),
[],
);
return size;
}