diff --git a/src/components/computing-status/use-all-computing-status.ts b/src/components/computing-status/use-all-computing-status.ts index 84247aa2ac..2e002e9e33 100644 --- a/src/components/computing-status/use-all-computing-status.ts +++ b/src/components/computing-status/use-all-computing-status.ts @@ -20,7 +20,7 @@ import { } from '../utils/running-status'; import type { UUID } from 'node:crypto'; -import { ComputingType } from '@gridsuite/commons-ui'; +import { BuildStatus, ComputingType } from '@gridsuite/commons-ui'; import { fetchSensitivityAnalysisStatus } from '../../services/study/sensitivity-analysis'; import { fetchSecurityAnalysisStatus } from '../../services/study/security-analysis'; import { fetchDynamicSimulationStatus } from '../../services/study/dynamic-simulation'; @@ -126,7 +126,12 @@ export const stateEstimationResultInvalidations = [NotificationType.STATE_ESTIMA export const pccMinResultInvalidations = [NotificationType.PCC_MIN_RESULT]; // this hook loads all current computation status into redux then keeps them up to date according to notifications -export const useAllComputingStatus = (studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): void => { +export const useAllComputingStatus = ( + studyUuid: UUID, + currentNodeUuid: UUID, + currentRootNetworkUuid: UUID, + currentNodeStatusBuildStatus: BuildStatus +): void => { const securityAnalysisAvailability = useOptionalServiceStatus(OptionalServicesNames.SecurityAnalysis); const sensitivityAnalysisAvailability = useOptionalServiceStatus(OptionalServicesNames.SensitivityAnalysis); const dynamicSimulationAvailability = useOptionalServiceStatus(OptionalServicesNames.DynamicSimulation); @@ -294,6 +299,7 @@ export const useAllComputingStatus = (studyUuid: UUID, currentNodeUuid: UUID, cu studyUuid, currentNodeUuid, currentRootNetworkUuid, + currentNodeStatusBuildStatus, fetchAllComputationStatus, fetchLoadFlowComputationInfosMap ); diff --git a/src/components/computing-status/use-computing-status-at-once.ts b/src/components/computing-status/use-computing-status-at-once.ts index ee397347a0..095ecd4a43 100644 --- a/src/components/computing-status/use-computing-status-at-once.ts +++ b/src/components/computing-status/use-computing-status-at-once.ts @@ -9,7 +9,7 @@ import { getComputationRunningStatus, RunningStatus } from 'components/utils/run import type { UUID } from 'node:crypto'; import { RefObject, useCallback, useEffect, useRef } from 'react'; import { useDispatch } from 'react-redux'; -import { ComputingType, NotificationsUrlKeys, useNotificationsListener } from '@gridsuite/commons-ui'; +import { BuildStatus, ComputingType, NotificationsUrlKeys, useNotificationsListener } from '@gridsuite/commons-ui'; import { setComputingStatus, setComputingStatusParameters, setLastCompletedComputation } from '../../redux/actions'; import { AppDispatch } from '../../redux/store'; import { parseEventData, StudyUpdatedEventData } from '../../types/notification-types'; @@ -20,6 +20,7 @@ interface UseComputingStatusProps { studyUuid: UUID, nodeUuid: UUID, currentRootNetworkUuid: UUID, + currentNodeBuildStatus: BuildStatus, computingStatusFetcher: ( studyUuid: UUID, nodeUuid: UUID, @@ -37,11 +38,16 @@ function isWorthUpdate( nodeUuidRef: RefObject, rootNetworkUuidRef: RefObject, nodeUuid: UUID, - currentRootNetworkUuid: UUID + currentRootNetworkUuid: UUID, + notificationNode: UUID | undefined ): boolean { if (rootNetworkUuidRef.current !== currentRootNetworkUuid) { return true; } + // if notification is about a node that is not current node, no need to update current node computation status + if (notificationNode && notificationNode !== nodeUuid) { + return false; + } if (nodeUuidRef.current !== nodeUuid) { return true; } @@ -67,6 +73,7 @@ const shouldRequestBeCanceled = ( * this hook loads all state into redux at once, then updates it according to notifications for all computation * @param studyUuid current study uuid * @param nodeUuid current node uuid + * @param currentNodeBuildStatus * @param allComputingStatusFetcher method fetching all state * @param currentRootNetworkUuid * @param computingStatusParametersFetcherMap @@ -75,6 +82,7 @@ export const useAllComputingStatusAtOnce: UseComputingStatusProps = ( studyUuid, nodeUuid, currentRootNetworkUuid, + currentNodeBuildStatus, allComputingStatusFetcher, computingStatusParametersFetcherMap ) => { @@ -202,18 +210,28 @@ export const useAllComputingStatusAtOnce: UseComputingStatusProps = ( const eventData = parseEventData(event ?? null); const headers = eventData?.headers; const updateType = headers?.updateType; + const notificationNode = headers?.node; + // no need to request the back if node is not built + if (currentNodeBuildStatus === BuildStatus.NOT_BUILT) { + Object.values(ComputingType).forEach((computingType: ComputingType) => { + dispatch(setComputingStatus(computingType, RunningStatus.IDLE)); + }); + nodeUuidRef.current = nodeUuid; + return; + } const isUpdateForUs = isWorthUpdate( updateType, nodeUuidRef, rootNetworkUuidRef, nodeUuid, - currentRootNetworkUuid + currentRootNetworkUuid, + notificationNode ); if (isUpdateForUs) { updateAll(updateType); } }, - [currentRootNetworkUuid, nodeUuid, studyUuid, updateAll] + [currentNodeBuildStatus, currentRootNetworkUuid, dispatch, nodeUuid, studyUuid, updateAll] ); // evaluate at each notification diff --git a/src/components/study-container.jsx b/src/components/study-container.jsx index f8d5224c9e..37c39a08fa 100644 --- a/src/components/study-container.jsx +++ b/src/components/study-container.jsx @@ -157,8 +157,7 @@ export function StudyContainer() { const currentNodeRef = useRef(); const currentRootNetworkUuidRef = useRef(); - - useAllComputingStatus(studyUuid, currentNode?.id, currentRootNetworkUuid); + useAllComputingStatus(studyUuid, currentNode?.id, currentRootNetworkUuid, currentNode?.data.globalBuildStatus); const { snackError, snackWarning, snackInfo } = useSnackMessage();