Skip to content

Commit 97b0137

Browse files
committed
move instanceList fetching up a level; use to disable button when no instances available
1 parent d1f7945 commit 97b0137

2 files changed

Lines changed: 15 additions & 32 deletions

File tree

app/forms/anti-affinity-group-member-add.tsx

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,26 @@
77
*/
88

99
import { useForm } from 'react-hook-form'
10-
import type { LoaderFunctionArgs } from 'react-router'
1110

12-
import { queryClient, useApiMutation, usePrefetchedQuery } from '~/api'
11+
import { queryClient, useApiMutation, type Instance } from '~/api'
1312
import { ComboboxField } from '~/components/form/fields/ComboboxField'
1413
import { HL } from '~/components/HL'
15-
import {
16-
getAntiAffinityGroupSelector,
17-
useAntiAffinityGroupSelector,
18-
} from '~/hooks/use-params'
14+
import { useAntiAffinityGroupSelector } from '~/hooks/use-params'
1915
import { addToast } from '~/stores/toast'
2016
import { toComboboxItems } from '~/ui/lib/Combobox'
2117
import { Modal } from '~/ui/lib/Modal'
2218

23-
import {
24-
affinityGroupList,
25-
antiAffinityGroupMemberList,
26-
instanceList,
27-
} from './affinity-util'
28-
29-
export async function clientLoader({ params }: LoaderFunctionArgs) {
30-
const { antiAffinityGroup, project } = getAntiAffinityGroupSelector(params)
31-
await Promise.all([
32-
queryClient.prefetchQuery(antiAffinityGroupMemberList({ antiAffinityGroup, project })),
33-
queryClient.prefetchQuery(instanceList({ project })),
34-
queryClient.prefetchQuery(affinityGroupList({ project })),
35-
])
36-
return null
37-
}
38-
3919
export function AddAntiAffinityGroupMemberForm({
20+
availableInstances,
4021
isModalOpen,
4122
setIsModalOpen,
4223
}: {
24+
availableInstances: Instance[]
4325
isModalOpen: boolean
4426
setIsModalOpen: (open: boolean) => void
4527
}) {
4628
const { project, antiAffinityGroup } = useAntiAffinityGroupSelector()
4729

48-
const { data: members } = usePrefetchedQuery(
49-
antiAffinityGroupMemberList({ antiAffinityGroup, project })
50-
)
51-
const { data: instances } = usePrefetchedQuery(instanceList({ project }))
52-
// Construct a list of all instances not currently in this anti-affinity group.
53-
const availableInstances = instances.items.filter(
54-
(instance) => !members.items.some(({ value }) => value.name === instance.name)
55-
)
56-
5730
const form = useForm({
5831
defaultValues: {
5932
antiAffinityGroupMember: '',

app/pages/project/affinity/AntiAffinityGroupPage.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ export default function AntiAffinityPage() {
8787
)
8888
const membersCount = members.items.length
8989

90+
const { data: instances } = usePrefetchedQuery(instanceList({ project }))
91+
// Construct a list of all instances not currently in this anti-affinity group.
92+
const availableInstances = instances.items
93+
.filter((instance) => !members.items.some(({ value }) => value.name === instance.name))
94+
.sort((a, b) => a.name.localeCompare(b.name))
95+
9096
const { mutateAsync: removeMember } = useApiMutation(
9197
'antiAffinityGroupMemberInstanceDelete',
9298
{
@@ -176,7 +182,10 @@ export default function AntiAffinityPage() {
176182
title="Members"
177183
description="Instances in this anti-affinity group"
178184
>
179-
<CreateButton onClick={() => setIsModalOpen(true)}>
185+
<CreateButton
186+
onClick={() => setIsModalOpen(true)}
187+
disabled={!availableInstances.length}
188+
>
180189
Add instance to group
181190
</CreateButton>
182191
</CardBlock.Header>
@@ -185,6 +194,7 @@ export default function AntiAffinityPage() {
185194
</CardBlock.Body>
186195
</CardBlock>
187196
<AddAntiAffinityGroupMemberForm
197+
availableInstances={availableInstances}
188198
isModalOpen={isModalOpen}
189199
setIsModalOpen={setIsModalOpen}
190200
/>

0 commit comments

Comments
 (0)