Skip to content

Commit 9e48c77

Browse files
committed
feat: directories support (beta)
1 parent 17ba21e commit 9e48c77

File tree

8 files changed

+145
-15
lines changed

8 files changed

+145
-15
lines changed
7.33 KB
Binary file not shown.

client/src/App.css

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,40 @@ input[type='file'] {
8383
overflow-y: auto;
8484
}
8585

86+
.files-area.dir-open {
87+
position: relative;
88+
background-color: #1e1e1e;
89+
width: 70%;
90+
height: 70vh;
91+
position: absolute;
92+
top: 50%;
93+
left: 50%;
94+
transform: translate(-50%, -50%);
95+
}
96+
97+
.files-area.dir-open .dir-menu {
98+
border: solid #f4f4ff;
99+
background-color: #1e1e1e;
100+
position: absolute;
101+
top: 0;
102+
width: 100%;
103+
text-align: center;
104+
z-index: 1;
105+
}
106+
107+
.files-area.dir-open .dir-menu svg {
108+
position: absolute;
109+
left: 2em;
110+
height: 100%;
111+
cursor: pointer;
112+
}
113+
86114
@media screen and (max-width: 768px) {
87115
.file-selectors p + div form {
88116
text-align: center;
89117
}
118+
.files-area.dir-open {
119+
background-color: #1e1e1e;
120+
width: 100%;
121+
}
90122
}

client/src/App.tsx

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import Draggable from 'react-draggable';
33
import { isMobile } from 'react-device-detect';
44

