/**
 * Because the scroll directive uses the wheel event it prevents all other elements
 * being able to scroll. This directive can be used on a child element that supports
 * scrolling, it makes sure that scrolling works and so that it doesn't scroll the
 * parent.
 */

const addEventListeners = (el) => {
  el.preventParentScrollDirectiveEvent = (event) => {
    event.stopPropagation()
  }
  el.addEventListener('wheel', el.preventParentScrollDirectiveEvent)
  el.addEventListener('touchstart', el.preventParentScrollDirectiveEvent)
  el.addEventListener('touchend', el.preventParentScrollDirectiveEvent)
  el.addEventListener('touchmove', el.preventParentScrollDirectiveEvent)
}

const removeEventListeners = (el) => {
  el.removeEventListener('wheel', el.preventParentScrollDirectiveEvent)
  el.removeEventListener('touchstart', el.preventParentScrollDirectiveEvent)
  el.removeEventListener('touchend', el.preventParentScrollDirectiveEvent)
  el.removeEventListener('touchmove', el.preventParentScrollDirectiveEvent)
}

export default {
  bind(el, binding) {
    const active = binding.value !== undefined ? binding.value : true
    if (active) {
      addEventListeners(el)
    }
  },
  update(el, binding) {
    if (binding.value !== binding.oldValue) {
      if (binding.value) {
        addEventListeners(el)
      } else {
        removeEventListeners(el)
      }
    }
  },
  unbind(el) {
    removeEventListeners(el)
  },
}