better-xcloud/src/utils/pref-utils.ts

85 lines
3.5 KiB
TypeScript

import { ALL_PREFS, GlobalPref, StorageKey, StreamPref, type AnyPref } from "@/enums/pref-keys";
import type { PrefInfo, SettingActionOrigin } from "@/types/setting-definition";
import { GlobalSettingsStorage } from "./settings-storages/global-settings-storage";
import { StreamSettingsStorage } from "./settings-storages/stream-settings-storage";
// Migrate Stream settings in Global storage to Stream storage
function migrateStreamSettings() {
const storage = window.localStorage;
const globalSettings = JSON.parse(storage.getItem(StorageKey.GLOBAL) || '{}');
const streamSettings = JSON.parse(storage.getItem(StorageKey.STREAM) || '{}');
let modified = false;
for (const key in globalSettings) {
if (isStreamPref(key as AnyPref)) {
// Migration
if (!streamSettings.hasOwnProperty(key)) {
streamSettings[key] = globalSettings[key];
}
delete globalSettings[key];
modified = true;
}
}
if (modified) {
storage.setItem(StorageKey.GLOBAL, JSON.stringify(globalSettings));
storage.setItem(StorageKey.STREAM, JSON.stringify(streamSettings));
}
}
migrateStreamSettings();
export const STORAGE = {
Global: new GlobalSettingsStorage(),
Stream: new StreamSettingsStorage(),
};
const streamSettingsStorage = STORAGE.Stream;
export const getStreamPrefDefinition = streamSettingsStorage.getDefinition.bind(streamSettingsStorage);
export const getStreamPref = streamSettingsStorage.getSetting.bind(streamSettingsStorage);
export const setStreamPref = streamSettingsStorage.setSetting.bind(streamSettingsStorage);
export const getGamePref = streamSettingsStorage.getSettingByGame.bind(streamSettingsStorage);
export const setGamePref = streamSettingsStorage.setSettingByGame.bind(streamSettingsStorage);
export const setGameIdPref = streamSettingsStorage.setGameId.bind(streamSettingsStorage);
export const hasGamePref = streamSettingsStorage.hasGameSetting.bind(streamSettingsStorage);
STORAGE.Stream = streamSettingsStorage;
const globalSettingsStorage = STORAGE.Global;
export const getGlobalPrefDefinition = globalSettingsStorage.getDefinition.bind(globalSettingsStorage);
export const getGlobalPref = globalSettingsStorage.getSetting.bind(globalSettingsStorage);
export const setGlobalPref = globalSettingsStorage.setSetting.bind(globalSettingsStorage);
export function isGlobalPref(prefKey: AnyPref): prefKey is GlobalPref {
return ALL_PREFS.global.includes(prefKey as GlobalPref);
}
export function isStreamPref(prefKey: AnyPref): prefKey is StreamPref {
return ALL_PREFS.stream.includes(prefKey as StreamPref);
}
export function getPrefInfo(prefKey: AnyPref): PrefInfo {
if (isGlobalPref(prefKey)) {
return {
storage: STORAGE.Global,
definition: getGlobalPrefDefinition(prefKey as GlobalPref),
// value: getGlobalPref(prefKey as GlobalPref),
}
} else if (isStreamPref(prefKey)) {
return {
storage: STORAGE.Stream,
definition: getStreamPrefDefinition(prefKey as StreamPref),
// value: getStreamPref(prefKey as StreamPref),
}
}
alert('Missing pref definition: ' + prefKey);
return {} as PrefInfo;
}
export function setPref(prefKey: AnyPref, value: any, origin: SettingActionOrigin) {
if (isGlobalPref(prefKey)) {
setGlobalPref(prefKey as GlobalPref, value, origin);
} else if (isStreamPref(prefKey)) {
setStreamPref(prefKey as StreamPref, value, origin);
}
}