5
5
*
6
6
* Copyright Oxide Computer Company
7
7
*/
8
- import { useEffect , useState , type ReactNode } from 'react'
8
+ import { type ReactNode } from 'react'
9
9
10
- import {
11
- instanceTransitioning ,
12
- useApiMutation ,
13
- useApiQuery ,
14
- useApiQueryClient ,
15
- type Instance ,
16
- } from '@oxide/api'
10
+ import { apiQueryClient , useApiMutation , type Instance } from '@oxide/api'
17
11
18
12
import { HL } from '~/components/HL'
19
13
import { addToast } from '~/stores/toast'
20
14
import { Button } from '~/ui/lib/Button'
21
15
import { Message } from '~/ui/lib/Message'
22
16
23
- const POLL_INTERVAL_FAST = 2000 // 2 seconds
24
-
25
17
type StopInstancePromptProps = {
26
18
instance : Instance
27
19
children : ReactNode
28
20
}
29
21
30
22
export function StopInstancePrompt ( { instance, children } : StopInstancePromptProps ) {
31
- const queryClient = useApiQueryClient ( )
32
- const [ isStoppingInstance , setIsStoppingInstance ] = useState ( false )
23
+ const isStoppingInstance = instance . runState === 'stopping'
33
24
34
- const { data } = useApiQuery (
35
- 'instanceView' ,
36
- {
37
- path : { instance : instance . name } ,
38
- query : { project : instance . projectId } ,
39
- } ,
40
- {
41
- refetchInterval :
42
- isStoppingInstance || instanceTransitioning ( instance ) ? POLL_INTERVAL_FAST : false ,
43
- }
44
- )
45
-
46
- const { mutateAsync : stopInstanceAsync } = useApiMutation ( 'instanceStop' , {
25
+ const stopInstance = useApiMutation ( 'instanceStop' , {
47
26
onSuccess : ( ) => {
48
- setIsStoppingInstance ( true )
49
- addToast (
50
- < >
51
- Stopping instance < HL > { instance . name } </ HL >
52
- </ >
53
- )
27
+ // trigger polling by the top level InstancePage one
28
+ apiQueryClient . invalidateQueries ( 'instanceView' )
29
+ addToast ( < > Stopping instance < HL > { instance . name } </ HL > </ > ) // prettier-ignore
54
30
} ,
55
31
onError : ( error ) => {
56
32
addToast ( {
57
33
variant : 'error' ,
58
34
title : `Error stopping instance '${ instance . name } '` ,
59
35
content : error . message ,
60
36
} )
61
- setIsStoppingInstance ( false )
62
37
} ,
63
38
} )
64
39
65
- const handleStopInstance = ( ) => {
66
- stopInstanceAsync ( {
67
- path : { instance : instance . name } ,
68
- query : { project : instance . projectId } ,
69
- } )
70
- }
71
-
72
- const currentInstance = data || instance
73
-
74
- useEffect ( ( ) => {
75
- if ( ! data ) {
76
- return
77
- }
78
- if ( isStoppingInstance && data . runState === 'stopped' ) {
79
- queryClient . invalidateQueries ( 'instanceView' )
80
- setIsStoppingInstance ( false )
81
- }
82
- } , [ isStoppingInstance , data , queryClient ] )
83
-
84
- if (
85
- ! currentInstance ||
86
- ( currentInstance . runState !== 'stopping' && currentInstance . runState !== 'running' )
87
- ) {
88
- return null
89
- }
90
-
91
40
return (
92
41
< Message
93
42
variant = "notice"
@@ -98,7 +47,12 @@ export function StopInstancePrompt({ instance, children }: StopInstancePromptPro
98
47
size = "xs"
99
48
className = "mt-3"
100
49
variant = "notice"
101
- onClick = { handleStopInstance }
50
+ onClick = { ( ) =>
51
+ stopInstance . mutateAsync ( {
52
+ path : { instance : instance . name } ,
53
+ query : { project : instance . projectId } ,
54
+ } )
55
+ }
102
56
loading = { isStoppingInstance }
103
57
>
104
58
Stop instance
0 commit comments