11// Copyright (c) Cosmo Tech.
22// Licensed under the MIT license.
3- import React , { useCallback } from 'react' ;
3+ import React , { useCallback , useMemo } from 'react' ;
44import { useFormState } from 'react-hook-form' ;
55import { useTranslation } from 'react-i18next' ;
66import PlayCircleOutlineIcon from '@mui/icons-material/PlayCircleOutline' ;
77import { Button , Grid } from '@mui/material' ;
8- import { PermissionsGate } from '@cosmotech/ui' ;
8+ import { FadingTooltip , PermissionsGate } from '@cosmotech/ui' ;
99import { useUpdateParameters } from '../../../../../../hooks/ScenarioParametersHooks' ;
1010import { useUserAppAndCurrentScenarioPermissions } from '../../../../../../hooks/SecurityHooks' ;
11- import { SCENARIO_RUN_STATE } from '../../../../../../services/config/ApiConstants' ;
11+ import { INGESTION_STATUS , SCENARIO_RUN_STATE } from '../../../../../../services/config/ApiConstants' ;
1212import { ACL_PERMISSIONS } from '../../../../../../services/config/accessControl' ;
1313import { useSetApplicationErrorMessage } from '../../../../../../state/hooks/ApplicationHooks' ;
14+ import { useDatasets } from '../../../../../../state/hooks/DatasetHooks' ;
1415import {
16+ useCurrentScenarioDatasetList ,
1517 useCurrentScenarioId ,
1618 useCurrentScenarioState ,
1719 useLaunchScenario ,
@@ -29,6 +31,15 @@ export const LaunchButton = () => {
2931 const setApplicationErrorMessage = useSetApplicationErrorMessage ( ) ;
3032 const launchScenario = useLaunchScenario ( ) ;
3133 const userAppAndCurrentScenarioPermissions = useUserAppAndCurrentScenarioPermissions ( ) ;
34+ const currentScenarioDatasetList = useCurrentScenarioDatasetList ( ) ;
35+ const datasets = useDatasets ( ) ;
36+ const isCurrentScenarioDatasetUnavailable = useMemo ( ( ) => {
37+ if ( currentScenarioDatasetList && currentScenarioDatasetList ?. length > 0 ) {
38+ const currentScenarioDataset = datasets ?. find ( ( dataset ) => dataset . id === currentScenarioDatasetList ?. [ 0 ] ) ;
39+ return ! currentScenarioDataset || currentScenarioDataset ?. ingestionStatus === INGESTION_STATUS . ERROR ;
40+ }
41+ return false ;
42+ } , [ currentScenarioDatasetList , datasets ] ) ;
3243
3344 const isCurrentScenarioRunning =
3445 currentScenarioState === SCENARIO_RUN_STATE . RUNNING ||
@@ -73,21 +84,32 @@ export const LaunchButton = () => {
7384 necessaryPermissions = { [ ACL_PERMISSIONS . SCENARIO . LAUNCH ] }
7485 >
7586 < Grid item >
76- < Button
77- data-cy = "launch-scenario-button"
78- variant = "contained"
79- startIcon = { < PlayCircleOutlineIcon /> }
80- onClick = { launchCurrentScenario }
81- disabled = { ! isValid }
87+ < FadingTooltip
88+ title = {
89+ isCurrentScenarioDatasetUnavailable
90+ ? t (
91+ 'commoncomponents.button.scenario.parameters.launchDisabled' ,
92+ "The scenario cannot be run because its dataset isn't found or its data ingestion has failed"
93+ )
94+ : ''
95+ }
8296 >
83- { isDirty ? (
84- < span data-cy = "save-and-launch-label" >
85- { t ( 'commoncomponents.button.scenario.parameters.update.launch' , 'SAVE AND LAUNCH' ) }
86- </ span >
87- ) : (
88- < span data-cy = "launch-label" > { t ( 'commoncomponents.button.scenario.parameters.launch' , 'LAUNCH' ) } </ span >
89- ) }
90- </ Button >
97+ < Button
98+ data-cy = "launch-scenario-button"
99+ variant = "contained"
100+ startIcon = { < PlayCircleOutlineIcon /> }
101+ onClick = { launchCurrentScenario }
102+ disabled = { ! isValid || isCurrentScenarioDatasetUnavailable }
103+ >
104+ { isDirty ? (
105+ < span data-cy = "save-and-launch-label" >
106+ { t ( 'commoncomponents.button.scenario.parameters.update.launch' , 'SAVE AND LAUNCH' ) }
107+ </ span >
108+ ) : (
109+ < span data-cy = "launch-label" > { t ( 'commoncomponents.button.scenario.parameters.launch' , 'LAUNCH' ) } </ span >
110+ ) }
111+ </ Button >
112+ </ FadingTooltip >
91113 </ Grid >
92114 </ PermissionsGate >
93115 ) : null ;
0 commit comments