Command Palette: Fix not being able to type if triggered whilst another modal is open (#59728)

handle command palette in the same way as other modals
This commit is contained in:
Ashley Harrison 2022-12-13 14:44:32 +00:00 committed by GitHub
parent c801f030fb
commit 535c4576f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,7 @@
import { css } from '@emotion/css';
import { useDialog } from '@react-aria/dialog';
import { FocusScope } from '@react-aria/focus';
import { useOverlay } from '@react-aria/overlays';
import {
KBarAnimator,
KBarPortal,
@ -12,12 +14,11 @@ import {
useRegisterActions,
useKBar,
} from 'kbar';
import React, { useEffect, useState } from 'react';
import React, { useEffect, useRef, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { reportInteraction, locationService } from '@grafana/runtime';
import { useStyles2 } from '@grafana/ui';
import { useGrafana } from 'app/core/context/GrafanaContext';
import { useSelector } from 'app/types';
import { ResultItem } from './ResultItem';
@ -31,7 +32,6 @@ import getGlobalActions from './actions/global.static.actions';
export const CommandPalette = () => {
const styles = useStyles2(getSearchStyles);
const { keybindings } = useGrafana();
const [actions, setActions] = useState<Action[]>([]);
const [staticActions, setStaticActions] = useState<Action[]>([]);
const { query, showing } = useKBar((state) => ({
@ -45,6 +45,13 @@ export const CommandPalette = () => {
};
});
const ref = useRef<HTMLDivElement>(null);
const { overlayProps } = useOverlay(
{ isOpen: showing, onClose: () => query.setVisualState(VisualState.animatingOut) },
ref
);
const { dialogProps } = useDialog({}, ref);
useEffect(() => {
if (isNotLogin) {
const staticActionsResp = getGlobalActions(navBarTree);
@ -61,19 +68,8 @@ export const CommandPalette = () => {
getDashboardNavActions('go/dashboard').then((dashAct) => {
setActions([...staticActions, ...dashAct]);
});
keybindings.bindGlobal('esc', () => {
query.setVisualState(VisualState.animatingOut);
});
}
return () => {
keybindings.bindGlobal('esc', () => {
keybindings.globalEsc();
});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [showing]);
}, [showing, staticActions]);
useRegisterActions(actions, [actions]);
@ -81,9 +77,11 @@ export const CommandPalette = () => {
<KBarPortal>
<KBarPositioner className={styles.positioner}>
<KBarAnimator className={styles.animator}>
<FocusScope contain>
<KBarSearch className={styles.search} />
<RenderResults />
<FocusScope contain autoFocus restoreFocus>
<div {...overlayProps} {...dialogProps}>
<KBarSearch className={styles.search} />
<RenderResults />
</div>
</FocusScope>
</KBarAnimator>
</KBarPositioner>