UNPKG

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