mizzkey/packages/frontend/src/local-storage.ts

105 lines
2.4 KiB
TypeScript
Raw Normal View History

/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
2024-06-29 11:14:35 +02:00
import { isEmbedPage } from '@/scripts/embed-page.js';
export type Keys =
2023-01-07 02:13:02 +01:00
'v' |
'lastVersion' |
'instance' |
'instanceCachedAt' |
2023-01-07 02:13:02 +01:00
'account' |
'accounts' |
2023-01-07 03:49:00 +01:00
'latestDonationInfoShownAt' |
'neverShowDonationInfo' |
'neverShowLocalOnlyInfo' |
'modifiedVersionMustProminentlyOfferInAgplV3Section13Read' |
2023-01-07 02:13:02 +01:00
'lastUsed' |
'lang' |
'drafts' |
'hashtags' |
'wallpaper' |
'theme' |
2023-06-05 03:55:18 +02:00
'colorScheme' |
'useSystemFont' |
2023-01-07 02:13:02 +01:00
'fontSize' |
'ui' |
'ui_temp' |
2023-01-07 02:13:02 +01:00
'locale' |
'localeVersion' |
2023-01-07 02:13:02 +01:00
'theme' |
'customCss' |
'message_drafts' |
'scratchpad' |
'debug' |
2023-01-07 02:13:02 +01:00
`miux:${string}` |
`ui:folder:${string}` |
`themes:${string}` |
`aiscript:${string}` |
'lastEmojisFetchedAt' | // DEPRECATED, stored in indexeddb (13.9.0~)
'emojis' | // DEPRECATED, stored in indexeddb (13.9.0~);
`channelLastReadedAt:${string}` |
`idbfallback::${string}`
// セッション毎に廃棄されるLocalStorage代替embedなどで使用
const safeSessionStorage = new Map<Keys, string>();
2023-01-07 02:13:02 +01:00
2024-06-29 11:14:35 +02:00
const embedPage = isEmbedPage();
2023-01-07 02:13:02 +01:00
export const miLocalStorage = {
getItem: (key: Keys): string | null => {
if (embedPage) {
return safeSessionStorage.get(key) ?? null;
}
return window.localStorage.getItem(key);
},
setItem: (key: Keys, value: string): void => {
if (embedPage) {
safeSessionStorage.set(key, value);
} else {
window.localStorage.setItem(key, value);
}
},
removeItem: (key: Keys): void => {
if (embedPage) {
safeSessionStorage.delete(key);
} else {
window.localStorage.removeItem(key);
}
},
getItemAsJson: (key: Keys): any | undefined => {
const item = miLocalStorage.getItem(key);
if (item === null) {
return undefined;
}
return JSON.parse(item);
},
setItemAsJson: (key: Keys, value: any): void => {
miLocalStorage.setItem(key, JSON.stringify(value));
},
2023-01-07 02:13:02 +01:00
};
if (embedPage) {
2024-06-29 11:14:35 +02:00
/**
* EmbedページではlocalStorageを使用できないようにしているが
* safeSessionStorageに移動する
*/
const keysToDuplicate: Keys[] = [
'v',
'instance',
'instanceCachedAt',
'lang',
'locale',
'localeVersion',
];
keysToDuplicate.forEach(key => {
const value = window.localStorage.getItem(key);
if (value && !miLocalStorage.getItem(key)) {
miLocalStorage.setItem(key, value);
}
});
if (_DEV_) console.warn('Using safeSessionStorage as localStorage alternative');
}