11import { useEffect , useRef , type MouseEvent , type ReactNode } from "react" ;
22import { MainTopbar } from "../../app/components/MainTopbar" ;
33
4+ type CenterMode = "chat" | "diff" ;
5+
6+ function shouldRenderDiffViewer ( {
7+ splitChatDiffView,
8+ preloadGitDiffs,
9+ centerMode,
10+ } : {
11+ splitChatDiffView : boolean ;
12+ preloadGitDiffs : boolean ;
13+ centerMode : CenterMode ;
14+ } ) {
15+ return splitChatDiffView || preloadGitDiffs || centerMode === "diff" ;
16+ }
17+
18+ function isActiveLayer ( centerMode : CenterMode , layer : CenterMode ) {
19+ return centerMode === layer ;
20+ }
21+
22+ function layerClassName ( {
23+ splitChatDiffView,
24+ layer,
25+ isActive,
26+ } : {
27+ splitChatDiffView : boolean ;
28+ layer : CenterMode ;
29+ isActive : boolean ;
30+ } ) {
31+ if ( splitChatDiffView ) {
32+ return `content-layer content-layer-split content-layer-${ layer } ${
33+ isActive ? " is-active" : ""
34+ } `;
35+ }
36+ return `content-layer ${ isActive ? "is-active" : "is-hidden" } ` ;
37+ }
38+
39+ function setLayerInert (
40+ layer : HTMLDivElement | null ,
41+ isActive : boolean ,
42+ splitChatDiffView : boolean ,
43+ ) {
44+ if ( ! layer ) {
45+ return ;
46+ }
47+
48+ if ( splitChatDiffView || isActive ) {
49+ layer . removeAttribute ( "inert" ) ;
50+ return ;
51+ }
52+
53+ layer . setAttribute ( "inert" , "" ) ;
54+ }
55+
456type DesktopLayoutProps = {
557 sidebarNode : ReactNode ;
658 updateToastNode : ReactNode ;
@@ -22,6 +74,7 @@ type DesktopLayoutProps = {
2274 debugPanelNode : ReactNode ;
2375 hasActivePlan : boolean ;
2476 onSidebarResizeStart : ( event : MouseEvent < HTMLDivElement > ) => void ;
77+ onChatDiffSplitPositionResizeStart : ( event : MouseEvent < HTMLDivElement > ) => void ;
2578 onRightPanelResizeStart : ( event : MouseEvent < HTMLDivElement > ) => void ;
2679 onPlanPanelResizeStart : ( event : MouseEvent < HTMLDivElement > ) => void ;
2780} ;
@@ -49,39 +102,29 @@ export function DesktopLayout({
49102 onSidebarResizeStart,
50103 onRightPanelResizeStart,
51104 onPlanPanelResizeStart,
105+ onChatDiffSplitPositionResizeStart,
52106} : DesktopLayoutProps ) {
53107 const diffLayerRef = useRef < HTMLDivElement | null > ( null ) ;
54108 const chatLayerRef = useRef < HTMLDivElement | null > ( null ) ;
55- const shouldRenderDiffViewer =
56- splitChatDiffView || preloadGitDiffs || centerMode === "diff" ;
109+ const diffLayerActive = isActiveLayer ( centerMode , "diff" ) ;
110+ const chatLayerActive = isActiveLayer ( centerMode , "chat" ) ;
111+ const showDiffViewer = shouldRenderDiffViewer ( {
112+ splitChatDiffView,
113+ preloadGitDiffs,
114+ centerMode,
115+ } ) ;
57116
58117 useEffect ( ( ) => {
59118 const diffLayer = diffLayerRef . current ;
60119 const chatLayer = chatLayerRef . current ;
120+ setLayerInert ( diffLayer , diffLayerActive , splitChatDiffView ) ;
121+ setLayerInert ( chatLayer , chatLayerActive , splitChatDiffView ) ;
61122
62123 if ( splitChatDiffView ) {
63- diffLayer ?. removeAttribute ( "inert" ) ;
64- chatLayer ?. removeAttribute ( "inert" ) ;
65124 return ;
66125 }
67126
68- if ( diffLayer ) {
69- if ( centerMode === "diff" ) {
70- diffLayer . removeAttribute ( "inert" ) ;
71- } else {
72- diffLayer . setAttribute ( "inert" , "" ) ;
73- }
74- }
75-
76- if ( chatLayer ) {
77- if ( centerMode === "chat" ) {
78- chatLayer . removeAttribute ( "inert" ) ;
79- } else {
80- chatLayer . setAttribute ( "inert" , "" ) ;
81- }
82- }
83-
84- const hiddenLayer = centerMode === "diff" ? chatLayer : diffLayer ;
127+ const hiddenLayer = diffLayerActive ? chatLayer : diffLayer ;
85128 const activeElement = document . activeElement ;
86129 if (
87130 hiddenLayer &&
@@ -116,34 +159,53 @@ export function DesktopLayout({
116159 { splitChatDiffView ? (
117160 < >
118161 < div
119- className = { `content-layer content-layer-split content-layer-chat${
120- centerMode === "chat" ? " is-active" : ""
121- } `}
162+ className = { layerClassName ( {
163+ splitChatDiffView,
164+ layer : "chat" ,
165+ isActive : chatLayerActive ,
166+ } ) }
122167 ref = { chatLayerRef }
123168 >
124169 { messagesNode }
125170 </ div >
126171 < div
127- className = { `content-layer content-layer-split content-layer-diff${
128- centerMode === "diff" ? " is-active" : ""
129- } `}
172+ className = "content-split-resizer"
173+ role = "separator"
174+ aria-orientation = "vertical"
175+ aria-label = "Resize chat/diff split"
176+ onMouseDown = { onChatDiffSplitPositionResizeStart }
177+ />
178+ < div
179+ className = { layerClassName ( {
180+ splitChatDiffView,
181+ layer : "diff" ,
182+ isActive : diffLayerActive ,
183+ } ) }
130184 ref = { diffLayerRef }
131185 >
132- { shouldRenderDiffViewer ? gitDiffViewerNode : null }
186+ { showDiffViewer ? gitDiffViewerNode : null }
133187 </ div >
134188 </ >
135189 ) : (
136190 < >
137191 < div
138- className = { `content-layer ${ centerMode === "diff" ? "is-active" : "is-hidden" } ` }
139- aria-hidden = { centerMode !== "diff" }
192+ className = { layerClassName ( {
193+ splitChatDiffView,
194+ layer : "diff" ,
195+ isActive : diffLayerActive ,
196+ } ) }
197+ aria-hidden = { ! splitChatDiffView ? ! diffLayerActive : undefined }
140198 ref = { diffLayerRef }
141199 >
142- { shouldRenderDiffViewer ? gitDiffViewerNode : null }
200+ { showDiffViewer ? gitDiffViewerNode : null }
143201 </ div >
144202 < div
145- className = { `content-layer ${ centerMode === "chat" ? "is-active" : "is-hidden" } ` }
146- aria-hidden = { centerMode !== "chat" }
203+ className = { layerClassName ( {
204+ splitChatDiffView,
205+ layer : "chat" ,
206+ isActive : chatLayerActive ,
207+ } ) }
208+ aria-hidden = { ! splitChatDiffView ? ! chatLayerActive : undefined }
147209 ref = { chatLayerRef }
148210 >
149211 { messagesNode }
0 commit comments