106 lines
2.6 KiB
TypeScript
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,
|
|
};
|
|
});
|