Skip to content

Commit 2f72238

Browse files
committed
simplify some of the instance state business
1 parent 7581cf4 commit 2f72238

File tree

3 files changed

+23
-64
lines changed

3 files changed

+23
-64
lines changed

app/components/StopInstancePrompt.tsx

Lines changed: 13 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,89 +5,38 @@
55
*
66
* Copyright Oxide Computer Company
77
*/
8-
import { useEffect, useState, type ReactNode } from 'react'
8+
import { type ReactNode } from 'react'
99

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'
1711

1812
import { HL } from '~/components/HL'
1913
import { addToast } from '~/stores/toast'
2014
import { Button } from '~/ui/lib/Button'
2115
import { Message } from '~/ui/lib/Message'
2216

23-
const POLL_INTERVAL_FAST = 2000 // 2 seconds
24-
2517
type StopInstancePromptProps = {
2618
instance: Instance
2719
children: ReactNode
2820
}
2921

3022
export function StopInstancePrompt({ instance, children }: StopInstancePromptProps) {
31-
const queryClient = useApiQueryClient()
32-
const [isStoppingInstance, setIsStoppingInstance] = useState(false)
23+
const isStoppingInstance = instance.runState === 'stopping'
3324

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', {
4726
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
5430
},
5531
onError: (error) => {
5632
addToast({
5733
variant: 'error',
5834
title: `Error stopping instance '${instance.name}'`,
5935
content: error.message,
6036
})
61-
setIsStoppingInstance(false)
6237
},
6338
})
6439

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-
9140
return (
9241
<Message
9342
variant="notice"
@@ -98,7 +47,12 @@ export function StopInstancePrompt({ instance, children }: StopInstancePromptPro
9847
size="xs"
9948
className="mt-3"
10049
variant="notice"
101-
onClick={handleStopInstance}
50+
onClick={() =>
51+
stopInstance.mutateAsync({
52+
path: { instance: instance.name },
53+
query: { project: instance.projectId },
54+
})
55+
}
10256
loading={isStoppingInstance}
10357
>
10458
Stop instance

app/forms/disk-attach.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type AttachDiskProps = {
2626
diskNamesToExclude?: string[]
2727
loading?: boolean
2828
submitError?: ApiError | null
29-
instance: Instance
29+
instance?: Instance
3030
}
3131

3232
/**
@@ -70,12 +70,16 @@ export function AttachDiskModalForm({
7070
onSubmit={onSubmit}
7171
width="medium"
7272
submitDisabled={
73-
!instanceCan.attachDisk(instance) ? 'Instance must be stopped' : undefined
73+
instance && !instanceCan.attachDisk(instance)
74+
? 'Instance must be stopped'
75+
: undefined
7476
}
7577
>
76-
<StopInstancePrompt instance={instance}>
77-
An instance must be stopped to attach a disk.
78-
</StopInstancePrompt>
78+
{instance && ['stopping', 'running'].includes(instance.runState) && (
79+
<StopInstancePrompt instance={instance}>
80+
An instance must be stopped to attach a disk.
81+
</StopInstancePrompt>
82+
)}
7983
<ComboboxField
8084
label="Disk name"
8185
placeholder="Select a disk"

app/pages/project/instances/StorageTab.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ export default function StorageTab() {
382382
}}
383383
loading={attachDisk.isPending}
384384
submitError={attachDisk.error}
385+
instance={instance}
385386
/>
386387
)}
387388
</div>

0 commit comments

Comments
 (0)