Archive: Keep previous list on reload (#4334)
This commit is contained in:
parent
21c4484d7a
commit
1a98953d01
@ -40,6 +40,7 @@ export const GLOBAL_STATE_CACHE_DISABLED = false;
|
|||||||
export const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';
|
export const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';
|
||||||
export const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;
|
export const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;
|
||||||
export const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;
|
export const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;
|
||||||
|
export const GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT = 10;
|
||||||
export const GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT = 150;
|
export const GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT = 150;
|
||||||
|
|
||||||
export const MEDIA_CACHE_DISABLED = false;
|
export const MEDIA_CACHE_DISABLED = false;
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import {
|
|||||||
ARCHIVED_FOLDER_ID,
|
ARCHIVED_FOLDER_ID,
|
||||||
CHAT_LIST_LOAD_SLICE,
|
CHAT_LIST_LOAD_SLICE,
|
||||||
DEBUG,
|
DEBUG,
|
||||||
|
GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT,
|
||||||
RE_TG_LINK,
|
RE_TG_LINK,
|
||||||
SAVED_FOLDER_ID,
|
SAVED_FOLDER_ID,
|
||||||
SERVICE_NOTIFICATIONS_USER_ID,
|
SERVICE_NOTIFICATIONS_USER_ID,
|
||||||
@ -506,7 +507,7 @@ addActionHandler('loadAllChats', async (global, actions, payload): Promise<void>
|
|||||||
let i = 0;
|
let i = 0;
|
||||||
|
|
||||||
const getOrderDate = (chat: ApiChat) => {
|
const getOrderDate = (chat: ApiChat) => {
|
||||||
return selectChatLastMessage(global, chat.id)?.date || chat.creationDate;
|
return selectChatLastMessage(global, chat.id, listType === 'saved' ? 'saved' : 'all')?.date || chat.creationDate;
|
||||||
};
|
};
|
||||||
|
|
||||||
while (shouldReplace || !global.chats.isFullyLoaded[listType]) {
|
while (shouldReplace || !global.chats.isFullyLoaded[listType]) {
|
||||||
@ -2704,10 +2705,15 @@ async function loadChats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tabStates = Object.values(global.byTabId);
|
const tabStates = Object.values(global.byTabId);
|
||||||
|
const topArchivedChats = getOrderedIds(ARCHIVED_FOLDER_ID)
|
||||||
|
?.slice(0, GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT)
|
||||||
|
.map((chatId) => selectChat(global, chatId))
|
||||||
|
.filter(Boolean);
|
||||||
const visibleChats = tabStates.flatMap(({ id: tabId }) => {
|
const visibleChats = tabStates.flatMap(({ id: tabId }) => {
|
||||||
const currentChat = selectCurrentChat(global, tabId);
|
const currentChat = selectCurrentChat(global, tabId);
|
||||||
return currentChat ? [currentChat] : [];
|
return currentChat ? [currentChat] : [];
|
||||||
});
|
});
|
||||||
|
const chatsToSave = visibleChats.concat(topArchivedChats || []);
|
||||||
|
|
||||||
const visibleUsers = tabStates.flatMap(({ id: tabId }) => {
|
const visibleUsers = tabStates.flatMap(({ id: tabId }) => {
|
||||||
return selectVisibleUsers(global, tabId) || [];
|
return selectVisibleUsers(global, tabId) || [];
|
||||||
@ -2719,7 +2725,7 @@ async function loadChats(
|
|||||||
|
|
||||||
global = replaceUsers(global, buildCollectionByKey(visibleUsers.concat(result.users), 'id'));
|
global = replaceUsers(global, buildCollectionByKey(visibleUsers.concat(result.users), 'id'));
|
||||||
global = replaceUserStatuses(global, result.userStatusesById);
|
global = replaceUserStatuses(global, result.userStatusesById);
|
||||||
global = replaceChats(global, buildCollectionByKey(visibleChats.concat(result.chats), 'id'));
|
global = replaceChats(global, buildCollectionByKey(chatsToSave.concat(result.chats), 'id'));
|
||||||
global = replaceChatListIds(global, listType, chatIds);
|
global = replaceChatListIds(global, listType, chatIds);
|
||||||
} else {
|
} else {
|
||||||
// Archived and Saved
|
// Archived and Saved
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
import { addCallback, removeCallback } from '../lib/teact/teactn';
|
import { addCallback, removeCallback } from '../lib/teact/teactn';
|
||||||
|
|
||||||
import type { ApiAvailableReaction, ApiMessage } from '../api/types';
|
import type { ApiAvailableReaction, ApiMessage } from '../api/types';
|
||||||
|
import type { ThreadId } from '../types';
|
||||||
import type { ActionReturnType, GlobalState, MessageList } from './types';
|
import type { ActionReturnType, GlobalState, MessageList } from './types';
|
||||||
import { MAIN_THREAD_ID } from '../api/types';
|
import { MAIN_THREAD_ID } from '../api/types';
|
||||||
|
|
||||||
@ -12,6 +13,7 @@ import {
|
|||||||
ARCHIVED_FOLDER_ID,
|
ARCHIVED_FOLDER_ID,
|
||||||
DEBUG,
|
DEBUG,
|
||||||
DEFAULT_LIMITS,
|
DEFAULT_LIMITS,
|
||||||
|
GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT,
|
||||||
GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,
|
GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,
|
||||||
GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT,
|
GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT,
|
||||||
GLOBAL_STATE_CACHE_DISABLED,
|
GLOBAL_STATE_CACHE_DISABLED,
|
||||||
@ -342,8 +344,8 @@ function reduceUsers<T extends GlobalState>(global: T): GlobalState['users'] {
|
|||||||
...chatStoriesUserIds,
|
...chatStoriesUserIds,
|
||||||
...visibleUserIds || [],
|
...visibleUserIds || [],
|
||||||
...global.topPeers.userIds || [],
|
...global.topPeers.userIds || [],
|
||||||
|
...getOrderedIds(ARCHIVED_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT).filter(isUserId) || [],
|
||||||
...getOrderedIds(ALL_FOLDER_ID)?.filter(isUserId) || [],
|
...getOrderedIds(ALL_FOLDER_ID)?.filter(isUserId) || [],
|
||||||
...getOrderedIds(ARCHIVED_FOLDER_ID)?.filter(isUserId) || [],
|
|
||||||
...global.contactList?.userIds || [],
|
...global.contactList?.userIds || [],
|
||||||
...global.recentlyFoundChatIds?.filter(isUserId) || [],
|
...global.recentlyFoundChatIds?.filter(isUserId) || [],
|
||||||
...Object.keys(byId),
|
...Object.keys(byId),
|
||||||
@ -384,9 +386,9 @@ function reduceChats<T extends GlobalState>(global: T): GlobalState['chats'] {
|
|||||||
...currentUserId ? [currentUserId] : [],
|
...currentUserId ? [currentUserId] : [],
|
||||||
...currentChatIds,
|
...currentChatIds,
|
||||||
...messagesChatIds,
|
...messagesChatIds,
|
||||||
...getOrderedIds(SAVED_FOLDER_ID) || [],
|
...getOrderedIds(ARCHIVED_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT) || [],
|
||||||
...getOrderedIds(ALL_FOLDER_ID) || [],
|
...getOrderedIds(ALL_FOLDER_ID) || [],
|
||||||
...getOrderedIds(ARCHIVED_FOLDER_ID) || [],
|
...getOrderedIds(SAVED_FOLDER_ID) || [],
|
||||||
...global.recentlyFoundChatIds || [],
|
...global.recentlyFoundChatIds || [],
|
||||||
...Object.keys(byId),
|
...Object.keys(byId),
|
||||||
]).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);
|
]).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);
|
||||||
@ -420,8 +422,21 @@ function reduceMessages<T extends GlobalState>(global: T): GlobalState['messages
|
|||||||
...currentUserId ? [currentUserId] : [],
|
...currentUserId ? [currentUserId] : [],
|
||||||
...forumPanelChatIds,
|
...forumPanelChatIds,
|
||||||
...getOrderedIds(ALL_FOLDER_ID) || [],
|
...getOrderedIds(ALL_FOLDER_ID) || [],
|
||||||
|
...getOrderedIds(ARCHIVED_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT) || [],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const openedChatThreadIds = Object.values(global.byTabId).reduce((acc, { id: tabId }) => {
|
||||||
|
const { chatId: tabChatId, threadId } = selectCurrentMessageList(global, tabId) || {};
|
||||||
|
if (!tabChatId || !threadId || threadId === MAIN_THREAD_ID) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
const current = acc[tabChatId] || new Set();
|
||||||
|
current.add(threadId);
|
||||||
|
acc[tabChatId] = current;
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {} as Record<string, Set<ThreadId>>);
|
||||||
|
|
||||||
chatIdsToSave.forEach((chatId) => {
|
chatIdsToSave.forEach((chatId) => {
|
||||||
const current = global.messages.byChatId[chatId];
|
const current = global.messages.byChatId[chatId];
|
||||||
if (!current) {
|
if (!current) {
|
||||||
@ -431,22 +446,13 @@ function reduceMessages<T extends GlobalState>(global: T): GlobalState['messages
|
|||||||
const chat = selectChat(global, chatId);
|
const chat = selectChat(global, chatId);
|
||||||
const chatLastMessageId = selectChatLastMessageId(global, chatId);
|
const chatLastMessageId = selectChatLastMessageId(global, chatId);
|
||||||
|
|
||||||
const threadIds = unique(compact(Object.values(global.byTabId).map(({ id: tabId }) => {
|
const openedThreadIds = Array.from(openedChatThreadIds[chatId] || []);
|
||||||
const { chatId: tabChatId, threadId } = selectCurrentMessageList(global, tabId) || {};
|
const commentThreadIds = Object.values(global.messages.byChatId[chatId].threadsById || {})
|
||||||
if (!tabChatId || tabChatId !== chatId || !threadId || threadId === MAIN_THREAD_ID) {
|
.map(({ threadInfo }) => (threadInfo?.isCommentsInfo ? threadInfo?.originMessageId : undefined))
|
||||||
return undefined;
|
.filter(Boolean);
|
||||||
}
|
const threadIds = unique(openedThreadIds.concat(commentThreadIds));
|
||||||
|
|
||||||
return threadId;
|
|
||||||
}).concat(
|
|
||||||
Object.values(global.messages.byChatId[chatId].threadsById || {})
|
|
||||||
.map(({ threadInfo }) => (threadInfo?.isCommentsInfo ? threadInfo?.originMessageId : undefined)),
|
|
||||||
)));
|
|
||||||
|
|
||||||
const threadsToSave = pickTruthy(current.threadsById, [MAIN_THREAD_ID, ...threadIds]);
|
const threadsToSave = pickTruthy(current.threadsById, [MAIN_THREAD_ID, ...threadIds]);
|
||||||
if (!Object.keys(threadsToSave).length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const viewportIdsToSave = unique(Object.values(threadsToSave).flatMap((thread) => thread.lastViewportIds || []));
|
const viewportIdsToSave = unique(Object.values(threadsToSave).flatMap((thread) => thread.lastViewportIds || []));
|
||||||
const topicLastMessageIds = chat?.topics ? Object.values(chat.topics).map(({ lastMessageId }) => lastMessageId)
|
const topicLastMessageIds = chat?.topics ? Object.values(chat.topics).map(({ lastMessageId }) => lastMessageId)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user