UNPKG

ext-chatwork-events

Version:

Chatwork DOM Events wrapper for Chrome extension

72 lines (56 loc) 1.69 kB
'use strict' const EventEmitter = require('eventemitter2').EventEmitter2 const $ = (selector) => { if (selector[0] === '#') { return document.getElementById(selector.slice(1)) } else { return document.querySelectorAll(selector) } } const observe = (el, opts, callback) => { let mutation = new MutationObserver((mutations) => mutations.forEach(callback)) mutation.observe(el, opts) return mutation } const filter = (list, predicate) => { if (!Array.isArray(list)) { list = Array.from(list) } return list.filter(predicate) } const dig = (obj, attrName) => attrName.split('.').reduce((memo, prop) => memo && memo[prop] ? memo[prop] : null, obj ) const attrIs = (attrName, expected) => (obj) => dig(obj, attrName) === expected const hasClass = (className) => (el) => el.classList.contains(className) const eventOptions = { delimiter: ':', } const Events = new EventEmitter(eventOptions) document.addEventListener('DOMContentLoaded', () => { const loadingObserver = observe($('#_loader'), { attributes: true, attributeFilter: ['style'], }, (mutation) => { if (mutation.target.style.display === 'none') { Events.emit('ready') loadingObserver.disconnect() } }) observe($('#_timeLine'), { childList: true, }, (mutation) => { const added = filter(mutation.addedNodes, hasClass('_message')) added.forEach((node) => Events.emit('messages:add', node)) const removed = filter(mutation.removedNodes, hasClass('_message')) removed.forEach((node) => Events.emit('messages:remove', node)) }) }, false) if (window) { window.ChatworkEvents = Events } else { module.exports = Events }