Skip to content

Commit 4b31058

Browse files
Merge pull request #509 from CodebilityDev/team-details/error-display
Fixed Team Details Display Error
2 parents 2b83967 + e3fb54b commit 4b31058

1 file changed

Lines changed: 79 additions & 17 deletions

File tree

  • apps/codebility/app/home/my-team/[projectId]

‎apps/codebility/app/home/my-team/[projectId]/page.tsx‎

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,50 +21,107 @@ const TeamDetailPage = async ({ params }: TeamDetailPageProps) => {
2121
try {
2222
// Get current user from auth
2323
const supabase = await createClientServerComponent();
24-
const { data: { user } } = await supabase.auth.getUser();
24+
const { data: { user }, error: authError } = await supabase.auth.getUser();
2525

26-
if (!user) {
26+
if (authError || !user) {
27+
console.error('Auth error:', authError);
2728
notFound();
2829
}
2930

30-
// Map auth user to codev user by email
31-
// Auth user.id ≠ codev.id, so we need to look up by email
31+
// Map auth user to codev user by email with case-insensitive matching
3232
const { data: codevUser, error: codevError } = await supabase
3333
.from('codev')
34-
.select('id')
35-
.eq('email_address', user.email)
36-
.single();
34+
.select('id, email_address')
35+
.ilike('email_address', user.email?.trim() || '')
36+
.maybeSingle(); // Use maybeSingle() instead of single() to handle no results gracefully
3737

38-
if (codevError || !codevUser) {
39-
console.error('Failed to find codev user:', codevError);
38+
if (codevError) {
39+
console.error('Codev lookup error:', {
40+
error: codevError,
41+
authEmail: user.email
42+
});
43+
notFound();
44+
}
45+
46+
if (!codevUser) {
47+
console.error('Codev user not found:', {
48+
authEmail: user.email,
49+
authUserId: user.id
50+
});
4051
notFound();
4152
}
4253

4354
// Fetch user projects to verify access
4455
const userProjectsResponse = await getUserProjects();
4556

46-
if (userProjectsResponse.error || !userProjectsResponse.data) {
57+
if (userProjectsResponse.error) {
58+
console.error('Failed to fetch user projects:', userProjectsResponse.error);
59+
throw new Error("Failed to load user projects");
60+
}
61+
62+
if (!userProjectsResponse.data) {
63+
console.error('No project data returned');
4764
notFound();
4865
}
4966

5067
const userProjects = userProjectsResponse.data;
51-
const project = userProjects.find(p => p.project.id === projectId);
68+
69+
// ✅ FIXED: Type-safe project ID comparison (handles string/number mismatch)
70+
const project = userProjects.find(p => {
71+
const projectIdFromList = String(p.project.id).trim();
72+
const requestedProjectId = String(projectId).trim();
73+
return projectIdFromList === requestedProjectId;
74+
});
5275

5376
if (!project) {
77+
console.error('Project not found or user has no access:', {
78+
requestedProjectId: projectId,
79+
userProjectIds: userProjects.map(p => p.project.id),
80+
codevUserId: codevUser.id
81+
});
5482
notFound();
5583
}
5684

57-
// Fetch team data for this specific project
58-
const [teamLead, members] = await Promise.all([
85+
// ✅ FIXED: Better error handling for team data with individual catch
86+
const [teamLeadResponse, membersResponse] = await Promise.allSettled([
5987
getTeamLead(projectId),
6088
getMembers(projectId)
6189
]);
6290

63-
if (teamLead.error || members.error) {
64-
throw new Error("Failed to load team data");
91+
// Handle team lead response with proper typing
92+
let teamLead: Awaited<ReturnType<typeof getTeamLead>>;
93+
if (teamLeadResponse.status === 'fulfilled' && !teamLeadResponse.value.error) {
94+
teamLead = teamLeadResponse.value;
95+
} else {
96+
console.error('Failed to load team lead:', {
97+
projectId,
98+
error: teamLeadResponse.status === 'fulfilled'
99+
? teamLeadResponse.value.error
100+
: teamLeadResponse.reason
101+
});
102+
teamLead = { data: null, error: 'Failed to load team lead' };
103+
}
104+
105+
// Handle members response with proper typing
106+
let members: Awaited<ReturnType<typeof getMembers>>;
107+
if (membersResponse.status === 'fulfilled' && !membersResponse.value.error) {
108+
members = membersResponse.value;
109+
} else {
110+
console.error('Failed to load members:', {
111+
projectId,
112+
error: membersResponse.status === 'fulfilled'
113+
? membersResponse.value.error
114+
: membersResponse.reason
115+
});
116+
members = { data: [], error: 'Failed to load members' };
117+
}
118+
119+
// ✅ FIXED: Only throw if BOTH fail, otherwise show partial data
120+
if (teamLead.error && members.error) {
121+
throw new Error("Failed to load any team data");
65122
}
66123

67-
// ✅ FIXED: Pass currentUserId to determine team lead status
124+
// Construct project data with proper types
68125
const projectData = {
69126
project: project.project,
70127
teamLead: teamLead,
@@ -100,7 +157,12 @@ const TeamDetailPage = async ({ params }: TeamDetailPageProps) => {
100157
);
101158

102159
} catch (error) {
103-
console.error('TeamDetailPage error:', error);
160+
console.error('TeamDetailPage error:', {
161+
error,
162+
message: error instanceof Error ? error.message : 'Unknown error',
163+
stack: error instanceof Error ? error.stack : undefined,
164+
projectId
165+
});
104166

105167
return (
106168
<div className="mx-auto max-w-screen-xl">

0 commit comments

Comments
 (0)