Skip to content
Snippets Groups Projects
Commit 363f51ab authored by timothycarambat's avatar timothycarambat
Browse files

refresh theme without reloading page

parent af16332c
No related branches found
No related tags found
No related merge requests found
...@@ -5,6 +5,7 @@ import DefaultLoginLogoLight from "./media/illustrations/login-logo.svg"; ...@@ -5,6 +5,7 @@ import DefaultLoginLogoLight from "./media/illustrations/login-logo.svg";
import DefaultLoginLogoDark from "./media/illustrations/login-logo-light.svg"; import DefaultLoginLogoDark from "./media/illustrations/login-logo-light.svg";
import System from "./models/system"; import System from "./models/system";
export const REFETCH_LOGO_EVENT = "refetch-logo";
export const LogoContext = createContext(); export const LogoContext = createContext();
export function LogoProvider({ children }) { export function LogoProvider({ children }) {
...@@ -16,32 +17,36 @@ export function LogoProvider({ children }) { ...@@ -16,32 +17,36 @@ export function LogoProvider({ children }) {
? DefaultLoginLogoDark ? DefaultLoginLogoDark
: DefaultLoginLogoLight; : DefaultLoginLogoLight;
useEffect(() => { async function fetchInstanceLogo() {
async function fetchInstanceLogo() { try {
try { const { isCustomLogo, logoURL } = await System.fetchLogo();
const { isCustomLogo, logoURL } = await System.fetchLogo(); if (logoURL) {
if (logoURL) { setLogo(logoURL);
setLogo(logoURL); setLoginLogo(isCustomLogo ? logoURL : DefaultLoginLogo);
setLoginLogo(isCustomLogo ? logoURL : DefaultLoginLogo); setIsCustomLogo(isCustomLogo);
setIsCustomLogo(isCustomLogo); } else {
} else {
localStorage.getItem("theme") !== "default"
? setLogo(AnythingLLMDark)
: setLogo(AnythingLLM);
setLoginLogo(DefaultLoginLogo);
setIsCustomLogo(false);
}
} catch (err) {
localStorage.getItem("theme") !== "default" localStorage.getItem("theme") !== "default"
? setLogo(AnythingLLMDark) ? setLogo(AnythingLLMDark)
: setLogo(AnythingLLM); : setLogo(AnythingLLM);
setLoginLogo(DefaultLoginLogo); setLoginLogo(DefaultLoginLogo);
setIsCustomLogo(false); setIsCustomLogo(false);
console.error("Failed to fetch logo:", err);
} }
} catch (err) {
localStorage.getItem("theme") !== "default"
? setLogo(AnythingLLMDark)
: setLogo(AnythingLLM);
setLoginLogo(DefaultLoginLogo);
setIsCustomLogo(false);
console.error("Failed to fetch logo:", err);
} }
}
useEffect(() => {
fetchInstanceLogo(); fetchInstanceLogo();
window.addEventListener(REFETCH_LOGO_EVENT, fetchInstanceLogo);
return () => {
window.removeEventListener(REFETCH_LOGO_EVENT, fetchInstanceLogo);
};
}, []); }, []);
return ( return (
......
import { REFETCH_LOGO_EVENT } from "@/LogoContext";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
const availableThemes = { const availableThemes = {
...@@ -26,6 +27,7 @@ export function useTheme() { ...@@ -26,6 +27,7 @@ export function useTheme() {
document.documentElement.setAttribute("data-theme", theme); document.documentElement.setAttribute("data-theme", theme);
document.body.classList.toggle("light", theme === "light"); document.body.classList.toggle("light", theme === "light");
localStorage.setItem("theme", theme); localStorage.setItem("theme", theme);
window.dispatchEvent(new Event(REFETCH_LOGO_EVENT));
}, [theme]); }, [theme]);
// In development, attach keybind combinations to toggle theme // In development, attach keybind combinations to toggle theme
...@@ -34,20 +36,21 @@ export function useTheme() { ...@@ -34,20 +36,21 @@ export function useTheme() {
function toggleOnKeybind(e) { function toggleOnKeybind(e) {
if (e.metaKey && e.key === ".") { if (e.metaKey && e.key === ".") {
e.preventDefault(); e.preventDefault();
const newTheme = theme === "light" ? "default" : "light"; setTheme((prev) => (prev === "light" ? "default" : "light"));
console.log("toggling theme to ", newTheme);
setTheme(newTheme);
} }
} }
document.addEventListener("keydown", toggleOnKeybind); document.addEventListener("keydown", toggleOnKeybind);
return () => document.removeEventListener("keydown", toggleOnKeybind); return () => document.removeEventListener("keydown", toggleOnKeybind);
}, []); }, []);
// Refresh on theme change /**
const setTheme = (newTheme) => { * Sets the theme of the application and runs any
* other necessary side effects
* @param {string} newTheme The new theme to set
*/
function setTheme(newTheme) {
_setTheme(newTheme); _setTheme(newTheme);
window.location.reload(); }
};
return { theme, setTheme, availableThemes }; return { theme, setTheme, availableThemes };
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment