61 lines
1.6 KiB
TypeScript

import { pinia } from "@/pinia"
import { DeviceEnum, SIDEBAR_CLOSED, SIDEBAR_OPENED } from "@@/constants/app-key"
import { getSidebarStatus, setSidebarStatus } from "@@/utils/cache/local-storage"
import { defineStore } from "pinia"
interface Sidebar {
opened: boolean
withoutAnimation: boolean
}
/** 设置侧边栏状态本地缓存 */
function handleSidebarStatus(opened: boolean) {
opened ? setSidebarStatus(SIDEBAR_OPENED) : setSidebarStatus(SIDEBAR_CLOSED)
}
export const useAppStore = defineStore("app", () => {
// 侧边栏状态
const sidebar: Sidebar = reactive({
opened: getSidebarStatus() !== SIDEBAR_CLOSED,
withoutAnimation: false
})
// 设备类型
const device = ref<DeviceEnum>(DeviceEnum.Desktop)
// 监听侧边栏 opened 状态
watch(
() => sidebar.opened,
(opened) => {
handleSidebarStatus(opened)
}
)
// 切换侧边栏
const toggleSidebar = (withoutAnimation: boolean) => {
sidebar.opened = !sidebar.opened
sidebar.withoutAnimation = withoutAnimation
}
// 关闭侧边栏
const closeSidebar = (withoutAnimation: boolean) => {
sidebar.opened = false
sidebar.withoutAnimation = withoutAnimation
}
// 切换设备类型
const toggleDevice = (value: DeviceEnum) => {
device.value = value
}
return { device, sidebar, toggleSidebar, closeSidebar, toggleDevice }
})
/**
* @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
* @description 在 SSR 应用中可用于在 setup 外使用 store
*/
export function useAppStoreOutside() {
return useAppStore(pinia)
}