import { useTimeoutFn, useIntervalFn } from '@vueuse/core' import { useDateFormat } from '@vueuse/core' import { useSettingStore } from '@/store/modules/setting' import { storeToRefs } from 'pinia' import { computed } from 'vue' import { mittBus } from '@/utils/sys' import { festivalConfigList } from '@/config/festival' // 节日庆祝相关配置 export function useCeremony() { const settingStore = useSettingStore() const { holidayFireworksLoaded, isShowFireworks } = storeToRefs(settingStore) // 烟花间隔引用,用于清理 let fireworksInterval: { pause: () => void } | null = null // 判断当前日期是否是节日 const currentFestivalData = computed(() => { const currentDate = useDateFormat(new Date(), 'YYYY-MM-DD').value return festivalConfigList.find((item) => item.date === currentDate) }) // 节日庆祝相关配置 const FESTIVAL_CONFIG = { INITIAL_DELAY: 300, // 初始延迟时间,单位毫秒 FIREWORK_INTERVAL: 1000, // 烟花效果触发间隔,单位毫秒 TEXT_DELAY: 2000, // 文本显示延迟时间,单位毫秒 MAX_TRIGGERS: 6 // 最大触发次数 } as const // 根据节日列表显示节日祝福 const openFestival = () => { // 没有节日数据,不显示 if (!currentFestivalData.value) return // 礼花效果结束,不显示 if (!isShowFireworks.value) return let triggers = 0 const { start: startFireworks } = useTimeoutFn(() => { const { pause } = useIntervalFn(() => { // console.log(currentFestivalData.value?.image) mittBus.emit('triggerFireworks', currentFestivalData.value?.image) triggers++ if (triggers >= FESTIVAL_CONFIG.MAX_TRIGGERS) { pause() settingStore.setholidayFireworksLoaded(true) // 主页显示节日文本 useTimeoutFn(() => { settingStore.setShowFestivalText(true) setFestivalDate() }, FESTIVAL_CONFIG.TEXT_DELAY) } }, FESTIVAL_CONFIG.FIREWORK_INTERVAL) fireworksInterval = { pause } }, FESTIVAL_CONFIG.INITIAL_DELAY) startFireworks() } // 清理函数 const cleanup = () => { if (fireworksInterval) { fireworksInterval.pause() settingStore.setShowFestivalText(false) setFestivalDate() } } // 设置节日日期 const setFestivalDate = () => { settingStore.setFestivalDate(currentFestivalData.value?.date || '') } return { openFestival, cleanup, holidayFireworksLoaded, currentFestivalData, isShowFireworks } }