Skip to content

Commit

Permalink
Merge pull request #85 from GridApe/oracus/fix/authTokenHandler
Browse files Browse the repository at this point in the history
Oracus/fix/auth token handler
  • Loading branch information
ezeanyimhenry authored Feb 25, 2025
2 parents 18bc48f + 09ec724 commit 40f2459
Showing 1 changed file with 50 additions and 11 deletions.
61 changes: 50 additions & 11 deletions store/authStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ export const useAuthStore = create<AuthState>((set) => ({
});

const responseData = await response.json();

if (response.ok) {
// const responseData = await response.json();

Cookies.set('token', responseData.data.access_token);
await useAuthStore.getState().fetchCurrentUser();
set({ loading: false });
Expand Down Expand Up @@ -98,16 +98,23 @@ export const useAuthStore = create<AuthState>((set) => ({

logout: async (): Promise<void> => {
try {
const response: Response = await fetch('/api/auth/logout', {
method: 'POST',
});

if (!response.ok) throw new Error('Logout failed');
Cookies.remove('token');
set({ user: null });
// Try to logout on the server, but don't fail if it doesn't work
try {
await fetch('/api/auth/logout', {
method: 'POST',
});
} catch (e) {
console.error('Server logout failed, continuing with client logout');
}

// Always clear local state and cookies regardless of server response
Cookies.remove('token');
set({ user: null });
} catch (error) {
console.error('Logout error:', error);
throw error;
// Still clear cookies and user state even if there was an error
Cookies.remove('token');
set({ user: null });
}
},

Expand Down Expand Up @@ -148,17 +155,35 @@ export const useAuthStore = create<AuthState>((set) => ({
try {
set({ loading: true });

const token = Cookies.get('token');

// If no token exists, clear user state and return early
if (!token) {
set({ user: null, loading: false });
return;
}

const response: Response = await fetch('/api/user/profile', {
credentials: 'include',
});

if (response.status === 401) {
// If unauthorized (expired token), clear user state and token
Cookies.remove('token');
set({ user: null, loading: false });
return;
}

if (!response.ok) throw new Error('Failed to fetch user');

const responseData: { data: { user: UserTypes } } = await response.json();
set({ user: responseData.data.user, loading: false });
} catch (error) {
console.error('Fetch user error:', error);
// On any error, ensure loading is set to false to prevent indefinite loading
set({ loading: false });
Cookies.remove('token');
set({ user: null });
}
},
updateUser: async (userData: Partial<UserTypes>): Promise<void> => {
Expand All @@ -177,6 +202,13 @@ export const useAuthStore = create<AuthState>((set) => ({
body: JSON.stringify(userData),
});

if (response.status === 401) {
// Handle expired token
Cookies.remove('token');
set({ user: null });
throw new Error('Your session has expired. Please log in again.');
}

if (!response.ok) throw new Error('Failed to update user');

const responseData: { data: { user: UserTypes } } = await response.json();
Expand All @@ -197,6 +229,13 @@ export const useAuthStore = create<AuthState>((set) => ({
body: JSON.stringify({ current_password: currentPassword, new_password: newPassword }),
});

if (response.status === 401) {
// Handle expired token
Cookies.remove('token');
set({ user: null, loading: false });
throw new Error('Your session has expired. Please log in again.');
}

if (!response.ok) throw new Error('Failed to update password');

set({ loading: false });
Expand All @@ -206,4 +245,4 @@ export const useAuthStore = create<AuthState>((set) => ({
throw error;
}
},
}));
}));

0 comments on commit 40f2459

Please sign in to comment.