2023-02-15 14:19:48 +01:00
|
|
|
import tplGroup from "./group.js";
|
2021-01-26 14:01:37 +01:00
|
|
|
import { __ } from 'i18n';
|
|
|
|
import { _converse, api } from "@converse/headless/core";
|
|
|
|
import { contactsComparator, groupsComparator } from '@converse/headless/plugins/roster/utils.js';
|
2021-04-14 22:56:59 +02:00
|
|
|
import { html } from "lit";
|
|
|
|
import { repeat } from 'lit/directives/repeat.js';
|
2022-04-14 23:39:01 +02:00
|
|
|
import { shouldShowContact, shouldShowGroup, populateContactsMap } from '../utils.js';
|
2021-01-26 14:01:37 +01:00
|
|
|
|
|
|
|
|
2021-07-15 16:16:25 +02:00
|
|
|
export default (el) => {
|
2021-01-26 14:01:37 +01:00
|
|
|
const i18n_heading_contacts = __('Contacts');
|
2022-10-02 14:30:16 +02:00
|
|
|
const i18n_toggle_contacts = __('Click to toggle contacts');
|
2021-01-26 14:01:37 +01:00
|
|
|
const i18n_title_add_contact = __('Add a contact');
|
|
|
|
const i18n_title_sync_contacts = __('Re-sync your contacts');
|
|
|
|
const roster = _converse.roster || [];
|
|
|
|
const contacts_map = roster.reduce((acc, contact) => populateContactsMap(acc, contact), {});
|
|
|
|
const groupnames = Object.keys(contacts_map).filter(shouldShowGroup);
|
2022-10-02 14:30:16 +02:00
|
|
|
const is_closed = el.model.get('toggle_state') === _converse.CLOSED;
|
2021-01-26 14:01:37 +01:00
|
|
|
groupnames.sort(groupsComparator);
|
|
|
|
|
|
|
|
return html`
|
|
|
|
<div class="d-flex controlbox-padded">
|
2022-10-02 14:30:16 +02:00
|
|
|
<span class="w-100 controlbox-heading controlbox-heading--contacts">
|
|
|
|
<a class="list-toggle open-contacts-toggle" title="${i18n_toggle_contacts}" @click=${el.toggleRoster}>
|
|
|
|
<converse-icon
|
|
|
|
class="fa ${ is_closed ? 'fa-caret-right' : 'fa-caret-down' }"
|
|
|
|
size="1em"
|
|
|
|
color="var(--chat-color)"></converse-icon>
|
|
|
|
${i18n_heading_contacts}
|
|
|
|
</a>
|
|
|
|
</span>
|
|
|
|
<a class="controlbox-heading__btn sync-contacts"
|
|
|
|
@click=${ev => el.syncContacts(ev)}
|
|
|
|
title="${i18n_title_sync_contacts}">
|
|
|
|
|
2022-01-29 11:55:06 +01:00
|
|
|
<converse-icon class="fa fa-sync right ${el.syncing_contacts ? 'fa-spin' : ''}" size="1em"></converse-icon>
|
2021-07-15 16:16:25 +02:00
|
|
|
</a>
|
2021-01-26 14:01:37 +01:00
|
|
|
${ api.settings.get('allow_contact_requests') ? html`
|
2021-07-15 16:16:25 +02:00
|
|
|
<a class="controlbox-heading__btn add-contact"
|
|
|
|
@click=${ev => el.showAddContactModal(ev)}
|
2021-01-26 14:01:37 +01:00
|
|
|
title="${i18n_title_add_contact}"
|
|
|
|
data-toggle="modal"
|
2021-07-15 16:16:25 +02:00
|
|
|
data-target="#add-contact-modal">
|
2022-01-29 11:55:06 +01:00
|
|
|
<converse-icon class="fa fa-user-plus right" size="1.25em"></converse-icon>
|
2021-07-15 16:16:25 +02:00
|
|
|
</a>` : '' }
|
2021-01-26 14:01:37 +01:00
|
|
|
</div>
|
2022-12-13 09:54:13 +01:00
|
|
|
|
2022-10-02 14:30:16 +02:00
|
|
|
<div class="list-container roster-contacts ${ is_closed ? 'hidden' : '' }">
|
|
|
|
<converse-roster-filter @update=${() => el.requestUpdate()}></converse-roster-filter>
|
2022-12-13 09:54:13 +01:00
|
|
|
${ repeat(groupnames, (n) => n, (name) => {
|
2021-05-12 12:26:16 +02:00
|
|
|
const contacts = contacts_map[name].filter(c => shouldShowContact(c, name));
|
2021-01-26 14:01:37 +01:00
|
|
|
contacts.sort(contactsComparator);
|
2023-02-15 14:19:48 +01:00
|
|
|
return contacts.length ? tplGroup({ contacts, name }) : '';
|
2021-01-26 14:01:37 +01:00
|
|
|
}) }
|
|
|
|
</div>
|
|
|
|
`;
|
|
|
|
}
|