refactor: migrate mini program to TypeScript
CI / test (push) Successful in 15s

This commit is contained in:
2026-09-21 16:01:26 +08:00
parent c0b6dd31ae
commit 4e6019ec61
21 changed files with 209 additions and 25 deletions
-2
View File
@@ -1,2 +0,0 @@
const api = require('../../utils/api')
Page({data:{activities:[],exhibitions:[],tags:[],exhibitionIndex:0,selectedTag:'',time:'available',loading:true},onLoad(){this.loadMeta()},onShow(){if(this.data.exhibitions.length)this.loadActivities()},onPullDownRefresh(){this.loadActivities().finally(wx.stopPullDownRefresh)},async loadMeta(){try{const data=await api.request('/api/activities/meta');this.setData({exhibitions:[{id:'',name:'全部会展'}].concat(data.exhibitions),tags:data.tags});await this.loadActivities()}catch(e){this.fail(e)}},async loadActivities(){this.setData({loading:true});const exhibition=this.data.exhibitions[this.data.exhibitionIndex];const qs=[`time=${this.data.time}`];if(exhibition&&exhibition.id)qs.push(`exhibitionId=${exhibition.id}`);if(this.data.selectedTag)qs.push(`tagId=${this.data.selectedTag}`);try{const activities=await api.request(`/api/activities?${qs.join('&')}`);this.setData({activities,loading:false})}catch(e){this.fail(e)}},changeExhibition(e){this.setData({exhibitionIndex:Number(e.detail.value)});this.loadActivities()},selectTag(e){this.setData({selectedTag:this.data.selectedTag===e.currentTarget.dataset.id?'':e.currentTarget.dataset.id});this.loadActivities()},setTime(e){this.setData({time:e.currentTarget.dataset.value});this.loadActivities()},open(e){wx.navigateTo({url:`/pages/activity/index?id=${e.currentTarget.dataset.id}`})},fail(e){this.setData({loading:false});wx.showToast({title:e.message||'加载失败',icon:'none'})}})
+34
View File
@@ -0,0 +1,34 @@
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' }) }
})