| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | import { browser } from '$app/environment';
|
| | import { SETTING_CONFIG_DEFAULT } from '$lib/constants/settings-config';
|
| | import { ParameterSyncService } from '$lib/services/parameter-sync.service';
|
| | import { serverStore } from '$lib/stores/server.svelte';
|
| | import {
|
| | configToParameterRecord,
|
| | normalizeFloatingPoint,
|
| | getConfigValue,
|
| | setConfigValue
|
| | } from '$lib/utils';
|
| | import {
|
| | CONFIG_LOCALSTORAGE_KEY,
|
| | USER_OVERRIDES_LOCALSTORAGE_KEY
|
| | } from '$lib/constants/localstorage-keys';
|
| |
|
| | class SettingsStore {
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | config = $state<SettingsConfigType>({ ...SETTING_CONFIG_DEFAULT });
|
| | theme = $state<string>('auto');
|
| | isInitialized = $state(false);
|
| | userOverrides = $state<Set<string>>(new Set());
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | private getServerDefaults(): Record<string, string | number | boolean> {
|
| | const serverParams = serverStore.defaultParams;
|
| | const webuiSettings = serverStore.webuiSettings;
|
| | return ParameterSyncService.extractServerDefaults(serverParams, webuiSettings);
|
| | }
|
| |
|
| | constructor() {
|
| | if (browser) {
|
| | this.initialize();
|
| | }
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| |
|
| | initialize() {
|
| | try {
|
| | this.loadConfig();
|
| | this.loadTheme();
|
| | this.isInitialized = true;
|
| | } catch (error) {
|
| | console.error('Failed to initialize settings store:', error);
|
| | }
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | private loadConfig() {
|
| | if (!browser) return;
|
| |
|
| | try {
|
| | const storedConfigRaw = localStorage.getItem(CONFIG_LOCALSTORAGE_KEY);
|
| | const savedVal = JSON.parse(storedConfigRaw || '{}');
|
| |
|
| |
|
| | this.config = {
|
| | ...SETTING_CONFIG_DEFAULT,
|
| | ...savedVal
|
| | };
|
| |
|
| |
|
| | const savedOverrides = JSON.parse(
|
| | localStorage.getItem(USER_OVERRIDES_LOCALSTORAGE_KEY) || '[]'
|
| | );
|
| | this.userOverrides = new Set(savedOverrides);
|
| | } catch (error) {
|
| | console.warn('Failed to parse config from localStorage, using defaults:', error);
|
| | this.config = { ...SETTING_CONFIG_DEFAULT };
|
| | this.userOverrides = new Set();
|
| | }
|
| | }
|
| |
|
| | |
| | |
| |
|
| | private loadTheme() {
|
| | if (!browser) return;
|
| |
|
| | this.theme = localStorage.getItem('theme') || 'auto';
|
| | }
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| | |
| | |
| |
|
| | updateConfig<K extends keyof SettingsConfigType>(key: K, value: SettingsConfigType[K]): void {
|
| | this.config[key] = value;
|
| |
|
| | if (ParameterSyncService.canSyncParameter(key as string)) {
|
| | const propsDefaults = this.getServerDefaults();
|
| | const propsDefault = propsDefaults[key as string];
|
| |
|
| | if (propsDefault !== undefined) {
|
| | const normalizedValue = normalizeFloatingPoint(value);
|
| | const normalizedDefault = normalizeFloatingPoint(propsDefault);
|
| |
|
| | if (normalizedValue === normalizedDefault) {
|
| | this.userOverrides.delete(key as string);
|
| | } else {
|
| | this.userOverrides.add(key as string);
|
| | }
|
| | }
|
| | }
|
| |
|
| | this.saveConfig();
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | updateMultipleConfig(updates: Partial<SettingsConfigType>) {
|
| | Object.assign(this.config, updates);
|
| |
|
| | const propsDefaults = this.getServerDefaults();
|
| |
|
| | for (const [key, value] of Object.entries(updates)) {
|
| | if (ParameterSyncService.canSyncParameter(key)) {
|
| | const propsDefault = propsDefaults[key];
|
| |
|
| | if (propsDefault !== undefined) {
|
| | const normalizedValue = normalizeFloatingPoint(value);
|
| | const normalizedDefault = normalizeFloatingPoint(propsDefault);
|
| |
|
| | if (normalizedValue === normalizedDefault) {
|
| | this.userOverrides.delete(key);
|
| | } else {
|
| | this.userOverrides.add(key);
|
| | }
|
| | }
|
| | }
|
| | }
|
| |
|
| | this.saveConfig();
|
| | }
|
| |
|
| | |
| | |
| |
|
| | private saveConfig() {
|
| | if (!browser) return;
|
| |
|
| | try {
|
| | localStorage.setItem(CONFIG_LOCALSTORAGE_KEY, JSON.stringify(this.config));
|
| |
|
| | localStorage.setItem(
|
| | USER_OVERRIDES_LOCALSTORAGE_KEY,
|
| | JSON.stringify(Array.from(this.userOverrides))
|
| | );
|
| | } catch (error) {
|
| | console.error('Failed to save config to localStorage:', error);
|
| | }
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | updateTheme(newTheme: string) {
|
| | this.theme = newTheme;
|
| | this.saveTheme();
|
| | }
|
| |
|
| | |
| | |
| |
|
| | private saveTheme() {
|
| | if (!browser) return;
|
| |
|
| | try {
|
| | if (this.theme === 'auto') {
|
| | localStorage.removeItem('theme');
|
| | } else {
|
| | localStorage.setItem('theme', this.theme);
|
| | }
|
| | } catch (error) {
|
| | console.error('Failed to save theme to localStorage:', error);
|
| | }
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| |
|
| | resetConfig() {
|
| | this.config = { ...SETTING_CONFIG_DEFAULT };
|
| | this.saveConfig();
|
| | }
|
| |
|
| | |
| | |
| |
|
| | resetTheme() {
|
| | this.theme = 'auto';
|
| | this.saveTheme();
|
| | }
|
| |
|
| | |
| | |
| |
|
| | resetAll() {
|
| | this.resetConfig();
|
| | this.resetTheme();
|
| | }
|
| |
|
| | |
| | |
| |
|
| | resetParameterToServerDefault(key: string): void {
|
| | const serverDefaults = this.getServerDefaults();
|
| |
|
| | if (serverDefaults[key] !== undefined) {
|
| | const value = normalizeFloatingPoint(serverDefaults[key]);
|
| |
|
| | this.config[key as keyof SettingsConfigType] =
|
| | value as SettingsConfigType[keyof SettingsConfigType];
|
| | } else {
|
| | if (key in SETTING_CONFIG_DEFAULT) {
|
| | const defaultValue = getConfigValue(SETTING_CONFIG_DEFAULT, key);
|
| |
|
| | setConfigValue(this.config, key, defaultValue);
|
| | }
|
| | }
|
| |
|
| | this.userOverrides.delete(key);
|
| | this.saveConfig();
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | syncWithServerDefaults(): void {
|
| | const propsDefaults = this.getServerDefaults();
|
| |
|
| | if (Object.keys(propsDefaults).length === 0) {
|
| | console.warn('No server defaults available for initialization');
|
| |
|
| | return;
|
| | }
|
| |
|
| | for (const [key, propsValue] of Object.entries(propsDefaults)) {
|
| | const currentValue = getConfigValue(this.config, key);
|
| |
|
| | const normalizedCurrent = normalizeFloatingPoint(currentValue);
|
| | const normalizedDefault = normalizeFloatingPoint(propsValue);
|
| |
|
| | if (normalizedCurrent === normalizedDefault) {
|
| | this.userOverrides.delete(key);
|
| | setConfigValue(this.config, key, propsValue);
|
| | } else if (!this.userOverrides.has(key)) {
|
| | setConfigValue(this.config, key, propsValue);
|
| | }
|
| | }
|
| |
|
| | this.saveConfig();
|
| | console.log('Settings initialized with props defaults:', propsDefaults);
|
| | console.log('Current user overrides after sync:', Array.from(this.userOverrides));
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| |
|
| | forceSyncWithServerDefaults(): void {
|
| | const propsDefaults = this.getServerDefaults();
|
| | const syncableKeys = ParameterSyncService.getSyncableParameterKeys();
|
| |
|
| | for (const key of syncableKeys) {
|
| | if (propsDefaults[key] !== undefined) {
|
| | const normalizedValue = normalizeFloatingPoint(propsDefaults[key]);
|
| |
|
| | setConfigValue(this.config, key, normalizedValue);
|
| | } else {
|
| | if (key in SETTING_CONFIG_DEFAULT) {
|
| | const defaultValue = getConfigValue(SETTING_CONFIG_DEFAULT, key);
|
| |
|
| | setConfigValue(this.config, key, defaultValue);
|
| | }
|
| | }
|
| |
|
| | this.userOverrides.delete(key);
|
| | }
|
| |
|
| | this.saveConfig();
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| | |
| | |
| |
|
| | getConfig<K extends keyof SettingsConfigType>(key: K): SettingsConfigType[K] {
|
| | return this.config[key];
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | getAllConfig(): SettingsConfigType {
|
| | return { ...this.config };
|
| | }
|
| |
|
| | canSyncParameter(key: string): boolean {
|
| | return ParameterSyncService.canSyncParameter(key);
|
| | }
|
| |
|
| | |
| | |
| |
|
| | getParameterInfo(key: string) {
|
| | const propsDefaults = this.getServerDefaults();
|
| | const currentValue = getConfigValue(this.config, key);
|
| |
|
| | return ParameterSyncService.getParameterInfo(
|
| | key,
|
| | currentValue ?? '',
|
| | propsDefaults,
|
| | this.userOverrides
|
| | );
|
| | }
|
| |
|
| | |
| | |
| |
|
| | getParameterDiff() {
|
| | const serverDefaults = this.getServerDefaults();
|
| | if (Object.keys(serverDefaults).length === 0) return {};
|
| |
|
| | const configAsRecord = configToParameterRecord(
|
| | this.config,
|
| | ParameterSyncService.getSyncableParameterKeys()
|
| | );
|
| |
|
| | return ParameterSyncService.createParameterDiff(configAsRecord, serverDefaults);
|
| | }
|
| |
|
| | |
| | |
| |
|
| | clearAllUserOverrides(): void {
|
| | this.userOverrides.clear();
|
| | this.saveConfig();
|
| | console.log('Cleared all user overrides');
|
| | }
|
| | }
|
| |
|
| | export const settingsStore = new SettingsStore();
|
| |
|
| | export const config = () => settingsStore.config;
|
| | export const theme = () => settingsStore.theme;
|
| | export const isInitialized = () => settingsStore.isInitialized;
|
| |
|