analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
231 lines (226 loc) • 6.4 kB
JavaScript
import {
resolveRootHostname
} from "./chunk-RLGKQUBF.mjs";
// src/store/themeStore.ts
import { create } from "zustand";
import { createJSONStorage, devtools, persist } from "zustand/middleware";
// src/utils/cookieUtils.ts
var getCookie = (name) => {
if (typeof document === "undefined") {
return null;
}
const prefix = `${encodeURIComponent(name)}=`;
const match = document.cookie.split("; ").find((entry) => entry.startsWith(prefix));
if (!match) {
return null;
}
try {
return decodeURIComponent(match.slice(prefix.length));
} catch {
return null;
}
};
var setCookie = (name, value, options = {}) => {
if (typeof document === "undefined") {
return;
}
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
parts.push(`Path=${options.path ?? "/"}`);
if (options.maxAge !== void 0) {
parts.push(`Max-Age=${options.maxAge}`);
}
if (options.domain) {
parts.push(`Domain=${options.domain}`);
}
parts.push(`SameSite=${options.sameSite ?? "Lax"}`);
if (options.secure) {
parts.push("Secure");
}
document.cookie = parts.join("; ");
};
var removeCookie = (name, options = {}) => {
setCookie(name, "", { ...options, maxAge: 0 });
};
// src/store/themeStorage.ts
var ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;
var cookieDomain = () => resolveRootHostname(globalThis.location.hostname) ?? void 0;
var readLocalStorage = (name) => {
try {
return globalThis.localStorage.getItem(name);
} catch {
return null;
}
};
var validJsonOrNull = (raw) => {
if (raw === null) {
return null;
}
try {
JSON.parse(raw);
return raw;
} catch {
return null;
}
};
var themeCookieStorage = {
getItem: (name) => {
if (typeof document === "undefined") {
return null;
}
return validJsonOrNull(getCookie(name)) ?? validJsonOrNull(readLocalStorage(name));
},
setItem: (name, value) => {
if (typeof document === "undefined") {
return;
}
setCookie(name, value, {
domain: cookieDomain(),
path: "/",
maxAge: ONE_YEAR_IN_SECONDS,
sameSite: "Lax",
secure: globalThis.location.protocol === "https:"
});
try {
globalThis.localStorage.setItem(name, value);
} catch {
}
},
removeItem: (name) => {
if (typeof document === "undefined") {
return;
}
removeCookie(name, { domain: cookieDomain(), path: "/" });
try {
globalThis.localStorage.removeItem(name);
} catch {
}
}
};
// src/store/themeStore.ts
var DARK_THEME_MAP = {
"base-light": "base-dark",
"enem-parana-light": "enem-parana-dark",
"enem-paraiba-light": "enem-paraiba-dark",
"analytica-light": "analytica-dark",
"papole-light": "papole-dark"
};
var resolveDarkTheme = (originalTheme) => {
if (!originalTheme) return "base-dark";
return DARK_THEME_MAP[originalTheme] ?? "base-dark";
};
var applyThemeToDOM = (mode) => {
const htmlElement = document.documentElement;
const originalTheme = htmlElement.dataset.originalTheme;
if (mode === "dark") {
htmlElement.dataset.theme = resolveDarkTheme(originalTheme);
return true;
} else if (mode === "light") {
if (originalTheme) {
htmlElement.dataset.theme = originalTheme;
}
return false;
} else if (mode === "system") {
const isSystemDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
if (isSystemDark) {
htmlElement.dataset.theme = resolveDarkTheme(originalTheme);
return true;
} else if (originalTheme) {
htmlElement.dataset.theme = originalTheme;
return false;
}
}
return false;
};
var saveOriginalTheme = () => {
const htmlElement = document.documentElement;
const currentTheme = htmlElement.dataset.theme || document.querySelector('meta[name="theme"]')?.getAttribute("content");
if (currentTheme && !htmlElement.dataset.originalTheme) {
htmlElement.dataset.originalTheme = currentTheme;
}
};
var useThemeStore = create()(
devtools(
persist(
(set, get) => ({
// Initial state
themeMode: "system",
isDark: false,
// Actions
applyTheme: (mode) => {
const isDark = applyThemeToDOM(mode);
set({ isDark });
},
toggleTheme: () => {
const { themeMode, applyTheme } = get();
let newMode;
if (themeMode === "light") {
newMode = "dark";
} else if (themeMode === "dark") {
newMode = "light";
} else {
newMode = "dark";
}
set({ themeMode: newMode });
applyTheme(newMode);
},
setTheme: (mode) => {
const { applyTheme } = get();
set({ themeMode: mode });
applyTheme(mode);
},
setWhiteLabelTheme: (theme) => {
const htmlElement = document.documentElement;
if (theme) {
htmlElement.dataset.originalTheme = theme;
const { themeMode, applyTheme } = get();
if (themeMode === "light" || themeMode === "system") {
htmlElement.dataset.theme = theme;
}
applyTheme(themeMode);
}
},
clearWhiteLabelTheme: () => {
const htmlElement = document.documentElement;
delete htmlElement.dataset.originalTheme;
delete htmlElement.dataset.theme;
saveOriginalTheme();
const { themeMode, applyTheme } = get();
applyTheme(themeMode);
},
initializeTheme: () => {
const { themeMode, applyTheme } = get();
saveOriginalTheme();
applyTheme(themeMode);
},
handleSystemThemeChange: () => {
const { themeMode, applyTheme } = get();
if (themeMode === "system") {
applyTheme("system");
}
}
}),
{
name: "theme-store",
// Storage key (cookie + localStorage)
// Root-domain cookie so login and app subdomains share the theme
storage: createJSONStorage(() => themeCookieStorage),
partialize: (state) => ({
themeMode: state.themeMode
})
// Só persiste o themeMode, não o isDark
}
),
{
name: "theme-store"
}
)
);
export {
getCookie,
setCookie,
removeCookie,
useThemeStore
};
//# sourceMappingURL=chunk-GF2M5EE6.mjs.map