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.
74 lines
2.3 KiB
74 lines
2.3 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import type ChatInput from './input'; |
|
import type {MessageEntity} from '../../layer'; |
|
import AutocompleteHelperController from './autocompleteHelperController'; |
|
import AutocompletePeerHelper from './autocompletePeerHelper'; |
|
import {AppManagers} from '../../lib/appManagers/managers'; |
|
|
|
export default class MentionsHelper extends AutocompletePeerHelper { |
|
constructor( |
|
appendTo: HTMLElement, |
|
controller: AutocompleteHelperController, |
|
chatInput: ChatInput, |
|
private managers: AppManagers |
|
) { |
|
super( |
|
appendTo, |
|
controller, |
|
'mentions-helper', |
|
(target) => { |
|
const userId = (target as HTMLElement).dataset.peerId.toUserId(); |
|
const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => { |
|
let str = '', entity: MessageEntity; |
|
if(user.username) { |
|
str = '@' + user.username; |
|
} else { |
|
str = user.first_name || user.last_name; |
|
entity = { |
|
_: 'messageEntityMentionName', |
|
length: str.length, |
|
offset: 0, |
|
user_id: user.id |
|
}; |
|
} |
|
|
|
str += ' '; |
|
chatInput.insertAtCaret(str, entity); |
|
}); |
|
} |
|
); |
|
} |
|
|
|
public checkQuery(query: string, peerId: PeerId, topMsgId: number) { |
|
const trimmed = query.trim(); // check that there is no whitespace |
|
if(query.length !== trimmed.length) return false; |
|
|
|
const middleware = this.controller.getMiddleware(); |
|
this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => { |
|
if(!middleware()) return; |
|
|
|
const username = trimmed.slice(1).toLowerCase(); |
|
|
|
const p = peerIds.map(async(peerId) => { |
|
const user = await this.managers.appUsersManager.getUser(peerId); |
|
if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion |
|
return; |
|
} |
|
|
|
return { |
|
peerId, |
|
description: user.username ? '@' + user.username : undefined |
|
}; |
|
}); |
|
|
|
this.render((await Promise.all(p)).filter(Boolean)); |
|
}); |
|
|
|
return true; |
|
} |
|
}
|
|
|