diff --git a/app/complete-profile/page.tsx b/app/complete-profile/page.tsx index 9ebe8c24..1c89cec2 100644 --- a/app/complete-profile/page.tsx +++ b/app/complete-profile/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useEffect, useCallback, useRef } from 'react'; +import { useState, useEffect, useCallback, useRef, Suspense } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { createClient } from '@/lib/supabase/client'; @@ -22,7 +22,7 @@ interface User { }; } -export default function CompleteProfile() { +function CompleteProfileContent() { const router = useRouter(); const searchParams = useSearchParams(); const returnUrl = searchParams.get('returnUrl') || '/protected/dashboard'; @@ -36,6 +36,7 @@ export default function CompleteProfile() { const [usernameError, setUsernameError] = useState(''); const [user, setUser] = useState(null); const [isValidating, setIsValidating] = useState(true); + const [oauthProvider, setOauthProvider] = useState(''); const usernameCheckTimeout = useRef | null>(null); const getSupabaseClient = () => { @@ -82,15 +83,40 @@ export default function CompleteProfile() { // Continue with the form - profileService will handle creation if needed } - // Pre-fill from OAuth provider data if available + // Pre-fill from OAuth provider data if available (prioritize OAuth data over existing profile data) if (user.user_metadata) { const metadata = user.user_metadata; - if (!firstName && (metadata.first_name || metadata.given_name)) { - setFirstName(metadata.first_name || metadata.given_name || ''); + + // Extract first name from various OAuth provider formats + const oauthFirstName = metadata.first_name || + metadata.given_name || + metadata.name?.split(' ')[0] || + ''; + + // Extract last name from various OAuth provider formats + const oauthLastName = metadata.last_name || + metadata.family_name || + metadata.name?.split(' ').slice(1).join(' ') || + ''; + + // Use OAuth data if available, otherwise keep existing profile data + if (oauthFirstName) { + setFirstName(oauthFirstName); } - if (!lastName && (metadata.last_name || metadata.family_name)) { - setLastName(metadata.last_name || metadata.family_name || ''); + if (oauthLastName) { + setLastName(oauthLastName); } + + // Set OAuth provider for UI display + setOauthProvider(metadata.provider || 'unknown'); + + console.log('OAuth provider data:', { + provider: metadata.provider || 'unknown', + firstName: oauthFirstName, + lastName: oauthLastName, + fullName: metadata.name, + metadata: metadata + }); } } catch (error) { @@ -99,7 +125,7 @@ export default function CompleteProfile() { } finally { setIsValidating(false); } - }, [router, firstName, lastName]); + }, [router, returnUrl]); useEffect(() => { checkUser(); @@ -287,7 +313,11 @@ export default function CompleteProfile() { {/* First Name */}
); } + +export default function CompleteProfile() { + return ( + +
+
+
+
+ Loading... +
+ }> + + + ); +} diff --git a/lib/services/profile.ts b/lib/services/profile.ts index b91e1630..6d9c5346 100644 --- a/lib/services/profile.ts +++ b/lib/services/profile.ts @@ -41,10 +41,25 @@ export class ProfileService { // Generate a simple codeunia_id if needed const codeuniaId = `CU-${userId.slice(-8).toUpperCase()}-${Date.now().toString(36).toUpperCase()}` + // Extract name data from OAuth provider metadata + const metadata = user.user?.user_metadata || {}; + + // Extract first name from various OAuth provider formats + const firstName = metadata.first_name || + metadata.given_name || + metadata.name?.split(' ')[0] || + ''; + + // Extract last name from various OAuth provider formats + const lastName = metadata.last_name || + metadata.family_name || + metadata.name?.split(' ').slice(1).join(' ') || + ''; + const profileData = { id: userId, - first_name: user.user?.user_metadata?.first_name || '', - last_name: user.user?.user_metadata?.last_name || '', + first_name: firstName, + last_name: lastName, is_public: true, email_notifications: true, profile_completion_percentage: 0,