55
import { 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';
810
import { actionState, freeModeDisabledState, virtualFilesState } from './atoms/atoms';
9-
import { openVirtualFilesWrapper, saveVirtualFilesWrapper } from './utils/goFunctions';
11+
import { exploreDirectoryWrapper, isDirectoryWrapper, openVirtualFilesWrapper, saveVirtualFilesWrapper } from './utils/goFunctions';
1012
import Actions from './components/Actions/Actions';
1113

1214
import Files from './components/Files/Files';
@@ -19,21 +21,37 @@ import { keyChecker } from './utils/utilityFunctions';
1921
import './App.css';
2022

2123
function 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>>([]);
33+
34+
const goBackInDirectories = () => {
35+
if (oldVirtualFiles.length > 0) {
36+
setVirtualFiles([...oldVirtualFiles]);
37+
return setOldVirtualFiles([])
38+
}
39+
}
2940

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]);
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) => {
@@ -72,20 +90,30 @@ function App() {
7290
<Actions />
7391
<Files />
7492
<div className="App">
75-
<div className="files-area" style={filesAreaStyle}>
93+
<div className={`files-area ${oldVirtualFiles.length > 0 ? 'dir-open' : ''}`} style={filesAreaStyle}>
94+
{oldVirtualFiles.length > 0 && <div className="dir-menu">
95+
{openDir}
96+
<BackArrowIcon onClick={goBackInDirectories}/>
97+
</div>}
7698
{virtualFiles.map((virtualFile, index) => {
99+
// Check if directory
100+
const isDirectory = isDirectoryWrapper(virtualFile);
101+
// Check if file was prev opened
102+
const prevOpened = !!prevOpenedFiles.find((f) => f === virtualFile) ? 'modified' : '';
103+
// Regex on name
104+
const virtualFileName = (virtualFile as string).split('/').at(-1);
77105
// Double click on files to open (on mobile should disable the drag - from the menu)
78106
return (
79107
<Draggable key={index} bounds="parent" disabled={freeModeDisabled}>
80108
<div
81109
onDoubleClick={() => {
82-
clickOnFileHandler(virtualFile);
110+
clickOnFileHandler(virtualFile, isDirectory);
83111
}}
84-
className={`virtual-file-wrapper ${!!prevOpenedFiles.find((f) => f === virtualFile) ? 'modified' : ''}`}
112+
className={`virtual-file-wrapper ${prevOpened}`}
85113
>
86-
<DocumentIcon size={60} />
114+
{isDirectory ? <FolderIcon size={60} /> : <DocumentIcon size={60} />}
87115
<div key={index} className="file">
88-
{virtualFile}
116+
{virtualFileName}
89117
</div>
90118
</div>
91119
</Draggable>

client/src/utils/goFunctions.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,12 @@ export const virtualCommitWrapper = (commitMsg: string) => {
4545

4646
// @ts-ignore
4747
export const goToCommitWrapper = (hash: string) => goToCommit(hash);
48+
49+
export const exploreDirectoryWrapper = (filename: string) => {
50+
// @ts-ignore
51+
const filepath = `./${filename}/`+ exploreDirectory(filename);
52+
return filepath.split(' ');
53+
};
54+
55+
// @ts-ignore
56+
export const isDirectoryWrapper = (filename: string) => isDirectory(filename);

nova/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ func main() {
1515
js.Global().Set("getVirtualFiles", mapping.GetVirtualFiles())
1616
js.Global().Set("goToBranch", mapping.GoToBranch())
1717
js.Global().Set("goToCommit", mapping.GoToCommit())
18+
js.Global().Set("exploreDirectory", mapping.ExploreDirectory())
19+
js.Global().Set("isDirectory", mapping.IsDirectory())
1820
<-ch
1921
}

nova/mapping/mapping.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,18 @@ func GoToCommit() js.Func {
145145
return commitHash
146146
})
147147
}
148+
149+
func ExploreDirectory() js.Func {
150+
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
151+
filename := args[0].String()
152+
filenames := novaStore.ExploreDirectory(store, texts.CurrentDirectory, filename)
153+
return strings.Join(filenames, " ")
154+
})
155+
}
156+
157+
func IsDirectory() js.Func {
158+
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
159+
filename := args[0].String()
160+
return novaStore.IsDirectory(store, texts.CurrentDirectory, filename)
161+
})
162+
}

nova/virtual/functions.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,42 @@ func listFiles(store billy.Filesystem, dir string) []string {
4646
return fileInfos
4747
}
4848

49+
func isDirectory(store billy.Filesystem, dir string, filename string) bool {
50+
files, err := store.ReadDir(dir)
51+
52+
if err != nil {
53+
log.Println(err)
54+
return false
55+
}
56+
57+
for _, file := range files {
58+
if file.Name() == filename {
59+
if file.IsDir() {
60+
return true
61+
}
62+
}
63+
}
64+
65+
return false
66+
}
67+
68+
func getDirectoryFiles(store billy.Filesystem, dir string, filename string) []string {
69+
files, err := store.ReadDir(dir)
70+
71+
if err != nil {
72+
log.Println(err)
73+
return nil
74+
}
75+
for _, file := range files {
76+
if file.Name() == filename {
77+
if file.IsDir() {
78+
return listFiles(store, file.Name())
79+
}
80+
}
81+
}
82+
return nil
83+
}
84+
4985
func openFile(store billy.Filesystem, fileName string) (billy.Filesystem, billy.File) {
5086
newFile, err := store.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644)
5187
if err != nil {

nova/virtual/virtualSystem.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ func (ns *NovaStore) GetFiles(store billy.Filesystem, dir string) []string {
4444
return listFiles(store, dir)
4545
}
4646

47+
func (ns *NovaStore) ExploreDirectory(store billy.Filesystem, dir string, filename string) []string {
48+
return getDirectoryFiles(store, dir, filename)
49+
}
50+
51+
func (ns *NovaStore) IsDirectory(store billy.Filesystem, dir string, filename string) bool {
52+
return isDirectory(store, dir, filename)
53+
}
54+
4755
func (ns *NovaStore) OpenFile(store billy.Filesystem, fileName string) billy.File {
4856
fileGotCreated, file := openFile(store, fileName)
4957
if fileGotCreated != nil {

0 commit comments

Comments
 (0)