const { withRecordAccess } = require('../../utils/record-access'); const { tryLoginRenewal } = require('../../utils/subscribe'); const { itemsOf, startList, applyList, failList, finishList, withListPagination } = require('../../utils/list-pagination'); const { withDataCache } = require('../../utils/page-cache'); const { getLayout } = require('../../utils/layout'); // Diary journal with server pagination. const { api, getImageUrl } = require('../../utils/request'); const { diaryEntry } = require('../../utils/journal'); const { saveScrollPosition, getScrollPosition } = require('../../utils/scroll-pos'); Page(withRecordAccess(withDataCache(withListPagination({ onLoginSubscribeTap: function() { return tryLoginRenewal(); }, onResize: function() { this.setData(getLayout()); }, data: { loading: true, loadError: false, list: [], page: 1, pageSize: 20, total: 0, loadingMore: false, hasMore: true, scrollTop: 0, tabType: 'all' // 'all' 全部 | 'favorite' 收藏 }, onLoad: function(options) { this.setData(getLayout()); this.setData({ scrollTop: getScrollPosition('diary') }); }, onShow: function() { this.loadData(); }, // 收藏 tab 切换已移除 onScroll: function(e) { this._scrollTop = e.detail.scrollTop; saveScrollPosition('diary', e.detail.scrollTop); }, onPullDownRefresh: async function() { this.setData({ page: 1, list: [], hasMore: true }); await this.loadData(); wx.stopPullDownRefresh(); }, onScrollToLower: function() { if (this.data.loadingMore || !this.data.hasMore) return; this.loadMore(); }, onShareAppMessage: function() { return { title: '让所有的爱有迹可循', path: '/pages/diary/diary', imageUrl: '/images/share.png' }; }, onShareTimeline: function() { return { title: '让所有的爱有迹可循', imageUrl: '/images/share.png' }; }, loadData: async function(page) { const ticket=startList(this,page);if(!ticket)return; try { const data=await api.diaryList({page:ticket.page,page_size:20}); applyList(this,ticket,data,this._formatItems(itemsOf(data)),'list'); this._loadPartnerInfo(); } catch(e) { failList(this,ticket); } finally { finishList(this,ticket); } }, _formatItems: function(items) { var myUid = wx.getStorageSync('userId'); var partnerNames = {}; var partnerAvatars = {}; return items.map(function(item) { item.creator_name = partnerNames[item.created_by] || '我'; item.creator_avatar = partnerAvatars[item.created_by] || ''; item.created_time = item.created_at ? item.created_at.substring(0, 16).replace('T', ' ') : ''; var imgs = item.images || []; if (typeof imgs === 'string') { try { imgs = JSON.parse(imgs); } catch(e) { imgs = []; } } if (!Array.isArray(imgs)) imgs = []; item.imageUrls = imgs.map(function(p) { return getImageUrl(p); }); // 生成摘要文本(截断内容,用于无图卡片展示) var summaryText = item.content || item.title || ''; summaryText = summaryText.replace(/\s+/g, ' '); if (summaryText.length > 80) summaryText = summaryText.substring(0, 80) + '...'; item.summary = summaryText; // 地理位置:优先显示地址名称,其次显示经纬度 item.location_text = item.location || ((item.lat && item.lng) ? (item.lat + ', ' + item.lng) : ''); return Object.assign(item, diaryEntry(item)); }); }, _loadPartnerInfo: async function() { try { var info = await api.coupleInfo(); var myUid = wx.getStorageSync('userId'); var p1 = info.partner1 || {}, p2 = info.partner2 || {}; var names = {}, avatars = {}; names[p1.id] = p1.nickname || p1.username || 'TA'; names[p2.id] = p2.nickname || p2.username || 'TA'; avatars[p1.id] = getImageUrl(p1.avatar); avatars[p2.id] = getImageUrl(p2.avatar); var oldList = this.data.list; var changed = false; var updates = {}; for (var i = 0; i < oldList.length; i++) { var item = oldList[i]; var newName = names[item.created_by] || '我'; var newAvatar = avatars[item.created_by] || ''; if (item.creator_name !== newName || item.creator_avatar !== newAvatar) { updates['list[' + i + '].creator_name'] = newName; updates['list[' + i + '].author'] = newName; updates['list[' + i + '].creator_avatar'] = newAvatar; changed = true; } } if (changed) { this.setData(updates); } } catch (e) {} }, _refreshPartnerInfo: function() { var self = this; api.coupleInfo().then(function(info) { var myUid = wx.getStorageSync('userId'); var p1 = info.partner1 || {}, p2 = info.partner2 || {}; var names = {}, avatars = {}; names[p1.id] = p1.nickname || p1.username || 'TA'; names[p2.id] = p2.nickname || p2.username || 'TA'; avatars[p1.id] = getImageUrl(p1.avatar); avatars[p2.id] = getImageUrl(p2.avatar); var oldList = self.data.list; var changed = false; var updates = {}; for (var i = 0; i < oldList.length; i++) { var item = oldList[i]; var newName = names[item.created_by] || '我'; var newAvatar = avatars[item.created_by] || ''; if (item.creator_name !== newName || item.creator_avatar !== newAvatar) { updates['list[' + i + '].creator_name'] = newName; updates['list[' + i + '].author'] = newName; updates['list[' + i + '].creator_avatar'] = newAvatar; changed = true; } } if (changed) { self.setData(updates); } }).catch(function() {}); }, // 点击进入日记详情 goToDetail: function(e) { var id = e.currentTarget.dataset.id; if (!id) return; saveScrollPosition('diary', this._scrollTop == null ? this.data.scrollTop : this._scrollTop); wx.navigateTo({ url: '/pages/diary_detail/diary_detail?id=' + id }); }, _savePosBeforeLeave: function() { saveScrollPosition('diary', this._scrollTop == null ? this.data.scrollTop : this._scrollTop); }, openJournalEntry: function(e) { this.goToDetail(e); }, goToPublish: function() { this._savePosBeforeLeave(); wx.navigateTo({ url: '/pages/publish/publish?type=diary' }); }, goHome: function() { this._savePosBeforeLeave(); wx.switchTab({ url: '/pages/index/index' }); }, goBack: function() { wx.navigateBack(); }, goProfile: function() { this._savePosBeforeLeave(); wx.switchTab({ url: '/pages/profile/profile' }); } }, 'loadData'), {"loadData": ["diaryList", "coupleInfo"]})));