Skip to content

Commit bf3e574

Browse files
committed
Implement changing theme color option
1 parent d6849d8 commit bf3e574

3 files changed

Lines changed: 44 additions & 21 deletions

File tree

Plan/react/dashboard/src/components/modal/ColorSelectorModal.jsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,25 @@ import ThemeOption from "../theme/ThemeOption.jsx";
1111
import {useAuth} from "../../hooks/authenticationHook.jsx";
1212
import AddThemeButton from "../theme/AddThemeButton.jsx";
1313

14-
const ColorSelectorButton = ({color, setColor, disabled, active}) =>
15-
<button className={`btn color-chooser ${disabled ? "disabled" : ''} ${active ? 'active' : ''}`}
16-
style={{
17-
color: nameToContrastCssVariable(color),
18-
backgroundColor: nameToCssVariable(color)
19-
}}
20-
id={"choose-" + color}
21-
disabled={disabled}
22-
onClick={() => setColor(color)}
23-
>
24-
<Fa icon={faPalette}/>
25-
</button>
14+
const ColorSelectorButton = ({color, setColor, disabled, active}) => {
15+
const validCssColor = color => {
16+
return color === 'theme' ? 'reference-colors-theme' : color;
17+
}
18+
return (
19+
<button className={`btn color-chooser ${disabled ? "disabled" : ''} ${active ? 'active' : ''}`}
20+
style={{
21+
color: nameToContrastCssVariable(validCssColor(color)),
22+
backgroundColor: nameToCssVariable(validCssColor(color))
23+
}}
24+
id={"choose-" + color}
25+
disabled={disabled}
26+
onClick={() => setColor(color)}
27+
>
28+
<Fa icon={faPalette}/>
29+
</button>
30+
)
31+
}
32+
2633

2734
const ColorSelectorModal = () => {
2835
const {t} = useTranslation();

Plan/react/dashboard/src/components/theme/ThemeStyleCss.jsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import {addToObject, flattenObject} from '../../util/mutator';
2-
import {getContrastColor} from '../../util/colors';
2+
import {getContrastColor, nameToCssVariable} from '../../util/colors';
33
import {getColorConverter} from "../../util/Color.js";
44
import {useThemeEditContext} from "../../hooks/context/themeEditContextHook.jsx";
55
import {useThemeStorage} from "../../hooks/context/themeContextHook.jsx";
66

77
// Function to generate CSS variables from theme data
8-
const generateThemeCSS = ({applyToClass, colors, nightColors, useCases, nightModeUseCases}) => {
8+
const generateThemeCSS = ({applyToClass, colors, nightColors, useCases, nightModeUseCases, color}) => {
99
const baseVariables = [];
1010
const nightModeVariables = [];
1111

@@ -39,7 +39,9 @@ const generateThemeCSS = ({applyToClass, colors, nightColors, useCases, nightMod
3939
// });
4040

4141
// Add night mode use case variables
42-
const flattenedNightUseCases = addToObject(flattenObject(nightModeUseCases), nightModeUseCases.referenceColors);
42+
let flattenedNightUseCases = addToObject(flattenObject(nightModeUseCases), nightModeUseCases.referenceColors);
43+
// Override with user selected theme color
44+
if (color && color !== 'theme') flattenedNightUseCases = addToObject(flattenedNightUseCases, {theme: nameToCssVariable(color)});
4345
Object.entries(flattenedNightUseCases).forEach(([key, value]) => {
4446
if (typeof value === 'string' && value.startsWith('var(--color-')) {
4547
const referencedColor = value.replace('var(--color-', '').replace(')', '');
@@ -50,7 +52,9 @@ const generateThemeCSS = ({applyToClass, colors, nightColors, useCases, nightMod
5052

5153
const nightModeKeys = Object.keys(flattenedNightUseCases);
5254
// Add use case variables
53-
const flattenedUseCases = addToObject(flattenObject(useCases), useCases.referenceColors);
55+
let flattenedUseCases = addToObject(flattenObject(useCases), useCases.referenceColors);
56+
// Override with user selected theme color
57+
if (color && color !== 'theme') flattenedUseCases = addToObject(flattenedUseCases, {theme: nameToCssVariable(color)});
5458
Object.entries(flattenedUseCases).forEach(([key, value]) => {
5559
if (typeof value === 'string' && value.startsWith('var(--color-')) {
5660
const referencedColor = value.replace('var(--color-', '').replace(')', '');
@@ -80,13 +84,13 @@ ${applyToClass ? `.${applyToClass}.night-mode-colors,.${applyToClass} .night-mod
8084

8185
export const ThemeStyleCss = ({editMode, applyToClass}) => {
8286
const {
83-
loaded,
87+
loaded, color,
8488
currentColors: colors, currentNightColors: nightColors,
8589
currentUseCases: useCases, currentNightModeUseCases: nightModeUseCases
8690
} = editMode ? useThemeEditContext() : useThemeStorage();
8791

8892
if (!loaded) return <></>
8993
return (
90-
<style>{generateThemeCSS({applyToClass, colors, nightColors, useCases, nightModeUseCases})}</style>
94+
<style>{generateThemeCSS({applyToClass, colors, nightColors, useCases, nightModeUseCases, color})}</style>
9195
)
9296
}

Plan/react/dashboard/src/hooks/context/themeContextHook.jsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ export const ThemeStorageContextProvider = ({children}) => {
4242
const saveUploadedThemeLocally = (name, themeJson) => {
4343
const locallyStoredThemes = getLocallyStoredThemes();
4444
window.localStorage.setItem(`locally-stored-theme-${name}`, JSON.stringify(themeJson));
45-
locallyStoredThemes.push(name);
45+
if (!locallyStoredThemes.includes(name)) {
46+
locallyStoredThemes.push(name);
47+
}
4648
window.localStorage.setItem(`locally-stored-themes`, JSON.stringify(locallyStoredThemes));
4749
}
4850

@@ -77,11 +79,21 @@ export const ThemeStorageContextProvider = ({children}) => {
7779
}, [theme.loaded, currentTheme]);
7880

7981
const sharedState = useMemo(() => {
82+
const themeOptions = (theme.nightModeEnabled
83+
? currentNightModeUseCases?.themeColorOptions
84+
: currentUseCases?.themeColorOptions) || [];
85+
const colorExistsAsOption = themeOptions.includes(color);
8086
return {
81-
loaded, name: currentTheme, currentColors, currentNightColors, currentUseCases, currentNightModeUseCases,
87+
loaded,
88+
name: currentTheme,
89+
color: colorExistsAsOption ? color : undefined,
90+
currentColors,
91+
currentNightColors,
92+
currentUseCases,
93+
currentNightModeUseCases,
8294
cloneThemeLocally, saveUploadedThemeLocally, deleteThemeLocally, reloadTheme
8395
}
84-
}, [name, currentColors, currentNightColors, currentUseCases, currentNightModeUseCases, loaded]);
96+
}, [name, color, currentColors, currentNightColors, currentUseCases, currentNightModeUseCases, loaded, theme.nightModeEnabled]);
8597
return (<ThemeStorageContext.Provider value={sharedState}>
8698
{children}
8799
</ThemeStorageContext.Provider>

0 commit comments

Comments
 (0)