From 60349d0989074d182836a51b0908ae36f459d893 Mon Sep 17 00:00:00 2001
From: Marie <51697796+ijreilly@users.noreply.github.com>
Date: Thu, 7 Nov 2024 14:55:21 +0100
Subject: [PATCH] Fix broken relation picker in Kanban (#8377)
Fixes https://github.com/twentyhq/twenty/issues/8233
Typing a search input was triggering a re-render of the whole
RecordBoardCard, resetting the search input to its initial value, an
empty string, making it impossible to actually type anything.
useRelationPicker had (legacy?) useless dependencies to recoil states
that caused the rerenders.
---
.../components/RelationPicker.tsx | 45 +++++++++----------
.../SearchPickerInitialValueEffect.tsx | 25 +++++++++++
.../hooks/useRelationPicker.ts | 26 +++--------
3 files changed, 54 insertions(+), 42 deletions(-)
create mode 100644 packages/twenty-front/src/modules/object-record/relation-picker/components/SearchPickerInitialValueEffect.tsx
diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx
index af551f488..fb6293418 100644
--- a/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx
+++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx
@@ -1,13 +1,13 @@
-import { useContext, useEffect } from 'react';
+import { useContext } from 'react';
import { IconForbid } from 'twenty-ui';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata';
+import { SearchPickerInitialValueEffect } from '@/object-record/relation-picker/components/SearchPickerInitialValueEffect';
import { SingleEntitySelect } from '@/object-record/relation-picker/components/SingleEntitySelect';
import { useAddNewRecordAndOpenRightDrawer } from '@/object-record/relation-picker/hooks/useAddNewRecordAndOpenRightDrawer';
-import { useRelationPicker } from '@/object-record/relation-picker/hooks/useRelationPicker';
import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect';
export type RelationPickerProps = {
@@ -30,13 +30,6 @@ export const RelationPicker = ({
fieldDefinition,
}: RelationPickerProps) => {
const relationPickerScopeId = 'relation-picker';
- const { setRelationPickerSearchFilter } = useRelationPicker({
- relationPickerScopeId,
- });
-
- useEffect(() => {
- setRelationPickerSearchFilter(initialSearchFilter ?? '');
- }, [initialSearchFilter, setRelationPickerSearchFilter]);
const handleEntitySelected = (
selectedEntity: EntityForSelect | null | undefined,
@@ -64,19 +57,25 @@ export const RelationPicker = ({
});
return (
-
+ <>
+
+
+ >
);
};
diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/SearchPickerInitialValueEffect.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/SearchPickerInitialValueEffect.tsx
new file mode 100644
index 000000000..284de747c
--- /dev/null
+++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/SearchPickerInitialValueEffect.tsx
@@ -0,0 +1,25 @@
+import { getRelationPickerScopedStates } from '@/object-record/relation-picker/utils/getRelationPickerScopedStates';
+import { useEffect } from 'react';
+import { useSetRecoilState } from 'recoil';
+
+export const SearchPickerInitialValueEffect = ({
+ initialValueForSearchFilter,
+ relationPickerScopeId,
+}: {
+ initialValueForSearchFilter?: string | null;
+ relationPickerScopeId: string;
+}) => {
+ const { relationPickerSearchFilterState } = getRelationPickerScopedStates({
+ relationPickerScopeId: relationPickerScopeId,
+ });
+
+ const setRelationPickerSearchFilter = useSetRecoilState(
+ relationPickerSearchFilterState,
+ );
+
+ useEffect(() => {
+ setRelationPickerSearchFilter(initialValueForSearchFilter ?? '');
+ }, [initialValueForSearchFilter, setRelationPickerSearchFilter]);
+
+ return <>>;
+};
diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useRelationPicker.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useRelationPicker.ts
index 3e74f0eda..50c00b150 100644
--- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useRelationPicker.ts
+++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useRelationPicker.ts
@@ -1,4 +1,4 @@
-import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';
+import { useSetRecoilState } from 'recoil';
import { useRelationPickerScopedStates } from '@/object-record/relation-picker/hooks/internal/useRelationPickerScopedStates';
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
@@ -14,33 +14,21 @@ export const useRelationPicker = (props?: useRelationPickeProps) => {
props?.relationPickerScopeId,
);
- const {
- searchQueryState,
- relationPickerSearchFilterState,
- relationPickerPreselectedIdState,
- } = useRelationPickerScopedStates({
- relationPickerScopedId: scopeId,
- });
-
- const setSearchQuery = useSetRecoilState(searchQueryState);
+ const { relationPickerSearchFilterState, relationPickerPreselectedIdState } =
+ useRelationPickerScopedStates({
+ relationPickerScopedId: scopeId,
+ });
const setRelationPickerSearchFilter = useSetRecoilState(
relationPickerSearchFilterState,
);
- const relationPickerSearchFilter = useRecoilValue(
- relationPickerSearchFilterState,
+ const setRelationPickerPreselectedId = useSetRecoilState(
+ relationPickerPreselectedIdState,
);
- const [relationPickerPreselectedId, setRelationPickerPreselectedId] =
- useRecoilState(relationPickerPreselectedIdState);
-
return {
- scopeId,
- setSearchQuery,
setRelationPickerSearchFilter,
- relationPickerPreselectedId,
setRelationPickerPreselectedId,
- relationPickerSearchFilter,
};
};