@@ -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,117 @@ 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+                   min = { 0 } 
158+                   value = { settings . config . driverStandings . buffer } 
159+                   onChange = { ( e )  => 
160+                     handleConfigChange ( { 
161+                       driverStandings : { 
162+                         ...settings . config . driverStandings , 
163+                         buffer : parseInt ( e . target . value ) , 
164+                       } , 
165+                     } ) 
166+                   } 
167+                   className = "w-20 bg-slate-700 text-white rounded-md px-2 py-1" 
168+                 /> 
169+               </ div > 
170+               < div  className = "flex items-center justify-between" > 
171+                 < span  className = "text-sm text-slate-300" > 
172+                   Drivers to show in other classes
173+                 </ span > 
174+                 < input 
175+                   type = "number" 
176+                   min = { 0 } 
177+                   value = { settings . config . driverStandings . numNonClassDrivers } 
178+                   onChange = { ( e )  => 
179+                     handleConfigChange ( { 
180+                       driverStandings : { 
181+                         ...settings . config . driverStandings , 
182+                         numNonClassDrivers : parseInt ( e . target . value ) , 
183+                       } , 
184+                     } ) 
185+                   } 
186+                   className = "w-20 bg-slate-700 text-white rounded-md px-2 py-1" 
187+                 /> 
188+               </ div > 
189+               < div  className = "flex items-center justify-between" > 
190+                 < span  className = "text-sm text-slate-300" > 
191+                   Minimum drivers in player's class
192+                 </ span > 
193+                 < input 
194+                   type = "number" 
195+                   min = { 0 } 
196+                   value = { settings . config . driverStandings . minPlayerClassDrivers } 
197+                   onChange = { ( e )  => 
198+                     handleConfigChange ( { 
199+                       driverStandings : { 
200+                         ...settings . config . driverStandings , 
201+                         minPlayerClassDrivers : parseInt ( e . target . value ) , 
202+                       } , 
203+                     } ) 
204+                   } 
205+                   className = "w-20 bg-slate-700 text-white rounded-md px-2 py-1" 
206+                 /> 
207+               </ div > 
208+               < div  className = "flex items-center justify-between" > 
209+                 < span  className = "text-sm text-slate-300" > 
210+                   Top drivers to always show in player's class
211+                 </ span > 
212+                 < input 
213+                   type = "number" 
214+                   min = { 0 } 
215+                   value = { settings . config . driverStandings . numTopDrivers } 
216+                   onChange = { ( e )  => 
217+                     handleConfigChange ( { 
218+                       driverStandings : { 
219+                         ...settings . config . driverStandings , 
220+                         numTopDrivers : parseInt ( e . target . value ) , 
221+                       } , 
222+                     } ) 
223+                   } 
224+                   className = "w-20 bg-slate-700 text-white rounded-md px-2 py-1" 
225+                 /> 
226+               </ div > 
227+             </ div > 
228+           </ div > 
229+ 
230+           { /* Background Settings */ } 
231+           < div  className = "space-y-4" > 
232+             < div  className = "flex items-center justify-between" > 
233+               < h3  className = "text-lg font-medium text-slate-200" > 
234+                 Background
235+               </ h3 > 
236+             </ div > 
237+             < div  className = "space-y-3 pl-4" > 
108238              < div  className = "flex items-center justify-between" > 
109-                 < span  className = "text-sm text-slate-300" > Background Opacity</ span > 
239+                 < span  className = "text-sm text-slate-300" > 
240+                   Background Opacity
241+                 </ span > 
110242                < div  className = "flex items-center gap-2" > 
111243                  < input 
112244                    type = "range" 
113245                    min = "0" 
114246                    max = "100" 
115247                    value = { settings . config . background . opacity } 
116248                    onChange = { ( e )  => 
117-                       handleConfigChange ( {  background : {  opacity : parseInt ( e . target . value )  }  } ) 
249+                       handleConfigChange ( { 
250+                         background : {  opacity : parseInt ( e . target . value )  } , 
251+                       } ) 
118252                    } 
119253                    className = "w-20 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer" 
120254                  /> 
0 commit comments