/* eslint-disable
    max-len,
    no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
import App from '../base'

export default App.directive('updateScrollBottomOn', $timeout => ({
  restrict: 'A',
  link(scope, element, attrs, ctrls) {
    // We keep the offset from the bottom fixed whenever the event fires
    //
    // ^   | ^
    // |   | | scrollTop
    // |   | v
    // |   |-----------
    // |   | ^
    // |   | |
    // |   | | clientHeight (viewable area)
    // |   | |
    // |   | |
    // |   | v
    // |   |-----------
    // |   | ^
    // |   | | scrollBottom
    // v   | v
    //  \
    //   scrollHeight

    let scrollBottom = 0
    element.on(
      'scroll',
      e =>
        (scrollBottom =
          element[0].scrollHeight -
          element[0].scrollTop -
          element[0].clientHeight)
    )

    return scope.$on(attrs.updateScrollBottomOn, () =>
      $timeout(
        () =>
          element.scrollTop(
            element[0].scrollHeight - element[0].clientHeight - scrollBottom
          ),
        0
      )
    )
  },
}))
