@@ -28,7 +28,7 @@ import {MyDocument} from './appDocsManager';
28
28
import { MyPhoto } from './appPhotosManager' ;
29
29
import DEBUG from '../../config/debug' ;
30
30
import SlicedArray , { Slice , SliceEnd } from '../../helpers/slicedArray' ;
31
- import { FOLDER_ID_ALL , FOLDER_ID_ARCHIVE , GENERAL_TOPIC_ID , HIDDEN_PEER_ID , MUTE_UNTIL , NULL_PEER_ID , REAL_FOLDERS , REAL_FOLDER_ID , REPLIES_HIDDEN_CHANNEL_ID , REPLIES_PEER_ID , SERVICE_PEER_ID , TEST_NO_SAVED , THUMB_TYPE_FULL } from '../mtproto/mtproto_config' ;
31
+ import { FOLDER_ID_ALL , FOLDER_ID_ARCHIVE , GENERAL_TOPIC_ID , HIDDEN_PEER_ID , MESSAGES_ALBUM_MAX_SIZE , MUTE_UNTIL , NULL_PEER_ID , REAL_FOLDERS , REAL_FOLDER_ID , REPLIES_HIDDEN_CHANNEL_ID , REPLIES_PEER_ID , SERVICE_PEER_ID , TEST_NO_SAVED , THUMB_TYPE_FULL } from '../mtproto/mtproto_config' ;
32
32
import { getMiddleware } from '../../helpers/middleware' ;
33
33
import assumeType from '../../helpers/assumeType' ;
34
34
import copy from '../../helpers/object/copy' ;
@@ -7941,33 +7941,58 @@ export class AppMessagesManager extends AppManager {
7941
7941
}
7942
7942
}
7943
7943
7944
- // * load grouped missing messages
7945
- const firstMessage = messages [ 0 ] as Message . message ;
7946
- const lastMessage = messages [ messages . length - 1 ] as Message . message ;
7944
+ // * load grouped missing messages (only once per recursion)
7945
+ if ( ! inputFilter && ! recursion ) {
7946
+ const firstMessage = messages [ 0 ] as Message . message ;
7947
+ const lastMessage = messages [ messages . length - 1 ] as Message . message ;
7947
7948
7948
- if ( ! inputFilter && ! isBottomEnd && firstMessage ?. grouped_id ) {
7949
- await this . getHistory ( {
7950
- ...options ,
7951
- offsetId : firstMessage . mid ,
7952
- limit : 20 ,
7953
- addOffset : - 10
7954
- } ) ;
7949
+ const fillMissingGroupedMessages = async ( bottom : boolean ) => {
7950
+ if ( ! middleware ( ) ) {
7951
+ return ;
7952
+ }
7955
7953
7956
- if ( ! middleware ( ) ) {
7957
- return ;
7958
- }
7959
- }
7954
+ const {
7955
+ isEnd,
7956
+ history,
7957
+ messages = history . map ( ( mid ) => this . getMessageByPeer ( peerId , mid ) )
7958
+ } = await this . getHistory ( {
7959
+ ...options ,
7960
+ offsetId : ( bottom ? firstMessage : lastMessage ) . mid ,
7961
+ limit : ( MESSAGES_ALBUM_MAX_SIZE + 1 ) * 2 ,
7962
+ addOffset : - ( MESSAGES_ALBUM_MAX_SIZE + 1 )
7963
+ } ) ;
7960
7964
7961
- if ( ! inputFilter && ! isTopEnd && lastMessage ?. grouped_id && lastMessage . grouped_id !== firstMessage ?. grouped_id ) {
7962
- await this . getHistory ( {
7963
- ...options ,
7964
- offsetId : lastMessage . mid ,
7965
- limit : 20 ,
7966
- addOffset : - 10
7967
- } ) ;
7965
+ if ( ! middleware ( ) ) {
7966
+ return ;
7967
+ }
7968
7968
7969
- if ( ! middleware ( ) ) {
7970
- return ;
7969
+ // * erase unfilled grouped messages if they're last elements in their history slices
7970
+ if ( ! isEnd [ bottom ? 'bottom' : 'top' ] ) {
7971
+ if ( ! bottom ) messages . reverse ( ) ;
7972
+ const messagesSlice = messages . slice ( 0 , MESSAGES_ALBUM_MAX_SIZE ) as Message . message [ ] ;
7973
+ const groupedIds = messagesSlice . map ( ( message ) => message . grouped_id ) ;
7974
+ const slice = messagesSlice [ 0 ] && historyStorage . history . findSlice ( messagesSlice [ 0 ] . mid ) ;
7975
+ if (
7976
+ groupedIds [ 0 ] &&
7977
+ groupedIds [ 0 ] !== groupedIds [ MESSAGES_ALBUM_MAX_SIZE - 1 ] &&
7978
+ slice ?. index === ( bottom ? 0 : slice . slice . length - 1 )
7979
+ ) {
7980
+ messagesSlice . forEach ( ( message ) => {
7981
+ if ( message . grouped_id === groupedIds [ 0 ] ) {
7982
+ historyStorage . history . delete ( message . mid ) ;
7983
+ }
7984
+ } ) ;
7985
+ }
7986
+ }
7987
+ } ;
7988
+
7989
+
7990
+ if ( ! isBottomEnd && firstMessage ?. grouped_id ) {
7991
+ await fillMissingGroupedMessages ( true ) ;
7992
+ }
7993
+
7994
+ if ( ! isTopEnd && lastMessage ?. grouped_id && lastMessage . grouped_id !== firstMessage ?. grouped_id ) {
7995
+ await fillMissingGroupedMessages ( false ) ;
7971
7996
}
7972
7997
}
7973
7998
// * grouped end
0 commit comments