Skip to content

Commit

Permalink
Cleanup custom colors and layout handling (#97)
Browse files Browse the repository at this point in the history
  • Loading branch information
eltoder authored Jan 14, 2025
1 parent fe6c922 commit 0ec8854
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 97 deletions.
71 changes: 41 additions & 30 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useState, useEffect } from "react";
import { useState, useEffect, useMemo } from "react";
import firebase from "./firebase";
import "./styles.css";

Expand All @@ -23,15 +23,47 @@ import AboutPage from "./pages/AboutPage";
import ConductPage from "./pages/ConductPage";
import LegalPage from "./pages/LegalPage";
import ProfilePage from "./pages/ProfilePage";
import { lightTheme, darkTheme } from "./themes";
import { lightTheme, darkTheme, withCardColors } from "./themes";

function makeThemes(customColors) {
let parsed;
try {
parsed = JSON.parse(customColors);
} catch (error) {
console.log("failed to parse custom colors", error);
parsed = {};
}
return {
parsedCustomColors: parsed,
customLightTheme: withCardColors(lightTheme, parsed.light),
customDarkTheme: withCardColors(darkTheme, parsed.dark),
};
}

function makeKeyboardLayout(keyboardLayoutName, customKeyboardLayout) {
const emptyLayout = { verticalLayout: "", horizontalLayout: "" };
if (keyboardLayoutName !== "Custom") {
return standardLayouts[keyboardLayoutName] || emptyLayout;
}
let parsed;
try {
parsed = JSON.parse(customKeyboardLayout);
} catch (error) {
console.log("failed to parse custom keyboard layout", error);
parsed = {};
}
return { ...emptyLayout, ...parsed };
}

