109 lines
3.4 KiB
TypeScript
109 lines
3.4 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import { useRouter } from 'vue-router';
|
|
import { client } from '@/api/rpcclient';
|
|
import { ref } from 'vue';
|
|
|
|
interface User {
|
|
id: string;
|
|
username: string;
|
|
email: string;
|
|
name: string;
|
|
}
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
const user = ref<User | null>(null);
|
|
const router = useRouter();
|
|
const loading = ref(false);
|
|
const error = ref<string | null>(null);
|
|
const csrfToken = ref<string | null>(null);
|
|
const initialized = ref(false);
|
|
|
|
// Check auth status on init (reads from cookie)
|
|
async function init() {
|
|
if (initialized.value) return;
|
|
|
|
try {
|
|
const response = await client.checkAuth();
|
|
if (response.authenticated && response.user) {
|
|
user.value = response.user;
|
|
// Get CSRF token if authenticated
|
|
try {
|
|
const csrfResponse = await client.getCSRFToken();
|
|
csrfToken.value = csrfResponse.csrfToken;
|
|
} catch (e) {
|
|
// CSRF token might not be available yet
|
|
}
|
|
}
|
|
} catch (e) {
|
|
// Not authenticated, that's fine
|
|
} finally {
|
|
initialized.value = true;
|
|
}
|
|
}
|
|
|
|
async function login(username: string, password: string) {
|
|
loading.value = true;
|
|
error.value = null;
|
|
return client.login(username, password).then((response) => {
|
|
user.value = response.user;
|
|
csrfToken.value = response.csrfToken;
|
|
router.push('/');
|
|
}).catch((e: any) => {
|
|
// error.value = e.message || 'Login failed';
|
|
error.value = 'Login failed';
|
|
throw e;
|
|
}).finally(() => {
|
|
loading.value = false;
|
|
});
|
|
// try {
|
|
// const response = await client.login(username, password);
|
|
// user.value = response.user;
|
|
// csrfToken.value = response.csrfToken;
|
|
// router.push('/');
|
|
// } catch (e: any) {
|
|
// // console.log(JSON.parse(e.message))
|
|
// // error.value = e.message || 'Login failed';
|
|
// error.value = 'Login failed';
|
|
// throw e;
|
|
// } finally {
|
|
// loading.value = false;
|
|
// }
|
|
}
|
|
|
|
async function register(username: string, email: string, password: string) {
|
|
loading.value = true;
|
|
error.value = null;
|
|
try {
|
|
const response = await client.register({ username, email, password });
|
|
user.value = response.user;
|
|
csrfToken.value = response.csrfToken;
|
|
router.push('/');
|
|
} catch (e: any) {
|
|
// error.value = e.message || 'Registration failed';
|
|
error.value = 'Registration failed';
|
|
throw e;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function logout() {
|
|
try {
|
|
await client.logout();
|
|
} catch (e) {
|
|
// Ignore errors on logout
|
|
}
|
|
user.value = null;
|
|
csrfToken.value = null;
|
|
router.push('/');
|
|
}
|
|
|
|
return { user, loading, error, csrfToken, initialized, init, login, register, logout, $reset: () => {
|
|
user.value = null;
|
|
loading.value = false;
|
|
error.value = null;
|
|
csrfToken.value = null;
|
|
initialized.value = false;
|
|
} };
|
|
});
|