From 00510820a2794efcadbc83f7f8b54318fe198ecb Mon Sep 17 00:00:00 2001 From: Zéro~Informatique Date: Tue, 26 Jul 2022 08:44:34 +0200 Subject: viewer: migrate to vue 3, general refactoring and cleanup Non-exhaustive list of fixes and improvements done at the same time: - html default background to grey (avoids white flash during init) - unified links behavior - added more theme variables - removed the flex-expand transition (it wasn't working) and replaced it with a slide - fixed LdLoading not centered on the content - title on removable tags - fixed an issue with encoded URI from vue-router - unified Item resource URLs - removed the iframe for PlainTextViewer (it wasn't working properly) and replaced it with a pre - fixed clear and search buttons tabindex - fixed the information panel bumping up during the fade animation of tag's dropdown - fixed some focus outlines not appearing correctly - moved CSS variables to the :root context - Code cleaning GitHub: closes #217 GitHub: closes #300 GitHub: closes #297 GitHub: closes #105 GitHub: closes #267 GitHub: closes #275 GitHub: closes #228 GitHub: closes #215 GitHub: closes #112 --- viewer/src/store/uiStore.ts | 116 ++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 70 deletions(-) (limited to 'viewer/src/store/uiStore.ts') diff --git a/viewer/src/store/uiStore.ts b/viewer/src/store/uiStore.ts index 520fcf4..df8dacc 100644 --- a/viewer/src/store/uiStore.ts +++ b/viewer/src/store/uiStore.ts @@ -1,7 +1,7 @@ /* ldgallery - A static generator which turns a collection of tagged -- pictures into a searchable web gallery. -- --- Copyright (C) 2019-2020 Guillaume FOUET +-- Copyright (C) 2019-2022 Guillaume FOUET -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU Affero General Public License as @@ -17,73 +17,49 @@ -- along with this program. If not, see . */ -import { Config } from "@/@types/gallery"; -import { SplashScreenConfig } from "@/@types/splashscreen"; -import ItemComparators, { ItemSort } from "@/services/itemComparators"; -import { action, createModule, mutation } from "vuex-class-component"; - -const VuexModule = createModule({ - namespaced: "uiStore", - strict: true, +import { Config } from '@/@types/gallery'; +import { SplashScreenConfig } from '@/@types/splashscreen'; +import { ItemSort, useItemComparator } from '@/services/itemComparator'; +import { useLocalStorage } from '@vueuse/core'; +import { defineStore } from 'pinia'; + +const itemComparator = useItemComparator(); +const splashScreenAcknowledgment = useLocalStorage('splashScreenAcknowledgment', ''); + +export const useUiStore = defineStore('ui', { + state: () => ({ + fullscreen: false, + fullWidth: window.innerWidth < Number(process.env.VUE_APP_FULLWIDTH_LIMIT), + searchMode: false, + sort: itemComparator.DEFAULT as ItemSort, + + splashScreenConfig: null as SplashScreenConfig | null, + splashScreenEnabled: false, + }), + getters: { + }, + actions: { + toggleFullscreen(value?: boolean) { + this.fullscreen = value ?? !this.fullscreen; + }, + toggleFullWidth(value?: boolean) { + this.fullWidth = value ?? !this.fullWidth; + }, + validateSpashScreen() { + this.splashScreenEnabled = false; + splashScreenAcknowledgment.value = this.splashScreenConfig?.acknowledgmentKey ?? ''; + }, + async initFromConfig(config: Config) { + if (config.initialItemSort) { + const itemSort = itemComparator.ITEM_SORTS.find(sort => sort.name === config.initialItemSort); + if (itemSort) this.sort = itemSort; + else throw new Error('Unknown sort type: ' + config.initialItemSort); + } + if (config.splashScreen) { + this.splashScreenConfig = config.splashScreen; + const uid = config.splashScreen.acknowledgmentKey; + this.splashScreenEnabled = !uid || splashScreenAcknowledgment.value !== uid; + } + }, + }, }); - -const STORAGE_SPLASHSCREEN_ACKNOWLEDGMENT = "splashScreenAcknowledgment"; - -export default class UIStore extends VuexModule { - fullscreen: boolean = false; - fullWidth: boolean = window.innerWidth < Number(process.env.VUE_APP_FULLWIDTH_LIMIT); - searchMode: boolean = false; - sort: ItemSort = ItemComparators.DEFAULT; - - splashScreenConfig: SplashScreenConfig | null = null; - splashScreenEnabled: boolean = false; - - // --- - - @mutation toggleFullscreen(value?: boolean) { - this.fullscreen = value ?? !this.fullscreen; - } - - @mutation toggleFullWidth(value?: boolean) { - this.fullWidth = value ?? !this.fullWidth; - } - - @mutation toggleSearchMode(value?: boolean) { - this.searchMode = value ?? !this.searchMode; - } - - @mutation setSort(sort: ItemSort) { - this.sort = sort; - } - - @mutation setSplashScreenConfig(splashScreenConfig: SplashScreenConfig) { - this.splashScreenConfig = splashScreenConfig; - } - - @mutation setSplashScreenEnabled(enabled: boolean) { - this.splashScreenEnabled = enabled; - } - - // --- - - @action async initFromConfig(config: Config) { - if (config.initialItemSort) { - const itemSort = ItemComparators.ITEM_SORTS[config.initialItemSort]; - if (itemSort) this.setSort(itemSort); - else throw new Error("Unknown sort type: " + config.initialItemSort); - } - if (config.splashScreen) { - this.setSplashScreenConfig(config.splashScreen); - const uid = config.splashScreen.acknowledgmentKey; - this.setSplashScreenEnabled(!uid || localStorage.getItem(STORAGE_SPLASHSCREEN_ACKNOWLEDGMENT) !== uid); - } - } - - // --- - - @action async validateSpashScreen() { - this.setSplashScreenEnabled(false); - const uid = this.splashScreenConfig?.acknowledgmentKey; - if (uid) localStorage.setItem(STORAGE_SPLASHSCREEN_ACKNOWLEDGMENT, String(uid)); - } -} -- cgit v1.2.3