fix:bug
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { request, redirectToLogin } from '../../utils/request'
|
||||
import * as auth from '../../utils/auth'
|
||||
import { PagedResult, ClosetShareItem } from '../../types/models'
|
||||
import { PagedResult, ClosetShareItem, OutfitShareItem } from '../../types/models'
|
||||
import { ShareStatus, ShareType } from '../../utils/config'
|
||||
import { normalizePaged, mergePaged, hasMorePaged } from '../../utils/paged'
|
||||
import { setTabBarSelected } from '../../utils/tabbar'
|
||||
@@ -9,6 +9,21 @@ import { logger } from '../../utils/logger'
|
||||
// 日志模块名
|
||||
const LOG = 'closet-share'
|
||||
|
||||
// 统一的分享列表项:衣柜分享与穿搭分享合并展示
|
||||
interface ShareListItem {
|
||||
kind: 'closet' | 'outfit'
|
||||
share_uuid: string
|
||||
title: string
|
||||
typeText: string
|
||||
expireText: string
|
||||
status: number
|
||||
created_at: number
|
||||
owner_name?: string
|
||||
owner_avatar?: string
|
||||
cover?: string
|
||||
_invalid: boolean
|
||||
}
|
||||
|
||||
Page({
|
||||
data: {
|
||||
tabs: [
|
||||
@@ -16,7 +31,7 @@ Page({
|
||||
{ name: '分享给我的' },
|
||||
],
|
||||
activeTab: 0, // 0 我的分享 1 分享给我的
|
||||
list: [] as ClosetShareItem[],
|
||||
list: [] as ShareListItem[],
|
||||
loading: true,
|
||||
loadingMore: false,
|
||||
page: 1,
|
||||
@@ -63,19 +78,26 @@ Page({
|
||||
},
|
||||
|
||||
fetchList(page: number) {
|
||||
const url = this.data.activeTab === 0 ? '/closet-share' : '/closet-share/received'
|
||||
if (this.data.activeTab === 1) return this.fetchReceived(page)
|
||||
return this.fetchMine(page)
|
||||
},
|
||||
|
||||
// 我的分享:仅衣柜分享
|
||||
fetchMine(page: number) {
|
||||
// 请求序号:切 tab 时旧响应可能后到,序号不匹配直接丢弃
|
||||
const seq = ((this as any).reqSeq || 0) + 1
|
||||
;(this as any).reqSeq = seq
|
||||
if (page > 1) this.setData({ loadingMore: true })
|
||||
|
||||
request<PagedResult<ClosetShareItem>>({ url, data: { page, page_size: this.data.pageSize } })
|
||||
request<PagedResult<ClosetShareItem>>({
|
||||
url: '/closet-share',
|
||||
data: { page, page_size: this.data.pageSize },
|
||||
})
|
||||
.then((res) => {
|
||||
if ((this as any).reqSeq !== seq) return
|
||||
const { list: raw, total } = normalizePaged<ClosetShareItem>(res)
|
||||
logger.debug(LOG, '列表加载成功, tab=', this.data.activeTab, 'page=', page, '条数=', raw && raw.length)
|
||||
const list = raw.map((it) => this.decorate(it))
|
||||
logger.debug(LOG, '我的分享加载成功, page=', page, '条数=', raw && raw.length)
|
||||
const list = raw.map((it) => this.decorateCloset(it))
|
||||
const merged = mergePaged(this.data.list, list, page === 1)
|
||||
this.setData({
|
||||
list: merged,
|
||||
@@ -87,12 +109,50 @@ Page({
|
||||
})
|
||||
.catch((e: any) => {
|
||||
if ((this as any).reqSeq !== seq) return
|
||||
logger.warn(LOG, '列表加载失败, tab=', this.data.activeTab, 'page=', page, 'code=', e && e.code)
|
||||
logger.warn(LOG, '我的分享加载失败, page=', page, 'code=', e && e.code)
|
||||
this.setData({ loading: false, loadingMore: false })
|
||||
})
|
||||
},
|
||||
|
||||
decorate(it: ClosetShareItem) {
|
||||
// 分享给我的:衣柜分享 + 穿搭分享并行拉取后按时间倒序合并
|
||||
fetchReceived(page: number) {
|
||||
const seq = ((this as any).reqSeq || 0) + 1
|
||||
;(this as any).reqSeq = seq
|
||||
if (page > 1) this.setData({ loadingMore: true })
|
||||
|
||||
Promise.all([
|
||||
request<PagedResult<ClosetShareItem>>({
|
||||
url: '/closet-share/received',
|
||||
data: { page, page_size: this.data.pageSize },
|
||||
}),
|
||||
request<PagedResult<OutfitShareItem>>({
|
||||
url: '/outfit-share/received',
|
||||
data: { page, page_size: this.data.pageSize },
|
||||
}),
|
||||
])
|
||||
.then(([closetRes, outfitRes]) => {
|
||||
if ((this as any).reqSeq !== seq) return
|
||||
const closetList = normalizePaged<ClosetShareItem>(closetRes).list.map((it) => this.decorateCloset(it))
|
||||
const outfitList = normalizePaged<OutfitShareItem>(outfitRes).list.map((it) => this.decorateOutfit(it))
|
||||
logger.debug(LOG, '分享给我的加载成功, page=', page, '衣柜=', closetList.length, '穿搭=', outfitList.length)
|
||||
const prev = page === 1 ? [] : this.data.list
|
||||
const merged = prev
|
||||
.concat(closetList, outfitList)
|
||||
.sort((a, b) => (b.created_at || 0) - (a.created_at || 0))
|
||||
// 任一侧仍返回满页则认为还有更多
|
||||
const hasMore =
|
||||
closetList.length >= this.data.pageSize || outfitList.length >= this.data.pageSize
|
||||
this.setData({ list: merged, hasMore, loading: false, loadingMore: false, page })
|
||||
})
|
||||
.catch((e: any) => {
|
||||
if ((this as any).reqSeq !== seq) return
|
||||
logger.warn(LOG, '分享给我的加载失败, page=', page, 'code=', e && e.code)
|
||||
this.setData({ loading: false, loadingMore: false })
|
||||
})
|
||||
},
|
||||
|
||||
// 衣柜分享项:本地惰性过期 + 状态文案
|
||||
decorateCloset(it: ClosetShareItem): ShareListItem {
|
||||
const now = Math.floor(Date.now() / 1000)
|
||||
let status = it.status
|
||||
if (status === ShareStatus.NORMAL && it.expire_time > 0 && it.expire_time < now) {
|
||||
@@ -109,10 +169,15 @@ Page({
|
||||
}
|
||||
|
||||
return {
|
||||
...it,
|
||||
_status: status,
|
||||
_expireText: expireText,
|
||||
_typeText: it.share_type === ShareType.PARTIAL ? '部分衣物' : '全量衣橱',
|
||||
kind: 'closet',
|
||||
share_uuid: it.share_uuid,
|
||||
title: `衣柜分享 · ${it.clothes_count} 件`,
|
||||
typeText: it.share_type === ShareType.PARTIAL ? '部分衣物' : '全量衣橱',
|
||||
expireText,
|
||||
status,
|
||||
created_at: it.created_at || 0,
|
||||
owner_name: it.owner_name,
|
||||
owner_avatar: it.owner_avatar,
|
||||
_invalid:
|
||||
status === ShareStatus.CANCELLED ||
|
||||
status === ShareStatus.EXPIRED ||
|
||||
@@ -120,6 +185,24 @@ Page({
|
||||
}
|
||||
},
|
||||
|
||||
// 穿搭分享项
|
||||
decorateOutfit(it: OutfitShareItem): ShareListItem {
|
||||
const cancelled = it.status === ShareStatus.CANCELLED
|
||||
return {
|
||||
kind: 'outfit',
|
||||
share_uuid: it.share_uuid,
|
||||
title: it.outfit_name || '未命名穿搭',
|
||||
typeText: `穿搭分享 · ${it.items_count} 件`,
|
||||
expireText: cancelled ? '已取消' : '有效',
|
||||
status: it.status,
|
||||
created_at: it.created_at || 0,
|
||||
owner_name: it.owner_name,
|
||||
owner_avatar: it.owner_avatar,
|
||||
cover: it.cover_image,
|
||||
_invalid: cancelled,
|
||||
}
|
||||
},
|
||||
|
||||
onCreate() {
|
||||
wx.navigateTo({
|
||||
url: '/pages/closet-share-create/closet-share-create',
|
||||
@@ -129,9 +212,14 @@ Page({
|
||||
|
||||
onItemTap(e: WechatMiniprogram.TouchEvent) {
|
||||
const uuid = e.currentTarget.dataset.uuid as string
|
||||
logger.debug(LOG, '点击分享项, uuid=', uuid)
|
||||
const kind = e.currentTarget.dataset.kind as string
|
||||
logger.debug(LOG, '点击分享项, kind=', kind, 'uuid=', uuid)
|
||||
const url =
|
||||
kind === 'outfit'
|
||||
? `/pages/outfit-share-detail/outfit-share-detail?uuid=${uuid}`
|
||||
: `/pages/closet-share-detail/closet-share-detail?uuid=${uuid}`
|
||||
wx.navigateTo({
|
||||
url: `/pages/closet-share-detail/closet-share-detail?uuid=${uuid}`,
|
||||
url,
|
||||
fail: (err) => logger.warn(LOG, 'navigateTo 分享详情失败, err=', err && err.errMsg),
|
||||
})
|
||||
},
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
wx:if="{{!loading && !list.length}}"
|
||||
icon="icon-share"
|
||||
title="{{activeTab === 0 ? '还没有分享' : '还没有收到分享'}}"
|
||||
desc="{{activeTab === 0 ? '把衣橱或精选衣物分享给好友' : '好友分享给你的衣橱会出现在这里'}}"
|
||||
desc="{{activeTab === 0 ? '把衣橱或精选衣物分享给好友' : '好友分享给你的衣橱或穿搭会出现在这里'}}"
|
||||
buttonText="{{activeTab === 0 ? '新建分享' : ''}}"
|
||||
bind:action="onCreate"
|
||||
/>
|
||||
@@ -32,14 +32,22 @@
|
||||
wx:for="{{list}}"
|
||||
wx:key="share_uuid"
|
||||
data-uuid="{{item.share_uuid}}"
|
||||
data-kind="{{item.kind}}"
|
||||
bindtap="onItemTap"
|
||||
>
|
||||
<view class="preview-grid">
|
||||
<!-- 衣柜分享:四宫格占位 -->
|
||||
<view class="preview-grid" wx:if="{{item.kind === 'closet'}}">
|
||||
<view class="pg-cell"><view class="icon icon-hanger"></view></view>
|
||||
<view class="pg-cell"><view class="icon icon-hanger"></view></view>
|
||||
<view class="pg-cell"><view class="icon icon-hanger"></view></view>
|
||||
<view class="pg-cell"><view class="icon icon-hanger"></view></view>
|
||||
</view>
|
||||
<!-- 穿搭分享:封面 -->
|
||||
<view class="preview-cover" wx:else>
|
||||
<image wx:if="{{item.cover}}" class="preview-cover-img" src="{{item.cover}}" mode="aspectFill" />
|
||||
<view wx:else class="icon icon-hanger preview-cover-ph"></view>
|
||||
</view>
|
||||
|
||||
<view class="share-info">
|
||||
<view wx:if="{{activeTab === 1}}" class="owner-row">
|
||||
<image wx:if="{{item.owner_avatar}}" class="owner-avatar" src="{{item.owner_avatar}}" mode="aspectFill" />
|
||||
@@ -48,11 +56,11 @@
|
||||
</view>
|
||||
<text class="owner-name">{{item.owner_name || '好友'}}</text>
|
||||
</view>
|
||||
<view class="share-title">衣柜分享 · {{item.clothes_count}} 件</view>
|
||||
<view class="tag tag-gray share-type">{{item._typeText}}</view>
|
||||
<view class="share-expire">{{item._expireText}}</view>
|
||||
<view class="share-title">{{item.title}}</view>
|
||||
<view class="tag tag-gray share-type">{{item.typeText}}</view>
|
||||
<view class="share-expire">{{item.expireText}}</view>
|
||||
</view>
|
||||
<view wx:if="{{item._invalid}}" class="share-badge">{{item._status === 2 ? '已取消' : (item._status === 4 ? '已封禁' : '已过期')}}</view>
|
||||
<view wx:if="{{item._invalid}}" class="share-badge">{{item.status === 2 ? '已取消' : '已失效'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
@@ -85,6 +85,30 @@
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
/* 穿搭分享封面 */
|
||||
.preview-cover {
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 16rpx;
|
||||
background: #F2F2F7;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
flex-shrink: 0;
|
||||
color: #C7C7CC;
|
||||
}
|
||||
|
||||
.preview-cover-img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.preview-cover-ph {
|
||||
width: 64rpx;
|
||||
height: 64rpx;
|
||||
}
|
||||
|
||||
.owner-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
Reference in New Issue
Block a user