2727-fix(front): CommandMenu and KeyboardMenu invoke handled (#2783)

* 2727-fix(front): CommandMenu and KeyboardMenu invoke handled

* Fix Command Menu and bug on metadata re-render

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Kanav Arora
2023-12-02 04:15:42 +05:30
committed by GitHub
parent fec8223ab8
commit 31f29582d0
5 changed files with 39 additions and 31 deletions

View File

@ -4,6 +4,7 @@ import { useRecoilValue } from 'recoil';
import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer'; import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import { CommandMenuSelectableListEffect } from '@/command-menu/components/CommandMenuSelectableListEffect'; import { CommandMenuSelectableListEffect } from '@/command-menu/components/CommandMenuSelectableListEffect';
import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { Person } from '@/people/types/Person'; import { Person } from '@/people/types/Person';
import { IconNotes } from '@/ui/display/icon'; import { IconNotes } from '@/ui/display/icon';
@ -89,6 +90,7 @@ export const CommandMenu = () => {
const isCommandMenuOpened = useRecoilValue(isCommandMenuOpenedState); const isCommandMenuOpened = useRecoilValue(isCommandMenuOpenedState);
const [search, setSearch] = useState(''); const [search, setSearch] = useState('');
const commandMenuCommands = useRecoilValue(commandMenuCommandsState); const commandMenuCommands = useRecoilValue(commandMenuCommandsState);
const { closeKeyboardShortcutMenu } = useKeyboardShortcutMenu();
const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => { const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setSearch(event.target.value); setSearch(event.target.value);
@ -97,6 +99,7 @@ export const CommandMenu = () => {
useScopedHotkeys( useScopedHotkeys(
'ctrl+k,meta+k', 'ctrl+k,meta+k',
() => { () => {
closeKeyboardShortcutMenu();
setSearch(''); setSearch('');
toggleCommandMenu(); toggleCommandMenu();
}, },
@ -108,6 +111,7 @@ export const CommandMenu = () => {
'esc', 'esc',
() => { () => {
setSearch(''); setSearch('');
closeKeyboardShortcutMenu();
closeCommandMenu(); closeCommandMenu();
}, },
AppHotkeyScope.CommandMenu, AppHotkeyScope.CommandMenu,

View File

@ -1,5 +1,6 @@
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope'; import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
@ -20,9 +21,11 @@ export const KeyboardShortcutMenu = () => {
const isKeyboardShortcutMenuOpened = useRecoilValue( const isKeyboardShortcutMenuOpened = useRecoilValue(
isKeyboardShortcutMenuOpenedState, isKeyboardShortcutMenuOpenedState,
); );
const { closeCommandMenu } = useCommandMenu();
useScopedHotkeys( useScopedHotkeys(
'shift+?,meta+?', 'shift+?,meta+?',
() => { () => {
closeCommandMenu();
toggleKeyboardShortcutMenu(); toggleKeyboardShortcutMenu();
}, },
AppHotkeyScope.KeyboardShortcutMenu, AppHotkeyScope.KeyboardShortcutMenu,
@ -30,7 +33,7 @@ export const KeyboardShortcutMenu = () => {
); );
useScopedHotkeys( useScopedHotkeys(
'Esc', 'esc',
() => { () => {
closeKeyboardShortcutMenu(); closeKeyboardShortcutMenu();
}, },

View File

@ -1,7 +1,23 @@
import { useEffect } from 'react';
import { useRecoilState } from 'recoil';
import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems'; import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
export const ObjectMetadataItemsLoadEffect = () => { export const ObjectMetadataItemsLoadEffect = () => {
useFindManyObjectMetadataItems(); const { objectMetadataItems: newObjectMetadataItems } =
useFindManyObjectMetadataItems();
const [objectMetadataItems, setObjectMetadataItems] = useRecoilState(
objectMetadataItemsState,
);
useEffect(() => {
if (!isDeeplyEqual(objectMetadataItems, newObjectMetadataItems)) {
setObjectMetadataItems(newObjectMetadataItems);
}
}, [newObjectMetadataItems, objectMetadataItems, setObjectMetadataItems]);
return <></>; return <></>;
}; };

View File

@ -3,25 +3,31 @@ import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { ObjectMetadataItemsLoadEffect } from '@/object-metadata/components/ObjectMetadataItemsLoadEffect'; import { ObjectMetadataItemsLoadEffect } from '@/object-metadata/components/ObjectMetadataItemsLoadEffect';
import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect'; import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect';
import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { RelationPickerScope } from '@/ui/input/components/internal/relation-picker/scopes/RelationPickerScope'; import { RelationPickerScope } from '@/ui/input/components/internal/relation-picker/scopes/RelationPickerScope';
export const ObjectMetadataItemsProvider = ({ export const ObjectMetadataItemsProvider = ({
children, children,
}: React.PropsWithChildren) => { }: React.PropsWithChildren) => {
useFindManyObjectMetadataItems();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const currentWorkspace = useRecoilValue(currentWorkspaceState); const currentWorkspace = useRecoilValue(currentWorkspaceState);
return objectMetadataItems.length < 1 && currentWorkspace ? ( return (
<> <>
<ObjectMetadataItemsLoadEffect /> <ObjectMetadataItemsLoadEffect />
</> {objectMetadataItems.length < 1 && currentWorkspace ? (
) : ( <></>
<> ) : (
<ObjectMetadataItemsRelationPickerEffect /> <>
<RelationPickerScope relationPickerScopeId="relation-picker"> <ObjectMetadataItemsRelationPickerEffect />
{children} <RelationPickerScope relationPickerScopeId="relation-picker">
</RelationPickerScope> {children}
</RelationPickerScope>
</>
)}
</> </>
); );
}; };

View File

@ -1,8 +1,6 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useQuery } from '@apollo/client'; import { useQuery } from '@apollo/client';
import { useRecoilCallback } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { import {
FieldFilter, FieldFilter,
@ -10,7 +8,6 @@ import {
ObjectMetadataItemsQuery, ObjectMetadataItemsQuery,
ObjectMetadataItemsQueryVariables, ObjectMetadataItemsQueryVariables,
} from '~/generated-metadata/graphql'; } from '~/generated-metadata/graphql';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
import { logError } from '~/utils/logError'; import { logError } from '~/utils/logError';
import { FIND_MANY_OBJECT_METADATA_ITEMS } from '../graphql/queries'; import { FIND_MANY_OBJECT_METADATA_ITEMS } from '../graphql/queries';
@ -50,24 +47,6 @@ export const useFindManyObjectMetadataItems = ({
}, },
); );
}, },
onCompleted: useRecoilCallback(
({ snapshot, set }) =>
(data) => {
const objectMetadataItems =
mapPaginatedObjectMetadataItemsToObjectMetadataItems({
pagedObjectMetadataItems: data,
});
const actualObjectMetadataItems = snapshot
.getLoadable(objectMetadataItemsState)
.getValue();
if (!isDeeplyEqual(objectMetadataItems, actualObjectMetadataItems)) {
set(objectMetadataItemsState, objectMetadataItems);
}
},
[],
),
}); });
const objectMetadataItems = useMemo(() => { const objectMetadataItems = useMemo(() => {