Skip to content

Commit c8a7ed9

Browse files
authored
Merge pull request #645 from wonderwhy-er/pr-620
refactor: refactored Setting component, added useSettings Hook to get settings details from one single place
2 parents 64eee11 + 17e5003 commit c8a7ed9

File tree

18 files changed

+597
-522
lines changed

18 files changed

+597
-522
lines changed

app/components/chat/BaseChat.tsx

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import Cookies from 'js-cookie';
1717
import * as Tooltip from '@radix-ui/react-tooltip';
1818

1919
import styles from './BaseChat.module.scss';
20-
import type { ProviderInfo } from '~/utils/types';
2120
import { ExportChatButton } from '~/components/chat/chatExportAndImport/ExportChatButton';
2221
import { ImportButtons } from '~/components/chat/chatExportAndImport/ImportButtons';
2322
import { ExamplePrompts } from '~/components/chat/ExamplePrompts';
@@ -26,6 +25,7 @@ import GitCloneButton from './GitCloneButton';
2625
import FilePreview from './FilePreview';
2726
import { ModelSelector } from '~/components/chat/ModelSelector';
2827
import { SpeechRecognitionButton } from '~/components/chat/SpeechRecognition';
28+
import type { IProviderSetting, ProviderInfo } from '~/types/model';
2929

3030
const 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 />}

app/components/chat/Chat.client.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import { cubicEasingFn } from '~/utils/easings';
1717
import { createScopedLogger, renderLogger } from '~/utils/logger';
1818
import { BaseChat } from './BaseChat';
1919
import Cookies from 'js-cookie';
20-
import type { ProviderInfo } from '~/utils/types';
2120
import { debounce } from '~/utils/debounce';
21+
import { useSettings } from '~/lib/hooks/useSettings';
22+
import type { ProviderInfo } from '~/types/model';
2223

2324
const toastAnimation = cssTransition({
2425
enter: 'animated fadeInRight',
@@ -91,6 +92,7 @@ export const ChatImpl = memo(
9192
const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
9293
const [uploadedFiles, setUploadedFiles] = useState<File[]>([]); // Move here
9394
const [imageDataList, setImageDataList] = useState<string[]>([]); // Move here
95+
const { activeProviders } = useSettings();
9496

9597
const [model, setModel] = useState(() => {
9698
const savedModel = Cookies.get('selectedModel');
@@ -316,6 +318,7 @@ export const ChatImpl = memo(
316318
setModel={handleModelChange}
317319
provider={provider}
318320
setProvider={handleProviderChange}
321+
providerList={activeProviders}
319322
messageRef={messageRef}
320323
scrollRef={scrollRef}
321324
handleInputChange={(e) => {

app/components/settings/Settings.module.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
padding: 1rem;
4747
margin-bottom: 1rem;
4848
border-style: solid;
49-
border-color: var(--bolt-elements-button-danger-backgroundHover) ;
49+
border-color: var(--bolt-elements-button-danger-backgroundHover);
5050
border-width: thin;
5151

5252
button {
@@ -60,4 +60,4 @@
6060
background-color: var(--bolt-elements-button-danger-backgroundHover);
6161
}
6262
}
63-
}
63+
}

0 commit comments

Comments
 (0)