Skip to content

Commit

Permalink
feat: create useViewportSize hook
Browse files Browse the repository at this point in the history
  • Loading branch information
NikitaCG committed Aug 23, 2023
1 parent e51a73b commit 7aa30b5
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 0 deletions.
38 changes: 38 additions & 0 deletions src/hooks/UseViewportSize/UseViewportSize.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React from 'react';

export interface ViewportSize {
width?: number;
height?: number;
}

const getViewportSize = (): ViewportSize => ({
width: window?.visualViewport?.width ?? window?.innerWidth ?? undefined,
height: window?.visualViewport?.height ?? window?.innerHeight ?? undefined,
});

/**
* A hook to get the size of the viewport when resizing
*
* @return - {width, height}
*/
export const useViewportSize = (): ViewportSize => {
const [size, setSize] = React.useState<ViewportSize>(getViewportSize());

React.useEffect(() => {
const onResize = () => {
let newSize = getViewportSize();
if (newSize.width === size?.width && newSize.height === size?.height) {
newSize = size;
}
setSize(newSize);
};

(window.visualViewport ?? window).addEventListener('resize', onResize);

return () => {
(window.visualViewport ?? window).removeEventListener('resize', onResize);
};
}, [size]);

return size;
};
25 changes: 25 additions & 0 deletions src/hooks/UseViewportSize/__tests__/UseViewportSize.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {act, fireEvent, renderHook} from '@testing-library/react';

import {useViewportSize} from '..';

test('Check useViewportSize correct work', () => {
const view = renderHook(() => useViewportSize());

act(() => {
window.innerHeight = 500;
window.innerWidth = 500;
});

fireEvent(window, new Event('resize'));

expect(view.result.current).toEqual({height: 500, width: 500});

act(() => {
window.innerHeight = 1200;
window.innerWidth = 1200;
});

fireEvent(window, new Event('resize'));

expect(view.result.current).toEqual({height: 1200, width: 1200});
});
2 changes: 2 additions & 0 deletions src/hooks/UseViewportSize/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export {useViewportSize} from './UseViewportSize';
export type {ViewportSize} from './UseViewportSize';
1 change: 1 addition & 0 deletions src/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './UseViewportSize';
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './components';
export * from './hooks';

0 comments on commit 7aa30b5

Please sign in to comment.