import { request } from '../../utils/request' import { OutfitItem, ClothesItem } from '../../types/models' import { OutfitSource, IsPublic } from '../../utils/config' Page({ data: { uuid: '', isOwner: true, outfit: {} as OutfitItem, clothes: [] as ClothesItem[], isLiked: false, likeCount: 0, isCollected: false, loading: true, }, onLoad(query: Record) { const uuid = query.uuid || '' const isOwner = query.owner !== '0' this.setData({ uuid, isOwner }) if (uuid) this.fetchDetail() }, async fetchDetail() { try { const outfit = await request({ url: `/outfit/${this.data.uuid}` }) this.setData({ outfit }) const clothes = await Promise.all( outfit.items.map(async (it) => { try { return await request({ url: `/clothes/${it.clothes_uuid}`, showError: false }) } catch (e) { return { clothes_uuid: it.clothes_uuid } as ClothesItem } }) ) this.setData({ clothes }) const like = await request<{ is_liked: boolean; like_count: number }>({ url: `/like/${this.data.uuid}`, showError: false, }) this.setData({ isLiked: like.is_liked, likeCount: like.like_count, loading: false }) // 收藏状态:调用后端 /collect/:targetUUID 初始化,失败静默保持未收藏 request<{ is_collected: boolean; collect_count: number }>({ url: `/collect/${this.data.uuid}`, showError: false, }) .then((collect) => this.setData({ isCollected: collect.is_collected })) .catch(() => {}) } catch (e) { this.setData({ loading: false }) } }, onLike() { const action = this.data.isLiked ? 2 : 1 request({ url: '/like', method: 'POST', data: { target_uuid: this.data.uuid, action } }) .then(() => { this.setData({ isLiked: action === 1, likeCount: this.data.likeCount + (action === 1 ? 1 : -1), }) }) .catch(() => {}) }, onCollect() { const action = this.data.isCollected ? 2 : 1 request({ url: '/collect', method: 'POST', data: { target_uuid: this.data.uuid, action } }) .then(() => this.setData({ isCollected: action === 1 })) .catch(() => {}) }, onTogglePublic() { const isPublic = this.data.outfit.is_public === IsPublic.PUBLIC if (isPublic) { this.doPublic(IsPublic.PRIVATE) } else { wx.showModal({ title: '公开到社区', content: '公开后将展示在社区供他人点赞收藏,并消耗 1 次社区分享额度', confirmText: '确认公开', success: (res) => { if (res.confirm) this.doPublic(IsPublic.PUBLIC) }, }) } }, doPublic(isPublic: number) { request({ url: `/outfit/${this.data.uuid}/public`, method: 'PUT', data: { is_public: isPublic } }) .then(() => { this.setData({ 'outfit.is_public': isPublic }) wx.showToast({ title: isPublic === IsPublic.PUBLIC ? '已公开' : '已取消公开', icon: 'none' }) }) .catch(() => {}) }, onMore() { wx.showActionSheet({ itemList: ['编辑穿搭', '删除穿搭'], success: (res) => { if (res.tapIndex === 0) this.onEdit() else this.onDelete() }, }) }, onEdit() { wx.navigateTo({ url: `/pages/outfit-edit/outfit-edit?uuid=${this.data.uuid}` }) }, onDelete() { wx.showModal({ title: '确认删除这套穿搭?', content: '删除后不可恢复,但不会影响衣橱内的单品。', confirmText: '确认删除', confirmColor: '#FF3B30', success: (res) => { if (!res.confirm) return request({ url: `/outfit/${this.data.uuid}`, method: 'DELETE' }) .then(() => { wx.showToast({ title: '已删除', icon: 'success' }) setTimeout(() => wx.navigateBack(), 500) }) .catch(() => {}) }, }) }, onItemTap(e: WechatMiniprogram.TouchEvent) { const uuid = e.currentTarget.dataset.uuid as string wx.navigateTo({ url: `/pages/clothes-detail/clothes-detail?uuid=${uuid}` }) }, onShareAppMessage() { return { title: this.data.outfit.outfit_name || '我的穿搭', path: `/pages/outfit-detail/outfit-detail?uuid=${this.data.uuid}&owner=0`, } }, })