fix:google login

This commit is contained in:
xuqssq
2024-12-21 20:52:48 +08:00
parent 3812c9b7e9
commit 36db1f29b0
6 changed files with 4421 additions and 70 deletions

View File

@@ -1,24 +1,45 @@
import React, { createContext, useContext, useState, useEffect } from 'react';
import { supabase } from '@/config/supabase';
import { message } from 'antd';
import { useNavigate } from 'react-router-dom';
import React, { createContext, useContext, useState, useEffect } from "react";
import { supabase } from "@/config/supabase";
import { message } from "antd";
import { useNavigate, useSearchParams, useLocation } from "react-router-dom";
const AuthContext = createContext();
const AuthContext = createContext({});
export const AuthProvider = ({ children }) => {
const [searchParams, setSearchParams] = useSearchParams();
const navigate = useNavigate();
const location = useLocation();
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
//处理google登录
const hash = window.location.hash.substring(1);
const hashParams = new URLSearchParams(hash);
const accessToken = hashParams.get("access_token");
const refreshToken = hashParams.get("refresh_token");
if (accessToken && refreshToken) {
(async () => {
const { data, error } = await supabase.auth.setSession({
access_token: accessToken,
refresh_token: refreshToken,
});
})();
}
}, [navigate]);
// 监听认证状态变化
useEffect(() => {
// 获取初始会话状态
const initSession = async () => {
try {
const { data: { session } } = await supabase.auth.getSession();
const {
data: { session },
error,
} = await supabase.auth.getSession();
setUser(session?.user ?? null);
} catch (error) {
console.error('Error getting session:', error);
console.error("Error getting session:", error);
} finally {
setLoading(false);
}
@@ -27,7 +48,9 @@ export const AuthProvider = ({ children }) => {
initSession();
// 订阅认证状态变化
const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => {
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((_event, session) => {
setUser(session?.user ?? null);
});
@@ -36,6 +59,13 @@ export const AuthProvider = ({ children }) => {
};
}, []);
// useEffect(() => {
// const redirectTo = searchParams.get("redirectTo");
// if (redirectTo) {
// navigate(redirectTo);
// }
// }, [location.pathname]);
// 邮箱密码登录
const login = async (email, password) => {
try {
@@ -46,14 +76,14 @@ export const AuthProvider = ({ children }) => {
});
if (error) {
throw error;
message.error(error.message || "登录失败,请稍后重试");
return;
}
setUser(data.user);
return data;
} catch (error) {
message.error(error.message || '登录失败');
throw error;
message.error(error.message || "登录失败,请稍后重试");
} finally {
setLoading(false);
}
@@ -63,21 +93,25 @@ export const AuthProvider = ({ children }) => {
const signInWithGoogle = async () => {
try {
setLoading(true);
const redirectTo = searchParams.get("redirectTo");
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
provider: "google",
options: {
redirectTo: `${window.location.origin}/auth/callback`,
redirectTo: `${window.location.origin}/login?redirectTo=${
redirectTo ?? ""
}`,
},
});
console.log(data, error, "data");
if (error) {
throw error;
message.error(error.message || "Google 登录失败,请稍后重试");
return;
}
return data;
} catch (error) {
message.error(error.message || 'Google 登录失败');
throw error;
message.error(error.message || "Google 登录失败,请稍后重试");
} finally {
setLoading(false);
}
@@ -98,10 +132,10 @@ export const AuthProvider = ({ children }) => {
if (error) {
throw error;
}
message.success('注册成功!请查收验证邮件。');
message.success("注册成功!请查收验证邮件。");
return data;
} catch (error) {
message.error(error.message || '注册失败');
message.error(error.message || "注册失败");
throw error;
} finally {
setLoading(false);
@@ -113,20 +147,17 @@ export const AuthProvider = ({ children }) => {
try {
setLoading(true);
const { error } = await supabase.auth.signOut({
scope: 'local'
scope: "local",
});
if (error) {
throw error;
message.error(error.message || "登出失败,请稍后重试");
return;
}
setUser(null);
message.success('已成功登出');
navigate('/login', { replace: true });
message.success("已成功登出");
navigate(`/login?redirectTo=${location.pathname}`, { replace: true });
} catch (error) {
message.error(error.message || '登出失败');
throw error;
message.error(error.message || "登出失败,请稍后重试");
} finally {
setLoading(false);
}
@@ -146,8 +177,5 @@ export const AuthProvider = ({ children }) => {
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};
};

View File

@@ -0,0 +1,14 @@
import React, { createContext, useContext, useState, useEffect } from "react";
const RootStoreContext = createContext({});
export const RootStoreProvider = ({ children }) => {
return (
<RootStoreContext.Provider value={{}}>{children}</RootStoreContext.Provider>
);
};
export const useTheme = () => {
const context = useContext(RootStoreContext);
return context;
};