Files
webgame-frontend/src/stores/modules/baseLayout.ts
2026-06-18 12:37:57 +08:00

70 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineStore } from 'pinia'
import { ref } from 'vue'
/** 侧边栏最小宽度 */
export const MIN_SIDEBAR_WIDTH = 200
/** 侧边栏最大宽度 */
export const MAX_SIDEBAR_WIDTH = 650
/** 侧边栏默认宽度 */
export const DEFAULT_SIDEBAR_WIDTH = 400
export const useBaseLayoutStore = defineStore(
'baseLayout',
() => {
/** 顶部导航栏标题 */
const topbarTitle = ref<string>('')
/** 当前选中的游戏 ID */
const activeGameId = ref<string>('snake')
/** 当前选中的游戏图标 */
const activeGameIcon = ref<string>('🐍')
/** 当前选中的游戏名称 */
const activeGameName = ref<string>('贪吃蛇')
/** 侧边栏当前宽度 */
const sidebarWidth = ref<number>(DEFAULT_SIDEBAR_WIDTH)
/**
* 设置顶部导航栏标题
* @param title - 标题文本
*/
const setTopbarTitle = (title: string): void => {
topbarTitle.value = title
}
/**
* 更新当前选中的游戏信息
* @param id - 游戏 ID
* @param icon - 游戏图标
* @param name - 游戏名称
*/
const setActiveGame = (id: string, icon: string, name: string): void => {
activeGameId.value = id
activeGameIcon.value = icon
activeGameName.value = name
}
/**
* 设置侧边栏宽度,自动约束在最小和最大值之间
* @param width - 新宽度px
*/
const setSidebarWidth = (width: number): void => {
sidebarWidth.value = Math.min(Math.max(width, MIN_SIDEBAR_WIDTH), MAX_SIDEBAR_WIDTH)
}
return {
topbarTitle,
activeGameId,
activeGameIcon,
activeGameName,
sidebarWidth,
setTopbarTitle,
setActiveGame,
setSidebarWidth
}
},
{
persist: {
pick: ['activeGameId', 'activeGameIcon', 'activeGameName']
}
}
)