import Vuex from 'vuex' import md5 from 'md5' import slugify from 'slugify' import db from '~/plugins/firestore' import { saveUserData, clearUserData } from '~/utils' const createStore = () => { return new Vuex.Store({ state: { headlines: [], feed: [], loading: false, category: '', token: null, country: 'us', user: null }, mutations: { setHeadLines (state, headlines) { state.headlines = headlines }, setLoading (state, loading) { state.loading = loading }, setCategory (state, category) { state.category = category }, setCountry (state, country) { state.country = country }, setToken (state, token) { state.token = token }, setUser (state, user) { state.user = user }, setFeed (state, headlines) { state.feed = headlines }, clearToken: state => (state.token = null), clearUser: state => (state.user = null), clearFeed: state => (state.feed = []) }, actions: { async loadHeadLines ({ commit }, apiUrl) { commit('setLoading', true) const { articles } = await this.$axios.$get(apiUrl) const headlines = articles.map((article) => { const slug = slugify(article.title, { replacement: '-', remove: /[^a-zA-Z0-9 -]/g }) const headline = { ...article, slug } return headline }) commit('setLoading', false) commit('setHeadLines', headlines) }, async authenticateUser ({ commit }, userPayload) { try { commit('setLoading', true) const autuUserData = await this.$axios.$post( `/${userPayload.action}/`, { email: userPayload.email, password: userPayload.password, resturnSecureToken: userPayload.resturnSecureToken } ) let user if (userPayload.action === 'register') { const avatar = `http://gravatar.com/avatar/${md5(autuUserData.email)}?d=identicon` user = { email: autuUserData.email, avatar } await db .collection('users') .doc(userPayload.email) .set(user) } else { const loginRef = db.collection('users').doc(userPayload.email) const loggedInUser = await loginRef.get() user = loggedInUser.data() } // console.log(autuUserData) commit('setUser', user) commit('setToken', autuUserData.idToken) commit('setLoading', false) saveUserData(autuUserData, user) } catch (error) { // console.log(error) } }, async removeHeadlineFromFeed ({ state }, headline) { const headlineRef = db.collection(`users/${state.user.email}/feed`).doc(headline.title) await headlineRef.delete() }, async addHeadlineToFeed ({ state }, headline) { const feedRef = db.collection(`users/${state.user.email}/feed`).doc(headline.title) await feedRef.set(headline) }, async loadUserFeed ({ state, commit }) { if (state.user) { const feedRef = db.collection(`users/${state.user.email}/feed`) await feedRef.onSnapshot((querySnapshot) => { // eslint-disable-next-line prefer-const let headlines = [] querySnapshot.forEach((doc) => { headlines.push(doc.data()) commit('setFeed', headlines) }) if (querySnapshot.empty) { headlines = [] commit('setFeed', headlines) } }) } }, setLogoutTimer ({ dispatch }, interval) { setTimeout(() => dispatch('logoutUser'), interval) }, logoutUser ({ commit }) { commit('clearToken') commit('clearUser') commit('clearFeed') clearUserData() } }, getters: { headlines: state => state.headlines, feed: state => state.feed, loading: state => state.loading, category: state => state.category, country: state => state.country, isAuthenticated: state => !!state.token, user: state => state.user } }) } export default createStore