fb7b4eefc1
Build & Push / Build & Push Docker Image (push) Failing after 2m50s
Test / Type Check (all packages) (push) Failing after 55s
Test / API Unit Tests (push) Has been skipped
Test / Homepage Unit Tests (push) Has been skipped
Test / Carplace Unit Tests (push) Has been skipped
Test / Admin Unit Tests (push) Has been skipped
Test / Dashboard Unit Tests (push) Has been skipped
Test / API Integration Tests (push) Has been skipped
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import {
|
|
isThemePreference,
|
|
resolveTheme,
|
|
themeCookie,
|
|
themeCookieMaxAgeSeconds,
|
|
themeStorageKey,
|
|
type ThemePreference,
|
|
} from './config';
|
|
|
|
export const themePreferenceEvent = 'rentaldrivego:theme-preference';
|
|
|
|
export function applyTheme(preference: ThemePreference): void {
|
|
const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
const resolved = resolveTheme(preference, systemDark);
|
|
const root = document.documentElement;
|
|
root.dataset.themePreference = preference;
|
|
root.dataset.theme = resolved;
|
|
}
|
|
|
|
export function persistTheme(preference: ThemePreference): void {
|
|
try {
|
|
window.localStorage.setItem(themeStorageKey, preference);
|
|
} catch {
|
|
// Storage can be unavailable; the first-party cookie remains canonical.
|
|
}
|
|
|
|
const secure = window.location.protocol === 'https:' ? '; Secure' : '';
|
|
document.cookie =
|
|
[
|
|
`${themeCookie}=${encodeURIComponent(preference)}`,
|
|
'Path=/',
|
|
`Max-Age=${themeCookieMaxAgeSeconds}`,
|
|
'SameSite=Lax',
|
|
].join('; ') + secure;
|
|
applyTheme(preference);
|
|
window.dispatchEvent(
|
|
new CustomEvent<ThemePreference>(themePreferenceEvent, { detail: preference }),
|
|
);
|
|
}
|
|
|
|
export function currentThemePreference(): ThemePreference {
|
|
const value = document.documentElement.dataset.themePreference;
|
|
return isThemePreference(value) ? value : 'dark';
|
|
}
|