@@ -17,7 +17,6 @@ import Cookies from 'js-cookie';
1717import * as Tooltip from '@radix-ui/react-tooltip' ;
1818
1919import styles from './BaseChat.module.scss' ;
20- import type { ProviderInfo } from '~/utils/types' ;
2120import { ExportChatButton } from '~/components/chat/chatExportAndImport/ExportChatButton' ;
2221import { ImportButtons } from '~/components/chat/chatExportAndImport/ImportButtons' ;
2322import { ExamplePrompts } from '~/components/chat/ExamplePrompts' ;
@@ -26,6 +25,7 @@ import GitCloneButton from './GitCloneButton';
2625import FilePreview from './FilePreview' ;
2726import { ModelSelector } from '~/components/chat/ModelSelector' ;
2827import { SpeechRecognitionButton } from '~/components/chat/SpeechRecognition' ;
28+ import type { IProviderSetting , ProviderInfo } from '~/types/model' ;
2929
3030const TEXTAREA_MIN_HEIGHT = 76 ;
3131
@@ -45,6 +45,7 @@ interface BaseChatProps {
4545 setModel ?: ( model : string ) => void ;
4646 provider ?: ProviderInfo ;
4747 setProvider ?: ( provider : ProviderInfo ) => void ;
48+ providerList ?: ProviderInfo [ ] ;
4849 handleStop ?: ( ) => void ;
4950 sendMessage ?: ( event : React . UIEvent , messageInput ?: string ) => void ;
5051 handleInputChange ?: ( event : React . ChangeEvent < HTMLTextAreaElement > ) => void ;
@@ -70,6 +71,7 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
7071 setModel,
7172 provider,
7273 setProvider,
74+ providerList,
7375 input = '' ,
7476 enhancingPrompt,
7577 handleInputChange,
@@ -108,48 +110,10 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
108110 const [ recognition , setRecognition ] = useState < SpeechRecognition | null > ( null ) ;
109111 const [ transcript , setTranscript ] = useState ( '' ) ;
110112
111- // Load enabled providers from cookies
112- const [ enabledProviders , setEnabledProviders ] = useState ( ( ) => {
113- const savedProviders = Cookies . get ( 'providers' ) ;
114-
115- if ( savedProviders ) {
116- try {
117- const parsedProviders = JSON . parse ( savedProviders ) ;
118- return PROVIDER_LIST . filter ( ( p ) => parsedProviders [ p . name ] ) ;
119- } catch ( error ) {
120- console . error ( 'Failed to parse providers from cookies:' , error ) ;
121- return PROVIDER_LIST ;
122- }
123- }
124-
125- return PROVIDER_LIST ;
126- } ) ;
127-
128- // Update enabled providers when cookies change
129- useEffect ( ( ) => {
130- const updateProvidersFromCookies = ( ) => {
131- const savedProviders = Cookies . get ( 'providers' ) ;
132-
133- if ( savedProviders ) {
134- try {
135- const parsedProviders = JSON . parse ( savedProviders ) ;
136- setEnabledProviders ( PROVIDER_LIST . filter ( ( p ) => parsedProviders [ p . name ] ) ) ;
137- } catch ( error ) {
138- console . error ( 'Failed to parse providers from cookies:' , error ) ;
139- }
140- }
141- } ;
142-
143- updateProvidersFromCookies ( ) ;
144-
145- const interval = setInterval ( updateProvidersFromCookies , 1000 ) ;
146-
147- return ( ) => clearInterval ( interval ) ;
148- } , [ PROVIDER_LIST ] ) ;
149-
150113 useEffect ( ( ) => {
151114 console . log ( transcript ) ;
152115 } , [ transcript ] ) ;
116+
153117 useEffect ( ( ) => {
154118 // Load API keys from cookies on component mount
155119 try {
@@ -169,7 +133,26 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
169133 Cookies . remove ( 'apiKeys' ) ;
170134 }
171135
172- initializeModelList ( ) . then ( ( modelList ) => {
136+ let providerSettings : Record < string , IProviderSetting > | undefined = undefined ;
137+
138+ try {
139+ const savedProviderSettings = Cookies . get ( 'providers' ) ;
140+
141+ if ( savedProviderSettings ) {
142+ const parsedProviderSettings = JSON . parse ( savedProviderSettings ) ;
143+
144+ if ( typeof parsedProviderSettings === 'object' && parsedProviderSettings !== null ) {
145+ providerSettings = parsedProviderSettings ;
146+ }
147+ }
148+ } catch ( error ) {
149+ console . error ( 'Error loading Provider Settings from cookies:' , error ) ;
150+
151+ // Clear invalid cookie data
152+ Cookies . remove ( 'providers' ) ;
153+ }
154+
155+ initializeModelList ( providerSettings ) . then ( ( modelList ) => {
173156 setModelList ( modelList ) ;
174157 } ) ;
175158
@@ -369,10 +352,10 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
369352 modelList = { modelList }
370353 provider = { provider }
371354 setProvider = { setProvider }
372- providerList = { PROVIDER_LIST }
355+ providerList = { providerList || PROVIDER_LIST }
373356 apiKeys = { apiKeys }
374357 />
375- { enabledProviders . length > 0 && provider && (
358+ { ( providerList || [ ] ) . length > 0 && provider && (
376359 < APIKeyManager
377360 provider = { provider }
378361 apiKey = { apiKeys [ provider . name ] || '' }
@@ -468,7 +451,7 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
468451 < SendButton
469452 show = { input . length > 0 || isStreaming || uploadedFiles . length > 0 }
470453 isStreaming = { isStreaming }
471- disabled = { enabledProviders . length === 0 }
454+ disabled = { ! providerList || providerList . length === 0 }
472455 onClick = { ( event ) => {
473456 if ( isStreaming ) {
474457 handleStop ?.( ) ;
@@ -528,7 +511,7 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
528511 ! isModelSettingsCollapsed ,
529512 } ) }
530513 onClick = { ( ) => setIsModelSettingsCollapsed ( ! isModelSettingsCollapsed ) }
531- disabled = { enabledProviders . length === 0 }
514+ disabled = { ! providerList || providerList . length === 0 }
532515 >
533516 < div className = { `i-ph:caret-${ isModelSettingsCollapsed ? 'right' : 'down' } text-lg` } />
534517 { isModelSettingsCollapsed ? < span className = "text-xs" > { model } </ span > : < span /> }
0 commit comments