SHA256
Добавить дневник действий и статусы материалов
This commit is contained in:
@@ -21,6 +21,8 @@ const CREATE_CHANNEL_FLASH_KEY = 'shine-channels-create-success';
|
||||
const MENU_OVERLAY_ID = 'channels-context-menu-overlay';
|
||||
const CHANNEL_TYPE_STORIES = 0;
|
||||
const CHANNEL_TYPE_PERSONAL = 100;
|
||||
const DIARY_CHANNEL_NAME = 'diary';
|
||||
const DIARY_DISPLAY_NAME = 'Личный дневник';
|
||||
|
||||
function cleanChannelMessagePreview(text) {
|
||||
const parsed = parseMessageAttachments(text);
|
||||
@@ -698,11 +700,64 @@ function pullCreateSuccessFlash() {
|
||||
}
|
||||
}
|
||||
|
||||
function mapApiFeed(feed, notificationsState) {
|
||||
function buildDiaryChannelRow(diaryPayload, ownRows = [], notificationsState = {}, index = {}) {
|
||||
const messages = Array.isArray(diaryPayload?.messages) ? diaryPayload.messages : [];
|
||||
if (!messages.length) return null;
|
||||
|
||||
const ownerBlockchainName = String(
|
||||
diaryPayload?.channel?.ownerBlockchainName
|
||||
|| ownRows[0]?.channel?.ownerBlockchainName
|
||||
|| ''
|
||||
).trim();
|
||||
if (!ownerBlockchainName) return null;
|
||||
|
||||
const ownerLogin = String(diaryPayload?.channel?.ownerLogin || state.session.login || '').trim();
|
||||
const lastMessage = messages[messages.length - 1] || null;
|
||||
const rowId = 'own-diary';
|
||||
index[rowId] = { diary: true, payload: diaryPayload };
|
||||
|
||||
return {
|
||||
id: rowId,
|
||||
route: makeShineChannelRoute({
|
||||
ownerLogin,
|
||||
ownerBlockchainName,
|
||||
channelName: DIARY_CHANNEL_NAME,
|
||||
}),
|
||||
ownerName: ownerLogin || 'я',
|
||||
ownerBlockchainName,
|
||||
channelRootBlockNumber: 0,
|
||||
channelRootBlockHash: '0',
|
||||
avatar: 'Д',
|
||||
avaAr: '',
|
||||
title: DIARY_DISPLAY_NAME,
|
||||
technicalLabel: 'Виртуальная лента ваших действий',
|
||||
channelName: DIARY_CHANNEL_NAME,
|
||||
displayTitle: DIARY_DISPLAY_NAME,
|
||||
channelDescription: 'История действий по упражнениям, услугам и курсам',
|
||||
channelTypeCode: 900,
|
||||
channelTypeVersion: 1,
|
||||
messagePreview: String(lastMessage?.text || '').trim()
|
||||
? cleanChannelMessagePreview(lastMessage?.text)
|
||||
: 'Новая запись в личном дневнике',
|
||||
messagesCount: messages.length,
|
||||
unreadCount: 0,
|
||||
lastMessageAt: Number(lastMessage?.createdAtMs || 0),
|
||||
isOwnChannel: true,
|
||||
isSubscribed: false,
|
||||
notificationsEnabled: notificationsState[rowId] === true,
|
||||
pending: false,
|
||||
};
|
||||
}
|
||||
|
||||
function mapApiFeed(feed, notificationsState, diaryPayload = null) {
|
||||
const index = {};
|
||||
const ownChannels = (feed?.ownedChannels || [])
|
||||
.filter(isVisibleChannelSummary)
|
||||
.map((it, idx) => mapApiChannelRow(it, 'own', idx, index, notificationsState));
|
||||
const diaryChannel = diaryPayload
|
||||
? buildDiaryChannelRow(diaryPayload, feed?.ownedChannels || [], notificationsState, index)
|
||||
: null;
|
||||
if (diaryChannel) ownChannels.unshift(diaryChannel);
|
||||
const followedUserChannels = (feed?.followedUsersChannels || [])
|
||||
.filter(isVisibleChannelSummary)
|
||||
.map((it, idx) => mapApiChannelRow(it, 'followedUsers', idx, index, notificationsState));
|
||||
@@ -1126,7 +1181,13 @@ async function loadFeedAndRender({ screen, listState, contentEl, navigate }) {
|
||||
|
||||
try {
|
||||
const feed = await authService.listSubscriptionsFeed(state.session.login, 200);
|
||||
const groups = mapApiFeed(feed, listState.notificationsState);
|
||||
let diaryPayload = null;
|
||||
try {
|
||||
diaryPayload = await authService.getPersonalDiary(state.session.login, 200, 'asc');
|
||||
} catch {
|
||||
diaryPayload = null;
|
||||
}
|
||||
const groups = mapApiFeed(feed, listState.notificationsState, diaryPayload);
|
||||
|
||||
listState.channels = toListModel(groups);
|
||||
setChannelsFeed(feed, groups.index);
|
||||
|
||||
Reference in New Issue
Block a user