86 lines
2.3 KiB
JavaScript
86 lines
2.3 KiB
JavaScript
import { createStore } from 'vuex';
|
|
import VuexPersistence from 'vuex-persist';
|
|
|
|
const vuexLocal = new VuexPersistence({
|
|
storage: window.localStorage,
|
|
});
|
|
|
|
export default createStore({
|
|
state: {
|
|
categories: [],
|
|
tasks: [],
|
|
midnightReset: false,
|
|
darkTheme: true,
|
|
},
|
|
mutations: {
|
|
addCategory(state, category) {
|
|
if (category && !state.categories.includes(category)) {
|
|
state.categories = [...state.categories, category];
|
|
}
|
|
},
|
|
removeCategory(state, category) {
|
|
state.categories = state.categories.filter((element) => element !== category);
|
|
state.tasks = state.tasks.map((task) => {
|
|
const newTask = task;
|
|
if (newTask.category === category) newTask.category = undefined;
|
|
return newTask;
|
|
});
|
|
},
|
|
assignCategory(state, { name, category }) {
|
|
state.tasks = state.tasks.map((task) => {
|
|
const newTask = task;
|
|
if (newTask.name === name) {
|
|
newTask.category = category;
|
|
}
|
|
return newTask;
|
|
});
|
|
},
|
|
|
|
addTask(state, name) {
|
|
if (name) {
|
|
const task = {
|
|
name,
|
|
startedAt: undefined,
|
|
running: false,
|
|
totalTime: 0,
|
|
category: undefined,
|
|
};
|
|
state.tasks = [...state.tasks, task];
|
|
}
|
|
},
|
|
removeTask(state, name) {
|
|
state.tasks = state.tasks.filter((task) => task.name !== name);
|
|
},
|
|
startTask(state, name) {
|
|
state.tasks = state.tasks.map((task) => {
|
|
const newTask = task;
|
|
if (newTask.name === name) {
|
|
newTask.running = true;
|
|
newTask.startedAt = Date.now();
|
|
} else if (newTask.running) {
|
|
newTask.running = false;
|
|
newTask.totalTime += Date.now() - newTask.startedAt;
|
|
newTask.startedAt = undefined;
|
|
}
|
|
return newTask;
|
|
});
|
|
},
|
|
stopTask(state, name) {
|
|
state.tasks = state.tasks.map((task) => {
|
|
const newTask = task;
|
|
if (newTask.name === name) {
|
|
newTask.running = false;
|
|
newTask.totalTime += Date.now() - newTask.startedAt;
|
|
newTask.startedAt = undefined;
|
|
}
|
|
return newTask;
|
|
});
|
|
},
|
|
|
|
setMidnightReset(state, value) {
|
|
state.midnightReset = !!value;
|
|
},
|
|
},
|
|
plugins: [vuexLocal.plugin],
|
|
});
|