ext-chatwork-events
Version:
Chatwork DOM Events wrapper for Chrome extension
72 lines (56 loc) • 1.69 kB
JavaScript
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
}