@@ -23,7 +23,6 @@ const TEAM_SIZE = process.env.NEXT_PUBLIC_TEAM_SIZE
2323 : 5 ;
2424
2525const WaitingView = ( { teamMembers, myId, teamId, setView } : { teamMembers : TeamMember [ ] , myId : number , teamId : number , setView : ( view : View ) => void } ) => {
26- const { setCurrentPage } = useNavigationStore ( ) ;
2726 const handleLeaveTeam = async ( ) => {
2827 try {
2928 await authenticatedFetch ( `/api/v1/teams/${ String ( teamId ) } /cancel` , {
@@ -150,7 +149,6 @@ export default function Page2() {
150149 const [ teamMembers , setTeamMembers ] = useState < TeamMember [ ] > ( [ ] ) ;
151150 const [ inputs , setInputs ] = useState < InputState [ ] > ( ( ) => Array ( TEAM_SIZE ) . fill ( { id : '' , displayName : '' } ) ) ;
152151
153- const hasCheckedTeamStatus = useRef ( false ) ;
154152 const timeoutRef = useRef < NodeJS . Timeout | null > ( null ) ;
155153
156154 const fetchUserDisplayName = useCallback ( async ( userId : number | string ) : Promise < string > => {
@@ -185,99 +183,91 @@ export default function Page2() {
185183 } , [ myId , inputs , fetchUserDisplayName ] ) ;
186184
187185 useEffect ( ( ) => {
188- const hydrateTeam = async ( ) => {
189- if ( myId && teamId && view === 'loading' ) {
190- console . log ( 'Hydrating team members from persisted teamId...' ) ;
191- try {
192- const response = await authenticatedFetch ( '/api/v1/teams/me' ) ;
193- if ( ! response . ok ) {
194- const errorData = await response . json ( ) ;
195- throw new Error ( `HTTP error! status: ${ response . status } , message: ${ errorData . detail || response . statusText } ` ) ;
186+ const initialize = async ( ) => {
187+ if ( ! myId ) {
188+ setCurrentPage ( 'page1' ) ;
189+ return ;
190+ }
191+ if ( view !== 'loading' ) return ;
192+
193+ try {
194+ const response = await authenticatedFetch ( '/api/v1/teams/me' ) ;
195+
196+ if ( response . status === 404 ) {
197+ setView ( 'create' ) ;
198+ return ;
199+ }
200+
201+ if ( ! response . ok ) {
202+ throw new Error ( `HTTP error! status: ${ response . status } , message: ${ ( await response . json ( ) ) . detail || response . statusText } ` ) ;
203+ }
204+
205+ const teamData = await response . json ( ) ;
206+
207+ if ( teamData && teamData . team_id ) {
208+ if ( teamData . status === 'ACTIVE' ) {
209+ setCurrentPage ( 'page3' ) ;
210+ return ;
196211 }
197- const teamData = await response . json ( ) ;
198- if ( teamData && teamData . members && teamData . members . length > 0 ) {
199- const newInputs : InputState [ ] = Array ( TEAM_SIZE ) . fill ( null ) . map ( ( _ , index ) => {
200- if ( index === 0 ) {
201- // My ID should be the first input
202- const me = teamData . members . find ( ( member : { id : number ; } ) => Number ( member . id ) === Number ( myId ) ) ;
203- return me ? { id : String ( me . id ) , displayName : me . name } : { id : String ( myId ) , displayName : '' } ;
212+
213+ if ( teamData . status === 'PENDING' ) {
214+ setTeamId ( teamData . team_id ) ;
215+ if ( teamData . members && teamData . members . length > 0 ) {
216+ const me = teamData . members . find ( ( m : { id : number } ) => Number ( m . id ) === Number ( myId ) ) ;
217+ const others = teamData . members . filter ( ( m : { id : number } ) => Number ( m . id ) !== Number ( myId ) ) ;
218+ const newInputs : InputState [ ] = Array ( TEAM_SIZE ) . fill ( { id : '' , displayName : '' } ) ;
219+
220+ if ( me ) {
221+ newInputs [ 0 ] = { id : String ( me . id ) , displayName : me . name } ;
204222 } else {
205- // Other members
206- const member = teamData . members [ index ] ;
207- return member ? { id : String ( member . id ) , displayName : member . name } : { id : '' , displayName : '' } ;
223+ newInputs [ 0 ] = { id : String ( myId ) , displayName : '' } ; // Fallback
208224 }
209- } ) ;
210-
211- const initialTeamMembers : TeamMember [ ] = teamData . members . map ( ( member : { id : number ; name : string ; } ) => ( {
212- user_id : Number ( member . id ) ,
213- displayName : member . name ,
214- is_ready : false , // will be updated by polling later
215- } ) ) ;
216-
217- setInputs ( newInputs ) ;
218- setTeamMembers ( initialTeamMembers ) ;
219- setView ( 'waiting' ) ;
220- } else {
221- console . warn ( 'No team members found in /teams/me response, falling back to create view.' ) ;
222- setView ( 'create' ) ;
223- }
224- } catch ( error ) {
225- console . error ( 'Error hydrating team data:' , error ) ;
226- if ( teamId && teamId > 0 ) {
227- try {
228- console . log ( `Attempting to leave team ${ teamId } due to hydration error...` ) ;
229- await authenticatedFetch ( `/api/v1/teams/${ teamId } /cancel` , {
230- method : 'POST' ,
225+
226+ others . forEach ( ( member : { id : number ; name : string } , i : number ) => {
227+ if ( i + 1 < TEAM_SIZE ) {
228+ newInputs [ i + 1 ] = { id : String ( member . id ) , displayName : member . name } ;
229+ }
231230 } ) ;
232- console . log ( `Successfully left team ${ teamId } .` ) ;
233- } catch ( cancelError ) {
234- console . error ( `Failed to leave team ${ teamId } after hydration error:` , cancelError ) ;
231+
232+ const initialTeamMembers : TeamMember [ ] = teamData . members . map ( ( member : { id : number ; name : string ; } ) => ( {
233+ user_id : Number ( member . id ) ,
234+ displayName : member . name ,
235+ is_ready : false ,
236+ } ) ) ;
237+
238+ setInputs ( newInputs ) ;
239+ setTeamMembers ( initialTeamMembers ) ;
240+ setView ( 'waiting' ) ;
241+ } else {
242+ setView ( 'create' ) ;
235243 }
244+ return ;
236245 }
237- reset ( ) ;
238- localStorage . removeItem ( 'lastPage' ) ;
239- setCurrentPage ( 'page1' ) ;
240246 }
241- } else if ( ! myId ) {
242- setCurrentPage ( 'page1' ) ; // Redirect to page1 if myId is missing
243- } else if ( view === 'loading' ) {
244- setView ( 'create' ) ; // Fallback if no teamId but not redirected
247+ setView ( 'create' ) ;
248+ } catch ( error ) {
249+ console . error ( 'Error during page initialization:' , error ) ;
250+ if ( teamId && teamId > 0 ) {
251+ try {
252+ await authenticatedFetch ( `/api/v1/teams/${ teamId } /cancel` , { method : 'POST' } ) ;
253+ } catch ( cancelError ) {
254+ console . error ( `Failed to leave team ${ teamId } after init error:` , cancelError ) ;
255+ }
256+ }
257+ reset ( ) ;
258+ setView ( 'create' ) ;
245259 }
246260 } ;
247261
248- hydrateTeam ( ) ;
249- } , [ myId , teamId , view , setCurrentPage , reset ] ) ;
262+ initialize ( ) ;
263+ } , [ myId , view , setCurrentPage , setTeamId , setInputs , setTeamMembers , reset ] ) ;
250264
251265 useEffect ( ( ) => {
252266 if ( myId && inputs [ 0 ] . id === '' ) {
253267 fetchUserById ( 0 , String ( myId ) ) ;
254268 }
255269 } , [ myId , fetchUserById , inputs ] ) ;
256270
257- useEffect ( ( ) => {
258- if ( ! myId || hasCheckedTeamStatus . current ) return ;
259-
260- const checkUserTeam = async ( ) => {
261- hasCheckedTeamStatus . current = true ;
262- try {
263- const response = await authenticatedFetch ( '/api/v1/users/me' ) ;
264- if ( response . ok ) {
265- const teamData = await response . json ( ) ;
266- if ( teamData && teamData . status === 'PENDING' ) {
267- setTeamId ( teamData . team_id ) ;
268- setView ( 'waiting' ) ;
269- return ;
270- }
271- }
272- setView ( 'create' ) ;
273- } catch ( error ) {
274- console . error ( 'Error checking user\'s team status:' , error ) ;
275- setView ( 'create' ) ;
276- }
277- } ;
278- checkUserTeam ( ) ;
279- } , [ myId , setTeamId ] ) ;
280-
281271 useEffect ( ( ) => {
282272 if ( view !== 'waiting' || ! teamId ) return ;
283273
0 commit comments