1- import { useRef , useState } from "react" ;
1+ import { useRef , useState , useEffect } from "react" ;
22import { Icon } from "@iconify/react" ;
33import { Modal } from "../../../components/modal" ;
44import { SettingsSectionContainer , SettingsSectionTitle } from "./components" ;
@@ -104,19 +104,31 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
104104 const { models } = useLanguageModels ( ) ;
105105 const { settings } = useSettingStore ( ) ;
106106
107+ var availableModels = models . filter ( ( m ) => ! Array . from ( settings ?. customModels || [ ] ) . some ( ( cm ) => cm . slug == m . slug ) ) ;
108+ var firstAvailable = availableModels [ 0 ] ?? { slug : "" , name : "" } ;
109+
107110 const [ isEditing , setIsEditing ] = useState ( isNew ) ;
108111 const [ baseUrl , setBaseUrl ] = useState ( customModel ?. baseUrl || "" ) ;
109- const [ slug , setSlug ] = useState ( customModel ?. slug || "" ) ;
112+ const [ slug , setSlug ] = useState ( customModel ?. slug ?? firstAvailable . slug ) ;
110113 const [ apiKey , setApiKey ] = useState ( customModel ?. apiKey || "" ) ;
111114 const [ contextWindow , setContextWindow ] = useState < number > ( customModel ?. contextWindow || 0 ) ;
112115 const [ maxOutput , setMaxOutput ] = useState < number > ( customModel ?. maxOutput || 0 ) ;
113116 const [ inputPrice , setInputPrice ] = useState < number > ( customModel ?. inputPrice || 0 ) ;
114117 const [ outputPrice , setOutputPrice ] = useState < number > ( customModel ?. outputPrice || 0 ) ;
115- const [ modelName , setModelName ] = useState ( isNew ? models [ 0 ] . name : customModel . name ) ;
118+ const [ modelName , setModelName ] = useState ( isNew ? firstAvailable . name : customModel ? .name || "" ) ;
116119 const isModelNameEdited = useRef ( false ) ;
117120
121+ useEffect ( ( ) => {
122+ if ( ! isNew ) return ;
123+ const firstAvailable = availableModels [ 0 ] ?? { slug : "" , name : "" } ;
124+ if ( ! isModelNameEdited . current ) {
125+ setModelName ( firstAvailable . name ) ;
126+ }
127+ setSlug ( firstAvailable . slug ) ;
128+ } , [ models ?. length , settings ?. customModels ?. length , isNew ] ) ;
129+
118130 const baseInputClassName = "hover:cursor-pointer bg-transparent p-1 focus:outline-none" ;
119- const nameInputClassName = `${ baseInputClassName } text-sm text-default-900 font-medium` ;
131+ const nameInputClassName = `${ baseInputClassName } text-sm text-default-900 font-medium flex-1 truncate ` ;
120132 const labelClassName = `${ baseInputClassName } text-xs text-default-900 w-auto` ;
121133 const detailInputClassName = `${ baseInputClassName } text-xs text-default-400 font-normal flex-1` ;
122134
@@ -139,9 +151,11 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
139151 ) ;
140152
141153 if ( isNew ) {
142- setModelName ( models [ 0 ] . name ) ;
154+ availableModels = availableModels . filter ( ( m ) => m . slug != slug ) ;
155+ const next = availableModels [ 0 ] ?? { slug : "" , name : "" } ;
156+ setModelName ( next . name ) ;
143157 setBaseUrl ( "" ) ;
144- setSlug ( "" ) ;
158+ setSlug ( next . slug ) ;
145159 setApiKey ( "" ) ;
146160 setContextWindow ( 0 ) ;
147161 setMaxOutput ( 0 ) ;
@@ -150,7 +164,6 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
150164 }
151165 } ;
152166
153- // TODO: Multiple models per key
154167 return (
155168 < div className = "flex flex-col w-full pl-1" >
156169 < div className = "flex flex-row justify-between" >
@@ -167,7 +180,15 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
167180
168181 { isNew ? (
169182 < Tooltip content = "Add" placement = "bottom" className = "noselect" delay = { 500 } >
170- < button onClick = { ( ) => handleOnChange ( false ) } className = "p-1 hover:bg-default-100 rounded" >
183+ < button
184+ onClick = { ( ) => {
185+ if ( availableModels . length > 0 ) {
186+ handleOnChange ( false ) ;
187+ }
188+ } }
189+ className = "p-1 hover:bg-default-100 rounded"
190+ disabled = { availableModels . length === 0 }
191+ >
171192 < Icon icon = "tabler:device-floppy" width = "16" />
172193 </ button >
173194 </ Tooltip >
@@ -203,23 +224,29 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
203224 disabled = { ! isEditing }
204225 onChange = { ( e ) => {
205226 setSlug ( e . target . value ) ;
206- if ( ! isModelNameEdited . current ) {
227+ if ( ! isModelNameEdited . current && isNew ) {
207228 // Custom name not yet defined, default to the selected model's name
208- setModelName ( models . filter ( ( m ) => m . slug == e . target . value ) [ 0 ] . name ) ;
229+ const m = availableModels . find ( ( mo ) => mo . slug == e . target . value ) ;
230+ if ( m ) setModelName ( m . name ) ;
209231 }
210232 } }
233+ value = { slug }
211234 >
212- { models
213- . filter (
214- ( m ) =>
215- ( ! isNew && m . slug == slug ) ||
216- ! Array . from ( settings ?. customModels || [ ] ) . some ( ( cm ) => cm . slug == m . slug ) ,
217- )
218- . map ( ( m ) => (
219- < option selected = { slug == m . slug } key = { m . slug } value = { m . slug } >
220- { m . slug }
235+ { isNew ? (
236+ availableModels . length > 0 ? (
237+ availableModels . map ( ( m ) => (
238+ < option key = { m . slug } value = { m . slug } >
239+ { m . slug }
240+ </ option >
241+ ) )
242+ ) : (
243+ < option disabled value = "" >
244+ No available models
221245 </ option >
222- ) ) }
246+ )
247+ ) : (
248+ < option > { slug } </ option >
249+ ) }
223250 </ select >
224251 </ div >
225252
0 commit comments