Files
dygou_go/frontend/src/composables/useActivity.ts
T
2026-07-29 14:02:56 +08:00

65 lines
1.9 KiB
TypeScript

import { ref } from 'vue'
import { useToast } from './useToast'
import { GetActivities, GetCurrentActivity, SwitchActivity } from '@wails/go/app/App'
// 活动项(与后端 types.ActivityInfo 对齐)
export interface ActivityItem {
id: string
displayName: string
}
// 模块级单例:活动列表与当前活动在所有组件中共享同一份状态
const activities = ref<ActivityItem[]>([])
const currentActivity = ref<ActivityItem | null>(null)
const switching = ref(false)
// 统一走 Wails 自动生成绑定,后端签名变化时可由 TypeScript 暴露问题。
export function useActivity() {
const { showToast } = useToast()
// 拉取全部活动与当前生效活动
const loadActivities = async () => {
try {
const list = await GetActivities()
activities.value = list || []
try {
currentActivity.value = await GetCurrentActivity()
} catch {
// 当前活动读取失败不阻塞列表展示
}
} catch (e: any) {
showToast('读取活动列表失败', e?.message || '', 'error')
}
}
// 切换活动;成功返回 true,调用方可据此刷新商品等数据
const switchActivity = async (id: string): Promise<boolean> => {
if (id === currentActivity.value?.id) return true
switching.value = true
try {
const d: Record<string, any> = await SwitchActivity(id)
if (d && d.success) {
currentActivity.value = { id: d.activity, displayName: d.displayName }
showToast('活动已切换', (d.displayName || id) + ',正在刷新商品...', 'success')
return true
}
showToast('切换失败', d?.error || '', 'error')
return false
} catch (e: any) {
showToast('切换失败', e?.message || '', 'error')
return false
} finally {
switching.value = false
}
}
return {
activities,
currentActivity,
switching,
loadActivities,
switchActivity
}
}