make new localstorage function file
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
import { createI18n } from 'vue-i18n';
|
import { createI18n } from 'vue-i18n';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
|
import { getLocalLanguage } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
export const lang = [];
|
export const lang = [];
|
||||||
|
|
||||||
const systemLocale = navigator.language || 'en-US';
|
const systemLocale = navigator.language || 'en-US';
|
||||||
const savedLang = localStorage.getItem('lang');
|
|
||||||
|
|
||||||
const messages = {};
|
const messages = {};
|
||||||
const modules = import.meta.glob('src/assets/lang/*.yaml', {
|
const modules = import.meta.glob('src/assets/lang/*.yaml', {
|
||||||
@@ -39,7 +39,7 @@ function resolveLocale(desiredLocale) {
|
|||||||
return messages['en'] ? 'en' : Object.keys(messages)[0];
|
return messages['en'] ? 'en' : Object.keys(messages)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
const selectedLocale = resolveLocale(savedLang || systemLocale);
|
const selectedLocale = resolveLocale(getLocalLanguage() || systemLocale);
|
||||||
|
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
legacy: false, // Composition API mode
|
legacy: false, // Composition API mode
|
||||||
|
|||||||
@@ -3,44 +3,29 @@ import { setQuasarInstance } from 'src/vueLib/utils/globalQ';
|
|||||||
import { setRouterInstance } from 'src/vueLib/utils/globalRouter';
|
import { setRouterInstance } from 'src/vueLib/utils/globalRouter';
|
||||||
import { databaseName, logo, appName } from 'src/vueLib/models/settings';
|
import { databaseName, logo, appName } from 'src/vueLib/models/settings';
|
||||||
import { Dark } from 'quasar';
|
import { Dark } from 'quasar';
|
||||||
|
import { getLocalDarkMode, getLocalSettings } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
export default boot(({ app, router }) => {
|
export default boot(({ app, router }) => {
|
||||||
setRouterInstance(router); // store router for global access
|
setRouterInstance(router); // store router for global access
|
||||||
const $q = app.config.globalProperties.$q;
|
const $q = app.config.globalProperties.$q;
|
||||||
setQuasarInstance($q);
|
setQuasarInstance($q);
|
||||||
|
|
||||||
Dark.set(localStorage.getItem('mode') === 'true');
|
Dark.set(getLocalDarkMode());
|
||||||
|
|
||||||
logo.value = localStorage.getItem('icon') ?? logo.value;
|
const settings = getLocalSettings();
|
||||||
appName.value = localStorage.getItem('appName') ?? appName.value;
|
|
||||||
databaseName.value = localStorage.getItem('databaseName') ?? databaseName.value;
|
|
||||||
let primaryColor = localStorage.getItem('primaryColor');
|
|
||||||
if (primaryColor == null || primaryColor === 'undefined' || primaryColor.trim() === '') {
|
|
||||||
primaryColor = null;
|
|
||||||
}
|
|
||||||
let primaryColorText = localStorage.getItem('primaryColorText');
|
|
||||||
if (
|
|
||||||
primaryColorText == null ||
|
|
||||||
primaryColorText === 'undefined' ||
|
|
||||||
primaryColorText.trim() === ''
|
|
||||||
) {
|
|
||||||
primaryColorText = null;
|
|
||||||
}
|
|
||||||
let secondaryColor = localStorage.getItem('secondaryColor');
|
|
||||||
if (secondaryColor == null || secondaryColor === 'undefined' || secondaryColor.trim() === '') {
|
|
||||||
secondaryColor = null;
|
|
||||||
}
|
|
||||||
let secondaryColorText = localStorage.getItem('secondaryColorText');
|
|
||||||
if (
|
|
||||||
secondaryColorText == null ||
|
|
||||||
secondaryColorText === 'undefined' ||
|
|
||||||
secondaryColorText.trim() === ''
|
|
||||||
) {
|
|
||||||
secondaryColorText = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
document.documentElement.style.setProperty('--q-primary', primaryColor ?? '#1976d2');
|
logo.value = settings.icon ?? logo.value;
|
||||||
document.documentElement.style.setProperty('--q-primary-text', primaryColorText ?? '#ffffff');
|
appName.value = settings.appName ?? appName.value;
|
||||||
document.documentElement.style.setProperty('--q-secondary', secondaryColor ?? '#26a69a');
|
databaseName.value = settings.databaseName ?? databaseName.value;
|
||||||
document.documentElement.style.setProperty('--q-secondary-text', secondaryColorText ?? '#ffffff');
|
|
||||||
|
document.documentElement.style.setProperty('--q-primary', settings.primaryColor ?? '#1976d2');
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
'--q-primary-text',
|
||||||
|
settings.primaryColorText ?? '#ffffff',
|
||||||
|
);
|
||||||
|
document.documentElement.style.setProperty('--q-secondary', settings.secondaryColor ?? '#26a69a');
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
'--q-secondary-text',
|
||||||
|
settings.secondaryColorText ?? '#ffffff',
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { boot } from 'quasar/wrappers';
|
import { boot } from 'quasar/wrappers';
|
||||||
import { useUserStore } from 'src/vueLib/login/userStore';
|
import { useUserStore } from 'src/vueLib/login/userStore';
|
||||||
import { appApi } from './axios';
|
import { appApi } from './axios';
|
||||||
|
import { getLocalLastRoute, setLocalLastRoute } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
export default boot(async ({ router }) => {
|
export default boot(async ({ router }) => {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
@@ -14,7 +15,7 @@ export default boot(async ({ router }) => {
|
|||||||
|
|
||||||
// Restore logic after router is ready but before navigation
|
// Restore logic after router is ready but before navigation
|
||||||
router.isReady().then(() => {
|
router.isReady().then(() => {
|
||||||
const lastRoute = localStorage.getItem('lastRoute');
|
const lastRoute = getLocalLastRoute();
|
||||||
const currentPath = router.currentRoute.value.fullPath;
|
const currentPath = router.currentRoute.value.fullPath;
|
||||||
|
|
||||||
// Restore only if:
|
// Restore only if:
|
||||||
@@ -34,7 +35,7 @@ export default boot(async ({ router }) => {
|
|||||||
router.afterEach((to) => {
|
router.afterEach((to) => {
|
||||||
// Don't save login page as "last route"
|
// Don't save login page as "last route"
|
||||||
if (to.path !== '/login' && to.path !== '/') {
|
if (to.path !== '/login' && to.path !== '/') {
|
||||||
localStorage.setItem('lastRoute', to.fullPath);
|
setLocalLastRoute(to.fullPath);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
93
src/localstorage/localStorage.ts
Normal file
93
src/localstorage/localStorage.ts
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import { Dark } from 'quasar';
|
||||||
|
import type { Settings } from 'src/vueLib/models/settings';
|
||||||
|
import { updateOrAddObject } from 'src/vueLib/utils/utils';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
export function setLocalSettings(settings: Settings) {
|
||||||
|
localStorage.setItem('icon', settings.icon);
|
||||||
|
localStorage.setItem('appName', settings.appName);
|
||||||
|
localStorage.setItem('databaseName', settings.databaseName);
|
||||||
|
localStorage.setItem('primaryColor', settings.primaryColor);
|
||||||
|
localStorage.setItem('primaryColorText', settings.primaryColorText);
|
||||||
|
localStorage.setItem('secondaryColor', settings.secondaryColor);
|
||||||
|
localStorage.setItem('secondaryColorText', settings.secondaryColorText);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocalSettings(): Settings {
|
||||||
|
return <Settings>{
|
||||||
|
icon: localStorage.getItem('icon'),
|
||||||
|
appName: localStorage.getItem('appName'),
|
||||||
|
databaseName: localStorage.getItem('databaseName'),
|
||||||
|
primaryColor: localStorage.getItem('primaryColor'),
|
||||||
|
primaryColorText: localStorage.getItem('primaryColorText'),
|
||||||
|
secondaryColor: localStorage.getItem('secondaryColor'),
|
||||||
|
secondaryColorText: localStorage.getItem('secondaryColorText'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function clearLocalStorage() {
|
||||||
|
localStorage.removeItem('icon');
|
||||||
|
localStorage.removeItem('appName');
|
||||||
|
localStorage.removeItem('databaseName');
|
||||||
|
localStorage.removeItem('primaryColor');
|
||||||
|
localStorage.removeItem('primaryColorText');
|
||||||
|
localStorage.removeItem('secondaryColor');
|
||||||
|
localStorage.removeItem('secondaryColorText');
|
||||||
|
localStorage.removeItem('lastRoute');
|
||||||
|
localStorage.removeItem('mode');
|
||||||
|
localStorage.removeItem('lang');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setLocalDarkMode() {
|
||||||
|
localStorage.setItem('mode', String(Dark.mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocalDarkMode(): boolean {
|
||||||
|
return localStorage.getItem('mode') === 'true';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setLocalLastRoute(route: string) {
|
||||||
|
localStorage.setItem('lastRoute', route);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocalLastRoute(): string {
|
||||||
|
return localStorage.getItem('lastRoute') || '/members';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setLocalLanguage(language: string) {
|
||||||
|
localStorage.setItem('lang', language);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocalLanguage(): string | null {
|
||||||
|
return localStorage.getItem('lang');
|
||||||
|
}
|
||||||
|
|
||||||
|
type pageDefault = {
|
||||||
|
page: string;
|
||||||
|
filteredColumn: string;
|
||||||
|
filteredValue: string[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type pageDefaults = pageDefault[];
|
||||||
|
|
||||||
|
const pageDefaults = ref<pageDefaults>([]);
|
||||||
|
|
||||||
|
export function setLocalPageDefaults(
|
||||||
|
page: string,
|
||||||
|
filteredColumn?: string,
|
||||||
|
filteredValue?: string[],
|
||||||
|
) {
|
||||||
|
updateOrAddObject(
|
||||||
|
pageDefaults.value,
|
||||||
|
{ page: page, filteredColumn: filteredColumn, filteredValue: filteredValue },
|
||||||
|
'page',
|
||||||
|
);
|
||||||
|
localStorage.setItem('pageDefaults', JSON.stringify(pageDefaults.value));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocalPageDefaults(page: string): pageDefault | null {
|
||||||
|
const defaults = localStorage.getItem('pageDefaults');
|
||||||
|
if (!defaults) return null;
|
||||||
|
pageDefaults.value = JSON.parse(defaults);
|
||||||
|
return pageDefaults.value.find((e) => e.page === page) || null;
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { getLocalLastRoute } from 'src/localstorage/localStorage';
|
||||||
import LoginForm from 'src/vueLib/login/LoginForm.vue';
|
import LoginForm from 'src/vueLib/login/LoginForm.vue';
|
||||||
import { useUserStore } from 'src/vueLib/login/userStore';
|
import { useUserStore } from 'src/vueLib/login/userStore';
|
||||||
import { nextTick, onMounted } from 'vue';
|
import { nextTick, onMounted } from 'vue';
|
||||||
@@ -21,7 +22,6 @@ onMounted(() => {
|
|||||||
|
|
||||||
const forwardToPage = async () => {
|
const forwardToPage = async () => {
|
||||||
await nextTick();
|
await nextTick();
|
||||||
const lastRoute = localStorage.getItem('lastRoute') || '/members';
|
await router.push(getLocalLastRoute());
|
||||||
await router.push(lastRoute);
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<h4 class="text-primary text-bold text-center">{{ $t('userSettings') }}</h4>
|
||||||
|
|
||||||
<div class="text-h2 flex flex-center">
|
<div class="text-h2 flex flex-center">
|
||||||
<q-card class="q-gutter-md">
|
<q-card class="q-gutter-md">
|
||||||
<p class="text-center text-bold text-h3 text-primary q-pt-md">{{ $t('settings') }}</p>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<q-card class="q-ma-lg">
|
<q-card class="q-ma-lg">
|
||||||
<p class="text-bold text-h6 text-primary q-pa-md">{{ $t('general') }}</p>
|
<p class="text-bold text-h6 text-primary q-pa-md">{{ $t('general') }}</p>
|
||||||
@@ -151,6 +151,7 @@ import { appApi } from 'src/boot/axios';
|
|||||||
import { useNotify } from 'src/vueLib/general/useNotify';
|
import { useNotify } from 'src/vueLib/general/useNotify';
|
||||||
import { type Settings } from 'src/vueLib/models/settings';
|
import { type Settings } from 'src/vueLib/models/settings';
|
||||||
import { useUserStore } from 'src/vueLib/login/userStore';
|
import { useUserStore } from 'src/vueLib/login/userStore';
|
||||||
|
import { setLocalSettings } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
const { NotifyResponse } = useNotify();
|
const { NotifyResponse } = useNotify();
|
||||||
const colorGroup = ref(false);
|
const colorGroup = ref(false);
|
||||||
@@ -190,13 +191,7 @@ function save() {
|
|||||||
document.documentElement.style.setProperty('--q-secondary-text', settings.secondaryColorText);
|
document.documentElement.style.setProperty('--q-secondary-text', settings.secondaryColorText);
|
||||||
appName.value = settings.appName;
|
appName.value = settings.appName;
|
||||||
logo.value = settings.icon;
|
logo.value = settings.icon;
|
||||||
localStorage.setItem('icon', settings.icon);
|
setLocalSettings(settings);
|
||||||
localStorage.setItem('appName', settings.appName);
|
|
||||||
localStorage.setItem('databaseName', settings.databaseName);
|
|
||||||
localStorage.setItem('primaryColor', settings.primaryColor);
|
|
||||||
localStorage.setItem('primaryColorText', settings.primaryColorText);
|
|
||||||
localStorage.setItem('secondaryColor', settings.secondaryColor);
|
|
||||||
localStorage.setItem('secondaryColorText', settings.secondaryColorText);
|
|
||||||
|
|
||||||
const tempuser = user.user;
|
const tempuser = user.user;
|
||||||
if (tempuser) {
|
if (tempuser) {
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import { useUserStore } from './userStore';
|
|||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { Dark } from 'quasar';
|
import { Dark } from 'quasar';
|
||||||
import { useLogin } from './useLogin';
|
import { useLogin } from './useLogin';
|
||||||
|
import { setLocalDarkMode, setLocalLanguage } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
const userLogin = useLogin();
|
const userLogin = useLogin();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
@@ -81,7 +82,7 @@ const loginText = computed(() => {
|
|||||||
//switch between dark and light mode and save it in localStorage
|
//switch between dark and light mode and save it in localStorage
|
||||||
function toggleDarkMode() {
|
function toggleDarkMode() {
|
||||||
Dark.toggle();
|
Dark.toggle();
|
||||||
localStorage.setItem('mode', String(Dark.mode));
|
setLocalDarkMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
// opens login page if no user is logged in otherwise it serves as logout
|
// opens login page if no user is logged in otherwise it serves as logout
|
||||||
@@ -99,6 +100,7 @@ const langSelection = ref(lang);
|
|||||||
// Watch for changes and update i18n locale
|
// Watch for changes and update i18n locale
|
||||||
watch(langSelected, (newLang) => {
|
watch(langSelected, (newLang) => {
|
||||||
i18n.global.locale = newLang;
|
i18n.global.locale = newLang;
|
||||||
localStorage.setItem('lang', newLang);
|
|
||||||
|
setLocalLanguage(newLang);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { useUserStore } from './userStore';
|
|||||||
import { useNotify } from '../general/useNotify';
|
import { useNotify } from '../general/useNotify';
|
||||||
import type { Settings } from '../models/settings';
|
import type { Settings } from '../models/settings';
|
||||||
import { appName, logo } from '../models/settings';
|
import { appName, logo } from '../models/settings';
|
||||||
|
import { clearLocalStorage, setLocalSettings } from 'src/localstorage/localStorage';
|
||||||
|
|
||||||
const refreshTime = 10000;
|
const refreshTime = 10000;
|
||||||
let intervalId: ReturnType<typeof setInterval> | null = null;
|
let intervalId: ReturnType<typeof setInterval> | null = null;
|
||||||
@@ -22,12 +23,7 @@ export function useLogin() {
|
|||||||
document.documentElement.style.setProperty('--q-primary-text', sets.primaryColorText);
|
document.documentElement.style.setProperty('--q-primary-text', sets.primaryColorText);
|
||||||
document.documentElement.style.setProperty('--q-secondary', sets.secondaryColor);
|
document.documentElement.style.setProperty('--q-secondary', sets.secondaryColor);
|
||||||
document.documentElement.style.setProperty('--q-secondary-text', sets.secondaryColorText);
|
document.documentElement.style.setProperty('--q-secondary-text', sets.secondaryColorText);
|
||||||
localStorage.setItem('icon', sets.icon);
|
setLocalSettings(sets);
|
||||||
localStorage.setItem('databaseName', sets.databaseName);
|
|
||||||
localStorage.setItem('primaryColor', sets.primaryColor);
|
|
||||||
localStorage.setItem('primaryColorText', sets.primaryColorText);
|
|
||||||
localStorage.setItem('secondaryColor', sets.secondaryColor);
|
|
||||||
localStorage.setItem('secondaryColorText', sets.secondaryColorText);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const resp = await appApi.get('/login/me');
|
const resp = await appApi.get('/login/me');
|
||||||
@@ -49,7 +45,7 @@ export function useLogin() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
userStore.clearUser();
|
userStore.clearUser();
|
||||||
localStorage.clear();
|
clearLocalStorage();
|
||||||
stopRefreshInterval();
|
stopRefreshInterval();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user