Skip to content

Commit 256523f

Browse files
committed
feat(auth): add AuthProvider and PrivateRoute wrapper
1 parent f2c1182 commit 256523f

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

src/ui/auth/AuthProvider.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import React, { createContext, useContext, useState, useEffect } from 'react';
2+
import { getUserInfo } from '../services/auth';
3+
4+
// Interface for when we convert to TypeScript
5+
// interface AuthContextType {
6+
// user: any;
7+
// setUser: (user: any) => void;
8+
// refreshUser: () => Promise<void>;
9+
// isLoading: boolean;
10+
// }
11+
12+
const AuthContext = createContext(undefined);
13+
14+
export const AuthProvider = ({ children }) => {
15+
const [user, setUser] = useState(null);
16+
const [isLoading, setIsLoading] = useState(true);
17+
18+
const refreshUser = async () => {
19+
console.log('Refreshing user');
20+
try {
21+
const data = await getUserInfo();
22+
setUser(data);
23+
console.log('User refreshed:', data);
24+
} catch (error) {
25+
console.error('Error refreshing user:', error);
26+
setUser(null);
27+
} finally {
28+
setIsLoading(false);
29+
}
30+
};
31+
32+
useEffect(() => {
33+
refreshUser();
34+
}, []);
35+
36+
return (
37+
<AuthContext.Provider value={{ user, setUser, refreshUser, isLoading }}>
38+
{children}
39+
</AuthContext.Provider>
40+
);
41+
};
42+
43+
export const useAuth = () => {
44+
const context = useContext(AuthContext);
45+
if (!context) {
46+
throw new Error('useAuth must be used within an AuthProvider');
47+
}
48+
return context;
49+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from 'react';
2+
import { Navigate } from 'react-router-dom';
3+
import { useAuth } from '../../auth/AuthProvider';
4+
5+
const PrivateRoute = ({ component: Component, adminOnly = false }) => {
6+
const { user, isLoading } = useAuth();
7+
console.debug('PrivateRoute', { user, isLoading, adminOnly });
8+
9+
if (isLoading) {
10+
console.debug('Auth is loading, waiting');
11+
return <div>Loading...</div>; // TODO: Add loading spinner
12+
}
13+
14+
if (!user) {
15+
console.debug('User not logged in, redirecting to login page');
16+
return <Navigate to="/login" />;
17+
}
18+
19+
if (adminOnly && !user.isAdmin) {
20+
console.debug('User is not an admin, redirecting to not authorized page');
21+
return <Navigate to="/not-authorized" />;
22+
}
23+
24+
return <Component />;
25+
};
26+
27+
export default PrivateRoute;

0 commit comments

Comments
 (0)