Skip to content

Commit

Permalink
Make it possible to switch IDEs while IDE is open
Browse files Browse the repository at this point in the history
  • Loading branch information
s-fristrom committed Sep 21, 2024
1 parent 927ed05 commit fc4564f
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 28 deletions.
22 changes: 13 additions & 9 deletions starter-frontend/src/components/ide/CodeEditor.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
import React, { ChangeEvent, useState } from "react";
import Editor from "@monaco-editor/react";
import { languageOption } from "./languageOptions";

type CodeEditorProps = {
onChange: (action: string, data: string
// : ChangeEvent<HTMLInputElement>
) => void,
// To-DO: Change to list of options
language: string,
code: string,
// To-do: change to list of options

code: string,

setCode: React.Dispatch<React.SetStateAction<string>>;

language: languageOption,

theme: string
};

export default function CodeEditor( {onChange, language, code, theme}: CodeEditorProps ) {
const [value, setValue] = useState<string>(code || "");
export default function CodeEditor( {onChange, code, setCode, language, theme}: CodeEditorProps ) {
// const [value, setValue] = useState<string>(code || "");

const handleEditorChange = (value: string | undefined) => {
if (typeof value === "undefined") {
throw new Error("Editor value is undefined.");
} else {
setValue(value);
setCode(value);
onChange("code", value);
}
}
Expand All @@ -29,8 +33,8 @@ export default function CodeEditor( {onChange, language, code, theme}: CodeEdito
<Editor
height={`100%`}
width={`100%`}
language={language || "javascript"}
value={value}
language={language.value || "javascript"}
value={code}
theme={theme}
onChange={handleEditorChange}
/>
Expand Down
16 changes: 9 additions & 7 deletions starter-frontend/src/components/ide/IDE.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,28 @@ import { Editor as TinyMCEEditor } from "tinymce";

type IDEProps = {
// Initial code in the IDE
initCode: string,
code: string,

initLang: number,
setCode: React.Dispatch<React.SetStateAction<string>>;

language: languageOption,

setLanguage: React.Dispatch<React.SetStateAction<languageOption>>,

setIsIDEOpen: React.Dispatch<React.SetStateAction<boolean>>,

editorRef: React.RefObject<TinyMCEEditor | null>
}


export default function IDE({initCode, initLang, setIsIDEOpen, editorRef}: IDEProps): JSX.Element {
const [code, setCode] = useState<string>(initCode);
export default function IDE({code, setCode, language, setLanguage, setIsIDEOpen, editorRef}: IDEProps): JSX.Element {
const [customInput, setCustomInput] = useState<string>("");
const [output, setOutput] = useState<boolean>(true);
const [outputDetails, setOutputDetails] = useState<any | null>(null);
const [processing, setProcessing] = useState<boolean | null>(null);
const [language, setLanguage] = useState<languageOption>(languageOptions[initLang]);
const [updated, setUpdated] = useState<boolean>(true);

function onSelectChange(sl: languageOption | null): void {
console.log("Selected option ", sl);
if (sl !== null) {
setLanguage(sl);
setUpdated(false);
Expand Down Expand Up @@ -157,8 +158,9 @@ export default function IDE({initCode, initLang, setIsIDEOpen, editorRef}: IDEPr
<LanguagesDropdown onSelectChange={onSelectChange} language={language} />
<CodeEditor
code={code}
setCode={setCode}
onChange={onChange}
language={language.value}
language={language}
theme="vs-dark"
/>

Expand Down
1 change: 1 addition & 0 deletions starter-frontend/src/components/ide/LanguagesDropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export default function LanguagesDropdown( { onSelectChange, language }: Languag
<Select
options={languageOptions}
defaultValue={language}
value={language}
onChange={(selectedOption) => onSelectChange(selectedOption)}
className="ide-dropdown"
styles={customStyles}
Expand Down
28 changes: 16 additions & 12 deletions starter-frontend/src/pages/editor/editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import SavePublicButton from "../../components/editor/SavePublicButton";
import PublicSaveModal from "../../components/editor/PublicSaveModal";
import IDE from "../../components/ide/IDE";
import { Editor as TinyMCEEditor } from 'tinymce';
import { languageOption, languageOptions } from "../../components/ide/languageOptions";

/** Type for storing details about note documents */
export type DetailsData = {
Expand Down Expand Up @@ -49,20 +50,19 @@ export function Note(): JSX.Element {

// IDE
// If IDE is open
// TO-DO CHANGE false
const [isIDEOpen, setIsIDEOpen] = useState<boolean>(false);
// Initial IDE code
const [initIDECode, setInitIDECode] = useState<string>("");
// Initial IDE language
const [initIDELang, setInitIDELang] = useState<number>(0);
// IDE code
const [code, setCode] = useState<string>("");
// IDE language
const [language, setLanguage] = useState<languageOption>(languageOptions[0]);

// ***
const editorRef = useRef<TinyMCEEditor | null>(null);


function openNewIDE(): void {
setInitIDECode("");
setInitIDELang(0);
setCode("");
setLanguage(languageOptions[0]);
setIsIDEOpen(true);
}

Expand All @@ -87,16 +87,20 @@ export function Note(): JSX.Element {
codeBlock.id = "active";
const codeContent = codeBlock.textContent;
if (codeContent === null) {
setInitIDECode("");
console.log("code null");
setCode("");
} else {
setInitIDECode(codeContent);
setCode(codeContent);
}
console.log("setting code");
const language = codeBlock.dataset.lang;
if (language === null) {
setInitIDELang(0);
console.log("language null");
setLanguage(languageOptions[0]);
} else {
setInitIDELang(Number(language));
setLanguage(languageOptions[Number(language)]);
}
console.log("setting language");

setIsIDEOpen(true);
}
Expand Down Expand Up @@ -278,7 +282,7 @@ export function Note(): JSX.Element {
openNewIDE={openNewIDE}/>
{
isIDEOpen &&
<IDE initCode={initIDECode} initLang={initIDELang} setIsIDEOpen={setIsIDEOpen} editorRef={editorRef}/>}
<IDE code={code} setCode={setCode} language={language} setLanguage={setLanguage} setIsIDEOpen={setIsIDEOpen} editorRef={editorRef}/>}
</div>


Expand Down

0 comments on commit fc4564f

Please sign in to comment.