Update src/hooks/useAuth.ts
This commit is contained in:
@@ -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
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user