You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.5 KiB

import { defineStore } from 'pinia';
import { ref } from 'vue';
export const useUIStore = defineStore('ui', () => {
// 状态
const isMobileView = ref(false);
const isSidebarCollapsed = ref(false);
const isDarkMode = ref(false);
const isLoading = ref(false);
const loadingText = ref('加载中...');
// 检测是否为移动视图
const checkMobileView = () => {
isMobileView.value = window.innerWidth < 768;
};
// 切换侧边栏状态
const toggleSidebar = () => {
isSidebarCollapsed.value = !isSidebarCollapsed.value;
};
// 切换暗黑模式
const toggleDarkMode = () => {
isDarkMode.value = !isDarkMode.value;
// 应用暗黑模式到文档
if (isDarkMode.value) {
document.documentElement.classList.add('dark-mode');
} else {
document.documentElement.classList.remove('dark-mode');
}
};
// 设置加载状态
const setLoading = (loading: boolean, text?: string) => {
isLoading.value = loading;
if (text) {
loadingText.value = text;
}
};
// 初始化
const initialize = () => {
// 检测移动视图
checkMobileView();
window.addEventListener('resize', checkMobileView);
// 检测系统暗黑模式偏好
const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (prefersDarkMode) {
toggleDarkMode();
}
};
return {
isMobileView,
isSidebarCollapsed,
isDarkMode,
isLoading,
loadingText,
toggleSidebar,
toggleDarkMode,
setLoading,
initialize
};
});