11import React , { useState , useEffect } from 'react'
2- import { Layout as AntLayout , Button , Tooltip } from 'antd'
2+ import { Layout as AntLayout , Button , Tooltip , Drawer } from 'antd'
33import { useUIStore } from '../../stores/uiStore'
44import { useSearchStore } from '../../stores/searchStore'
55import Sidebar from './sidebar/Sidebar'
@@ -11,11 +11,30 @@ import TitleBar from './titlebar/TitleBar'
1111
1212const { Sider, Content } = AntLayout
1313
14+ // 定义窄屏幕的阈值
15+ const NARROW_SCREEN_THRESHOLD = 768
16+
1417export default function Layout ( ) {
1518 const { sidebarCollapsed, sidebarWidth, toggleSidebar } = useUIStore ( )
1619 const { clearSearch, setFilterFolderId } = useSearchStore ( )
1720 const [ activeTab , setActiveTab ] = useState < ActivityBarTab > ( 'explore' )
1821 const [ searchOpen , setSearchOpen ] = useState ( false )
22+ const [ isNarrowScreen , setIsNarrowScreen ] = useState ( false )
23+
24+ // 监听窗口大小变化
25+ useEffect ( ( ) => {
26+ const handleResize = ( ) => {
27+ setIsNarrowScreen ( window . innerWidth < NARROW_SCREEN_THRESHOLD )
28+ }
29+
30+ // 初始化
31+ handleResize ( )
32+
33+ window . addEventListener ( 'resize' , handleResize )
34+ return ( ) => {
35+ window . removeEventListener ( 'resize' , handleResize )
36+ }
37+ } , [ ] )
1938
2039 // 处理键盘快捷键
2140 useEffect ( ( ) => {
@@ -46,10 +65,23 @@ export default function Layout() {
4665 }
4766
4867 const handleActivityTabChange = ( tab : ActivityBarTab ) => {
49- setActiveTab ( tab )
50- // 如果侧边栏折叠,自动展开
51- if ( sidebarCollapsed ) {
52- toggleSidebar ( )
68+ // 如果点击的是当前已激活的标签
69+ if ( tab === activeTab ) {
70+ // 如果侧边栏是展开状态,则切换为收起
71+ if ( ! sidebarCollapsed ) {
72+ toggleSidebar ( )
73+ }
74+ // 如果已经是收起状态,则展开(复用下面的逻辑)
75+ else {
76+ toggleSidebar ( )
77+ }
78+ } else {
79+ // 点击的是不同的标签
80+ setActiveTab ( tab )
81+ // 如果侧边栏折叠,自动展开
82+ if ( sidebarCollapsed ) {
83+ toggleSidebar ( )
84+ }
5385 }
5486 }
5587
@@ -70,36 +102,54 @@ export default function Layout() {
70102 return (
71103 < div className = "app-layout" >
72104 { /* 自定义标题栏 */ }
73- < TitleBar
74- title = "Pointer - AI聊天助手"
75- sidebarCollapsed = { sidebarCollapsed }
76- onToggleSidebar = { toggleSidebar }
77- />
105+ < TitleBar title = "Pointer - AI聊天助手" />
78106
79107 < AntLayout className = "app-main-layout" >
80108 { /* ActivityBar */ }
81109 < Sider width = { 64 } collapsedWidth = { 64 } theme = "light" className = "app-activity-bar" >
82110 < ActivityBar activeTab = { activeTab } onTabChange = { handleActivityTabChange } />
83111 </ Sider >
84112
85- { /* Sidebar */ }
86- < Sider
87- width = { sidebarWidth }
88- collapsedWidth = { 0 }
89- collapsed = { sidebarCollapsed }
90- theme = "light"
91- className = "app-sider"
92- style = { { position : 'relative' } }
93- >
94- < Sidebar
113+ { /* 窄屏模式:使用 Drawer */ }
114+ { isNarrowScreen ? (
115+ < Drawer
116+ placement = "left"
117+ open = { ! sidebarCollapsed }
118+ onClose = { toggleSidebar }
119+ width = { sidebarWidth }
120+ styles = { { body : { padding : 0 } } }
121+ mask = { true }
122+ maskClosable = { true }
123+ closable = { false }
124+ >
125+ < Sidebar
126+ collapsed = { false }
127+ activeTab = { activeTab }
128+ onSearchOpen = { handleSearchOpen }
129+ onSettingsOpen = { handleSearchOpen }
130+ onFindInFolder = { handleFindInFolder }
131+ />
132+ </ Drawer >
133+ ) : (
134+ /* 宽屏模式:使用 Sider */
135+ < Sider
136+ width = { sidebarWidth }
137+ collapsedWidth = { 0 }
95138 collapsed = { sidebarCollapsed }
96- activeTab = { activeTab }
97- onSearchOpen = { handleSearchOpen }
98- onSettingsOpen = { handleSearchOpen }
99- onFindInFolder = { handleFindInFolder }
100- />
101- < ResizeHandle />
102- </ Sider >
139+ theme = "light"
140+ className = "app-sider"
141+ style = { { position : 'relative' } }
142+ >
143+ < Sidebar
144+ collapsed = { sidebarCollapsed }
145+ activeTab = { activeTab }
146+ onSearchOpen = { handleSearchOpen }
147+ onSettingsOpen = { handleSearchOpen }
148+ onFindInFolder = { handleFindInFolder }
149+ />
150+ < ResizeHandle />
151+ </ Sider >
152+ ) }
103153
104154 < Content className = "app-content" >
105155 < TabsArea />
0 commit comments