import { TagsService, ArticlesService } from "@/common/api.service"; import { FETCH_ARTICLES, FETCH_TAGS } from "./actions.type"; import { FETCH_START, FETCH_END, SET_TAGS, UPDATE_ARTICLE_IN_LIST } from "./mutations.type"; const state = { tags: [], articles: [], isLoading: true, articlesCount: 0 }; const getters = { articlesCount(state) { return state.articlesCount; }, articles(state) { return state.articles; }, isLoading(state) { return state.isLoading; }, tags(state) { return state.tags; } }; const actions = { [FETCH_ARTICLES]({ commit }, params) { commit(FETCH_START); return ArticlesService.query(params.type, params.filters) .then(({ data }) => { commit(FETCH_END, data); }) .catch(error => { throw new Error(error); }); }, [FETCH_TAGS]({ commit }) { return TagsService.get() .then(({ data }) => { commit(SET_TAGS, data.tags); }) .catch(error => { throw new Error(error); }); } }; /* eslint no-param-reassign: ["error", { "props": false }] */ const mutations = { [FETCH_START](state) { state.isLoading = true; }, [FETCH_END](state, { articles, articlesCount }) { state.articles = articles; state.articlesCount = articlesCount; state.isLoading = false; }, [SET_TAGS](state, tags) { state.tags = tags; }, [UPDATE_ARTICLE_IN_LIST](state, data) { state.articles = state.articles.map(article => { if (article.slug !== data.slug) { return article; } // We could just return data, but it seems dangerous to // mix the results of different api calls, so we // protect ourselves by copying the information. article.favorited = data.favorited; article.favoritesCount = data.favoritesCount; return article; }); } }; export default { state, getters, actions, mutations };