mirror of https://github.com/Chocobozzz/PeerTube
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
// 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
|
|
}
|
|
}
|