60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { isDefined } from '~/utils/isDefined';
|
|
|
|
import { DEFAULT_HOTKEYS_SCOPE_CUSTOM_SCOPES } from '../constants';
|
|
import { currentHotkeyScopeState } from '../states/internal/currentHotkeyScopeState';
|
|
import { CustomHotkeyScopes } from '../types/CustomHotkeyScope';
|
|
|
|
function isCustomScopesEqual(
|
|
customScopesA: CustomHotkeyScopes | undefined,
|
|
customScopesB: CustomHotkeyScopes | undefined,
|
|
) {
|
|
return (
|
|
customScopesA?.commandMenu === customScopesB?.commandMenu &&
|
|
customScopesA?.goto === customScopesB?.goto
|
|
);
|
|
}
|
|
|
|
export function useSetHotkeyScope() {
|
|
return useRecoilCallback(
|
|
({ snapshot, set }) =>
|
|
async (HotkeyScopeToSet: string, customScopes?: CustomHotkeyScopes) => {
|
|
const currentHotkeyScope = await snapshot.getPromise(
|
|
currentHotkeyScopeState,
|
|
);
|
|
|
|
if (currentHotkeyScope.scope === HotkeyScopeToSet) {
|
|
if (!isDefined(customScopes)) {
|
|
if (
|
|
isCustomScopesEqual(
|
|
currentHotkeyScope?.customScopes,
|
|
DEFAULT_HOTKEYS_SCOPE_CUSTOM_SCOPES,
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
} else {
|
|
if (
|
|
isCustomScopesEqual(
|
|
currentHotkeyScope?.customScopes,
|
|
customScopes,
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
set(currentHotkeyScopeState, {
|
|
scope: HotkeyScopeToSet,
|
|
customScopes: {
|
|
commandMenu: customScopes?.commandMenu ?? true,
|
|
goto: customScopes?.goto ?? false,
|
|
},
|
|
});
|
|
},
|
|
[],
|
|
);
|
|
}
|