From 39704af82ccd7772ef47c7ec889f3db74efc5523 Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Fri, 7 May 2021 19:46:28 +0300 Subject: Implement code field --- src/components/InputTypes/Code.tsx | 32 +++++++++++++++++++++++++++++--- src/components/InputTypes/index.tsx | 8 ++++++-- src/components/Question.tsx | 20 +++++++++++++++++++- 3 files changed, 54 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/components/InputTypes/Code.tsx b/src/components/InputTypes/Code.tsx index 51ca98d..ca02cb5 100644 --- a/src/components/InputTypes/Code.tsx +++ b/src/components/InputTypes/Code.tsx @@ -1,11 +1,37 @@ /** @jsx jsx */ import { jsx } from "@emotion/react"; -import React, { ChangeEvent } from "react"; +import React, { useEffect } from "react"; + +import { basicSetup } from "@codemirror/basic-setup"; +import { python } from "@codemirror/lang-python"; +import { EditorState } from "@codemirror/state"; +import { oneDark } from "@codemirror/theme-one-dark"; +import { EditorView, ViewUpdate } from "@codemirror/view"; interface CodeProps { - handler: (event: ChangeEvent) => void + handler: (newContent: string) => void, + questionId: string, } export default function Code(props: CodeProps): JSX.Element { - return ; + const onUpdate = () => EditorView.updateListener.of((v: ViewUpdate) => { + props.handler(v.state.doc.toString()); + }); + + useEffect(() => { + const el = document.getElementById(`${props.questionId}-code`); + const state = EditorState.create({ + extensions: [basicSetup, python(), onUpdate(), oneDark] + }); + const view = new EditorView({ + state, + parent: el as Element + }); + + return () => view.destroy(); + }, []); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return
; } diff --git a/src/components/InputTypes/index.tsx b/src/components/InputTypes/index.tsx index c6a83f1..3e13652 100644 --- a/src/components/InputTypes/index.tsx +++ b/src/components/InputTypes/index.tsx @@ -9,6 +9,7 @@ import React, { ChangeEvent } from "react"; import { QuestionType } from "../../api/question"; import { QuestionProp } from "../Question"; +import Code from "./Code"; const require_options: Array = [ QuestionType.Radio, @@ -18,7 +19,7 @@ const require_options: Array = [ ]; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export default function create_input({ question, public_state }: QuestionProp, handler: (event: ChangeEvent) => void, onBlurHandler: () => void, focus_ref: React.RefObject): JSX.Element | JSX.Element[] { +export default function create_input({ question, public_state }: QuestionProp, handler: (event: ChangeEvent | string) => void, onBlurHandler: () => void, focus_ref: React.RefObject): JSX.Element | JSX.Element[] { let result: JSX.Element | JSX.Element[]; // eslint-disable-next-line @@ -37,7 +38,10 @@ export default function create_input({ question, public_state }: QuestionProp, h /* eslint-disable react/react-in-jsx-scope */ switch (question.type) { - case QuestionType.Code: // TODO: Implement + case QuestionType.Code: + result = ; + break; + case QuestionType.TextArea: result =