All files / client/util CrowiAuth.ts

0% Statements 0/24
0% Branches 0/17
0% Functions 0/8
0% Lines 0/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 60 61 62 63 64 65 66 67 68 69                                                                                                                                         
import Crowi from './Crowi'
import queryString from 'query-string'
 
export default class CrowiAuth {
  crowi: Crowi
 
  window: Window
 
  location: Crowi['location']
 
  localStorage: Crowi['localStorage']
 
  constructor(crowi: Crowi) {
    this.crowi = crowi
    this.window = crowi.window
    this.location = crowi.location
    this.localStorage = crowi.localStorage
 
    this.onStorage = this.onStorage.bind(this)
 
    this.subscribeStorage()
    this.updateState()
  }
 
  isAuthenticated(): boolean {
    const { id = '', name = '' } = this.crowi.getUser() || {}
    return !!(id && name)
  }
 
  subscribeStorage() {
    this.window.addEventListener('storage', this.onStorage)
  }
 
  shouldUpdate(): boolean {
    return String(this.isAuthenticated()) !== this.localStorage.getItem('authenticated')
  }
 
  updateState() {
    if (this.shouldUpdate()) {
      this.localStorage.setItem('authenticated', String(this.isAuthenticated()))
    }
  }
 
  onStorage(e: StorageEvent) {
    const { key, newValue } = e
    const isAuthenticated = newValue === 'true'
    if (key === 'authenticated') {
      if (isAuthenticated) {
        this.onLogin()
      } else {
        this.onLogout()
      }
    }
  }
 
  onLogin() {
    const { continue: continueUrl = '/' } = queryString.parse(this.location.search)
    if (continueUrl) {
      top.location.href = typeof continueUrl === 'string' ? continueUrl : '/'
    } else {
      this.location.reload()
    }
  }
 
  onLogout() {
    this.location.reload()
  }
}