Skip to content

Commit c1f6cc6

Browse files
committed
Function: Handle custom provider create & delete
1 parent eb9ce5b commit c1f6cc6

16 files changed

+636
-375
lines changed

src/App.tsx

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,10 @@
1-
import { useState, useEffect } from 'react';
1+
import { useEffect } from 'react';
22
import { ChatPage } from './pages/ChatPage';
33
import MainLayout from './components/layout/MainLayout';
4-
import { SettingsService, SETTINGS_CHANGE_EVENT } from './services/settings-service';
54
import DatabaseInitializer from './components/core/DatabaseInitializer';
65
import { AIService } from './services/ai-service';
76

87
function App() {
9-
// State for settings
10-
const [apiKey, setApiKey] = useState('');
11-
const [selectedModel, setSelectedModel] = useState('');
12-
13-
// Load settings when app starts
14-
useEffect(() => {
15-
const settingsService = SettingsService.getInstance();
16-
const selectedProvider = settingsService.getSelectedProvider();
17-
setApiKey(settingsService.getApiKey(selectedProvider));
18-
setSelectedModel(settingsService.getSelectedModel());
19-
20-
// Listen for settings changes
21-
const handleSettingsChange = () => {
22-
const provider = settingsService.getSelectedProvider();
23-
setApiKey(settingsService.getApiKey(provider));
24-
setSelectedModel(settingsService.getSelectedModel());
25-
};
26-
27-
window.addEventListener(SETTINGS_CHANGE_EVENT, handleSettingsChange);
28-
return () => window.removeEventListener(SETTINGS_CHANGE_EVENT, handleSettingsChange);
29-
}, []);
308

319
// Initialize AI service and cache models at startup
3210
useEffect(() => {
@@ -67,10 +45,7 @@ function App() {
6745
return (
6846
<DatabaseInitializer>
6947
<MainLayout>
70-
<ChatPage
71-
initialSelectedModel={selectedModel}
72-
apiKey={apiKey}
73-
/>
48+
<ChatPage/>
7449
</MainLayout>
7550
</DatabaseInitializer>
7651
);

src/components/chat/ChatMessageArea.tsx

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ interface ChatMessageAreaProps {
1818
onRegenerateResponse?: (messageId: string) => void;
1919
onEditMessage?: (messageId: string, newContent: string) => void;
2020
isCurrentlyStreaming?: boolean;
21+
selectedProvider: string;
22+
selectedModel: string;
2123
}
2224

2325
export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
@@ -29,6 +31,8 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
2931
onRegenerateResponse,
3032
onEditMessage,
3133
isCurrentlyStreaming = false,
34+
selectedProvider,
35+
selectedModel,
3236
}) => {
3337
const [input, setInput] = useState('');
3438
const messagesEndRef = useRef<HTMLDivElement>(null);
@@ -37,6 +41,7 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
3741
const [editingContent, setEditingContent] = useState('');
3842
const [messagesList, setMessagesList] = useState<Message[]>([]);
3943
const [webSearchActive, setWebSearchActive] = useState(false);
44+
const [isWebSearchAllowed, setIsWebSearchAllowed] = useState(false);
4045

4146
// Scroll to bottom when messages change
4247
useEffect(() => {
@@ -52,11 +57,25 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
5257
}
5358
}, [activeConversation, activeConversation?.messages]);
5459

60+
// Load web search status on component mount
5561
useEffect(() => {
56-
const webSearchActive = SettingsService.getInstance().getWebSearchEnabled();
57-
setWebSearchActive(webSearchActive);
62+
const loadWebSearchStatus = async () => {
63+
try {
64+
const settingsService = SettingsService.getInstance();
65+
setWebSearchActive(settingsService.getWebSearchEnabled());
66+
} catch (error) {
67+
console.error('Failed to load web search status:', error);
68+
}
69+
};
5870

59-
}, [SettingsService.getInstance().getWebSearchEnabled()]);
71+
loadWebSearchStatus();
72+
}, []);
73+
74+
useEffect(() => {
75+
console.log('Updated provider or model');
76+
const result = ChatService.getInstance().getCurrentProviderModelCapabilities().includes(AIServiceCapability.WebSearch);
77+
setIsWebSearchAllowed(result);
78+
}, [selectedProvider, selectedModel]);
6079

6180
const handleSubmit = (e: FormEvent) => {
6281
e.preventDefault();
@@ -183,14 +202,17 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
183202
return 0;
184203
}
185204

