Browse Source

Fix send file & albums order

master
Eduard Kuzmenko 4 years ago
parent
commit
3d65177026
  1. 2
      src/components/emoticonsDropdown/tabs/stickers.ts
  2. 89
      src/lib/appManagers/appMessagesManager.ts
  3. 14
      src/lib/mtproto/apiManager.ts
  4. 2
      src/scss/partials/_document.scss

2
src/components/emoticonsDropdown/tabs/stickers.ts

@ -341,7 +341,7 @@ export default class StickersTab implements EmoticonsTab {
return; return;
} }
let div = this.recentDiv.querySelector(`[data-doc-i-d="${doc.id}"]`); let div = this.recentDiv.querySelector(`[data-doc-id="${doc.id}"]`);
if(!div) { if(!div) {
div = this.superStickerRenderer.renderSticker(doc); div = this.superStickerRenderer.renderSticker(doc);
} }

89
src/lib/appManagers/appMessagesManager.ts

@ -1,10 +1,11 @@
import { LazyLoadQueueBase } from "../../components/lazyLoadQueue";
import ProgressivePreloader from "../../components/preloader"; import ProgressivePreloader from "../../components/preloader";
import { CancellablePromise, deferredPromise } from "../../helpers/cancellablePromise"; import { CancellablePromise, deferredPromise } from "../../helpers/cancellablePromise";
import { tsNow } from "../../helpers/date"; import { tsNow } from "../../helpers/date";
import { copy, defineNotNumerableProperties, getObjectKeysAndSort } from "../../helpers/object"; import { copy, defineNotNumerableProperties, getObjectKeysAndSort } from "../../helpers/object";
import { randomLong } from "../../helpers/random"; import { randomLong } from "../../helpers/random";
import { splitStringByLength, limitSymbols } from "../../helpers/string"; import { splitStringByLength, limitSymbols } from "../../helpers/string";
import { Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputNotifyPeer, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MessagesPeerDialogs, MethodDeclMap, NotifyPeer, PhotoSize, SendMessageAction, Update } from "../../layer"; import { Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputNotifyPeer, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MessagesPeerDialogs, MethodDeclMap, NotifyPeer, PhotoSize, SendMessageAction, Update } from "../../layer";
import { InvokeApiOptions } from "../../types"; import { InvokeApiOptions } from "../../types";
import { langPack } from "../langPack"; import { langPack } from "../langPack";
import { logger, LogLevels } from "../logger"; import { logger, LogLevels } from "../logger";
@ -133,6 +134,8 @@ export class AppMessagesManager {
}> }>
} }
} = {}; } = {};
public sendSmthLazyLoadQueue = new LazyLoadQueueBase(1);
public needSingleMessages: {[peerId: string]: number[]} = {}; public needSingleMessages: {[peerId: string]: number[]} = {};
private fetchSingleMessagesPromise: Promise<void> = null; private fetchSingleMessagesPromise: Promise<void> = null;
@ -510,11 +513,11 @@ export class AppMessagesManager {
delete message.error; delete message.error;
} }
rootScope.broadcast('messages_pending'); rootScope.broadcast('messages_pending');
} };
message.send = () => { message.send = () => {
toggleError(false); toggleError(false);
const sentRequestOptions: any = {}; const sentRequestOptions: InvokeApiOptions = {};
if(this.pendingAfterMsgs[peerId]) { if(this.pendingAfterMsgs[peerId]) {
sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId; sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;
} }
@ -543,8 +546,9 @@ export class AppMessagesManager {
}, sentRequestOptions); }, sentRequestOptions);
} }
// this.log(flags, entities) //this.log('sendText', message.mid);
apiPromise.then((updates: any) => { apiPromise.then((updates: any) => {
//this.log('sendText sent', message.mid);
if(updates._ == 'updateShortSentMessage') { if(updates._ == 'updateShortSentMessage') {
message.date = updates.date; message.date = updates.date;
message.id = updates.id; message.id = updates.id;
@ -834,9 +838,7 @@ export class AppMessagesManager {
sentDeferred.resolve(inputMedia); sentDeferred.resolve(inputMedia);
} else if(file instanceof File || file instanceof Blob) { } else if(file instanceof File || file instanceof Blob) {
const deferred = deferredPromise<void>(); const load = () => {
this.sendFilePromise.then(() => {
if(!uploaded || message.error) { if(!uploaded || message.error) {
uploaded = false; uploaded = false;
uploadPromise = appDownloadManager.upload(file); uploadPromise = appDownloadManager.upload(file);
@ -881,17 +883,22 @@ export class AppMessagesManager {
if(err.name === 'AbortError' && !uploaded) { if(err.name === 'AbortError' && !uploaded) {
this.log('cancelling upload', media); this.log('cancelling upload', media);
deferred.resolve();
sentDeferred.reject(err); sentDeferred.reject(err);
this.cancelPendingMessage(randomIdS); this.cancelPendingMessage(randomIdS);
this.setTyping(peerId, 'sendMessageCancelAction'); this.setTyping(peerId, 'sendMessageCancelAction');
} }
}); });
uploadPromise.finally(deferred.resolve); return sentDeferred;
}); };
this.sendFilePromise = deferred; if(options.isGroupedItem) {
load();
} else {
this.sendSmthLazyLoadQueue.push({
load
});
}
} }
return sentDeferred; return sentDeferred;
@ -1021,28 +1028,31 @@ export class AppMessagesManager {
const invoke = (multiMedia: any[]) => { const invoke = (multiMedia: any[]) => {
this.setTyping(peerId, 'sendMessageCancelAction'); this.setTyping(peerId, 'sendMessageCancelAction');
return apiManager.invokeApi('messages.sendMultiMedia', { this.sendSmthLazyLoadQueue.push({
peer: inputPeer, load: () => {
multi_media: multiMedia, return apiManager.invokeApi('messages.sendMultiMedia', {
reply_to_msg_id: replyToMsgId, peer: inputPeer,
schedule_date: options.scheduleDate, multi_media: multiMedia,
silent: options.silent reply_to_msg_id: replyToMsgId,
}).then((updates) => { schedule_date: options.scheduleDate,
apiUpdatesManager.processUpdateMessage(updates); silent: options.silent
}, (error) => { }).then((updates) => {
messages.forEach(message => toggleError(message, true)); apiUpdatesManager.processUpdateMessage(updates);
}, (error) => {
messages.forEach(message => toggleError(message, true));
});
}
}); });
}; };
const inputs: InputSingleMedia[] = []; const promises: Promise<InputSingleMedia>[] = messages.map(message => {
for(const message of messages) { return (message.send() as Promise<InputMedia>).then((inputMedia: InputMedia) => {
const inputMedia: InputMedia = await message.send(); return apiManager.invokeApi('messages.uploadMedia', {
this.log('sendAlbum uploaded item:', inputMedia); peer: inputPeer,
media: inputMedia
await apiManager.invokeApi('messages.uploadMedia', { });
peer: inputPeer, })
media: inputMedia .then(messageMedia => {
}).then(messageMedia => {
let inputMedia: any; let inputMedia: any;
if(messageMedia._ == 'messageMediaPhoto') { if(messageMedia._ == 'messageMediaPhoto') {
const photo = appPhotosManager.savePhoto(messageMedia.photo); const photo = appPhotosManager.savePhoto(messageMedia.photo);
@ -1052,25 +1062,30 @@ export class AppMessagesManager {
inputMedia = appDocsManager.getMediaInput(doc); inputMedia = appDocsManager.getMediaInput(doc);
} }
inputs.push({ const inputSingleMedia: InputSingleMedia = {
_: 'inputSingleMedia', _: 'inputSingleMedia',
media: inputMedia, media: inputMedia,
random_id: message.random_id, random_id: message.random_id,
message: caption, message: caption,
entities entities
}); };
// * only 1 caption for all inputs // * only 1 caption for all inputs
if(caption) { if(caption) {
caption = ''; caption = '';
entities = []; entities = [];
} }
}, () => {
return inputSingleMedia;
}).catch((err: any) => {
toggleError(message, true); toggleError(message, true);
throw err;
}); });
} });
invoke(inputs); Promise.all(promises).then(inputs => {
invoke(inputs);
});
} }
public sendOther(peerId: number, inputMedia: any, options: Partial<{ public sendOther(peerId: number, inputMedia: any, options: Partial<{
@ -1638,7 +1653,7 @@ export class AppMessagesManager {
schedule_date: options.scheduleDate schedule_date: options.scheduleDate
}, sentRequestOptions).then((updates) => { }, sentRequestOptions).then((updates) => {
apiUpdatesManager.processUpdateMessage(updates); apiUpdatesManager.processUpdateMessage(updates);
}, () => {}).then(() => { }).finally(() => {
if(this.pendingAfterMsgs[peerId] === sentRequestOptions) { if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {
delete this.pendingAfterMsgs[peerId]; delete this.pendingAfterMsgs[peerId];
} }

14
src/lib/mtproto/apiManager.ts

@ -253,7 +253,7 @@ export class ApiManager {
const deferred = deferredPromise<MethodDeclMap[T]['res']>(); const deferred = deferredPromise<MethodDeclMap[T]['res']>();
const afterMessageIdTemp = options.afterMessageId; let afterMessageIdTemp = options.afterMessageId;
if(afterMessageIdTemp) { if(afterMessageIdTemp) {
deferred.finally(() => { deferred.finally(() => {
delete this.afterMessageTempIds[afterMessageIdTemp]; delete this.afterMessageTempIds[afterMessageIdTemp];
@ -325,7 +325,7 @@ export class ApiManager {
return promise.then(deferred.resolve, (error: ApiError) => { return promise.then(deferred.resolve, (error: ApiError) => {
//if(!options.ignoreErrors) { //if(!options.ignoreErrors) {
if(error.type != 'FILE_REFERENCE_EXPIRED') { if(error.type != 'FILE_REFERENCE_EXPIRED' && error.type !== 'MSG_WAIT_FAILED') {
this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params); this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);
} }
@ -377,7 +377,15 @@ export class ApiManager {
setTimeout(() => { setTimeout(() => {
performRequest(cachedNetworker); performRequest(cachedNetworker);
}, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020 }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020
} else if(!options.rawError && (error.code == 500 || error.type == 'MSG_WAIT_FAILED')) { } else if(!options.rawError && error.code == 500) {
if(error.type === 'MSG_WAIT_FAILED') {
afterMessageIdTemp = undefined;
delete options.afterMessageId;
delete this.afterMessageTempIds[options.prepareTempMessageId];
performRequest(cachedNetworker);
return;
}
const now = Date.now(); const now = Date.now();
if(options.stopTime) { if(options.stopTime) {
if(now >= options.stopTime) { if(now >= options.stopTime) {

2
src/scss/partials/_document.scss

@ -71,7 +71,7 @@
&.document-with-thumb { &.document-with-thumb {
.document-ico { .document-ico {
background: #000; background: #fff;
border-radius: $border-radius; border-radius: $border-radius;
.document-thumb { .document-thumb {

Loading…
Cancel
Save