Feature/improve restoring grid snapshots (#713)
* Update local storage functions * Update local storage hooks * Add session storage * Improve storing virtuoso grid snapshot * Use "useSyncExternalStore" for browser storage access * Get rid of location replacements in "AppbarSearch" Use session storage instead to prevent reloading the page all the time due to changing the location * Get rid of location replacements in "SourceMangas" Use session storage instead to prevent reloading the page all the time due to changing the location
This commit is contained in:
51
src/util/AppStorage.ts
Normal file
51
src/util/AppStorage.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line max-classes-per-file
|
||||
export class Storage {
|
||||
constructor(private readonly storage: typeof window.localStorage) {}
|
||||
|
||||
parseValue<T>(value: string | null, defaultValue: T): T {
|
||||
if (value === null) {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
return JSON.parse(value);
|
||||
}
|
||||
|
||||
getItem(key: string): string | null {
|
||||
return this.storage.getItem(key);
|
||||
}
|
||||
|
||||
getItemParsed<T>(key: string, defaultValue: T): T {
|
||||
return this.parseValue(this.getItem(key), defaultValue);
|
||||
}
|
||||
|
||||
setItem(key: string, value: unknown): void {
|
||||
if (value === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
const valueToStore = JSON.stringify(value);
|
||||
|
||||
this.storage.setItem(key, valueToStore);
|
||||
window.dispatchEvent(
|
||||
new StorageEvent('storage', {
|
||||
key,
|
||||
oldValue: this.getItem(key),
|
||||
newValue: valueToStore,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class AppStorage {
|
||||
static readonly local: Storage = new Storage(window.localStorage);
|
||||
|
||||
static readonly session: Storage = new Storage(window.sessionStorage);
|
||||
}
|
||||
Reference in New Issue
Block a user