|
|
|
import { getFullDate } from "../../helpers/date";
|
|
|
|
import { formatNumber } from "../../helpers/number";
|
|
|
|
import { MessageReplies } from "../../layer";
|
|
|
|
import appPeersManager from "../../lib/appManagers/appPeersManager";
|
|
|
|
import RichTextProcessor from "../../lib/richtextprocessor";
|
|
|
|
import { ripple } from "../ripple";
|
|
|
|
import Chat from "./chat";
|
|
|
|
|
|
|
|
type Message = any;
|
|
|
|
|
|
|
|
export namespace MessageRender {
|
|
|
|
/* export const setText = () => {
|
|
|
|
|
|
|
|
}; */
|
|
|
|
|
|
|
|
export const setTime = (chat: Chat, message: Message, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => {
|
|
|
|
const date = new Date(message.date * 1000);
|
|
|
|
let time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
|
|
|
|
|
|
|
|
if(message.views) {
|
|
|
|
const postAuthor = message.post_author || message.fwd_from?.post_author;
|
|
|
|
|
|
|
|
bubble.classList.add('channel-post');
|
|
|
|
time = formatNumber(message.views, 1) + ' <i class="tgico-channelviews"></i> ' + (postAuthor ? RichTextProcessor.wrapEmojiText(postAuthor) + ', ' : '') + time;
|
|
|
|
|
|
|
|
if(!message.savedFrom) {
|
|
|
|
const forward = document.createElement('div');
|
|
|
|
forward.classList.add('bubble-beside-button', 'forward');
|
|
|
|
forward.innerHTML = `
|
|
|
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24">
|
|
|
|
<defs>
|
|
|
|
<path d="M13.55 3.24L13.64 3.25L13.73 3.27L13.81 3.29L13.9 3.32L13.98 3.35L14.06 3.39L14.14 3.43L14.22 3.48L14.29 3.53L14.36 3.59L14.43 3.64L22.23 10.85L22.36 10.99L22.48 11.15L22.57 11.31L22.64 11.48L22.69 11.66L22.72 11.85L22.73 12.04L22.71 12.22L22.67 12.41L22.61 12.59L22.53 12.76L22.42 12.93L22.29 13.09L22.23 13.15L14.43 20.36L14.28 20.48L14.12 20.58L13.95 20.66L13.77 20.72L13.58 20.76L13.4 20.77L13.22 20.76L13.03 20.73L12.85 20.68L12.68 20.61L12.52 20.52L12.36 20.4L12.22 20.27L12.16 20.2L12.1 20.13L12.05 20.05L12.01 19.98L11.96 19.9L11.93 19.82L11.89 19.73L11.87 19.65L11.84 19.56L11.83 19.47L11.81 19.39L11.81 19.3L11.8 19.2L11.8 16.42L11 16.49L10.23 16.58L9.51 16.71L8.82 16.88L8.18 17.09L7.57 17.33L7.01 17.6L6.48 17.91L5.99 18.26L5.55 18.64L5.14 19.05L4.77 19.51L4.43 19.99L4.29 20.23L4.21 20.35L4.11 20.47L4 20.57L3.88 20.65L3.75 20.72L3.62 20.78L3.48 20.82L3.33 20.84L3.19 20.84L3.04 20.83L2.9 20.79L2.75 20.74L2.62 20.68L2.53 20.62L2.45 20.56L2.38 20.5L2.31 20.43L2.25 20.36L2.2 20.28L2.15 20.19L2.11 20.11L2.07 20.02L2.04 19.92L2.02 19.83L2.01 19.73L2 19.63L2.04 17.99L2.19 16.46L2.46 15.05L2.85 13.75L3.35 12.58L3.97 11.53L4.7 10.6L5.55 9.8L6.51 9.12L7.59 8.56L8.77 8.13L10.07 7.83L11.48 7.65L11.8 7.63L11.8 4.8L11.91 4.56L12.02 4.35L12.14 4.16L12.25 3.98L12.37 3.82L12.48 3.68L12.61 3.56L12.73 3.46L12.85 3.38L12.98 3.31L13.11 3.27L13.24 3.24L13.37 3.23L13.46 3.23L13.55 3.24Z" id="b13RmHDQtl"></path>
|
|
|
|
</defs>
|
|
|
|
<use xlink:href="#b13RmHDQtl" opacity="1" fill="#fff" fill-opacity="1"></use>
|
|
|
|
</svg>`;
|
|
|
|
bubbleContainer.append(forward);
|
|
|
|
bubble.classList.add('with-beside-button');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(message.edit_date) {
|
|
|
|
bubble.classList.add('is-edited');
|
|
|
|
time = '<i class="edited">edited</i> ' + time;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(chat.type != 'pinned' && message.pFlags.pinned) {
|
|
|
|
bubble.classList.add('is-pinned');
|
|
|
|
time = '<i class="tgico tgico-pinnedchat"></i>' + time;
|
|
|
|
}
|
|
|
|
|
|
|
|
const title = getFullDate(date)
|
|
|
|
+ (message.edit_date ? `\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')
|
|
|
|
+ (message.fwd_from ? `\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');
|
|
|
|
|
|
|
|
const timeSpan = document.createElement('span');
|
|
|
|
timeSpan.classList.add('time', 'tgico');
|
|
|
|
timeSpan.title = title;
|
|
|
|
timeSpan.innerHTML = `${time}<div class="inner tgico" title="${title}">${time}</div>`;
|
|
|
|
|
|
|
|
messageDiv.append(timeSpan);
|
|
|
|
|
|
|
|
return timeSpan;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const renderReplies = ({bubble, bubbleContainer, message, messageDiv}: {
|
|
|
|
bubble: HTMLElement,
|
|
|
|
bubbleContainer: HTMLElement,
|
|
|
|
message: any,
|
|
|
|
messageDiv: HTMLElement
|
|
|
|
}) => {
|
|
|
|
const replies = message.replies as MessageReplies;
|
|
|
|
const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big');
|
|
|
|
if(isFooter) {
|
|
|
|
const container = document.createElement('div');
|
|
|
|
container.classList.add('replies-footer');
|
|
|
|
|
|
|
|
let leftHTML = '', lastStyle = '';
|
|
|
|
if(replies?.recent_repliers) {
|
|
|
|
leftHTML += '<div class="replies-footer-avatars">'
|
|
|
|
/**
|
|
|
|
* MACOS, ANDROID - без реверса
|
|
|
|
* WINDOWS DESKTOP - реверс
|
|
|
|
* все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!
|
|
|
|
*/
|
|
|
|
let l: string[] = [];
|
|
|
|
replies.recent_repliers/* .slice().reverse() */.forEach((peer, idx) => {
|
|
|
|
lastStyle = idx == 0 ? '' : `style="transform: translateX(-${idx * 12}px);"`;
|
|
|
|
l.push(`<avatar-element class="avatar-32" dialog="0" peer="${appPeersManager.getPeerId(peer)}" ${lastStyle}></avatar-element>`);
|
|
|
|
});
|
|
|
|
leftHTML += l.reverse().join('') + '</div>';
|
|
|
|
} else {
|
|
|
|
leftHTML = '<span class="tgico-comments"></span>';
|
|
|
|
}
|
|
|
|
|
|
|
|
let text: string;
|
|
|
|
if(replies?.replies) {
|
|
|
|
text = replies.replies + ' ' + (replies.replies > 1 ? 'Comments' : 'Comment');
|
|
|
|
} else {
|
|
|
|
text = 'Leave a Comment';
|
|
|
|
}
|
|
|
|
|
|
|
|
if(replies) {
|
|
|
|
if(replies.read_max_id < replies.max_id) {
|
|
|
|
container.classList.add('is-unread');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
container.innerHTML = `${leftHTML}<span class="replies-footer-text" ${lastStyle}>${text}</span><span class="tgico-next"></span>`;
|
|
|
|
|
|
|
|
const rippleContainer = document.createElement('div');
|
|
|
|
container.append(rippleContainer);
|
|
|
|
ripple(rippleContainer);
|
|
|
|
bubbleContainer.prepend(container);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|