UNPKG

@fe6/water-pro

Version:

An enterprise-class UI design language and Vue-based implementation

91 lines (79 loc) 2.42 kB
/** @format */ import { ref, computed, ComputedRef, unref } from 'vue'; import { useEventListener } from '../../../_util/hooks/use-event-listener'; import { screenMap, sizeEnum, screenEnum } from '../enums/breakpoint'; 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, }; }