40 lines
1.3 KiB
JavaScript
40 lines
1.3 KiB
JavaScript
import { ref } from 'vue'
|
|
import { getActivityListApi, getOssPresignedUrlApi } from '@/utils/api.js'
|
|
|
|
export function useBanner() {
|
|
const bannerActivities = ref([])
|
|
|
|
const loadBannerActivities = async () => {
|
|
try {
|
|
const starId = uni.getStorageSync('star_id') || null
|
|
const res = await getActivityListApi(starId, 'active', 1, 3)
|
|
|
|
if (res.code === 200 && res.data?.activities) {
|
|
const activities = res.data.activities
|
|
// 并行获取所有 OSS URL
|
|
const urlPromises = activities.map(async (item) => {
|
|
if (!item.cover_image) return { item, url: null }
|
|
try {
|
|
const r = await getOssPresignedUrlApi(item.cover_image, 3600, 'avatar')
|
|
return { item, url: r?.code === 200 && r.data?.url ? r.data.url : null }
|
|
} catch (e) {
|
|
console.error('[useBanner] 获取 OSS URL 失败', e)
|
|
return { item, url: null }
|
|
}
|
|
})
|
|
const results = await Promise.all(urlPromises)
|
|
bannerActivities.value = results.map(({ item, url }) =>
|
|
url ? { ...item, cover_image: url } : item
|
|
)
|
|
}
|
|
} catch (e) {
|
|
console.error('[useBanner] 加载 banner 活动失败', e?.message ?? e)
|
|
}
|
|
}
|
|
|
|
return {
|
|
bannerActivities,
|
|
loadBannerActivities,
|
|
}
|
|
}
|