Files
Choreus/frontend/src/stores/auth.js
T
2026-08-09 21:45:06 -04:00

107 lines
2.7 KiB
JavaScript

import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { apiFetch } from '../services/api';
export const useAuthStore = defineStore('auth', () => {
const user = ref(JSON.parse(localStorage.getItem('choreus_user') || 'null'));
const token = ref(localStorage.getItem('choreus_token') || null);
const loading = ref(false);
const error = ref(null);
const isAuthenticated = computed(() => !!token.value && !!user.value);
const isAdmin = computed(() => user.value?.role === 'admin');
async function demoLogin(email) {
loading.value = true;
error.value = null;
try {
const data = await apiFetch('/auth/demo-login', {
method: 'POST',
body: JSON.stringify({ email })
});
setAuthData(data.access_token, data.user);
return data.user;
} catch (err) {
error.value = err.message;
throw err;
} finally {
loading.value = false;
}
}
async function googleLogin(credential, payload = {}) {
loading.value = true;
error.value = null;
try {
const data = await apiFetch('/auth/google', {
method: 'POST',
body: JSON.stringify({ credential, ...payload })
});
setAuthData(data.access_token, data.user);
return data.user;
} catch (err) {
error.value = err.message;
throw err;
} finally {
loading.value = false;
}
}
async function fetchCurrentUser() {
if (!token.value) return null;
try {
const userData = await apiFetch('/auth/me');
user.value = userData;
localStorage.setItem('choreus_user', JSON.stringify(userData));
return userData;
} catch (err) {
logout();
return null;
}
}
async function updateProfile(updates) {
if (!user.value) return;
try {
const updatedUser = await apiFetch(`/users/${user.value.id}`, {
method: 'PATCH',
body: JSON.stringify(updates)
});
user.value = updatedUser;
localStorage.setItem('choreus_user', JSON.stringify(updatedUser));
return updatedUser;
} catch (err) {
error.value = err.message;
throw err;
}
}
function setAuthData(accessToken, userData) {
token.value = accessToken;
user.value = userData;
localStorage.setItem('choreus_token', accessToken);
localStorage.setItem('choreus_user', JSON.stringify(userData));
}
function logout() {
token.value = null;
user.value = null;
localStorage.removeItem('choreus_token');
localStorage.removeItem('choreus_user');
}
return {
user,
token,
loading,
error,
isAuthenticated,
isAdmin,
demoLogin,
googleLogin,
fetchCurrentUser,
updateProfile,
logout
};
});