"use client";
import { useEffect, useState } from "react";
import { isIOS } from "src/utils/isDevice";
export function ViewportSizeLayout(props: { children: React.ReactNode }) {
let viewheight = useViewportSize().height;
let difference = useViewportDifference();
return (
{props.children}
);
}
function useViewportDifference(): number {
let [difference, setDifference] = useState(0);
useEffect(() => {
// Use visualViewport api to track available height even on iOS virtual keyboard opening
let onResize = () => {
setDifference(window.innerHeight - getViewportSize().height);
};
if (!visualViewport) {
window.addEventListener("resize", onResize);
} else {
visualViewport.addEventListener("resize", onResize);
}
return () => {
if (!visualViewport) {
window.removeEventListener("resize", onResize);
} else {
visualViewport.removeEventListener("resize", onResize);
}
};
}, []);
return difference;
}
function getViewportSize() {
if (typeof window === "undefined") return { width: 0, height: 0 };
return {
width: visualViewport?.width || window?.innerWidth,
height: visualViewport?.height || window?.innerHeight,
};
}
export function useViewportSize(): {
width: number;
height: number;
} {
let [size, setSize] = useState(() => getViewportSize());
useEffect(() => {
// Use visualViewport api to track available height even on iOS virtual keyboard opening
let onResize = () => {
setSize((size) => {
let newSize = getViewportSize();
if (newSize.width === size.width && newSize.height === size.height) {
return size;
}
return newSize;
});
};
if (!visualViewport) {
window.addEventListener("resize", onResize);
} else {
visualViewport.addEventListener("resize", onResize);
}
return () => {
if (!visualViewport) {
window.removeEventListener("resize", onResize);
} else {
visualViewport.removeEventListener("resize", onResize);
}
};
}, []);
return size;
}