From 5edc034f8ba2421ed72383d490291211db5bcb81 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Thu, 9 Apr 2026 10:43:54 +0200 Subject: [PATCH] Enqueue a snack bar on merge preview errors (#19465) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/twentyhq/twenty/issues/19312 Capture d’écran 2026-04-08 à 18 17
57 --- .../modules/app/components/AppRouterProviders.tsx | 2 +- .../object-record/hooks/useMergeManyRecords.ts | 5 ++--- .../record-merge/hooks/usePerformMergePreview.ts | 15 +++++++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/twenty-front/src/modules/app/components/AppRouterProviders.tsx b/packages/twenty-front/src/modules/app/components/AppRouterProviders.tsx index 4f70a863393..0dddddad957 100644 --- a/packages/twenty-front/src/modules/app/components/AppRouterProviders.tsx +++ b/packages/twenty-front/src/modules/app/components/AppRouterProviders.tsx @@ -6,8 +6,8 @@ import { IsMinimalMetadataReadyEffect } from '@/metadata-store/effect-components import { GotoHotkeysEffectsProvider } from '@/app/effect-components/GotoHotkeysEffectsProvider'; import { PageChangeEffect } from '@/app/effect-components/PageChangeEffect'; -import { SignOutOnOtherTabSignOutEffect } from '@/auth/effect-components/SignOutOnOtherTabSignOutEffect'; import { AuthProvider } from '@/auth/components/AuthProvider'; +import { SignOutOnOtherTabSignOutEffect } from '@/auth/effect-components/SignOutOnOtherTabSignOutEffect'; import { CaptchaProvider } from '@/captcha/components/CaptchaProvider'; import { ClientConfigProvider } from '@/client-config/components/ClientConfigProvider'; import { ClientConfigProviderEffect } from '@/client-config/components/ClientConfigProviderEffect'; diff --git a/packages/twenty-front/src/modules/object-record/hooks/useMergeManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useMergeManyRecords.ts index f24c353166b..458c8a7bd71 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useMergeManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useMergeManyRecords.ts @@ -1,5 +1,6 @@ import { useCallback, useState } from 'react'; +import { dispatchObjectRecordOperationBrowserEvent } from '@/browser-event/utils/dispatchObjectRecordOperationBrowserEvent'; import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useGenerateDepthRecordGqlFieldsFromObject } from '@/object-record/graphql/record-gql-fields/hooks/useGenerateDepthRecordGqlFieldsFromObject'; @@ -8,10 +9,9 @@ import { useFindOneRecordQuery } from '@/object-record/hooks/useFindOneRecordQue import { useMergeManyRecordsMutation } from '@/object-record/hooks/useMergeManyRecordsMutation'; import { useRefetchAggregateQueries } from '@/object-record/hooks/useRefetchAggregateQueries'; import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { dispatchObjectRecordOperationBrowserEvent } from '@/browser-event/utils/dispatchObjectRecordOperationBrowserEvent'; import { getMergeManyRecordsMutationResponseField } from '@/object-record/utils/getMergeManyRecordsMutationResponseField'; -import { getOperationName } from '~/utils/getOperationName'; import { type RecordGqlOperationGqlRecordFields } from 'twenty-shared/types'; +import { getOperationName } from '~/utils/getOperationName'; export type MergeManySettings = { conflictPriorityIndex: number; @@ -88,7 +88,6 @@ export const useMergeManyRecords = < // Prevent cache updates during dry run to avoid overwriting original record data ...(preview && { fetchPolicy: 'no-cache', - errorPolicy: 'ignore', }), refetchQueries: [ getOperationName(findOneRecordQuery) ?? '', diff --git a/packages/twenty-front/src/modules/object-record/record-merge/hooks/usePerformMergePreview.ts b/packages/twenty-front/src/modules/object-record/record-merge/hooks/usePerformMergePreview.ts index 48090e5470b..48bb914f9db 100644 --- a/packages/twenty-front/src/modules/object-record/record-merge/hooks/usePerformMergePreview.ts +++ b/packages/twenty-front/src/modules/object-record/record-merge/hooks/usePerformMergePreview.ts @@ -1,12 +1,14 @@ import { getRecordFromRecordNode } from '@/object-record/cache/utils/getRecordFromRecordNode'; import { useMergeManyRecords } from '@/object-record/hooks/useMergeManyRecords'; import { useMergeRecordsSelectedRecords } from '@/object-record/record-merge/hooks/useMergeRecordsSelectedRecords'; -import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; -import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { useEffect, useState } from 'react'; import { isMergeInProgressState } from '@/object-record/record-merge/states/mergeInProgressState'; import { mergeSettingsState } from '@/object-record/record-merge/states/mergeSettingsState'; +import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; +import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; +import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; +import { type ErrorLike } from '@apollo/client'; +import { useEffect, useState } from 'react'; type UseMergePreviewProps = { objectNameSingular: string; @@ -30,6 +32,7 @@ export const usePerformMergePreview = ({ const { selectedRecords } = useMergeRecordsSelectedRecords(); const { upsertRecordsInStore } = useUpsertRecordsInStore(); + const { enqueueErrorSnackBar } = useSnackBar(); useEffect(() => { const fetchPreview = async () => { @@ -60,8 +63,11 @@ export const usePerformMergePreview = ({ setMergePreviewRecord(transformPreviewRecord); upsertRecordsInStore({ partialRecords: [transformPreviewRecord] }); - } catch { + } catch (error) { setMergePreviewRecord(null); + enqueueErrorSnackBar({ + apolloError: error as ErrorLike, + }); } finally { setIsGeneratingPreview(false); setIsInitialized(true); @@ -79,6 +85,7 @@ export const usePerformMergePreview = ({ mergeManyRecords, upsertRecordsInStore, isInitialized, + enqueueErrorSnackBar, ]); return {