Skip to content

Commit 1e4c917

Browse files
committed
Merge branch 'create-versions-dropdown' of https://github.com/fergarrui/ethereum-graph-debugger into create-versions-dropdown
2 parents cffe11f + a690945 commit 1e4c917

File tree

9 files changed

+81
-13
lines changed

9 files changed

+81
-13
lines changed

cfg

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/api/service/controller/FileController.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { Route, Controller, Get, Path, Query } from 'tsoa'
1+
import { Route, Controller, Get, Path, Query, Post, Body } from 'tsoa'
22
import { provideSingleton, inject } from '../../../inversify/ioc'
33
import { ContractFile } from '../bean/ContractFile'
44
import { TYPES } from '../../../inversify/types'
55
import { FileService } from '../service/FileService'
66
import { logger } from '../../../Logger'
7+
import { SaveFileRequest } from '../request/SaveFileRequest';
78

89
@Route('files')
910
@provideSingleton(FileController)
@@ -25,4 +26,14 @@ export class FileController extends Controller {
2526
throw new Error(err.message)
2627
}
2728
}
29+
30+
@Post()
31+
async saveFile(@Body() saveFileRequest: SaveFileRequest) {
32+
try {
33+
await this.fileService.saveFile(saveFileRequest.path, saveFileRequest.name, saveFileRequest.content)
34+
} catch (err) {
35+
logger.error(err)
36+
throw new Error(err.message)
37+
}
38+
}
2839
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface SaveFileRequest {
2+
path: string
3+
name: string
4+
content: string
5+
}

src/api/service/service/FileService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ import { ContractFile } from '../bean/ContractFile'
22

33
export interface FileService {
44
findContractssWithExtension(dir: string, extension: string): Promise<ContractFile[]>
5+
saveFile(dir: string, name: string, content: string)
56
}

src/api/service/service/FileServiceDefault.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,9 @@ export class FileServiceDefault implements FileService {
2222
})
2323
.sort((a, b) => (a.name > b.name ? 1 : -1))
2424
}
25+
26+
async saveFile(dir: string, name: string, content: string) {
27+
const filePath = path.join(dir, name)
28+
return fs.writeFileSync(filePath, content)
29+
}
2530
}

src/client/components/Editor/AceEditor/AceEditor.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,29 @@ class ConnectedCodeEditor extends React.Component {
2222
setReadOnly,
2323
setValue,
2424
theme,
25+
path,
26+
name,
2527
mode,
2628
setUseWorker,
2729
index,
2830
selectedLines
2931
} = this.props;
30-
3132
require(`brace/mode/${mode}`);
3233
require(`brace/theme/${theme}`);
3334
const editor = ace.edit(`ace-editor-${index}`);
3435
this.editor = editor;
3536
editor.getSession().setMode(`ace/mode/${mode}`);
3637
editor.getSession().setUseWorker(setUseWorker);
3738
editor.setTheme(`ace/theme/${theme}`);
38-
editor.on('change', e => onChange(editor.getValue(), e));
39+
editor.on('change', e => onChange(editor.getValue(),path,name, e));
3940
editor.setReadOnly(setReadOnly);
4041
editor.setValue(setValue);
4142
this.selectLines(selectedLines);
4243
}
4344
}
4445

4546
componentDidUpdate() {
46-
const { selectedLines } = this.props;
47-
47+
const { selectedLines, path } = this.props;
4848
this.selectLines(selectedLines);
4949
}
5050

src/client/components/Editor/Editor.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,44 @@ import React from 'react';
22

33
import CodeEditor from './AceEditor/AceEditor';
44

5-
const Editor = ({ code, index }) => {
65

6+
const Editor = ({ code, path, name, index, changeCode }) => {
77
return (
88
<CodeEditor
99
index={index}
10+
name={name}
1011
mode='javascript'
1112
theme='twilight'
12-
setReadOnly={true}
13+
path={path}
14+
setReadOnly={false}
1315
style={{ height: '500px', width: '100%' }}
1416
setValue={code}
1517
setUseWorker={false}
18+
onChange={onChange}
1619
>
1720
</CodeEditor>
1821
);
1922
}
2023

24+
let timeout = null
25+
26+
const onChange = (code, path, name, event) => {
27+
28+
clearTimeout(timeout)
29+
30+
timeout = setTimeout(() => {
31+
fetch(`http://localhost:9090/files`,{
32+
body: JSON.stringify({
33+
path: path,
34+
name: name,
35+
content: code
36+
}),
37+
method: 'POST',
38+
headers: {
39+
'Content-Type': 'application/json'
40+
}
41+
})
42+
}, 1000)
43+
}
44+
2145
export default Editor;

src/client/components/Tab/TabPanel/TabPanel.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const TabPanel = ({ children, active }) => {
1212
'tab-panel': true,
1313
'tab-panel--active': !!active,
1414
});
15-
1615
return (
1716
<div className={tabPanelClasses}>
1817
{children}

src/routes.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ const models: TsoaRoute.Models = {
4747
"path": { "dataType": "string", "required": true },
4848
},
4949
},
50+
"SaveFileRequest": {
51+
"properties": {
52+
"path": { "dataType": "string", "required": true },
53+
"content": { "dataType": "string", "required": true },
54+
},
55+
},
5056
"DisassembledContractResponse": {
5157
"properties": {
5258
"hasConstructor": { "dataType": "boolean", "required": true },
@@ -167,6 +173,28 @@ export function RegisterRoutes(app: express.Express) {
167173
const promise = controller.findContractsInDir.apply(controller, validatedArgs as any);
168174
promiseHandler(controller, promise, response, next);
169175
});
176+
app.post('/files',
177+
function(request: any, response: any, next: any) {
178+
const args = {
179+
saveFileRequest: { "in": "body", "name": "saveFileRequest", "required": true, "ref": "SaveFileRequest" },
180+
};
181+
182+
let validatedArgs: any[] = [];
183+
try {
184+
validatedArgs = getValidatedArgs(args, request);
185+
} catch (err) {
186+
return next(err);
187+
}
188+
189+
const controller = iocContainer.get<FileController>(FileController);
190+
if (typeof controller['setStatus'] === 'function') {
191+
(<any>controller).setStatus(undefined);
192+
}
193+
194+
195+
const promise = controller.saveFile.apply(controller, validatedArgs as any);
196+
promiseHandler(controller, promise, response, next);
197+
});
170198
app.post('/disassemble',
171199
function(request: any, response: any, next: any) {
172200
const args = {

0 commit comments

Comments
 (0)