aboutsummaryrefslogtreecommitdiff
path: root/public/javascripts/scrollSnap.js
blob: afee9798ba9c2d7b28a5cace9ffb0a3a33e4bb52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
require('smoothscroll-polyfill').polyfill()

const self = {}
const schedule = require('./schedule')

self._nodes = {
  search: document.querySelector('#search'),
  weekSelector: document.querySelector('#week-selector')
}

self._timeoutID = null

self._getScrollPosition = function () {
  return (document.documentElement && document.documentElement.scrollTop) ||
         document.body.scrollTop
}

self._handleDoneScrolling = function () {
  const scrollPosition = self._getScrollPosition()
  const weekSelectorHeight =
      self._nodes.weekSelector.clientHeight - self._nodes.search.clientHeight
  if (scrollPosition < weekSelectorHeight && scrollPosition > 0) {
    window.scroll({ top: weekSelectorHeight, left: 0, behavior: 'smooth' })
  }
}

self._handleScroll = function () {
  if (self._timeoutID != null) window.clearTimeout(self._timeoutID)
  self._timeoutID = window.setTimeout(self._handleDoneScrolling, 500)

  const scrollPosition = self._getScrollPosition()
  const weekSelectorHeight =
      self._nodes.weekSelector.clientHeight - self._nodes.search.clientHeight
  if (scrollPosition >= weekSelectorHeight) {
    document.body.classList.add('week-selector-not-visible')
  } else {
    document.body.classList.remove('week-selector-not-visible')
  }
}

self._handleWindowResize = function () {
  const weekSelectorHeight =
      self._nodes.weekSelector.clientHeight - self._nodes.search.clientHeight
  const extraPixelsNeeded =
      weekSelectorHeight - (document.body.clientHeight - window.innerHeight)
  if (extraPixelsNeeded > 0) {
    document.body.style.marginBottom = extraPixelsNeeded + 'px'
  } else {
    document.body.style.marginBottom = null
  }
}

self.startListening = function () {
  window.addEventListener('scroll', self._handleScroll)
}

schedule.on('load', self._handleWindowResize)
window.addEventListener('resize', self._handleWindowResize)
module.exports = self