converse.js
Version:
Browser based XMPP chat client
109 lines (94 loc) • 4.16 kB
JavaScript
import { __ } from 'i18n';
import { converse, api } from "@converse/headless";
import { html } from "lit";
const u = converse.env.utils;
const emoji_category = (o) => {
return html`
<li data-category="${o.category}"
class="emoji-category ${o.category} ${(o.current_category === o.category) ? 'picked' : ''}"
title="${__(api.settings.get('emoji_category_labels')[o.category])}">
<a class="btn pick-category"
@click=${o.onCategoryPicked}
href="#emoji-picker-${o.category}"
data-category="${o.category}">${o.emoji} </a>
</li>
`;
}
const emoji_picker_header = (o) => {
const cats = api.settings.get('emoji_categories');
const transform = c => cats[c] ? emoji_category(Object.assign({'category': c, 'emoji': o.sn2Emoji(cats[c])}, o)) : '';
return html`<ul>${ Object.keys(cats).map(transform) }</ul>`;
}
const emoji_item = (o) => {
return html`
<li class="emoji insert-emoji ${o.shouldBeHidden(o.emoji.sn) ? 'hidden' : ''}" data-emoji="${o.emoji.sn}" title="${o.emoji.sn}">
<a href="#" @click=${o.insertEmoji} data-emoji="${o.emoji.sn}">${u.shortnamesToEmojis(o.emoji.sn)}</a>
</li>
`;
}
export function tplSearchResults (o) {
const i18n_search_results = __('Search results');
return html`
<span ?hidden=${!o.query} class="emoji-lists__container emojis-lists__container--search">
<a id="emoji-picker-search-results" class="emoji-category__heading">${i18n_search_results}</a>
<ul class="emoji-picker">
${ o.search_results.map(emoji => emoji_item(Object.assign({emoji}, o))) }
</ul>
</span>
`;
}
function emojis_for_category (o) {
return html`
<a id="emoji-picker-${o.category}" class="emoji-category__heading" data-category="${o.category}">${ __(api.settings.get('emoji_category_labels')[o.category]) }</a>
<ul class="emoji-picker" data-category="${o.category}">
${ Object.values(converse.emojis.json[o.category]).map(emoji => emoji_item(Object.assign({emoji}, o))) }
</ul>`;
}
export function tplAllEmojis (o) {
const cats = api.settings.get('emoji_categories');
return html`
<span ?hidden=${o.query} class="emoji-lists__container emoji-lists__container--browse">
${Object.keys(cats).map(c => (cats[c] ? emojis_for_category(Object.assign({'category': c}, o)) : ''))}
</span>`;
}
function skintone_emoji (o, skintone, skintone_emoji) {
return html`
<li data-skintone="${skintone_emoji}" class="emoji-skintone ${(o.current_skintone === skintone) ? 'picked' : ''}">
<a class="pick-skintone" href="#" data-skintone="${skintone}" @click=${o.onSkintonePicked}>
${u.shortnamesToEmojis(skintone_emoji)}
</a>
</li>`;
}
/**
* @param {import('../emoji-picker').default} el
* @param {Object} o
*/
export function tplEmojiPicker (el, o) {
const i18n_search = __('Search');
const skintones = {
"tone1": ":raised_hand_tone1:",
"tone2": ":raised_hand_tone2:",
"tone3": ":raised_hand_tone3:",
"tone4": ":raised_hand_tone4:",
"tone5": ":raised_hand_tone5:"
};
return html`
<div class="emoji-picker__header">
<input class="form-control emoji-search" name="emoji-search" placeholder="${i18n_search}"
.value=${o.query || ''}
@keydown=${o.onSearchInputKeyDown}
@blur=${o.onSearchInputBlurred}
@focus=${o.onSearchInputFocus}>
${ o.query ? '' : emoji_picker_header(o) }
</div>
${ o.render_emojis ?
html`<converse-emoji-picker-content
.model=${el.state}
.search_results="${o.search_results}"
current_skintone="${o.current_skintone}"
query="${o.query}"></converse-emoji-picker-content>` : ''}
<div class="emoji-skintone-picker">
Skin tone:
<ul>${ Object.keys(skintones).map(k => skintone_emoji(o, k, skintones[k])) }</ul>
</div>`;
}