import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import AsyncStorage from "@react-native-async-storage/async-storage"; import axios from "axios"; import { router } from "expo-router"; 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"]; router.replace("/login"); } 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 () => { const { token } = get(); const headers = token ? { Authorization: `Bearer ${token}` } : {}; try { await axios.post( `${API_URL}/auth/logout`, {}, { headers: headers, } ); } catch (error) { console.error("Logout error:", error); } finally { delete axios.defaults.headers.common["Authorization"]; set({ user_id: null, token: null }); router.replace("/login"); } }, }; }, { name: "auth-storage", storage: createJSONStorage(() => AsyncStorage), } ) );