Sha256: d4811debe83c0df53e3ed860d7489e84be3bae0b37a59b7929b2684ef9ac3e55

Contents?: true

Size: 1.8 KB

Versions: 28

Compression:

Stored size: 1.8 KB

Contents

import { Controller } from '@hotwired/stimulus'
import { post } from '@rails/request.js'
import { Rollbar } from 'rollbar'

// Connects to data-controller="notifications"
export default class extends Controller {
  timeoutId = null

  connect () {
    this.element.addEventListener('shown.bs.collapse', event => {
      this.timeoutId = setTimeout(() => {
        this.markAsSeen()
      }, 2000)
      document.addEventListener('turbo:load', () => { this.cancelTimeout() })
    })
    this.element.addEventListener('hide.bs.collapse', event => {
      clearTimeout(this.timeoutId)
    })
  }

  async markAsUnseen (e) {
    const notification = e.target.closest('.notification')
    notification.dataset.markedAsUnseen = true
    const id = notification.dataset.id
    const response = await post('/u/notifications/mark_as_unseen',
      { query: { id } })

    if (response.ok) {
      notification.classList.add('unseen')
    } else {
      const text = await response.text
      Rollbar.error('Error marking as unseen: ', text)
    }
  }

  async markAsSeen () {
    const ids = []
    const targets = Array.from(document.querySelectorAll('.notification')).filter((e) => {
      return !e.dataset.markedAsUnseen
    })
    targets.forEach((e) => { ids.push(e.dataset.id) })

    const response = await post('/u/notifications/mark_as_seen',
      { query: { ids }, responseKind: 'turbo-stream' })

    if (response.ok) {
      targets.forEach(
        (notif) => {
          notif.classList.remove('unseen')
        }
      )
      document.querySelectorAll('.notifications-unseen-mark').forEach((e) => {
        e.remove()
      })
    } else {
      const text = await response.text
      Rollbar.error('Error marking as seen: ', text)
    }
  }

  cancelTimeout () {
    if (this.timeoutId) {
      clearTimeout(this.timeoutId)
    }
  }
}

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
pg_rails-7.6.35 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.34 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.33 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.32 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.31 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.30 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.29 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.28 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.27 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.26 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.25 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.24 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.24.pre.5 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.24.pre.4 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.24.pre.3 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.23 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.22 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.22.pre.3 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.22.pre.2 pg_layout/app/javascript/controllers/notifications_controller.js
pg_rails-7.6.22.pre.1 pg_layout/app/javascript/controllers/notifications_controller.js