Spaces:
Sleeping
Sleeping
| 'use client' | |
| import { useAuthStore } from '@/lib/stores/auth-store' | |
| import { useRouter } from 'next/navigation' | |
| import { useEffect } from 'react' | |
| export function useAuth() { | |
| const router = useRouter() | |
| const { | |
| isAuthenticated, | |
| isLoading, | |
| login, | |
| logout, | |
| checkAuth, | |
| checkAuthRequired, | |
| error, | |
| hasHydrated, | |
| authRequired | |
| } = useAuthStore() | |
| useEffect(() => { | |
| // Only check auth after the store has hydrated from localStorage | |
| if (hasHydrated) { | |
| // First check if auth is required | |
| if (authRequired === null) { | |
| checkAuthRequired().then((required) => { | |
| // If auth is required, check if we have valid credentials | |
| if (required) { | |
| checkAuth() | |
| } | |
| }) | |
| } else if (authRequired) { | |
| // Auth is required, check credentials | |
| checkAuth() | |
| } | |
| // If authRequired === false, we're already authenticated (set in checkAuthRequired) | |
| } | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| }, [hasHydrated, authRequired]) | |
| const handleLogin = async (password: string) => { | |
| const success = await login(password) | |
| if (success) { | |
| // Check if there's a stored redirect path | |
| const redirectPath = sessionStorage.getItem('redirectAfterLogin') | |
| if (redirectPath) { | |
| sessionStorage.removeItem('redirectAfterLogin') | |
| router.push(redirectPath) | |
| } else { | |
| router.push('/notebooks') | |
| } | |
| } | |
| return success | |
| } | |
| const handleLogout = () => { | |
| logout() | |
| router.push('/login') | |
| } | |
| return { | |
| isAuthenticated, | |
| isLoading: isLoading || !hasHydrated, // Treat lack of hydration as loading | |
| error, | |
| login: handleLogin, | |
| logout: handleLogout | |
| } | |
| } |