portal-www
Version:
Nova Portal Website. Based on Next starter by Ueno
64 lines (53 loc) • 1.64 kB
text/typescript
import { useState, useEffect, useCallback } from 'react';
export const useWindowSize = () => {
const [size, setSize] = useState({ width: 0, height: 0 });
const onResize = useCallback(() => {
setSize({
width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
height:
window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
});
}, []);
useEffect(() => {
onResize();
window.addEventListener('resize', onResize, { passive: true });
return () => window.removeEventListener('resize', onResize);
}, [onResize]);
return size;
};
export const useBreakpoint = () => {
const [isMobile, setIsMobile] = useState(false);
const [isTablet, setIsTablet] = useState(false);
const [isDesktop, setIsDesktop] = useState(false);
// breakpoints from variables.scss
const breakpoint = {
mobile: 480,
tablet: 720,
desktop: 1080,
};
const { width } = useWindowSize();
useEffect(() => {
if (width < breakpoint.mobile) {
setIsMobile(true);
setIsTablet(false);
setIsDesktop(false);
return;
}
if (width < breakpoint.tablet) {
setIsMobile(false);
setIsTablet(true);
setIsDesktop(false);
return;
}
setIsMobile(false);
setIsTablet(false);
setIsDesktop(true);
}, [width]);
return { isMobile, isTablet, isDesktop };
};
const useViewport = () => {
const { isMobile, isTablet, isDesktop } = useBreakpoint();
const windowSize = useWindowSize();
return { isMobile, isTablet, isDesktop, windowSize };
};
export default useViewport;