import { defineStore } from 'pinia'; import { ref, computed } from 'vue'; import { api } from 'boot/axios'; interface AuthState { accessToken: string | null; refreshToken: string | null; user: { email: string; name: string; } | null; } export const useAuthStore = defineStore('auth', () => { // State const accessToken = ref(localStorage.getItem('token')); const refreshToken = ref(localStorage.getItem('refresh_token')); const user = ref(null); // Getters const isAuthenticated = computed(() => !!accessToken.value); const getUser = computed(() => user.value); // Actions const setTokens = (tokens: { access_token: string; refresh_token: string }) => { accessToken.value = tokens.access_token; refreshToken.value = tokens.refresh_token; localStorage.setItem('token', tokens.access_token); localStorage.setItem('refresh_token', tokens.refresh_token); }; const clearTokens = () => { accessToken.value = null; refreshToken.value = null; user.value = null; localStorage.removeItem('token'); localStorage.removeItem('refresh_token'); }; const setUser = (userData: AuthState['user']) => { user.value = userData; }; const login = async (email: string, password: string) => { const formData = new FormData(); formData.append('username', email); formData.append('password', password); const response = await api.post('/auth/login', formData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const { access_token, refresh_token } = response.data; setTokens({ access_token, refresh_token }); return response.data; }; const signup = async (userData: { name: string; email: string; password: string }) => { const response = await api.post('/auth/signup', userData); return response.data; }; const logout = () => { clearTokens(); }; const refreshAccessToken = async () => { if (!refreshToken.value) { throw new Error('No refresh token available'); } try { const response = await api.post('/auth/refresh', { refresh_token: refreshToken.value, }); const { access_token, refresh_token } = response.data; setTokens({ access_token, refresh_token }); return response.data; } catch (error) { clearTokens(); throw error; } }; return { // State accessToken, refreshToken, user, // Getters isAuthenticated, getUser, // Actions setTokens, clearTokens, setUser, login, signup, logout, refreshAccessToken, }; });