11import { mergeClasses } from '@fluentui/react-components' ;
2- import { useEffect , useState } from 'react' ;
2+ import { useEffect , useRef , useState } from 'react' ;
33import { useAppDispatch , useAppSelector } from '../../../store' ;
44import CollectionPermissionsProvider from '../../services/context/collection-permissions/CollectionPermissionsProvider' ;
55import { PopupsProvider } from '../../services/context/popups-context' ;
@@ -17,7 +17,7 @@ import Request from '../query-runner/request/Request';
1717import { Sidebar } from '../sidebar/Sidebar' ;
1818import { LayoutResizeHandler } from './LayoutResizeHandler' ;
1919import { useResizeHandle } from '@fluentui-contrib/react-resize-handle' ;
20- import { useLayoutResizeStyles , useLayoutStyles , SIDEBAR_SIZE_CSS_VAR } from './LayoutStyles' ;
20+ import { useLayoutResizeStyles , useLayoutStyles , SIDEBAR_SIZE_CSS_VAR , REQUEST_HEIGHT_CSS_VAR } from './LayoutStyles' ;
2121import { useDetectMobileScreen } from '../../utils/useDetectMobileScreen' ;
2222
2323interface LayoutProps {
@@ -30,9 +30,12 @@ export const Layout = (props: LayoutProps) => {
3030 const resizeStyles = useLayoutResizeStyles ( ) ;
3131 const dispatch = useAppDispatch ( ) ;
3232 const sampleQuery = useAppSelector ( ( state ) => state . sampleQuery ) ;
33+ const [ sampleBody , setSampleBody ] = useState ( '' ) ;
3334 const { mobileScreen, showSidebar } = useAppSelector ( ( state ) => state . sidebarProperties ) ;
3435 const [ initialSidebarWidth , setInitialSidebarWidth ] = useState ( 456 ) ;
3536 const [ sidebarElement , setSidebarElement ] = useState < HTMLElement | null > ( null ) ;
37+ const [ requestHeight , setRequestHeight ] = useState ( 300 ) ;
38+ const requestRef = useRef < HTMLDivElement | null > ( null ) ;
3639
3740 const {
3841 handleRef : sidebarHandleRef ,
@@ -44,8 +47,6 @@ export const Layout = (props: LayoutProps) => {
4447 growDirection : 'end'
4548 } ) ;
4649
47- const [ sampleBody , setSampleBody ] = useState ( '' ) ;
48-
4950 useEffect ( ( ) => {
5051 if ( sampleQuery . selectedVerb !== 'GET' ) {
5152 const query = { ...sampleQuery } ;
@@ -117,6 +118,40 @@ export const Layout = (props: LayoutProps) => {
117118 }
118119 } ;
119120
121+ const updateRequestHeight = ( newHeight : number ) => {
122+ const min = 150 ;
123+ const max = window . innerHeight * 0.5 ;
124+ const finalHeight = Math . max ( min , Math . min ( max , newHeight ) ) ;
125+
126+ document . documentElement . style . setProperty ( REQUEST_HEIGHT_CSS_VAR , `${ finalHeight } px` ) ;
127+ setRequestHeight ( finalHeight ) ;
128+ } ;
129+
130+ const handleRequestResizeStart = ( e : React . MouseEvent ) => {
131+ e . preventDefault ( ) ;
132+
133+ const startY = e . clientY ;
134+ const startHeight = requestRef . current
135+ ? parseInt ( getComputedStyle ( requestRef . current ) . height , 10 )
136+ : requestHeight ;
137+
138+ const onMouseMove = ( event : MouseEvent ) => {
139+ const newHeight = startHeight + ( event . clientY - startY ) ;
140+ updateRequestHeight ( newHeight ) ;
141+ } ;
142+
143+ const onMouseUp = ( ) => {
144+ window . removeEventListener ( 'mousemove' , onMouseMove ) ;
145+ window . removeEventListener ( 'mouseup' , onMouseUp ) ;
146+ } ;
147+
148+ window . addEventListener ( 'mousemove' , onMouseMove ) ;
149+ window . addEventListener ( 'mouseup' , onMouseUp ) ;
150+ } ;
151+
152+ useEffect ( ( ) => {
153+ document . documentElement . style . setProperty ( REQUEST_HEIGHT_CSS_VAR , `${ requestHeight } px` ) ;
154+ } , [ ] ) ;
120155 return (
121156 < >
122157 < PopupsProvider >
@@ -128,7 +163,7 @@ export const Layout = (props: LayoutProps) => {
128163 < Sidebar handleToggleSelect = { handleToggleSelect } />
129164 { ! mobileScreen && (
130165 < LayoutResizeHandler
131- position = " end"
166+ position = ' end'
132167 ref = { sidebarHandleRef }
133168 onDoubleClick = { ( ) => updateSidebarSize ( 456 ) }
134169 onMouseDown = { handleResizeStart }
@@ -150,8 +185,20 @@ export const Layout = (props: LayoutProps) => {
150185 < QueryRunner onSelectVerb = { props . handleSelectVerb } />
151186 </ div >
152187 < div id = 'request-response-area' className = { layoutStyles . requestResponseArea } >
153- < div id = 'request-area' className = { layoutStyles . requestArea } >
188+ < div
189+ id = 'request-area'
190+ className = { layoutStyles . requestArea }
191+ ref = { requestRef }
192+ style = { { height : `var(${ REQUEST_HEIGHT_CSS_VAR } )` } }
193+ >
154194 < Request handleOnEditorChange = { handleOnEditorChange } sampleQuery = { sampleQuery } />
195+ { ! mobileScreen && (
196+ < LayoutResizeHandler
197+ position = 'bottom'
198+ onMouseDown = { handleRequestResizeStart }
199+ onDoubleClick = { ( ) => updateRequestHeight ( 300 ) }
200+ />
201+ ) }
155202 </ div >
156203 < div style = { { margin : '0 10px' } } >
157204 < StatusMessages />
0 commit comments