Files
fini-ui/src/hooks/useResize.ts
T
2023-04-12 14:40:19 +08:00

49 lines
1.1 KiB
TypeScript

import { watch, onMounted, onBeforeMount, onBeforeUnmount } from "vue";
import { useRoute } from "vue-router";
import { useAppStore } from "@/stores/app";
const { body } = document;
const WIDTH = 992; // refer to Bootstrap's responsive design
export function useResize() {
const route = useRoute();
const appStore = useAppStore();
watch(route, () => {
if (appStore.device === "mobile" && appStore.sidebar.opened) {
appStore.closeSidebar(false);
}
});
const isMobile = () => {
const rect = body.getBoundingClientRect();
return rect.width - 1 < WIDTH;
};
const resizeHandler = () => {
if (!document.hidden) {
const mobile = isMobile();
appStore.toggleDevice(mobile ? "mobile" : "desktop");
if (mobile) {
appStore.closeSidebar(true);
}
}
};
onBeforeMount(() => {
window.addEventListener("resize", resizeHandler);
});
onBeforeUnmount(() => {
window.removeEventListener("resize", resizeHandler);
});
onMounted(() => {
const mobile = isMobile();
if (mobile) {
appStore.toggleDevice("mobile");
appStore.closeSidebar(true);
}
});
}