193 lines
6.3 KiB
JavaScript
193 lines
6.3 KiB
JavaScript
import { createStore, createLogger } from 'vuex'
|
|
import { LOGIN, LOGIN_SUCCESS, LOGOUT, TITLE } from './mutation-types'
|
|
|
|
const store = createStore({
|
|
state () {
|
|
return {
|
|
Session: {
|
|
Token: null,
|
|
User: null
|
|
},
|
|
ShowMenu: null,
|
|
Budgets: {},
|
|
CurrentBudgetID: null,
|
|
Accounts: [],
|
|
CurrentAccountID: null,
|
|
Categories: [],
|
|
Transactions: [],
|
|
Assignments: []
|
|
}
|
|
},
|
|
mutations: {
|
|
toggleMenu(state) {
|
|
state.ShowMenu = !state.ShowMenu;
|
|
},
|
|
initializeStore(state) {
|
|
const store = localStorage.getItem("store");
|
|
if(store){
|
|
this.replaceState(
|
|
Object.assign(state, JSON.parse(store))
|
|
);
|
|
}
|
|
},
|
|
[TITLE](state, title) {
|
|
document.title = "Budgeteer - " + title;
|
|
},
|
|
[LOGIN_SUCCESS](state, result) {
|
|
state.Session = {
|
|
User: result.User,
|
|
Token: result.Token
|
|
};
|
|
for (const budget of result.Budgets) {
|
|
state.Budgets[budget.ID] = budget
|
|
}
|
|
},
|
|
setBudgets (state, budgets) {
|
|
state.Budgets = budgets;
|
|
},
|
|
addBudget(state, budget) {
|
|
state.Budgets.push(budget);
|
|
},
|
|
[LOGOUT](state, token) {
|
|
state.Session = { Token: null, User: null }
|
|
},
|
|
setCurrentBudgetID(state, budgetid) {
|
|
state.CurrentBudgetID = budgetid;
|
|
},
|
|
setCurrentAccountID(state, accountid) {
|
|
state.CurrentAccountID = accountid;
|
|
},
|
|
setAccounts (state, accounts) {
|
|
state.Accounts = accounts;
|
|
},
|
|
setTransactions(state, transactions){
|
|
state.Transactions = transactions;
|
|
}
|
|
},
|
|
actions: {
|
|
[LOGIN]({state, commit}, login) {
|
|
return fetch("/api/v1/user/login", {method: "POST", body: JSON.stringify(login)})
|
|
.then(x => x.json())
|
|
.then(x => {
|
|
commit(LOGIN_SUCCESS, x);
|
|
})
|
|
},
|
|
YNAB({getters, dispatch}, formData) {
|
|
return dispatch("POST", {path: "/budget/"+getters.CurrentBudget.ID+"/import/ynab", body: formData});
|
|
},
|
|
GET({getters}, {path}){
|
|
return fetch("/api/v1" + path, {
|
|
headers: getters.AuthHeaders,
|
|
})
|
|
},
|
|
POST({getters}, {path, body}){
|
|
return fetch("/api/v1" + path, {
|
|
method: "POST",
|
|
headers: getters.AuthHeaders,
|
|
body: body,
|
|
})
|
|
},
|
|
/*async fetchDashboard ({state, commit, rootState}) {
|
|
const response = await fetch("/api/v1/dashboard", {
|
|
headers: {
|
|
'Authorization': 'Bearer ' + rootState.Session.Token
|
|
}
|
|
})
|
|
const data = await response.json();
|
|
commit("setBudgets", data.Budgets);
|
|
},*/
|
|
async newBudget ({state, commit, dispatch, rootState}, budgetName) {
|
|
const result = await dispatch("POST", {
|
|
path: "/budget/new",
|
|
body: JSON.stringify({name: budgetName})});
|
|
const response = await result.json();
|
|
commit("addBudget", response)
|
|
},
|
|
async setCurrentBudget({state, commit, dispatch, rootState}, budgetid) {
|
|
commit("setCurrentBudgetID", budgetid);
|
|
|
|
if (budgetid == null)
|
|
return
|
|
|
|
await dispatch("fetchBudget", budgetid)
|
|
},
|
|
async fetchBudget ({state, commit, dispatch, rootState}, budgetid) {
|
|
const result = await dispatch("GET", {path: "/budget/" + budgetid});
|
|
const response = await result.json();
|
|
return commit("setAccounts", response.Accounts);
|
|
},
|
|
async fetchAccount ({state, commit, rootState}, accountid) {
|
|
const result = await fetch("/api/v1/account/" + accountid + "/transactions", {
|
|
headers: {
|
|
'Authorization': 'Bearer ' + rootState.Session.Token
|
|
}
|
|
});
|
|
const response = await result.json();
|
|
commit("setTransactions", response.Transactions);
|
|
},
|
|
async setCurrentAccount({state, commit, dispatch, getters}, {budgetid, accountid}) {
|
|
if (budgetid == null)
|
|
return
|
|
|
|
await dispatch("fetchBudget", budgetid);
|
|
commit("setCurrentAccountID", accountid);
|
|
if (accountid == null)
|
|
return
|
|
|
|
commit(TITLE, getters.CurrentAccount.Name);
|
|
await dispatch("fetchAccount", accountid)
|
|
}
|
|
},
|
|
getters: {
|
|
Budgets(state) {
|
|
return state.Budgets || [];
|
|
},
|
|
AuthHeaders(state) {
|
|
return {
|
|
'Authorization': 'Bearer ' + state.Session.Token
|
|
}
|
|
},
|
|
CurrentBudget(state) {
|
|
if(state.CurrentBudgetID == null)
|
|
return {};
|
|
|
|
const budgets = state.Budgets.filter(x => x.ID == state.CurrentBudgetID);
|
|
if(budgets.length > 0)
|
|
return budgets[0];
|
|
|
|
return {};
|
|
},
|
|
Accounts(state) {
|
|
return state.Accounts || [];
|
|
},
|
|
CurrentAccount(state) {
|
|
if(state.CurrentAccountID == null)
|
|
return {name: "Not found"};
|
|
return state.Accounts.filter(x => x.ID == state.CurrentAccountID)[0];
|
|
},
|
|
OnBudgetAccounts(state) {
|
|
return (state.Accounts || []).filter(x => x.OnBudget);
|
|
},
|
|
OffBudgetAccounts(state) {
|
|
return (state.Accounts || []).filter(x => !x.OnBudget);
|
|
},
|
|
Transactions(state) {
|
|
return (state.Transactions || []);
|
|
}
|
|
},
|
|
plugins: [createLogger()]
|
|
})
|
|
|
|
store.subscribe((mutation, state) => {
|
|
let persistedState = {
|
|
Session: state.Session,
|
|
Budgets: state.Budgets,
|
|
Accounts: state.Accounts,
|
|
CurrentBudgetID: state.CurrentBudgetID,
|
|
CurrentAccountID: state.CurrentAccountID,
|
|
ShowMenu: state.ShowMenu
|
|
}
|
|
localStorage.setItem("store", JSON.stringify(persistedState));
|
|
})
|
|
|
|
export default store |