initial public release.

This commit is contained in:
Xiaohan-Tian
2025-08-11 18:37:21 -07:00
commit de51967b49
186 changed files with 32322 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
import { useState, useEffect, useCallback } from 'react';
import { ConfigManager } from '../core/config/ConfigManager';
/**
* Custom hook for managing configuration values with automatic loading and saving
* @param configKey - The dot-notation key for the configuration value
* @param defaultValue - Default value to use if config is not loaded
* @param debounceMs - Debounce time in milliseconds for saving (default: 500ms)
*/
export function useConfig<T>(
configKey: string,
defaultValue: T,
debounceMs: number = 500
) {
const [value, setValue] = useState<T>(defaultValue);
const [isLoading, setIsLoading] = useState(true);
const configManager = ConfigManager.instance();
// Load configuration value on mount
useEffect(() => {
const loadConfig = async () => {
try {
if (!configManager.getIsInitialized()) {
await configManager.initialize();
}
const loadedValue = configManager.get(configKey) as T;
setValue(loadedValue ?? defaultValue);
} catch (error) {
console.error(`Failed to load config for ${configKey}:`, error);
setValue(defaultValue);
} finally {
setIsLoading(false);
}
};
loadConfig();
}, [configKey, defaultValue, configManager]);
// Debounced save function
const debouncedSave = useCallback((newValue: T) => {
const timeoutId = setTimeout(async () => {
try {
await configManager.set(configKey, newValue);
console.log(`Config saved: ${configKey} = ${newValue}`);
} catch (error) {
console.error(`Failed to save config for ${configKey}:`, error);
}
}, debounceMs);
return () => clearTimeout(timeoutId);
}, [configKey, configManager, debounceMs]);
// Update function that immediately updates state and debounces save
const updateValue = useCallback((newValue: T) => {
setValue(newValue);
debouncedSave(newValue);
}, [debouncedSave]);
// Immediate save function (for dropdowns, checkboxes, etc.)
const saveImmediately = useCallback(async (newValue: T) => {
setValue(newValue);
try {
await configManager.set(configKey, newValue);
console.log(`Config saved immediately: ${configKey} = ${newValue}`);
} catch (error) {
console.error(`Failed to save config immediately for ${configKey}:`, error);
}
}, [configKey, configManager]);
return {
value,
setValue: updateValue,
saveImmediately,
isLoading
};
}