2026-01-06 19:55:33 +08:00

98 lines
2.9 KiB
JavaScript

/**
* 期数据管理 Composable
*/
import { ref, computed } from 'vue'
import { getActivityIssues } from '@/api/appUser'
import { normalizeIssues, pickLatestIssueId } from '@/utils/activity'
/**
* 期数据管理
* @param {Ref<string>} activityIdRef - 活动ID的响应式引用
*/
export function useIssues(activityIdRef) {
const issues = ref([])
const selectedIssueIndex = ref(0)
const loading = ref(false)
const currentIssueId = computed(() => {
const arr = issues.value || []
const cur = arr[selectedIssueIndex.value]
return (cur && cur.id) || ''
})
const currentIssue = computed(() => {
const arr = issues.value || []
return arr[selectedIssueIndex.value] || null
})
const currentIssueTitle = computed(() => {
const cur = currentIssue.value
if (!cur) return '-'
return cur.title || ('第' + (cur.no || '-') + '期')
})
const currentIssueStatusText = computed(() => {
const cur = currentIssue.value
return (cur && cur.status_text) || ''
})
async function fetchIssues() {
const id = activityIdRef?.value || activityIdRef
console.log('[useIssues] fetchIssues called with activityId:', id)
if (!id) {
console.warn('[useIssues] No activityId, skipping fetchIssues')
return
}
loading.value = true
try {
const data = await getActivityIssues(id)
console.log('[useIssues] getActivityIssues response:', data)
issues.value = normalizeIssues(data)
console.log('[useIssues] Normalized issues:', issues.value)
const latestId = pickLatestIssueId(issues.value)
console.log('[useIssues] Latest issue ID:', latestId)
setSelectedById(latestId)
console.log('[useIssues] currentIssueId after setSelectedById:', currentIssueId.value)
} catch (e) {
console.error('fetchIssues error', e)
issues.value = []
} finally {
loading.value = false
}
}
function setSelectedById(id) {
const arr = issues.value || []
const idx = Math.max(0, arr.findIndex(x => x && x.id === id))
selectedIssueIndex.value = idx
}
function prevIssue() {
const arr = issues.value || []
if (!arr.length) return
const next = Math.max(0, Number(selectedIssueIndex.value || 0) - 1)
selectedIssueIndex.value = next
}
function nextIssue() {
const arr = issues.value || []
if (!arr.length) return
const next = Math.min(arr.length - 1, Number(selectedIssueIndex.value || 0) + 1)
selectedIssueIndex.value = next
}
return {
issues,
selectedIssueIndex,
loading,
currentIssueId,
currentIssue,
currentIssueTitle,
currentIssueStatusText,
fetchIssues,
setSelectedById,
prevIssue,
nextIssue
}
}