Gate record features and storage entry points with invitation guidance; enforce record access in the backend. Add homepage greetings, right-swipe profile dismissal, and move the smoking switch to settings. Simplify API base configuration and remove the unused legacy tab bar component.
171 lines
6.5 KiB
JavaScript
171 lines
6.5 KiB
JavaScript
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"]})));
|