import tplRoster from "./templates/roster.js";
import { CustomElement } from 'shared/components/element.js';
import { Model } from '@converse/skeletor/src/model.js';
import { _converse, api } from "@converse/headless/core";
import { initStorage } from '@converse/headless/utils/storage.js';
import { slideIn, slideOut } from 'utils/html.js';
/**
* @class
* @namespace _converse.RosterView
* @memberOf _converse
*/
export default class RosterView extends CustomElement {
async initialize () {
const id = `converse.contacts-panel${_converse.bare_jid}`;
this.model = new Model({ id });
initStorage(this.model, id);
this.model.fetch();
await api.waitUntil('rosterInitialized')
const { chatboxes, presences, roster } = _converse;
this.listenTo(_converse, 'rosterContactsFetched', () => this.requestUpdate());
this.listenTo(presences, 'change:show', () => this.requestUpdate());
this.listenTo(chatboxes, 'change:hidden', () => this.requestUpdate());
this.listenTo(roster, 'add', () => this.requestUpdate());
this.listenTo(roster, 'destroy', () => this.requestUpdate());
this.listenTo(roster, 'remove', () => this.requestUpdate());
this.listenTo(roster, 'change', () => this.requestUpdate());
this.listenTo(roster.state, 'change', () => this.requestUpdate());
this.listenTo(this.model, 'change', () => this.requestUpdate());
/**
* Triggered once the _converse.RosterView instance has been created and initialized.
* @event _converse#rosterViewInitialized
* @example _converse.api.listen.on('rosterViewInitialized', () => { ... });
*/
api.trigger('rosterViewInitialized');
}
render () {
return tplRoster(this);
}
showAddContactModal (ev) { // eslint-disable-line class-methods-use-this
api.modal.show('converse-add-contact-modal', {'model': new Model()}, ev);
}
async syncContacts (ev) { // eslint-disable-line class-methods-use-this
ev.preventDefault();
const { roster } = _converse;
this.syncing_contacts = true;
this.requestUpdate();
roster.data.save('version', null);
await roster.fetchFromServer();
api.user.presence.send();
this.syncing_contacts = false;
this.requestUpdate();
}
toggleRoster (ev) {
ev?.preventDefault?.();
const list_el = this.querySelector('.list-container.roster-contacts');
if (this.model.get('toggle_state') === _converse.CLOSED) {
slideOut(list_el).then(() => this.model.save({'toggle_state': _converse.OPENED}));
} else {
slideIn(list_el).then(() => this.model.save({'toggle_state': _converse.CLOSED}));
}
}
}
api.elements.define('converse-roster', RosterView);