Fix playing timestamp on album item

Fix wrapping message in grouped documents
This commit is contained in:
Eduard Kuzmenko 2023-03-05 15:08:16 +04:00
parent 2b661d4ca2
commit a6364eba57
4 changed files with 67 additions and 14 deletions

View File

@ -133,6 +133,7 @@ import {PopupPeerCheckboxOptions} from '../popups/peer';
import toggleDisability from '../../helpers/dom/toggleDisability'; import toggleDisability from '../../helpers/dom/toggleDisability';
import {copyTextToClipboard} from '../../helpers/clipboard'; import {copyTextToClipboard} from '../../helpers/clipboard';
import liteMode from '../../helpers/liteMode'; import liteMode from '../../helpers/liteMode';
import getMediaDurationFromMessage from '../../lib/appManagers/utils/messages/getMediaDurationFromMessage';
export const USER_REACTIONS_INLINE = false; export const USER_REACTIONS_INLINE = false;
const USE_MEDIA_TAILS = false; const USE_MEDIA_TAILS = false;
@ -735,7 +736,8 @@ export default class ChatBubbles {
return; return;
} }
return {bubble: result.bubble, message, changedResults}; // can be .document-container
return {bubble: findUpClassName(result.bubble, 'bubble'), message, changedResults};
}); });
let top: number; let top: number;
@ -3303,15 +3305,22 @@ export default class ChatBubbles {
return {cached, promise: setPeerPromise}; return {cached, promise: setPeerPromise};
} }
public playMediaWithTimestamp(bubble: HTMLElement, timestamp: number) { public playMediaWithTimestamp(element: HTMLElement, timestamp: number) {
const attachment = bubble.querySelector<HTMLElement>('.attachment'); const bubble = findUpClassName(element, 'bubble');
const groupedItem = findUpClassName(element, 'grouped-item');
const albumItemMid = groupedItem ? +groupedItem.dataset.mid : +bubble.dataset.textMid;
let attachment = bubble.querySelector<HTMLElement>('.attachment');
if(attachment) { if(attachment) {
if(albumItemMid) {
attachment = attachment.querySelector(`[data-mid="${albumItemMid}"]`);
}
const media = attachment.querySelector<HTMLElement>('img, video, canvas'); const media = attachment.querySelector<HTMLElement>('img, video, canvas');
this.checkTargetForMediaViewer(media, undefined, timestamp); this.checkTargetForMediaViewer(media, undefined, timestamp);
return; return;
} }
const audio = bubble.querySelector<AudioElement>('.audio'); const audio = (groupedItem || bubble).querySelector<AudioElement>('.audio');
if(audio) { if(audio) {
audio.playWithTimestamp(timestamp); audio.playWithTimestamp(timestamp);
return; return;
@ -3874,10 +3883,10 @@ export default class ChatBubbles {
let messageMedia: MessageMedia = isMessage && message.media; let messageMedia: MessageMedia = isMessage && message.media;
let needToSetHTML = true; let needToSetHTML = true;
let messageMessage: string, totalEntities: MessageEntity[]; let messageMessage: string, totalEntities: MessageEntity[], albumTextMessage: Message.message;
if(isMessage) { if(isMessage) {
if(groupedId && albumMustBeRenderedFull) { if(groupedId && albumMustBeRenderedFull) {
const t = getAlbumText(albumMessages); const t = albumTextMessage = getAlbumText(albumMessages);
messageMessage = t?.message || ''; messageMessage = t?.message || '';
// totalEntities = t.entities; // totalEntities = t.entities;
totalEntities = t?.totalEntities || []; totalEntities = t?.totalEntities || [];
@ -3925,9 +3934,12 @@ export default class ChatBubbles {
customEmojiSize ??= this.chat.appImManager.customEmojiSize; customEmojiSize ??= this.chat.appImManager.customEmojiSize;
const doc = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument; const maxMediaTimestamp = needToSetHTML && getMediaDurationFromMessage(albumTextMessage || message as Message.message);
if(albumTextMessage && needToSetHTML) {
bubble.dataset.textMid = '' + albumTextMessage.mid;
}
const richText = wrapRichText(messageMessage, { const richTextOptions: Parameters<typeof wrapRichText>[1] = {
entities: totalEntities, entities: totalEntities,
passEntities: this.passEntities, passEntities: this.passEntities,
loadPromises, loadPromises,
@ -3935,8 +3947,10 @@ export default class ChatBubbles {
customEmojiSize, customEmojiSize,
middleware, middleware,
animationGroup: this.chat.animationGroup, animationGroup: this.chat.animationGroup,
maxMediaTimestamp: ((['voice', 'audio', 'video'] as MyDocument['type'][]).includes(doc?.type) && doc.duration) || undefined maxMediaTimestamp
}); };
const richText = messageMessage ? wrapRichText(messageMessage, richTextOptions) : '';
let canHaveTail = true; let canHaveTail = true;
let isStandaloneMedia = false; let isStandaloneMedia = false;
@ -4621,7 +4635,8 @@ export default class ChatBubbles {
} : undefined, } : undefined,
sizeType: 'documentName', sizeType: 'documentName',
fontSize: rootScope.settings.messagesTextSize, fontSize: rootScope.settings.messagesTextSize,
richTextFragment: richText, richTextFragment: typeof(richText) === 'string' ? undefined : richText,
richTextOptions,
canTranscribeVoice: true canTranscribeVoice: true
}); });

View File

@ -8,12 +8,32 @@ import setInnerHTML from '../../helpers/dom/setInnerHTML';
import {MediaSizeType} from '../../helpers/mediaSizes'; import {MediaSizeType} from '../../helpers/mediaSizes';
import {Message} from '../../layer'; import {Message} from '../../layer';
import {AppManagers} from '../../lib/appManagers/managers'; import {AppManagers} from '../../lib/appManagers/managers';
import getMediaDurationFromMessage from '../../lib/appManagers/utils/messages/getMediaDurationFromMessage';
import wrapRichText from '../../lib/richTextProcessor/wrapRichText';
import {MediaSearchContext} from '../appMediaPlaybackController'; import {MediaSearchContext} from '../appMediaPlaybackController';
import Chat from '../chat/chat'; import Chat from '../chat/chat';
import LazyLoadQueue from '../lazyLoadQueue'; import LazyLoadQueue from '../lazyLoadQueue';
import wrapDocument from './document'; import wrapDocument from './document';
export default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment, canTranscribeVoice}: { export default async function wrapGroupedDocuments({
albumMustBeRenderedFull,
message,
bubble,
messageDiv,
chat,
loadPromises,
autoDownloadSize,
lazyLoadQueue,
searchContext,
useSearch,
sizeType,
managers,
fontWeight,
fontSize,
richTextFragment,
richTextOptions,
canTranscribeVoice
}: {
albumMustBeRenderedFull: boolean, albumMustBeRenderedFull: boolean,
message: any, message: any,
messageDiv: HTMLElement, messageDiv: HTMLElement,
@ -30,6 +50,7 @@ export default async function wrapGroupedDocuments({albumMustBeRenderedFull, mes
fontWeight?: number, fontWeight?: number,
fontSize?: number, fontSize?: number,
richTextFragment?: DocumentFragment, richTextFragment?: DocumentFragment,
richTextOptions?: Parameters<typeof wrapRichText>[1]
canTranscribeVoice?: boolean canTranscribeVoice?: boolean
}) { }) {
let nameContainer: HTMLElement; let nameContainer: HTMLElement;
@ -65,7 +86,17 @@ export default async function wrapGroupedDocuments({albumMustBeRenderedFull, mes
const messageDiv = document.createElement('div'); const messageDiv = document.createElement('div');
messageDiv.classList.add('document-message'); messageDiv.classList.add('document-message');
setInnerHTML(messageDiv, richTextFragment); let fragment = richTextFragment;
if(!fragment) {
fragment = wrapRichText(message.message, {
...richTextOptions,
entities: message.totalEntities,
maxMediaTimestamp: getMediaDurationFromMessage(message)
});
}
setInnerHTML(messageDiv, fragment);
wrapper.append(messageDiv); wrapper.append(messageDiv);
} }

View File

@ -630,7 +630,7 @@ export class AppImManager extends EventListenerBase<{
const timestamp = +element.dataset.timestamp; const timestamp = +element.dataset.timestamp;
const bubble = findUpClassName(element, 'bubble'); const bubble = findUpClassName(element, 'bubble');
if(bubble) { if(bubble) {
this.chat.bubbles.playMediaWithTimestamp(bubble, timestamp); this.chat.bubbles.playMediaWithTimestamp(element, timestamp);
return; return;
} }

View File

@ -0,0 +1,7 @@
import {Document, Message, MessageMedia} from '../../../../layer';
export default function getMediaDurationFromMessage(message: Message.message) {
const doc = (message.media as MessageMedia.messageMediaDocument)?.document as Document.document;
const duration = ((['voice', 'audio', 'video'] as Document.document['type'][]).includes(doc?.type) && doc.duration) || undefined;
return duration;
}