Fix broken chatlist due to certain service message

This commit is contained in:
morethanwords 2021-12-14 18:48:42 +04:00
parent b2f5c08934
commit 5f9d12c3d8
3 changed files with 36 additions and 23 deletions

View File

@ -106,7 +106,7 @@ export default class DropdownHover extends EventListenerBase<{
} }
if((this.element.style.display && enable === undefined) || enable) { if((this.element.style.display && enable === undefined) || enable) {
const res = this.dispatchEvent('open'); const res = this.dispatchResultableEvent('open');
await Promise.all(res); await Promise.all(res);
this.element.style.display = ''; this.element.style.display = '';

View File

@ -107,16 +107,13 @@ export default class EventListenerBase<Listeners extends Record<string, Function
} }
// * must be protected, but who cares // * must be protected, but who cares
public dispatchEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) { private _dispatchEvent<T extends keyof Listeners>(name: T, collectResults: boolean, ...args: ArgumentTypes<Listeners[T]>) {
if(this.reuseResults) { if(this.reuseResults) {
this.listenerResults[name] = args; this.listenerResults[name] = args;
} }
const arr: Array<SuperReturnType<Listeners[typeof name]>> = []; const arr: Array<SuperReturnType<Listeners[typeof name]>> = collectResults && [];
/* let a = e.wm.get(this)[name];
if(!a) return arr;
const listeners = [...a]; */
const listeners = this.listeners[name]; const listeners = this.listeners[name];
if(listeners) { if(listeners) {
// ! this one will guarantee execution even if delete another listener during setting // ! this one will guarantee execution even if delete another listener during setting
@ -127,28 +124,35 @@ export default class EventListenerBase<Listeners extends Record<string, Function
return; return;
} }
arr.push(listener.callback(...args)); let result: any;
try {
result = listener.callback(...args);
} catch(err) {
}
if(arr) {
arr.push(result);
}
if((listener.options as AddEventListenerOptions)?.once) { if((listener.options as AddEventListenerOptions)?.once) {
this.removeEventListener(name, listener.callback); this.removeEventListener(name, listener.callback);
} }
}); });
/* for(let i = 0, length = listeners.length; i < length; ++i) {
const listener = listeners[i];
arr.push(listener.callback(...args));
if(listener.once) {
listeners.splice(i, 1);
--i;
--length;
}
} */
} }
return arr; return arr;
} }
public dispatchResultableEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) {
return this._dispatchEvent(name, true, ...args);
}
// * must be protected, but who cares
public dispatchEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) {
this._dispatchEvent(name, false, ...args);
}
public cleanup() { public cleanup() {
this.listeners = {}; this.listeners = {};
this.listenerResults = {}; this.listenerResults = {};

View File

@ -2933,10 +2933,7 @@ export class AppMessagesManager {
return el; return el;
} }
public wrapMessageActionTextNew(message: MyMessage, plain: true): string; private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {
public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;
public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;
public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {
const element: HTMLElement = plain ? undefined : document.createElement('span'); const element: HTMLElement = plain ? undefined : document.createElement('span');
const action = 'action' in message && message.action; const action = 'action' in message && message.action;
@ -3134,7 +3131,7 @@ export class AppMessagesManager {
if(users.length > 1) { if(users.length > 1) {
const joined = join( const joined = join(
users.map((userId: UserId) => (getNameDivHTML(userId.toPeerId(), plain) as string).trim()), users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),
false, false,
plain plain
); );
@ -3190,6 +3187,18 @@ export class AppMessagesManager {
} }
} }
public wrapMessageActionTextNew(message: MyMessage, plain: true): string;
public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;
public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;
public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {
try {
return this.wrapMessageActionTextNewUnsafe(message, plain);
} catch(err) {
this.log.error('wrapMessageActionTextNewUnsafe error:', err);
return plain ? '' : document.createElement('span');
}
}
public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) { public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {
return apiManager.invokeApiSingle('messages.report', { return apiManager.invokeApiSingle('messages.report', {
peer: appPeersManager.getInputPeerById(peerId), peer: appPeersManager.getInputPeerById(peerId),