Skip to content

Commit 6ddf858

Browse files
committed
Refactor question component: replace request state with refs and add validation action for SQL editor
1 parent ea5c540 commit 6ddf858

1 file changed

Lines changed: 44 additions & 22 deletions

File tree

src/components/question.tsx

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Grid from "@mui/material/Grid";
77
import IconButton from "@mui/material/IconButton";
88
import Snackbar from "@mui/material/Snackbar";
99
import Typography from "@mui/material/Typography";
10-
import React, { useState } from "react";
10+
import React, { useState, useRef } from "react";
1111
import ResultsTable from "./results";
1212

1313
var equal = require("fast-deep-equal/es6/react");
@@ -17,13 +17,37 @@ function round_floats(a: number[][]) {
1717
}
1818

1919
export default ({ name, db, question, answer }): JSX.Element => {
20-
const [request, setRequest] = useState("");
20+
const requestRef = useRef("");
21+
const dbRef = useRef(db);
22+
const answerRef = useRef(answer);
23+
dbRef.current = db;
24+
answerRef.current = answer;
25+
2126
const [result, setResult] = useState<null | any[]>(null);
2227
const [expected, setExpected] = useState<null | any[]>(null);
2328
const [verdict, setVerdict] = useState(0);
2429
const [error, setError] = useState(null);
2530
const [open, setOpen] = useState(false);
2631

32+
const validate = () => {
33+
setOpen(false);
34+
try {
35+
let exp = dbRef.current.exec(answerRef.current);
36+
let r = dbRef.current.exec(requestRef.current);
37+
setResult(r);
38+
setExpected(exp);
39+
if (r.length === 0)
40+
setVerdict(0);
41+
else
42+
setVerdict(equal(round_floats(r[0].values), round_floats(exp[0].values)) ? 1 : 0);
43+
setError(null);
44+
} catch (err) {
45+
console.log(err);
46+
setError(err.message);
47+
}
48+
setOpen(true);
49+
};
50+
2751
const handleClose = (_: React.SyntheticEvent | Event, reason?: string) => {
2852
if (reason === "clickaway") {
2953
return;
@@ -74,7 +98,22 @@ export default ({ name, db, question, answer }): JSX.Element => {
7498
<Editor
7599
height="13vh"
76100
defaultLanguage="sql"
77-
onChange={(e) => setRequest(e)}
101+
onChange={(e) => {
102+
requestRef.current = e || "";
103+
}}
104+
onMount={(editor, monaco) => {
105+
editor.addAction({
106+
id: 'validate-sql',
107+
label: 'Valider la requête',
108+
keybindings: [
109+
monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter
110+
],
111+
run: () => {
112+
requestRef.current = editor.getValue();
113+
validate();
114+
}
115+
});
116+
}}
78117
options={{
79118
lineNumbers: "off",
80119
minimap: {
@@ -89,26 +128,9 @@ export default ({ name, db, question, answer }): JSX.Element => {
89128
size="large"
90129
variant="contained"
91130
color="success"
92-
onClick={() => {
93-
setOpen(false);
94-
try {
95-
let expected = db.exec(answer);
96-
let r = db.exec(request);
97-
setResult(r);
98-
setExpected(expected);
99-
if (r.length === 0)
100-
setVerdict(0);
101-
else
102-
setVerdict(equal(round_floats(r[0].values), round_floats(expected[0].values)) ? 1 : 0);
103-
setError(null);
104-
} catch (err) {
105-
console.log(err);
106-
setError(err.message);
107-
}
108-
setOpen(true);
109-
}}
131+
onClick={validate}
110132
>
111-
Valider
133+
OK (Ctrl + Enter)
112134
</Button>
113135
</Grid>
114136
</Grid>

0 commit comments

Comments
 (0)