Skip to content

Commit a3994bb

Browse files
committed
add settings for standings
1 parent a59044a commit a3994bb

File tree

4 files changed

+165
-11
lines changed

4 files changed

+165
-11
lines changed

src/frontend/components/Settings/sections/StandingsSettings.tsx

Lines changed: 137 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,55 @@ const defaultConfig: StandingsWidgetSettings['config'] = {
1313
lastTime: { enabled: true },
1414
fastestTime: { enabled: true },
1515
background: { opacity: 0 },
16+
driverStandings: {
17+
buffer: 3,
18+
numNonClassDrivers: 3,
19+
minPlayerClassDrivers: 10,
20+
numTopDrivers: 3,
21+
},
1622
};
1723

1824
// Migration function to handle missing properties in the new config format
19-
const migrateConfig = (savedConfig: unknown): StandingsWidgetSettings['config'] => {
25+
const migrateConfig = (
26+
savedConfig: unknown
27+
): StandingsWidgetSettings['config'] => {
2028
if (!savedConfig || typeof savedConfig !== 'object') return defaultConfig;
2129

2230
const config = savedConfig as Record<string, unknown>;
2331

2432
// Handle new format with missing properties
2533
return {
26-
iRatingChange: { enabled: (config.iRatingChange as { enabled?: boolean })?.enabled ?? true },
34+
iRatingChange: {
35+
enabled:
36+
(config.iRatingChange as { enabled?: boolean })?.enabled ?? true,
37+
},
2738
badge: { enabled: (config.badge as { enabled?: boolean })?.enabled ?? true },
2839
delta: { enabled: (config.delta as { enabled?: boolean })?.enabled ?? true },
29-
lastTime: { enabled: (config.lastTime as { enabled?: boolean })?.enabled ?? true },
30-
fastestTime: { enabled: (config.fastestTime as { enabled?: boolean })?.enabled ?? true },
31-
background: { opacity: (config.background as { opacity?: number })?.opacity ?? 0 },
40+
lastTime: {
41+
enabled: (config.lastTime as { enabled?: boolean })?.enabled ?? true,
42+
},
43+
fastestTime: {
44+
enabled: (config.fastestTime as { enabled?: boolean })?.enabled ?? true,
45+
},
46+
background: {
47+
opacity: (config.background as { opacity?: number })?.opacity ?? 0,
48+
},
49+
driverStandings: {
50+
buffer:
51+
(config.driverStandings as { buffer?: number })?.buffer ??
52+
defaultConfig.driverStandings.buffer,
53+
numNonClassDrivers:
54+
(config.driverStandings as { numNonClassDrivers?: number })
55+
?.numNonClassDrivers ??
56+
defaultConfig.driverStandings.numNonClassDrivers,
57+
minPlayerClassDrivers:
58+
(config.driverStandings as { minPlayerClassDrivers?: number })
59+
?.minPlayerClassDrivers ??
60+
defaultConfig.driverStandings.minPlayerClassDrivers,
61+
numTopDrivers:
62+
(config.driverStandings as { numTopDrivers?: number })?.numTopDrivers ??
63+
defaultConfig.driverStandings.numTopDrivers,
64+
},
3265
};
3366
};
3467

@@ -105,16 +138,113 @@ export const StandingsSettings = () => {
105138
}
106139
/>
107140
</div>
141+
</div>
142+
</div>
143+
{/* Driver Standings Settings */}
144+
<div className="space-y-4">
145+
<div className="flex items-center justify-between">
146+
<h3 className="text-lg font-medium text-slate-200">
147+
Driver Standings
148+
</h3>
149+
</div>
150+
<div className="space-y-3 pl-4">
151+
<div className="flex items-center justify-between">
152+
<span className="text-sm text-slate-300">
153+
Drivers to show around player
154+
</span>
155+
<input
156+
type="number"
157+
value={settings.config.driverStandings.buffer}
158+
onChange={(e) =>
159+
handleConfigChange({
160+
driverStandings: {
161+
...settings.config.driverStandings,
162+
buffer: parseInt(e.target.value),
163+
},
164+
})
165+
}
166+
className="w-20 bg-slate-700 text-white rounded-md px-2 py-1"
167+
/>
168+
</div>
169+
<div className="flex items-center justify-between">
170+
<span className="text-sm text-slate-300">
171+
Drivers to show in other classes
172+
</span>
173+
<input
174+
type="number"
175+
value={settings.config.driverStandings.numNonClassDrivers}
176+
onChange={(e) =>
177+
handleConfigChange({
178+
driverStandings: {
179+
...settings.config.driverStandings,
180+
numNonClassDrivers: parseInt(e.target.value),
181+
},
182+
})
183+
}
184+
className="w-20 bg-slate-700 text-white rounded-md px-2 py-1"
185+
/>
186+
</div>
187+
<div className="flex items-center justify-between">
188+
<span className="text-sm text-slate-300">
189+
Minimum drivers in player&apos;s class
190+
</span>
191+
<input
192+
type="number"
193+
value={settings.config.driverStandings.minPlayerClassDrivers}
194+
onChange={(e) =>
195+
handleConfigChange({
196+
driverStandings: {
197+
...settings.config.driverStandings,
198+
minPlayerClassDrivers: parseInt(e.target.value),
199+
},
200+
})
201+
}
202+
className="w-20 bg-slate-700 text-white rounded-md px-2 py-1"
203+
/>
204+
</div>
205+
<div className="flex items-center justify-between">
206+
<span className="text-sm text-slate-300">
207+
Top drivers to always show in player&apos;s class
208+
</span>
209+
<input
210+
type="number"
211+
value={settings.config.driverStandings.numTopDrivers}
212+
onChange={(e) =>
213+
handleConfigChange({
214+
driverStandings: {
215+
...settings.config.driverStandings,
216+
numTopDrivers: parseInt(e.target.value),
217+
},
218+
})
219+
}
220+
className="w-20 bg-slate-700 text-white rounded-md px-2 py-1"
221+
/>
222+
</div>
223+
</div>
224+
</div>
225+
226+
{/* Background Settings */}
227+
<div className="space-y-4">
228+
<div className="flex items-center justify-between">
229+
<h3 className="text-lg font-medium text-slate-200">
230+
Background
231+
</h3>
232+
</div>
233+
<div className="space-y-3 pl-4">
108234
<div className="flex items-center justify-between">
109-
<span className="text-sm text-slate-300">Background Opacity</span>
235+
<span className="text-sm text-slate-300">
236+
Background Opacity
237+
</span>
110238
<div className="flex items-center gap-2">
111239
<input
112240
type="range"
113241
min="0"
114242
max="100"
115243
value={settings.config.background.opacity}
116244
onChange={(e) =>
117-
handleConfigChange({ background: { opacity: parseInt(e.target.value) } })
245+
handleConfigChange({
246+
background: { opacity: parseInt(e.target.value) },
247+
})
118248
}
119249
className="w-20 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer"
120250
/>

src/frontend/components/Settings/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ export interface StandingsWidgetSettings extends BaseWidgetSettings {
1414
lastTime: { enabled: boolean };
1515
fastestTime: { enabled: boolean };
1616
background: { opacity: number };
17+
driverStandings: {
18+
buffer: number;
19+
numNonClassDrivers: number;
20+
minPlayerClassDrivers: number;
21+
numTopDrivers: number;
22+
};
1723
};
1824
}
1925

