mirror of
https://github.com/kyantech/Palmr.git
synced 2025-10-23 06:11:58 +00:00
feat(auth): improve user data fetching on authentication
- Updated AuthCallbackPage to fetch user data after successful authentication and set user context. - Removed redundant initialization logic in useLogin hook and streamlined user data retrieval post-login. - Enhanced error handling for user data fetching to improve user experience during authentication.
This commit is contained in:
@@ -4,9 +4,13 @@ import { useEffect } from "react";
|
||||
import { useRouter, useSearchParams } from "next/navigation";
|
||||
import { toast } from "sonner";
|
||||
|
||||
import { useAuth } from "@/contexts/auth-context";
|
||||
import { getCurrentUser } from "@/http/endpoints";
|
||||
|
||||
export default function AuthCallbackPage() {
|
||||
const router = useRouter();
|
||||
const searchParams = useSearchParams();
|
||||
const { setUser, setIsAuthenticated, setIsAdmin } = useAuth();
|
||||
|
||||
useEffect(() => {
|
||||
const token = searchParams.get("token");
|
||||
@@ -46,13 +50,33 @@ export default function AuthCallbackPage() {
|
||||
if (token) {
|
||||
document.cookie = `token=${token}; path=/; max-age=${7 * 24 * 60 * 60}; samesite=lax`;
|
||||
|
||||
toast.success("Successfully authenticated!");
|
||||
router.push("/dashboard");
|
||||
// Buscar dados do usuário após definir o cookie
|
||||
const fetchUserData = async () => {
|
||||
try {
|
||||
const response = await getCurrentUser();
|
||||
if (response?.data?.user) {
|
||||
const { isAdmin, ...userData } = response.data.user;
|
||||
setUser(userData);
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
toast.success("Successfully authenticated!");
|
||||
router.push("/dashboard");
|
||||
} else {
|
||||
throw new Error("No user data received");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error fetching user data:", error);
|
||||
toast.error("Authentication failed");
|
||||
router.push("/login");
|
||||
}
|
||||
};
|
||||
|
||||
fetchUserData();
|
||||
return;
|
||||
}
|
||||
|
||||
router.push("/login");
|
||||
}, [router, searchParams]);
|
||||
}, [router, searchParams, setUser, setIsAuthenticated, setIsAdmin]);
|
||||
|
||||
return (
|
||||
<div className="min-h-screen flex items-center justify-center">
|
||||
|
@@ -27,7 +27,6 @@ export function useLogin() {
|
||||
const { isAuthenticated, setUser, setIsAdmin, setIsAuthenticated } = useAuth();
|
||||
const [isVisible, setIsVisible] = useState(false);
|
||||
const [error, setError] = useState<string | undefined>();
|
||||
const [isInitialized, setIsInitialized] = useState(false);
|
||||
const [requiresTwoFactor, setRequiresTwoFactor] = useState(false);
|
||||
const [twoFactorUserId, setTwoFactorUserId] = useState<string | null>(null);
|
||||
const [twoFactorCode, setTwoFactorCode] = useState("");
|
||||
@@ -61,43 +60,6 @@ export function useLogin() {
|
||||
}
|
||||
}, [searchParams, t]);
|
||||
|
||||
useEffect(() => {
|
||||
const checkAuth = async () => {
|
||||
try {
|
||||
const appInfoResponse = await getAppInfo();
|
||||
const appInfo = appInfoResponse.data;
|
||||
|
||||
if (appInfo.firstUserAccess) {
|
||||
setUser(null);
|
||||
setIsAdmin(false);
|
||||
setIsAuthenticated(false);
|
||||
setIsInitialized(true);
|
||||
return;
|
||||
}
|
||||
|
||||
const userResponse = await getCurrentUser();
|
||||
if (!userResponse?.data?.user) {
|
||||
throw new Error(t("errors.noUserData"));
|
||||
}
|
||||
|
||||
const { isAdmin, ...userData } = userResponse.data.user;
|
||||
setUser(userData);
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
router.push("/dashboard");
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
setUser(null);
|
||||
setIsAdmin(false);
|
||||
setIsAuthenticated(false);
|
||||
} finally {
|
||||
setIsInitialized(true);
|
||||
}
|
||||
};
|
||||
|
||||
checkAuth();
|
||||
}, [router, setUser, setIsAdmin, setIsAuthenticated, t]);
|
||||
|
||||
const toggleVisibility = () => setIsVisible(!isVisible);
|
||||
|
||||
const onSubmit = async (data: LoginFormValues) => {
|
||||
@@ -115,8 +77,24 @@ export function useLogin() {
|
||||
}
|
||||
|
||||
if (loginData.user) {
|
||||
// Após login bem-sucedido, buscar dados completos do usuário incluindo a imagem
|
||||
try {
|
||||
const userResponse = await getCurrentUser();
|
||||
if (userResponse?.data?.user) {
|
||||
const { isAdmin, ...userData } = userResponse.data.user;
|
||||
setUser(userData);
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
router.replace("/dashboard");
|
||||
return;
|
||||
}
|
||||
} catch (userErr) {
|
||||
console.warn("Failed to fetch complete user data, using login data:", userErr);
|
||||
}
|
||||
|
||||
// Fallback para dados do login se falhar ao buscar dados completos
|
||||
const { isAdmin, ...userData } = loginData.user;
|
||||
setUser({ ...userData, image: userData.image ?? null });
|
||||
setUser({ ...userData, image: null });
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
router.replace("/dashboard");
|
||||
@@ -151,9 +129,24 @@ export function useLogin() {
|
||||
rememberDevice: rememberDevice,
|
||||
});
|
||||
|
||||
const { isAdmin, ...userData } = response.data.user;
|
||||
// Após two-factor login bem-sucedido, buscar dados completos do usuário incluindo a imagem
|
||||
try {
|
||||
const userResponse = await getCurrentUser();
|
||||
if (userResponse?.data?.user) {
|
||||
const { isAdmin, ...userData } = userResponse.data.user;
|
||||
setUser(userData);
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
router.replace("/dashboard");
|
||||
return;
|
||||
}
|
||||
} catch (userErr) {
|
||||
console.warn("Failed to fetch complete user data after 2FA, using response data:", userErr);
|
||||
}
|
||||
|
||||
setUser(userData);
|
||||
// Fallback para dados da resposta se falhar ao buscar dados completos
|
||||
const { isAdmin, ...userData } = response.data.user;
|
||||
setUser({ ...userData, image: userData.image ?? null });
|
||||
setIsAdmin(isAdmin);
|
||||
setIsAuthenticated(true);
|
||||
router.replace("/dashboard");
|
||||
@@ -169,7 +162,7 @@ export function useLogin() {
|
||||
};
|
||||
|
||||
return {
|
||||
isAuthenticated: !isInitialized ? null : isAuthenticated,
|
||||
isAuthenticated,
|
||||
error,
|
||||
isVisible,
|
||||
toggleVisibility,
|
||||
|
Reference in New Issue
Block a user