@@ -5,7 +5,7 @@ import CollectionPermissionsProvider from '../../services/context/collection-per
55import { PopupsProvider } from '../../services/context/popups-context' ;
66import { ValidationProvider } from '../../services/context/validation-context/ValidationProvider' ;
77import { setSampleQuery } from '../../services/slices/sample-query.slice' ;
8- import { toggleSidebar } from '../../services/slices/sidebar-properties.slice' ; // Import sidebar action
8+ import { toggleSidebar } from '../../services/slices/sidebar-properties.slice' ;
99import { translateMessage } from '../../utils/translate-messages' ;
1010import { StatusMessages , TermsOfUseMessage } from '../app-sections' ;
1111import Notification from '../common/banners/Notification' ;
@@ -31,11 +31,13 @@ export const Layout = (props: LayoutProps) => {
3131 const dispatch = useAppDispatch ( ) ;
3232 const sampleQuery = useAppSelector ( ( state ) => state . sampleQuery ) ;
3333 const { mobileScreen, showSidebar } = useAppSelector ( ( state ) => state . sidebarProperties ) ;
34+ const [ initialSidebarWidth , setInitialSidebarWidth ] = useState ( 456 ) ;
35+ const [ sidebarElement , setSidebarElement ] = useState < HTMLElement | null > ( null ) ;
3436
3537 const {
3638 handleRef : sidebarHandleRef ,
3739 wrapperRef : sidebarWrapperRef ,
38- elementRef : sidebarElementRef ,
40+ elementRef : storeSidebarElement ,
3941 setValue : setSidebarColumnSize
4042 } = useResizeHandle ( {
4143 variableName : SIDEBAR_SIZE_CSS_VAR ,
@@ -53,68 +55,120 @@ export const Layout = (props: LayoutProps) => {
5355 } , [ sampleBody ] ) ;
5456
5557 useEffect ( ( ) => {
56- if ( mobileScreen ) {
57- dispatch ( toggleSidebar ( { showSidebar : false , mobileScreen : true } ) ) ;
58+ if ( ! mobileScreen ) {
59+ setSidebarColumnSize ( 456 ) ;
60+ setInitialSidebarWidth ( 456 ) ;
61+ } else {
5862 setSidebarColumnSize ( 0 ) ;
5963 }
60- } , [ mobileScreen , dispatch ] ) ;
64+ } , [ mobileScreen ] ) ;
65+
6166
6267 const handleOnEditorChange = ( value ?: string ) => {
6368 setSampleBody ( value ! ) ;
6469 } ;
6570
6671 const handleToggleSelect = ( toggled : boolean ) => {
67- setSidebarColumnSize ( toggled ? 456 : 5 ) ;
72+ if ( mobileScreen ) {
73+ dispatch ( toggleSidebar ( { showSidebar : toggled , mobileScreen : true } ) ) ;
74+ setSidebarColumnSize ( toggled ? window . innerWidth : 0 ) ;
75+ } else {
76+ if ( toggled ) {
77+ setSidebarColumnSize ( initialSidebarWidth > 456 ? initialSidebarWidth : 456 ) ;
78+ } else {
79+ setSidebarColumnSize ( 48 ) ;
80+ }
81+ }
6882 } ;
6983
70- const resetSidebarArea = ( ) => {
71- setSidebarColumnSize ( 456 ) ;
84+ const handleResizeStart = ( event : React . MouseEvent ) => {
85+ event . preventDefault ( ) ;
86+
87+ if ( ! sidebarElement ) { return ; }
88+
89+ const startX = event . clientX ;
90+ const startWidth = parseInt ( getComputedStyle ( sidebarElement ) . width , 10 ) ;
91+
92+ const onMouseMove = ( moveEvent : MouseEvent ) => {
93+ const newWidth = startWidth + ( moveEvent . clientX - startX ) ;
94+ updateSidebarSize ( newWidth ) ;
95+ } ;
96+
97+ const onMouseUp = ( ) => {
98+ window . removeEventListener ( 'mousemove' , onMouseMove ) ;
99+ window . removeEventListener ( 'mouseup' , onMouseUp ) ;
100+ } ;
101+
102+ window . addEventListener ( 'mousemove' , onMouseMove ) ;
103+ window . addEventListener ( 'mouseup' , onMouseUp ) ;
72104 } ;
73105
74- return (
75- < PopupsProvider >
76- < div className = { layoutStyles . container } >
77- < MainHeader />
78- < div id = 'content-ref' className = { mergeClasses ( layoutStyles . content , resizeStyles ) } ref = { sidebarWrapperRef } >
79- { showSidebar && (
80- < div id = 'sidebar-ref' className = { layoutStyles . sidebar } ref = { sidebarElementRef } >
81- < Sidebar handleToggleSelect = { handleToggleSelect } />
82- < LayoutResizeHandler position = 'end' ref = { sidebarHandleRef } onDoubleClick = { resetSidebarArea } />
83- </ div >
84- ) }
85- < div id = 'main-content' className = { layoutStyles . mainContent } >
86- < div style = { { margin : '0 10px' } } >
87- < Notification
88- header = { translateMessage ( 'Banner notification 1 header' ) }
89- content = { translateMessage ( 'Banner notification 1 content' ) }
90- link = { translateMessage ( 'Banner notification 1 link' ) }
91- linkText = { translateMessage ( 'Banner notification 1 link text' ) }
92- />
93- </ div >
94106
95- < ValidationProvider >
107+ const updateSidebarSize = ( newSize : number ) => {
108+ const minSize = 48 ;
109+ const maxSize = window . innerWidth * 0.5 ;
110+
111+ const finalSize = Math . max ( minSize , Math . min ( maxSize , newSize ) ) ;
112+
113+ setSidebarColumnSize ( finalSize ) ;
114+
115+ if ( finalSize > 48 ) {
116+ setInitialSidebarWidth ( finalSize ) ;
117+ }
118+ } ;
119+
120+ return (
121+ < >
122+ < PopupsProvider >
123+ < div className = { layoutStyles . container } >
124+ < MainHeader />
125+ < div id = 'content-ref' className = { mergeClasses ( layoutStyles . content , resizeStyles ) } ref = { sidebarWrapperRef } >
126+ { showSidebar && (
127+ < div id = 'sidebar-ref' className = { layoutStyles . sidebar } ref = { storeSidebarElement } >
128+ < Sidebar handleToggleSelect = { handleToggleSelect } />
129+ { ! mobileScreen && (
130+ < LayoutResizeHandler
131+ position = "end"
132+ ref = { sidebarHandleRef }
133+ onDoubleClick = { ( ) => updateSidebarSize ( 456 ) }
134+ onMouseDown = { handleResizeStart }
135+ />
136+ ) }
137+ </ div >
138+ ) }
139+ < div id = 'main-content' className = { layoutStyles . mainContent } >
96140 < div style = { { margin : '0 10px' } } >
97- < QueryRunner onSelectVerb = { props . handleSelectVerb } />
141+ < Notification
142+ header = { translateMessage ( 'Banner notification 1 header' ) }
143+ content = { translateMessage ( 'Banner notification 1 content' ) }
144+ link = { translateMessage ( 'Banner notification 1 link' ) }
145+ linkText = { translateMessage ( 'Banner notification 1 link text' ) }
146+ />
98147 </ div >
99- < div id = 'request-response-area' className = { layoutStyles . requestResponseArea } >
100- < div id = 'request-area' className = { layoutStyles . requestArea } >
101- < Request handleOnEditorChange = { handleOnEditorChange } sampleQuery = { sampleQuery } />
102- </ div >
148+ < ValidationProvider >
103149 < div style = { { margin : '0 10px' } } >
104- < StatusMessages />
150+ < QueryRunner onSelectVerb = { props . handleSelectVerb } />
105151 </ div >
106- < div id = 'response-area' className = { layoutStyles . responseArea } >
107- < QueryResponse />
152+ < div id = 'request-response-area' className = { layoutStyles . requestResponseArea } >
153+ < div id = 'request-area' className = { layoutStyles . requestArea } >
154+ < Request handleOnEditorChange = { handleOnEditorChange } sampleQuery = { sampleQuery } />
155+ </ div >
156+ < div style = { { margin : '0 10px' } } >
157+ < StatusMessages />
158+ </ div >
159+ < div id = 'response-area' className = { layoutStyles . responseArea } >
160+ < QueryResponse />
161+ </ div >
108162 </ div >
109- </ div >
110- </ ValidationProvider >
163+ </ ValidationProvider >
164+ </ div >
111165 </ div >
166+ < TermsOfUseMessage />
112167 </ div >
113- < TermsOfUseMessage />
114- </ div >
115- < CollectionPermissionsProvider >
116- < PopupsWrapper />
117- </ CollectionPermissionsProvider >
118- </ PopupsProvider >
168+ < CollectionPermissionsProvider >
169+ < PopupsWrapper />
170+ </ CollectionPermissionsProvider >
171+ </ PopupsProvider >
172+ </ >
119173 ) ;
120174} ;
0 commit comments