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();
 | 
						|
        },
 | 
						|
    }
 | 
						|
}) |