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.
68 lines
2.2 KiB
68 lines
2.2 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 type { AppProfileManager } from "../../lib/appManagers/appProfileManager"; |
|
import type { AppUsersManager } from "../../lib/appManagers/appUsersManager"; |
|
import AutocompleteHelperController from "./autocompleteHelperController"; |
|
import AutocompletePeerHelper from "./autocompletePeerHelper"; |
|
|
|
export default class MentionsHelper extends AutocompletePeerHelper { |
|
constructor(appendTo: HTMLElement, |
|
controller: AutocompleteHelperController, |
|
chatInput: ChatInput, |
|
private appProfileManager: AppProfileManager, |
|
private appUsersManager: AppUsersManager) { |
|
super(appendTo, |
|
controller, |
|
'mentions-helper', |
|
(target) => { |
|
const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId); |
|
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.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => { |
|
if(!middleware()) return; |
|
|
|
const username = trimmed.slice(1).toLowerCase(); |
|
this.render(peerIds.map(peerId => { |
|
const user = this.appUsersManager.getUser(peerId); |
|
if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion |
|
return; |
|
} |
|
|
|
return { |
|
peerId, |
|
description: user.username ? '@' + user.username : undefined |
|
}; |
|
}).filter(Boolean)); |
|
}); |
|
|
|
return true; |
|
} |
|
}
|
|
|