From c7113429cecc65f7b9f3f66bc01d313969634e56 Mon Sep 17 00:00:00 2001 From: Joris Mancini Date: Fri, 7 Nov 2025 17:14:34 +0100 Subject: [PATCH] feat(error-handling): generalize snack error with fallback Signed-off-by: Joris Mancini --- package-lock.json | 6 +-- package.json | 2 +- src/components/app.jsx | 27 +++------- .../dialogs/commons/use-form-search-copy.ts | 15 ++---- ...dynamic-simulation-parameters-selector.tsx | 8 ++- .../event/dynamic-simulation-event-dialog.tsx | 5 +- .../dialogs/export-network-dialog.tsx | 6 +-- .../dialogs/import-modification-dialog.tsx | 15 +++--- .../line-type-segment-form.tsx | 5 +- .../line-types-catalog-selector-dialog.tsx | 5 +- .../balances-adjustment-dialog.tsx | 11 ++-- .../creation/battery-creation-dialog.tsx | 11 ++-- .../battery-modification-dialog.tsx | 13 +++-- .../modification-by-assignment-dialog.tsx | 6 +-- .../by-filter-deletion-dialog.tsx | 7 +-- .../by-formula/by-formula-dialog.jsx | 6 +-- .../create-coupling-device-dialog.tsx | 14 +++-- .../delete-attaching-line-dialog.jsx | 7 +-- .../delete-voltage-level-on-line-dialog.jsx | 7 +-- .../equipment-deletion-dialog.jsx | 7 +-- .../equipment-deletion-form.jsx | 7 +-- .../hvdc-lcc-deletion-utils.js | 7 +-- .../generation-dispatch-dialog.jsx | 7 +-- .../generator-scaling-dialog.jsx | 7 +-- .../variation/variation-form.jsx | 7 +-- .../creation/generator-creation-dialog.tsx | 13 +++-- .../generator-modification-dialog.tsx | 13 +++-- .../lcc/creation/lcc-creation-dialog.tsx | 7 +-- .../modification/lcc-modification-dialog.tsx | 13 +++-- .../vsc/creation/vsc-creation-dialog.jsx | 13 +++-- .../modification/vsc-modification-dialog.tsx | 7 +-- .../limit-sets-modification-dialog.tsx | 7 +-- .../line-attach-to-voltage-level-dialog.jsx | 7 +-- .../line-split-with-voltage-level-dialog.jsx | 7 +-- .../line-to-attach-or-split-form.jsx | 7 +-- .../line/creation/line-creation-dialog.jsx | 6 +-- .../modification/line-modification-dialog.tsx | 6 +-- .../lines-attach-to-split-lines-dialog.jsx | 7 +-- .../load-scaling/load-scaling-dialog.jsx | 9 ++-- .../load/creation/load-creation-dialog.tsx | 7 +-- .../modification/load-modification-dialog.tsx | 7 +-- .../shunt-compensator-creation-dialog.jsx | 7 +-- .../shunt-compensator-modification-dialog.jsx | 7 +-- ...static-var-compensator-creation-dialog.tsx | 7 +-- .../creation/substation-creation-dialog.jsx | 7 +-- .../substation-modification-dialog.jsx | 7 +-- .../tabular/tabular-dialog.tsx | 12 ++--- .../tabular/use-filter-csv-generator.ts | 7 +-- ...o-windings-transformer-creation-dialog.jsx | 6 +-- ...ndings-transformer-modification-dialog.jsx | 6 +-- .../voltage-level-creation-dialog.jsx | 6 +-- .../voltage-level-modification-dialog.jsx | 6 +-- .../move-voltage-level-feeder-bays-dialog.tsx | 13 +++-- .../create-voltage-level-section-dialog.tsx | 13 +++-- .../create-voltage-level-topology-dialog.tsx | 13 +++-- ...age-level-topology-modification-dialog.tsx | 6 +-- .../curve/dialog/equipment-filter.tsx | 17 ++---- .../state-estimation-parameters.tsx | 11 ++-- .../use-get-state-estimation-parameters.ts | 7 +-- .../use-get-short-circuit-parameters.ts | 6 +-- .../use-get-voltage-init-parameters.ts | 6 +-- .../parameters/use-parameters-state.ts | 7 +-- .../dialogs/restore-modification-dialog.tsx | 8 ++- .../event-modification-scenario-editor.tsx | 13 ++--- .../network-modification-node-dialog.tsx | 6 +-- .../network-modification-node-editor.tsx | 51 ++++++------------ .../root-network-chip-cell-renderer.tsx | 6 +-- .../switch-cell-renderer.tsx | 6 +-- .../root-network/root-network-node-editor.tsx | 21 ++++---- .../root-network-panel-header.tsx | 11 ++-- .../use-root-network-modification-search.ts | 4 +- .../use-root-network-notifications.ts | 9 +++- src/components/graph/nodes/build-button.tsx | 7 +-- .../network-area-diagram-content.tsx | 15 ++---- .../positionDiagram/position-diagram.tsx | 11 ++-- .../single-line-diagram-content.tsx | 10 ++-- src/components/menus/bus-menu.tsx | 6 +-- .../menus/operating-status-menu.tsx | 6 +-- .../network-modification-tree-pane.jsx | 52 +++++-------------- src/components/network-modification-tree.jsx | 7 +-- src/components/network/network-map-panel.tsx | 23 +++----- .../selection-creation-panel/use-save-map.ts | 12 ++--- .../global-filter/global-filter-provider.tsx | 10 ++-- .../use-global-filter-options.ts | 12 ++--- .../use-global-filter-results.ts | 5 +- .../hooks/useResultTimeSeries.ts | 7 +-- .../results/pccmin/pcc-min-result.tsx | 9 +--- .../security-analysis-export-button.tsx | 21 ++------ .../paged-sensitivity-analysis-result.tsx | 19 ++----- .../sensitivity-analysis-export-button.tsx | 7 +-- .../shortcircuit-analysis-export-button.tsx | 10 +--- .../shortcircuit-analysis-result.tsx | 16 ++---- src/components/run-button-container.jsx | 33 +++--------- .../add-spreadsheet-from-model-dialog.tsx | 4 +- .../dialogs/add-spreadsheet-utils.ts | 8 ++- ...dd-spreadsheets-from-collection-dialog.tsx | 4 +- .../columns/column-creation-dialog.tsx | 4 +- .../spreadsheet-view/columns/column-menu.tsx | 10 ++-- .../floating-popover-treeview-wrapper.tsx | 4 +- .../hooks/use-fetch-equipment.ts | 10 ++-- .../hooks/use-node-aliases.ts | 12 ++--- .../spreadsheet-tabs/spreadsheet-tabs.tsx | 19 ++++--- .../spreadsheet-view/spreadsheet-view.tsx | 5 +- .../hooks/use-column-management.ts | 7 +-- .../spreadsheet-toolbar/columns-config.tsx | 7 +-- .../row-counter/filtered-row-counter.tsx | 5 +- .../save/save-naming-filter-dialog.tsx | 11 ++-- .../save-spreadsheet-collection-dialog.tsx | 9 ++-- .../save/save-spreadsheet-dialog.tsx | 13 ++--- src/components/study-container.jsx | 18 +++---- src/components/voltage-init-result.tsx | 16 ++---- src/hooks/use-computation-debug.ts | 6 +-- src/hooks/use-equipment-dialogs.tsx | 7 +-- src/hooks/use-export-download.ts | 6 +-- src/hooks/use-export-notification.ts | 15 +++--- src/hooks/use-report-fetcher.tsx | 7 +-- src/hooks/use-study-path.ts | 6 +-- src/translations/en.json | 5 +- src/translations/fr.json | 3 +- 119 files changed, 426 insertions(+), 759 deletions(-) diff --git a/package-lock.json b/package-lock.json index 396f508493..db21b3e2a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@gridsuite/commons-ui": "0.136.0", + "@gridsuite/commons-ui": "../commons-ui/gridsuite-commons-ui-0.136.0.tgz", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^4.1.3", "@mui/icons-material": "^5.18.0", @@ -3405,8 +3405,8 @@ }, "node_modules/@gridsuite/commons-ui": { "version": "0.136.0", - "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.136.0.tgz", - "integrity": "sha512-2/MeU1/FDRiR8DZC8CFqYQmkwZ/zAuAMomCwNWRlobG3hQPOh/xSaKqGPG6G+VZ12//YJAYYWUavXtsRAQTkHg==", + "resolved": "file:../commons-ui/gridsuite-commons-ui-0.136.0.tgz", + "integrity": "sha512-IVHyns5muP6oQkto4U1ee+/mBFXdkmqAU3rwAvWDWd0H/WYZQFVsVuDDZ2Fl0lqZVCyC0Qk0gAFPVoqzO91o9w==", "license": "MPL-2.0", "dependencies": { "@ag-grid-community/locale": "^33.3.2", diff --git a/package.json b/package.json index 34b1c5a275..c13e1398fd 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@gridsuite/commons-ui": "0.136.0", + "@gridsuite/commons-ui": "../commons-ui/gridsuite-commons-ui-0.136.0.tgz", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^4.1.3", "@mui/icons-material": "^5.18.0", diff --git a/src/components/app.jsx b/src/components/app.jsx index da9fb48914..9e5864dc1a 100644 --- a/src/components/app.jsx +++ b/src/components/app.jsx @@ -23,6 +23,7 @@ import { useNotificationsListener, useSnackMessage, getComputedLanguage, + snackWithFallback, } from '@gridsuite/commons-ui'; import PageNotFound from './page-not-found'; import { FormattedMessage } from 'react-intl'; @@ -155,12 +156,7 @@ const App = () => { .then((param) => { updateParams([param]); }) - .catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }) - ); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'paramsRetrievingError' })); } }, [snackError, updateParams] @@ -212,9 +208,7 @@ const App = () => { dispatch(saveSpreadsheetGlobalFilters(tabUuid, formattedGlobalFilters)); }) .catch((error) => { - console.error(error); - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_loading_model', }); }); @@ -230,8 +224,7 @@ const App = () => { resetTableDefinitions(collection); }) .catch((error) => { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_loading_collection', }); }); @@ -329,10 +322,7 @@ const App = () => { dispatch(setOptionalServices(retrieveOptionalServices(services))); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'optionalServicesRetrievingError', - }); + snackWithFallback(snackError, error, { headerId: 'optionalServicesRetrievingError' }); }); // Dispatch globally when all params are loaded to allow easy waiting. @@ -349,12 +339,7 @@ const App = () => { .then(() => { dispatch(setParamsLoaded()); }) - .catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }) - ); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'paramsRetrievingError' })); } }, [user, studyUuid, dispatch, updateParams, snackError, updateNetworkVisualizationsParams, resetTableDefinitions]); diff --git a/src/components/dialogs/commons/use-form-search-copy.ts b/src/components/dialogs/commons/use-form-search-copy.ts index 9398cefd03..c0c84e86e5 100644 --- a/src/components/dialogs/commons/use-form-search-copy.ts +++ b/src/components/dialogs/commons/use-form-search-copy.ts @@ -11,6 +11,7 @@ import { type EquipmentInfos, type EquipmentType, type ExtendedEquipmentType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { EQUIPMENT_INFOS_TYPES, type EQUIPMENT_TYPES } from '../../utils/equipment-types'; @@ -65,16 +66,10 @@ export function useFormSearchCopy( }); }) .catch((error) => { - console.error(`error while fetching equipment ${element.id} : message = ${error.message}`); - let msg; - if (error.status === 404) { - msg = intl.formatMessage({ id: 'EquipmentCopyFailed404' }, { equipmentId: element.id }); - } else { - msg = `${intl.formatMessage({ id: 'EquipmentCopyFailed' }, { equipmentId: element.id })} ${ - error.message - }`; - } - snackError({ messageTxt: msg }); + snackWithFallback(snackError, error, { + headerId: 'EquipmentCopyFailed', + headerValues: { equipmentId: element.id }, + }); }) .finally(() => handleCloseSearchDialog()), [ diff --git a/src/components/dialogs/dynamicsimulation/dynamic-simulation-parameters-selector.tsx b/src/components/dialogs/dynamicsimulation/dynamic-simulation-parameters-selector.tsx index bb052d0956..1d7c3f1844 100644 --- a/src/components/dialogs/dynamicsimulation/dynamic-simulation-parameters-selector.tsx +++ b/src/components/dialogs/dynamicsimulation/dynamic-simulation-parameters-selector.tsx @@ -12,7 +12,7 @@ import Typography from '@mui/material/Typography'; import { FormattedMessage } from 'react-intl'; import Grid from '@mui/material/Grid'; import Button from '@mui/material/Button'; -import { AutocompleteInput, CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { AutocompleteInput, CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { fetchDynamicSimulationParameters, updateDynamicSimulationParameters, @@ -90,8 +90,7 @@ export function DynamicSimulationParametersSelector({ reset({ ...emptyFormData, [MAPPING]: paramsPlusMappings.mapping }); }) .catch((error) => { - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationGetMappingError', }); }); @@ -115,8 +114,7 @@ export function DynamicSimulationParametersSelector({ onStart(newDynamicSimulationParams); }) .catch((error) => { - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationParametersChangeError', }); }); diff --git a/src/components/dialogs/dynamicsimulation/event/dynamic-simulation-event-dialog.tsx b/src/components/dialogs/dynamicsimulation/event/dynamic-simulation-event-dialog.tsx index 33c8a1ef60..36047e2e88 100644 --- a/src/components/dialogs/dynamicsimulation/event/dynamic-simulation-event-dialog.tsx +++ b/src/components/dialogs/dynamicsimulation/event/dynamic-simulation-event-dialog.tsx @@ -17,7 +17,7 @@ import { Event, EventProperty, EventPropertyName, PrimitiveTypes } from './types import yup from 'components/utils/yup-config'; import { getSchema } from './util/event-yup'; import { eventDefinitions, getEventType } from './model/event.model'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { FetchStatus } from '../../../../services/utils'; import { EQUIPMENT_TYPES } from '../../../utils/equipment-types'; import { useSelector } from 'react-redux'; @@ -161,8 +161,7 @@ export const DynamicSimulationEventDialog = (props: DynamicSimulationEventDialog }; saveDynamicSimulationEvent(studyUuid, currentNodeId, submitEvent).catch((error) => { - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationEventSaveError', }); }); diff --git a/src/components/dialogs/export-network-dialog.tsx b/src/components/dialogs/export-network-dialog.tsx index 0a0e526e2d..783140f1cb 100644 --- a/src/components/dialogs/export-network-dialog.tsx +++ b/src/components/dialogs/export-network-dialog.tsx @@ -29,6 +29,7 @@ import { fetchDirectoryElementPath, FlatParameters, Parameter, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { ExportFormatProperties, getAvailableExportFormats } from '../../services/study'; @@ -99,10 +100,7 @@ export function ExportNetworkDialog({ setFileName(`${studyName}_${nodeName}`); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LoadStudyAndParentsInfoError', - }); + snackWithFallback(snackError, error, { headerId: 'LoadStudyAndParentsInfoError' }); }); } }, [studyUuid, nodeName, snackError]); diff --git a/src/components/dialogs/import-modification-dialog.tsx b/src/components/dialogs/import-modification-dialog.tsx index 3c833b4f1b..085eecdac5 100644 --- a/src/components/dialogs/import-modification-dialog.tsx +++ b/src/components/dialogs/import-modification-dialog.tsx @@ -6,7 +6,13 @@ */ import { useIntl } from 'react-intl'; -import { ElementType, useSnackMessage, DirectoryItemSelector, TreeViewFinderNodeProps } from '@gridsuite/commons-ui'; +import { + ElementType, + useSnackMessage, + DirectoryItemSelector, + TreeViewFinderNodeProps, + snackWithFallback, +} from '@gridsuite/commons-ui'; import { copyOrMoveModifications } from '../../services/study'; import { FunctionComponent } from 'react'; import { useSelector } from 'react-redux'; @@ -41,11 +47,8 @@ const ImportModificationDialog: FunctionComponent originStudyUuid: studyUuid, originNodeUuid: currentNode.id, }; - copyOrMoveModifications(studyUuid, currentNode.id, modificationUuidList, copyInfos).catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errDuplicateModificationMsg', - }); + copyOrMoveModifications(studyUuid, currentNode.id, modificationUuidList, copyInfos).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errDuplicateModificationMsg' }); }); } // close the file selector diff --git a/src/components/dialogs/line-types-catalog/line-type-segment-form.tsx b/src/components/dialogs/line-types-catalog/line-type-segment-form.tsx index 618bdf12db..f83cbf7f6a 100644 --- a/src/components/dialogs/line-types-catalog/line-type-segment-form.tsx +++ b/src/components/dialogs/line-types-catalog/line-type-segment-form.tsx @@ -29,7 +29,7 @@ import LineTypesCatalogSelectorDialog from './line-types-catalog-selector-dialog import { roundToDefaultPrecision } from '../../../utils/rounding'; import LineTypeSegmentCreation from './line-type-segment-creation'; import { calculateReactance, calculateResistance, calculateSusceptance } from '../../utils/utils'; -import { CustomAGGrid, type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomAGGrid, type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { getLineTypesCatalog } from '../../../services/network-modification'; import GridItem from '../commons/grid-item'; import { CurrentLimitsInfo, LineTypeInfo } from './line-catalog.type'; @@ -68,8 +68,7 @@ export const LineTypeSegmentForm = () => { setLineTypesCatalog(values); }) .catch((error) => - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'LineTypesCatalogFetchingError', }) ); diff --git a/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx b/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx index e55c94133f..fc51879802 100644 --- a/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx +++ b/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useRef, useState } from 'react'; -import { CustomFormProvider, Option, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, Option, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { AgGridReact } from 'ag-grid-react'; import { CATEGORIES_TABS, CurrentLimitsInfo, LineTypeInfo } from './line-catalog.type'; import { @@ -210,8 +210,7 @@ export default function LineTypesCatalogSelectorDialog({ setUndergroundShapeFactors(createOptionsFromUndergroundShapeFactors(selectedData)); } } catch (error) { - snackError({ - messageTxt: (error as Error).message, + snackWithFallback(snackError, error, { headerId: 'LineTypesCatalogFetchingError', }); } diff --git a/src/components/dialogs/network-modifications/balances-adjustment/balances-adjustment-dialog.tsx b/src/components/dialogs/network-modifications/balances-adjustment/balances-adjustment-dialog.tsx index a4b1cdf78d..b33a6c586f 100644 --- a/src/components/dialogs/network-modifications/balances-adjustment/balances-adjustment-dialog.tsx +++ b/src/components/dialogs/network-modifications/balances-adjustment/balances-adjustment-dialog.tsx @@ -6,7 +6,7 @@ */ import { ModificationDialog } from 'components/dialogs/commons/modificationDialog'; import { useCallback, useEffect, useMemo, useState } from 'react'; -import { catchErrorHandler, CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { catchErrorHandler, CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { FieldErrors, useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { @@ -249,12 +249,9 @@ export function BalancesAdjustmentDialog({ }), }); } catch (error) { - catchErrorHandler(error, (message) => - snackError({ - messageTxt: message, - headerId: 'GenerationDispatchError', - }) - ); + snackWithFallback(snackError, error, { + headerId: 'GenerationDispatchError', + }); } }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/battery/creation/battery-creation-dialog.tsx b/src/components/dialogs/network-modifications/battery/creation/battery-creation-dialog.tsx index aa302b6c87..181221daa2 100644 --- a/src/components/dialogs/network-modifications/battery/creation/battery-creation-dialog.tsx +++ b/src/components/dialogs/network-modifications/battery/creation/battery-creation-dialog.tsx @@ -10,7 +10,13 @@ import { ModificationDialog } from '../../../commons/modificationDialog'; import EquipmentSearchDialog from '../../../equipment-search-dialog'; import { useCallback, useEffect } from 'react'; import { useFormSearchCopy } from '../../../commons/use-form-search-copy'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { @@ -242,8 +248,7 @@ export default function BatteryCreationDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'BatteryCreationError', }); }); diff --git a/src/components/dialogs/network-modifications/battery/modification/battery-modification-dialog.tsx b/src/components/dialogs/network-modifications/battery/modification/battery-modification-dialog.tsx index 90584f0c13..29993bcb8d 100644 --- a/src/components/dialogs/network-modifications/battery/modification/battery-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/battery/modification/battery-modification-dialog.tsx @@ -6,7 +6,13 @@ */ import { useCallback, useEffect, useState } from 'react'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { @@ -318,10 +324,7 @@ export default function BatteryModificationDialog({ modificationUuid: editData?.uuid ?? null, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'BatteryModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'BatteryModificationError' }); }); }, [selectedId, studyUuid, currentNodeUuid, editData, snackError] diff --git a/src/components/dialogs/network-modifications/by-filter/by-assignment/modification-by-assignment-dialog.tsx b/src/components/dialogs/network-modifications/by-filter/by-assignment/modification-by-assignment-dialog.tsx index f34e72c7f8..52edb6cf39 100644 --- a/src/components/dialogs/network-modifications/by-filter/by-assignment/modification-by-assignment-dialog.tsx +++ b/src/components/dialogs/network-modifications/by-filter/by-assignment/modification-by-assignment-dialog.tsx @@ -12,6 +12,7 @@ import { convertOutputValue, CustomFormProvider, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { FC, useCallback, useEffect, useMemo } from 'react'; @@ -129,10 +130,7 @@ const ModificationByAssignmentDialog: FC = ({ !!editData, editData?.uuid ?? null ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'ModifyByAssignment', - }); + snackWithFallback(snackError, error, { headerId: 'ModifyByAssignment' }); }); }, [currentNodeUuid, editData, emptyValueStr, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/by-filter/by-filter-deletion/by-filter-deletion-dialog.tsx b/src/components/dialogs/network-modifications/by-filter/by-filter-deletion/by-filter-deletion-dialog.tsx index 4cf772fd58..091864b945 100644 --- a/src/components/dialogs/network-modifications/by-filter/by-filter-deletion/by-filter-deletion-dialog.tsx +++ b/src/components/dialogs/network-modifications/by-filter/by-filter-deletion/by-filter-deletion-dialog.tsx @@ -8,7 +8,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { FILTERS, ID, NAME, TYPE } from '../../../../utils/field-constants'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useForm } from 'react-hook-form'; import { FunctionComponent, useCallback, useEffect } from 'react'; import { ModificationDialog } from '../../../commons/modificationDialog'; @@ -99,10 +99,7 @@ const ByFilterDeletionDialog: FunctionComponent = ( formData[FILTERS], editData?.uuid ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'UnableToDeleteEquipment', - }); + snackWithFallback(snackError, error, { headerId: 'UnableToDeleteEquipment' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/by-filter/by-formula/by-formula-dialog.jsx b/src/components/dialogs/network-modifications/by-filter/by-formula/by-formula-dialog.jsx index b63e648ef8..53ebaee0c6 100644 --- a/src/components/dialogs/network-modifications/by-filter/by-formula/by-formula-dialog.jsx +++ b/src/components/dialogs/network-modifications/by-filter/by-formula/by-formula-dialog.jsx @@ -12,6 +12,7 @@ import { convertOutputValue, CustomFormProvider, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { useCallback, useEffect } from 'react'; @@ -173,10 +174,7 @@ const ByFormulaDialog = ({ editData, currentNode, studyUuid, isUpdate, editDataF !!editData, editData?.uuid ?? null ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'ModifyByFormula', - }); + snackWithFallback(snackError, error, { headerId: 'ModifyByFormula' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/coupling-device/modification/create-coupling-device-dialog.tsx b/src/components/dialogs/network-modifications/coupling-device/modification/create-coupling-device-dialog.tsx index acb9cef1a6..ba50bc7da0 100644 --- a/src/components/dialogs/network-modifications/coupling-device/modification/create-coupling-device-dialog.tsx +++ b/src/components/dialogs/network-modifications/coupling-device/modification/create-coupling-device-dialog.tsx @@ -15,7 +15,14 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from '../../../commons/handle-modification-form'; import { FORM_LOADING_DELAY } from '../../../../network/constants'; import { createCouplingDevice } from '../../../../../services/study/network-modifications'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, Option, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + Option, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import yup from '../../../../utils/yup-config'; import { fetchBusesOrBusbarSectionsForVoltageLevel } from '../../../../../services/study/network'; import CreateCouplingDeviceForm from './create-coupling-device-form'; @@ -115,10 +122,7 @@ export default function CreateCouplingDeviceDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'CreateCouplingDeviceError', - }); + snackWithFallback(snackError, error, { headerId: 'CreateCouplingDeviceError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError, selectedId] diff --git a/src/components/dialogs/network-modifications/delete-attaching-line/delete-attaching-line-dialog.jsx b/src/components/dialogs/network-modifications/delete-attaching-line/delete-attaching-line-dialog.jsx index ae366d6ef5..8a4b6aa0b0 100644 --- a/src/components/dialogs/network-modifications/delete-attaching-line/delete-attaching-line-dialog.jsx +++ b/src/components/dialogs/network-modifications/delete-attaching-line/delete-attaching-line-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { FORM_LOADING_DELAY } from 'components/network/constants'; import { @@ -113,10 +113,7 @@ const DeleteAttachingLineDialog = ({ replacingLine1Id: formData[REPLACING_LINE_1_ID], replacingLine1Name: sanitizeString(formData[REPLACING_LINE_1_NAME]), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'DeleteAttachingLineError', - }); + snackWithFallback(snackError, error, { headerId: 'DeleteAttachingLineError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/delete-voltage-level-on-line/delete-voltage-level-on-line-dialog.jsx b/src/components/dialogs/network-modifications/delete-voltage-level-on-line/delete-voltage-level-on-line-dialog.jsx index 1736e9a453..606a4de2fb 100644 --- a/src/components/dialogs/network-modifications/delete-voltage-level-on-line/delete-voltage-level-on-line-dialog.jsx +++ b/src/components/dialogs/network-modifications/delete-voltage-level-on-line/delete-voltage-level-on-line-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { FORM_LOADING_DELAY } from 'components/network/constants'; @@ -108,10 +108,7 @@ const DeleteVoltageLevelOnLineDialog = ({ formData[REPLACING_LINE_1_ID], sanitizeString(formData[REPLACING_LINE_1_NAME]) ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'DeleteVoltageLevelOnLineError', - }); + snackWithFallback(snackError, error, { headerId: 'DeleteVoltageLevelOnLineError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-dialog.jsx b/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-dialog.jsx index c068a04eaf..2bad774e83 100644 --- a/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-dialog.jsx +++ b/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-dialog.jsx @@ -8,7 +8,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { DELETION_SPECIFIC_DATA, EQUIPMENT_ID, TYPE } from '../../../utils/field-constants'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useForm } from 'react-hook-form'; import { useCallback, useEffect } from 'react'; import { ModificationDialog } from '../../commons/modificationDialog'; @@ -125,10 +125,7 @@ const EquipmentDeletionDialog = ({ editData?.uuid, formData[DELETION_SPECIFIC_DATA] ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'UnableToDeleteEquipment', - }); + snackWithFallback(snackError, error, { headerId: 'UnableToDeleteEquipment' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-form.jsx b/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-form.jsx index 93dbf9d6f7..56cb62b07e 100644 --- a/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-form.jsx +++ b/src/components/dialogs/network-modifications/equipment-deletion/equipment-deletion-form.jsx @@ -8,7 +8,7 @@ import { Grid } from '@mui/material'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; -import { useSnackMessage, AutocompleteInput } from '@gridsuite/commons-ui'; +import { useSnackMessage, AutocompleteInput, snackWithFallback } from '@gridsuite/commons-ui'; import { filledTextField } from 'components/dialogs/dialog-utils'; import { DELETION_SPECIFIC_DATA, @@ -76,10 +76,7 @@ const DeleteEquipmentForm = ({ studyUuid, currentNode, currentRootNetworkUuid, e } }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'equipmentsLoadingError', - }); + snackWithFallback(snackError, error, { headerId: 'equipmentsLoadingError' }); }); return () => { ignore = true; diff --git a/src/components/dialogs/network-modifications/equipment-deletion/hvdc-lcc-deletion/hvdc-lcc-deletion-utils.js b/src/components/dialogs/network-modifications/equipment-deletion/hvdc-lcc-deletion/hvdc-lcc-deletion-utils.js index fdc1975186..29e932ea66 100644 --- a/src/components/dialogs/network-modifications/equipment-deletion/hvdc-lcc-deletion/hvdc-lcc-deletion-utils.js +++ b/src/components/dialogs/network-modifications/equipment-deletion/hvdc-lcc-deletion/hvdc-lcc-deletion-utils.js @@ -14,7 +14,7 @@ import { } from 'components/utils/field-constants'; import { useCallback } from 'react'; import { useFieldArray, useFormContext } from 'react-hook-form'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { fetchHvdcLineWithShuntCompensators } from '../../../../../services/study/network-map'; const useHvdcLccDeletion = () => { @@ -85,10 +85,7 @@ const useHvdcLccDeletion = () => { }) .catch((error) => { setValue(DELETION_SPECIFIC_DATA, null); - snackError({ - messageTxt: error.message, - headerId: 'HVDCLineConverterStationError', - }); + snackWithFallback(snackError, error, { headerId: 'HVDCLineConverterStationError' }); }); }, [setValue, updateMcsLists, snackError] diff --git a/src/components/dialogs/network-modifications/generation-dispatch/generation-dispatch-dialog.jsx b/src/components/dialogs/network-modifications/generation-dispatch/generation-dispatch-dialog.jsx index 758b19a05b..7d53d2fc3c 100644 --- a/src/components/dialogs/network-modifications/generation-dispatch/generation-dispatch-dialog.jsx +++ b/src/components/dialogs/network-modifications/generation-dispatch/generation-dispatch-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { FORM_LOADING_DELAY } from 'components/network/constants'; import { @@ -139,10 +139,7 @@ const GenerationDispatchDialog = ({ generatorsFrequencyReserve: generation[GENERATORS_FREQUENCY_RESERVES], substationsGeneratorsOrdering: generation[SUBSTATIONS_GENERATORS_ORDERING], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'GenerationDispatchError', - }); + snackWithFallback(snackError, error, { headerId: 'GenerationDispatchError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/generator-scaling/generator-scaling-dialog.jsx b/src/components/dialogs/network-modifications/generator-scaling/generator-scaling-dialog.jsx index 79bfe1c904..5248f9872d 100644 --- a/src/components/dialogs/network-modifications/generator-scaling/generator-scaling-dialog.jsx +++ b/src/components/dialogs/network-modifications/generator-scaling/generator-scaling-dialog.jsx @@ -11,7 +11,7 @@ import yup from 'components/utils/yup-config'; import { ModificationDialog } from '../../commons/modificationDialog'; import GeneratorScalingForm from './generator-scaling-form'; import { useCallback, useEffect } from 'react'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { VARIATION_TYPE, VARIATIONS } from 'components/utils/field-constants'; import { getVariationsSchema } from './variation/variation-utils'; import { FORM_LOADING_DELAY, VARIATION_TYPES } from 'components/network/constants'; @@ -72,10 +72,7 @@ const GeneratorScalingDialog = ({ generatorScalingInfos[VARIATION_TYPE], generatorScalingInfos[VARIATIONS] ).catch((errorMessage) => { - snackError({ - messageTxt: errorMessage, - headerId: 'GeneratorScalingError', - }); + snackWithFallback(snackError, errorMessage, { headerId: 'GeneratorScalingError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/generator-scaling/variation/variation-form.jsx b/src/components/dialogs/network-modifications/generator-scaling/variation/variation-form.jsx index feb472130f..2632128e86 100644 --- a/src/components/dialogs/network-modifications/generator-scaling/variation/variation-form.jsx +++ b/src/components/dialogs/network-modifications/generator-scaling/variation/variation-form.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { DirectoryItemsInput } from '@gridsuite/commons-ui'; +import { DirectoryItemsInput, snackWithFallback } from '@gridsuite/commons-ui'; import { FILTERS, ID, @@ -66,10 +66,7 @@ const VariationForm = ({ name, index }) => { setValue(filterFieldName, newFilters); }) .catch((errorMessage) => { - snackError({ - messageTxt: errorMessage, - headerId: 'GeneratorScalingError', - }); + snackWithFallback(snackError, errorMessage, { headerId: 'GeneratorScalingError' }); }); }, [filterFieldName, filters, setValue, snackError] diff --git a/src/components/dialogs/network-modifications/generator/creation/generator-creation-dialog.tsx b/src/components/dialogs/network-modifications/generator/creation/generator-creation-dialog.tsx index 04ed7d2164..415961f7b4 100644 --- a/src/components/dialogs/network-modifications/generator/creation/generator-creation-dialog.tsx +++ b/src/components/dialogs/network-modifications/generator/creation/generator-creation-dialog.tsx @@ -10,7 +10,13 @@ import { ModificationDialog } from '../../../commons/modificationDialog'; import EquipmentSearchDialog from '../../../equipment-search-dialog'; import { useCallback, useEffect } from 'react'; import { useFormSearchCopy } from '../../../commons/use-form-search-copy'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { @@ -325,10 +331,7 @@ export default function GeneratorCreationDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'GeneratorCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'GeneratorCreationError' }); }); }, [currentNodeUuid, editData, studyUuid, snackError] diff --git a/src/components/dialogs/network-modifications/generator/modification/generator-modification-dialog.tsx b/src/components/dialogs/network-modifications/generator/modification/generator-modification-dialog.tsx index 643c750096..e5c57a7ff7 100644 --- a/src/components/dialogs/network-modifications/generator/modification/generator-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/generator/modification/generator-modification-dialog.tsx @@ -7,7 +7,13 @@ import { ModificationDialog } from '../../../commons/modificationDialog'; import { useCallback, useEffect, useState } from 'react'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { @@ -389,10 +395,7 @@ export default function GeneratorModificationDialog({ modificationUuid: editData?.uuid ?? null, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'GeneratorModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'GeneratorModificationError' }); }); }, [editData, generatorToModify, selectedId, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/hvdc-line/lcc/creation/lcc-creation-dialog.tsx b/src/components/dialogs/network-modifications/hvdc-line/lcc/creation/lcc-creation-dialog.tsx index 8d8693ca4d..6a7de7bfbb 100644 --- a/src/components/dialogs/network-modifications/hvdc-line/lcc/creation/lcc-creation-dialog.tsx +++ b/src/components/dialogs/network-modifications/hvdc-line/lcc/creation/lcc-creation-dialog.tsx @@ -31,7 +31,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { LccDialogTab, LccCreationInfos, LccFormInfos, ShuntCompensatorFormSchema } from '../common/lcc-type'; import { Property, toModificationProperties } from '../../../common/properties/property-utils'; import { useFormSearchCopy } from '../../../../commons/use-form-search-copy'; -import { CustomFormProvider, ExtendedEquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, ExtendedEquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { ModificationDialog } from '../../../../commons/modificationDialog'; import EquipmentSearchDialog from '../../../../equipment-search-dialog'; import { useCallback, useEffect, useState } from 'react'; @@ -179,10 +179,7 @@ export function LccCreationDialog({ isUpdate: !!editData, modificationUuid: editData ? editData.uuid : undefined, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LccCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'LccCreationError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/hvdc-line/lcc/modification/lcc-modification-dialog.tsx b/src/components/dialogs/network-modifications/hvdc-line/lcc/modification/lcc-modification-dialog.tsx index f056068dc8..6db92efb53 100644 --- a/src/components/dialogs/network-modifications/hvdc-line/lcc/modification/lcc-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/hvdc-line/lcc/modification/lcc-modification-dialog.tsx @@ -20,7 +20,13 @@ import { R, } from '../../../../../utils/field-constants'; import yup from '../../../../../utils/yup-config'; -import { CustomFormProvider, ExtendedEquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + ExtendedEquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { LccDialogTab, LccFormInfos, LccModificationSchemaForm } from '../common/lcc-type'; import { useCallback, useEffect, useState } from 'react'; @@ -167,10 +173,7 @@ export const LccModificationDialog = ({ modificationUuid: editData ? editData.uuid : null, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LccModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'LccModificationError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError, lccToModify] diff --git a/src/components/dialogs/network-modifications/hvdc-line/vsc/creation/vsc-creation-dialog.jsx b/src/components/dialogs/network-modifications/hvdc-line/vsc/creation/vsc-creation-dialog.jsx index fe5391b52c..833981663e 100644 --- a/src/components/dialogs/network-modifications/hvdc-line/vsc/creation/vsc-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/hvdc-line/vsc/creation/vsc-creation-dialog.jsx @@ -6,7 +6,13 @@ */ import { useCallback, useEffect, useState } from 'react'; -import { CustomFormProvider, ExtendedEquipmentType, TextInput, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + ExtendedEquipmentType, + snackWithFallback, + TextInput, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { @@ -219,10 +225,7 @@ const VscCreationDialog = ({ isUpdate: !!editData, modificationUuid: editData?.uuid ?? null, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VscCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'VscCreationError' }); }); }, [studyUuid, currentNodeUuid, editData, snackError] diff --git a/src/components/dialogs/network-modifications/hvdc-line/vsc/modification/vsc-modification-dialog.tsx b/src/components/dialogs/network-modifications/hvdc-line/vsc/modification/vsc-modification-dialog.tsx index 65b10765cd..191edd6f50 100644 --- a/src/components/dialogs/network-modifications/hvdc-line/vsc/modification/vsc-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/hvdc-line/vsc/modification/vsc-modification-dialog.tsx @@ -59,7 +59,7 @@ import { setCurrentReactiveCapabilityCurveTable, setSelectedReactiveLimits, } from 'components/dialogs/reactive-limits/reactive-capability-curve/reactive-capability-utils'; -import { CustomFormProvider, ExtendedEquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, ExtendedEquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { emptyProperties, getConcatenatedProperties, @@ -286,10 +286,7 @@ const VscModificationDialog: React.FC = ({ isUpdate: !!editData, modificationUuid: editData?.uuid ?? null, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VscModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'VscModificationError' }); }); }; diff --git a/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx b/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx index d8452e7368..a4e6821ebe 100644 --- a/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx @@ -6,7 +6,7 @@ */ import { AMOUNT_TEMPORARY_LIMITS, CSV_FILENAME, MODIFICATIONS_TABLE, TYPE } from '../../../utils/field-constants'; import { useIntl } from 'react-intl'; -import { CustomFormProvider, ModificationType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, ModificationType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { SubmitHandler, useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { useCallback, useEffect, useMemo } from 'react'; @@ -103,10 +103,7 @@ export function LimitSetsModificationDialog({ tabularType: ModificationType.LIMIT_SETS_TABULAR_MODIFICATION, csvFilename: formData[CSV_FILENAME], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'TabularModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'TabularModificationError' }); }); }, [currentNodeUuid, editData, getValues, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/line-attach-to-voltage-level/line-attach-to-voltage-level-dialog.jsx b/src/components/dialogs/network-modifications/line-attach-to-voltage-level/line-attach-to-voltage-level-dialog.jsx index 1b1735ccf7..37f025b6b8 100644 --- a/src/components/dialogs/network-modifications/line-attach-to-voltage-level/line-attach-to-voltage-level-dialog.jsx +++ b/src/components/dialogs/network-modifications/line-attach-to-voltage-level/line-attach-to-voltage-level-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, MODIFICATION_TYPES, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { ATTACHMENT_LINE_ID, @@ -183,10 +183,7 @@ const LineAttachToVoltageLevelDialog = ({ newLine2Id: lineAttach[LINE2_ID], newLine2Name: sanitizeString(lineAttach[LINE2_NAME]), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LineAttachmentError', - }); + snackWithFallback(snackError, error, { headerId: 'LineAttachmentError' }); }); }, [attachmentLine, currentNodeUuid, editData, newVoltageLevel, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/line-split-with-voltage-level/line-split-with-voltage-level-dialog.jsx b/src/components/dialogs/network-modifications/line-split-with-voltage-level/line-split-with-voltage-level-dialog.jsx index b874475025..e5f37a0e5c 100644 --- a/src/components/dialogs/network-modifications/line-split-with-voltage-level/line-split-with-voltage-level-dialog.jsx +++ b/src/components/dialogs/network-modifications/line-split-with-voltage-level/line-split-with-voltage-level-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, MODIFICATION_TYPES, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { BUS_OR_BUSBAR_SECTION, @@ -165,10 +165,7 @@ const LineSplitWithVoltageLevelDialog = ({ newLine2Id: lineSplit[LINE2_ID], newLine2Name: sanitizeString(lineSplit[LINE2_NAME]), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LineDivisionError', - }); + snackWithFallback(snackError, error, { headerId: 'LineDivisionError' }); }); }, [currentNodeUuid, editData, newVoltageLevel, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/line-to-attach-or-split-form/line-to-attach-or-split-form.jsx b/src/components/dialogs/network-modifications/line-to-attach-or-split-form/line-to-attach-or-split-form.jsx index 411d625e65..62f2866e72 100644 --- a/src/components/dialogs/network-modifications/line-to-attach-or-split-form/line-to-attach-or-split-form.jsx +++ b/src/components/dialogs/network-modifications/line-to-attach-or-split-form/line-to-attach-or-split-form.jsx @@ -6,7 +6,7 @@ */ import { Grid, Typography } from '@mui/material'; -import { AutocompleteInput } from '@gridsuite/commons-ui'; +import { AutocompleteInput, snackWithFallback } from '@gridsuite/commons-ui'; import { areIdsEqual, getObjectId } from 'components/utils/utils'; import { useEffect, useState } from 'react'; import { PercentageArea } from '../../percentage-area/percentage-area'; @@ -40,10 +40,7 @@ export const LineToAttachOrSplitForm = ({ label, studyUuid, currentNode, current setLinesOptions(values.sort()); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'equipmentsLoadingError', - }); + snackWithFallback(snackError, error, { headerId: 'equipmentsLoadingError' }); }); } }, [studyUuid, currentNode?.id, currentRootNetworkUuid, watchLineToAttachOrSplit, snackError]); diff --git a/src/components/dialogs/network-modifications/line/creation/line-creation-dialog.jsx b/src/components/dialogs/network-modifications/line/creation/line-creation-dialog.jsx index bf59777491..a0b44ef20e 100644 --- a/src/components/dialogs/network-modifications/line/creation/line-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/line/creation/line-creation-dialog.jsx @@ -10,6 +10,7 @@ import { convertOutputValue, CustomFormProvider, FieldType, + snackWithFallback, TextInput, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -327,10 +328,7 @@ const LineCreationDialog = ({ connected2: characteristics[CONNECTIVITY_2]?.[CONNECTED] ?? null, properties: toModificationProperties(line), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LineCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'LineCreationError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError, onCreateLine] diff --git a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx index f2f3a3e363..3f98f584a2 100644 --- a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx @@ -12,6 +12,7 @@ import { CustomFormProvider, EquipmentType, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -283,10 +284,7 @@ const LineModificationDialog = ({ q2MeasurementValue: stateEstimationData[MEASUREMENT_Q2][VALUE], q2MeasurementValidity: stateEstimationData[MEASUREMENT_Q2][VALIDITY], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LineModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'LineModificationError' }); }); }, [studyUuid, currentNodeUuid, editData, selectedId, intl, snackError] diff --git a/src/components/dialogs/network-modifications/lines-attach-to-split-lines/lines-attach-to-split-lines-dialog.jsx b/src/components/dialogs/network-modifications/lines-attach-to-split-lines/lines-attach-to-split-lines-dialog.jsx index 5ef502bd57..6cd18b15d4 100644 --- a/src/components/dialogs/network-modifications/lines-attach-to-split-lines/lines-attach-to-split-lines-dialog.jsx +++ b/src/components/dialogs/network-modifications/lines-attach-to-split-lines/lines-attach-to-split-lines-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { sanitizeString } from 'components/dialogs/dialog-utils'; import PropTypes from 'prop-types'; @@ -129,10 +129,7 @@ const LinesAttachToSplitLinesDialog = ({ replacingLine2Id: linesAttachToSplitLine[REPLACING_LINE_2_ID], replacingLine2Name: sanitizeString(linesAttachToSplitLine[REPLACING_LINE_2_NAME]), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LineAttachmentError', - }); + snackWithFallback(snackError, error, { headerId: 'LineAttachmentError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/load-scaling/load-scaling-dialog.jsx b/src/components/dialogs/network-modifications/load-scaling/load-scaling-dialog.jsx index a14b6a6d0e..2c6382c1ef 100644 --- a/src/components/dialogs/network-modifications/load-scaling/load-scaling-dialog.jsx +++ b/src/components/dialogs/network-modifications/load-scaling/load-scaling-dialog.jsx @@ -11,7 +11,7 @@ import yup from 'components/utils/yup-config'; import { ModificationDialog } from '../../commons/modificationDialog'; import LoadScalingForm from './load-scaling-form'; import { useCallback, useEffect } from 'react'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { VARIATION_TYPE, VARIATIONS } from 'components/utils/field-constants'; import { getVariationsSchema } from './variation/variation-utils'; import { FORM_LOADING_DELAY, VARIATION_TYPES } from 'components/network/constants'; @@ -64,11 +64,8 @@ const LoadScalingDialog = ({ editData, currentNode, studyUuid, isUpdate, editDat editData?.uuid ?? undefined, loadScalingInfos[VARIATION_TYPE], loadScalingInfos[VARIATIONS] - ).catch((errorMessage) => { - snackError({ - messageTxt: errorMessage, - headerId: 'LoadScalingError', - }); + ).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'LoadScalingError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/load/creation/load-creation-dialog.tsx b/src/components/dialogs/network-modifications/load/creation/load-creation-dialog.tsx index 3f174576fb..b3df616cac 100644 --- a/src/components/dialogs/network-modifications/load/creation/load-creation-dialog.tsx +++ b/src/components/dialogs/network-modifications/load/creation/load-creation-dialog.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, EquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, EquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { ACTIVE_POWER_SETPOINT, @@ -178,10 +178,7 @@ export function LoadCreationDialog({ terminalConnected: load.connectivity?.terminalConnected, properties: toModificationProperties(load), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LoadCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'LoadCreationError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx b/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx index c873fe4c91..c7db3be7cf 100644 --- a/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, EquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, EquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { FORM_LOADING_DELAY } from 'components/network/constants'; @@ -221,10 +221,7 @@ export default function LoadModificationDialog({ qMeasurementValidity: stateEstimationData?.[MEASUREMENT_Q]?.[VALIDITY], properties: toModificationProperties(load) ?? null, }).catch((error: Error) => { - snackError({ - messageTxt: error.message, - headerId: 'LoadModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'LoadModificationError' }); }); }, [selectedId, editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/shunt-compensator/creation/shunt-compensator-creation-dialog.jsx b/src/components/dialogs/network-modifications/shunt-compensator/creation/shunt-compensator-creation-dialog.jsx index 2bb7244ee8..4bf8a87a65 100644 --- a/src/components/dialogs/network-modifications/shunt-compensator/creation/shunt-compensator-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/shunt-compensator/creation/shunt-compensator-creation-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { @@ -199,10 +199,7 @@ const ShuntCompensatorCreationDialog = ({ terminalConnected: shuntCompensator[CONNECTIVITY]?.[CONNECTED], properties: toModificationProperties(shuntCompensator), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'ShuntCompensatorCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'ShuntCompensatorCreationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/shunt-compensator/modification/shunt-compensator-modification-dialog.jsx b/src/components/dialogs/network-modifications/shunt-compensator/modification/shunt-compensator-modification-dialog.jsx index c1f583d188..bc823fa292 100644 --- a/src/components/dialogs/network-modifications/shunt-compensator/modification/shunt-compensator-modification-dialog.jsx +++ b/src/components/dialogs/network-modifications/shunt-compensator/modification/shunt-compensator-modification-dialog.jsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { ADDITIONAL_PROPERTIES, BUS_OR_BUSBAR_SECTION, @@ -250,10 +250,7 @@ const ShuntCompensatorModificationDialog = ({ modificationUuid: editData?.uuid, properties: toModificationProperties(shuntCompensator), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'ShuntCompensatorModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'ShuntCompensatorModificationError' }); }); }, [currentNodeUuid, studyUuid, editData, snackError, selectedId] diff --git a/src/components/dialogs/network-modifications/static-var-compensator/creation/static-var-compensator-creation-dialog.tsx b/src/components/dialogs/network-modifications/static-var-compensator/creation/static-var-compensator-creation-dialog.tsx index bb1bd9ca10..b368cee421 100644 --- a/src/components/dialogs/network-modifications/static-var-compensator/creation/static-var-compensator-creation-dialog.tsx +++ b/src/components/dialogs/network-modifications/static-var-compensator/creation/static-var-compensator-creation-dialog.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, EquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, EquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { @@ -383,10 +383,7 @@ const StaticVarCompensatorCreationDialog: FC = ({ modificationUuid: editData?.uuid, properties: toModificationProperties(staticCompensator), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'StaticVarCompensatorCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'StaticVarCompensatorCreationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/substation/creation/substation-creation-dialog.jsx b/src/components/dialogs/network-modifications/substation/creation/substation-creation-dialog.jsx index d9f776c729..2cc5d6a5f5 100644 --- a/src/components/dialogs/network-modifications/substation/creation/substation-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/substation/creation/substation-creation-dialog.jsx @@ -10,7 +10,7 @@ import { ModificationDialog } from '../../../commons/modificationDialog'; import EquipmentSearchDialog from '../../../equipment-search-dialog'; import { EQUIPMENT_TYPES } from 'components/utils/equipment-types'; import { useCallback, useEffect } from 'react'; -import { CustomFormProvider, fetchDefaultCountry, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, fetchDefaultCountry, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { useFormSearchCopy } from '../../../commons/use-form-search-copy'; @@ -118,10 +118,7 @@ const SubstationCreationDialog = ({ modificationUuid: editData ? editData.uuid : undefined, properties: toModificationProperties(substation), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'SubstationCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'SubstationCreationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/substation/modification/substation-modification-dialog.jsx b/src/components/dialogs/network-modifications/substation/modification/substation-modification-dialog.jsx index bdbdc9dd51..d3fbd4d559 100644 --- a/src/components/dialogs/network-modifications/substation/modification/substation-modification-dialog.jsx +++ b/src/components/dialogs/network-modifications/substation/modification/substation-modification-dialog.jsx @@ -7,7 +7,7 @@ import { ModificationDialog } from '../../../commons/modificationDialog'; import { useCallback, useEffect, useState } from 'react'; -import { CustomFormProvider, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import yup from 'components/utils/yup-config'; import { ADDITIONAL_PROPERTIES, COUNTRY, EQUIPMENT_NAME } from 'components/utils/field-constants'; @@ -150,10 +150,7 @@ const SubstationModificationDialog = ({ country: substation[COUNTRY], properties: toModificationProperties(substation), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'SubstationModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'SubstationModificationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid, selectedId] diff --git a/src/components/dialogs/network-modifications/tabular/tabular-dialog.tsx b/src/components/dialogs/network-modifications/tabular/tabular-dialog.tsx index 954ce0976c..4088377b03 100644 --- a/src/components/dialogs/network-modifications/tabular/tabular-dialog.tsx +++ b/src/components/dialogs/network-modifications/tabular/tabular-dialog.tsx @@ -6,7 +6,7 @@ */ import { yupResolver } from '@hookform/resolvers/yup'; -import { CustomFormProvider, ModificationType, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomFormProvider, ModificationType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useForm } from 'react-hook-form'; import { useCallback, useEffect, useMemo } from 'react'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form.js'; @@ -164,10 +164,7 @@ export function TabularDialog({ csvFilename: formData[CSV_FILENAME], properties: formData[TABULAR_PROPERTIES], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'TabularModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'TabularModificationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] @@ -211,10 +208,7 @@ export function TabularDialog({ csvFilename: formData[CSV_FILENAME], properties: formData[TABULAR_PROPERTIES], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'TabularCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'TabularCreationError' }); }); }, [currentNodeUuid, editData, snackError, studyUuid] diff --git a/src/components/dialogs/network-modifications/tabular/use-filter-csv-generator.ts b/src/components/dialogs/network-modifications/tabular/use-filter-csv-generator.ts index 7c2c6a571e..75389ae604 100644 --- a/src/components/dialogs/network-modifications/tabular/use-filter-csv-generator.ts +++ b/src/components/dialogs/network-modifications/tabular/use-filter-csv-generator.ts @@ -12,6 +12,7 @@ import { TreeViewFinderNodeProps, LANG_FRENCH, useSnackMessage, + snackWithFallback, } from '@gridsuite/commons-ui'; import { EquipmentsFilter, evaluateFilters } from 'services/study/filter'; import { EQUIPMENT_ID } from 'components/utils/field-constants'; @@ -182,11 +183,7 @@ export const useFilterCsvGenerator = (props: UseFilterCsvGeneratorProps) => { const filename = generateFilename(); downloadCsvFile({ content: csvContent, filename }); } catch (error) { - console.error('❌ CSV generation failed:', error); - snackError({ - messageTxt: error instanceof Error ? error.message : 'Unknown error occurred', - headerId: 'GenerateFromFilterError', - }); + snackWithFallback(snackError, error, { headerId: 'GenerateFromFilterError' }); } }, [extractEquipmentIds, generateCsvContent, generateFilename, downloadCsvFile, snackError] diff --git a/src/components/dialogs/network-modifications/two-windings-transformer/creation/two-windings-transformer-creation-dialog.jsx b/src/components/dialogs/network-modifications/two-windings-transformer/creation/two-windings-transformer-creation-dialog.jsx index 50ae7d687e..fc7909252a 100644 --- a/src/components/dialogs/network-modifications/two-windings-transformer/creation/two-windings-transformer-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/two-windings-transformer/creation/two-windings-transformer-creation-dialog.jsx @@ -10,6 +10,7 @@ import { convertOutputValue, CustomFormProvider, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -574,10 +575,7 @@ const TwoWindingsTransformerCreationDialog = ({ connected2: characteristics[CONNECTIVITY_2]?.[CONNECTED] ?? null, properties: toModificationProperties(twt), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'TwoWindingsTransformerCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'TwoWindingsTransformerCreationError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog.jsx b/src/components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog.jsx index ddf3e26054..7c2fe6760f 100644 --- a/src/components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog.jsx +++ b/src/components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog.jsx @@ -11,6 +11,7 @@ import { CustomFormProvider, EquipmentType, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -528,10 +529,7 @@ const TwoWindingsTransformerModificationDialog = ({ ratioTapChangerToBeEstimated: stateEstimationData[TO_BE_ESTIMATED][RATIO_TAP_CHANGER_STATUS], phaseTapChangerToBeEstimated: stateEstimationData[TO_BE_ESTIMATED][PHASE_TAP_CHANGER_STATUS], }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'TwoWindingsTransformerModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'TwoWindingsTransformerModificationError' }); }); }, [ diff --git a/src/components/dialogs/network-modifications/voltage-level/creation/voltage-level-creation-dialog.jsx b/src/components/dialogs/network-modifications/voltage-level/creation/voltage-level-creation-dialog.jsx index d10889928a..4674236c25 100644 --- a/src/components/dialogs/network-modifications/voltage-level/creation/voltage-level-creation-dialog.jsx +++ b/src/components/dialogs/network-modifications/voltage-level/creation/voltage-level-creation-dialog.jsx @@ -11,6 +11,7 @@ import { CustomFormProvider, FieldType, MODIFICATION_TYPES, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -359,10 +360,7 @@ const VoltageLevelCreationDialog = ({ topologyKind: voltageLevel[TOPOLOGY_KIND], properties: toModificationProperties(voltageLevel), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VoltageLevelCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'VoltageLevelCreationError' }); }); }, [getValues, onCreateVoltageLevel, studyUuid, currentNodeUuid, editData, snackError] diff --git a/src/components/dialogs/network-modifications/voltage-level/modification/voltage-level-modification-dialog.jsx b/src/components/dialogs/network-modifications/voltage-level/modification/voltage-level-modification-dialog.jsx index 8d252f5d1e..beea3a3110 100644 --- a/src/components/dialogs/network-modifications/voltage-level/modification/voltage-level-modification-dialog.jsx +++ b/src/components/dialogs/network-modifications/voltage-level/modification/voltage-level-modification-dialog.jsx @@ -26,6 +26,7 @@ import { CustomFormProvider, EquipmentType, FieldType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { useOpenShortWaitFetching } from '../../../commons/handle-modification-form'; @@ -223,10 +224,7 @@ const VoltageLevelModificationDialog = ({ ), properties: toModificationProperties(voltageLevel), }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VoltageLevelModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'VoltageLevelModificationError' }); }); }, [editData, studyUuid, currentNodeUuid, selectedId, snackError] diff --git a/src/components/dialogs/network-modifications/voltage-level/move-feeder-bays/move-voltage-level-feeder-bays-dialog.tsx b/src/components/dialogs/network-modifications/voltage-level/move-feeder-bays/move-voltage-level-feeder-bays-dialog.tsx index fc85cf732c..132fe60ae2 100644 --- a/src/components/dialogs/network-modifications/voltage-level/move-feeder-bays/move-voltage-level-feeder-bays-dialog.tsx +++ b/src/components/dialogs/network-modifications/voltage-level/move-feeder-bays/move-voltage-level-feeder-bays-dialog.tsx @@ -5,7 +5,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { FetchStatus } from '../../../../../services/utils'; import { useForm } from 'react-hook-form'; @@ -299,10 +305,7 @@ export default function MoveVoltageLevelFeederBaysDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'MoveVoltageLevelFeederBaysError', - }); + snackWithFallback(snackError, error, { headerId: 'MoveVoltageLevelFeederBaysError' }); }); }, [currentNodeUuid, editData, getValues, selectedId, snackError, studyUuid]); diff --git a/src/components/dialogs/network-modifications/voltage-level/section/create-voltage-level-section-dialog.tsx b/src/components/dialogs/network-modifications/voltage-level/section/create-voltage-level-section-dialog.tsx index ca7b5e0793..e15c544497 100644 --- a/src/components/dialogs/network-modifications/voltage-level/section/create-voltage-level-section-dialog.tsx +++ b/src/components/dialogs/network-modifications/voltage-level/section/create-voltage-level-section-dialog.tsx @@ -4,7 +4,13 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { EquipmentModificationDialogProps } from '../../../../graph/menus/network-modifications/network-modification-menu.type'; import { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; @@ -252,10 +258,7 @@ export default function CreateVoltageLevelSectionDialog({ modificationUuid: editData?.uuid ?? null, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VoltageLevelSectionCreationError', - }); + snackWithFallback(snackError, error, { headerId: 'VoltageLevelSectionCreationError' }); }); }, [selectedId, findBusbarKeyForSection, studyUuid, currentNodeUuid, editData, snackError] diff --git a/src/components/dialogs/network-modifications/voltage-level/topology-creation/create-voltage-level-topology-dialog.tsx b/src/components/dialogs/network-modifications/voltage-level/topology-creation/create-voltage-level-topology-dialog.tsx index 5b12e00cce..e9fb7f08f0 100644 --- a/src/components/dialogs/network-modifications/voltage-level/topology-creation/create-voltage-level-topology-dialog.tsx +++ b/src/components/dialogs/network-modifications/voltage-level/topology-creation/create-voltage-level-topology-dialog.tsx @@ -9,7 +9,13 @@ import { SECTION_COUNT, SWITCH_KIND, SWITCH_KINDS, SWITCHES_BETWEEN_SECTIONS } f import { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; -import { CustomFormProvider, EquipmentType, MODIFICATION_TYPES, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CustomFormProvider, + EquipmentType, + MODIFICATION_TYPES, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import yup from '../../../../utils/yup-config'; import { isNodeBuilt } from '../../../../graph/util/model-functions'; import { EquipmentModificationDialogProps } from '../../../../graph/menus/network-modifications/network-modification-menu.type'; @@ -113,10 +119,7 @@ export default function CreateVoltageLevelTopologyDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'CreateVoltageLevelTopologyError', - }); + snackWithFallback(snackError, error, { headerId: 'CreateVoltageLevelTopologyError' }); }); }, [editData, studyUuid, currentNodeUuid, snackError, selectedId] diff --git a/src/components/dialogs/network-modifications/voltage-level/topology-modification/voltage-level-topology-modification-dialog.tsx b/src/components/dialogs/network-modifications/voltage-level/topology-modification/voltage-level-topology-modification-dialog.tsx index b92ea45f1d..58bc8986b6 100644 --- a/src/components/dialogs/network-modifications/voltage-level/topology-modification/voltage-level-topology-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/voltage-level/topology-modification/voltage-level-topology-modification-dialog.tsx @@ -10,6 +10,7 @@ import { EquipmentType, MODIFICATION_TYPES, ModificationType, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { useCallback, useEffect, useMemo, useState } from 'react'; @@ -182,10 +183,7 @@ export default function VoltageLevelTopologyModificationDialog({ modificationUuid: editData?.uuid, isUpdate: !!editData, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'VoltageLevelTopologyModificationError', - }); + snackWithFallback(snackError, error, { headerId: 'VoltageLevelTopologyModificationError' }); }); }, [editData, selectedId, studyUuid, currentNodeUuid, snackError] diff --git a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx index e526d67663..f2cefbc0ac 100644 --- a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx +++ b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx @@ -9,7 +9,7 @@ import { Box, Grid, MenuItem, Select, type SelectChangeEvent, Typography } from import { FormattedMessage, useIntl } from 'react-intl'; import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; -import { CustomAGGrid, type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { CustomAGGrid, type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { fetchAllCountries } from '../../../../../../services/study/network-map'; import { evaluateJsonFilter, type IdentifiableAttributes } from '../../../../../../services/study/filter'; import { fetchVoltageLevelsMapInfos } from '../../../../../../services/study/network'; @@ -107,20 +107,14 @@ const EquipmentFilter = forwardRef { - snackError({ - messageTxt: error.message, - headerId: 'FetchVoltageLevelsError', - }); + snackWithFallback(snackError, error, { headerId: 'FetchVoltageLevelsError' }); }); // load countries fetchAllCountries(studyUuid, currentNode.id, currentRootNetworkUuid) .then((countryCodes) => setCountries(countryCodes)) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'FetchCountryError', - }); + snackWithFallback(snackError, error, { headerId: 'FetchCountryError' }); }); }, [studyUuid, currentNode?.id, snackError, currentRootNetworkUuid]); @@ -161,10 +155,7 @@ const EquipmentFilter = forwardRef { - snackError({ - messageTxt: error.message, - headerId: 'FilterEvaluationError', - }); + snackWithFallback(snackError, error, { headerId: 'FilterEvaluationError' }); }) .finally(() => { setIsFetching(false); diff --git a/src/components/dialogs/parameters/state-estimation/state-estimation-parameters.tsx b/src/components/dialogs/parameters/state-estimation/state-estimation-parameters.tsx index 550361f364..c511d0f9b2 100644 --- a/src/components/dialogs/parameters/state-estimation/state-estimation-parameters.tsx +++ b/src/components/dialogs/parameters/state-estimation/state-estimation-parameters.tsx @@ -9,6 +9,7 @@ import { CustomFormProvider, mergeSx, PopupConfirmationDialog, + snackWithFallback, SubmitButton, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -90,10 +91,7 @@ export const StateEstimationParameters = ({ const resetStateEstimationParameters = useCallback(() => { updateStateEstimationParameters(studyUuid, null).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'paramsChangingError', - }); + snackWithFallback(snackError, error, { headerId: 'paramsChangingError' }); }); }, [studyUuid, snackError]); @@ -118,10 +116,7 @@ export const StateEstimationParameters = ({ setStateEstimationParams(fromStateEstimationParametersFormToParamValues(newParams)); }) .catch((error) => { - snackError({ - messageTxt: error, - headerId: 'updateStateEstimationParametersError', - }); + snackWithFallback(snackError, error, { headerId: 'updateStateEstimationParametersError' }); }); onValidationError(); }, diff --git a/src/components/dialogs/parameters/state-estimation/use-get-state-estimation-parameters.ts b/src/components/dialogs/parameters/state-estimation/use-get-state-estimation-parameters.ts index 8c9697560a..15de89b954 100644 --- a/src/components/dialogs/parameters/state-estimation/use-get-state-estimation-parameters.ts +++ b/src/components/dialogs/parameters/state-estimation/use-get-state-estimation-parameters.ts @@ -8,7 +8,7 @@ import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import { AppState } from '../../../../redux/reducer'; -import { useSnackMessage, ComputingType } from '@gridsuite/commons-ui'; +import { useSnackMessage, ComputingType, snackWithFallback } from '@gridsuite/commons-ui'; import { useOptionalServiceStatus } from '../../../../hooks/use-optional-service-status'; import { OptionalServicesNames, OptionalServicesStatus } from '../../../utils/optional-services'; import type { UUID } from 'node:crypto'; @@ -38,10 +38,7 @@ export const useGetStateEstimationParameters = (): UseGetStateEstimationParamete setStateEstimationParams(params); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }); + snackWithFallback(snackError, error, { headerId: 'paramsRetrievingError' }); }); }, [snackError] diff --git a/src/components/dialogs/parameters/use-get-short-circuit-parameters.ts b/src/components/dialogs/parameters/use-get-short-circuit-parameters.ts index a4f2f17ca7..6a6fc8d4aa 100644 --- a/src/components/dialogs/parameters/use-get-short-circuit-parameters.ts +++ b/src/components/dialogs/parameters/use-get-short-circuit-parameters.ts @@ -13,6 +13,7 @@ import { ShortCircuitParametersInfos, useNotificationsListener, ComputingType, + snackWithFallback, } from '@gridsuite/commons-ui'; import { useSelector } from 'react-redux'; import { OptionalServicesNames, OptionalServicesStatus } from '../../utils/optional-services'; @@ -36,10 +37,7 @@ export const useGetShortCircuitParameters = (): ShortCircuitParametersInfos | nu setShortCircuitParams(params); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }); + snackWithFallback(snackError, error, { headerId: 'paramsRetrievingError' }); }); }, [snackError] diff --git a/src/components/dialogs/parameters/use-get-voltage-init-parameters.ts b/src/components/dialogs/parameters/use-get-voltage-init-parameters.ts index 14b8f501ba..6c2e7ed245 100644 --- a/src/components/dialogs/parameters/use-get-voltage-init-parameters.ts +++ b/src/components/dialogs/parameters/use-get-voltage-init-parameters.ts @@ -11,6 +11,7 @@ import { AppState } from '../../../redux/reducer'; import { ComputingType, NotificationsUrlKeys, + snackWithFallback, useNotificationsListener, useSnackMessage, VoltageInitStudyParameters, @@ -38,10 +39,7 @@ export const useGetVoltageInitParameters = (): VoltageInitStudyParameters | null setVoltageInitParams(params); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }); + snackWithFallback(snackError, error, { headerId: 'paramsRetrievingError' }); }); }, [snackError] diff --git a/src/components/dialogs/parameters/use-parameters-state.ts b/src/components/dialogs/parameters/use-parameters-state.ts index f9399b3d00..14a320e75a 100644 --- a/src/components/dialogs/parameters/use-parameters-state.ts +++ b/src/components/dialogs/parameters/use-parameters-state.ts @@ -8,7 +8,7 @@ import { useCallback, useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; -import { updateConfigParameter, useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, updateConfigParameter, useSnackMessage } from '@gridsuite/commons-ui'; import { AppConfigState } from 'redux/reducer'; import { simpleConverterToString } from '../../../utils/types-utils'; @@ -51,10 +51,7 @@ export function useParameterState( (paramValueUpdateConvertor ?? simpleConverterToString)(value) ).catch((error) => { setParamLocalState(paramGlobalState); - snackError({ - messageTxt: error.message, - headerId: 'paramsChangingError', - }); + snackWithFallback(snackError, error, { headerId: 'paramsChangingError' }); }); }, [paramName, snackError, paramGlobalState, paramValueUpdateConvertor] diff --git a/src/components/dialogs/restore-modification-dialog.tsx b/src/components/dialogs/restore-modification-dialog.tsx index 8fceb7b1f9..a0e03f7429 100644 --- a/src/components/dialogs/restore-modification-dialog.tsx +++ b/src/components/dialogs/restore-modification-dialog.tsx @@ -11,6 +11,7 @@ import { CancelButton, CheckBoxList, type MuiStyles, + snackWithFallback, useModificationLabelComputer, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -80,11 +81,8 @@ const RestoreModificationDialog = ({ open, onClose, modifToRestore }: RestoreMod const handleDelete = () => { const selectedModificationsUuidsToDelete = selectedItems.map((item) => item.uuid); setOpenDeleteConfirmationPopup(false); - deleteModifications(studyUuid, currentNode?.id, selectedModificationsUuidsToDelete).catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errDeleteModificationMsg', - }); + deleteModifications(studyUuid, currentNode?.id, selectedModificationsUuidsToDelete).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errDeleteModificationMsg' }); }); handleClose(); }; diff --git a/src/components/graph/menus/dynamic-simulation/event-modification-scenario-editor.tsx b/src/components/graph/menus/dynamic-simulation/event-modification-scenario-editor.tsx index 38e33251a4..8fe5612b1e 100644 --- a/src/components/graph/menus/dynamic-simulation/event-modification-scenario-editor.tsx +++ b/src/components/graph/menus/dynamic-simulation/event-modification-scenario-editor.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useEffect, useRef, useState } from 'react'; -import { CheckBoxList, useSnackMessage } from '@gridsuite/commons-ui'; +import { CheckBoxList, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useDispatch, useSelector } from 'react-redux'; import { Box, Checkbox, CircularProgress, Toolbar, Typography } from '@mui/material'; import { FormattedMessage, useIntl } from 'react-intl'; @@ -128,9 +128,7 @@ const EventModificationScenarioEditor = () => { } }) .catch((error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); }) .finally(() => { setPendingState(false); @@ -186,11 +184,8 @@ const EventModificationScenarioEditor = () => { return; } const selectedEvents = [...selectedItems]; - deleteDynamicSimulationEvents(studyUuid, currentNode.id, selectedEvents).catch((errMsg) => { - snackError({ - messageTxt: errMsg, - headerId: 'DynamicSimulationEventDeleteError', - }); + deleteDynamicSimulationEvents(studyUuid, currentNode.id, selectedEvents).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationEventDeleteError' }); }); }, [currentNode?.id, selectedItems, snackError, studyUuid]); diff --git a/src/components/graph/menus/network-modifications/network-modification-node-dialog.tsx b/src/components/graph/menus/network-modifications/network-modification-node-dialog.tsx index d9810f516d..40188c2727 100644 --- a/src/components/graph/menus/network-modifications/network-modification-node-dialog.tsx +++ b/src/components/graph/menus/network-modifications/network-modification-node-dialog.tsx @@ -10,6 +10,7 @@ import { DescriptionField, isObjectEmpty, MAX_CHAR_DESCRIPTION, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { useCallback, useEffect } from 'react'; @@ -90,10 +91,7 @@ const NetworkModificationNodeDialog: React.FC { - snackError({ - messageTxt: error.message, - headerId: 'NodeUpdateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeUpdateError' }); }); }, [currentTreeNode?.id, currentTreeNode?.type, snackError, studyUuid] diff --git a/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx b/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx index 7ce902a27f..5a63da4cd8 100644 --- a/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx +++ b/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx @@ -12,6 +12,7 @@ import { IElementUpdateDialog, MODIFICATION_TYPES, NetworkModificationMetadata, + snackWithFallback, usePrevious, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -779,9 +780,7 @@ const NetworkModificationNodeEditor = () => { } }) .catch((error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); }) .finally(() => { setPendingState(false); @@ -817,9 +816,7 @@ const NetworkModificationNodeEditor = () => { } }) .catch((error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); }) .finally(() => { setPendingState(false); @@ -839,9 +836,7 @@ const NetworkModificationNodeEditor = () => { setModificationsToExclude(res); }) .catch((error: Error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); }) .finally(() => { setPendingState(false); @@ -992,11 +987,8 @@ const NetworkModificationNodeEditor = () => { cleanClipboard(); } }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errDeleteModificationMsg', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errDeleteModificationMsg' }); }); }, [currentNode?.id, selectedNetworkModifications, snackError, studyUuid, cleanClipboard, copiedModifications]); @@ -1019,11 +1011,8 @@ const NetworkModificationNodeEditor = () => { }, }); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errCreateModificationsMsg', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errCreateModificationsMsg' }); }) .finally(() => { setSaveInProgress(false); @@ -1049,9 +1038,8 @@ const NetworkModificationNodeEditor = () => { }, }); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errUpdateModificationsMsg', headerValues: { item: elementFullPath, @@ -1107,16 +1095,14 @@ const NetworkModificationNodeEditor = () => { .then(() => { cleanClipboard(false); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errCutModificationMsg', }); }); } else { - copyOrMoveModifications(studyUuid, currentNode.id, copiedModifications, copyInfos).catch((errmsg) => { - snackError({ - messageTxt: errmsg, + copyOrMoveModifications(studyUuid, currentNode.id, copiedModifications, copyInfos).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errDuplicateModificationMsg', }); }); @@ -1154,9 +1140,7 @@ const NetworkModificationNodeEditor = () => { }); }) .catch((error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); setEditDataFetchStatus(FetchStatus.FAILED); }); }, @@ -1281,10 +1265,7 @@ const NetworkModificationNodeEditor = () => { changeNetworkModificationOrder(studyUuid, currentNode?.id, movedItem.uuid, before) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'errReorderModificationMsg', - }); + snackWithFallback(snackError, error, { headerId: 'errReorderModificationMsg' }); setModifications(previousModifications); }) .finally(() => setIsDragging(false)); diff --git a/src/components/graph/menus/network-modifications/root-network-chip-cell-renderer.tsx b/src/components/graph/menus/network-modifications/root-network-chip-cell-renderer.tsx index 56b5f12632..816aa33ccf 100644 --- a/src/components/graph/menus/network-modifications/root-network-chip-cell-renderer.tsx +++ b/src/components/graph/menus/network-modifications/root-network-chip-cell-renderer.tsx @@ -6,7 +6,7 @@ */ import { useState, useCallback, useMemo, SetStateAction } from 'react'; -import { ActivableChip, NetworkModificationMetadata, useSnackMessage } from '@gridsuite/commons-ui'; +import { ActivableChip, NetworkModificationMetadata, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { updateModificationStatusByRootNetwork } from 'services/study/network-modifications'; import { useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; @@ -104,8 +104,8 @@ const RootNetworkChipCellRenderer = ({ modificationUuid, newStatus ) - .catch((err) => { - snackError({ messageTxt: err.message, messageId: 'modificationActivationByRootNetworkError' }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'modificationActivationByRootNetworkError' }); }) .finally(() => { setIsLoading(false); diff --git a/src/components/graph/menus/network-modifications/switch-cell-renderer.tsx b/src/components/graph/menus/network-modifications/switch-cell-renderer.tsx index a382090e79..b6e2248632 100644 --- a/src/components/graph/menus/network-modifications/switch-cell-renderer.tsx +++ b/src/components/graph/menus/network-modifications/switch-cell-renderer.tsx @@ -7,7 +7,7 @@ import React, { useState, useCallback, SetStateAction } from 'react'; import { Switch, Tooltip } from '@mui/material'; -import { NetworkModificationMetadata, useSnackMessage } from '@gridsuite/commons-ui'; +import { NetworkModificationMetadata, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { setModificationActivated } from 'services/study/network-modifications'; import { useSelector } from 'react-redux'; import { FormattedMessage } from 'react-intl'; @@ -38,8 +38,8 @@ const SwitchCellRenderer = (props: SwitchCellRendererProps) => { return; } setModificationActivated(studyUuid, currentNode?.id, modificationUuid, activated) - .catch((err) => { - snackError({ messageTxt: err.message, messageId: 'networkModificationActivationError' }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'networkModificationActivationError' }); }) .finally(() => { setIsLoading(false); diff --git a/src/components/graph/menus/root-network/root-network-node-editor.tsx b/src/components/graph/menus/root-network/root-network-node-editor.tsx index c627384cee..ea87db30a4 100644 --- a/src/components/graph/menus/root-network/root-network-node-editor.tsx +++ b/src/components/graph/menus/root-network/root-network-node-editor.tsx @@ -5,7 +5,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CheckBoxList, mergeSx, type MuiStyles, type Parameter, useSnackMessage } from '@gridsuite/commons-ui'; +import { + CheckBoxList, + mergeSx, + type MuiStyles, + type Parameter, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { Delete as DeleteIcon, RemoveRedEye as RemoveRedEyeIcon, @@ -121,11 +128,8 @@ const RootNetworkNodeEditor: React.FC = ({ if (studyUuid) { setIsRootNetworksProcessing(true); - deleteRootNetworks(studyUuid, selectedRootNetworksUuid).catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'deleteRootNetworkError', - }); + deleteRootNetworks(studyUuid, selectedRootNetworksUuid).catch((error) => { + snackWithFallback(snackError, error, { headerId: 'deleteRootNetworkError' }); setIsRootNetworksProcessing(false); }); } @@ -285,10 +289,7 @@ const RootNetworkNodeEditor: React.FC = ({ updateRootNetwork(studyUuid, editedRootNetwork.rootNetworkUuid, rootNetworkInfos); } catch (error) { - snackError({ - headerId: 'updateRootNetworksError', - messageTxt: error instanceof Error ? error.message : String(error), - }); + snackWithFallback(snackError, error, { headerId: 'updateRootNetworksError' }); setIsRootNetworksProcessing(false); } }; diff --git a/src/components/graph/menus/root-network/root-network-panel-header.tsx b/src/components/graph/menus/root-network/root-network-panel-header.tsx index 25506a368b..0d8566b3a7 100644 --- a/src/components/graph/menus/root-network/root-network-panel-header.tsx +++ b/src/components/graph/menus/root-network/root-network-panel-header.tsx @@ -15,6 +15,7 @@ import { type MuiStyles, OverflowableText, type Parameter, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { FormattedMessage, useIntl } from 'react-intl/lib'; @@ -89,10 +90,7 @@ const RootNetworkPanelHeader: React.FC = ({ setStudyName(studyName); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'LoadStudyAndParentsInfoError', - }); + snackWithFallback(snackError, error, { headerId: 'LoadStudyAndParentsInfoError' }); }); } setRootNetworkConfirmCreationDialogOpen(true); @@ -181,10 +179,7 @@ const RootNetworkPanelHeader: React.FC = ({ }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'createRootNetworksError', - }); + snackWithFallback(snackError, error, { headerId: 'createRootNetworksError' }); setIsRootNetworksProcessing(false); }); }; diff --git a/src/components/graph/menus/root-network/use-root-network-modification-search.ts b/src/components/graph/menus/root-network/use-root-network-modification-search.ts index 30cf420e62..71d2b5a446 100644 --- a/src/components/graph/menus/root-network/use-root-network-modification-search.ts +++ b/src/components/graph/menus/root-network/use-root-network-modification-search.ts @@ -10,7 +10,7 @@ import { getModifications } from '../../../../services/root-network'; import type { UUID } from 'node:crypto'; import { useDispatch, useSelector } from 'react-redux'; import { AppState } from '../../../../redux/reducer'; -import { useSnackMessage, useDebounce } from '@gridsuite/commons-ui'; +import { useSnackMessage, useDebounce, snackWithFallback } from '@gridsuite/commons-ui'; import { setHighlightModification } from 'redux/actions'; function reOrderSearchResults( @@ -58,7 +58,7 @@ export const useRootNetworkModificationSearch = () => { if (studyUuid && currentRootNetworkUuid) { getModifications(studyUuid, currentRootNetworkUuid, searchTerm) .then(setModificationsResults) - .catch((errmsg) => snackError({ messageTxt: errmsg, headerId: 'equipmentsSearchingError' })) + .catch((error) => snackWithFallback(snackError, error, { headerId: 'equipmentsSearchingError' })) .finally(() => setIsLoading(false)); } }, diff --git a/src/components/graph/menus/root-network/use-root-network-notifications.ts b/src/components/graph/menus/root-network/use-root-network-notifications.ts index 5e30b2beb9..96031ea576 100644 --- a/src/components/graph/menus/root-network/use-root-network-notifications.ts +++ b/src/components/graph/menus/root-network/use-root-network-notifications.ts @@ -8,7 +8,12 @@ import { SetStateAction, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; -import { NotificationsUrlKeys, useNotificationsListener, useSnackMessage } from '@gridsuite/commons-ui'; +import { + NotificationsUrlKeys, + snackWithFallback, + useNotificationsListener, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { fetchRootNetworks } from 'services/root-network'; import { setMonoRootStudy, setRootNetworks } from 'redux/actions'; import { RootNetworkMetadata } from '../network-modifications/network-modification-menu.type'; @@ -47,7 +52,7 @@ export const useRootNetworkNotifications = ({ setIsRootNetworksProcessing }: Use } }) .catch((error) => { - snackError({ messageTxt: error.message }); + snackWithFallback(snackError, error); }); } }, [studyUuid, dispatch, setIsRootNetworksProcessing, snackError]); diff --git a/src/components/graph/nodes/build-button.tsx b/src/components/graph/nodes/build-button.tsx index af404981c2..5af6f9a352 100644 --- a/src/components/graph/nodes/build-button.tsx +++ b/src/components/graph/nodes/build-button.tsx @@ -11,7 +11,7 @@ import { PlayCircleFilled, StopCircleOutlined } from '@mui/icons-material'; import { Button, CircularProgress } from '@mui/material'; import { buildNode, unbuildNode } from '../../../services/study'; import type { UUID } from 'node:crypto'; -import { type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { HTTP_MAX_NODE_BUILDS_EXCEEDED_MESSAGE } from 'components/network-modification-tree-pane'; type BuildButtonProps = { @@ -74,10 +74,7 @@ export const BuildButton = ({ } else { unbuildNode(studyUuid, nodeUuid, currentRootNetworkUuid) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeUnbuildingError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeUnbuildingError' }); }) .finally(() => { setIsLoading(false); diff --git a/src/components/grid-layout/cards/diagrams/networkAreaDiagram/network-area-diagram-content.tsx b/src/components/grid-layout/cards/diagrams/networkAreaDiagram/network-area-diagram-content.tsx index c373760dcc..86b83650ce 100644 --- a/src/components/grid-layout/cards/diagrams/networkAreaDiagram/network-area-diagram-content.tsx +++ b/src/components/grid-layout/cards/diagrams/networkAreaDiagram/network-area-diagram-content.tsx @@ -40,6 +40,7 @@ import { IElementCreationDialog, IElementUpdateDialog, mergeSx, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import DiagramControls from './diagram-controls'; @@ -171,12 +172,7 @@ function NetworkAreaDiagramContent(props: NetworkAreaDiagramContentProps) { }, }); }) - .catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'diagramConfigCreationError', - }) - ); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'diagramConfigCreationError' })); }; const handleUpdateNadConfig = (data: IElementUpdateDialog) => { @@ -198,12 +194,7 @@ function NetworkAreaDiagramContent(props: NetworkAreaDiagramContentProps) { }, }); }) - .catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'diagramConfigUpdateError', - }) - ); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'diagramConfigUpdateError' })); }; const { diff --git a/src/components/grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram.tsx b/src/components/grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram.tsx index 15004dee01..89c0663956 100644 --- a/src/components/grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram.tsx +++ b/src/components/grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram.tsx @@ -14,7 +14,7 @@ import LinearProgress from '@mui/material/LinearProgress'; import { SingleLineDiagramViewer, SLDMetadata } from '@powsybl/network-viewer'; import { MAX_HEIGHT_VOLTAGE_LEVEL, MAX_WIDTH_VOLTAGE_LEVEL, NoSvg, MIN_WIDTH } from '../../diagram-utils'; -import { mergeSx, useIntlRef, useSnackMessage } from '@gridsuite/commons-ui'; +import { mergeSx, snackWithFallback, useIntlRef, useSnackMessage } from '@gridsuite/commons-ui'; import { Paper } from '@mui/material'; import DiagramHeader from './diagram-header'; import { fetchSvg } from '../../../../../../services/study'; @@ -73,18 +73,15 @@ const PositionDiagram = forwardRef((props: PositionDiagramProps, ref: Ref { - console.error(errorMessage); + .catch((error) => { setSvg({ svg: null, metadata: null, additionalMetadata: null, - error: errorMessage, + error, svgUrl: props.svgUrl, }); - snackError({ - messageTxt: errorMessage, - }); + snackWithFallback(snackError, error); updateLoadingState(false); }); } else { diff --git a/src/components/grid-layout/cards/diagrams/singleLineDiagram/single-line-diagram-content.tsx b/src/components/grid-layout/cards/diagrams/singleLineDiagram/single-line-diagram-content.tsx index 23d7cec171..21e4f92e22 100644 --- a/src/components/grid-layout/cards/diagrams/singleLineDiagram/single-line-diagram-content.tsx +++ b/src/components/grid-layout/cards/diagrams/singleLineDiagram/single-line-diagram-content.tsx @@ -29,7 +29,7 @@ import { import { isNodeReadOnly } from '../../../../graph/util/model-functions'; import { useIsAnyNodeBuilding } from '../../../../utils/is-any-node-building-hook'; import { useTheme } from '@mui/material/styles'; -import { ComputingType, EquipmentType, mergeSx, useSnackMessage } from '@gridsuite/commons-ui'; +import { ComputingType, EquipmentType, mergeSx, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import Box from '@mui/material/Box'; import LinearProgress from '@mui/material/LinearProgress'; import EquipmentPopover from '../../../../tooltips/equipment-popover'; @@ -152,10 +152,9 @@ function SingleLineDiagramContent(props: SingleLineDiagramContentProps) { setLocallySwitchedBreaker(switchElement?.id); updateSwitchState(studyUuid, currentNode?.id, breakerId, newSwitchState).catch((error) => { - snackError({ + snackWithFallback(snackError, error, { headerId: 'updateSwitchStateError', headerValues: { diagramTitle: diagramParams.name }, - messageTxt: error.message, }); setLocallySwitchedBreaker(undefined); // revert the DOM visual state of the breaker @@ -229,10 +228,7 @@ function SingleLineDiagramContent(props: SingleLineDiagramContentProps) { debug && subscribeDebug(ComputingType.SHORT_CIRCUIT_ONE_BUS); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'startShortCircuitError', - }); + snackWithFallback(snackError, error, { headerId: 'startShortCircuitError' }); dispatch(setComputingStatus(ComputingType.SHORT_CIRCUIT_ONE_BUS, RunningStatus.FAILED)); resetOneBusShortcircuitAnalysisLoader(); }) diff --git a/src/components/menus/bus-menu.tsx b/src/components/menus/bus-menu.tsx index 8717384dff..f3721f9d31 100644 --- a/src/components/menus/bus-menu.tsx +++ b/src/components/menus/bus-menu.tsx @@ -27,6 +27,7 @@ import { CustomMenuItem, type EquipmentType, type MuiStyles, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { fetchNetworkElementInfos } from '../../services/study/network'; @@ -134,10 +135,7 @@ export const BusMenu: FunctionComponent = ({ } const equipmentInfos = { id: busId }; tripEquipment(studyUuid, currentNode?.id, equipmentInfos).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'UnableToTripBusbarSection', - }); + snackWithFallback(snackError, error, { headerId: 'UnableToTripBusbarSection' }); if (setModificationInProgress !== undefined) { setModificationInProgress(false); } diff --git a/src/components/menus/operating-status-menu.tsx b/src/components/menus/operating-status-menu.tsx index 221211f194..99c45fc5e2 100644 --- a/src/components/menus/operating-status-menu.tsx +++ b/src/components/menus/operating-status-menu.tsx @@ -26,6 +26,7 @@ import { type ExtendedEquipmentType, type MuiStyles, OperatingStatus, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { isNodeBuilt, isNodeReadOnly } from '../graph/util/model-functions'; @@ -146,10 +147,7 @@ const withOperatingStatusMenu = ); function handleError(error: Error, translationKey: string) { - snackError({ - messageTxt: error.message, - headerId: getTranslationKey(translationKey), - }); + snackWithFallback(snackError, error, { headerId: getTranslationKey(translationKey) }); if (setModificationInProgress !== undefined) { setModificationInProgress(false); } diff --git a/src/components/network-modification-tree-pane.jsx b/src/components/network-modification-tree-pane.jsx index fcc55e84c5..9ad7cdda2f 100644 --- a/src/components/network-modification-tree-pane.jsx +++ b/src/components/network-modification-tree-pane.jsx @@ -22,7 +22,7 @@ import { useDispatch, useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import NetworkModificationTree from './network-modification-tree'; import CreateNodeMenu from './graph/menus/create-node-menu'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { ExportNetworkDialog } from './dialogs/export-network-dialog'; import { BUILD_STATUS } from './network/constants'; import { @@ -338,17 +338,11 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid globalBuildStatus: BUILD_STATUS.NOT_BUILT, nodeType: networkModificationNodeType, }).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); }) ) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); }); }, [studyUuid, snackError] @@ -357,10 +351,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid const handleCreateSecuritySequence = useCallback( (element) => { createNodeSequence(studyUuid, element.id, NodeSequenceType.SECURITY_SEQUENCE).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'SequenceCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'SequenceCreateError' }); }); }, [studyUuid, snackError] @@ -388,10 +379,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid if (CopyType.NODE_CUT === nodeSelectionForCopyRef.current.copyType) { cutTreeNode(studyUuid, nodeSelectionForCopyRef.current.nodeId, referenceNodeId, insertMode).catch( (error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); } ); //Do not wait for the response, after the first CUT / PASTE operation, we can't paste anymore @@ -404,10 +392,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid referenceNodeId, insertMode ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); }); //In copy/paste, we can still paste the same node later } @@ -430,10 +415,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid const handleUnbuildNode = useCallback( (element) => { unbuildNode(studyUuid, element.id, currentRootNetworkUuid).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeUnbuildingError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeUnbuildingError' }); }); }, [studyUuid, currentRootNetworkUuid, snackError] @@ -442,6 +424,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid const handleBuildNode = useCallback( (element) => { buildNode(studyUuid, element.id, currentRootNetworkUuid).catch((error) => { + // TODO: change for snackWithFallback when we integrate values inside backend errors if (error.status === 403 && error.message.includes(HTTP_MAX_NODE_BUILDS_EXCEEDED_MESSAGE)) { // retrieve last word of the message (ex: "MAX_NODE_BUILDS_EXCEEDED max allowed built nodes : 2" -> 2) let limit = error.message.split(/[: ]+/).pop(); @@ -469,9 +452,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid subscribeExport(response, fileName); }) .catch((error) => { - snackError({ - messageTxt: error.message, - }); + snackWithFallback(snackError, error); }); setOpenExportDialog(false); }, @@ -510,10 +491,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid const handleRemoveSubtree = useCallback( (element) => { stashSubtree(studyUuid, element.id).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeDeleteError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeDeleteError' }); }); }, [snackError, studyUuid] @@ -540,10 +518,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid (referenceNodeId) => { if (CopyType.SUBTREE_CUT === nodeSelectionForCopyRef.current.copyType) { cutSubtree(studyUuid, nodeSelectionForCopyRef.current.nodeId, referenceNodeId).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); }); //Do not wait for the response, after the first CUT / PASTE operation, we can't paste anymore dispatch(setNodeSelectionForCopy(noNodeSelectionForCopy)); @@ -554,10 +529,7 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid nodeSelectionForCopyRef.current.nodeId, referenceNodeId ).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeCreateError', - }); + snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); }); //In copy/paste, we can still paste the same node later } diff --git a/src/components/network-modification-tree.jsx b/src/components/network-modification-tree.jsx index 2ada96c754..859de8d2fc 100644 --- a/src/components/network-modification-tree.jsx +++ b/src/components/network-modification-tree.jsx @@ -26,7 +26,7 @@ import { import TreeControlButton from './graph/util/tree-control-button'; import RootNetworkPanel from './graph/menus/root-network/root-network-panel'; import { updateNodesColumnPositions } from '../services/study/tree-subtree.ts'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { groupIdSuffix } from './graph/nodes/labeled-group-node.type'; import { StudyDisplayMode } from './network-modification.type'; import { useSyncNavigationActions } from 'hooks/use-sync-navigation-actions'; @@ -222,10 +222,7 @@ const NetworkModificationTree = ({ onNodeContextMenu, studyUuid }) => { columnPosition: index, })); updateNodesColumnPositions(studyUuid, parentNodeId, children).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NodeUpdateColumnPositions', - }); + snackWithFallback(snackError, error, { headerId: 'NodeUpdateColumnPositions' }); }); }, [studyUuid, treeModel, snackError] diff --git a/src/components/network/network-map-panel.tsx b/src/components/network/network-map-panel.tsx index f8cab0c071..484f6c4cdc 100644 --- a/src/components/network/network-map-panel.tsx +++ b/src/components/network/network-map-panel.tsx @@ -39,6 +39,7 @@ import { HvdcType, type MuiStyles, NotificationsUrlKeys, + snackWithFallback, useNotificationsListener, useSnackMessage, type UseStateBooleanReturn, @@ -286,10 +287,7 @@ export const NetworkMapPanel = forwardRef { - snackError({ - messageTxt: error.message, - headerId: 'UnableToDeleteEquipment', - }); + snackWithFallback(snackError, error, { headerId: 'UnableToDeleteEquipment' }); } ); } @@ -525,10 +523,7 @@ export const NetworkMapPanel = forwardRef { if (currentNodeRef.current?.id === rootNodeId) { @@ -739,10 +730,8 @@ export const NetworkMapPanel = forwardRef - snackError({ - messageTxt: e.message, - }) + return reloadMapEquipments(currentNodeAtReloadCalling, updatedSubstationsToSend).catch((error) => + snackWithFallback(snackError, error) ); }, [ diff --git a/src/components/network/selection-creation-panel/use-save-map.ts b/src/components/network/selection-creation-panel/use-save-map.ts index a7c03bbf91..0d1dccc44d 100644 --- a/src/components/network/selection-creation-panel/use-save-map.ts +++ b/src/components/network/selection-creation-panel/use-save-map.ts @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { Equipment, useSnackMessage } from '@gridsuite/commons-ui'; +import { Equipment, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useCallback, useState } from 'react'; import { useIntl } from 'react-intl'; import { useSelector } from 'react-redux'; @@ -93,17 +93,11 @@ export const useSaveMap = (): UseSaveMapOutput => { } } catch (error: any) { if (error.message === 'EmptySelection') { - snackWarning({ - messageTxt: intl.formatMessage({ - id: error.message, - }), + snackWithFallback(snackWarning, error, { headerId: isFilter ? 'FilterCreationError' : 'ContingencyListCreationError', }); } else { - snackError({ - messageTxt: intl.formatMessage({ - id: error.message, - }), + snackWithFallback(snackError, error, { headerId: isFilter ? 'FilterCreationError' : 'ContingencyListCreationError', }); } diff --git a/src/components/results/common/global-filter/global-filter-provider.tsx b/src/components/results/common/global-filter/global-filter-provider.tsx index 2d357bd9da..68c85b5500 100644 --- a/src/components/results/common/global-filter/global-filter-provider.tsx +++ b/src/components/results/common/global-filter/global-filter-provider.tsx @@ -9,7 +9,12 @@ import { PropsWithChildren, useCallback, useEffect, useMemo, useState } from 're import { GlobalFilter } from './global-filter-types'; import { FilterType } from '../utils'; import type { UUID } from 'node:crypto'; -import { ElementAttributes, fetchDirectoryElementPath, useSnackMessage } from '@gridsuite/commons-ui'; +import { + ElementAttributes, + fetchDirectoryElementPath, + snackWithFallback, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { computeFullPath } from '../../../../utils/compute-title'; import { addToRecentGlobalFilters, removeFromRecentGlobalFilters } from '../../../../redux/actions'; import { useDispatch } from 'react-redux'; @@ -81,8 +86,7 @@ export default function GlobalFilterProvider({ }); } else { // or whatever error => do nothing except showing error message - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'ComputationFilterResultsError', }); } diff --git a/src/components/results/common/global-filter/use-global-filter-options.ts b/src/components/results/common/global-filter/use-global-filter-options.ts index 9f7952ed74..f37e432e5d 100644 --- a/src/components/results/common/global-filter/use-global-filter-options.ts +++ b/src/components/results/common/global-filter/use-global-filter-options.ts @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useEffect, useState } from 'react'; import { GlobalFilter } from './global-filter-types'; import { fetchAllCountries, fetchAllNominalVoltages } from '../../../../services/study/network-map'; @@ -37,10 +37,7 @@ export const useGlobalFilterOptions = () => { ); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'FetchCountryError', - }); + snackWithFallback(snackError, error, { headerId: 'FetchCountryError' }); }); fetchAllNominalVoltages(studyUuid, currentNode.id, currentRootNetworkUuid) @@ -53,10 +50,7 @@ export const useGlobalFilterOptions = () => { ); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'FetchNominalVoltagesError', - }); + snackWithFallback(snackError, error, { headerId: 'FetchNominalVoltagesError' }); }); fetchSubstationPropertiesGlobalFilters().then(({ substationPropertiesGlobalFilters }) => { diff --git a/src/components/results/common/global-filter/use-global-filter-results.ts b/src/components/results/common/global-filter/use-global-filter-results.ts index c742f0967a..9aa6f7bcbb 100644 --- a/src/components/results/common/global-filter/use-global-filter-results.ts +++ b/src/components/results/common/global-filter/use-global-filter-results.ts @@ -8,7 +8,7 @@ import type { NonEmptyTuple } from 'type-fest'; import { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import type { GlobalFilter, GlobalFilters } from './global-filter-types'; import { evaluateGlobalFilter } from '../../../../services/study/filter'; import type { AppState } from '../../../../redux/reducer'; @@ -41,8 +41,7 @@ function useGlobalFiltersResults( evaluateGlobalFilter(studyUuid, currentNode.id, currentRootNetworkUuid, equipmentTypes, globalFilters) .then(setFilteredIds) .catch((error) => { - console.error('Error while fetching GlobalFilter results', error); - snackError({ headerId: 'FilterEvaluationError', messageTxt: `${error}` }); + snackWithFallback(snackError, error, { headerId: 'FilterEvaluationError' }); }); } }, [ diff --git a/src/components/results/dynamicsimulation/hooks/useResultTimeSeries.ts b/src/components/results/dynamicsimulation/hooks/useResultTimeSeries.ts index d0a1e115fd..e6eafddccc 100644 --- a/src/components/results/dynamicsimulation/hooks/useResultTimeSeries.ts +++ b/src/components/results/dynamicsimulation/hooks/useResultTimeSeries.ts @@ -9,7 +9,7 @@ import { fetchDynamicSimulationTimeSeriesMetadata, } from '../../../../services/study/dynamic-simulation'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useCallback } from 'react'; import type { UUID } from 'node:crypto'; import { SimpleTimeSeriesMetadata, Timeseries } from '../types/dynamic-simulation-result.type'; @@ -108,10 +108,7 @@ const useResultTimeSeries = ({ })); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'DynamicSimulationResults', - }); + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationResults' }); return undefined; }); } diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 9fc5f861c7..afb054e4f4 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -8,7 +8,7 @@ import { useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; import { FunctionComponent, useCallback, useEffect, useState } from 'react'; -import { ComputingType, useSnackMessage } from '@gridsuite/commons-ui'; +import { ComputingType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { FROM_COLUMN_TO_FIELD_PCC_MIN, PagedPccMinResults, SinglePccMinResultInfos } from './pcc-min-result.type'; import { useIntl } from 'react-intl'; @@ -112,12 +112,7 @@ export const PccMinResult: FunctionComponent = ({ setCount(totalElements); } }) - .catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'PccMinResultsError', - }) - ) + .catch((error) => snackWithFallback(snackError, error, { headerId: 'PccMinResultsError' })) .finally(() => { if (isMounted) { setIsFetching(false); diff --git a/src/components/results/securityanalysis/security-analysis-export-button.tsx b/src/components/results/securityanalysis/security-analysis-export-button.tsx index f574ee7717..0ce10ca0ea 100644 --- a/src/components/results/securityanalysis/security-analysis-export-button.tsx +++ b/src/components/results/securityanalysis/security-analysis-export-button.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { ExportCsvButton, useSnackMessage } from '@gridsuite/commons-ui'; +import { ExportCsvButton, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'; import { useIntl } from 'react-intl'; @@ -96,25 +96,10 @@ export const SecurityAnalysisExportButton: FunctionComponent { - snackError({ - messageTxt: error.message, - headerId: intl.formatMessage({ - id: 'securityAnalysisCsvResultsError', - }), - }); + snackWithFallback(snackError, error, { headerId: 'securityAnalysisCsvResultsError' }); }) .finally(() => setIsCsvExportLoading(false)); - }, [ - resultType, - csvHeaders, - enumValueTranslations, - studyUuid, - nodeUuid, - rootNetworkUuid, - snackError, - intl, - language, - ]); + }, [resultType, csvHeaders, enumValueTranslations, studyUuid, nodeUuid, rootNetworkUuid, snackError, language]); return ( { - snackError({ - messageTxt: error.message, - headerId: intl.formatMessage({ - id: 'SensitivityAnalysisResultsError', - }), - }); + snackWithFallback(snackError, error, { headerId: 'SensitivityAnalysisResultsError' }); }); - }, [nOrNkIndex, sensiKind, studyUuid, nodeUuid, currentRootNetworkUuid, snackError, intl]); + }, [nOrNkIndex, sensiKind, studyUuid, nodeUuid, currentRootNetworkUuid, snackError]); const fetchResult = useCallback(() => { const sortSelector = sortConfig?.length @@ -189,12 +184,7 @@ function PagedSensitivityAnalysisResult({ setCount(filteredSensitivitiesCount); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: intl.formatMessage({ - id: 'SensitivityAnalysisResultsError', - }), - }); + snackWithFallback(snackError, error, { headerId: 'SensitivityAnalysisResultsError' }); }) .finally(() => { setIsLoading(false); @@ -211,7 +201,6 @@ function PagedSensitivityAnalysisResult({ nodeUuid, currentRootNetworkUuid, snackError, - intl, ]); useEffect(() => { diff --git a/src/components/results/sensitivity-analysis/sensitivity-analysis-export-button.tsx b/src/components/results/sensitivity-analysis/sensitivity-analysis-export-button.tsx index 0101717f78..e20ba16297 100644 --- a/src/components/results/sensitivity-analysis/sensitivity-analysis-export-button.tsx +++ b/src/components/results/sensitivity-analysis/sensitivity-analysis-export-button.tsx @@ -6,7 +6,7 @@ */ import { FunctionComponent, useCallback, useEffect, useState } from 'react'; -import { ExportCsvButton, PARAM_LANGUAGE, useSnackMessage } from '@gridsuite/commons-ui'; +import { ExportCsvButton, PARAM_LANGUAGE, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { downloadZipFile } from '../../../services/utils'; import type { UUID } from 'node:crypto'; import { AppState } from 'redux/reducer'; @@ -121,10 +121,7 @@ export const SensitivityExportButton: FunctionComponent { - snackError({ - messageTxt: error.message, - headerId: 'csvExportSensitivityResultError', - }); + snackWithFallback(snackError, error, { headerId: 'csvExportSensitivityResultError' }); setIsCsvExportSuccessful(false); }) .finally(() => setIsCsvExportLoading(false)); diff --git a/src/components/results/shortcircuit/shortcircuit-analysis-export-button.tsx b/src/components/results/shortcircuit/shortcircuit-analysis-export-button.tsx index 837b50f6cd..cbdbec250c 100644 --- a/src/components/results/shortcircuit/shortcircuit-analysis-export-button.tsx +++ b/src/components/results/shortcircuit/shortcircuit-analysis-export-button.tsx @@ -6,7 +6,7 @@ */ import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'; -import { ExportCsvButton, PARAM_LANGUAGE, useSnackMessage } from '@gridsuite/commons-ui'; +import { ExportCsvButton, PARAM_LANGUAGE, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useIntl } from 'react-intl'; import { downloadShortCircuitResultZippedCsv } from '../../../services/study/short-circuit-analysis'; import { downloadZipFile } from '../../../services/utils'; @@ -95,12 +95,7 @@ export const ShortCircuitExportButton: FunctionComponent { - snackError({ - messageTxt: error.message, - headerId: intl.formatMessage({ - id: 'shortCircuitAnalysisCsvResultsError', - }), - }); + snackWithFallback(snackError, error, { headerId: 'shortCircuitAnalysisCsvResultsError' }); setIsCsvExportSuccessful(false); }) .finally(() => setIsCsvExportLoading(false)); @@ -108,7 +103,6 @@ export const ShortCircuitExportButton: FunctionComponent - snackError({ - messageTxt: error.message, - headerId: 'ShortCircuitAnalysisResultsError', - }) - ) + .catch((error) => snackWithFallback(snackError, error, { headerId: 'ShortCircuitAnalysisResultsError' })) .finally(() => { if (active) { setIsFetching(false); @@ -221,12 +216,7 @@ export const ShortCircuitAnalysisResult: FunctionComponent - snackError({ - messageTxt: err.message, - headerId: 'ShortCircuitAnalysisResultsError', - }) - ); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'ShortCircuitAnalysisResultsError' })); }, [ analysisStatus, intl, diff --git a/src/components/run-button-container.jsx b/src/components/run-button-container.jsx index 4e2fb58de6..ec9ac350bc 100644 --- a/src/components/run-button-container.jsx +++ b/src/components/run-button-container.jsx @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { useIntl } from 'react-intl'; import { useCallback, useMemo, useState } from 'react'; import PropTypes from 'prop-types'; import { @@ -19,7 +18,7 @@ import { useDispatch, useSelector } from 'react-redux'; import RunningStatus from './utils/running-status'; import { PARAM_DEVELOPER_MODE, PARAM_PROVIDER_DYNAFLOW, PARAM_PROVIDER_DYNAWO } from '../utils/config-params'; -import { ComputingType, formatComputingTypeLabel, useSnackMessage } from '@gridsuite/commons-ui'; +import { ComputingType, formatComputingTypeLabel, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import RunButton from './run-button'; import { DynamicSimulationParametersSelector } from './dialogs/dynamicsimulation/dynamic-simulation-parameters-selector'; import { ContingencyListSelector } from './dialogs/contingency-list-selector'; @@ -67,7 +66,6 @@ const COMPUTATIONS_WITH_PAGINATION = [ ]; export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkUuid, disabled }) { - const intl = useIntl(); const loadFlowStatus = useSelector((state) => state.computingStatus[ComputingType.LOAD_FLOW]); const loadFlowStatusInfos = useSelector((state) => state.computingStatusParameters[ComputingType.LOAD_FLOW]); @@ -181,10 +179,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU fnCatch(error); } if (errorHeaderId) { - snackError({ - messageTxt: error.message, - headerId: errorHeaderId, - }); + snackWithFallback(snackError, error, { headerId: errorHeaderId }); } }) .finally(() => { @@ -205,15 +200,9 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU return providerFetcher(studyUuid).then((provider) => { if (forbiddenProvidersOnConstructionNode.includes(provider)) { snackError({ - headerTxt: intl.formatMessage({ - id: formatComputingTypeLabel(computingType), - }), - messageTxt: intl.formatMessage( - { - id: 'ForbiddenProviderError', - }, - { provider: provider } - ), + headerId: formatComputingTypeLabel(computingType), + messageId: 'ForbiddenProviderError', + messageValues: { provider }, }); return false; } else { @@ -221,7 +210,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU } }); }, - [currentNode, intl, snackError] + [currentNode, snackError] ); const handleStartSecurityAnalysis = (contingencyListNames) => { @@ -404,10 +393,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU 'DynamicSimulationRunError' ); } catch (error) { - snackError({ - messageTxt: error.message, - headerId: 'DynamicSimulationRunError', - }); + snackWithFallback(snackError, error, { headerId: 'DynamicSimulationRunError' }); } }, actionOnRunnable() { @@ -441,10 +427,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU 'startDynamicSecurityAnalysisError' ); } catch (error) { - snackError({ - messageTxt: error.message, - headerId: 'startDynamicSecurityAnalysisError', - }); + snackWithFallback(snackError, error, { headerId: 'startDynamicSecurityAnalysisError' }); } }, actionOnRunnable() { diff --git a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-from-model-dialog.tsx b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-from-model-dialog.tsx index 7d7c82ae52..3f6496cc71 100644 --- a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-from-model-dialog.tsx +++ b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-from-model-dialog.tsx @@ -11,6 +11,7 @@ import { CustomFormProvider, DirectoryItemsInput, ElementType, + snackWithFallback, TextInput, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -101,8 +102,7 @@ export default function AddSpreadsheetFromModelDialog({ open }: Readonly { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_loading_model', }); }); diff --git a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-utils.ts b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-utils.ts index dc28362fab..af1141397f 100644 --- a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-utils.ts +++ b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheet-utils.ts @@ -15,7 +15,7 @@ import { SpreadsheetTabDefinition, } from '../../types/spreadsheet.type'; import { Dispatch } from 'redux'; -import { UseStateBooleanReturn } from '@gridsuite/commons-ui'; +import { snackWithFallback, UseStateBooleanReturn } from '@gridsuite/commons-ui'; import { addFilterForNewSpreadsheet, addSortForNewSpreadsheet, @@ -136,8 +136,7 @@ const handleSuccess = ( dispatch(addSortForNewSpreadsheet(uuid, [{ colId: 'id', sort: SortWay.ASC }])); }) .catch((error) => { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_loading_model', }); }) @@ -185,8 +184,7 @@ export const addNewSpreadsheet = ({ handleSuccess(uuid, newTableDefinition, dispatch, snackError, open, nodeAliases, resetNodeAliases); }) .catch((error) => { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_adding_spreadsheet', }); open.setFalse(); diff --git a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheets-from-collection-dialog.tsx b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheets-from-collection-dialog.tsx index 472c09d953..ef0bd3f8f9 100644 --- a/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheets-from-collection-dialog.tsx +++ b/src/components/spreadsheet-view/add-spreadsheet/dialogs/add-spreadsheets-from-collection-dialog.tsx @@ -13,6 +13,7 @@ import { ElementType, PopupConfirmationDialog, RadioInput, + snackWithFallback, useSnackMessage, } from '@gridsuite/commons-ui'; import { useForm } from 'react-hook-form'; @@ -84,8 +85,7 @@ export default function AddSpreadsheetsFromCollectionDialog({ open }: Readonly { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/create_new_spreadsheet/error_loading_collection', }); }); diff --git a/src/components/spreadsheet-view/columns/column-creation-dialog.tsx b/src/components/spreadsheet-view/columns/column-creation-dialog.tsx index 330d7391f0..7cdaff004d 100644 --- a/src/components/spreadsheet-view/columns/column-creation-dialog.tsx +++ b/src/components/spreadsheet-view/columns/column-creation-dialog.tsx @@ -16,6 +16,7 @@ import { IntegerInput, type MuiStyles, MultipleAutocompleteInput, + snackWithFallback, SubmitButton, TextInput, useSnackMessage, @@ -253,8 +254,7 @@ export default function ColumnCreationDialog({ ); }) .catch((error) => { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/custom_column/error_saving_or_updating_column', }); }); diff --git a/src/components/spreadsheet-view/columns/column-menu.tsx b/src/components/spreadsheet-view/columns/column-menu.tsx index 9e3e0ee960..504265d6e9 100644 --- a/src/components/spreadsheet-view/columns/column-menu.tsx +++ b/src/components/spreadsheet-view/columns/column-menu.tsx @@ -7,7 +7,7 @@ import { FunctionComponent, useCallback, useMemo, useState } from 'react'; import { Menu, MenuItem } from '@mui/material'; -import { PopupConfirmationDialog, useSnackMessage, useStateBoolean } from '@gridsuite/commons-ui'; +import { PopupConfirmationDialog, snackWithFallback, useSnackMessage, useStateBoolean } from '@gridsuite/commons-ui'; import { FormattedMessage, useIntl } from 'react-intl'; import { useDispatch, useSelector } from 'react-redux'; import { setRemoveColumnDefinition } from 'redux/actions'; @@ -69,8 +69,7 @@ export const ColumnMenu: FunctionComponent = ({ duplicateSpreadsheetColumn(studyUuid, spreadsheetConfigUuid, columnDefinition.uuid) .then() .catch((error) => { - snackError({ - messageTxt: error.message, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/custom_column/duplicate_column_error', }); }); @@ -108,10 +107,7 @@ export const ColumnMenu: FunctionComponent = ({ ); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'spreadsheet/custom_column/delete_column_error', - }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/custom_column/delete_column_error' }); }); } }, [ diff --git a/src/components/spreadsheet-view/columns/floating-treeview-list/floating-popover-treeview-wrapper.tsx b/src/components/spreadsheet-view/columns/floating-treeview-list/floating-popover-treeview-wrapper.tsx index 6c1370bce0..a3f9c1e509 100644 --- a/src/components/spreadsheet-view/columns/floating-treeview-list/floating-popover-treeview-wrapper.tsx +++ b/src/components/spreadsheet-view/columns/floating-treeview-list/floating-popover-treeview-wrapper.tsx @@ -15,7 +15,7 @@ import { SpreadsheetEquipmentType } from '../../types/spreadsheet.type'; import { JSONSchema4 } from 'json-schema'; import { TreeviewSearchable } from './treeview-searchable'; import { usePopoverToggle } from './utils/use-popover-toggle'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useIntl } from 'react-intl'; interface FormulaAutocompleteFieldProps { @@ -38,7 +38,7 @@ export function FloatingPopoverTreeviewWrapper({ useEffect(() => { fetchSpreadsheetEquipmentTypeSchema(spreadsheetEquipmentType) .then((result) => setProperties(result)) - .catch((error) => snackError({ headerId: 'FetchingEquipmentSchemaError', messageTxt: error })); + .catch((error) => snackWithFallback(snackError, error, { headerId: 'FetchingEquipmentSchemaError' })); }, [snackError, spreadsheetEquipmentType]); const { handleKeyDown } = usePopoverToggle(properties, setAnchorEl); diff --git a/src/components/spreadsheet-view/hooks/use-fetch-equipment.ts b/src/components/spreadsheet-view/hooks/use-fetch-equipment.ts index da64446ffc..eedda319d9 100644 --- a/src/components/spreadsheet-view/hooks/use-fetch-equipment.ts +++ b/src/components/spreadsheet-view/hooks/use-fetch-equipment.ts @@ -11,7 +11,7 @@ import type { UUID } from 'node:crypto'; import { useDispatch, useSelector } from 'react-redux'; import { type AppState } from '../../../redux/reducer'; import { loadEquipments, setSpreadsheetFetching } from '../../../redux/actions'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { fetchNetworkElementsInfos } from '../../../services/study/network'; import { mapSpreadsheetEquipments } from '../../../utils/spreadsheet-equipments-mapper'; import { EQUIPMENT_INFOS_TYPES } from '../../utils/equipment-types'; @@ -58,12 +58,8 @@ export function useFetchEquipment() { `Equipment data fetching and dispatch done for ${fetcherPromises.length} built nodes among ${nodesIds.size}` ); }) - .catch((err) => { - console.debug('Equipment data fetching and dispatch NOT done'); - snackError({ - messageTxt: err.message, - headerId: 'SpreadsheetFetchError', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'SpreadsheetFetchError' }); }) .finally(() => { dispatch(setSpreadsheetFetching(type, false)); diff --git a/src/components/spreadsheet-view/hooks/use-node-aliases.ts b/src/components/spreadsheet-view/hooks/use-node-aliases.ts index 3ecc4cc393..f55b58c5b3 100644 --- a/src/components/spreadsheet-view/hooks/use-node-aliases.ts +++ b/src/components/spreadsheet-view/hooks/use-node-aliases.ts @@ -9,7 +9,7 @@ import { AppState } from '../../../redux/reducer'; import { useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { getNodeAliases, updateNodeAliases as _updateNodeAlias } from '../../../services/study/node-alias'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { NodeAlias } from '../types/node-alias.type'; import { updateNodeAliases as updateNodeAliasesInStore } from 'redux/actions'; @@ -30,10 +30,7 @@ export const useNodeAliases = () => { .then((_nodeAliases) => dispatch(updateNodeAliasesInStore(_nodeAliases))) .catch((error) => { dispatch(updateNodeAliasesInStore([])); - snackError({ - messageTxt: error.message, - headerId: 'nodeAliasesRetrievingError', - }); + snackWithFallback(snackError, error, { headerId: 'nodeAliasesRetrievingError' }); }); } else { dispatch(updateNodeAliasesInStore([])); @@ -44,10 +41,7 @@ export const useNodeAliases = () => { (newNodeAliases: NodeAlias[]) => { if (studyUuid) { _updateNodeAlias(studyUuid, newNodeAliases).catch((error) => - snackError({ - messageTxt: error.message, - headerId: 'nodeAliasesUpdateError', - }) + snackWithFallback(snackError, error, { headerId: 'nodeAliasesUpdateError' }) ); } }, diff --git a/src/components/spreadsheet-view/spreadsheet-tabs/spreadsheet-tabs.tsx b/src/components/spreadsheet-view/spreadsheet-tabs/spreadsheet-tabs.tsx index ef5a2bc189..fa82d192fa 100644 --- a/src/components/spreadsheet-view/spreadsheet-tabs/spreadsheet-tabs.tsx +++ b/src/components/spreadsheet-view/spreadsheet-tabs/spreadsheet-tabs.tsx @@ -17,7 +17,13 @@ import { renameTableDefinition, reorderTableDefinitions, } from 'redux/actions'; -import { type MuiStyles, PopupConfirmationDialog, useSnackMessage, useStateBoolean } from '@gridsuite/commons-ui'; +import { + type MuiStyles, + PopupConfirmationDialog, + snackWithFallback, + useSnackMessage, + useStateBoolean, +} from '@gridsuite/commons-ui'; import { useIntl } from 'react-intl'; import type { DropResult } from '@hello-pangea/dnd'; import DroppableTabs from 'components/utils/draggable-tab/droppable-tabs'; @@ -122,7 +128,7 @@ export default function SpreadsheetTabs({ } }) .catch((error) => { - snackError({ messageTxt: error.message, headerId: 'spreadsheet/remove_spreadsheet_error' }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/remove_spreadsheet_error' }); }); }; @@ -136,7 +142,7 @@ export default function SpreadsheetTabs({ setIsRenameDialogOpen(false); }) .catch((error) => { - snackError({ messageTxt: error.message, headerId: 'spreadsheet/rename_spreadsheet_error' }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/rename_spreadsheet_error' }); }); }; @@ -171,9 +177,8 @@ export default function SpreadsheetTabs({ headerId: 'spreadsheet/global-model-edition/update_confirmation_message', }); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'spreadsheet/global-model-edition/update_error_message', }); }); @@ -222,7 +227,7 @@ export default function SpreadsheetTabs({ if (spreadsheetsCollectionUuid) { const newOrder = reorderedTabs.map((tab) => tab.uuid); reorderSpreadsheetConfigs(studyUuid, spreadsheetsCollectionUuid, newOrder).catch((error) => { - snackError({ messageTxt: error.message, headerId: 'spreadsheet/reorder_tabs_error' }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/reorder_tabs_error' }); }); } }, diff --git a/src/components/spreadsheet-view/spreadsheet-view.tsx b/src/components/spreadsheet-view/spreadsheet-view.tsx index 19dd143d5a..2b99effd9f 100644 --- a/src/components/spreadsheet-view/spreadsheet-view.tsx +++ b/src/components/spreadsheet-view/spreadsheet-view.tsx @@ -20,7 +20,7 @@ import { Spreadsheet } from './spreadsheet/spreadsheet'; import { FormattedMessage, useIntl } from 'react-intl'; import { getSpreadsheetConfigCollection, setSpreadsheetConfigCollection } from 'services/study/study-config'; import { initTableDefinitions, setActiveSpreadsheetTab } from 'redux/actions'; -import { type MuiStyles, PopupConfirmationDialog, useSnackMessage } from '@gridsuite/commons-ui'; +import { type MuiStyles, PopupConfirmationDialog, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { processSpreadsheetsCollectionData } from './add-spreadsheet/dialogs/add-spreadsheet-utils'; import { DiagramType } from 'components/grid-layout/cards/diagrams/diagram.type'; @@ -103,8 +103,7 @@ export const SpreadsheetView: FunctionComponent = ({ getStudySpreadsheetConfigCollection(); }) .catch((error) => { - snackError({ - messageTxt: error, + snackWithFallback(snackError, error, { headerId: 'spreadsheet/reset_spreadsheet_collection/error_resetting_collection', }); }); diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-column-management.ts b/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-column-management.ts index fe487eb584..b1caf795dd 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-column-management.ts +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-column-management.ts @@ -14,7 +14,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; import { SPREADSHEET_SORT_STORE } from 'utils/store-sort-filter-fields'; import { updateTableDefinition } from 'redux/actions'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { reorderSpreadsheetColumns } from 'services/study/study-config'; export function useColumnManagement(gridRef: React.RefObject, tableDefinition: SpreadsheetTabDefinition) { @@ -97,10 +97,7 @@ export function useColumnManagement(gridRef: React.RefObject, table ); }) .catch((error) => { - snackError({ - messageTxt: error, - headerId: 'spreadsheet/reorder_columns/error', - }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/reorder_columns/error' }); }); }, [studyUuid, tableDefinition, dispatch, snackError] diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/columns-config.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/columns-config.tsx index 20db08e930..affdcf4653 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/columns-config.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/columns-config.tsx @@ -14,7 +14,7 @@ import ViewColumnIcon from '@mui/icons-material/ViewColumn'; import { DropResult } from '@hello-pangea/dnd'; import { updateTableDefinition } from 'redux/actions'; import type { UUID } from 'node:crypto'; -import { type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { SpreadsheetTabDefinition } from '../../types/spreadsheet.type'; import { spreadsheetStyles } from '../../spreadsheet.style'; import { updateColumnStates } from 'services/study/study-config'; @@ -140,10 +140,7 @@ export const ColumnsConfig: FunctionComponent = ({ tableDefi }) .catch((error) => { resetColumnState(); - snackError({ - messageTxt: error, - headerId: 'spreadsheet/reorder_columns/error', - }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/reorder_columns/error' }); }); handleCloseColumnsSettingDialog(); diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/row-counter/filtered-row-counter.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/row-counter/filtered-row-counter.tsx index f9dbaee1a8..e91eb6c11e 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/row-counter/filtered-row-counter.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/row-counter/filtered-row-counter.tsx @@ -12,7 +12,7 @@ import { Box, Button, CircularProgress, Fade, Tooltip } from '@mui/material'; import FilterAltOffIcon from '@mui/icons-material/FilterAltOff'; import { resetSpreadsheetColumnsFilters } from '../../../../../services/study/study-config'; import { UseFilteredRowCounterInfoReturn } from './use-filtered-row-counter'; -import { type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; const styles = { getContainer: (theme) => ({ @@ -44,8 +44,7 @@ export function FilteredRowCounter({ rowCounterInfos, tableDefinition }: Readonl const handleResetFilters = useCallback(() => { if (isAnyFilterPresent && studyUuid) { resetSpreadsheetColumnsFilters(studyUuid, tableDefinition.uuid).catch((error) => { - console.error('Failed to update global filters:', error); - snackError({ headerId: 'spreadsheet/reset_filters_error', messageTxt: error.messageTxt ?? error }); + snackWithFallback(snackError, error, { headerId: 'spreadsheet/reset_filters_error' }); }); } }, [isAnyFilterPresent, snackError, studyUuid, tableDefinition.uuid]); diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-naming-filter-dialog.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-naming-filter-dialog.tsx index 15e0ab9ca7..f2ee9b102f 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-naming-filter-dialog.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-naming-filter-dialog.tsx @@ -13,6 +13,7 @@ import { type IElementUpdateDialog, type NewFilterType, saveFilter, + snackWithFallback, useSnackMessage, type UseStateBooleanReturn, } from '@gridsuite/commons-ui'; @@ -75,9 +76,8 @@ export default function SaveNamingFilterDialog({ .then(() => { snackInfo({ messageTxt: intl.formatMessage({ id: 'FilterCreationSuccess' }) }); }) - .catch((err) => { - console.error('Failed to create filter', err); - snackError({ messageTxt: intl.formatMessage({ id: 'FilterCreationError' }) }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'FilterCreationError' }); }); }, [getFilterFromGrid, snackInfo, snackError, intl] @@ -93,9 +93,8 @@ export default function SaveNamingFilterDialog({ .then(() => { snackInfo({ messageTxt: intl.formatMessage({ id: 'FilterUpdateSuccess' }) }); }) - .catch((err) => { - console.error('Failed to update filter', err); - snackError({ messageTxt: intl.formatMessage({ id: 'FilterUpdateError' }) }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'FilterUpdateError' }); }); }, [getFilterFromGrid, snackInfo, snackError, intl] diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-spreadsheet-collection-dialog.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-spreadsheet-collection-dialog.tsx index 18ccee23c5..c8e2aa8976 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-spreadsheet-collection-dialog.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/save/save-spreadsheet-collection-dialog.tsx @@ -17,6 +17,7 @@ import { type IElementCreationDialog, type IElementUpdateDialog, type MuiStyles, + snackWithFallback, useSnackMessage, type UseStateBooleanReturn, } from '@gridsuite/commons-ui'; @@ -208,10 +209,7 @@ export const SaveSpreadsheetCollectionDialog: FunctionComponent { - snackError({ - messageTxt: errmsg, - headerId: 'spreadsheet/save/error_message', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'spreadsheet/save/error_message' }); }); }; @@ -147,9 +145,8 @@ export default function SaveSpreadsheetDialog({ tableDefinition, open }: Readonl }, }); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'spreadsheet/save/update_error_message', headerValues: { item: elementFullPath, diff --git a/src/components/study-container.jsx b/src/components/study-container.jsx index 9109578201..bb1a80f565 100644 --- a/src/components/study-container.jsx +++ b/src/components/study-container.jsx @@ -26,7 +26,13 @@ import { import { fetchRootNetworks } from 'services/root-network'; import WaitingLoader from './utils/waiting-loader'; -import { NotificationsUrlKeys, useIntlRef, useNotificationsListener, useSnackMessage } from '@gridsuite/commons-ui'; +import { + NotificationsUrlKeys, + snackWithFallback, + useIntlRef, + useNotificationsListener, + useSnackMessage, +} from '@gridsuite/commons-ui'; import NetworkModificationTreeModel from './graph/network-modification-tree-model'; import { getFirstNodeOfType } from './graph/util/model-functions'; import { BUILD_STATUS } from './network/constants'; @@ -330,10 +336,7 @@ export function StudyContainer({ view, onChangeTab }) { dispatch(setCurrentTreeNode(ModelFirstSelectedNode)); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'NetworkModificationTreeLoadError', - }); + snackWithFallback(snackError, error, { headerId: 'NetworkModificationTreeLoadError' }); }) .finally(() => console.debug('Network modification tree loading finished')); // Note: studyUuid and dispatch don't change @@ -360,10 +363,7 @@ export function StudyContainer({ view, onChangeTab }) { .then(() => setIsFirstRootNetworkIndexationFound(true)) .catch((error) => { // unknown error when trying to reindex root network - snackError({ - headerId: 'rootNetworkIndexationError', - messageTxt: error, - }); + snackWithFallback(snackError, error, { headerId: 'rootNetworkIndexationError' }); }); break; } diff --git a/src/components/voltage-init-result.tsx b/src/components/voltage-init-result.tsx index 3dd443167c..2f94efb5b8 100644 --- a/src/components/voltage-init-result.tsx +++ b/src/components/voltage-init-result.tsx @@ -11,7 +11,7 @@ import { useSelector } from 'react-redux'; import { FormattedMessage, IntlShape, useIntl } from 'react-intl'; import { Box, Button, LinearProgress, Stack, Typography } from '@mui/material'; import { Lens } from '@mui/icons-material'; -import { ComputingType, mergeSx, type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { ComputingType, mergeSx, type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { cloneVoltageInitModifications, getVoltageInitModifications, @@ -134,11 +134,8 @@ export const VoltageInitResult: FunctionComponent = ({ setDisableApplyModifications(true); if (studyUuid && currentNode?.id && currentRootNetworkUuid) { cloneVoltageInitModifications(studyUuid, currentNode.id, currentRootNetworkUuid) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errCloneVoltageInitModificationMsg', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errCloneVoltageInitModificationMsg' }); setDisableApplyModifications(false); }) .finally(() => { @@ -157,11 +154,8 @@ export const VoltageInitResult: FunctionComponent = ({ setVoltageInitModification(modificationList.at(0)); setPreviewModificationsDialogOpen(true); }) - .catch((errmsg) => { - snackError({ - messageTxt: errmsg, - headerId: 'errPreviewVoltageInitModificationMsg', - }); + .catch((error) => { + snackWithFallback(snackError, error, { headerId: 'errPreviewVoltageInitModificationMsg' }); }) .finally(() => { setDisableApplyModifications(false); diff --git a/src/hooks/use-computation-debug.ts b/src/hooks/use-computation-debug.ts index 41ee3835fa..fb13041a68 100644 --- a/src/hooks/use-computation-debug.ts +++ b/src/hooks/use-computation-debug.ts @@ -14,6 +14,7 @@ import { ComputingType, formatComputingTypeLabel, NotificationsUrlKeys, + snackWithFallback, useNotificationsListener, useSnackMessage, } from '@gridsuite/commons-ui'; @@ -107,10 +108,7 @@ export default function useComputationDebug({ }); } else { // or whatever error - snackError({ - messageTxt: error.message, - headerId: 'debug.header.fileError', - }); + snackWithFallback(snackError, error, { headerId: 'debug.header.fileError' }); } }); }, diff --git a/src/hooks/use-equipment-dialogs.tsx b/src/hooks/use-equipment-dialogs.tsx index e89b5e36a4..121a2b063c 100644 --- a/src/hooks/use-equipment-dialogs.tsx +++ b/src/hooks/use-equipment-dialogs.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useState } from 'react'; -import { EquipmentType, ExtendedEquipmentType, useSnackMessage } from '@gridsuite/commons-ui'; +import { EquipmentType, ExtendedEquipmentType, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { EQUIPMENT_INFOS_TYPES, EQUIPMENT_TYPES } from '../components/utils/equipment-types'; import { deleteEquipment } from '../services/study/network-modifications'; import { fetchNetworkElementInfos } from '../services/study/network'; @@ -95,10 +95,7 @@ export const useEquipmentDialogs = ({ studyUuid, currentNode, currentRootNetwork (equipmentType: string, equipmentId: string) => { if (studyUuid) { deleteEquipment(studyUuid, currentNode?.id, equipmentType, equipmentId, undefined).catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'UnableToDeleteEquipment', - }); + snackWithFallback(snackError, error, { headerId: 'UnableToDeleteEquipment' }); }); } }, diff --git a/src/hooks/use-export-download.ts b/src/hooks/use-export-download.ts index c70c6725f6..d9144eea47 100644 --- a/src/hooks/use-export-download.ts +++ b/src/hooks/use-export-download.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { UUID } from 'node:crypto'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { useCallback } from 'react'; import { downloadZipFile } from '../services/utils'; import { fetchExportNetworkFile } from '../services/network-conversion'; @@ -37,9 +37,7 @@ export function useExportDownload() { }); }) .catch((error: Error) => { - snackError({ - messageTxt: intl.formatMessage({ id: 'export.message.failed' }, { error: error.message }), - }); + snackWithFallback(snackError, error, { headerId: 'export.message.failed' }); }); }, [intl, snackError, snackSuccess] diff --git a/src/hooks/use-export-notification.ts b/src/hooks/use-export-notification.ts index a08a9f0b27..7fc758b3c1 100644 --- a/src/hooks/use-export-notification.ts +++ b/src/hooks/use-export-notification.ts @@ -4,8 +4,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { useIntl } from 'react-intl'; -import { NotificationsUrlKeys, useNotificationsListener, useSnackMessage } from '@gridsuite/commons-ui'; +import { + NotificationsUrlKeys, + snackWithFallback, + useNotificationsListener, + useSnackMessage, +} from '@gridsuite/commons-ui'; import { useCallback } from 'react'; import { useExportDownload } from './use-export-download'; import { useSelector } from 'react-redux'; @@ -14,7 +18,6 @@ import { isExportNetworkNotification } from '../types/notification-types'; import { buildExportIdentifier, isExportSubscribed, unsetExportSubscription } from '../utils/export-network-utils'; export default function useExportNotification() { - const intl = useIntl(); const { snackError } = useSnackMessage(); const { downloadExportNetworkFile } = useExportDownload(); const userId = useSelector((state: AppState) => state.user?.profile.sub); @@ -30,16 +33,14 @@ export default function useExportNotification() { if (isSubscribed && userIdNotif === userId) { unsetExportSubscription(exportIdentifierNotif); if (error) { - snackError({ - messageTxt: intl.formatMessage({ id: 'export.message.failed' }, { error: error }), - }); + snackWithFallback(snackError, error, { headerId: 'export.message.failed' }); } else { downloadExportNetworkFile(exportUuid); } } } }, - [userId, snackError, downloadExportNetworkFile, intl] + [userId, snackError, downloadExportNetworkFile] ); useNotificationsListener(NotificationsUrlKeys.STUDY, { listenerCallbackMessage: handleExportNotification }); diff --git a/src/hooks/use-report-fetcher.tsx b/src/hooks/use-report-fetcher.tsx index dc4f28e773..ae7dcc6ae4 100644 --- a/src/hooks/use-report-fetcher.tsx +++ b/src/hooks/use-report-fetcher.tsx @@ -9,7 +9,7 @@ import { useSelector } from 'react-redux'; import { AppState } from '../redux/reducer'; import { useCallback, useMemo, useState } from 'react'; import { fetchNodeReportLogs, fetchNodeSeverities, fetchParentNodesReport, fetchLogMatches } from '../services/study'; -import { useSnackMessage } from '@gridsuite/commons-ui'; +import { snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; import { MatchPosition, PagedLogs, @@ -120,10 +120,7 @@ export const useReportFetcher = ( return makeSingleReportAndMapNames(fetchedReport, nodesNames); }) .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'ReportFetchError', - }); + snackWithFallback(snackError, error, { headerId: 'ReportFetchError' }); return undefined; }) .finally(() => { diff --git a/src/hooks/use-study-path.ts b/src/hooks/use-study-path.ts index 8bbe53f3e2..c85cf74a32 100644 --- a/src/hooks/use-study-path.ts +++ b/src/hooks/use-study-path.ts @@ -9,6 +9,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { fetchDirectoryElementPath, NotificationsUrlKeys, + snackWithFallback, useNotificationsListener, usePrevious, useSnackMessage, @@ -58,10 +59,7 @@ export default function useStudyPath(studyUuid: UUID | null) { }) .catch((error) => { document.title = initialTitle; - snackError({ - messageTxt: error.message, - headerId: 'LoadStudyAndParentsInfoError', - }); + snackWithFallback(snackError, error, { headerId: 'LoadStudyAndParentsInfoError' }); }); }, [initialTitle, snackError, studyUuid]); const onStudyUpdated = useCallback( diff --git a/src/translations/en.json b/src/translations/en.json index df0010cfd5..545ce083ca 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4,7 +4,7 @@ "debug.header.fileError": "Computation data download failed", "export.message.started": "Export {fileName} started", "export.message.succeeded": "Export {fileName} succeeded", - "export.message.failed": "Export file failed {error}", + "export.message.failed": "Export file failed", "button.delete": "Delete", "button.continue": "Continue", @@ -1037,7 +1037,6 @@ "CopyFromExisting": "Copy from existing equipment", "EquipmentCopied": "Data successfully copied from equipment {equipmentId}", - "EquipmentCopyFailed404": "Equipment copy failed: the equipment was not found", "EquipmentCopyFailed": "Equipment copy failed", "insertNodeAbove": "Above", @@ -1653,5 +1652,5 @@ "PccMinTri": "Pcc min (MVA) ", "IccMinTri": "Icc min (kA)", "rOhm": "r (Ω)", - "xOhm":"x (Ω)" + "xOhm":"x (Ω)" } diff --git a/src/translations/fr.json b/src/translations/fr.json index 082c58f3aa..f7ffb047ab 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -4,7 +4,7 @@ "debug.header.fileError": "Échec du téléchargement des données de calcul", "export.message.started": "Export du {fileName} a commencé", "export.message.succeeded": "Export du {fileName} a réussi", - "export.message.failed": "Échec du téléchargement du fichier {error}", + "export.message.failed": "Échec du téléchargement du fichier", "button.delete": "Supprimer", "button.continue": "Continuer", @@ -1035,7 +1035,6 @@ "CopyFromExisting": "Copier depuis un ouvrage existant", "EquipmentCopied": "Données copiées depuis l'ouvrage {equipmentId}", - "EquipmentCopyFailed404": "Erreur lors de la copie de l'ouvrage : l'ouvrage n'a pas été trouvé", "EquipmentCopyFailed": "Erreur lors de la copie de l'ouvrage", "insertNodeAbove": "Au-dessus",