xmpp.chapril.org-conversejs/src/plugins/chatview/bottom-panel.js

99 lines
3.0 KiB
JavaScript
Raw Normal View History

import './message-form.js';
import debounce from 'lodash-es/debounce';
import tplBottomPanel from './templates/bottom-panel.js';
import { ElementView } from '@converse/skeletor/src/element.js';
import { _converse, api } from '@converse/headless/core';
import { clearMessages } from './utils.js';
import { render } from 'lit';
import './styles/chat-bottom-panel.scss';
export default class ChatBottomPanel extends ElementView {
events = {
'click .send-button': 'sendButtonClicked',
'click .toggle-clear': 'clearMessages'
};
constructor () {
super();
this.debouncedRender = debounce(this.render, 100);
}
async connectedCallback () {
super.connectedCallback();
await this.initialize();
this.render(); // don't call in initialize, since the MUCBottomPanel subclasses it
// and we want to render after it has finished as wel.
}
async initialize () {
this.model = await api.chatboxes.get(this.getAttribute('jid'));
await this.model.initialized;
this.listenTo(this.model, 'change:num_unread', this.debouncedRender)
this.listenTo(this.model, 'emoji-picker-autocomplete', this.autocompleteInPicker);
this.addEventListener('focusin', ev => this.emitFocused(ev));
this.addEventListener('focusout', ev => this.emitBlurred(ev));
}
render () {
render(tplBottomPanel({
'model': this.model,
'viewUnreadMessages': ev => this.viewUnreadMessages(ev)
}), this);
}
sendButtonClicked (ev) {
this.querySelector('converse-message-form')?.onFormSubmitted(ev);
}
viewUnreadMessages (ev) {
ev?.preventDefault?.();
this.model.ui.set({ 'scrolled': false });
}
emitFocused (ev) {
2021-02-11 22:32:55 +01:00
_converse.chatboxviews.get(this.getAttribute('jid'))?.emitFocused(ev);
}
emitBlurred (ev) {
2021-02-11 22:32:55 +01:00
_converse.chatboxviews.get(this.getAttribute('jid'))?.emitBlurred(ev);
}
onDrop (evt) {
if (evt.dataTransfer.files.length == 0) {
// There are no files to be dropped, so this isnt a file
// transfer operation.
return;
}
evt.preventDefault();
this.model.sendFiles(evt.dataTransfer.files);
}
onDragOver (ev) { // eslint-disable-line class-methods-use-this
ev.preventDefault();
}
clearMessages (ev) {
ev?.preventDefault?.();
clearMessages(this.model);
}
2021-06-03 18:36:26 +02:00
async autocompleteInPicker (input, value) {
await api.emojis.initialize();
const emoji_picker = this.querySelector('converse-emoji-picker');
if (emoji_picker) {
emoji_picker.model.set({
'ac_position': input.selectionStart,
'autocompleting': value,
'query': value
});
const emoji_dropdown = this.querySelector('converse-emoji-dropdown');
emoji_dropdown?.showMenu();
}
}
}
api.elements.define('converse-chat-bottom-panel', ChatBottomPanel);