first prototype commit
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
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
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user