Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
6.7 KiB
213 lines
6.7 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import PopupElement from '.'; |
|
import {Message} from '../../layer'; |
|
import {SettingSection} from '../sidebarLeft'; |
|
import ReactionsElement from '../chat/reactions'; |
|
import {horizontalMenu} from '../horizontalMenu'; |
|
import Scrollable from '../scrollable'; |
|
import ScrollableLoader from '../../helpers/scrollableLoader'; |
|
import appDialogsManager from '../../lib/appManagers/appDialogsManager'; |
|
import replaceContent from '../../helpers/dom/replaceContent'; |
|
import {wrapSticker} from '../wrappers'; |
|
import ReactionElement from '../chat/reaction'; |
|
import getUserStatusString from '../wrappers/getUserStatusString'; |
|
|
|
export default class PopupReactedList extends PopupElement { |
|
constructor( |
|
private message: Message.message |
|
) { |
|
super('popup-reacted-list', {closable: true, overlayClosable: true, body: true}); |
|
|
|
this.init(); |
|
} |
|
|
|
private async init() { |
|
const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message); |
|
|
|
const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message); |
|
|
|
// this.body.append(generateDelimiter()); |
|
|
|
const reactionsElement = new ReactionsElement(); |
|
const newMessage: Message.message = { |
|
...message, |
|
mid: 0, |
|
id: 0, |
|
reactions: { |
|
_: 'messageReactions', |
|
results: [], |
|
|
|
...message.reactions, |
|
|
|
pFlags: {}, |
|
recent_reactions: [] |
|
} |
|
}; |
|
|
|
newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => { |
|
return { |
|
...reactionCount, |
|
pFlags: {} |
|
}; |
|
}); |
|
|
|
reactionsElement.init(newMessage, 'block'); |
|
reactionsElement.render(); |
|
reactionsElement.classList.add('no-stripe'); |
|
reactionsElement.classList.remove('has-no-reactions'); |
|
|
|
reactionsElement.append(this.btnClose); |
|
|
|
this.header.append(reactionsElement); |
|
|
|
const tabsContainer = document.createElement('div'); |
|
tabsContainer.classList.add('tabs-container'); |
|
tabsContainer.dataset.animation = 'tabs'; |
|
|
|
const loaders: Map<HTMLElement, ScrollableLoader> = new Map(); |
|
|
|
let hasAllReactions = false; |
|
if(newMessage.reactions.results.length) { |
|
const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0)); |
|
|
|
reactionsElement.prepend(reaction); |
|
newMessage.reactions.results.unshift(reaction.reactionCount); |
|
hasAllReactions = true; |
|
} |
|
|
|
let hasReadParticipants = false; |
|
if(canViewReadParticipants) { |
|
try { |
|
const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid); |
|
if(!readUserIds.length) { |
|
throw ''; |
|
} |
|
|
|
const reaction = this.createFakeReaction('checks', readUserIds.length); |
|
|
|
reactionsElement.prepend(reaction); |
|
newMessage.reactions.results.unshift(reaction.reactionCount); |
|
hasReadParticipants = true; |
|
} catch(err) { |
|
|
|
} |
|
} |
|
|
|
newMessage.reactions.results.forEach((reactionCount) => { |
|
const scrollable = new Scrollable(undefined); |
|
scrollable.container.classList.add('tabs-tab'); |
|
|
|
const section = new SettingSection({ |
|
noShadow: true, |
|
noDelimiter: true |
|
}); |
|
|
|
const chatlist = appDialogsManager.createChatList({ |
|
dialogSize: 72 |
|
}); |
|
|
|
appDialogsManager.setListClickListener(chatlist, () => { |
|
this.hide(); |
|
}, undefined, false, true); |
|
|
|
section.content.append(chatlist); |
|
scrollable.container.append(section.container); |
|
|
|
const skipReadParticipants = reactionCount.reaction !== 'checks'; |
|
const skipReactionsList = reactionCount.reaction === 'checks'; |
|
if(['checks', 'reactions'].includes(reactionCount.reaction)) { |
|
reactionCount.reaction = undefined; |
|
} |
|
|
|
let nextOffset: string; |
|
const loader = new ScrollableLoader({ |
|
scrollable, |
|
getPromise: async() => { |
|
const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList); |
|
nextOffset = result.nextOffset; |
|
|
|
await Promise.all(result.combined.map(async({peerId, reaction}) => { |
|
const {dom} = appDialogsManager.addDialogNew({ |
|
peerId: peerId, |
|
autonomous: true, |
|
container: chatlist, |
|
avatarSize: 54, |
|
rippleEnabled: false, |
|
meAsSaved: false |
|
}); |
|
|
|
if(reaction) { |
|
const stickerContainer = document.createElement('div'); |
|
stickerContainer.classList.add('reacted-list-reaction-icon'); |
|
const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction); |
|
|
|
wrapSticker({ |
|
doc: availableReaction.static_icon, |
|
div: stickerContainer, |
|
width: 24, |
|
height: 24 |
|
}); |
|
|
|
dom.listEl.append(stickerContainer); |
|
} |
|
|
|
replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()))); |
|
})); |
|
|
|
return !nextOffset; |
|
} |
|
}); |
|
|
|
loaders.set(scrollable.container, loader); |
|
|
|
tabsContainer.append(scrollable.container); |
|
}); |
|
|
|
this.body.append(tabsContainer); |
|
|
|
const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => { |
|
if(id === (reactionsElement.childElementCount - 1)) { |
|
return false; |
|
} |
|
|
|
const reaction = reactionsElement.children[id] as ReactionElement; |
|
const prevId = selectTab.prevId(); |
|
if(prevId !== -1) { |
|
(reactionsElement.children[prevId] as ReactionElement).setIsChosen(false); |
|
} |
|
|
|
reaction.setIsChosen(true); |
|
|
|
const loader = loaders.get(tabContent); |
|
loader.load(); |
|
}, undefined, undefined, undefined, this.listenerSetter); |
|
|
|
// selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false); |
|
selectTab(0, false); |
|
|
|
this.show(); |
|
} |
|
|
|
private createFakeReaction(icon: string, count: number) { |
|
const reaction = new ReactionElement(); |
|
reaction.init('block'); |
|
reaction.reactionCount = { |
|
_: 'reactionCount', |
|
count: count, |
|
reaction: icon |
|
}; |
|
reaction.setCanRenderAvatars(false); |
|
reaction.renderCounter(); |
|
|
|
const allReactionsSticker = document.createElement('div'); |
|
allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon); |
|
reaction.prepend(allReactionsSticker); |
|
|
|
return reaction; |
|
} |
|
}
|
|
|