topfans/frontend/pages/square/composables/useBanner.js
2026-06-04 15:57:42 +08:00

71 lines
1.9 KiB
JavaScript

import { ref } from 'vue'
import { getActivityListApi, getMintingActivitiesApi } from '@/utils/api.js'
// 默认 banner(接口失败/无数据时兜底)
const FALLBACK_BANNER = [
{
image_url: '/static/sucai/image-05.png',
title: '这河非遇美学宇宙联名',
link_type: 'activity',
link_value: '1'
}
]
export function useBanner() {
// 旧的活动 banner(square 顶部)
const bannerActivities = ref([])
// 新的运营 banner(铸造活动)
const banners = ref([])
const loadBannerActivities = async () => {
try {
const starId = uni.getStorageSync('star_id') || null
const res = await getActivityListApi(starId, 1, 10)
if (res.code === 200 && res.data?.activities) {
const activities = res.data.activities
// 过滤掉已过期的活动
bannerActivities.value = activities.filter(item => item.status !== 'expired')
}
} catch (e) {
console.error('[useBanner] 加载 banner 活动失败', e?.message ?? e)
}
}
// 加载运营 banner(铸造活动)
const loadBanners = async () => {
try {
const res = await getMintingActivitiesApi(null, 1, 10)
if (res.code === 200 && res.data?.activities) {
// 将后端数据映射为 BannerCarousel 约定的字段
banners.value = res.data.activities.map(activity => ({
id: activity.id,
image_url: activity.cover_image,
title: activity.title,
link_type: 'activity',
link_value: String(activity.id),
description: activity.description,
route: activity.route
}))
}
// 无数据兜底
if (banners.value.length === 0) {
banners.value = [...FALLBACK_BANNER]
}
} catch (e) {
console.error('[useBanner] 加载运营 banner 失败', e?.message ?? e)
banners.value = [...FALLBACK_BANNER]
}
}
return {
bannerActivities,
banners,
loadBannerActivities,
loadBanners
}
}