From ee1ab2babcaa775c7d326846a13d749772d4ec49 Mon Sep 17 00:00:00 2001 From: Ezeanyim henry Date: Tue, 25 Feb 2025 14:14:46 +0100 Subject: [PATCH 1/2] fix: token expiration --- store/authStore.ts | 81 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/store/authStore.ts b/store/authStore.ts index 442691d..e014cd1 100644 --- a/store/authStore.ts +++ b/store/authStore.ts @@ -38,10 +38,10 @@ export const useAuthStore = create((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 }); @@ -98,16 +98,23 @@ export const useAuthStore = create((set) => ({ logout: async (): Promise => { 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 }); } }, @@ -148,17 +155,55 @@ export const useAuthStore = create((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 }); + + // Check if the token might be invalid + const token = Cookies.get('token'); + if (token) { + // Try to validate the token or clear it if we can't validate + try { + // Simple validation check - if this fails, we'll clear the token + const response = await fetch('/api/auth/validate-token', { + credentials: 'include', + method: 'GET' + }); + + if (!response.ok) { + Cookies.remove('token'); + set({ user: null }); + } + } catch (e) { + // If validation fails, clear token and user + Cookies.remove('token'); + set({ user: null }); + } + } } }, updateUser: async (userData: Partial): Promise => { @@ -177,6 +222,13 @@ export const useAuthStore = create((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(); @@ -197,6 +249,13 @@ export const useAuthStore = create((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 }); @@ -206,4 +265,4 @@ export const useAuthStore = create((set) => ({ throw error; } }, -})); +})); \ No newline at end of file From 09ec7248c694d780ca30ede6b29c818adf383d65 Mon Sep 17 00:00:00 2001 From: Ezeanyim henry Date: Tue, 25 Feb 2025 14:16:15 +0100 Subject: [PATCH 2/2] fix --- store/authStore.ts | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/store/authStore.ts b/store/authStore.ts index e014cd1..b779ee8 100644 --- a/store/authStore.ts +++ b/store/authStore.ts @@ -182,28 +182,8 @@ export const useAuthStore = create((set) => ({ console.error('Fetch user error:', error); // On any error, ensure loading is set to false to prevent indefinite loading set({ loading: false }); - - // Check if the token might be invalid - const token = Cookies.get('token'); - if (token) { - // Try to validate the token or clear it if we can't validate - try { - // Simple validation check - if this fails, we'll clear the token - const response = await fetch('/api/auth/validate-token', { - credentials: 'include', - method: 'GET' - }); - - if (!response.ok) { - Cookies.remove('token'); - set({ user: null }); - } - } catch (e) { - // If validation fails, clear token and user - Cookies.remove('token'); - set({ user: null }); - } - } + Cookies.remove('token'); + set({ user: null }); } }, updateUser: async (userData: Partial): Promise => {