Text editor (WIP)
This commit is contained in:
parent
ac2ceb4c78
commit
c49999a315
6 changed files with 229 additions and 0 deletions
152
engine/text_editor/Landing.js
Normal file
152
engine/text_editor/Landing.js
Normal file
|
@ -0,0 +1,152 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import CodeEditorWindow from "./CodeEditorWindow";
|
||||
import axios from "axios";
|
||||
import { classnames } from "../utils/general";
|
||||
import { languageOptions } from "../constants/languageOptions";
|
||||
|
||||
import { ToastContainer, toast } from "react-toastify";
|
||||
import "react-toastify/dist/ReactToastify.css";
|
||||
|
||||
import { defineTheme } from "../lib/defineTheme";
|
||||
import useKeyPress from "../hooks/useKeyPress";
|
||||
import Footer from "./Footer";
|
||||
import OutputWindow from "./OutputWindow";
|
||||
import CustomInput from "./CustomInput";
|
||||
import OutputDetails from "./OutputDetails";
|
||||
import ThemeDropdown from "./ThemeDropdown";
|
||||
import LanguagesDropdown from "./LanguagesDropdown";
|
||||
|
||||
const javascriptDefault = `// some comment`;
|
||||
|
||||
const Landing = () => {
|
||||
const [code, setCode] = useState(javascriptDefault);
|
||||
const [customInput, setCustomInput] = useState("");
|
||||
const [outputDetails, setOutputDetails] = useState(null);
|
||||
const [processing, setProcessing] = useState(null);
|
||||
const [theme, setTheme] = useState("cobalt");
|
||||
const [language, setLanguage] = useState(languageOptions[0]);
|
||||
|
||||
const enterPress = useKeyPress("Enter");
|
||||
const ctrlPress = useKeyPress("Control");
|
||||
|
||||
const onSelectChange = (sl) => {
|
||||
console.log("selected Option...", sl);
|
||||
setLanguage(sl);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (enterPress && ctrlPress) {
|
||||
console.log("enterPress", enterPress);
|
||||
console.log("ctrlPress", ctrlPress);
|
||||
handleCompile();
|
||||
}
|
||||
}, [ctrlPress, enterPress]);
|
||||
const onChange = (action, data) => {
|
||||
switch (action) {
|
||||
case "code": {
|
||||
setCode(data);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
console.warn("case not handled!", action, data);
|
||||
}
|
||||
}
|
||||
};
|
||||
const handleCompile = () => {
|
||||
// We will come to the implementation later in the code
|
||||
};
|
||||
|
||||
const checkStatus = async (token) => {
|
||||
// We will come to the implementation later in the code
|
||||
};
|
||||
|
||||
function handleThemeChange(th) {
|
||||
// We will come to the implementation later in the code
|
||||
}
|
||||
useEffect(() => {
|
||||
defineTheme("oceanic-next").then((_) =>
|
||||
setTheme({ value: "oceanic-next", label: "Oceanic Next" })
|
||||
);
|
||||
}, []);
|
||||
|
||||
const showSuccessToast = (msg) => {
|
||||
toast.success(msg || `Compiled Successfully!`, {
|
||||
position: "top-right",
|
||||
autoClose: 1000,
|
||||
hideProgressBar: false,
|
||||
closeOnClick: true,
|
||||
pauseOnHover: true,
|
||||
draggable: true,
|
||||
progress: undefined,
|
||||
});
|
||||
};
|
||||
const showErrorToast = (msg) => {
|
||||
toast.error(msg || `Something went wrong! Please try again.`, {
|
||||
position: "top-right",
|
||||
autoClose: 1000,
|
||||
hideProgressBar: false,
|
||||
closeOnClick: true,
|
||||
pauseOnHover: true,
|
||||
draggable: true,
|
||||
progress: undefined,
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<ToastContainer
|
||||
position="top-right"
|
||||
autoClose={2000}
|
||||
hideProgressBar={false}
|
||||
newestOnTop={false}
|
||||
closeOnClick
|
||||
rtl={false}
|
||||
pauseOnFocusLoss
|
||||
draggable
|
||||
pauseOnHover
|
||||
/>
|
||||
<div className="h-4 w-full bg-gradient-to-r from-pink-500 via-red-500 to-yellow-500"></div>
|
||||
<div className="flex flex-row">
|
||||
<div className="px-4 py-2">
|
||||
<LanguagesDropdown onSelectChange={onSelectChange} />
|
||||
</div>
|
||||
<div className="px-4 py-2">
|
||||
<ThemeDropdown handleThemeChange={handleThemeChange} theme={theme} />
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-row space-x-4 items-start px-4 py-4">
|
||||
<div className="flex flex-col w-full h-full justify-start items-end">
|
||||
<CodeEditorWindow
|
||||
code={code}
|
||||
onChange={onChange}
|
||||
language={language?.value}
|
||||
theme={theme.value}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="right-container flex flex-shrink-0 w-[30%] flex-col">
|
||||
<OutputWindow outputDetails={outputDetails} />
|
||||
<div className="flex flex-col items-end">
|
||||
<CustomInput
|
||||
customInput={customInput}
|
||||
setCustomInput={setCustomInput}
|
||||
/>
|
||||
<button
|
||||
onClick={handleCompile}
|
||||
disabled={!code}
|
||||
className={classnames(
|
||||
"mt-4 border-2 border-black z-10 rounded-md shadow-[5px_5px_0px_0px_rgba(0,0,0)] px-4 py-2 hover:shadow transition duration-200 bg-white flex-shrink-0",
|
||||
!code ? "opacity-50" : ""
|
||||
)}
|
||||
>
|
||||
{processing ? "Processing..." : "Compile and Execute"}
|
||||
</button>
|
||||
</div>
|
||||
{outputDetails && <OutputDetails outputDetails={outputDetails} />}
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default Landing;
|
Loading…
Add table
Add a link
Reference in a new issue