Skip to content

Commit 4293912

Browse files
authored
Fix hydration issue on publicView pages (baserow#4843)
1 parent 87737e0 commit 4293912

2 files changed

Lines changed: 21 additions & 11 deletions

File tree

web-frontend/modules/database/pages/publicView.vue

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<script setup>
2020
import { computed, ref, onMounted, onBeforeUnmount } from 'vue'
2121
import { useRoute } from 'vue-router'
22-
import { useAsyncData, useNuxtApp } from '#app'
22+
import { useAsyncData, useNuxtApp, useState } from '#app'
2323
import { useHead } from '#imports'
2424
2525
import Toasts from '@baserow/modules/core/components/toasts/Toasts'
@@ -37,9 +37,12 @@ const route = useRoute()
3737
const nuxtApp = useNuxtApp()
3838
const { $store, $realtime, $priorityBus, $config, $i18n } = nuxtApp
3939
40-
const originalLanguageBeforeDetect = ref(null)
41-
originalLanguageBeforeDetect.value = $i18n.locale
42-
$i18n.locale = $i18n.getBrowserLocale()
40+
const originalLanguageBeforeDetect = ref($i18n.locale.value)
41+
const detectedLocale = useState('public-view-detected-locale', () => {
42+
return $i18n.getBrowserLocale() || $i18n.defaultLocale
43+
})
44+
$i18n.locale.value = detectedLocale.value
45+
await $i18n.loadLocaleMessages(detectedLocale.value)
4346
4447
const { data, error } = await useAsyncData(
4548
`database-public-view-${route.params.slug}`,
@@ -179,7 +182,7 @@ onMounted(() => {
179182
})
180183
181184
onBeforeUnmount(() => {
182-
$i18n.locale = originalLanguageBeforeDetect.value
185+
$i18n.locale.value = originalLanguageBeforeDetect.value
183186
184187
document.body.removeEventListener('keydown', keydownEvent)
185188

web-frontend/modules/database/pages/publicViewLogin.vue

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
</template>
4343

4444
<script setup>
45-
import { ref, reactive, onMounted, nextTick } from 'vue'
45+
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue'
4646
import { useRoute, useRouter } from 'vue-router'
47-
import { useHead } from '#imports'
47+
import { useHead, useState } from '#imports'
4848
import { useVuelidate } from '@vuelidate/core'
4949
import { required, helpers } from '@vuelidate/validators'
5050
@@ -60,10 +60,13 @@ const router = useRouter()
6060
const nuxtApp = useNuxtApp()
6161
const { $store, $client, $i18n } = nuxtApp
6262
63-
// Language detection (replaces languageDetection mixin)
64-
const originalLanguageBeforeDetect = ref(null)
65-
originalLanguageBeforeDetect.value = $i18n.locale
66-
$i18n.locale = $i18n.getBrowserLocale()
63+
// Language detection — useState ensures server/client agree on the detected locale (SSR-safe)
64+
const originalLanguageBeforeDetect = ref($i18n.locale.value)
65+
const detectedLocale = useState('public-view-login-detected-locale', () => {
66+
return $i18n.getBrowserLocale() || $i18n.defaultLocale
67+
})
68+
$i18n.locale.value = detectedLocale.value
69+
await $i18n.loadLocaleMessages(detectedLocale.value)
6770
6871
// Page title
6972
useHead({
@@ -140,4 +143,8 @@ onMounted(() => {
140143
passwordInput.value?.focus()
141144
})
142145
})
146+
147+
onBeforeUnmount(() => {
148+
$i18n.locale.value = originalLanguageBeforeDetect.value
149+
})
143150
</script>

0 commit comments

Comments
 (0)