Skip to content

Commit 2554e04

Browse files
committed
Create collapse menu for the left menu
1 parent 11612ca commit 2554e04

File tree

5 files changed

+62
-11
lines changed

5 files changed

+62
-11
lines changed

src/App.tsx

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react';
1+
import { useEffect, useRef, useState } from 'react';
22
import './sass/index.scss';
33
import LeftMenu from './components/LeftMenu/LeftMenu';
44
import Editor from './components/Editor/Editor';
@@ -10,17 +10,27 @@ import petStoreAPISpec from './assets/petstore.apispec.json';
1010
function App() {
1111
const [ content, setContent ] = useState<string | undefined>();
1212
const [ leftMenuCollapse, setLeftMenuCollapse] = useState(false);
13+
const rightMenuRef:React.RefObject<HTMLDivElement> = useRef(null);
1314

1415
useEffect(() => {
1516
// Check IndexedDB to grab API Specification
1617
// if there is no exsiting spec.
1718
setContent(JSON.stringify(petStoreAPISpec, null, 2));
1819
}, [])
20+
21+
useEffect(() => {
22+
if(!rightMenuRef.current) return;
23+
if(!leftMenuCollapse){
24+
rightMenuRef.current.style.width = "calc(100vw - 350px)";
25+
}else{
26+
rightMenuRef.current.style.width = "calc(100vw - 65px)";
27+
}
28+
}, [leftMenuCollapse])
1929
return (
2030
<>
2131
<div className="app-wrapper">
2232
<LeftMenu setContent={setContent} leftMenuCollapse={leftMenuCollapse} setLeftMenuCollapse={setLeftMenuCollapse} />
23-
<div className="editor-page-wrapper">
33+
<div className="editor-page-wrapper" ref={rightMenuRef}>
2434
<ReactSplitPane
2535
size={'50%'}
2636
>

src/components/LeftMenu/LeftMenu.tsx

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import React from 'react';
1+
import React, { useRef } from 'react';
22
import { BsChevronDoubleLeft, BsChevronDoubleRight } from "react-icons/bs";
3-
import ReadJSONYAMLfile from '../Readfile/Readfile';
3+
import ReadJSONYAMLfile, { ICONReadJSONYAMLfile } from '../Readfile/Readfile';
44
import TooltipComponent from '../Tooltip/Tooltip';
55

66
interface LeftMenuTypes{
@@ -9,18 +9,35 @@ interface LeftMenuTypes{
99
setLeftMenuCollapse: React.Dispatch<React.SetStateAction<boolean>>
1010
}
1111
const LeftMenu:React.FC<LeftMenuTypes> = ({setContent, leftMenuCollapse, setLeftMenuCollapse}) => {
12+
const leftMenuRef:React.RefObject<HTMLDivElement> = useRef(null);
13+
14+
function handleCollapse() {
15+
if(!leftMenuRef.current) return;
16+
if(!leftMenuCollapse){
17+
leftMenuRef.current.style.flex = "0 0 65px";
18+
leftMenuRef.current.style.width = "65px";
19+
}else{
20+
leftMenuRef.current.style.flex = "0 0 349px";
21+
leftMenuRef.current.style.width = "349px";
22+
}
23+
setLeftMenuCollapse((pre) => !pre);
24+
}
1225
return(
13-
<div className="left-menu">
14-
<ReadJSONYAMLfile setContent={setContent} />
26+
<div className="left-menu" ref={leftMenuRef}>
27+
{
28+
leftMenuCollapse
29+
? <ICONReadJSONYAMLfile setContent={setContent} />
30+
: <ReadJSONYAMLfile setContent={setContent} />
31+
}
1532

1633
<div className="collapse-handle-icon-wrapper">
1734
<div className="collapse-handle-icon">
1835
{
1936
leftMenuCollapse
20-
? <TooltipComponent message="Show more information" isButtonStyle={true} onClick={() => setLeftMenuCollapse(false) }>
37+
? <TooltipComponent message="Show more information" isButtonStyle={true} onClick={handleCollapse}>
2138
<BsChevronDoubleRight className="icon" />
2239
</TooltipComponent>
23-
: <TooltipComponent message="Show less information" isButtonStyle={true} onClick={() => setLeftMenuCollapse(true) } >
40+
: <TooltipComponent message="Show less information" isButtonStyle={true} onClick={handleCollapse} >
2441
<BsChevronDoubleLeft className="icon" />
2542
</TooltipComponent>
2643
}

src/components/Readfile/Readfile.tsx

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import React, { useState, useRef } from 'react';
22
import { useHandleReadFileStatus } from './ReadfileReducer';
3-
import { Card, Button } from 'react-bootstrap';
3+
import { Card, Button, Modal } from 'react-bootstrap';
44
import { BsXCircle, BsFileEarmark } from "react-icons/bs";
5+
import TooltipComponent from '../Tooltip/Tooltip';
56

67
interface ReadJSONYAMLfileType {
78
isMulipleFiles?: boolean
89
setContent: React.Dispatch<React.SetStateAction<string | undefined>>
10+
closeModal?: () => void
911
}
1012

11-
const ReadJSONYAMLfile:React.FC<ReadJSONYAMLfileType> = ({setContent, isMulipleFiles = false}) => {
13+
const ReadJSONYAMLfile:React.FC<ReadJSONYAMLfileType> = ({setContent, isMulipleFiles = false, closeModal}) => {
1214
const readFileBoxRef = useRef<HTMLDivElement>(null);
1315
const [ fileName, setFileName ] = useState();
1416
const [ fileType, setFileType ] = useState('json');
@@ -112,6 +114,7 @@ const ReadJSONYAMLfile:React.FC<ReadJSONYAMLfileType> = ({setContent, isMulipleF
112114
setTimeout(() => {
113115
setContent(selectedSpec);
114116
closeFileOnclick();
117+
closeModal && closeModal();
115118
}, 500)
116119
}
117120
return(<div className="read-file-wrapper">
@@ -157,4 +160,20 @@ const ReadJSONYAMLfile:React.FC<ReadJSONYAMLfileType> = ({setContent, isMulipleF
157160
</div>)
158161
}
159162

163+
const ICONReadJSONYAMLfile:React.FC<{setContent: React.Dispatch<React.SetStateAction<string | undefined>>}> = ({ setContent }) => {
164+
const [ show, setShow ] = useState(false);
165+
166+
return(<>
167+
<div className="read-file-wrapper collased" onClick={() => setShow(true)}>
168+
<TooltipComponent message="Import API Specification" placement='auto' isButtonStyle={true}>
169+
<BsFileEarmark />
170+
</TooltipComponent>
171+
</div>
172+
<Modal show={show} onHide={() => setShow(false)}>
173+
<Modal.Body><ReadJSONYAMLfile setContent={setContent} closeModal={() => setShow(false)} /></Modal.Body>
174+
</Modal>
175+
</>)
176+
}
177+
178+
export { ICONReadJSONYAMLfile };
160179
export default ReadJSONYAMLfile;

src/sass/components/_leftMenu.scss

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
border-right: 1px dotted var(--color-background-border);
55
display: flex;
66
flex-direction: column;
7+
transition: all 0.2s ease-in-out;
78
.collapse-handle-icon-wrapper{
89
flex: 1 1 auto;
910
display: flex;
1011
align-items: flex-end;
1112
.collapse-handle-icon{
1213
border-top: 0.0625rem solid #f2f2f2;
1314
width: 100%;
14-
padding: 10px 20px 10px 18px;
15+
padding: 10px 12px 10px 12px;
1516
text-align: right;
1617
.icon{
1718
&:hover{

src/sass/components/_readfile.scss

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
.read-file-wrapper{
22
padding: 24px;
3+
&.collased{
4+
padding-left: 12px;
5+
padding-right: 12px;
6+
}
37
.readfile-box{
48
position: relative;
59
display: flex;

0 commit comments

Comments
 (0)