@inertiapixel/nextjs-auth
Version:
Authentication system for Next.js. Supports credentials and social login, JWT token management, and lifecycle hooks — designed to integrate with nodejs-auth for full-stack MERN apps.
47 lines (46 loc) • 1.76 kB
JavaScript
//src/hooks/useAuth.ts
'use client';
import { useContext, useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { AuthContext } from '../context/AuthProvider';
import { useNavigation } from '../utils/useNavigation';
export const useAuth = (redirectIfNotAuthenticated = '/login') => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
const { user, isAuthenticated, loading, loginError, login, logout, socialLogin } = context;
const [isLoaded, setIsLoaded] = useState(false);
const router = useRouter();
// Your custom navigation hook
const { current, full } = useNavigation();
useEffect(() => {
const isOnLoginPage = current === redirectIfNotAuthenticated;
const alreadyRedirecting = full.includes('redirectTo=');
if (!loading && !isAuthenticated && !isOnLoginPage && !alreadyRedirecting) {
const redirectTarget = full.startsWith(redirectIfNotAuthenticated)
? '/'
: full;
localStorage.setItem('redirectTo', redirectTarget);
const redirectUrl = `${redirectIfNotAuthenticated}?redirectTo=${encodeURIComponent(redirectTarget)}`;
router.push(redirectUrl);
}
else if (!loading) {
setIsLoaded(true);
}
}, [loading, isAuthenticated, redirectIfNotAuthenticated, router, current, full]);
// const getToken = async () => {
// return localStorage.getItem('token') || '';
// };
return {
user,
isAuthenticated,
loading,
isLoaded,
// getToken,
loginError,
login,
logout,
socialLogin
};
};