Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
0108ff1a
Unverified
提交
0108ff1a
authored
5月 02, 2025
作者:
Will Chen
提交者:
GitHub
5月 02, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
improve ux overflow with sidebar (#79)
上级
30662118
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
18 行增加
和
4 行删除
+18
-4
uiAtoms.ts
src/atoms/uiAtoms.ts
+4
-0
ChatList.tsx
src/components/ChatList.tsx
+6
-2
app-sidebar.tsx
src/components/app-sidebar.tsx
+8
-2
没有找到文件。
src/atoms/uiAtoms.ts
0 → 100644
浏览文件 @
0108ff1a
import
{
atom
}
from
"jotai"
;
// Atom to track if any dropdown is currently open in the UI
export
const
dropdownOpenAtom
=
atom
<
boolean
>
(
false
);
src/components/ChatList.tsx
浏览文件 @
0108ff1a
...
...
@@ -6,6 +6,7 @@ import { PlusCircle, MoreVertical, Trash2 } from "lucide-react";
import
{
useAtom
}
from
"jotai"
;
import
{
selectedChatIdAtom
}
from
"@/atoms/chatAtoms"
;
import
{
selectedAppIdAtom
}
from
"@/atoms/appAtoms"
;
import
{
dropdownOpenAtom
}
from
"@/atoms/uiAtoms"
;
import
{
IpcClient
}
from
"@/ipc/ipc_client"
;
import
{
showError
,
showSuccess
}
from
"@/lib/toast"
;
import
{
...
...
@@ -28,6 +29,7 @@ export function ChatList({ show }: { show?: boolean }) {
const
navigate
=
useNavigate
();
const
[
selectedChatId
,
setSelectedChatId
]
=
useAtom
(
selectedChatIdAtom
);
const
[
selectedAppId
,
setSelectedAppId
]
=
useAtom
(
selectedAppIdAtom
);
const
[
isDropdownOpen
,
setIsDropdownOpen
]
=
useAtom
(
dropdownOpenAtom
);
const
{
chats
,
loading
,
refreshChats
}
=
useChats
(
selectedAppId
);
const
routerState
=
useRouterState
();
const
isChatRoute
=
routerState
.
location
.
pathname
===
"/chat"
;
...
...
@@ -136,7 +138,7 @@ export function ChatList({ show }: { show?: boolean }) {
<
SidebarMenu
className=
"space-y-1"
>
{
chats
.
map
((
chat
)
=>
(
<
SidebarMenuItem
key=
{
chat
.
id
}
className=
"mb-1"
>
<
div
className=
"flex w-[1
8
5px] items-center"
>
<
div
className=
"flex w-[1
7
5px] items-center"
>
<
Button
variant=
"ghost"
onClick=
{
()
=>
...
...
@@ -161,7 +163,9 @@ export function ChatList({ show }: { show?: boolean }) {
</
Button
>
{
selectedChatId
===
chat
.
id
&&
(
<
DropdownMenu
>
<
DropdownMenu
onOpenChange=
{
(
open
)
=>
setIsDropdownOpen
(
open
)
}
>
<
DropdownMenuTrigger
asChild
>
<
Button
variant=
"ghost"
...
...
src/components/app-sidebar.tsx
浏览文件 @
0108ff1a
...
...
@@ -2,6 +2,8 @@ import { Home, Inbox, Settings, HelpCircle } from "lucide-react";
import
{
Link
,
useRouterState
}
from
"@tanstack/react-router"
;
import
{
useSidebar
}
from
"@/components/ui/sidebar"
;
// import useSidebar hook
import
{
useEffect
,
useState
,
useRef
}
from
"react"
;
import
{
useAtom
}
from
"jotai"
;
import
{
dropdownOpenAtom
}
from
"@/atoms/uiAtoms"
;
import
{
Sidebar
,
...
...
@@ -50,6 +52,7 @@ export function AppSidebar() {
const
[
hoverState
,
setHoverState
]
=
useState
<
HoverState
>
(
"no-hover"
);
const
expandedByHover
=
useRef
(
false
);
const
[
isHelpDialogOpen
,
setIsHelpDialogOpen
]
=
useState
(
false
);
// State for dialog
const
[
isDropdownOpen
]
=
useAtom
(
dropdownOpenAtom
);
useEffect
(()
=>
{
if
(
...
...
@@ -62,13 +65,14 @@ export function AppSidebar() {
if
(
hoverState
===
"clear-hover"
&&
state
===
"expanded"
&&
expandedByHover
.
current
expandedByHover
.
current
&&
!
isDropdownOpen
)
{
toggleSidebar
();
expandedByHover
.
current
=
false
;
setHoverState
(
"no-hover"
);
}
},
[
hoverState
,
toggleSidebar
,
state
,
setHoverState
]);
},
[
hoverState
,
toggleSidebar
,
state
,
setHoverState
,
isDropdownOpen
]);
const
routerState
=
useRouterState
();
const
isAppRoute
=
...
...
@@ -93,7 +97,9 @@ export function AppSidebar() {
<
Sidebar
collapsible=
"icon"
onMouseLeave=
{
()
=>
{
if
(
!
isDropdownOpen
)
{
setHoverState
(
"clear-hover"
);
}
}
}
>
<
SidebarContent
className=
"overflow-hidden"
>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论