Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions src/app/hooks/useAuth.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,51 @@
import { useEffect, useState } from 'react';
import { useRouter, usePathname } from 'next/navigation';
import { useRouter } from 'next/navigation';
import { userService } from '@/app/services/user.service';

/** The user saved by the last successful /users/me, or null. */
function cachedUser(): any {
try {
const saved = localStorage.getItem('u');
return saved ? JSON.parse(saved) : null;
} catch {
return null;
}
}

/**
* Custom hook for authentication
* Automatically fetches user and redirects to login or invite-verify if needed
* The signed-in user, loaded once when the component using it mounts.
*
* A layout keeps its hooks while you move between its child routes, so the
* user is not fetched again on every page change. Refetching gave the page a
* new user object each time, and everything keyed on the user loaded again.
*
* No session (no token, or a 401) sends you to /login. A server or network
* error does not: the session is still good, so the page carries on with the
* user saved by the last successful load, and its own requests report errors.
*
* @returns [user, setUser] tuple - user object (or null) and setter function
*/
export function useAuth(): [any, (user: any) => void] {
const [user, setUser] = useState<any>(null);
const router = useRouter();
const pathname = usePathname();

useEffect(() => {
userService.get().then(u => {
if (!u) {
router.push('/login');
} else {
// // Check if user has access (accepted OR premium OR paid)
// const hasAccess = userService.checkUserAccess(u);

// // Don't redirect if already on invite-verify page (to avoid infinite loop)
// if (!hasAccess && pathname !== '/invite-verify') {
// // User doesn't have access - redirect to invite request page
// router.push('/invite-verify');
// } else {
// setUser(u);
// }
setUser(u);
}
}).catch(error => {
console.error('useAuth: Error fetching user:', error);
router.push('/login');
const saved = cachedUser();
if (saved) {
setUser(saved);
} else {
router.push('/login');
}
});
}, [router, pathname]);
}, [router]);

return [user, setUser];
}
Loading