@@ -5,7 +5,9 @@ import client from './apolloClient';
55import { usePageTracking } from './hooks/usePageTracking' ;
66import { CompetitionLayout } from './layouts/CompetitionLayout' ;
77import { RootLayout } from './layouts/RootLayout' ;
8+ import { FEATURE_FLAGS } from './lib/featureFlags' ;
89import About from './pages/About' ;
10+ import CompetitionAdmin from './pages/Competition/Admin' ;
911import CompetitionEvents from './pages/Competition/ByGroup/Events' ;
1012import CompetitionGroup from './pages/Competition/ByGroup/Group' ;
1113import CompetitionGroupList from './pages/Competition/ByGroup/GroupList' ;
@@ -18,6 +20,8 @@ import CompetitionLive from './pages/Competition/Live';
1820import CompetitionPerson from './pages/Competition/Person' ;
1921import CompetitionPersonalBests from './pages/Competition/Person/PersonalBests' ;
2022import { PsychSheetEvent } from './pages/Competition/PsychSheet/PsychSheetEvent' ;
23+ import CompetitionRemote from './pages/Competition/Remote' ;
24+ import CompetitionResults from './pages/Competition/Results' ;
2125import {
2226 CompetitionActivity ,
2327 CompetitionRoom ,
@@ -27,13 +31,18 @@ import {
2731import CompetitionScramblerSchedule from './pages/Competition/ScramblerSchedule' ;
2832import CompetitionStats from './pages/Competition/Stats' ;
2933import CompetitionStreamSchedule from './pages/Competition/StreamSchedule' ;
34+ import CompetitionSumOfRanks from './pages/Competition/SumOfRanks' ;
3035import Home from './pages/Home' ;
36+ import LiveActivitiesAbout from './pages/LiveActivities/About' ;
3137import Settings from './pages/Settings' ;
3238import Support from './pages/Support' ;
3339import Test from './pages/Test' ;
40+ import UserPage from './pages/User' ;
3441import UserLogin from './pages/UserLogin' ;
3542import { AppProvider } from './providers/AppProvider' ;
3643import { AuthProvider , useAuth } from './providers/AuthProvider' ;
44+ import { ConfirmProvider } from './providers/ConfirmProvider' ;
45+ import { NotifyCompRemoteAuthProvider } from './providers/NotifyCompRemoteAuthProvider' ;
3746import { QueryProvider } from './providers/QueryProvider/QueryProvider' ;
3847import { UserSettingsProvider } from './providers/UserSettingsProvider' ;
3948import { useWCIF } from './providers/WCIFProvider' ;
@@ -79,6 +88,30 @@ const PsychSheet = () => {
7988 return null ;
8089} ;
8190
91+ const CompetitionPersonByWcaIdRedirect = ( { to } : { to : 'results' | 'records' } ) => {
92+ const { competitionId, wcaId } = useParams ( ) as { competitionId : string ; wcaId : string } ;
93+ const { wcif } = useWCIF ( ) ;
94+ const person = wcif ?. persons . find ( ( p ) => p . wcaId ?. toUpperCase ( ) === wcaId . toUpperCase ( ) ) ;
95+
96+ if ( ! wcif ) {
97+ return null ;
98+ }
99+
100+ if ( ! person ) {
101+ return < Navigate to = { `/competitions/${ competitionId } ` } replace /> ;
102+ }
103+
104+ return (
105+ < Navigate to = { `/competitions/${ competitionId } /persons/${ person . registrantId } /${ to } ` } replace />
106+ ) ;
107+ } ;
108+
109+ const CompetitionRedirect = ( { to } : { to : string } ) => {
110+ const { competitionId } = useParams ( ) as { competitionId : string } ;
111+
112+ return < Navigate to = { `/competitions/${ competitionId } /${ to } ` } replace /> ;
113+ } ;
114+
82115const Navigation = ( ) => {
83116 usePageTracking ( import . meta. env . VITE_GA_MEASUREMENT_ID ) ;
84117
@@ -90,7 +123,15 @@ const Navigation = () => {
90123 < Route path = "/competitions/:competitionId" element = { < CompetitionLayout /> } >
91124 < Route index element = { < CompetitionHome /> } />
92125
93- < Route path = "persons/:registrantId" element = { < CompetitionPerson /> } />
126+ < Route
127+ path = "persons/wca/:wcaId/results"
128+ element = { < CompetitionPersonByWcaIdRedirect to = "results" /> }
129+ />
130+ < Route
131+ path = "persons/wca/:wcaId/records"
132+ element = { < CompetitionPersonByWcaIdRedirect to = "records" /> }
133+ />
134+ < Route path = "persons/:registrantId/*" element = { < CompetitionPerson /> } />
94135 < Route path = "personal-bests/:wcaId" element = { < CompetitionPersonalBests /> } />
95136 < Route path = "personal-records/:wcaId" element = { < CompetitionPersonalBests /> } />
96137 < Route path = "compare-schedules" element = { < CompetitionCompareSchedules /> } />
@@ -106,8 +147,16 @@ const Navigation = () => {
106147
107148 < Route path = "psych-sheet" element = { < PsychSheet /> } />
108149 < Route path = "psych-sheet/:eventId" element = { < PsychSheetEvent /> } />
109-
110- < Route path = "scramblers" element = { < CompetitionScramblerSchedule /> } />
150+ < Route path = "results" element = { < CompetitionResults /> } />
151+ < Route path = "results/:roundId" element = { < CompetitionResults /> } />
152+
153+ < Route path = "admin" element = { < CompetitionAdmin /> } />
154+ < Route path = "admin/remote" element = { < CompetitionRemote /> } />
155+ < Route path = "admin/scramblers" element = { < CompetitionScramblerSchedule /> } />
156+ < Route path = "admin/stats" element = { < CompetitionStats /> } />
157+ < Route path = "admin/sum-of-ranks" element = { < CompetitionSumOfRanks /> } />
158+ < Route path = "remote" element = { < CompetitionRedirect to = "admin/remote" /> } />
159+ < Route path = "scramblers" element = { < CompetitionRedirect to = "admin/scramblers" /> } />
111160 < Route path = "stream" element = { < CompetitionStreamSchedule /> } />
112161 < Route path = "information" element = { < CompetitionInformation /> } />
113162 < Route path = "live" element = { < CompetitionLive /> } />
@@ -116,11 +165,23 @@ const Navigation = () => {
116165 < Route path = "personal-schedule" element = { < PersonalSchedule /> } />
117166 < Route path = "explore" element = { < CompetitionGroupsOverview /> } />
118167 < Route path = "groups-schedule" element = { < CompetitionGroupsSchedule /> } />
119- < Route path = "stats" element = { < CompetitionStats /> } />
168+ < Route path = "stats" element = { < CompetitionRedirect to = "admin/stats" /> } />
169+ < Route path = "sum-of-ranks" element = { < CompetitionRedirect to = "admin/sum-of-ranks" /> } />
120170 < Route path = "*" element = { < p > Path not resolved</ p > } />
121171 </ Route >
122172 < Route path = "/users/:userId" element = { < UserLogin /> } />
173+ { FEATURE_FLAGS . personalUserPage && (
174+ < >
175+ < Route path = "/me" element = { < Navigate to = "/me/competitions" replace /> } />
176+ < Route
177+ path = "/me/results/:resultsMode"
178+ element = { < Navigate to = "/me/results" replace /> }
179+ />
180+ < Route path = "/me/:tab" element = { < UserPage /> } />
181+ </ >
182+ ) }
123183 < Route path = "about" element = { < About /> } />
184+ < Route path = "live-activities" element = { < LiveActivitiesAbout /> } />
124185 < Route path = "settings" element = { < Settings /> } />
125186 < Route path = "support" element = { < Support /> } />
126187 </ Route >
@@ -136,9 +197,13 @@ const App = () => (
136197 < QueryProvider >
137198 < ApolloProvider client = { client } >
138199 < BrowserRouter >
139- < AuthProvider >
140- < Navigation />
141- </ AuthProvider >
200+ < ConfirmProvider >
201+ < AuthProvider >
202+ < NotifyCompRemoteAuthProvider >
203+ < Navigation />
204+ </ NotifyCompRemoteAuthProvider >
205+ </ AuthProvider >
206+ </ ConfirmProvider >
142207 </ BrowserRouter >
143208 </ ApolloProvider >
144209 </ QueryProvider >
0 commit comments