AppProvider.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <script lang="ts">
  2. import { defineComponent, toRefs, ref, unref } from 'vue';
  3. import { createAppProviderContext } from './useAppContext';
  4. import designSetting from '/@/settings/designSetting';
  5. import { createBreakpointListen } from '/@/hooks/event/useBreakpoint';
  6. import { propTypes } from '/@/utils/propTypes';
  7. import { appStore } from '/@/store/modules/app';
  8. import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
  9. export default defineComponent({
  10. name: 'AppProvider',
  11. inheritAttrs: false,
  12. props: {
  13. prefixCls: propTypes.string.def(designSetting.prefixCls),
  14. },
  15. setup(props, { slots }) {
  16. const isMobile = ref(false);
  17. const isSetState = ref(false);
  18. createBreakpointListen(({ screenMap, sizeEnum, width }) => {
  19. const lgWidth = screenMap.get(sizeEnum.LG);
  20. if (lgWidth) {
  21. isMobile.value = width.value - 1 < lgWidth;
  22. }
  23. handleRestoreState();
  24. });
  25. const { prefixCls } = toRefs(props);
  26. createAppProviderContext({ prefixCls, isMobile });
  27. function handleRestoreState() {
  28. if (unref(isMobile)) {
  29. if (!unref(isSetState)) {
  30. isSetState.value = true;
  31. const {
  32. menuSetting: {
  33. type: menuType,
  34. mode: menuMode,
  35. collapsed: menuCollapsed,
  36. split: menuSplit,
  37. },
  38. } = appStore.getProjectConfig;
  39. appStore.commitProjectConfigState({
  40. menuSetting: {
  41. type: MenuTypeEnum.SIDEBAR,
  42. mode: MenuModeEnum.INLINE,
  43. split: false,
  44. },
  45. });
  46. appStore.commitBeforeMiniState({ menuMode, menuCollapsed, menuType, menuSplit });
  47. }
  48. } else {
  49. if (unref(isSetState)) {
  50. isSetState.value = false;
  51. const { menuMode, menuCollapsed, menuType, menuSplit } = appStore.getBeforeMiniState;
  52. appStore.commitProjectConfigState({
  53. menuSetting: {
  54. type: menuType,
  55. mode: menuMode,
  56. collapsed: menuCollapsed,
  57. split: menuSplit,
  58. },
  59. });
  60. }
  61. }
  62. }
  63. return () => slots.default?.();
  64. },
  65. });
  66. </script>