@@ -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'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'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                  /> 
0 commit comments