From b9ca23c6066529b8082d763dd3c8de2bdce13137 Mon Sep 17 00:00:00 2001
From: Marco Beretta <81851188+berry-13@users.noreply.github.com>
Date: Tue, 30 Sep 2025 22:16:40 +0200
Subject: [PATCH] refactor: enhance UI components with improved class handling
and state management
---
.../Chat/Input/Files/AttachFileMenu.tsx | 1 +
client/src/components/Chat/Input/MCPSelect.tsx | 6 +++++-
.../src/components/Chat/Input/ToolsDropdown.tsx | 3 ++-
.../Nav/SettingsTabs/Data/SharedLinks.tsx | 14 +-------------
client/src/components/OAuth/OAuthSuccess.tsx | 2 +-
packages/client/src/components/MultiSelect.tsx | 17 ++++++++++++++---
6 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/client/src/components/Chat/Input/Files/AttachFileMenu.tsx b/client/src/components/Chat/Input/Files/AttachFileMenu.tsx
index a3e5a8d304..a2cac2c0a0 100644
--- a/client/src/components/Chat/Input/Files/AttachFileMenu.tsx
+++ b/client/src/components/Chat/Input/Files/AttachFileMenu.tsx
@@ -224,6 +224,7 @@ const AttachFileMenu = ({
aria-label="Attach File Options"
className={cn(
'flex size-9 items-center justify-center rounded-full p-1 transition-colors hover:bg-surface-hover focus:outline-none focus:ring-2 focus:ring-primary focus:ring-opacity-50',
+ isPopoverActive && 'bg-surface-hover',
)}
>
diff --git a/client/src/components/Chat/Input/MCPSelect.tsx b/client/src/components/Chat/Input/MCPSelect.tsx
index 9482581802..ca0671c0a5 100644
--- a/client/src/components/Chat/Input/MCPSelect.tsx
+++ b/client/src/components/Chat/Input/MCPSelect.tsx
@@ -3,6 +3,7 @@ import { MultiSelect, MCPIcon } from '@librechat/client';
import MCPServerStatusIcon from '~/components/MCP/MCPServerStatusIcon';
import MCPConfigDialog from '~/components/MCP/MCPConfigDialog';
import { useBadgeRowContext } from '~/Providers';
+import { cn } from '~/utils';
function MCPSelectContent() {
const { conversationId, mcpServerManager } = useBadgeRowContext();
@@ -88,7 +89,10 @@ function MCPSelectContent() {
className="badge-icon min-w-fit"
selectIcon={
}
selectItemsClassName="border border-blue-600/50 bg-blue-500/10 hover:bg-blue-700/10"
- selectClassName="group relative inline-flex items-center justify-center md:justify-start gap-1.5 rounded-full border border-border-medium text-sm font-medium transition-all md:w-full size-9 p-2 md:p-3 bg-transparent shadow-sm hover:bg-surface-hover hover:shadow-md active:shadow-inner"
+ selectClassName={cn(
+ 'group relative inline-flex items-center justify-center md:justify-start gap-1.5 rounded-full border border-border-medium text-sm font-medium transition-all',
+ 'md:w-full size-9 p-2 md:p-3 bg-transparent shadow-sm hover:bg-surface-hover hover:shadow-md active:shadow-inner',
+ )}
/>
{configDialogProps && (
diff --git a/client/src/components/Chat/Input/ToolsDropdown.tsx b/client/src/components/Chat/Input/ToolsDropdown.tsx
index 720c0bb92e..828c4036b9 100644
--- a/client/src/components/Chat/Input/ToolsDropdown.tsx
+++ b/client/src/components/Chat/Input/ToolsDropdown.tsx
@@ -307,10 +307,11 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
aria-label="Tools Options"
className={cn(
'flex size-9 items-center justify-center rounded-full p-1 transition-colors hover:bg-surface-hover focus:outline-none focus:ring-2 focus:ring-primary focus:ring-opacity-50',
+ isPopoverActive && 'bg-surface-hover',
)}
>
-
+
}
diff --git a/client/src/components/Nav/SettingsTabs/Data/SharedLinks.tsx b/client/src/components/Nav/SettingsTabs/Data/SharedLinks.tsx
index 995527a1ea..b8201a8b67 100644
--- a/client/src/components/Nav/SettingsTabs/Data/SharedLinks.tsx
+++ b/client/src/components/Nav/SettingsTabs/Data/SharedLinks.tsx
@@ -122,17 +122,6 @@ export default function SharedLinks() {
[setQueryParams, data?.pages],
);
- const handleError = useCallback(
- (error: Error) => {
- console.error('DataTable error:', error);
- showToast({
- message: localize('com_ui_share_error'),
- severity: NotificationSeverity.ERROR,
- });
- },
- [showToast, localize],
- );
-
useEffect(() => {
if (!data?.pages) return;
@@ -252,7 +241,7 @@ export default function SharedLinks() {
},
meta: {
className: 'w-32 sm:w-40',
- // desktopOnly: true, // WIP
+ desktopOnly: true,
},
enableSorting: true,
},
@@ -350,7 +339,6 @@ export default function SharedLinks() {
isFetchingNextPage={isFetchingNextPage}
sorting={sorting}
onSortingChange={handleSortingChange}
- onError={handleError}
/>
diff --git a/client/src/components/OAuth/OAuthSuccess.tsx b/client/src/components/OAuth/OAuthSuccess.tsx
index fd8051a6f5..10c9dc071e 100644
--- a/client/src/components/OAuth/OAuthSuccess.tsx
+++ b/client/src/components/OAuth/OAuthSuccess.tsx
@@ -25,7 +25,7 @@ export default function OAuthSuccess() {
return (
-
+
{localize('com_ui_oauth_success_title') || 'Authentication Successful'}
diff --git a/packages/client/src/components/MultiSelect.tsx b/packages/client/src/components/MultiSelect.tsx
index a793e1c550..132870c01a 100644
--- a/packages/client/src/components/MultiSelect.tsx
+++ b/packages/client/src/components/MultiSelect.tsx
@@ -1,4 +1,4 @@
-import React, { useRef } from 'react';
+import React, { useRef, useState } from 'react';
import {
Select,
SelectArrow,
@@ -61,6 +61,7 @@ export default function MultiSelect
({
renderItemContent,
}: MultiSelectProps) {
const selectRef = useRef(null);
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
const handleValueChange = (values: T[]) => {
setSelectedValues(values);
@@ -71,7 +72,12 @@ export default function MultiSelect({
return (
-
+
{label && (
{label}
@@ -92,7 +98,12 @@ export default function MultiSelect({
{renderSelectedValues(selectedValues, placeholder)}
-
+