Support personal records and persistent smoking visibility. Add upload quota preflight, file cleanup, privacy entry, image caching and revision-based page refresh across the backend, admin and mini program.
170 lines
6.4 KiB
JavaScript
170 lines
6.4 KiB
JavaScript
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(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"]}));
|