@@ -2,7 +2,7 @@ import React, {useEffect, useState} from 'react';
22
33import { useDataManager } from '@gravity-ui/data-source' ;
44import { House } from '@gravity-ui/icons' ;
5- import { matchPath } from 'react-router-dom' ;
5+ import { matchPath , useSearchParams } from 'react-router-dom' ;
66
77import type { InstanceWithProviderStatus } from '../../../../shared/common' ;
88import { uiRoutes } from '../../../../shared/uiRoutes' ;
@@ -14,14 +14,57 @@ import {useInstanceActions} from '../actions';
1414import { i18n } from './i18n' ;
1515
1616const toastName = 'stop-instance-alert' ;
17+ const autoStartToastName = 'auto-start-instance-alert' ;
18+
19+ const showErrorToast = ( err : Error ) => {
20+ toaster . add ( {
21+ name : 'error-toast-start-instance' ,
22+ title : i18nInstanceActions ( 'start-instance-error' ) ,
23+ content : err . message ,
24+ theme : 'danger' ,
25+ } ) ;
26+ } ;
1727
1828export const useInstanceStopWarning = ( instance ?: InstanceWithProviderStatus ) => {
1929 const { startInstance} = useInstanceActions ( ) ;
30+ const [ searchParams ] = useSearchParams ( ) ;
2031 const dataManager = useDataManager ( ) ;
2132 const [ isToastVisible , setIsToastVisible ] = useState ( false ) ;
33+ const retpath = searchParams . get ( 'retpath' ) ?? '' ;
34+ const autoStartEnable = Boolean ( retpath ) ;
2235
2336 useEffect ( ( ) => {
24- if ( instance ?. providerStatus === 'stopped' && ! isToastVisible && ! toaster . has ( toastName ) ) {
37+ if ( instance ?. providerStatus === 'running' && autoStartEnable ) {
38+ window . location . href = retpath ;
39+ }
40+
41+ if (
42+ instance ?. providerStatus === 'stopped' &&
43+ ! isToastVisible &&
44+ ! toaster . has ( autoStartToastName ) &&
45+ autoStartEnable
46+ ) {
47+ setIsToastVisible ( true ) ; // so that the toast is not recreated with every render
48+
49+ startInstance ( instance )
50+ . then ( ( ) => {
51+ toaster . add ( {
52+ name : autoStartToastName ,
53+ title : i18nInstanceActions ( 'starting' ) ,
54+ content : i18nInstanceActions ( 'auto-start-instance-description' ) ,
55+ theme : 'info' ,
56+ autoHiding : 4000 ,
57+ } ) ;
58+ } )
59+ . catch ( ( err ) => showErrorToast ( err ) ) ;
60+ }
61+
62+ if (
63+ instance ?. providerStatus === 'stopped' &&
64+ ! isToastVisible &&
65+ ! toaster . has ( toastName ) &&
66+ ! autoStartEnable
67+ ) {
2568 setIsToastVisible ( true ) ; // so that the toast is not recreated with every render
2669
2770 toaster . add ( {
@@ -33,11 +76,13 @@ export const useInstanceStopWarning = (instance?: InstanceWithProviderStatus) =>
3376 {
3477 label : i18nInstanceActions ( 'start' ) ,
3578 onClick : ( ) => {
36- startInstance ( instance ) . then ( ( ) => {
37- setTimeout ( ( ) => {
38- setIsToastVisible ( false ) ;
39- } , 1000 ) ;
40- } ) ;
79+ startInstance ( instance )
80+ . then ( ( ) => {
81+ setTimeout ( ( ) => {
82+ setIsToastVisible ( false ) ;
83+ } , 1000 ) ;
84+ } )
85+ . catch ( ( err ) => showErrorToast ( err ) ) ;
4186 } ,
4287 } ,
4388 ] ,
@@ -47,8 +92,9 @@ export const useInstanceStopWarning = (instance?: InstanceWithProviderStatus) =>
4792 if ( instance ?. providerStatus !== 'stopped' ) {
4893 setIsToastVisible ( false ) ;
4994 toaster . remove ( toastName ) ;
95+ toaster . remove ( autoStartToastName ) ;
5096 }
51- } , [ instance , dataManager , isToastVisible , startInstance ] ) ;
97+ } , [ instance , dataManager , isToastVisible , startInstance , autoStartEnable , retpath ] ) ;
5298
5399 useEffect ( ( ) => {
54100 return ( ) => {
0 commit comments