Skip to content

Commit 9f30e06

Browse files
committed
settings fixes
1 parent fe899bf commit 9f30e06

7 files changed

Lines changed: 150 additions & 63 deletions

File tree

api/auth/login.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const signInWithApple = async () => {
2020
provider: 'apple',
2121
});
2222
if (error) {
23-
console.log('Apple sign-in error:', error);
23+
console.error('Apple sign-in error:', error);
2424
throw new Error(error.message || 'Apple sign-in failed');
2525
}
2626
return data;

api/dashboardInfo.tsx

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -342,51 +342,59 @@ export async function getAvailableYears(): Promise<SupportedYear[]> {
342342

343343
// ------------------- USER MANAGEMENT (Year-agnostic) -------------------
344344
export const getCurrentUserTeam = async (): Promise<number | null> => {
345-
const { data, error } = await supabase.auth.getUser();
346-
if (error) {
347-
console.error('Error fetching user:', error.message);
348-
return null;
349-
}
350-
351-
if (!data.user) return null;
345+
try {
346+
const { data, error } = await supabase.auth.getUser();
347+
if (error) {
348+
console.error('Error fetching user:', error.message);
349+
return null;
350+
}
351+
352+
if (!data.user) return null;
352353

353-
const { data: teamData, error: teamError } = await supabase
354-
.from('user_teams')
355-
.select('currentTeam')
356-
.eq('id', data.user.id)
357-
.single()
358-
.throwOnError();
354+
const { data: teamData, error: teamError } = await supabase
355+
.from('user_teams')
356+
.select('currentTeam')
357+
.eq('id', data.user.id)
358+
.maybeSingle(); // Use maybeSingle instead of single to handle 0 or 1 rows gracefully
359359

360-
if (teamError) {
361-
console.error('Error fetching user team:', teamError);
360+
if (teamError) {
361+
console.error('Error fetching user team:', teamError);
362+
return null;
363+
}
364+
365+
return teamData?.currentTeam || null;
366+
} catch (error) {
367+
console.error('Unexpected error in getCurrentUserTeam:', error);
362368
return null;
363369
}
364-
365-
return teamData?.currentTeam || null;
366370
};
367371

368372
export const getCurrentUserRole = async (): Promise<string | null> => {
369-
const { data, error } = await supabase.auth.getUser();
370-
if (error) {
371-
console.error('Error fetching user:', error.message);
372-
return null;
373-
}
373+
try {
374+
const { data, error } = await supabase.auth.getUser();
375+
if (error) {
376+
console.error('Error fetching user:', error.message);
377+
return null;
378+
}
374379

375-
if (!data.user) return null;
380+
if (!data.user) return null;
376381

377-
const { data: roleData, error: roleError } = await supabase
378-
.from('user_teams')
379-
.select('accountType')
380-
.eq('id', data.user.id)
381-
.single()
382-
.throwOnError();
382+
const { data: roleData, error: roleError } = await supabase
383+
.from('user_teams')
384+
.select('accountType')
385+
.eq('id', data.user.id)
386+
.maybeSingle(); // Use maybeSingle instead of single
383387

384-
if (roleError) {
385-
console.error('Error fetching user role:', roleError);
388+
if (roleError) {
389+
console.error('Error fetching user role:', roleError);
390+
return null;
391+
}
392+
393+
return roleData?.accountType || null;
394+
} catch (error) {
395+
console.error('Unexpected error in getCurrentUserRole:', error);
386396
return null;
387397
}
388-
389-
return roleData?.accountType || null;
390398
};
391399

392400
export async function updateUserProfile({

app/auth/onBoard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default function UserOnboard({ onContinue, onPrevious }: UserOnboardProps
5757

5858
useEffect(() => {
5959
const fetchTeams = async () => {
60-
const teams = await getAllTeams(2025)
60+
const teams = await getAllTeams(2024)
6161
if (teams) setAllTeams(teams)
6262
}
6363
fetchTeams()

components/auth/accountInfo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export default function ProfileSettingsModal({
156156

157157
const fetchTeams = async () => {
158158
try {
159-
const teams = await getAllTeams(2025)
159+
const teams = await getAllTeams(2024)
160160
if (teams) setAllTeams(teams)
161161
} catch (error) {
162162
console.error("Error fetching teams:", error)

components/auth/profileCard.tsx

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import React from "react"
2-
import { View, Text, Image, TouchableOpacity, StyleSheet } from "react-native"
31
import { Ionicons } from "@expo/vector-icons"
2+
import React from "react"
3+
import { Image, StyleSheet, Text, TouchableOpacity, View } from "react-native"
44

55
type UserProfile = {
66
team_number?: string
@@ -27,10 +27,16 @@ export default function ProfileCard({ userProfile, loading, isDarkMode, onPress
2727
}
2828

2929
const getDisplayText = () => {
30+
// Always prefer display name if available
31+
if (userProfile?.display_name) {
32+
return userProfile.display_name
33+
}
34+
// If no display name but has team number, show team number
3035
if (userProfile?.team_number) {
3136
return userProfile.team_number
3237
}
33-
return userProfile?.display_name || "Loading"
38+
// Only if no display name AND no team number, show Spectator
39+
return "Spectator"
3440
}
3541

3642
const getProfilePicture = () => {
@@ -40,18 +46,40 @@ export default function ProfileCard({ userProfile, loading, isDarkMode, onPress
4046
return (
4147
<TouchableOpacity
4248
style={[styles.profileCard, { backgroundColor: colors.cardBg }]}
43-
onPress={onPress}
49+
onPress={() => {
50+
try {
51+
console.log('ProfileCard pressed', { userProfile, loading })
52+
onPress()
53+
} catch (error) {
54+
console.error('Error in ProfileCard onPress:', error)
55+
// Still call onPress even if there's an error to ensure settings access
56+
try {
57+
onPress()
58+
} catch (fallbackError) {
59+
console.error('Fallback onPress also failed:', fallbackError)
60+
}
61+
}
62+
}}
4463
activeOpacity={0.7}
64+
disabled={false} // Always keep the button enabled for settings access
4565
>
4666
<View style={styles.profileHeader}>
4767
<View style={styles.avatarContainer}>
4868
<Image source={{ uri: getProfilePicture() }} style={styles.avatar} />
4969
</View>
5070
<View style={styles.profileInfo}>
5171
<Text style={[styles.teamLabel, { color: colors.headerColor }]}>
52-
{loading ? "Loading..." : userProfile?.team_role?.toLocaleUpperCase()}
72+
{loading
73+
? "Loading..."
74+
: (userProfile?.team_role?.toLocaleUpperCase() ||
75+
(userProfile?.team_number ? "TEAM MEMBER" : "SPECTATOR"))
76+
}
5377
</Text>
54-
<Text style={[styles.teamNumber, { color: colors.textColor }]}>
78+
<Text
79+
style={[styles.teamNumber, { color: colors.textColor }]}
80+
numberOfLines={2}
81+
ellipsizeMode="tail"
82+
>
5583
{loading ? "Loading..." : getDisplayText()}
5684
</Text>
5785
</View>
@@ -67,6 +95,8 @@ const styles = StyleSheet.create({
6795
marginBottom: 15,
6896
borderRadius: 12,
6997
padding: 16,
98+
// Ensure touch events are handled
99+
pointerEvents: 'auto',
70100
},
71101
profileHeader: {
72102
flexDirection: "row",

components/auth/useUserProfile.tsx

Lines changed: 69 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { useState, useEffect, useCallback, useRef } from "react"
21
import {
32
fetchTeamName,
43
getCurrentUserRole,
54
getCurrentUserTeam,
65
getImage,
76
getName,
87
} from "@/api/dashboardInfo"
8+
import { useCallback, useEffect, useRef, useState } from "react"
99

1010
export type UserProfile = {
1111
team_number?: string
@@ -38,31 +38,71 @@ export const useUserProfile = (isLoggedIn: boolean, refreshInterval: number = 50
3838
}
3939

4040
try {
41-
const [teamNumber, teamAccountRole, name] = await Promise.all([
42-
getCurrentUserTeam(),
43-
getCurrentUserRole(),
44-
getName()
45-
])
41+
// Safely attempt to get user data, ignoring errors
42+
let teamNumber: number | null = null
43+
let teamAccountRole: string | null = null
44+
let name: string | null = null
45+
46+
try {
47+
teamNumber = await getCurrentUserTeam()
48+
} catch (error) {
49+
console.warn("Could not fetch user team (this is ok for spectators):", error)
50+
}
51+
52+
try {
53+
teamAccountRole = await getCurrentUserRole()
54+
} catch (error) {
55+
console.warn("Could not fetch user role (this is ok for spectators):", error)
56+
}
57+
58+
try {
59+
name = await getName()
60+
} catch (error) {
61+
console.warn("Could not fetch user name (this is ok):", error)
62+
}
4663

4764
let profile: UserProfile
48-
if (teamNumber) {
49-
const [teamName, image] = await Promise.all([
50-
fetchTeamName(teamNumber, 2024),
51-
getImage(teamNumber, 2024)
52-
])
65+
if (teamNumber && teamNumber > 0) {
66+
// User has a valid team - try to get team info
67+
let teamName: string | null = null
68+
let image: string | null = null
69+
70+
try {
71+
const fetchedTeamName = await fetchTeamName(teamNumber, 2024)
72+
teamName = fetchedTeamName || null
73+
} catch (error) {
74+
console.warn("Could not fetch team name:", error)
75+
}
76+
77+
try {
78+
const fetchedImage = await getImage(teamNumber, 2024)
79+
image = fetchedImage || null
80+
} catch (error) {
81+
console.warn("Could not fetch team image:", error)
82+
}
83+
5384
profile = {
5485
team_number: "#" + teamNumber.toString(),
55-
team_name: teamName,
56-
team_role: teamAccountRole ?? undefined,
57-
profile_picture: image ?? undefined,
58-
display_name: name ?? undefined,
86+
team_name: teamName || undefined,
87+
team_role: teamAccountRole || undefined,
88+
profile_picture: image || undefined,
89+
display_name: name || undefined,
5990
}
6091
} else {
61-
const image = await getImage(-1, 2024)
92+
// User is a spectator - minimal profile
93+
let image: string | null = null
94+
95+
try {
96+
const fetchedImage = await getImage(-1, 2024)
97+
image = fetchedImage || null
98+
} catch (error) {
99+
console.warn("Could not fetch default image:", error)
100+
}
101+
62102
profile = {
63-
display_name: name,
64-
team_role: teamAccountRole ?? "Player",
65-
profile_picture: image ?? undefined,
103+
display_name: name || undefined,
104+
team_role: teamAccountRole || undefined,
105+
profile_picture: image || undefined,
66106
}
67107
}
68108

@@ -74,8 +114,17 @@ export const useUserProfile = (isLoggedIn: boolean, refreshInterval: number = 50
74114
}
75115
} catch (error) {
76116
console.error("Error fetching user profile:", error)
117+
118+
// Create a minimal fallback profile so the UI doesn't break
119+
const fallbackProfile: UserProfile = {
120+
display_name: undefined,
121+
team_role: undefined,
122+
profile_picture: undefined,
123+
}
124+
125+
profileCache = fallbackProfile
77126
if (isMountedRef.current) {
78-
// Don't clear existing data on error, just stop loading
127+
setUserProfile(fallbackProfile)
79128
setLoading(false)
80129
}
81130
}

components/header/rightSide.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const RightSide = () => {
5050
if (pathname.includes('/inShow')) return 2023;
5151
if (pathname.includes('/intothedeep')) return 2024;
5252
if (pathname.includes('/age')) return 2025;
53-
return 2025; // Default fallback
53+
return 2024; // Default fallback
5454
};
5555

5656
const currentYear = getCurrentYear();

0 commit comments

Comments
 (0)