Skip to content

Commit 6158c15

Browse files
authored
Merge pull request #302 from decert-me/hotfix-console
hotfix: 优化”代码运行结果展示“,比如换行、充值位默认模板等
2 parents c04b674 + 57e1ec1 commit 6158c15

File tree

16 files changed

+135
-51
lines changed

16 files changed

+135
-51
lines changed

src/assets/images/img/reload.png

1.23 KB
Loading

src/assets/locales/en-US/publish.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"title-modify": "Edit Challenge",
44
"preview": "Only creator is visible",
55
"upload": "Upload",
6+
"revert": "Revert to default code template",
67
"inner": {
78
"title": "Title",
89
"desc": "Description",

src/assets/locales/zh-CN/publish.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"title-modify": "编辑挑战",
44
"preview": "仅创建者可见",
55
"upload": "上传",
6+
"revert": "还原到默认的代码模版",
67
"inner": {
78
"title": "标题",
89
"desc": "描述",

src/assets/styles/component-style/challenge.scss

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,16 @@
116116
}
117117
}
118118

119+
.reload-tips{
120+
.ant-tooltip-content .ant-tooltip-inner{
121+
padding: 10px 17px;
122+
color: #454545;
123+
border-radius: 7px;
124+
background-color: #fff;
125+
box-shadow: 0px 8px 20px 0px rgba(0,0,0,0.1);
126+
}
127+
}
128+
119129
.CustomCode{
120130
width: 100%;
121131
height: 100%;
@@ -150,11 +160,22 @@
150160
.out-inner{
151161
flex: 1;
152162
margin-bottom: 10px;
153-
padding-top: 32px;
163+
padding-top: 55px;
154164
background-color: #fff;
155165
border-radius: 10px;
156166
overflow: hidden;
157167
position: relative;
168+
.icon-reload{
169+
width: 26px;
170+
height: 26px;
171+
position: absolute;
172+
right: 27px;
173+
top: 12px;
174+
cursor: pointer;
175+
}
176+
.reload-tips{
177+
178+
}
158179
}
159180
.preview-menu{
160181
height: 30px;

src/assets/styles/mobile/view-style/challenge.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ $container-width: 22.5rem;
195195
flex: none;
196196
height: 15rem;
197197
margin-bottom: .625rem;
198-
padding-top: 1.875rem;
198+
padding-top: 3.4375rem;
199199
border-radius: .4375rem;
200200
}
201201
.out-content{

src/components/CustomChallenge/CustomCode.js

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ import { codeRun, codeTest } from '@/request/api/quests';
66
import CustomViewer from "../CustomViewer";
77
import { Encryption } from "@/utils/Encryption";
88
import { useTranslation } from "react-i18next";
9-
import { Modal } from "antd";
9+
import { Modal, Tooltip } from "antd";
1010
import { modalNotice } from "@/utils/modalNotice";
11+
import { useLocation } from "react-router-dom";
1112

1213

1314
function CustomCode(props, ref) {
1415

15-
const { question, token_id, answers, setAnswers, saveAnswer, index, isPreview } = props;
16+
const { question, reload, token_id, answers, setAnswers, index, isPreview } = props;
1617
const { t } = useTranslation(['publish','explore']);
18+
const location = useLocation();
1719
const editorRef = useRef(null);
1820
const consoleRef = useRef(null);
1921
const { decode } = Encryption();
@@ -30,6 +32,7 @@ function CustomCode(props, ref) {
3032
let [selectCode, setSelectCode] = useState();
3133
let [selectIndex, setSelectIndex] = useState(0);
3234
let [editorCode, setEditorCode] = useState();
35+
let [answerCode, setAnswerCode] = useState();
3336
let [logs, setLogs] = useState([]); // 执行代码返回的日志
3437
let [codeObj, setCodeObj] = useState({
3538
code: "",
@@ -181,7 +184,8 @@ function CustomCode(props, ref) {
181184
paramsObj.code = obj.code;
182185
paramsObj.lang = obj.lang;
183186
paramsObj.quest_index = index;
184-
187+
logs = [];
188+
setLogs(logs);
185189
addLogs([t("inner.run.start")]);
186190
await codeRun(paramsObj)
187191
.then(res => {
@@ -231,10 +235,28 @@ function CustomCode(props, ref) {
231235
editorRef.current.changeReadOnly(code !== "tpl" );
232236
}
233237

238+
async function revertCode() {
239+
if (location.pathname === "/preview") {
240+
editorRef.current.monacoInit();
241+
return
242+
}
243+
const local = localStorage.getItem("decert.cache");
244+
if (local) {
245+
let cache = JSON.parse(local);
246+
cache[token_id][index] = null;
247+
localStorage.setItem("decert.cache", JSON.stringify(cache));
248+
}
249+
await reload();
250+
logs = [];
251+
setLogs([...logs]);
252+
}
253+
234254
async function init(params) {
235255
cacheQuest = question;
236256
if (answers[index]) {
237-
cacheQuest.code_snippets[selectIndex].code = answers[index].code;
257+
answerCode = answers[index].code;
258+
setAnswerCode(answerCode);
259+
// cacheQuest.code_snippets[selectIndex].code = answers[index].code;
238260
}
239261
setCacheQuest({...cacheQuest});
240262
toggleCode()
@@ -267,6 +289,13 @@ function CustomCode(props, ref) {
267289
setItems([...items]);
268290
}
269291

292+
async function updateInit() {
293+
await init();
294+
answerCode = null;
295+
setAnswerCode(answerCode);
296+
editorRef.current.monacoInit();
297+
}
298+
270299
useUpdateEffect(() => {
271300
toggleCode();
272301
},[selectIndex])
@@ -275,6 +304,10 @@ function CustomCode(props, ref) {
275304
init();
276305
},[])
277306

307+
useUpdateEffect(() => {
308+
updateInit();
309+
},[question])
310+
278311
return (
279312
<>
280313

@@ -306,6 +339,15 @@ function CustomCode(props, ref) {
306339
<div
307340
className="out-inner"
308341
>
342+
{/* 还原代码模板 */}
343+
<Tooltip
344+
title={t("revert")}
345+
arrow={false}
346+
rootClassName="reload-tips"
347+
>
348+
<img onClick={revertCode} className="icon-reload" src={require("@/assets/images/img/reload.png")} alt="" />
349+
</Tooltip>
350+
309351
{
310352
isPreview &&
311353
<div className="preview-menu">
@@ -323,7 +365,7 @@ function CustomCode(props, ref) {
323365
</div>
324366
}
325367
<MonacoEditor
326-
value={editorCode}
368+
value={answerCode||editorCode}
327369
onChange={changeCache}
328370
language={selectCode.lang}
329371
height={"100%"}

src/components/CustomConsole/Console.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default function Console(props) {
1616
<ul>
1717
{
1818
logs.map((e, i) =>
19-
<li key={i} style={{marginBottom: "10px"}}>
19+
<li key={i} style={{marginBottom: "10px", whiteSpace: "pre-wrap"}}>
2020
{e}
2121
</li>
2222
)

src/components/CustomModal/ModalAddCodeQuestion.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ export default function ModalAddCodeQuestion(props) {
325325
<span>{t("inner.code-tpl-desc")}</span>
326326
</div>
327327
<MonacoEditor
328-
value={e.code}
328+
defaultValue={e.code}
329329
onChange={(newValue) => {
330330
changeCoding("code", newValue, i);
331331
}}
@@ -342,7 +342,7 @@ export default function ModalAddCodeQuestion(props) {
342342
<span>{t("inner.code-spl-desc")}</span>
343343
</div>
344344
<MonacoEditor
345-
value={e.correctAnswer}
345+
defaultValue={e.correctAnswer}
346346
onChange={(newValue) => {
347347
changeCoding("correctAnswer", newValue, i);
348348
}}

src/components/MonacoEditor/MonacoComponent.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import MyContext from "@/provider/context";
66

77

88
export default function MonacoComponent(props) {
9-
const { value, onChange, language, height, readOnly } = props;
9+
const { value, defaultValue, onChange, language, height, readOnly } = props;
1010
const { isMobile } = useContext(MyContext);
1111
const { languageInit } = useMonacoInit({
1212
language: language
@@ -25,6 +25,7 @@ export default function MonacoComponent(props) {
2525
theme="light" // light || vs-dark
2626
language={language}
2727
value={value}
28+
defaultValue={defaultValue}
2829
options={options}
2930
onChange={onChange}
3031
loading={<LoadingOutlined style={{ fontSize: "30px"}} />}

src/components/MonacoEditor/index.js

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import MonacoComponent from "./MonacoComponent";
77

88
function MonacoEditor(props, ref) {
99

10-
const {value, onChange, language, height} = props;
10+
const {value, defaultValue, onChange, language, height} = props;
1111
const { config, init } = loader;
1212
let [editorIsOk, setEditorIsOk] = useState();
1313
let [newLang, setNewLang] = useState();
1414
let [readOnly, setReadOnly] = useState(false);
15+
let [key, setKey] = useState();
1516

1617
useImperativeHandle(ref, () => ({
17-
changeLang,changeReadOnly
18+
changeLang,changeReadOnly,monacoInit
1819
}))
1920

2021
function changeLang(params) {
@@ -27,7 +28,7 @@ function MonacoEditor(props, ref) {
2728
setReadOnly(readOnly);
2829
}
2930

30-
async function languaegInit(params) {
31+
function languaegInit(params) {
3132
switch (language) {
3233
case "C++":
3334
case "C":
@@ -40,6 +41,9 @@ function MonacoEditor(props, ref) {
4041
}
4142

4243
async function monacoInit(params) {
44+
setEditorIsOk(false);
45+
key = Date.now();
46+
setKey(key);
4347
config({
4448
paths: {
4549
vs: "https://ipfs.decert.me/lib/[email protected]"
@@ -54,17 +58,20 @@ function MonacoEditor(props, ref) {
5458

5559
useEffect(() => {
5660
monacoInit();
57-
},[])
61+
},[value])
5862

5963
return (
6064
editorIsOk ?
61-
<MonacoComponent
62-
value={value}
63-
onChange={onChange}
64-
language={newLang}
65-
height={height}
66-
readOnly={readOnly}
67-
/>
65+
<div key={key} style={{height: "100%"}}>
66+
<MonacoComponent
67+
value={value}
68+
defaultValue={defaultValue}
69+
onChange={onChange}
70+
language={newLang}
71+
height={height}
72+
readOnly={readOnly}
73+
/>
74+
</div>
6875
:
6976
<div style={{height: height ? height : "calc(100% - 230px)"}}>
7077
<LoadingOutlined style={{ fontSize: "30px"}} />

0 commit comments

Comments
 (0)