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"
>
-
+
diff --git a/pages/auth/sign-in.vue b/pages/auth/sign-in.vue
index f03d0e9cb7..64a459941d 100644
--- a/pages/auth/sign-in.vue
+++ b/pages/auth/sign-in.vue
@@ -85,7 +85,7 @@
ref="turnstile"
v-model="token"
class="turnstile"
- :options="{ theme: $colorMode.value === 'light' ? 'light' : 'dark' }"
+ :options="{ theme: $theme.active === 'light' ? 'light' : 'dark' }"
/>