Skip to content

Fix Google OAuth onboarding redirection issue #92

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 74 additions & 24 deletions Frontend/src/context/AuthContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,29 +81,34 @@ export const AuthProvider = ({ children }: AuthProviderProps) => {
}
setLastRequest(now);

// Check if user has completed onboarding by looking for social profiles or brand data
const { data: socialProfiles } = await supabase
.from("social_profiles")
.select("id")
.eq("user_id", userToUse.id)
.limit(1);

const { data: brandData } = await supabase
.from("brands")
.select("id")
.eq("user_id", userToUse.id)
.limit(1);

const hasOnboarding = (socialProfiles && socialProfiles.length > 0) || (brandData && brandData.length > 0);

// Get user role
const { data: userData } = await supabase
.from("users")
.select("role")
.eq("id", userToUse.id)
.single();

return { hasOnboarding, role: userData?.role || null };
try {
// Check if user has completed onboarding by looking for social profiles or brand data
const { data: socialProfiles } = await supabase
.from("social_profiles")
.select("id")
.eq("user_id", userToUse.id)
.limit(1);

const { data: brandData } = await supabase
.from("brands")
.select("id")
.eq("user_id", userToUse.id)
.limit(1);

const hasOnboarding = Boolean((socialProfiles && socialProfiles.length > 0) || (brandData && brandData.length > 0));

// Get user role
const { data: userData } = await supabase
.from("users")
.select("role")
.eq("id", userToUse.id)
.single();

return { hasOnboarding, role: userData?.role || null };
} catch (error) {
console.error("Error checking onboarding status:", error);
return { hasOnboarding: false, role: null };
}
};

useEffect(() => {
Expand Down Expand Up @@ -135,6 +140,30 @@ export const AuthProvider = ({ children }: AuthProviderProps) => {
console.log("AuthContext: Ensuring user in table");
try {
await ensureUserInTable(data.session.user);

// Check onboarding status and redirect appropriately for initial load
// Only redirect if not on reset-password page and not already on a dashboard/onboarding page
const currentPath = window.location.pathname;
if (!currentPath.includes('/reset-password') &&
!currentPath.includes('/dashboard') &&
!currentPath.includes('/onboarding')) {
console.log("AuthContext: Checking onboarding status for initial redirection");
const { hasOnboarding, role } = await checkUserOnboarding(data.session.user);
console.log("AuthContext: Initial onboarding check result", { hasOnboarding, role });

if (hasOnboarding) {
if (role === "brand") {
console.log("AuthContext: Initial redirect to brand dashboard");
navigate("/brand/dashboard");
} else {
console.log("AuthContext: Initial redirect to dashboard");
navigate("/dashboard");
}
} else {
console.log("AuthContext: Initial redirect to onboarding");
navigate("/onboarding");
}
}
} catch (error) {
console.error("AuthContext: Error ensuring user in table", error);
}
Expand All @@ -161,6 +190,27 @@ export const AuthProvider = ({ children }: AuthProviderProps) => {
console.log("AuthContext: User authenticated");
try {
await ensureUserInTable(session.user);

// Check onboarding status and redirect appropriately
// Only redirect on SIGNED_IN event to avoid conflicts during password reset
if (event === 'SIGNED_IN' && !window.location.pathname.includes('/reset-password')) {
console.log("AuthContext: Checking onboarding status for redirection");
const { hasOnboarding, role } = await checkUserOnboarding(session.user);
console.log("AuthContext: Onboarding check result", { hasOnboarding, role });

if (hasOnboarding) {
if (role === "brand") {
console.log("AuthContext: Redirecting to brand dashboard");
navigate("/brand/dashboard");
} else {
console.log("AuthContext: Redirecting to dashboard");
navigate("/dashboard");
}
} else {
console.log("AuthContext: Redirecting to onboarding");
navigate("/onboarding");
}
}
} catch (error) {
console.error("AuthContext: Error ensuring user in table", error);
}
Expand All @@ -182,7 +232,7 @@ export const AuthProvider = ({ children }: AuthProviderProps) => {

const login = () => {
setIsAuthenticated(true);
navigate("/dashboard");
// Navigation is now handled by the onAuthStateChange listener
};

const logout = async () => {
Expand Down