一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
54 行
1.6 KiB
TypeScript
54 行
1.6 KiB
TypeScript
import * as React from 'react';
|
|
import { useCallback } from 'react';
|
|
import { ShortcutRecorder } from '../../KeymapConfig/ShortcutRecorder';
|
|
|
|
interface OnChangeEvent {
|
|
value: string;
|
|
}
|
|
|
|
interface Props {
|
|
value: string;
|
|
themeId: number;
|
|
onChange: (event: OnChangeEvent)=> void;
|
|
}
|
|
|
|
// A thin wrapper around ShortcutRecorder for the global hotkey setting.
|
|
// Reuses ShortcutRecorder directly instead of maintaining a separate display mode.
|
|
export default function GlobalHotkeyInput(props: Props) {
|
|
const value = props.value || '';
|
|
|
|
const onSave = useCallback((event: { commandName: string; accelerator: string }) => {
|
|
// Normalize platform-specific modifiers to CommandOrControl for
|
|
// consistent cross-platform storage.
|
|
const accelerator = event.accelerator
|
|
.replace(/\bCmd\b/, 'CommandOrControl')
|
|
.replace(/\bCtrl\b/, 'CommandOrControl');
|
|
props.onChange({ value: accelerator });
|
|
}, [props.onChange]);
|
|
|
|
const onReset = useCallback(() => {
|
|
props.onChange({ value: '' });
|
|
}, [props.onChange]);
|
|
|
|
// No-op: global hotkeys don't have a separate editing mode to cancel out of.
|
|
const onCancel = useCallback(() => {}, []);
|
|
|
|
// No-op: ShortcutRecorder validates against the keymap (command
|
|
// conflicts), which doesn't apply to global hotkeys.
|
|
const onError = useCallback((_event: { recorderError: Error }) => {}, []);
|
|
|
|
return (
|
|
<ShortcutRecorder
|
|
onSave={onSave}
|
|
onReset={onReset}
|
|
onCancel={onCancel}
|
|
onError={onError}
|
|
initialAccelerator={value}
|
|
commandName="globalHotkey"
|
|
themeId={props.themeId}
|
|
skipKeymapValidation
|
|
autoFocus={false}
|
|
/>
|
|
);
|
|
}
|