61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { StorageSerializers, useStorage } from '@vueuse/core';
|
|
import { defineStore } from 'pinia'
|
|
import { POST } from '../api';
|
|
|
|
interface State {
|
|
Session: Session | null
|
|
Budgets: Map<string, Budget>,
|
|
}
|
|
|
|
interface Session {
|
|
Token: string
|
|
User: string
|
|
}
|
|
|
|
export interface Budget {
|
|
ID: string
|
|
Name: string
|
|
AvailableBalance: number
|
|
}
|
|
|
|
export const useSessionStore = defineStore('session', {
|
|
state: () => ({
|
|
Session: useStorage<Session | null>('session', null, undefined, { serializer: StorageSerializers.object }),
|
|
Budgets: useStorage<Map<string, Budget>>('budgets', new Map<string, Budget>(), undefined, { serializer: StorageSerializers.map }),
|
|
}),
|
|
getters: {
|
|
BudgetsList: (state) => [ ...state.Budgets.values() ],
|
|
AuthHeaders: (state) => ({'Authorization': 'Bearer ' + state.Session?.Token}),
|
|
LoggedIn: (state) => state.Session != null,
|
|
},
|
|
actions: {
|
|
setTitle(title : string) {
|
|
document.title = "Budgeteer - " + title;
|
|
},
|
|
loginSuccess(x : any) {
|
|
this.Session = {
|
|
User: x.User,
|
|
Token: x.Token,
|
|
}
|
|
for (const budget of x.Budgets) {
|
|
this.Budgets.set(budget.ID, budget);
|
|
}
|
|
},
|
|
async login(login: any) {
|
|
const response = await POST("/user/login", JSON.stringify(login));
|
|
const result = await response.json();
|
|
this.loginSuccess(result);
|
|
return result;
|
|
},
|
|
async register(login : any) {
|
|
const response = await POST("/user/register", JSON.stringify(login));
|
|
const result = await response.json();
|
|
this.loginSuccess(result);
|
|
return result;
|
|
},
|
|
logout() {
|
|
this.Session = null;
|
|
this.Budgets.clear();
|
|
},
|
|
}
|
|
}) |