mirror of
https://github.com/YunoHost/yunohost-portal.git
synced 2024-09-03 20:06:23 +02:00
theme: allow user prefered theme over admin preference and vice versa
This commit is contained in:
parent
5c51df52c0
commit
3036186826
4 changed files with 45 additions and 5 deletions
|
@ -18,5 +18,6 @@ module.exports = {
|
||||||
singleQuote: true,
|
singleQuote: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
camelcase: 'warn',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,34 @@ export const usePreferedLocale = () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THEME
|
||||||
|
|
||||||
|
const usePreferedThemeState = () =>
|
||||||
|
useState<string>(
|
||||||
|
'preferedTheme',
|
||||||
|
() => localStorage.getItem('preferedTheme') || 'auto',
|
||||||
|
)
|
||||||
|
|
||||||
|
export const usePreferedTheme = async () => {
|
||||||
|
const preferedTheme = usePreferedThemeState()
|
||||||
|
const colorMode = useColorMode()
|
||||||
|
const settings = await useSettings()
|
||||||
|
|
||||||
|
return computed({
|
||||||
|
get: () => preferedTheme.value,
|
||||||
|
set: (value) => {
|
||||||
|
preferedTheme.value = value
|
||||||
|
localStorage.setItem('preferedTheme', value)
|
||||||
|
|
||||||
|
if (value === 'auto') {
|
||||||
|
value = settings.value.portal_theme
|
||||||
|
}
|
||||||
|
|
||||||
|
colorMode.preference = value
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const useRedirectUrl = () =>
|
export const useRedirectUrl = () =>
|
||||||
useState<string | null>('redirectUrl', () => null)
|
useState<string | null>('redirectUrl', () => null)
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@ useHead({
|
||||||
title: t('footerlink_edit'),
|
title: t('footerlink_edit'),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const settings = await useSettings()
|
||||||
|
const preferedTheme = await usePreferedTheme()
|
||||||
const preferedLocale = usePreferedLocale()
|
const preferedLocale = usePreferedLocale()
|
||||||
|
|
||||||
const localesAsOptions = computed(() => {
|
const localesAsOptions = computed(() => {
|
||||||
|
@ -24,8 +26,8 @@ const localesAsOptions = computed(() => {
|
||||||
return options
|
return options
|
||||||
})
|
})
|
||||||
|
|
||||||
const colorMode = useColorMode()
|
|
||||||
const themesAsOptions = [
|
const themesAsOptions = [
|
||||||
|
'auto',
|
||||||
'system',
|
'system',
|
||||||
'light',
|
'light',
|
||||||
'dark',
|
'dark',
|
||||||
|
@ -60,7 +62,10 @@ const themesAsOptions = [
|
||||||
'nord',
|
'nord',
|
||||||
'sunset',
|
'sunset',
|
||||||
].map((theme) => ({
|
].map((theme) => ({
|
||||||
text: theme.charAt(0).toUpperCase() + theme.slice(1),
|
text:
|
||||||
|
theme !== 'auto'
|
||||||
|
? theme.charAt(0).toUpperCase() + theme.slice(1)
|
||||||
|
: t('automatic', { name: settings.value.portal_theme }),
|
||||||
value: theme,
|
value: theme,
|
||||||
}))
|
}))
|
||||||
</script>
|
</script>
|
||||||
|
@ -113,7 +118,7 @@ const themesAsOptions = [
|
||||||
<label for="theme" class="label me-3">{{ t('theme') }}</label>
|
<label for="theme" class="label me-3">{{ t('theme') }}</label>
|
||||||
<select
|
<select
|
||||||
id="theme"
|
id="theme"
|
||||||
v-model="colorMode.preference"
|
v-model="preferedTheme"
|
||||||
class="select select-bordered"
|
class="select select-bordered"
|
||||||
>
|
>
|
||||||
<option disabled selected>{{ t('theme') }}</option>
|
<option disabled selected>{{ t('theme') }}</option>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { setLocale } from 'yup'
|
import { setLocale } from 'yup'
|
||||||
import { usePreferedLocale } from '@/composables/states'
|
import { usePreferedLocale, usePreferedTheme } from '@/composables/states'
|
||||||
|
|
||||||
export default defineNuxtPlugin({
|
export default defineNuxtPlugin({
|
||||||
setup() {
|
async setup() {
|
||||||
// Override default yup errors
|
// Override default yup errors
|
||||||
// https://github.com/jquense/yup/blob/master/src/locale.ts
|
// https://github.com/jquense/yup/blob/master/src/locale.ts
|
||||||
setLocale({
|
setLocale({
|
||||||
|
@ -15,6 +15,12 @@ export default defineNuxtPlugin({
|
||||||
min: ({ min }) => ({ key: 'v.string_too_short', values: { min } }),
|
min: ({ min }) => ({ key: 'v.string_too_short', values: { min } }),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const preferedTheme = await usePreferedTheme()
|
||||||
|
const colorMode = useColorMode()
|
||||||
|
if (preferedTheme.value !== 'auto') {
|
||||||
|
colorMode.preference = preferedTheme.value
|
||||||
|
}
|
||||||
},
|
},
|
||||||
hooks: {
|
hooks: {
|
||||||
'app:created'() {
|
'app:created'() {
|
||||||
|
|
Loading…
Reference in a new issue