From 717dd32543bd1ff7f173b59f89a1a397d45159f4 Mon Sep 17 00:00:00 2001 From: Patryk Date: Sun, 8 Jun 2025 09:21:04 +0200 Subject: [PATCH] refactor: clean up API_URL definition and improve error handling in authStore --- ArtisanConnect/api/notices.jsx | 61 ++++----- ArtisanConnect/store/authStore.jsx | 213 ++++++++++++++++------------- 2 files changed, 145 insertions(+), 129 deletions(-) diff --git a/ArtisanConnect/api/notices.jsx b/ArtisanConnect/api/notices.jsx index 3a7bb9a..7a3601e 100644 --- a/ArtisanConnect/api/notices.jsx +++ b/ArtisanConnect/api/notices.jsx @@ -2,21 +2,22 @@ import axios from "axios"; import FormData from "form-data"; import { useAuthStore } from "@/store/authStore"; -const API_URL = "https://hopp.zikor.pl/api/v1"; +// const API_URL = "https://testowe.zikor.pl/api/v1"; +const API_URL = "https://hopp.zikor.pl/api/v1"; export async function listNotices() { const { token } = useAuthStore.getState(); const headers = token ? { Authorization: `Bearer ${token}` } : {}; - const response = await fetch(`${API_URL}/notices/get/all`, { - headers: headers - }); - const data = await response.json(); - if (!response.ok) { - throw new Error(response.toString()); - } - return data; + const response = await fetch(`${API_URL}/notices/get/all`, { + headers: headers, + }); + const data = await response.json(); + if (!response.ok) { + throw new Error(response.toString()); + } + return data; } export async function getNoticeById(noticeId) { @@ -58,44 +59,40 @@ export async function getImageByNoticeId(noticeId) { const imageName = listResponse.data[0]; imageUrl = `${API_URL}/images/get/${imageName}`; - return imageUrl; - } catch (err) { - console.log(`Zdjęcie nie istnieje dla notice o id: ${noticeId}`); - imageUrl = "https://http.cat/404.jpg"; - return imageUrl; - } + return imageUrl; + } catch (err) { + console.log(`Zdjęcie nie istnieje dla notice o id: ${noticeId}`); + imageUrl = "https://http.cat/404.jpg"; + return imageUrl; + } } export async function getAllImagesByNoticeId(noticeId) { try { const listResponse = await axios.get(`${API_URL}/images/list/${noticeId}`); - if (listResponse.data && listResponse.data.length > 0) { - return listResponse.data.map(imageName => - `${API_URL}/images/get/${imageName}` - ); - } - - return ["https://http.cat/404.jpg"]; - } catch (err) { - if(err.response.status === 404) { - console.info(`Ogłoszenie o id: ${noticeId} nie posiada zdjęć.`); - return ["https://http.cat/404.jpg"]; - } - console.warn(`Nie udało się pobrać listy zdjęć dla ogłoszenia o id: ${noticeId}`, err); - return ["https://http.cat/404.jpg"]; + if (listResponse.data && listResponse.data.length > 0) { + return listResponse.data.map( + (imageName) => `${API_URL}/images/get/${imageName}` + ); } - // console.log(`Brak zdjęć dla ogłoszenia o id: ${noticeId}`); return ["https://http.cat/404.jpg"]; } catch (err) { - // console.log(`Błąd podczas pobierania listy zdjęć dla ogłoszenia o id: ${noticeId}`, err); + if (err.response.status === 404) { + // console.info(`Ogłoszenie o id: ${noticeId} nie posiada zdjęć.`); + return ["https://http.cat/404.jpg"]; + } + console.warn( + `Nie udało się pobrać listy zdjęć dla ogłoszenia o id: ${noticeId}`, + err + ); return ["https://http.cat/404.jpg"]; } } export const uploadImage = async (noticeId, imageUri) => { - const formData = new FormData(); + const formData = new FormData(); const filename = imageUri.split("/").pop(); diff --git a/ArtisanConnect/store/authStore.jsx b/ArtisanConnect/store/authStore.jsx index 4d81fa3..7aa6f41 100644 --- a/ArtisanConnect/store/authStore.jsx +++ b/ArtisanConnect/store/authStore.jsx @@ -7,113 +7,132 @@ const API_URL = "https://hopp.zikor.pl/api/v1"; export const useAuthStore = create( persist( - (set) => ({ - user_id: null, - token: null, - isLoading: false, - error: null, - - signIn: async (email, password) => { - set({ isLoading: true, error: null }); - try { - const response = await axios.post(`${API_URL}/auth/login`, { - email, - password, - }); - - const user_id = response.data.user_id; - const token = response.data.token; - set({ user_id: user_id, token: token, isLoading: false }); - - axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; - } catch (error) { - set({ - error: error.response?.data?.message || error.message, - isLoading: false, - }); - throw error; - } - }, - - signUp: async (userData) => { - set({ isLoading: true, error: null }); - try { - const response = await axios.post( - `${API_URL}/auth/register`, - userData, - { - headers: { "Content-Type": "application/json" }, + (set) => { + // Dodaj interceptor tylko raz + if (!axios.interceptors.response.handlers.length) { + axios.interceptors.response.use( + (response) => response, + (error) => { + if ( + (error.response && error.response.status === 401) || + error.response.status === 403 + ) { + set({ user_id: null, token: null, isLoading: false }); + delete axios.defaults.headers.common["Authorization"]; } - ); + return Promise.reject(error); + } + ); + } - const user_id = response.data.user_id; - const token = response.data.token; - set({ user_id: user_id, token: token, isLoading: false }); + return { + user_id: null, + token: null, + isLoading: false, + error: null, - axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; - } catch (error) { - set({ - error: error.response?.data?.message || error.message, - isLoading: false, - }); - throw error; - } - }, + signIn: async (email, password) => { + set({ isLoading: true, error: null }); + try { + const response = await axios.post(`${API_URL}/auth/login`, { + email, + password, + }); - signInWithGoogle: async (googleToken) => { - set({ isLoading: true, error: null }); - try { - const response = await axios.post( - `${API_URL}/auth/google`, - { googleToken: googleToken }, - { - headers: { "Content-Type": "application/json" }, - } - ); - const user_id = response.data.user_id; - const token = response.data.token; - set({ user_id: user_id, token: token, isLoading: false }); + const user_id = response.data.user_id; + const token = response.data.token; + set({ user_id: user_id, token: token, isLoading: false }); - axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; - } catch (error) { - set({ - error: error.response?.data?.message || error.message, - isLoading: false, - }); - throw error; - } - }, + axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + } catch (error) { + set({ + error: error.response?.data?.message || error.message, + isLoading: false, + }); + throw error; + } + }, - signOut: async () => { - try { - await axios.post(`${API_URL}/auth/logout`); - } catch (error) { - console.error("Logout error:", error); - } finally { - delete axios.defaults.headers.common["Authorization"]; - set({ user_id: null, token: null }); - } - }, + signUp: async (userData) => { + set({ isLoading: true, error: null }); + try { + const response = await axios.post( + `${API_URL}/auth/register`, + userData, + { + headers: { "Content-Type": "application/json" }, + } + ); - checkAuth: async () => { - const { token } = useAuthStore.getState(); - if (!token) return null; + const user_id = response.data.user_id; + const token = response.data.token; + set({ user_id: user_id, token: token, isLoading: false }); - set({ isLoading: true }); - try { - axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + } catch (error) { + set({ + error: error.response?.data?.message || error.message, + isLoading: false, + }); + throw error; + } + }, - const response = await axios.get(`${API_URL}/auth/me`); + signInWithGoogle: async (googleToken) => { + set({ isLoading: true, error: null }); + try { + const response = await axios.post( + `${API_URL}/auth/google`, + { googleToken: googleToken }, + { + headers: { "Content-Type": "application/json" }, + } + ); + const user_id = response.data.user_id; + const token = response.data.token; + set({ user_id: user_id, token: token, isLoading: false }); - set({ user_id: response.data, isLoading: false }); - return response.data; - } catch (error) { - delete axios.defaults.headers.common["Authorization"]; - set({ user_id: null, token: null, isLoading: false }); - return null; - } - }, - }), + axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + } catch (error) { + set({ + error: error.response?.data?.message || error.message, + isLoading: false, + }); + throw error; + } + }, + + signOut: async () => { + try { + await axios.post(`${API_URL}/auth/logout`); + } catch (error) { + console.error("Logout error:", error); + } finally { + delete axios.defaults.headers.common["Authorization"]; + set({ user_id: null, token: null }); + } + }, + + checkAuth: async () => { + const { token } = useAuthStore.getState(); + if (!token) return null; + + set({ isLoading: true }); + try { + axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + + const response = await axios.get(`${API_URL}/auth/me`); + + set({ user_id: response.data, isLoading: false }); + return response.data; + } catch (error) { + delete axios.defaults.headers.common["Authorization"]; + set({ user_id: null, token: null, isLoading: false }); + return null; + } + }, + }; + }, { name: "auth-storage", storage: createJSONStorage(() => AsyncStorage),