index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import Vuex from 'vuex'
  2. import md5 from 'md5'
  3. import slugify from 'slugify'
  4. import db from '~/plugins/firestore'
  5. import { saveUserData, clearUserData } from '~/utils'
  6. const createStore = () => {
  7. return new Vuex.Store({
  8. state: {
  9. headlines: [],
  10. feed: [],
  11. loading: false,
  12. category: '',
  13. token: null,
  14. country: 'us',
  15. user: null
  16. },
  17. mutations: {
  18. setHeadLines (state, headlines) {
  19. state.headlines = headlines
  20. },
  21. setLoading (state, loading) {
  22. state.loading = loading
  23. },
  24. setCategory (state, category) {
  25. state.category = category
  26. },
  27. setCountry (state, country) {
  28. state.country = country
  29. },
  30. setToken (state, token) {
  31. state.token = token
  32. },
  33. setUser (state, user) {
  34. state.user = user
  35. },
  36. setFeed (state, headlines) {
  37. state.feed = headlines
  38. },
  39. clearToken: state => (state.token = null),
  40. clearUser: state => (state.user = null),
  41. clearFeed: state => (state.feed = [])
  42. },
  43. actions: {
  44. async loadHeadLines ({ commit }, apiUrl) {
  45. commit('setLoading', true)
  46. const { articles } = await this.$axios.$get(apiUrl)
  47. const headlines = articles.map((article) => {
  48. const slug = slugify(article.title, {
  49. replacement: '-',
  50. remove: /[^a-zA-Z0-9 -]/g
  51. })
  52. const headline = { ...article, slug }
  53. return headline
  54. })
  55. commit('setLoading', false)
  56. commit('setHeadLines', headlines)
  57. },
  58. async authenticateUser ({ commit }, userPayload) {
  59. try {
  60. commit('setLoading', true)
  61. const autuUserData = await this.$axios.$post(
  62. `/${userPayload.action}/`,
  63. {
  64. email: userPayload.email,
  65. password: userPayload.password,
  66. resturnSecureToken: userPayload.resturnSecureToken
  67. }
  68. )
  69. let user
  70. if (userPayload.action === 'register') {
  71. const avatar = `http://gravatar.com/avatar/${md5(autuUserData.email)}?d=identicon`
  72. user = { email: autuUserData.email, avatar }
  73. await db
  74. .collection('users')
  75. .doc(userPayload.email)
  76. .set(user)
  77. } else {
  78. const loginRef = db.collection('users').doc(userPayload.email)
  79. const loggedInUser = await loginRef.get()
  80. user = loggedInUser.data()
  81. }
  82. // console.log(autuUserData)
  83. commit('setUser', user)
  84. commit('setToken', autuUserData.idToken)
  85. commit('setLoading', false)
  86. saveUserData(autuUserData, user)
  87. } catch (error) {
  88. // console.log(error)
  89. }
  90. },
  91. async removeHeadlineFromFeed ({ state }, headline) {
  92. const headlineRef = db.collection(`users/${state.user.email}/feed`).doc(headline.title)
  93. await headlineRef.delete()
  94. },
  95. async addHeadlineToFeed ({ state }, headline) {
  96. const feedRef = db.collection(`users/${state.user.email}/feed`).doc(headline.title)
  97. await feedRef.set(headline)
  98. },
  99. async loadUserFeed ({ state, commit }) {
  100. if (state.user) {
  101. const feedRef = db.collection(`users/${state.user.email}/feed`)
  102. await feedRef.onSnapshot((querySnapshot) => {
  103. // eslint-disable-next-line prefer-const
  104. let headlines = []
  105. querySnapshot.forEach((doc) => {
  106. headlines.push(doc.data())
  107. commit('setFeed', headlines)
  108. })
  109. if (querySnapshot.empty) {
  110. headlines = []
  111. commit('setFeed', headlines)
  112. }
  113. })
  114. }
  115. },
  116. setLogoutTimer ({ dispatch }, interval) {
  117. setTimeout(() => dispatch('logoutUser'), interval)
  118. },
  119. logoutUser ({ commit }) {
  120. commit('clearToken')
  121. commit('clearUser')
  122. commit('clearFeed')
  123. clearUserData()
  124. }
  125. },
  126. getters: {
  127. headlines: state => state.headlines,
  128. feed: state => state.feed,
  129. loading: state => state.loading,
  130. category: state => state.category,
  131. country: state => state.country,
  132. isAuthenticated: state => !!state.token,
  133. user: state => state.user
  134. }
  135. })
  136. }
  137. export default createStore