summaryrefslogtreecommitdiff
path: root/DRY_IMPLEMENTATION.md
diff options
context:
space:
mode:
Diffstat (limited to 'DRY_IMPLEMENTATION.md')
-rw-r--r--DRY_IMPLEMENTATION.md157
1 files changed, 157 insertions, 0 deletions
diff --git a/DRY_IMPLEMENTATION.md b/DRY_IMPLEMENTATION.md
new file mode 100644
index 0000000..b6f5487
--- /dev/null
+++ b/DRY_IMPLEMENTATION.md
@@ -0,0 +1,157 @@
+# DRY Configuration System Implementation
+
+## Overview
+This implementation addresses the "Duplicated Configuration Parameter Handling" opportunity by centralizing all configuration-related logic in a single schema that can be shared between Python backend and TypeScript frontend.
+
+## Key Changes Made
+
+### 1. **Created Centralized Configuration Schema**
+- **Python**: `py_modules/lsfg_vk/config_schema.py`
+- **TypeScript**: `src/config/configSchema.ts`
+
+Both files define the same configuration structure with:
+- Field definitions (name, type, default, description)
+- Script generation templates
+- Validation logic
+- Type-safe interfaces
+
+### 2. **Simplified Backend Configuration**
+- **Before**: 8 separate parameters passed to `update_lsfg_config()`
+- **After**: Variable arguments `*args` using centralized schema
+
+```python
+# Before
+async def update_lsfg_config(self, enable_lsfg: bool, multiplier: int, flow_scale: float,
+ hdr: bool, perf_mode: bool, immediate_mode: bool, disable_vkbasalt: bool, frame_cap: int)
+
+# After
+async def update_lsfg_config(self, *args)
+```
+
+### 3. **Streamlined Frontend Configuration**
+- **Before**: 8 separate handler functions in `Content.tsx`
+- **After**: Single generic handler using field names
+
+```tsx
+// Before
+const handleEnableLsfgChange = async (value: boolean) => {
+ setters.setEnableLsfg(value);
+ await updateConfig(value, config.multiplier, config.flowScale, ...);
+};
+// ... 7 more similar handlers
+
+// After
+const handleConfigChange = async (fieldName: keyof ConfigurationData, value: boolean | number) => {
+ await updateField(fieldName, value);
+};
+```
+
+### 4. **Updated Configuration Service**
+- Removed hardcoded defaults from `constants.py`
+- Removed duplicate script template logic
+- Uses centralized `ConfigurationManager` for all operations
+
+### 5. **Modernized Hook System**
+- **Before**: Separate state variables for each config field
+- **After**: Single `ConfigurationData` object with field-based updates
+
+## Benefits Achieved
+
+### 1. **Reduced Code Duplication**
+- Configuration parameters defined once in schema
+- Script generation logic centralized
+- No more repetitive handler functions
+
+### 2. **Easier to Add New Configuration Options**
+To add a new configuration option, you now only need to:
+1. Add the field definition to both config schemas
+2. The rest of the system automatically handles it
+
+### 3. **Type Safety**
+- TypeScript and Python types are consistent
+- Schema validation ensures data integrity
+- Centralized type definitions
+
+### 4. **Maintainability**
+- Single source of truth for configuration
+- Consistent field naming and types
+- Easier to refactor and extend
+
+## Example: Adding a New Configuration Option
+
+To add a new boolean option called "experimental_mode":
+
+1. **Add to Python schema** (`config_schema.py`):
+```python
+"experimental_mode": ConfigField(
+ name="experimental_mode",
+ field_type=ConfigFieldType.BOOLEAN,
+ default=False,
+ description="Enable experimental features",
+ script_template="export LSFG_EXPERIMENTAL={value}",
+ script_comment="# export LSFG_EXPERIMENTAL=1"
+)
+```
+
+2. **Add to TypeScript schema** (`configSchema.ts`):
+```typescript
+experimental_mode: {
+ name: "experimental_mode",
+ fieldType: ConfigFieldType.BOOLEAN,
+ default: false,
+ description: "Enable experimental features",
+ scriptTemplate: "export LSFG_EXPERIMENTAL={value}",
+ scriptComment: "# export LSFG_EXPERIMENTAL=1"
+}
+```
+
+3. **Update type definitions** in both files:
+```python
+# Python
+class ConfigurationData(TypedDict):
+ # ... existing fields ...
+ experimental_mode: bool
+```
+
+```typescript
+// TypeScript
+export interface ConfigurationData {
+ // ... existing fields ...
+ experimental_mode: boolean;
+}
+```
+
+4. **Add UI component** to `ConfigurationSection.tsx`:
+```tsx
+<PanelSectionRow>
+ <ToggleField
+ label="Experimental Mode"
+ description="Enable experimental features"
+ checked={config.experimental_mode}
+ onChange={(value) => onConfigChange('experimental_mode', value)}
+ />
+</PanelSectionRow>
+```
+
+That's it! The rest of the system automatically handles the new field.
+
+## Files Modified
+
+### Python Backend
+- `py_modules/lsfg_vk/config_schema.py` (new)
+- `py_modules/lsfg_vk/types.py` (updated)
+- `py_modules/lsfg_vk/constants.py` (simplified)
+- `py_modules/lsfg_vk/configuration.py` (refactored)
+- `py_modules/lsfg_vk/installation.py` (updated)
+- `py_modules/lsfg_vk/plugin.py` (updated)
+
+### TypeScript Frontend
+- `src/config/configSchema.ts` (new)
+- `src/api/lsfgApi.ts` (updated)
+- `src/hooks/useLsfgHooks.ts` (simplified)
+- `src/components/Content.tsx` (simplified)
+- `src/components/ConfigurationSection.tsx` (updated)
+- `src/components/UsageInstructions.tsx` (updated)
+
+## Testing
+The configuration system has been tested and generates correct script content with proper defaults and field ordering.