From ac9ffb2a7aead8eb937938f9f55014eb3d314aa3 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Mon, 11 May 2026 17:06:13 +0800 Subject: [PATCH] feat(frontend): update UI components, skill pages, and hooks Refactor ChatMessageList, ChannelSidebar, and skill detail/pages. Add CreateSkillDialog and DeleteSkillDialog. Update MarkdownRenderer, use-mobile hook, and useSkillsQuery. --- src/app/channel/layout.tsx | 16 +- src/app/chat/ChatMessageBubble.tsx | 6 +- src/app/chat/ChatMessageList.tsx | 135 +++++++---- .../project/skill-detail/SkillDetailPage.tsx | 213 +++++++++++++++--- src/app/project/skills/CreateSkillDialog.tsx | 132 +++++++++++ src/app/project/skills/DeleteSkillDialog.tsx | 64 ++++++ src/app/project/skills/SkillsPage.tsx | 64 +++++- src/components/layout/ChannelSidebar.tsx | 41 ++-- src/components/layout/Header.tsx | 10 +- src/components/layout/MemberList.tsx | 18 +- src/components/layout/ServerIconRail.tsx | 10 +- src/components/ui/MarkdownRenderer.tsx | 8 +- src/hooks/use-mobile.ts | 57 ++--- src/hooks/useSkillsQuery.ts | 48 +++- 14 files changed, 661 insertions(+), 161 deletions(-) create mode 100644 src/app/project/skills/CreateSkillDialog.tsx create mode 100644 src/app/project/skills/DeleteSkillDialog.tsx diff --git a/src/app/channel/layout.tsx b/src/app/channel/layout.tsx index 8eb4ddb..82e93b8 100644 --- a/src/app/channel/layout.tsx +++ b/src/app/channel/layout.tsx @@ -1,4 +1,4 @@ -import { createContext, useContext, useState, type ReactNode } from "react"; +import { createContext, useContext, useState, useMemo, useCallback, type ReactNode } from "react"; import { Outlet } from "react-router-dom"; import { ChevronRight } from "lucide-react"; import { ServerIconRail } from "@/components/layout/ServerIconRail"; @@ -26,8 +26,18 @@ export function ChannelLayout({ children }: { children?: ReactNode }) { const isTablet = useIsTablet(); const canShowMembers = !isMobile && !isTablet; + const contextValue = useMemo( + () => ({ showMembers, setShowMembers }), + [showMembers], + ); + + const toggleSidebar = useCallback( + () => setIsSidebarCollapsed((v) => !v), + [], + ); + return ( - +
{!isMobile && } @@ -44,7 +54,7 @@ export function ChannelLayout({ children }: { children?: ReactNode }) { {!isSidebarCollapsed && }
+ + + ) : ( + <> + + + + ) + } /> + {saveError && ( +
+ {saveError} +
+ )} +
@@ -56,9 +147,17 @@ export function SkillDetailPage() { Skill Content
-
-              {skillDetail.content}
-            
+ {editing ? ( +