import { defineStore } from 'pinia' import type { Activity, Announcement, CarouselItem } from '@/api' export type CloseType = 'today' | 'week' | 'permanent' export const useAnnouncementStore = defineStore( 'announcement', () => { // 弹窗显示状态 const isDialogVisible = ref(false) // 公告数据 const carousels = ref([]) const activities = ref([]) const announcements = ref([]) // 关闭记录 const closeType = ref(null) const closedAt = ref(null) // 打开弹窗 const openDialog = () => { isDialogVisible.value = true } // 关闭弹窗 const closeDialog = (type: CloseType) => { isDialogVisible.value = false closeType.value = type closedAt.value = Date.now() } // 检查是否应该显示弹窗 const shouldShowDialog = computed(() => { if (!closedAt.value || !closeType.value) return true const now = Date.now() const elapsed = now - closedAt.value if (closeType.value === 'permanent') return false if (closeType.value === 'today') { // 检查是否已过去一天(24小时) return elapsed > 24 * 60 * 60 * 1000 } if (closeType.value === 'week') { // 检查是否已过去一周(7天) return elapsed > 7 * 24 * 60 * 60 * 1000 } return true }) // 设置公告数据 const setAnnouncementData = (data: { carousels: CarouselItem[] activities: Activity[] announcements: Announcement[] }) => { carousels.value = data.carousels activities.value = data.activities announcements.value = data.announcements } // 重置关闭状态(用于测试或管理员重置) const resetCloseStatus = () => { closeType.value = null closedAt.value = null } return { isDialogVisible, carousels, activities, announcements, closeType, closedAt, shouldShowDialog, openDialog, closeDialog, setAnnouncementData, resetCloseStatus, } }, { persist: { // 只持久化关闭状态相关的数据 paths: ['closeType', 'closedAt'], }, }, )