import {create} from "zustand"; import {createJSONStorage, persist} from "zustand/middleware"; import AsyncStorage from "@react-native-async-storage/async-storage"; import axios from "axios"; const API_URL = "https://hopp.zikor.pl/api/v1"; let interceptorInitialized = false; export const useAuthStore = create( persist( (set, get) => { if (!interceptorInitialized.current) { 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); } ); interceptorInitialized = true; } return { 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"}, } ); 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; } }, 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}); 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), } ) );