Simplify passport data loading and remove local fallbacks
cgen-c30a0808dd3a4b12bc7d2c8dd39c86b8
This commit is contained in:
parent
2195308de9
commit
88d4cd0bc9
1 changed files with 34 additions and 67 deletions
|
|
@ -44,7 +44,7 @@ const formatDate = (value?: string | null) => {
|
||||||
const ProfilePassport = () => {
|
const ProfilePassport = () => {
|
||||||
const params = useParams<{ id?: string }>();
|
const params = useParams<{ id?: string }>();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { user, linkedProviders, profile: authProfile } = useAuth();
|
const { user, linkedProviders } = useAuth();
|
||||||
|
|
||||||
const [profile, setProfile] = useState<
|
const [profile, setProfile] = useState<
|
||||||
(AethexUserProfile & { email?: string | null }) | null
|
(AethexUserProfile & { email?: string | null }) | null
|
||||||
|
|
@ -74,79 +74,47 @@ const ProfilePassport = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadProfile = async () => {
|
const loadProfile = async () => {
|
||||||
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
const isViewingSelf = params.id === "me" || !params.id;
|
||||||
|
|
||||||
|
const profilePromise = isViewingSelf
|
||||||
|
? aethexUserService.getCurrentUser()
|
||||||
|
: aethexUserService.getProfileById(targetUserId);
|
||||||
|
|
||||||
const [profileData, achievementList, interestList, projectList] =
|
const [profileData, achievementList, interestList, projectList] =
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
params.id === "me" && profile && profile.id === targetUserId
|
profilePromise,
|
||||||
? Promise.resolve(profile)
|
aethexAchievementService
|
||||||
: aethexUserService.getProfileById(targetUserId),
|
.getUserAchievements(targetUserId)
|
||||||
aethexAchievementService.getUserAchievements(targetUserId),
|
.catch((error) => {
|
||||||
aethexUserService.getUserInterests(targetUserId),
|
console.error("Failed to load achievements", error);
|
||||||
aethexProjectService.getUserProjects(targetUserId).catch(() => []),
|
return [] as AethexAchievement[];
|
||||||
|
}),
|
||||||
|
aethexUserService.getUserInterests(targetUserId).catch((error) => {
|
||||||
|
console.error("Failed to load interests", error);
|
||||||
|
return [] as string[];
|
||||||
|
}),
|
||||||
|
aethexProjectService
|
||||||
|
.getUserProjects(targetUserId)
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Failed to load projects", error);
|
||||||
|
return [] as ProjectPreview[];
|
||||||
|
}),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let resolvedProfile = profileData as
|
if (!profileData) {
|
||||||
| (AethexUserProfile & { email?: string | null })
|
|
||||||
| null;
|
|
||||||
|
|
||||||
const isViewingSelf = params.id === "me" && user?.id === targetUserId;
|
|
||||||
|
|
||||||
if (!resolvedProfile && isViewingSelf) {
|
|
||||||
resolvedProfile = (authProfile as any) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
!resolvedProfile &&
|
|
||||||
isViewingSelf &&
|
|
||||||
typeof window !== "undefined"
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
const stored = localStorage.getItem(`demo_profile_${targetUserId}`);
|
|
||||||
if (stored) {
|
|
||||||
resolvedProfile = JSON.parse(stored);
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!resolvedProfile && isViewingSelf && user) {
|
|
||||||
resolvedProfile = {
|
|
||||||
id: user.id,
|
|
||||||
username: user.email?.split("@")[0] || `user_${Date.now()}`,
|
|
||||||
full_name:
|
|
||||||
(authProfile as any)?.full_name || user.email || "AeThex Creator",
|
|
||||||
email: user.email,
|
|
||||||
user_type:
|
|
||||||
((authProfile as any)?.user_type as any) ||
|
|
||||||
("community_member" as any),
|
|
||||||
experience_level:
|
|
||||||
((authProfile as any)?.experience_level as any) ||
|
|
||||||
("beginner" as any),
|
|
||||||
level: (authProfile as any)?.level ?? 1,
|
|
||||||
total_xp: (authProfile as any)?.total_xp ?? 0,
|
|
||||||
loyalty_points: (authProfile as any)?.loyalty_points ?? 0,
|
|
||||||
created_at:
|
|
||||||
(authProfile as any)?.created_at || new Date().toISOString(),
|
|
||||||
updated_at:
|
|
||||||
(authProfile as any)?.updated_at || new Date().toISOString(),
|
|
||||||
} as AethexUserProfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resolvedProfile && isViewingSelf && typeof window !== "undefined") {
|
|
||||||
try {
|
|
||||||
localStorage.setItem(
|
|
||||||
`demo_profile_${targetUserId}`,
|
|
||||||
JSON.stringify(resolvedProfile),
|
|
||||||
);
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!resolvedProfile) {
|
|
||||||
setNotFound(true);
|
setNotFound(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setProfile(resolvedProfile as any);
|
const resolvedProfile = {
|
||||||
|
...profileData,
|
||||||
|
email:
|
||||||
|
(profileData as any)?.email ?? (isViewingSelf ? user?.email ?? null : null),
|
||||||
|
} as AethexUserProfile & { email?: string | null };
|
||||||
|
|
||||||
|
setProfile(resolvedProfile);
|
||||||
setAchievements(achievementList ?? []);
|
setAchievements(achievementList ?? []);
|
||||||
setInterests(interestList ?? []);
|
setInterests(interestList ?? []);
|
||||||
setProjects(
|
setProjects(
|
||||||
|
|
@ -168,9 +136,8 @@ const ProfilePassport = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
loadProfile();
|
loadProfile();
|
||||||
// We intentionally exclude profile from dependencies to avoid refetch loops when local state updates
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [targetUserId, params.id]);
|
}, [targetUserId, params.id, user?.email]);
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <LoadingScreen message="Loading AeThex passport..." />;
|
return <LoadingScreen message="Loading AeThex passport..." />;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue