2023-04-07 00:12:26 +08:00
|
|
|
import { type AnyFunction } from '@vben/types';
|
2021-11-24 23:16:53 +08:00
|
|
|
import { tryOnMounted, tryOnUnmounted, useDebounceFn } from '@vueuse/core';
|
2020-09-28 20:19:10 +08:00
|
|
|
|
2023-04-07 00:12:26 +08:00
|
|
|
interface UseWindowSizeOptions {
|
|
|
|
|
wait?: number;
|
2020-09-28 20:19:10 +08:00
|
|
|
once?: boolean;
|
|
|
|
|
immediate?: boolean;
|
|
|
|
|
listenerOptions?: AddEventListenerOptions | boolean;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-07 00:12:26 +08:00
|
|
|
function useWindowSizeFn(fn: AnyFunction, options: UseWindowSizeOptions = {}) {
|
|
|
|
|
const { wait = 150, immediate } = options;
|
2020-09-28 20:19:10 +08:00
|
|
|
let handler = () => {
|
|
|
|
|
fn();
|
|
|
|
|
};
|
2021-04-10 20:32:44 +08:00
|
|
|
const handleSize = useDebounceFn(handler, wait);
|
2020-09-28 20:19:10 +08:00
|
|
|
handler = handleSize;
|
|
|
|
|
|
2020-10-19 23:50:47 +08:00
|
|
|
const start = () => {
|
2023-04-07 00:12:26 +08:00
|
|
|
if (immediate) {
|
2020-10-19 22:56:10 +08:00
|
|
|
handler();
|
|
|
|
|
}
|
2020-09-28 20:19:10 +08:00
|
|
|
window.addEventListener('resize', handler);
|
2020-10-19 23:50:47 +08:00
|
|
|
};
|
2020-10-15 21:12:38 +08:00
|
|
|
|
2020-10-19 23:50:47 +08:00
|
|
|
const stop = () => {
|
2020-09-28 20:19:10 +08:00
|
|
|
window.removeEventListener('resize', handler);
|
2020-10-19 23:50:47 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
tryOnMounted(() => {
|
|
|
|
|
start();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
tryOnUnmounted(() => {
|
|
|
|
|
stop();
|
2020-09-28 20:19:10 +08:00
|
|
|
});
|
2023-04-07 00:12:26 +08:00
|
|
|
return { start, stop };
|
2020-09-28 20:19:10 +08:00
|
|
|
}
|
2023-04-07 00:12:26 +08:00
|
|
|
|
|
|
|
|
export { useWindowSizeFn, type UseWindowSizeOptions };
|