|
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) |
33 |
| - |
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 |
| - ) |
| 23 | + const isStoppingInstance = instance.runState === 'stopping' |
45 | 24 |
|
46 | 25 | const { mutateAsync: stopInstanceAsync } = useApiMutation('instanceStop', {
|
47 | 26 | onSuccess: () => {
|
48 |
| - setIsStoppingInstance(true) |
49 |
| - addToast( |
50 |
| - <> |
51 |
| - Stopping instance <HL>{instance.name}</HL> |
52 |
| - </> |
53 |
| - ) |
| 27 | + addToast(<>Stopping instance <HL>{instance.name}</HL></>) // prettier-ignore |
54 | 28 | },
|
55 | 29 | onError: (error) => {
|
56 | 30 | addToast({
|
57 | 31 | variant: 'error',
|
58 | 32 | title: `Error stopping instance '${instance.name}'`,
|
59 | 33 | content: error.message,
|
60 | 34 | })
|
61 |
| - setIsStoppingInstance(false) |
62 | 35 | },
|
63 | 36 | })
|
64 | 37 |
|
65 |
| - const handleStopInstance = () => { |
66 |
| - stopInstanceAsync({ |
| 38 | + const handleStopInstance = async () => { |
| 39 | + await stopInstanceAsync({ |
67 | 40 | path: { instance: instance.name },
|
68 | 41 | query: { project: instance.projectId },
|
69 | 42 | })
|
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 |
| 43 | + // doing this after means it triggers polling by the top level InstancePage one |
| 44 | + apiQueryClient.invalidateQueries('instanceView') |
89 | 45 | }
|
90 | 46 |
|
91 | 47 | return (
|
|
0 commit comments