114 lines
3.2 KiB
TypeScript
114 lines
3.2 KiB
TypeScript
import { request, redirectToLogin } from '../../utils/request'
|
|
import * as auth from '../../utils/auth'
|
|
import { PagedResult, ClothesItem, QuotaItem } from '../../types/models'
|
|
import { QuotaType } from '../../utils/config'
|
|
|
|
const CATEGORIES = [
|
|
{ name: '全部', value: '' },
|
|
{ name: '上装', value: '上装' },
|
|
{ name: '下装', value: '下装' },
|
|
{ name: '连衣裙', value: '连衣裙' },
|
|
{ name: '外套', value: '外套' },
|
|
{ name: '鞋', value: '鞋' },
|
|
{ name: '配饰', value: '配饰' },
|
|
]
|
|
|
|
Page({
|
|
data: {
|
|
categories: CATEGORIES,
|
|
activeCategory: 0,
|
|
list: [] as ClothesItem[],
|
|
total: 0,
|
|
uploadRemain: 0,
|
|
loading: true,
|
|
refreshing: false,
|
|
page: 1,
|
|
pageSize: 20,
|
|
hasMore: true,
|
|
},
|
|
|
|
onShow() {
|
|
this.syncTabBar()
|
|
// 未登录直接回登录页(幂等跳转),不再发出必然 401 的请求
|
|
if (!auth.isLoggedIn()) {
|
|
redirectToLogin()
|
|
return
|
|
}
|
|
this.refresh()
|
|
},
|
|
|
|
syncTabBar() {
|
|
const tabBar = (this as any).getTabBar && (this as any).getTabBar()
|
|
if (tabBar) tabBar.setData({ selected: 0 })
|
|
},
|
|
|
|
refresh() {
|
|
this.setData({ page: 1, hasMore: true, loading: this.data.list.length === 0 })
|
|
this.fetchList(1)
|
|
this.fetchQuota()
|
|
},
|
|
|
|
onRefresh() {
|
|
this.setData({ refreshing: true })
|
|
Promise.all([this.fetchList(1), this.fetchQuota()]).finally(() => {
|
|
this.setData({ refreshing: false })
|
|
})
|
|
},
|
|
|
|
onReachBottom() {
|
|
if (!this.data.hasMore || this.data.loading) return
|
|
this.fetchList(this.data.page + 1)
|
|
},
|
|
|
|
fetchList(page: number): Promise<void> {
|
|
const cat = CATEGORIES[this.data.activeCategory].value
|
|
const params: Record<string, any> = { page, page_size: this.data.pageSize }
|
|
if (cat) params.category_main = cat
|
|
|
|
return request<PagedResult<ClothesItem>>({ url: '/clothes', data: params })
|
|
.then((res) => {
|
|
const list = res.list.map((it) => ({
|
|
...it,
|
|
_statusText: !it.category_main && !it.processed_image ? 'AI 处理中' : '',
|
|
_statusType: 'blue',
|
|
}))
|
|
const merged = page === 1 ? list : this.data.list.concat(list)
|
|
this.setData({
|
|
list: merged,
|
|
total: res.total,
|
|
hasMore: merged.length < res.total,
|
|
loading: false,
|
|
page,
|
|
})
|
|
})
|
|
.catch(() => {
|
|
this.setData({ loading: false })
|
|
})
|
|
},
|
|
|
|
fetchQuota(): Promise<void> {
|
|
return request<{ quotas: QuotaItem[] }>({ url: '/quota/info', showError: false, silentAuth: true })
|
|
.then((res) => {
|
|
const upload = res.quotas.find((q) => q.quota_type === QuotaType.UPLOAD)
|
|
if (upload) this.setData({ uploadRemain: upload.remain })
|
|
})
|
|
.catch(() => {})
|
|
},
|
|
|
|
onCategoryTap(e: WechatMiniprogram.TouchEvent) {
|
|
const index = Number(e.currentTarget.dataset.index)
|
|
if (index === this.data.activeCategory) return
|
|
this.setData({ activeCategory: index, list: [], loading: true })
|
|
this.refresh()
|
|
},
|
|
|
|
onClothesTap(e: WechatMiniprogram.CustomEvent) {
|
|
const item = e.detail.item as ClothesItem
|
|
wx.navigateTo({ url: `/pages/clothes-detail/clothes-detail?uuid=${item.clothes_uuid}` })
|
|
},
|
|
|
|
onUpload() {
|
|
wx.navigateTo({ url: '/pages/upload/upload' })
|
|
},
|
|
})
|