- 新增 addComment/getComments/getFollowList/followUser/getUser/updateProfile/updatePet/deletePet 云函数并完成部署 - 统一通过 app.globalData.navBarInfo 避让系统胶囊按钮(编辑资料/编辑宠物等页面保存按钮被遮挡问题) - 编辑资料页所在城市改为省份 picker 选择 - 修复"我的"页动态为空(getUserPosts 应传 openid 而非数据库 _id) - 重构编辑宠物页:品种改用 picker 滚轮(替代有数量上限的 actionSheet),标签改用 selectedTagSet 映射 + 自定义标签输入(5字以内、仅中英文/数字、最多8个) - 接通宠物保存/删除真实云函数调用并同步本地缓存 - 移除 feed 页对不存在的 getStories 云函数调用,修复模拟器卡死 - 移除 post 页对不存在的 wx.reverseGeocoder API 的调用 - 统一扩展 AppGlobalData 类型并修正所有 getApp 调用的泛型,解决 TS 报错
148 lines
3.7 KiB
TypeScript
148 lines
3.7 KiB
TypeScript
import { Post, AppGlobalData } from '../../types/index'
|
|
import { api } from '../../utils/api'
|
|
import { getAvatarGradient, getPetEmoji } from '../../utils/format'
|
|
import { PAGE_SIZE } from '../../utils/constants'
|
|
|
|
interface FeedTab { key: 'feed' | 'nearby' | 'hot'; label: string }
|
|
|
|
const app = getApp<{ globalData: AppGlobalData }>()
|
|
|
|
Page({
|
|
data: {
|
|
statusBarHeight: 0,
|
|
navbarHeight: 44,
|
|
navbarPaddingRight: 0,
|
|
tabBarHeight: 56,
|
|
posts: [] as Post[],
|
|
stories: [] as any[],
|
|
activeTab: 'feed' as 'feed' | 'nearby' | 'hot',
|
|
feedTabs: [
|
|
{ key: 'feed', label: '关注' },
|
|
{ key: 'nearby', label: '附近' },
|
|
{ key: 'hot', label: '热门' },
|
|
] as FeedTab[],
|
|
loading: false,
|
|
loadingMore: false,
|
|
refreshing: false,
|
|
hasMore: true,
|
|
page: 0,
|
|
hasUnread: false,
|
|
myAvatarGradient: 'linear-gradient(135deg, #ffd6e8, #fff1a6)',
|
|
myEmoji: '🐶',
|
|
},
|
|
|
|
onLoad() {
|
|
const info = wx.getSystemInfoSync()
|
|
const { statusBarHeight, navbarHeight, navbarPaddingRight } = app.globalData.navBarInfo
|
|
this.setData({
|
|
statusBarHeight,
|
|
navbarHeight,
|
|
navbarPaddingRight,
|
|
tabBarHeight: info.windowHeight - (info.safeArea?.bottom ?? info.windowHeight) + 56,
|
|
})
|
|
this.loadFeed(true)
|
|
this.syncMyInfo()
|
|
},
|
|
|
|
onShow() {
|
|
const tabBar = this.getTabBar() as any
|
|
tabBar?.setSelected?.(0)
|
|
},
|
|
|
|
onPullDownRefresh() {
|
|
this.onRefresh()
|
|
},
|
|
|
|
async onRefresh() {
|
|
this.setData({ refreshing: true, page: 0, hasMore: true })
|
|
await this.loadFeed(true)
|
|
this.setData({ refreshing: false })
|
|
},
|
|
|
|
async loadFeed(reset = false) {
|
|
if (!reset && !this.data.hasMore) return
|
|
if (this.data.loading && !reset) return
|
|
|
|
const page = reset ? 0 : this.data.page
|
|
this.setData(reset ? { loading: true } : { loadingMore: true })
|
|
|
|
try {
|
|
const loc = app.globalData?.currentLocation
|
|
const res = await api.getPosts({
|
|
page,
|
|
type: this.data.activeTab,
|
|
latitude: loc?.latitude,
|
|
longitude: loc?.longitude,
|
|
})
|
|
|
|
const posts = reset ? res.list : [...this.data.posts, ...res.list]
|
|
this.setData({
|
|
posts,
|
|
page: page + 1,
|
|
hasMore: res.hasMore,
|
|
})
|
|
} catch (e) {
|
|
wx.showToast({ title: '加载失败,下拉重试', icon: 'none' })
|
|
} finally {
|
|
this.setData({ loading: false, loadingMore: false })
|
|
}
|
|
},
|
|
|
|
syncMyInfo() {
|
|
const user = app.globalData?.userInfo
|
|
if (!user) return
|
|
const pet = user.pets?.[0]
|
|
this.setData({
|
|
myAvatarGradient: getAvatarGradient(user.openid || ''),
|
|
myEmoji: pet ? getPetEmoji(pet.species, pet.breed) : '🐶',
|
|
})
|
|
},
|
|
|
|
onSwitchTab(e: WechatMiniprogram.CustomEvent) {
|
|
const key = e.currentTarget.dataset.key as 'feed' | 'nearby' | 'hot'
|
|
if (key === this.data.activeTab) return
|
|
this.setData({ activeTab: key })
|
|
this.loadFeed(true)
|
|
},
|
|
|
|
onLoadMore() {
|
|
this.loadFeed(false)
|
|
},
|
|
|
|
onLikeChange(e: WechatMiniprogram.CustomEvent) {
|
|
const { postId, liked, count } = e.detail
|
|
const posts = this.data.posts.map(p =>
|
|
p._id === postId ? { ...p, isLiked: liked, likeCount: count } : p
|
|
)
|
|
this.setData({ posts })
|
|
},
|
|
|
|
onSearch() {
|
|
wx.navigateTo({ url: '/pages/search/search' })
|
|
},
|
|
|
|
onNotify() {
|
|
wx.navigateTo({ url: '/pages/notifications/notifications' })
|
|
},
|
|
|
|
onMyStory() {
|
|
wx.navigateTo({ url: '/pages/post/post?type=story' })
|
|
},
|
|
|
|
onStoryTap(e: WechatMiniprogram.CustomEvent) {
|
|
const id = e.currentTarget.dataset.id
|
|
wx.navigateTo({ url: `/pages/story/story?id=${id}` })
|
|
},
|
|
|
|
onGoPost() {
|
|
wx.navigateTo({ url: '/pages/post/post' })
|
|
},
|
|
|
|
onShareAppMessage() {
|
|
return {
|
|
title: '汪圈 — 宠物社区',
|
|
path: '/pages/feed/feed',
|
|
}
|
|
},
|
|
})
|