import { PanelSectionRow, ToggleField, SliderField, ButtonItem } from "@decky/ui"; import { useState, useEffect } from "react"; import { RiArrowDownSFill, RiArrowUpSFill } from "react-icons/ri"; import { ConfigurationData } from "../config/configSchema"; import { FpsMultiplierControl } from "./FpsMultiplierControl"; import { FLOW_SCALE, PERFORMANCE_MODE, HDR_MODE, EXPERIMENTAL_PRESENT_MODE, DXVK_FRAME_RATE, DISABLE_STEAMDECK_MODE, MANGOHUD_WORKAROUND, DISABLE_VKBASALT, FORCE_ENABLE_VKBASALT, ENABLE_WSI } from "../config/generatedConfigSchema"; interface ConfigurationSectionProps { config: ConfigurationData; onConfigChange: (fieldName: keyof ConfigurationData, value: boolean | number | string) => Promise; } const WORKAROUNDS_COLLAPSED_KEY = 'lsfg-workarounds-collapsed'; const CONFIG_COLLAPSED_KEY = 'lsfg-config-collapsed'; export function ConfigurationSection({ config, onConfigChange }: ConfigurationSectionProps) { // Initialize with localStorage value, fallback to true if not found const [workaroundsCollapsed, setWorkaroundsCollapsed] = useState(() => { try { const saved = localStorage.getItem(WORKAROUNDS_COLLAPSED_KEY); return saved !== null ? JSON.parse(saved) : true; } catch { return true; } }); // Initialize with localStorage value, fallback to false (expanded) if not found const [configCollapsed, setConfigCollapsed] = useState(() => { try { const saved = localStorage.getItem(CONFIG_COLLAPSED_KEY); return saved !== null ? JSON.parse(saved) : false; } catch { return false; } }); // Persist workarounds collapse state to localStorage useEffect(() => { try { localStorage.setItem(WORKAROUNDS_COLLAPSED_KEY, JSON.stringify(workaroundsCollapsed)); } catch (error) { console.warn('Failed to save workarounds collapse state:', error); } }, [workaroundsCollapsed]); // Persist config collapse state to localStorage useEffect(() => { try { localStorage.setItem(CONFIG_COLLAPSED_KEY, JSON.stringify(configCollapsed)); } catch (error) { console.warn('Failed to save config collapse state:', error); } }, [configCollapsed]); return ( <>
LSFG Configuration
setConfigCollapsed(!configCollapsed)} > {configCollapsed ? ( ) : ( )}
{!configCollapsed && ( <> {/* FPS Multiplier */} onConfigChange(FLOW_SCALE, value)} /> 0 ? ` (${config.dxvk_frame_rate} FPS)` : ' (Off)'}`} description="Base framerate cap for DirectX games, before frame multiplier. (Requires game restart to apply)" value={config.dxvk_frame_rate} min={0} max={60} step={1} onChange={(value) => onConfigChange(DXVK_FRAME_RATE, value)} /> onConfigChange(EXPERIMENTAL_PRESENT_MODE, value ? "fifo" : "mailbox")} /> onConfigChange(PERFORMANCE_MODE, value)} /> {/* onConfigChange(NO_FP16, value)} /> */} onConfigChange(HDR_MODE, value)} /> )} {/* Workarounds Section */}
Workarounds
setWorkaroundsCollapsed(!workaroundsCollapsed)} > {workaroundsCollapsed ? ( ) : ( )}
{!workaroundsCollapsed && ( <> { if (!value && config.hdr_mode) { // Turn off HDR when disabling WSI onConfigChange(HDR_MODE, false); } onConfigChange(ENABLE_WSI, value); }} /> onConfigChange('enable_wow64', value)} /> onConfigChange(DISABLE_STEAMDECK_MODE, value)} /> onConfigChange(MANGOHUD_WORKAROUND, value)} /> { if (value && config.force_enable_vkbasalt) { // Turn off force enable when enabling disable onConfigChange(FORCE_ENABLE_VKBASALT, false); } onConfigChange(DISABLE_VKBASALT, value); }} /> { if (value && config.disable_vkbasalt) { // Turn off disable when enabling force enable onConfigChange(DISABLE_VKBASALT, false); } onConfigChange(FORCE_ENABLE_VKBASALT, value); }} /> )} ); }