@@ -3,10 +3,12 @@ import Draggable from 'react-draggable';
33import { isMobile } from 'react-device-detect' ;
44
55import { IoMdDocument as DocumentIcon } from '@react-icons/all-files/io/IoMdDocument' ;
6+ import { IoIosFolderOpen as FolderIcon } from '@react-icons/all-files/io/IoIosFolderOpen' ;
7+ import { AiOutlineArrowLeft as BackArrowIcon } from '@react-icons/all-files/ai/AiOutlineArrowLeft' ;
68
7- import { useRecoilValue , useSetRecoilState } from 'recoil' ;
9+ import { useRecoilState , useRecoilValue , useSetRecoilState } from 'recoil' ;
810import { actionState , freeModeDisabledState , virtualFilesState } from './atoms/atoms' ;
9- import { openVirtualFilesWrapper , saveVirtualFilesWrapper } from './utils/goFunctions' ;
11+ import { exploreDirectoryWrapper , isDirectoryWrapper , openVirtualFilesWrapper , saveVirtualFilesWrapper } from './utils/goFunctions' ;
1012import Actions from './components/Actions/Actions' ;
1113
1214import Files from './components/Files/Files' ;
@@ -19,21 +21,37 @@ import { keyChecker } from './utils/utilityFunctions';
1921import './App.css' ;
2022
2123function App ( ) {
22- const virtualFiles = useRecoilValue ( virtualFilesState ) ;
24+ const [ virtualFiles , setVirtualFiles ] = useRecoilState ( virtualFilesState ) ;
2325 const setAction = useSetRecoilState ( actionState ) ;
2426 const freeModeDisabled = useRecoilValue ( freeModeDisabledState ) ;
2527
2628 const [ editorContent , setEditorContent ] = useState < string > ( '' ) ;
2729 const [ openFile , setOpenFile ] = useState < string > ( '' ) ;
2830 const [ prevOpenedFiles , setPrevOpenedFiles ] = useState < Array < string > > ( [ ] ) ;
31+ const [ openDir , setOpenDir ] = useState < string > ( '' ) ;
32+ const [ oldVirtualFiles , setOldVirtualFiles ] = useState < Array < never > > ( [ ] ) ;
2933
30- const clickOnFileHandler = ( virtualFile : never ) => {
31- // Get the file content from Go functions
32- // Open the file
33- // DEPRECATED: keep track of prev opened files (put that to color them differently or for future usages)
34- setEditorContent ( openVirtualFilesWrapper ( virtualFile ) ) ;
35- setOpenFile ( virtualFile ) ;
36- setPrevOpenedFiles ( ( prev : Array < string > ) => [ ...prev , virtualFile ] ) ;
34+ const goBackInDirectories = ( ) => {
35+ if ( oldVirtualFiles . length > 0 ) {
36+ setVirtualFiles ( [ ...oldVirtualFiles ] ) ;
37+ return setOldVirtualFiles ( [ ] ) ;
38+ }
39+ } ;
40+
41+ const clickOnFileHandler = ( virtualFile : never , isDirectory : boolean = false ) => {
42+ if ( ! isDirectory ) {
43+ // Get the file content from Go functions
44+ // Open the file
45+ setEditorContent ( openVirtualFilesWrapper ( virtualFile ) ) ;
46+ setPrevOpenedFiles ( ( prev : Array < string > ) => [ ...prev , virtualFile ] ) ;
47+ setOpenFile ( virtualFile ) ;
48+ } else {
49+ // Keep track of the directory you open to go back
50+ setOldVirtualFiles ( virtualFiles ) ;
51+ // Explore direcory
52+ setVirtualFiles ( exploreDirectoryWrapper ( virtualFile ) as never [ ] ) ;
53+ setOpenDir ( virtualFile ) ;
54+ }
3755 } ;
3856
3957 const saveChanges = ( content : string ) => {
@@ -55,10 +73,13 @@ function App() {
5573
5674 useEffect ( ( ) => {
5775 window . addEventListener ( 'keydown' , keyboardShortcut ) ;
76+ if ( localStorage . getItem ( 'harmony-tutorial' ) ) {
77+ localStorage . removeItem ( 'harmony-tutorial' ) ;
78+ }
5879 // Show the tutorial
59- if ( ! localStorage . getItem ( 'harmony-tutorial' ) ) {
80+ if ( ! localStorage . getItem ( 'new- harmony-tutorial' ) ) {
6081 setAction ( HELP ) ;
61- localStorage . setItem ( 'harmony-tutorial' , 'true' ) ;
82+ localStorage . setItem ( 'new- harmony-tutorial' , 'true' ) ;
6283 }
6384
6485 return ( ) => {
@@ -72,20 +93,32 @@ function App() {
7293 < Actions />
7394 < Files />
7495 < div className = "App" >
75- < div className = "files-area" style = { filesAreaStyle } >
96+ < div className = { `files-area ${ oldVirtualFiles . length > 0 ? 'dir-open' : '' } ` } style = { filesAreaStyle } >
97+ { oldVirtualFiles . length > 0 && (
98+ < div className = "dir-menu" >
99+ { openDir }
100+ < BackArrowIcon onClick = { goBackInDirectories } />
101+ </ div >
102+ ) }
76103 { virtualFiles . map ( ( virtualFile , index ) => {
104+ // Check if directory
105+ const isDirectory = isDirectoryWrapper ( virtualFile ) ;
106+ // Check if file was prev opened
107+ const prevOpened = ! ! prevOpenedFiles . find ( ( f ) => f === virtualFile ) ? 'modified' : '' ;
108+ // Regex on name
109+ const virtualFileName = ( virtualFile as string ) . split ( '/' ) . at ( - 1 ) ;
77110 // Double click on files to open (on mobile should disable the drag - from the menu)
78111 return (
79112 < Draggable key = { index } bounds = "parent" disabled = { freeModeDisabled } >
80113 < div
81114 onDoubleClick = { ( ) => {
82- clickOnFileHandler ( virtualFile ) ;
115+ clickOnFileHandler ( virtualFile , isDirectory ) ;
83116 } }
84- className = { `virtual-file-wrapper ${ ! ! prevOpenedFiles . find ( ( f ) => f === virtualFile ) ? 'modified ' : '' } ` }
117+ className = { `virtual-file-wrapper ${ prevOpened } ${ isDirectory ? 'dir ' : '' } ` }
85118 >
86- < DocumentIcon size = { 60 } />
87- < div key = { index } className = " file" >
88- { virtualFile }
119+ { isDirectory ? < FolderIcon size = { 60 } /> : < DocumentIcon size = { 60 } /> }
120+ < div key = { index } className = { ` file` } >
121+ { virtualFileName }
89122 </ div >
90123 </ div >
91124 </ Draggable >
0 commit comments