UNPKG

1.99 kBPlain TextView Raw
1/*
2 * Copyright 2020 Adobe. All rights reserved.
3 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License. You may obtain a copy
5 * of the License at http://www.apache.org/licenses/LICENSE-2.0
6 *
7 * Unless required by applicable law or agreed to in writing, software distributed under
8 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9 * OF ANY KIND, either express or implied. See the License for the specific language
10 * governing permissions and limitations under the License.
11 */
12
13import {useEffect, useState} from 'react';
14import {useIsSSR} from '@react-aria/ssr';
15
16interface ViewportSize {
17 width: number,
18 height: number
19}
20
21// @ts-ignore
22let visualViewport = typeof document !== 'undefined' && window.visualViewport;
23
24export function useViewportSize(): ViewportSize {
25 let isSSR = useIsSSR();
26 let [size, setSize] = useState(() => isSSR ? {width: 0, height: 0} : getViewportSize());
27
28 useEffect(() => {
29 // Use visualViewport api to track available height even on iOS virtual keyboard opening
30 let onResize = () => {
31 setSize(size => {
32 let newSize = getViewportSize();
33 if (newSize.width === size.width && newSize.height === size.height) {
34 return size;
35 }
36 return newSize;
37 });
38 };
39
40 if (!visualViewport) {
41 window.addEventListener('resize', onResize);
42 } else {
43 visualViewport.addEventListener('resize', onResize);
44 }
45
46 return () => {
47 if (!visualViewport) {
48 window.removeEventListener('resize', onResize);
49 } else {
50 visualViewport.removeEventListener('resize', onResize);
51 }
52 };
53 }, []);
54
55 return size;
56}
57
58function getViewportSize(): ViewportSize {
59 return {
60 width: (visualViewport && visualViewport?.width) || window.innerWidth,
61 height: (visualViewport && visualViewport?.height) || window.innerHeight
62 };
63}