@@ -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