UNPKG

1.97 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
21let visualViewport = typeof document !== 'undefined' && window.visualViewport;
22
23export function useViewportSize(): ViewportSize {
24 let isSSR = useIsSSR();
25 let [size, setSize] = useState(() => isSSR ? {width: 0, height: 0} : getViewportSize());
26
27 useEffect(() => {
28 // Use visualViewport api to track available height even on iOS virtual keyboard opening
29 let onResize = () => {
30 setSize(size => {
31 let newSize = getViewportSize();
32 if (newSize.width === size.width && newSize.height === size.height) {
33 return size;
34 }
35 return newSize;
36 });
37 };
38
39 if (!visualViewport) {
40 window.addEventListener('resize', onResize);
41 } else {
42 visualViewport.addEventListener('resize', onResize);
43 }
44
45 return () => {
46 if (!visualViewport) {
47 window.removeEventListener('resize', onResize);
48 } else {
49 visualViewport.removeEventListener('resize', onResize);
50 }
51 };
52 }, []);
53
54 return size;
55}
56
57function getViewportSize(): ViewportSize {
58 return {
59 width: (visualViewport && visualViewport?.width) || window.innerWidth,
60 height: (visualViewport && visualViewport?.height) || window.innerHeight
61 };
62}