= ({
+ imageResult,
+}) => {
+ const { t } = useTranslation();
+ const isGenerating = imageResult.status === 'generating';
+ const isFailed = imageResult.status === 'failed';
+
+ // Function to render image grid based on number of images and aspect ratio
+ const renderImageGrid = (images: MessageContent[]) => {
+ if (images.length === 0 && !isGenerating) return null;
+
+ // Convert aspect ratio string (e.g. "16:9") to calculate best layout
+ const [widthRatio, heightRatio] = imageResult.aspectRatio.split(':').map(Number);
+ const isWide = widthRatio > heightRatio;
+
+ // Grid layout classes based on number of images
+ let gridClass = "grid-cols-1";
+
+ if (images.length === 2) {
+ gridClass = isWide ? "grid-cols-2" : "grid-cols-1 grid-rows-2";
+ } else if (images.length === 3) {
+ gridClass = "grid-cols-3";
+ } else if (images.length === 4) {
+ gridClass = "grid-cols-2 grid-rows-2";
+ }
+
+ // If still generating, show a loading indicator
+ if (isGenerating) {
+ return (
+
+
+
+
{t('imageGeneration.creatingImage')}
+
+
+ );
+ }
+
+ // Show error message if generation failed
+ if (isFailed) {
+ return (
+
+
+
{t('imageGeneration.generationFailed')}
+
+
+ );
+ }
+
+ return (
+
+ {images.map((image, index) => (
+
+

+
+ ))}
+
+ );
+ };
+
+ const getProviderName = (providerId: string, providerName: string) => {
+ const providerService = AIService.getInstance().getProvider(providerId);
+ return providerService?.name || providerName || providerId;
+ }
+
+ return (
+
+
+ {renderImageGrid(imageResult.images)}
+
+
+
+
+
+
+
{imageResult.prompt}
+
+
+
+ {imageResult.model}
+
+
+ {getProviderName(imageResult.provider, imageResult.providerName)}
+
+
+ {imageResult.aspectRatio}
+
+
+ Seed: {imageResult.seed}
+
+ {isGenerating && (
+
+ {t('imageGeneration.generating')}
+
+ )}
+
+
+
+
+
+
+ );
+};
+
+export default ImageGenerateHistoryItem;
\ No newline at end of file
diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx
index ae492e7..1ee2fdd 100644
--- a/src/components/layout/Sidebar.tsx
+++ b/src/components/layout/Sidebar.tsx
@@ -1,5 +1,7 @@
import React from 'react';
-import { MessageSquare, Settings, Image, Languages, FolderClosed } from 'lucide-react';
+import { MessageSquare, Settings, Image, Languages, FolderClosed,
+ // ServerCog
+} from 'lucide-react';
interface SidebarProps {
activePage: string;
@@ -31,6 +33,9 @@ export const Sidebar: React.FC
= ({
else if(activePage === 'files'){
return 'files';
}
+ else if(activePage === 'mcpserver'){
+ return 'mcpserver';
+ }
return '';
}
@@ -87,6 +92,18 @@ export const Sidebar: React.FC = ({
>
+
+ {/* */}
{/* Settings button at bottom */}
diff --git a/src/components/pages/ChatPage.tsx b/src/components/pages/ChatPage.tsx
index 15a4151..a5b3e18 100644
--- a/src/components/pages/ChatPage.tsx
+++ b/src/components/pages/ChatPage.tsx
@@ -5,6 +5,7 @@ import { Conversation, ConversationFolder } from '../../types/chat';
import { SETTINGS_CHANGE_EVENT, SettingsService } from '../../services/settings-service';
import { ChatService } from '../../services/chat-service';
import { AIService } from '../../services/ai-service';
+import { MCPServerSettings } from '../../types/settings';
export const ChatPage = () => {
const [conversations, setConversations] = useState