65 lines
1.9 KiB
TypeScript
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
|
|
}
|
|
}
|