app.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { defineStore } from "pinia";
  2. import {
  3. type appType,
  4. store,
  5. getConfig,
  6. storageLocal,
  7. deviceDetection,
  8. responsiveStorageNameSpace
  9. } from "../utils";
  10. export const useAppStore = defineStore("pure-app", {
  11. state: (): appType => ({
  12. sidebar: {
  13. opened:
  14. storageLocal().getItem<StorageConfigs>(
  15. `${responsiveStorageNameSpace()}layout`
  16. )?.sidebarStatus ?? getConfig().SidebarStatus,
  17. withoutAnimation: false,
  18. isClickCollapse: false
  19. },
  20. // 这里的layout用于监听容器拖拉后恢复对应的导航模式
  21. layout:
  22. storageLocal().getItem<StorageConfigs>(
  23. `${responsiveStorageNameSpace()}layout`
  24. )?.layout ?? getConfig().Layout,
  25. device: deviceDetection() ? "mobile" : "desktop",
  26. // 浏览器窗口的可视区域大小
  27. viewportSize: {
  28. width: document.documentElement.clientWidth,
  29. height: document.documentElement.clientHeight
  30. },
  31. // 作用于 src/views/components/draggable/index.vue 页面,当离开页面并不会销毁 new Swap(),sortablejs 官网也没有提供任何销毁的 api
  32. sortSwap: false
  33. }),
  34. getters: {
  35. getSidebarStatus(state) {
  36. return state.sidebar.opened;
  37. },
  38. getDevice(state) {
  39. return state.device;
  40. },
  41. getViewportWidth(state) {
  42. return state.viewportSize.width;
  43. },
  44. getViewportHeight(state) {
  45. return state.viewportSize.height;
  46. }
  47. },
  48. actions: {
  49. TOGGLE_SIDEBAR(opened?: boolean, resize?: string) {
  50. const layout = storageLocal().getItem<StorageConfigs>(
  51. `${responsiveStorageNameSpace()}layout`
  52. );
  53. if (opened && resize) {
  54. this.sidebar.withoutAnimation = true;
  55. this.sidebar.opened = true;
  56. layout.sidebarStatus = true;
  57. } else if (!opened && resize) {
  58. this.sidebar.withoutAnimation = true;
  59. this.sidebar.opened = false;
  60. layout.sidebarStatus = false;
  61. } else if (!opened && !resize) {
  62. this.sidebar.withoutAnimation = false;
  63. this.sidebar.opened = !this.sidebar.opened;
  64. this.sidebar.isClickCollapse = !this.sidebar.opened;
  65. layout.sidebarStatus = this.sidebar.opened;
  66. }
  67. storageLocal().setItem(`${responsiveStorageNameSpace()}layout`, layout);
  68. },
  69. async toggleSideBar(opened?: boolean, resize?: string) {
  70. await this.TOGGLE_SIDEBAR(opened, resize);
  71. },
  72. toggleDevice(device: string) {
  73. this.device = device;
  74. },
  75. setLayout(layout) {
  76. this.layout = layout;
  77. },
  78. setViewportSize(size) {
  79. this.viewportSize = size;
  80. },
  81. setSortSwap(val) {
  82. this.sortSwap = val;
  83. }
  84. }
  85. });
  86. export function useAppStoreHook() {
  87. return useAppStore(store);
  88. }