35 lines
2.4 KiB
TypeScript
35 lines
2.4 KiB
TypeScript
import { request } from '../../utils/api'
|
|
import type { Activity, CatalogMeta, Exhibition, Tag } from '../../types/models'
|
|
|
|
interface IndexData {
|
|
activities: Activity[]; exhibitions: Exhibition[]; tags: Tag[]; exhibitionIndex: number
|
|
selectedTag: string; time: 'upcoming' | 'available'; loading: boolean
|
|
}
|
|
|
|
Page<IndexData, WechatMiniprogram.Page.CustomOption>({
|
|
data: { activities: [], exhibitions: [], tags: [], exhibitionIndex: 0, selectedTag: '', time: 'available', loading: true },
|
|
onLoad() { void this.loadMeta() },
|
|
onShow() { if (this.data.exhibitions.length) void this.loadActivities() },
|
|
onPullDownRefresh() { void this.loadActivities().finally(() => wx.stopPullDownRefresh()) },
|
|
async loadMeta() {
|
|
try {
|
|
const data = await request<CatalogMeta>('/api/activities/meta')
|
|
const all = { id: '', name: '全部会展', venue: '', address: '', startsAt: '', endsAt: '', description: '' }
|
|
this.setData({ exhibitions: [all, ...data.exhibitions], tags: data.tags }); await this.loadActivities()
|
|
} catch (error) { this.fail(error) }
|
|
},
|
|
async loadActivities() {
|
|
this.setData({ loading: true }); const exhibition = this.data.exhibitions[this.data.exhibitionIndex]
|
|
const query = [`time=${this.data.time}`]
|
|
if (exhibition?.id) query.push(`exhibitionId=${encodeURIComponent(exhibition.id)}`)
|
|
if (this.data.selectedTag) query.push(`tagId=${encodeURIComponent(this.data.selectedTag)}`)
|
|
try { this.setData({ activities: await request<Activity[]>(`/api/activities?${query.join('&')}`), loading: false }) }
|
|
catch (error) { this.fail(error) }
|
|
},
|
|
changeExhibition(event: WechatMiniprogram.CustomEvent<{ value: string }>) { this.setData({ exhibitionIndex: Number(event.detail.value) }); void this.loadActivities() },
|
|
selectTag(event: WechatMiniprogram.TouchEvent) { const id = String(event.currentTarget.dataset.id || ''); this.setData({ selectedTag: this.data.selectedTag === id ? '' : id }); void this.loadActivities() },
|
|
setTime(event: WechatMiniprogram.TouchEvent) { this.setData({ time: event.currentTarget.dataset.value }); void this.loadActivities() },
|
|
open(event: WechatMiniprogram.TouchEvent) { wx.navigateTo({ url: `/pages/activity/index?id=${event.currentTarget.dataset.id}` }) },
|
|
fail(error: unknown) { this.setData({ loading: false }); wx.showToast({ title: error instanceof Error ? error.message : '加载失败', icon: 'none' }) }
|
|
})
|