mitlist/fe/src/stores/auth.ts
2025-05-08 15:02:09 +02:00

106 lines
2.6 KiB
TypeScript

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<string | null>(localStorage.getItem('token'));
const refreshToken = ref<string | null>(localStorage.getItem('refresh_token'));
const user = ref<AuthState['user']>(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,
};
});