open-codetree / components /Modals /SettingsModal.tsx
matt HOFFNER
init
3c3f089
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;