Enqueue a snack bar on merge preview errors (#19465)

Fixes https://github.com/twentyhq/twenty/issues/19312

<img width="400" height="500" alt="Capture d’écran 2026-04-08 à 18 17
57"
src="https://github.com/user-attachments/assets/41ac28b2-0208-47b4-bd85-f803c524330a"
/>
This commit is contained in:
Thomas Trompette
2026-04-09 08:43:54 +00:00
committed by GitHub
parent 9080180156
commit 5edc034f8b
3 changed files with 14 additions and 8 deletions
@@ -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';
@@ -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) ?? '',
@@ -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 {