Skip to content

Commit d5b7b48

Browse files
authored
Merge pull request #275 from Pseudo-Lab/refactor/getcloser/frontend/teams/me
refactor(getcloser): check my team
2 parents f202b8b + 6badd18 commit d5b7b48

1 file changed

Lines changed: 68 additions & 78 deletions

File tree

getcloser/frontend/src/app/pages/Page2.tsx

Lines changed: 68 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ const TEAM_SIZE = process.env.NEXT_PUBLIC_TEAM_SIZE
2323
: 5;
2424

2525
const 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

Comments
 (0)