Update src/hooks/useAuth.ts

This commit is contained in:
2026-03-11 20:29:38 +00:00
parent 6600f3fbb2
commit 28a491c46b

View File

@@ -1,111 +1,62 @@
"use client";
/**
* Custom Hook for Authentication Management
* Provides easy access to auth state and functions throughout the app
*/
import { useState, useEffect, useCallback } from "react";
import { useState, useCallback, useEffect } from 'react';
import {
getUserSession,
isUserLoggedIn,
clearUserSession,
authenticateUser,
validateEmail,
validatePassword,
UserSession
} from '@/utils/auth';
interface User {
id: string;
email: string;
name: string;
}
export const useAuth = () => {
const [isLoggedIn, setIsLoggedIn] = useState<boolean>(false);
const [userSession, setUserSession] = useState<UserSession | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(true);
interface UserSession {
token: string;
user: User;
expiresAt: string;
}
export function useAuth() {
const [user, setUser] = useState<User | null>(null);
const [token, setToken] = useState<string | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [isAuthenticated, setIsAuthenticated] = useState(false);
// Initialize auth state from localStorage
// Check login status on mount
useEffect(() => {
const storedSession = localStorage.getItem("userSession");
if (storedSession) {
try {
const session: UserSession = JSON.parse(storedSession);
// Check if session has expired
if (new Date(session.expiresAt) > new Date()) {
setUser(session.user);
setToken(session.token);
setIsAuthenticated(true);
} else {
// Session expired, clear it
localStorage.removeItem("userSession");
setIsAuthenticated(false);
}
} catch (error) {
console.error("Failed to parse session:", error);
localStorage.removeItem("userSession");
setIsAuthenticated(false);
}
}
const loggedIn = isUserLoggedIn();
const session = getUserSession();
setIsLoggedIn(loggedIn);
setUserSession(session);
setIsLoading(false);
}, []);
const login = useCallback((sessionData: UserSession) => {
setUser(sessionData.user);
setToken(sessionData.token);
setIsAuthenticated(true);
localStorage.setItem("userSession", JSON.stringify(sessionData));
}, []);
const logout = useCallback(async () => {
const login = useCallback(async (email: string, password: string) => {
setIsLoading(true);
try {
await fetch("/api/auth/logout", { method: "POST" });
} catch (error) {
console.error("Logout error:", error);
} finally {
setUser(null);
setToken(null);
setIsAuthenticated(false);
localStorage.removeItem("userSession");
window.location.href = "/";
}
}, []);
const verifySession = useCallback(async (): Promise<boolean> => {
if (!token) return false;
try {
const response = await fetch("/api/auth/verify-session", {
headers: {
Authorization: `Bearer ${token}`,
},
});
return response.ok;
} catch (error) {
console.error("Session verification error:", error);
return false;
}
}, [token]);
const updateUser = useCallback((updatedUser: Partial<User>) => {
setUser((prev) => (prev ? { ...prev, ...updatedUser } : null));
const storedSession = localStorage.getItem("userSession");
if (storedSession) {
try {
const session: UserSession = JSON.parse(storedSession);
session.user = { ...session.user, ...updatedUser };
localStorage.setItem("userSession", JSON.stringify(session));
} catch (error) {
console.error("Failed to update session:", error);
const result = await authenticateUser(email, password);
if (result.success) {
setIsLoggedIn(true);
setUserSession(getUserSession());
}
setIsLoading(false);
return result;
} catch (error) {
setIsLoading(false);
return { success: false, message: 'Erro ao fazer login' };
}
}, []);
const logout = useCallback(() => {
clearUserSession();
setIsLoggedIn(false);
setUserSession(null);
}, []);
return {
user,
token,
isLoggedIn,
userSession,
isLoading,
isAuthenticated,
login,
logout,
verifySession,
updateUser,
validateEmail,
validatePassword
};
}
};