Chocobozzz/PeerTube

View on GitHub
client/src/app/core/hotkeys/hotkey.model.ts

Summary

Maintainability
A
45 mins
Test Coverage
// Thanks to https://github.com/brtnshrdr/angular2-hotkeys

import { arrayify } from '@peertube/peertube-core-utils'

export class Hotkey {
  private formattedHotkey: string[]

  static symbolize (combo: string): string {
    const map: any = {
      command: '\u2318', // ⌘
      shift: '\u21E7', // ⇧
      left: '\u2190', // ←
      right: '\u2192', // →
      up: '\u2191', // ↑
      down: '\u2193', // ↓
      return: '\u23CE', // ⏎
      backspace: '\u232B' // ⌫
    }
    const comboSplit: string[] = combo.split('+')

    for (let i = 0; i < comboSplit.length; i++) {
      // try to resolve command / ctrl based on OS:
      if (comboSplit[i] === 'mod') {
        if (window.navigator?.platform.includes('Mac')) {
          comboSplit[i] = 'command'
        } else {
          comboSplit[i] = 'ctrl'
        }
      }

      comboSplit[i] = map[comboSplit[i]] || comboSplit[i]
    }

    return comboSplit.join(' + ')
  }

  constructor (
    public combo: string | string[],
    public callback: (event: KeyboardEvent, combo: string) => any | boolean,
    public description?: string | Function
  ) {
    this.combo = arrayify(combo)
    this.description = description || ''
  }

  get formatted (): string[] {
    if (!this.formattedHotkey) {
      const sequence: string[] = [ ...this.combo ]

      for (let i = 0; i < sequence.length; i++) {
        sequence[i] = Hotkey.symbolize(sequence[i])
      }

      this.formattedHotkey = sequence
    }

    return this.formattedHotkey
  }
}