1
1
import {
2
2
Alert ,
3
- Button ,
4
3
Card ,
5
4
CardBody ,
6
5
CardFooter ,
@@ -16,6 +15,10 @@ import { FormEvent } from "react";
16
15
import { usePreferredModelWorkspace } from "../hooks/use-preferred-preferred-model" ;
17
16
import { Select , SelectButton } from "@stacklok/ui-kit" ;
18
17
import { useQueryListAllModelsForAllProviders } from "@/hooks/use-query-list-all-models-for-all-providers" ;
18
+ import { FormButtons } from "@/components/FormButtons" ;
19
+ import { invalidateQueries } from "@/lib/react-query-utils" ;
20
+ import { v1GetWorkspaceMuxesQueryKey } from "@/api/generated/@tanstack/react-query.gen" ;
21
+ import { useQueryClient } from "@tanstack/react-query" ;
19
22
20
23
function MissingProviderBanner ( ) {
21
24
return (
@@ -39,30 +42,38 @@ export function WorkspacePreferredModel({
39
42
workspaceName : string ;
40
43
isArchived : boolean | undefined ;
41
44
} ) {
42
- const { preferredModel , setPreferredModel , isPending } =
43
- usePreferredModelWorkspace ( workspaceName ) ;
45
+ const queryClient = useQueryClient ( ) ;
46
+ const { formState , isPending } = usePreferredModelWorkspace ( workspaceName ) ;
44
47
const { mutateAsync } = useMutationPreferredModelWorkspace ( ) ;
45
48
const { data : providerModels = [ ] } = useQueryListAllModelsForAllProviders ( ) ;
46
- const { model, provider_id } = preferredModel ;
47
49
const isModelsEmpty = ! isPending && providerModels . length === 0 ;
48
50
49
51
const handleSubmit = ( event : FormEvent ) => {
50
52
event . preventDefault ( ) ;
51
- mutateAsync ( {
52
- path : { workspace_name : workspaceName } ,
53
- body : [
54
- {
55
- matcher : "" ,
56
- provider_id,
57
- model,
58
- matcher_type : MuxMatcherType . CATCH_ALL ,
59
- } ,
60
- ] ,
61
- } ) ;
53
+ mutateAsync (
54
+ {
55
+ path : { workspace_name : workspaceName } ,
56
+ body : [
57
+ {
58
+ matcher : "" ,
59
+ matcher_type : MuxMatcherType . CATCH_ALL ,
60
+ ...formState . values . preferredModel ,
61
+ } ,
62
+ ] ,
63
+ } ,
64
+ {
65
+ onSuccess : ( ) =>
66
+ invalidateQueries ( queryClient , [ v1GetWorkspaceMuxesQueryKey ] ) ,
67
+ } ,
68
+ ) ;
62
69
} ;
63
70
64
71
return (
65
- < Form onSubmit = { handleSubmit } validationBehavior = "aria" >
72
+ < Form
73
+ onSubmit = { handleSubmit }
74
+ validationBehavior = "aria"
75
+ data-testid = "preferred-model"
76
+ >
66
77
< Card className = { twMerge ( className , "shrink-0" ) } >
67
78
< CardBody className = "flex flex-col gap-6" >
68
79
< div className = "flex flex-col justify-start" >
@@ -84,16 +95,18 @@ export function WorkspacePreferredModel({
84
95
isRequired
85
96
isDisabled = { isModelsEmpty }
86
97
className = "w-full"
87
- selectedKey = { preferredModel ?. model }
98
+ selectedKey = { formState . values . preferredModel ?. model }
88
99
placeholder = "Select the model"
89
100
onSelectionChange = { ( model ) => {
90
101
const preferredModelProvider = providerModels . find (
91
102
( item ) => item . name === model ,
92
103
) ;
93
104
if ( preferredModelProvider ) {
94
- setPreferredModel ( {
95
- model : preferredModelProvider . name ,
96
- provider_id : preferredModelProvider . provider_id ,
105
+ formState . updateFormValues ( {
106
+ preferredModel : {
107
+ model : preferredModelProvider . name ,
108
+ provider_id : preferredModelProvider . provider_id ,
109
+ } ,
97
110
} ) ;
98
111
}
99
112
} }
@@ -109,9 +122,11 @@ export function WorkspacePreferredModel({
109
122
</ div >
110
123
</ CardBody >
111
124
< CardFooter className = "justify-end" >
112
- < Button isDisabled = { isArchived || isModelsEmpty } type = "submit" >
113
- Save
114
- </ Button >
125
+ < FormButtons
126
+ isPending = { isPending }
127
+ formState = { formState }
128
+ canSubmit = { ! isArchived }
129
+ />
115
130
</ CardFooter >
116
131
</ Card >
117
132
</ Form >
0 commit comments