Files
2026-09-21 16:01:26 +08:00

24 lines
3.0 KiB
TypeScript

import { request, upload } from '../../utils/api'
import type { Activity } from '../../types/models'
const app = getApp<IAppOption>()
interface ActivityData { id: string; activity: Activity | null; user: CoffeeChatUser | null; joined: boolean; purpose: string; showPurpose: boolean; submitting: boolean }
Page<ActivityData, WechatMiniprogram.Page.CustomOption>({
data: { id: '', activity: null, user: null, joined: false, purpose: '', showPurpose: false, submitting: false },
onLoad({ id }) { this.setData({ id, user: app.globalData.user || wx.getStorageSync('user') }); app.ensureLogin().then((user) => { this.setData({ user }); void this.load() }).catch(() => this.load()) },
onShow() { if (this.data.activity) void this.load() },
async load() {
try { const activity = await request<Activity>(`/api/activities/${this.data.id}`); const mine = activity.participants.find((person) => person.id === this.data.user?.id); this.setData({ activity, joined: Boolean(mine), purpose: mine?.purpose || '' }) }
catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '加载失败', icon: 'none' }) }
},
preview(event: WechatMiniprogram.TouchEvent) { const activity = this.data.activity; if (activity) wx.previewImage({ current: event.currentTarget.dataset.url, urls: activity.images.map((image) => image.url) }) },
editPurpose() { this.setData({ showPurpose: true }) },
purposeInput(event: WechatMiniprogram.CustomEvent<{ value: string }>) { this.setData({ purpose: event.detail.value }) },
closePurpose() { this.setData({ showPurpose: false }) },
async savePurpose() { this.setData({ submitting: true }); try { await request(`/api/activities/${this.data.id}/participations/me`, { method: 'PUT', data: { purpose: this.data.purpose } }); this.setData({ showPurpose: false }); await this.load(); wx.showToast({ title: '已加入' }) } catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '提交失败', icon: 'none' }) } finally { this.setData({ submitting: false }) } },
leave() { wx.showModal({ title: '退出活动?', content: '你的参与目的也会被移除', success: ({ confirm }) => { if (confirm) void request(`/api/activities/${this.data.id}/participations/me`, { method: 'DELETE' }).then(() => this.load()) } }) },
openGroup(event: WechatMiniprogram.TouchEvent) { wx.previewImage({ urls: [event.currentTarget.dataset.url] }) },
submitGroup() { wx.chooseMedia({ count: 1, mediaType: ['image'], success: async ({ tempFiles }) => { wx.showLoading({ title: '上传中' }); try { const file = await upload(tempFiles[0].tempFilePath); await request(`/api/activities/${this.data.id}/participations/groups`, { method: 'POST', data: { name: `${this.data.activity?.title || '活动'}交流群`, qrImageUrl: file.url, note: '用户提交,待管理员核验' } }); wx.showToast({ title: '已提交审核' }) } catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '上传失败', icon: 'none' }) } finally { wx.hideLoading() } } }) }
})