import { ActionTree, MutationTree, GetterTree } from 'vuex'; import { Task } from 'taskwarrior-lib'; import { getAccessorType } from 'typed-vuex'; export const state = () => ({ tasks: [] as Task[], snackbar: false, notification: { color: '', text: '' }, settings: { dark: false, autoRefresh: '5' // in minutes } }); export type RootState = ReturnType; export const getters: GetterTree = { projects: state => state.tasks.map(task => task.project).filter(p => p !== undefined), tags: state => state.tasks.reduce((tags: string[], task) => { return task.tags ? tags.concat(task.tags) : tags; }, []) }; export const mutations: MutationTree = { setSettings(state, settings) { state.settings = settings; }, setTasks(state, tasks: Task[]) { state.tasks = tasks; }, setNotification(state, notification) { state.notification = notification; // Show notification state.snackbar = true; }, setSnackbar(state, value) { state.snackbar = value; } }; export const actions: ActionTree = { fetchSettings(context) { const settings = localStorage.getItem('settings'); if (settings) { context.commit('setSettings', JSON.parse(settings)); } }, updateSettings(context, settings) { context.commit('setSettings', settings); localStorage.setItem('settings', JSON.stringify(settings)); }, async fetchTasks(context) { const tasks: Task[] = await this.$axios.$get('/api/tasks'); context.commit('setTasks', tasks); }, async deleteTasks(context, tasks: Task[]) { await this.$axios.$delete('/api/tasks', { params: { tasks: tasks.map(task => task.uuid) } }); // Refresh await context.dispatch('fetchTasks'); }, async updateTasks(context, tasks: Task[]) { await this.$axios.$put('/api/tasks', { tasks }); // Refresh await context.dispatch('fetchTasks'); } }; export const accessorType = getAccessorType({ state, mutations, actions });