Skip to content

Commit f3d7950

Browse files
authored
Merge pull request #4 from Tekiter/reset-result-on-change
feat: 입력 변경시 실행 결과 초기화
2 parents 8fe1e6f + 2b2b44f commit f3d7950

3 files changed

Lines changed: 47 additions & 25 deletions

File tree

src/commands/useTestcaseRunner.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ const useTestcaseRunner = () => {
4444
[],
4545
);
4646

47-
const makeIdle = useRecoilCallback(({ set }) => (id: string) => {
47+
const makeWaiting = useRecoilCallback(({ set }) => (id: string) => {
4848
set(executeStatusFamily(id), { status: "waiting" });
4949
});
5050

51+
const makeIdle = useRecoilCallback(({ set }) => (id: string) => {
52+
set(executeStatusFamily(id), { status: "idle" });
53+
});
54+
5155
const stopAll = useRecoilCallback(({ snapshot, set }) => async () => {
5256
queue.clear();
5357

@@ -65,6 +69,7 @@ const useTestcaseRunner = () => {
6569
return {
6670
runAll,
6771
run,
72+
makeWaiting,
6873
makeIdle,
6974
stopAll,
7075
};

src/components/testcase/InputEditor.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import { TestcaseInput } from "@/states/testcase";
66

77
interface InputEditorProps {
88
value: TestcaseInput;
9+
editable?: boolean;
910
onChange(newVal: TestcaseInput): void;
11+
onKeyDown?(): void;
1012
}
1113

12-
const InputEditor: FC<InputEditorProps> = ({ value, onChange }) => {
14+
const InputEditor: FC<InputEditorProps> = ({ value, editable, onChange, onKeyDown }) => {
15+
console.log("Rerender");
1316
const updateData = (data: TestcaseInput) => {
1417
onChange(data);
1518
};
@@ -23,7 +26,12 @@ const InputEditor: FC<InputEditorProps> = ({ value, onChange }) => {
2326

2427
return (
2528
<StyledInputEditor>
26-
<ReactCodeMirror value={value.text} onChange={(value) => handlePlainTextChange(value)} />
29+
<ReactCodeMirror
30+
value={value.text}
31+
onChange={(value) => handlePlainTextChange(value)}
32+
onKeyDown={onKeyDown}
33+
editable={editable}
34+
/>
2735
</StyledInputEditor>
2836
);
2937
};

src/components/testcase/TestcasePanel.tsx

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Tab, TabList, Tabs } from "@chakra-ui/react";
22
import { css } from "@emotion/react";
33
import styled from "@emotion/styled";
4-
import { FC, useState } from "react";
4+
import { FC, useMemo, useState } from "react";
55
import { useRecoilValue } from "recoil";
66

77
import useTestcaseCommand from "@/commands/useTestcaseCommand";
8+
import useTestcaseRunner from "@/commands/useTestcaseRunner";
89
import { testcaseFamily, TestcaseID } from "@/states/testcase";
910

1011
import AnswerEditor from "./AnswerEditor";
@@ -18,31 +19,39 @@ interface TestcasePanelProps {
1819

1920
const TestcasePanel: FC<TestcasePanelProps> = ({ testcaseId }) => {
2021
const testcaseCommand = useTestcaseCommand();
22+
const runner = useTestcaseRunner();
2123
const testcase = useRecoilValue(testcaseFamily(testcaseId));
2224

2325
const [selectedTabIndex, setSelectedTabIndex] = useState(0);
2426

25-
const tabs = [
26-
{
27-
title: "입력",
28-
content: (
29-
<InputEditor value={testcase.input} onChange={(input) => testcaseCommand.changeValue(testcaseId, { input })} />
30-
),
31-
},
32-
{
33-
title: "정답",
34-
content: (
35-
<AnswerEditor
36-
value={testcase.answer}
37-
onChange={(answer) => testcaseCommand.changeValue(testcaseId, { answer })}
38-
/>
39-
),
40-
},
41-
{
42-
title: "출력결과",
43-
content: <Result testcaseId={testcaseId} />,
44-
},
45-
];
27+
const tabs = useMemo(
28+
() => [
29+
{
30+
title: "입력",
31+
content: (
32+
<InputEditor
33+
value={testcase.input}
34+
onChange={(input) => testcaseCommand.changeValue(testcaseId, { input })}
35+
onKeyDown={() => runner.makeIdle(testcaseId)}
36+
/>
37+
),
38+
},
39+
{
40+
title: "정답",
41+
content: (
42+
<AnswerEditor
43+
value={testcase.answer}
44+
onChange={(answer) => testcaseCommand.changeValue(testcaseId, { answer })}
45+
/>
46+
),
47+
},
48+
{
49+
title: "출력결과",
50+
content: <Result testcaseId={testcaseId} />,
51+
},
52+
],
53+
[testcaseId, testcase],
54+
);
4655

4756
return (
4857
<StyledTestcasePanel>

0 commit comments

Comments
 (0)