import React from "react";
import _ from "lodash";
import { Grid, Box, Button, IconButton, Paper, TextField, Tooltip, Typography } from "@mui/material";
import { History, Reply } from "@mui/icons-material";
import { Color, ColorPicker } from "material-ui-color";
import { Settings } from "../../Settings/Settings";
import { useRerender } from "../../ui/React/hooks";
import { Modal } from "../../ui/React/Modal";
import { OptionSwitch } from "../../ui/React/OptionSwitch";
import { defaultMonacoTheme } from "./themes";
type ColorEditorProps = {
label: string;
themePath: string;
color: string | undefined;
onColorChange: (name: string, value: string) => void;
defaultColor: string;
};
// Slightly tweaked version of the same function found in game options
function ColorEditor({ label, themePath, onColorChange, color, defaultColor }: ColorEditorProps): React.ReactElement {
if (color === undefined) {
console.error(`color ${themePath} was undefined, reverting to default`);
color = defaultColor;
}
return (
onColorChange(themePath, newColor.hex)}
disableAlpha
/>
),
endAdornment: (
onColorChange(themePath, defaultColor)}>
),
}}
/>
);
}
type ThemeEditorProps = {
onClose: () => void;
onChange: () => void;
open: boolean;
};
export function ThemeEditorModal(props: ThemeEditorProps): React.ReactElement {
const rerender = useRerender();
function onThemePropChange(prop: string, value: string): void {
_.set(Settings.EditorTheme, prop, value);
props.onChange();
rerender();
}
function onThemeChange(event: React.ChangeEvent): void {
try {
const importedTheme = JSON.parse(event.target.value);
if (typeof importedTheme !== "object") return;
Settings.EditorTheme = importedTheme;
props.onChange();
} catch (err) {
// ignore
}
}
const onResetToDefault = () => {
Settings.EditorTheme = defaultMonacoTheme;
props.onChange();
rerender();
};
return (
Customize Editor theme
Hover over input boxes for more information
{
onThemePropChange("base", val ? "vs" : "vs-dark");
}}
text="Use light theme as base"
tooltip={
<>
If enabled, the vs light theme will be used as the theme base, otherwise,{" "}
vs-dark will be used.
>
}
/>
UI
Syntax
}>
Reset to default
);
}