|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
}
|