Spaces:
Paused
Paused
| import React from "react"; | |
| import { motion } from "framer-motion"; | |
| import { useForm } from "react-hook-form"; | |
| import { useAppDispatch, useAppSelector } from "../../store/hook"; | |
| import { editor_state, set_options } from "../../store/features/editorSlice"; | |
| import { modalVariant } from "./config"; | |
| import { theme_state } from "../../store/features/themeSlice"; | |
| const SettingsModal = () => { | |
| const dispatch = useAppDispatch(); | |
| const { options } = useAppSelector(editor_state); | |
| const { theme } = useAppSelector(theme_state); | |
| const { register, handleSubmit } = useForm(); | |
| const onChangeOptions = ({ | |
| fontSize, | |
| fontWeight, | |
| minimapEnabled, | |
| minimapScale, | |
| wordWrap, | |
| autoClosingBrackets, | |
| }: any) => { | |
| const custom = { | |
| fontSize: parseInt(fontSize), | |
| fontWeight: fontWeight, | |
| minimap: { | |
| enabled: minimapEnabled, | |
| scale: parseInt(minimapScale), | |
| }, | |
| wordWrap: wordWrap, | |
| autoClosingBrackets: { autoClosingBrackets }, | |
| showUnused: true, | |
| automaticLayout: true, | |
| tabSize: 2, | |
| renderLineHighlight: "none", | |
| scrollbar: { verticalScrollbarSize: 10, verticalSliderSize: 10 }, | |
| }; | |
| dispatch(set_options(custom)); | |
| }; | |
| return ( | |
| <motion.div | |
| className="sm:mt-10 mx-auto h-full sm:h-auto sm:w-8/12 lg:w-6/12 sm:rounded-xl overflow-hidden glassmorphism" | |
| variants={modalVariant} | |
| initial="initial" | |
| animate="animate" | |
| exit="exit" | |
| transition={{ ease: "easeOut", duration: 0.3 }} | |
| onClick={(e) => e.stopPropagation()} | |
| > | |
| <div | |
| style={{ backgroundColor: theme.foreground }} | |
| className="border-b border-black h-10 flex items-center px-7" | |
| > | |
| <h1 className="text-xl"> Settings</h1> | |
| </div> | |
| <div className="overflow-auto h-full"> | |
| <div className="pt-6 px-7 "> | |
| <form | |
| className=" mb-12 overflow-auto" | |
| onSubmit={handleSubmit(onChangeOptions)} | |
| > | |
| {/* Fonts */} | |
| <div className="editor-sub-settings"> | |
| <div className="title">Font size : </div> | |
| <div className="description">Set the font size in pixels.</div> | |
| <select | |
| {...register("fontSize")} | |
| id="fontSize" | |
| className="editor-select" | |
| defaultValue={options.fontSize} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| > | |
| <option value={9}>9</option> | |
| <option value={10}>10</option> | |
| <option value={11}>11</option> | |
| <option value={12}>12</option> | |
| <option value={13}>13</option> | |
| <option value={14}>14</option> | |
| <option value={15}>15</option> | |
| <option value={16}>16</option> | |
| <option value={17}>17</option> | |
| </select> | |
| </div> | |
| <div className="editor-sub-settings"> | |
| <div className="title">Font weight : </div> | |
| <div className="description">Defines how bold you text are.</div> | |
| <select | |
| {...register("fontWeight")} | |
| id="fontWeight" | |
| className="editor-select" | |
| defaultValue={options.fontWeight} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| > | |
| <option value="500">Regular</option> | |
| <option value="600">Bold</option> | |
| </select> | |
| </div> | |
| {/* Minimap */} | |
| <div className="editor-sub-settings"> | |
| <div className="title">Enabled minimap : </div> | |
| <div className="description"> | |
| Control if the minimap should be shown. | |
| </div> | |
| <div className="flex items-center"> | |
| <input | |
| {...register("minimapEnabled")} | |
| id="minimap-enabled" | |
| className="editor-select mr-2" | |
| type="checkbox" | |
| defaultChecked={options.minimap?.enabled} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| /> | |
| <label>On </label> | |
| </div> | |
| </div> | |
| <div className="editor-sub-settings"> | |
| <div className="title">Scale : </div> | |
| <div className="description">Set the size of the minimap.</div> | |
| <select | |
| {...register("minimapScale")} | |
| id="minimap-scale" | |
| className="editor-select" | |
| defaultValue={options.minimap?.scale} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| > | |
| <option value={1}>1</option> | |
| <option value={2}>2</option> | |
| <option value={3}>3</option> | |
| </select> | |
| </div> | |
| {/* Others */} | |
| <div className="editor-sub-settings"> | |
| <div className="title">Word wrap : </div> | |
| <div className="description">Control if lines should wrap.</div> | |
| <select | |
| {...register("wordWrap")} | |
| id="wordWrap" | |
| className="editor-select" | |
| defaultValue={options.wordWrap} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| > | |
| <option value="on">On</option> | |
| <option value="off">Off</option> | |
| </select> | |
| </div> | |
| <div className="editor-sub-settings"> | |
| <div className="title">Auto Closing Brackets : </div> | |
| <div className="description"> | |
| Controls if brackets should close automatically | |
| </div> | |
| <select | |
| {...register("autoClosingBrackets")} | |
| id="autoClosingBrackets" | |
| className="editor-select" | |
| defaultValue={options.autoClosingBrackets} | |
| style={{ | |
| backgroundColor: theme.foreground, | |
| }} | |
| > | |
| <option value="always">always</option> | |
| <option value="languageDefined">languageDefined</option> | |
| <option value="beforeWhitespace">beforeWhitespace</option> | |
| <option value="never">never</option> | |
| </select> | |
| </div> | |
| <button className="editor-button h-9 mt-6" type="submit"> | |
| Save settings | |
| </button> | |
| </form> | |
| </div> | |
| </div> | |
| </motion.div> | |
| ); | |
| }; | |
| export default SettingsModal; | |