186-
const handleToggleWebSearch = () => {
187-
setWebSearchActive(!webSearchActive);
188-
SettingsService.getInstance().setWebSearchEnabled(!webSearchActive);
189-
}
190-
191-
const getWebSearchAllowed = () => {
192-
return ChatService.getInstance().getCurrentProviderModelCapabilities().includes(AIServiceCapability.WebSearch);
193-
}
205+
// Handle toggle web search
206+
const handleToggleWebSearch = async () => {
207+
try {
208+
const newStatus = !webSearchActive;
209+
const settingsService = SettingsService.getInstance();
210+
await settingsService.setWebSearchEnabled(newStatus);
211+
setWebSearchActive(newStatus);
212+
} catch (error) {
213+
console.error('Failed to toggle web search:', error);
214+
}
215+
};
194216

195217
// If no active conversation is selected
196218
if (!activeConversation) {
@@ -355,7 +377,7 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
355377

356378
<div className="flex flex-row items-center justify-between px-2">
357379
{
358-
getWebSearchAllowed() ? (
380+
isWebSearchAllowed ? (
359381
<button
360382
type="button"
361383
onClick={handleToggleWebSearch}

src/components/layout/MainLayout.tsx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ interface MainLayoutProps {
1212
const MainLayout: React.FC<MainLayoutProps> = ({ children }) => {
1313
const [activePage, setActivePage] = useState('chat');
1414
const [showSettings, setShowSettings] = useState(false);
15-
1615
// Handle page changes
1716
const handlePageChange = (page: string) => {
1817
if (page === 'settings') {
@@ -27,12 +26,6 @@ const MainLayout: React.FC<MainLayoutProps> = ({ children }) => {
2726
setShowSettings(true);
2827
};
2928

30-
// Handle settings save
31-
const handleSettingsSaved = () => {
32-
// Refresh the page or reload the necessary components
33-
console.log('Settings saved, updating components...');
34-
};
35-
3629
// Handle selecting a model
3730
const handleSelectModel = (modelId: string, provider: string) => {
3831
SettingsService.getInstance().setSelectedModel(modelId);
@@ -54,8 +47,6 @@ const MainLayout: React.FC<MainLayoutProps> = ({ children }) => {
5447

5548
<TopBar
5649
onSelectModel={handleSelectModel}
57-
selectedModel={SettingsService.getInstance().getSelectedModel()}
58-
selectedProvider={SettingsService.getInstance().getSelectedProvider()}
5950
onOpenSettingsDialog={handleOpenSettingsDialog}
6051
/>
6152

@@ -71,7 +62,6 @@ const MainLayout: React.FC<MainLayoutProps> = ({ children }) => {
7162
<SettingsPage
7263
isOpen={showSettings}
7364
onClose={() => setShowSettings(false)}
74-
onSave={handleSettingsSaved}
7565
/>
7666
</div>
7767
);

src/components/layout/TopBar.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
import { ChevronDown, Cpu, Settings } from 'lucide-react';
2-
import React, { useState } from 'react';
2+
import React, { useEffect, useState } from 'react';
33
import { SelectModelDialog } from '../models/SelectModelDialog';
44
import { ModelOption } from '../../services/ai-service';
5+
import { SettingsService } from '../../services/settings-service';
56

67
interface TopBarProps {
78
onSelectModel: (model: string, provider: string) => void;
8-
selectedModel?: string;
9-
selectedProvider?: string;
109
onOpenSettingsDialog: () => void;
1110
}
1211

13-
const TopBar: React.FC<TopBarProps> = ({ onSelectModel, selectedModel, selectedProvider, onOpenSettingsDialog }) => {
12+
const TopBar: React.FC<TopBarProps> = ({ onSelectModel, onOpenSettingsDialog }) => {
1413
const [isModelDialogOpen, setIsModelDialogOpen] = useState(false);
15-
14+
const [selectedModel, setSelectedModel] = useState('');
15+
const [selectedProvider, setSelectedProvider] = useState('');
16+
17+
useEffect(() => {
18+
const settingsService = SettingsService.getInstance();
19+
setSelectedModel(settingsService.getSelectedModel());
20+
setSelectedProvider(settingsService.getSelectedProvider());
21+
}, [SettingsService.getInstance().getSelectedModel(), SettingsService.getInstance().getSelectedProvider()]);
22+
1623
const handleOpenModelDialog = () => {
1724
setIsModelDialogOpen(true);
1825
};

0 commit comments

Comments
 (0)