12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import { ref, computed, ComputedRef, unref } from 'vue';
- import { useEventListener } from '/@/hooks/event/useEventListener';
- import { screenMap, sizeEnum, screenEnum } from '/@/enums/breakpointEnum';
- let globalScreenRef: ComputedRef<sizeEnum | undefined>;
- let globalWidthRef: ComputedRef<number>;
- let globalRealWidthRef: ComputedRef<number>;
- export interface CreateCallbackParams {
- screen: ComputedRef<sizeEnum | undefined>;
- width: ComputedRef<number>;
- realWidth: ComputedRef<number>;
- screenEnum: typeof screenEnum;
- screenMap: Map<sizeEnum, number>;
- sizeEnum: typeof sizeEnum;
- }
- export function useBreakpoint() {
- return {
- screenRef: computed(() => unref(globalScreenRef)),
- widthRef: globalWidthRef,
- screenEnum,
- realWidthRef: globalRealWidthRef,
- };
- }
- // Just call it once
- export function createBreakpointListen(fn?: (opt: CreateCallbackParams) => void) {
- const screenRef = ref<sizeEnum>(sizeEnum.XL);
- const realWidthRef = ref(window.innerWidth);
- function getWindowWidth() {
- const width = document.body.clientWidth;
- const xs = screenMap.get(sizeEnum.XS)!;
- const sm = screenMap.get(sizeEnum.SM)!;
- const md = screenMap.get(sizeEnum.MD)!;
- const lg = screenMap.get(sizeEnum.LG)!;
- const xl = screenMap.get(sizeEnum.XL)!;
- if (width < xs) {
- screenRef.value = sizeEnum.XS;
- } else if (width < sm) {
- screenRef.value = sizeEnum.SM;
- } else if (width < md) {
- screenRef.value = sizeEnum.MD;
- } else if (width < lg) {
- screenRef.value = sizeEnum.LG;
- } else if (width < xl) {
- screenRef.value = sizeEnum.XL;
- } else {
- screenRef.value = sizeEnum.XXL;
- }
- realWidthRef.value = width;
- }
- useEventListener({
- el: window,
- name: 'resize',
- listener: () => {
- getWindowWidth();
- resizeFn();
- },
- });
- getWindowWidth();
- globalScreenRef = computed(() => unref(screenRef));
- globalWidthRef = computed((): number => screenMap.get(unref(screenRef)!)!);
- globalRealWidthRef = computed((): number => unref(realWidthRef));
- function resizeFn() {
- fn?.({
- screen: globalScreenRef,
- width: globalWidthRef,
- realWidth: globalRealWidthRef,
- screenEnum,
- screenMap,
- sizeEnum,
- });
- }
- resizeFn();
- return {
- screenRef: globalScreenRef,
- screenEnum,
- widthRef: globalWidthRef,
- realWidthRef: globalRealWidthRef,
- };
- }
|