feat: improve sidebar usability

This commit is contained in:
Junyan Qin
2026-06-30 22:18:33 +08:00
committed by huanghuoguoguo
parent 1eef5d2344
commit 7cd04a2cff
3 changed files with 291 additions and 15 deletions
@@ -83,6 +83,7 @@ import {
SidebarMenuSub,
SidebarMenuSubButton,
SidebarMenuSubItem,
SidebarRail,
useSidebar,
} from '@/components/ui/sidebar';
import {
@@ -726,7 +727,12 @@ function NavItems({
)}
/>
) : null}
<span className="truncate">{item.name}</span>
<span className="min-w-0 flex-1 truncate">{item.name}</span>
{isBot && item.legacyAdapter && (
<span className="ml-auto shrink-0 rounded border border-amber-200 bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium leading-none text-amber-700 dark:border-amber-900/50 dark:bg-amber-950/30 dark:text-amber-300">
{t('bots.legacyAdapterBadge')}
</span>
)}
</button>
);
}
@@ -789,7 +795,14 @@ function NavItems({
)}
/>
) : null}
<span className="truncate">{item.name}</span>
<span className="min-w-0 flex-1 truncate">
{item.name}
</span>
{isBot && item.legacyAdapter && (
<span className="shrink-0 rounded border border-amber-200 bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium leading-none text-amber-700 dark:border-amber-900/50 dark:bg-amber-950/30 dark:text-amber-300">
{t('bots.legacyAdapterBadge')}
</span>
)}
{item.kind && (
<span
className="ml-auto flex shrink-0 items-center text-muted-foreground"
@@ -2241,6 +2254,7 @@ export default function HomeSidebar({
</SidebarMenuItem>
</SidebarMenu>
</SidebarFooter>
<SidebarRail />
</Sidebar>
<Dialog open={feedbackOpen} onOpenChange={setFeedbackOpen}>
@@ -19,6 +19,7 @@ export interface SidebarEntityItem {
updatedAt?: string; // ISO timestamp for sorting by most recently edited
// Bot-specific fields
enabled?: boolean;
legacyAdapter?: boolean;
// MCP-specific fields
runtimeStatus?: 'connecting' | 'connected' | 'error';
// Plugin-specific fields
@@ -117,7 +118,15 @@ export function SidebarDataProvider({
const refreshBots = useCallback(async () => {
try {
const resp = await httpClient.getBots();
const [resp, adaptersResp] = await Promise.all([
httpClient.getBots(),
httpClient.getAdapters().catch(() => ({ adapters: [] })),
]);
const legacyAdapterNames = new Set(
adaptersResp.adapters
.filter((adapter) => adapter.spec.legacy)
.map((adapter) => adapter.name),
);
setBots(
resp.bots.map((bot) => ({
id: bot.uuid || '',
@@ -126,6 +135,7 @@ export function SidebarDataProvider({
iconURL: httpClient.getAdapterIconURL(bot.adapter),
updatedAt: bot.updated_at,
enabled: bot.enable ?? true,
legacyAdapter: legacyAdapterNames.has(bot.adapter),
})),
);
} catch (error) {