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
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
|
|
};
|
|
});
|