function App() {
const [authUser, setAuthUser] = useState(null);
const [user, setUser] = useState(null);
const [themeType, setThemeType] = useStorage("theme", "light");
const [customLightTheme, setCustomLightTheme] = useState(lightTheme);
const [customDarkTheme, setCustomDarkTheme] = useState(darkTheme);
const [customColors, setCustomColors] = useStorage("customColors", "{}");
const { parsedCustomColors, customLightTheme, customDarkTheme } = useMemo(
() => makeThemes(customColors),
[customColors]
);
const [keyboardLayoutName, setKeyboardLayoutName] = useStorage(
"keyboardLayout",
"QWERTY"
Expand All @@ -40,6 +72,10 @@ function App() {
"customKeyboardLayout",
"{}"
);
const keyboardLayout = useMemo(
() => makeKeyboardLayout(keyboardLayoutName, customKeyboardLayout),
[keyboardLayoutName, customKeyboardLayout]
);
const [layoutOrientation, setLayoutOrientation] = useStorage(
"layout",
"portrait"
Expand Down Expand Up @@ -95,22 +131,6 @@ function App() {
};
}, [authUser]);

useEffect(() => {
const parsedCustoms = JSON.parse(customColors);
if (parsedCustoms.light) {
setCustomLightTheme({
...lightTheme,
setCard: { ...lightTheme.setCard, ...parsedCustoms.light },
});
}
if (parsedCustoms.dark) {
setCustomDarkTheme({
...darkTheme,
setCard: { ...darkTheme.setCard, ...parsedCustoms.dark },
});
}
}, [customColors]);

const handleChangeTheme = () => {
setThemeType(themeType === "light" ? "dark" : "light");
};
Expand All @@ -119,15 +139,6 @@ function App() {
setCustomColors(JSON.stringify(custom));
};

const keyboardLayout =
keyboardLayoutName !== "Custom"
? standardLayouts[keyboardLayoutName]
: {
verticalLayout: "",
horizontalLayout: "",
...JSON.parse(customKeyboardLayout),
};

return (
<ThemeProvider
theme={themeType === "light" ? customLightTheme : customDarkTheme}
Expand Down Expand Up @@ -160,7 +171,7 @@ function App() {
<Navbar
themeType={themeType}
handleChangeTheme={handleChangeTheme}
customColors={JSON.parse(customColors)}
customColors={parsedCustomColors}
handleCustomColors={handleCustomColors}
/>
<Switch>
Expand Down
96 changes: 40 additions & 56 deletions src/components/ColorChoiceDialog.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from "react";

import { makeStyles, withTheme } from "@material-ui/core/styles";
import { ThemeProvider, makeStyles, withTheme } from "@material-ui/core/styles";
import Button from "@material-ui/core/Button";
import Dialog from "@material-ui/core/Dialog";
import Grid from "@material-ui/core/Grid";
Expand All @@ -10,7 +10,7 @@ import DialogTitle from "@material-ui/core/DialogTitle";
import { ChromePicker } from "react-color";

import ResponsiveSetCard from "./ResponsiveSetCard";
import { darkTheme, lightTheme } from "../themes";
import { darkTheme, lightTheme, withCardColors } from "../themes";

const useStyles = makeStyles({
colorPickerColumn: {
Expand All @@ -33,71 +33,55 @@ function ColorChoiceDialog(props) {
}

function handleSubmit() {
onClose({ red: red, green: green, purple: purple });
onClose({ red, green, purple });
}

function handleReset() {
if (theme.palette.type === "light") {
setRed(lightTheme.setCard.red);
setGreen(lightTheme.setCard.green);
setPurple(lightTheme.setCard.purple);
}
if (theme.palette.type === "dark") {
setRed(darkTheme.setCard.red);
setGreen(darkTheme.setCard.green);
setPurple(darkTheme.setCard.purple);
}
const resetTo = theme.palette.type === "light" ? lightTheme : darkTheme;
setRed(resetTo.setCard.red);
setGreen(resetTo.setCard.green);
setPurple(resetTo.setCard.purple);
}

return (
<Dialog open={open} onClose={handleClose} maxWidth="xl">
<DialogTitle>{title}</DialogTitle>
<DialogContent>
<Grid container spacing={3}>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard
width={225}
value="0000"
colorOverride={{ red: red, green: green, purple: purple }}
/>
<ChromePicker
color={purple}
onChangeComplete={(result) => setPurple(result.hex)}
/>
<ThemeProvider theme={withCardColors(theme, { red, green, purple })}>
<Grid container spacing={3}>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard width={225} value="0000" />
<ChromePicker
color={purple}
onChangeComplete={(result) => setPurple(result.hex)}
/>
</Grid>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard width={225} value="1000" />
<ChromePicker
color={green}
onChangeComplete={(result) => setGreen(result.hex)}
/>
</Grid>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard width={225} value="2000" />
<ChromePicker
color={red}
onChangeComplete={(result) => setRed(result.hex)}
/>
</Grid>
</Grid>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard
width={225}
value="1000"
colorOverride={{ red: red, green: green, purple: purple }}
/>
<ChromePicker
color={green}
onChangeComplete={(result) => setGreen(result.hex)}
/>
<Grid container direction="row" justifyContent="center">
<Button
onClick={handleReset}
variant="outlined"
color="secondary"
style={{ marginTop: "15px" }}
>
Set Colors to Default
</Button>
</Grid>
<Grid item xs={12} md={4} className={classes.colorPickerColumn}>
<ResponsiveSetCard
width={225}
value="2000"
colorOverride={{ red: red, green: green, purple: purple }}
/>
<ChromePicker
color={red}
onChangeComplete={(result) => setRed(result.hex)}
/>
</Grid>
</Grid>
<Grid container direction="row" justify="center">
<Button
onClick={handleReset}
variant="outlined"
color="secondary"
style={{ marginTop: "15px" }}
>
Set Colors to Default
</Button>
</Grid>
</ThemeProvider>
</DialogContent>
<DialogActions>
<Button onClick={handleClose} color="primary">
Expand Down
3 changes: 1 addition & 2 deletions src/components/Navbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ function Navbar({
function handleChangeCardColors(colorMap) {
setChangeCardColors(false);
if (colorMap) {
customColors[themeType] = colorMap;
handleCustomColors(customColors);
handleCustomColors({ ...customColors, [themeType]: colorMap });
}
}

Expand Down
10 changes: 1 addition & 9 deletions src/components/ResponsiveSetCard.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,7 @@ function ResponsiveSetCard(props) {
const contentHeight = height - 2 * margin;
const { color, shape, shade, border, number } = cardTraits(value);

// Override is used to help visualize new colors in color picker dialog.
const COLORS = props.colorOverride
? [
props.colorOverride.purple,
props.colorOverride.green,
props.colorOverride.red,
]
: [theme.setCard.purple, theme.setCard.green, theme.setCard.red];
const COLORS = [theme.setCard.purple, theme.setCard.green, theme.setCard.red];

const BORDERS = ["3px solid", "4px dotted", "6px double"];

Expand Down Expand Up @@ -136,7 +129,6 @@ function ResponsiveSetCard(props) {
shape={shape}
shade={shade}
size={Math.round(contentHeight * 0.36)}
colorOverride={props.colorOverride}
/>
))}
{hinted && (
Expand Down
6 changes: 6 additions & 0 deletions src/themes.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,9 @@ export const lightTheme = createTheme({
},
setFoundEntry: "rgba(130, 170, 100, 0.15)",
});

export function withCardColors(theme, colors) {
return colors
? { ...theme, setCard: { ...theme.setCard, ...colors } }
: theme;
}

0 comments on commit 0ec8854

Please sign in to comment.