feat: theme mode base on device
This commit is contained in:
parent
53bb20a8c1
commit
613a5759a9
2 changed files with 48 additions and 23 deletions
|
|
@ -8,13 +8,14 @@ import { getName, getRealm, getRole, isLoggedIn } from 'src/services/keycloak';
|
||||||
|
|
||||||
const $q = useQuasar();
|
const $q = useQuasar();
|
||||||
|
|
||||||
const themeRef = ref();
|
|
||||||
const userImage = ref<string>('');
|
const userImage = ref<string>('');
|
||||||
const filterRole = ref<string[]>();
|
const filterRole = ref<string[]>();
|
||||||
const inputFile = document.createElement('input');
|
const inputFile = document.createElement('input');
|
||||||
inputFile.type = 'file';
|
inputFile.type = 'file';
|
||||||
inputFile.accept = 'image/*';
|
inputFile.accept = 'image/*';
|
||||||
// const profileFile = ref<File | undefined>(undefined);
|
// const profileFile = ref<File | undefined>(undefined);
|
||||||
|
|
||||||
|
const currentTheme = ref();
|
||||||
const options = ref([
|
const options = ref([
|
||||||
{
|
{
|
||||||
icon: 'mdi-account',
|
icon: 'mdi-account',
|
||||||
|
|
@ -54,7 +55,6 @@ const themeMode = ref([
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const isDarkActive = computed(() => $q.dark.isActive);
|
|
||||||
// inputFile.addEventListener('change', async (e) => {
|
// inputFile.addEventListener('change', async (e) => {
|
||||||
// profileFile.value = await (e.currentTarget as HTMLInputElement).files?.[0];
|
// profileFile.value = await (e.currentTarget as HTMLInputElement).files?.[0];
|
||||||
// if (profileFile.value) {
|
// if (profileFile.value) {
|
||||||
|
|
@ -62,28 +62,57 @@ const isDarkActive = computed(() => $q.dark.isActive);
|
||||||
// }
|
// }
|
||||||
// userImage.value = (await storageStore.getProfile()) ?? '';
|
// userImage.value = (await storageStore.getProfile()) ?? '';
|
||||||
// });
|
// });
|
||||||
watch(
|
|
||||||
() => isDarkActive.value,
|
function changeMode(mode: string) {
|
||||||
() => {
|
if (mode === 'light') {
|
||||||
if ($q.dark.isActive) {
|
localStorage.setItem('currentTheme', 'light');
|
||||||
themeMode.value[1].isActive = true;
|
themeMode.value[0].isActive = true;
|
||||||
themeMode.value[0].isActive = false;
|
themeMode.value[1].isActive = false;
|
||||||
localStorage.setItem('currentTheme', 'dark');
|
themeMode.value[2].isActive = false;
|
||||||
|
$q.dark.set(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === 'dark') {
|
||||||
|
localStorage.setItem('currentTheme', 'dark');
|
||||||
|
themeMode.value[0].isActive = false;
|
||||||
|
themeMode.value[1].isActive = true;
|
||||||
|
themeMode.value[2].isActive = false;
|
||||||
|
$q.dark.set(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === 'baseOnDevice') {
|
||||||
|
localStorage.setItem('currentTheme', 'baseOnDevice');
|
||||||
|
themeMode.value[0].isActive = false;
|
||||||
|
themeMode.value[1].isActive = false;
|
||||||
|
themeMode.value[2].isActive = true;
|
||||||
|
if (
|
||||||
|
window.matchMedia &&
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
) {
|
||||||
|
$q.dark.set(true);
|
||||||
} else {
|
} else {
|
||||||
themeMode.value[0].isActive = true;
|
$q.dark.set(false);
|
||||||
themeMode.value[1].isActive = false;
|
|
||||||
localStorage.setItem('currentTheme', 'light');
|
|
||||||
}
|
}
|
||||||
},
|
return;
|
||||||
);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window
|
||||||
|
.matchMedia('(prefers-color-scheme: dark)')
|
||||||
|
.addEventListener('change', () => {
|
||||||
|
changeMode('baseOnDevice');
|
||||||
|
});
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// if (isLoggedIn()) {
|
// if (isLoggedIn()) {
|
||||||
// userImage.value = (await storageStore.getProfile()) ?? '';
|
// userImage.value = (await storageStore.getProfile()) ?? '';
|
||||||
// }
|
// }
|
||||||
isDarkActive.value
|
currentTheme.value = localStorage.getItem('currentTheme');
|
||||||
? (themeMode.value[1].isActive = true)
|
if (currentTheme.value === 'light') changeMode('light');
|
||||||
: (themeMode.value[0].isActive = true);
|
if (currentTheme.value === 'dark') changeMode('dark');
|
||||||
|
if (currentTheme.value === 'baseOnDevice') changeMode('baseOnDevice');
|
||||||
|
|
||||||
const userRoles = getRole();
|
const userRoles = getRole();
|
||||||
if (userRoles) {
|
if (userRoles) {
|
||||||
|
|
@ -230,14 +259,13 @@ onMounted(async () => {
|
||||||
{{ $t(op.label) }}
|
{{ $t(op.label) }}
|
||||||
</span>
|
</span>
|
||||||
<span class="app-text-muted-2">
|
<span class="app-text-muted-2">
|
||||||
{{ isDarkActive ? $t('dark') : $t('light') }}
|
{{ $t(currentTheme) }}
|
||||||
<q-icon name="mdi-chevron-right" />
|
<q-icon name="mdi-chevron-right" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
|
|
||||||
<q-menu
|
<q-menu
|
||||||
ref="themeRef"
|
|
||||||
class="bordered rounded"
|
class="bordered rounded"
|
||||||
anchor="top right"
|
anchor="top right"
|
||||||
self="top left"
|
self="top left"
|
||||||
|
|
@ -250,7 +278,7 @@ onMounted(async () => {
|
||||||
clickable
|
clickable
|
||||||
@click="
|
@click="
|
||||||
() => {
|
() => {
|
||||||
mode.isActive ? '' : $q.dark.toggle();
|
changeMode(mode.value);
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -151,9 +151,6 @@ onMounted(async () => {
|
||||||
setLocale('th');
|
setLocale('th');
|
||||||
}
|
}
|
||||||
|
|
||||||
const getCurTheme = localStorage.getItem('currentTheme');
|
|
||||||
if (getCurTheme === 'dark') $q.dark.toggle();
|
|
||||||
|
|
||||||
const resultOption = await fetch('/option/option.json');
|
const resultOption = await fetch('/option/option.json');
|
||||||
rawOption.value = await resultOption.json();
|
rawOption.value = await resultOption.json();
|
||||||
if (locale.value === 'en-US') optionStore.globalOption = rawOption.value.eng;
|
if (locale.value === 'en-US') optionStore.globalOption = rawOption.value.eng;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue