summaryrefslogtreecommitdiff
path: root/packages/frontend/src/directives/hotkey.ts
blob: d8fdfe647ab461c60f659658df0c0c9dff632101 (plain)
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
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import type { Directive } from 'vue';
import { makeHotkey } from '@/utility/hotkey.js';
import type { Keymap } from '@/utility/hotkey.js';

interface HTMLElementWithHotkey extends HTMLElement {
	_hotkey_global?: boolean;
	_keyHandler?: (ev: KeyboardEvent) => void;
}

export const hotkeyDirective = {
	mounted(el, binding) {
		el._hotkey_global = binding.modifiers.global === true;

		el._keyHandler = makeHotkey(binding.value);

		if (el._hotkey_global) {
			window.document.addEventListener('keydown', el._keyHandler, { passive: false });
		} else {
			el.addEventListener('keydown', el._keyHandler, { passive: false });
		}
	},

	unmounted(el) {
		if (el._keyHandler == null) return;
		if (el._hotkey_global) {
			window.document.removeEventListener('keydown', el._keyHandler);
		} else {
			el.removeEventListener('keydown', el._keyHandler);
		}
	},
} as Directive<HTMLElementWithHotkey, Keymap>;