0
0
Fork 0
salix-front-mindshore-fork2/src/components/UserPanel.vue

147 lines
3.9 KiB
Vue
Raw Normal View History

2022-12-20 11:30:25 +00:00
<script setup>
import { onMounted, computed } from 'vue';
import { Dark, Quasar } from 'quasar';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import axios from 'axios';
import { useState } from 'src/composables/useState';
import { useSession } from 'src/composables/useSession';
const state = useState();
const session = useSession();
const router = useRouter();
const { t, locale } = useI18n();
const userLocale = computed({
get() {
return locale.value;
},
set(value) {
locale.value = value;
if (value === 'en') value = 'en-GB';
// FIXME: Dynamic imports from absolute paths are not compatible with vite:
// https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations
try {
2023-01-03 14:00:50 +00:00
const langList = import.meta.glob('../../node_modules/quasar/lang/*.mjs');
langList[`../../node_modules/quasar/lang/${value}.mjs`]().then((lang) => {
Quasar.lang.set(lang.default);
});
} catch (error) {
2023-01-03 14:00:50 +00:00
//
}
2022-12-20 11:30:25 +00:00
},
});
const darkMode = computed({
get() {
return Dark.isActive;
},
set(value) {
Dark.set(value);
},
});
const user = state.getUser();
const token = session.getToken();
onMounted(async () => {
updatePreferences();
});
function updatePreferences() {
if (user.value.darkMode !== null) {
darkMode.value = user.value.darkMode;
}
if (user.value.lang) {
locale.value = user.value.lang;
userLocale.value = user.value.lang;
}
}
async function saveDarkMode(value) {
const query = `/UserConfigs/${user.value.id}`;
await axios.patch(query, {
darkMode: value,
});
user.value.darkMode = value;
}
async function saveLanguage(value) {
const query = `/Accounts/${user.value.id}`;
await axios.patch(query, {
lang: value,
});
user.value.lang = value;
}
function logout() {
session.destroy();
router.push('/login');
}
</script>
<template>
2023-04-11 11:31:03 +00:00
<QMenu anchor="bottom left">
2022-12-20 11:30:25 +00:00
<div class="row no-wrap q-pa-md">
<div class="column panel">
2023-04-11 11:31:03 +00:00
<div class="text-h6 q-mb-md">
{{ t('components.userPanel.settings') }}
</div>
<QToggle
2023-01-03 14:00:50 +00:00
v-model="userLocale"
@update:model-value="saveLanguage"
:label="t(`globals.lang['${userLocale}']`)"
icon="public"
color="orange"
false-value="es"
true-value="en"
/>
2023-04-11 11:31:03 +00:00
<QToggle
2023-01-03 14:00:50 +00:00
v-model="darkMode"
@update:model-value="saveDarkMode"
:label="t(`globals.darkMode`)"
checked-icon="dark_mode"
color="orange"
unchecked-icon="light_mode"
/>
2022-12-20 11:30:25 +00:00
</div>
2023-04-11 11:31:03 +00:00
<QSeparator vertical inset class="q-mx-lg" />
2022-12-20 11:30:25 +00:00
<div class="column items-center panel">
2023-04-11 11:31:03 +00:00
<QAvatar size="80px">
<QImg
2023-01-03 14:00:50 +00:00
:src="`/api/Images/user/160x160/${user.id}/download?access_token=${token}`"
spinner-color="white"
/>
2023-04-11 11:31:03 +00:00
</QAvatar>
2022-12-20 11:30:25 +00:00
<div class="text-subtitle1 q-mt-md">
<strong>{{ user.nickname }}</strong>
</div>
<div class="text-subtitle3 text-grey-7 q-mb-xs">@{{ user.name }}</div>
2023-04-11 11:31:03 +00:00
<QBtn
2023-01-03 14:00:50 +00:00
id="logout"
color="orange"
flat
:label="t('globals.logOut')"
size="sm"
icon="logout"
@click="logout()"
v-close-popup
/>
2022-12-20 11:30:25 +00:00
</div>
</div>
2023-04-11 11:31:03 +00:00
</QMenu>
2022-12-20 11:30:25 +00:00
</template>
<style lang="scss" scoped>
.panel {
width: 150px;
}
</style>