src/frontend/components/Standings/Standings.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import {
1414

1515
export const Standings = () => {
1616
const [parent] = useAutoAnimate();
17-
const standings = useDriverStandings({ buffer: 3 });
18-
const classStats = useCarClassStats();
1917
const settings = useStandingsSettings();
18+
const standings = useDriverStandings(settings?.driverStandings);
19+
const classStats = useCarClassStats();
2020
return (
2121
<div
2222
className={`w-full bg-slate-800/[var(--bg-opacity)] rounded-sm p-2 text-white overflow-hidden`}

src/frontend/components/Standings/hooks/useDriverStandings.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@ import {
1717
augmentStandingsWithIRating,
1818
} from '../createStandings';
1919

20-
export const useDriverStandings = ({ buffer }: { buffer: number }) => {
20+
export const useDriverStandings = ({
21+
buffer,
22+
numNonClassDrivers,
23+
minPlayerClassDrivers,
24+
numTopDrivers,
25+
}: {
26+
buffer?: number;
27+
numNonClassDrivers?: number;
28+
minPlayerClassDrivers?: number;
29+
numTopDrivers?: number;
30+
} = {}) => {
2131
const sessionDrivers = useSessionDrivers();
2232
const driverCarIdx = useDriverCarIdx();
2333
const qualifyingResults = useSessionQualifyingResults();
@@ -61,7 +71,12 @@ export const useDriverStandings = ({ buffer }: { buffer: number }) => {
6171
? augmentStandingsWithIRating(groupedByClass)
6272
: groupedByClass;
6373

64-
return sliceRelevantDrivers(augmentedGroupedByClass, driverClass, { buffer });
74+
return sliceRelevantDrivers(augmentedGroupedByClass, driverClass, {
75+
buffer,
76+
numNonClassDrivers,
77+
minPlayerClassDrivers,
78+
numTopDrivers,
79+
});
6580
}, [
6681
driverCarIdx,
6782
sessionDrivers,
@@ -75,6 +90,9 @@ export const useDriverStandings = ({ buffer }: { buffer: number }) => {
7590
sessionType,
7691
isOfficial,
7792
buffer,
93+
numNonClassDrivers,
94+
minPlayerClassDrivers,
95+
numTopDrivers,
7896
]);
7997

8098
return standingsWithGain;

0 commit comments

Comments
 (0)