import {emojiKeys, emojiHTML, emojiString} from './emoji.js'; import {uniq} from '../utils.js'; function makeCollections({mentions, emoji}) { const collections = []; if (mentions) { collections.push({ trigger: ':', requireLeadingSpace: true, values: (query, cb) => { const matches = []; for (const name of emojiKeys) { if (name.includes(query)) { matches.push(name); if (matches.length > 5) break; } } cb(matches); }, lookup: (item) => item, selectTemplate: (item) => { if (typeof item === 'undefined') return null; return emojiString(item.original); }, menuItemTemplate: (item) => { return `
${emojiHTML(item.original)}${item.original}
`; } }); } if (emoji) { collections.push({ values: window.config.tributeValues, noMatchTemplate: () => null, menuItemTemplate: (item) => { return `
${item.original.name} ${item.original.fullname && item.original.fullname !== '' ? `${item.original.fullname}` : ''}
`; } }); } return collections; } export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) { if (!window.config.Tribute || !elementOrNodeList) return; const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]); if (!nodes.length) return; const mentionNodes = nodes.filter((node) => { return mentions || node.id === 'content'; }); const emojiNodes = nodes.filter((node) => { return emoji || node.id === 'content' || node.classList.contains('emoji-input'); }); const uniqueNodes = uniq([...mentionNodes, ...emojiNodes]); if (!uniqueNodes.length) return; const {default: Tribute} = await import(/* webpackChunkName: "tribute" */'tributejs'); const collections = makeCollections({ mentions: mentions || mentionNodes.length > 0, emoji: emoji || emojiNodes.length > 0, }); const tribute = new Tribute({collection: collections}); for (const node of uniqueNodes) { tribute.attach(node); } return tribute; }