From dcaf16f506dae00d6fbf28efc8bbc14a95fae638 Mon Sep 17 00:00:00 2001 From: Sasha Sorokin <10401817+brawaru@users.noreply.github.com> Date: Sun, 16 Jun 2024 22:20:09 +0200 Subject: [PATCH] Rewrite cosmetics and theme preferences - Cosmetics and theme preferences are now only stored in cookies instead of mix of both the cookies and the state. - Theme preference now supports client hints. This means the server can render the page in correct theme for the client if the client passes that information (any browser other than Firefox), which avoids annoying flash. - Hacky Nitro plugin for theme has been removed. It's functionality should be fully provided by the theme plugin with much cleaner code that uses Nuxt's built-ins. - All pages and components should be updated to use the new plugins. --- components/ui/charts/ChartDisplay.vue | 5 +- composables/cosmetics.js | 52 ----------- composables/cosmetics.ts | 3 + composables/theme.js | 58 ------------ composables/theme.ts | 3 + layouts/default.vue | 22 ++--- nuxt.config.ts | 9 ++ pages/app.vue | 2 +- pages/auth/reset-password.vue | 2 +- pages/auth/sign-in.vue | 2 +- pages/auth/sign-up.vue | 2 +- pages/collection/[id].vue | 1 - pages/index.vue | 4 +- pages/search/[searchProjectType].vue | 1 - pages/settings/index.vue | 78 ++++++++-------- pages/user/[id].vue | 1 - plugins/1.theme.js | 27 ------ plugins/cosmetics.ts | 57 +++++++++++ plugins/theme.ts | 130 ++++++++++++++++++++++++++ server/plugins/theme.js | 38 -------- utils/analytics.js | 19 ++-- 21 files changed, 267 insertions(+), 249 deletions(-) delete mode 100644 composables/cosmetics.js create mode 100644 composables/cosmetics.ts delete mode 100644 composables/theme.js create mode 100644 composables/theme.ts delete mode 100644 plugins/1.theme.js create mode 100644 plugins/cosmetics.ts create mode 100644 plugins/theme.ts delete mode 100644 server/plugins/theme.js diff --git a/components/ui/charts/ChartDisplay.vue b/components/ui/charts/ChartDisplay.vue index 84c24f3ab5..2067002745 100644 --- a/components/ui/charts/ChartDisplay.vue +++ b/components/ui/charts/ChartDisplay.vue @@ -160,7 +160,7 @@
- useState('cosmetics', () => { - const cosmetics = useCookie('cosmetics', { - maxAge: 60 * 60 * 24 * 365 * 10, - sameSite: 'lax', - secure: true, - httpOnly: false, - path: '/', - }) - - if (!cosmetics.value) { - cosmetics.value = { - searchLayout: false, - projectLayout: false, - advancedRendering: true, - externalLinksNewTab: true, - notUsingBlockers: false, - hideModrinthAppPromos: false, - preferredDarkTheme: 'dark', - searchDisplayMode: { - mod: 'list', - plugin: 'list', - resourcepack: 'gallery', - modpack: 'list', - shader: 'gallery', - datapack: 'list', - user: 'list', - collection: 'list', - }, - hideStagingBanner: false, - } - } - - return cosmetics.value - }) - -export const saveCosmetics = () => { - const cosmetics = useCosmetics() - - console.log('SAVING COSMETICS:') - console.log(cosmetics) - - const cosmeticsCookie = useCookie('cosmetics', { - maxAge: 60 * 60 * 24 * 365 * 10, - sameSite: 'lax', - secure: true, - httpOnly: false, - path: '/', - }) - - cosmeticsCookie.value = cosmetics.value -} diff --git a/composables/cosmetics.ts b/composables/cosmetics.ts new file mode 100644 index 0000000000..554ee96610 --- /dev/null +++ b/composables/cosmetics.ts @@ -0,0 +1,3 @@ +export function useCosmetics() { + return useNuxtApp().$cosmetics +} diff --git a/composables/theme.js b/composables/theme.js deleted file mode 100644 index eac074cb7b..0000000000 --- a/composables/theme.js +++ /dev/null @@ -1,58 +0,0 @@ -export const useTheme = () => - useState('theme', () => { - const colorMode = useCookie('color-mode', { - maxAge: 60 * 60 * 24 * 365 * 10, - sameSite: 'lax', - secure: true, - httpOnly: false, - path: '/', - }) - - if (!colorMode.value) { - colorMode.value = { - value: 'dark', - preference: 'system', - } - } - - if (colorMode.value.preference !== 'system') { - colorMode.value.value = colorMode.value.preference - } - - return colorMode.value - }) - -export const updateTheme = (value, updatePreference = false) => { - const theme = useTheme() - const cosmetics = useCosmetics() - - const themeCookie = useCookie('color-mode', { - maxAge: 60 * 60 * 24 * 365 * 10, - sameSite: 'lax', - secure: true, - httpOnly: false, - path: '/', - }) - - if (value === 'system') { - theme.value.preference = 'system' - - const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: light)') - if (colorSchemeQueryList.matches) { - theme.value.value = 'light' - } else { - theme.value.value = cosmetics.value.preferredDarkTheme - } - } else { - theme.value.value = value - if (updatePreference) theme.value.preference = value - } - - if (process.client) { - document.documentElement.className = `${theme.value.value}-mode` - } - - themeCookie.value = theme.value -} - -export const DARK_THEMES = ['dark', 'oled', 'retro'] diff --git a/composables/theme.ts b/composables/theme.ts new file mode 100644 index 0000000000..d303b25857 --- /dev/null +++ b/composables/theme.ts @@ -0,0 +1,3 @@ +export function useTheme() { + return useNuxtApp().$theme +} diff --git a/layouts/default.vue b/layouts/default.vue index 4a7532a188..a20dedc836 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -62,7 +62,7 @@ :title="formatMessage(messages.changeTheme)" @click="changeTheme" > -