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"; export const useAuthStore = create( persist( (set, get) => { 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: null, token: null, isLoading: false }); delete axios.defaults.headers.common["Authorization"]; } return Promise.reject(error); } ); } return { user: 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 = response.data.user; const token = response.data.token; set({ user, 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 = response.data.user; const token = response.data.token; set({ user, token, isLoading: false }); axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; return user; } 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`, { token: googleToken, }); const { user, token } = response.data; set({ user, token, isLoading: false }); axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; return user; } catch (error) { set({ error: error.response?.data?.message || error.message, isLoading: false, }); throw error; } }, signOut: async () => { try { const { token } = get(); const headers = token ? { Authorization: `Bearer ${token}` } : {}; await axios.post(`${API_URL}/auth/logout`, {}, { headers }); } catch (error) { // console.error("Logout error:", error); } finally { delete axios.defaults.headers.common["Authorization"]; set({ user: null, token: null, isLoading: false }); } }, checkAuth: async () => { const { token } = get(); 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: response.data, isLoading: false }); return response.data; } catch (error) { delete axios.defaults.headers.common["Authorization"]; set({ user: null, token: null, isLoading: false }); return null; } }, }; }, { name: "auth-storage", storage: createJSONStorage(() => AsyncStorage), } ) );