quivr/frontend/app/user/components/ThemeSelect/hooks/useTheme.ts
Nick Guernsey 253e866a86
feat: enhance user page UI (#1319)
# Description

Hope ya'll don't mind, I updated the User Profile's UI to be a bit more
readable. Kept the design neutral to not impose styles.

I also kept the original toggle buttons for Theme and Language in case
we still want to use those in other places in the app, where a select
menu isn't necessary.

## Checklist before requesting a review

Please delete options that are not relevant.

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented hard-to-understand areas
- [ ] I have ideally added tests that prove my fix is effective or that
my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged

## Screenshots (if appropriate):


https://github.com/StanGirard/quivr/assets/64866427/d0320852-ece1-4002-a180-0005df132e71


https://github.com/StanGirard/quivr/assets/64866427/be3c67ec-8d42-44f9-8131-35a70aec20ef

---------

Co-authored-by: Zineb El Bachiri <100568984+gozineb@users.noreply.github.com>
Co-authored-by: Stan Girard <girard.stanislas@gmail.com>
2023-10-05 17:50:02 +02:00

45 lines
936 B
TypeScript

import { useEffect, useLayoutEffect, useState } from "react";
export type Theme = "dark" | "light" | "system";
/**
* @todo implement "system" theme
*/
export const useTheme = (): {
isDark: boolean;
isLight: boolean;
theme: Theme;
setTheme: (t: Theme) => void;
} => {
const [theme, setTheme] = useState<Theme>("light");
const isDark = theme === "dark";
const isLight = theme === "light";
useLayoutEffect(() => {
const savedTheme = localStorage.getItem("theme");
if (savedTheme === "dark") {
document.body.parentElement?.classList.add("dark");
setTheme(savedTheme);
}
}, []);
useEffect(() => {
if (isDark) {
document.body.parentElement?.classList.add("dark");
} else {
document.body.parentElement?.classList.remove("dark");
}
localStorage.setItem("theme", theme);
}, [theme, isDark]);
return {
isDark,
isLight,
theme,
setTheme,
};
};