client/src/app/core/hotkeys/hotkey.model.ts
// 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
}
}