Skip to content

Commit 535f385

Browse files
authored
Merge pull request #59 from OpenLake/persistence
fix: persist user session after refresh & resolve TypeScript errors
2 parents d541542 + a756be3 commit 535f385

1 file changed

Lines changed: 44 additions & 18 deletions

File tree

src/contexts/auth.tsx

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ import { toast } from 'react-hot-toast';
77
import { api } from '../utils/api';
88
import { FirebaseError } from 'firebase/app';
99
import { firebaseAuth } from '../utils/firebaseInit';
10+
import { User as FirebaseUser } from "firebase/auth";
11+
import { getIdToken } from "firebase/auth";
12+
13+
type User = {
14+
id: string;
15+
email: string | null;
16+
name?: string | null;
17+
picture?: string | null;
18+
};
1019

1120
const AuthContext = createContext({
1221
isAuthenticated: false,
@@ -19,7 +28,7 @@ const AuthContext = createContext({
1928
});
2029

2130
export const AuthProvider = ({ children }: any) => {
22-
const [user, setUser] = useState(null);
31+
const [user, setUser] = useState<User | null>(null);
2332
const [photoURL, setPhotoURL] = useState('');
2433
const [displayName, setDisplayName] = useState('');
2534
const [loading, setLoading] = useState(true);
@@ -74,11 +83,11 @@ export const AuthProvider = ({ children }: any) => {
7483
try {
7584
const { data } = await api.get('/api/auth/');
7685
const { result: user } = data;
77-
const { picture, name, isAdmin } = user;
7886
if (user) {
7987
setUser(user);
80-
setPhotoURL(picture);
81-
setDisplayName(name);
88+
setPhotoURL(user.picture);
89+
setDisplayName(user.name);
90+
return;
8291
}
8392
} catch (err) {
8493
if ((err as FirebaseError).code === 'auth/id-token-expired') {
@@ -88,21 +97,47 @@ export const AuthProvider = ({ children }: any) => {
8897
}
8998
}
9099
}
100+
const authUser = firebaseAuth.currentUser;
101+
if (authUser) {
102+
setUser({
103+
id: authUser.uid,
104+
email: authUser.email,
105+
name: authUser.displayName,
106+
picture: authUser.photoURL,
107+
});
108+
setPhotoURL(authUser.photoURL || '');
109+
setDisplayName(authUser.displayName || '');
110+
cookies.set('accessToken', authUser.accessToken || '', { expires: 60 });
111+
} else {
112+
setUser(null);
113+
}
91114
setLoading(false);
92115
}
93116

94117
// Effects
95118
useEffect(() => {
96-
const unsubscribe = onAuthStateChanged(firebaseAuth, (authUser) => {
119+
const unsubscribe = onAuthStateChanged(firebaseAuth, async (authUser: FirebaseUser | null) => { // ✅ Use firebaseAuth
97120
if (authUser) {
98-
loadUserFromCookie();
121+
const token = await authUser.getIdToken();
122+
123+
setUser({
124+
id: authUser.uid,
125+
email: authUser.email,
126+
name: authUser.displayName,
127+
picture: authUser.photoURL,
128+
});
129+
130+
setPhotoURL(authUser.photoURL || '');
131+
setDisplayName(authUser.displayName || '');
132+
133+
cookies.set('accessToken', token, { expires: 60 });
99134
} else {
100-
setLoading(false);
135+
loadUserFromCookie();
101136
}
102137
});
103-
138+
104139
return () => unsubscribe();
105-
}, []);
140+
}, []);
106141

107142
return (
108143
<AuthContext.Provider
@@ -121,15 +156,6 @@ export const AuthProvider = ({ children }: any) => {
121156
);
122157
};
123158

124-
// Define a type for the user object
125-
type User = {
126-
// Define the properties of your user object
127-
// For example:
128-
id: string;
129-
email: string;
130-
// ... other properties
131-
};
132-
133159
export const useAuth = () => {
134160
const authContext = useContext(AuthContext);
135161

0 commit comments

Comments
 (0)