From a817cc7cb464d804ccd8af2bbe22e9b738959a3a Mon Sep 17 00:00:00 2001
From: taehoon <th.dev91@gmail.com>
Date: Wed, 13 Feb 2019 12:05:23 -0500
Subject: [PATCH] Wire up ui to real blocks api data

---
 src/components/user_settings/user_settings.js   |  4 ++--
 src/hocs/with_load_more/with_load_more.js       |  2 +-
 src/modules/users.js                            | 17 +++++++++++++++++
 src/services/api/api.service.js                 | 17 +++++++++++++++++
 .../backend_interactor_service.js               |  2 ++
 .../entity_normalizer.service.js                |  1 +
 6 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js
index 34ab99c7..5d8541f0 100644
--- a/src/components/user_settings/user_settings.js
+++ b/src/components/user_settings/user_settings.js
@@ -10,8 +10,8 @@ import withLoadMore from '../../hocs/with_load_more/with_load_more'
 
 const BlockListWithLoadMore = withLoadMore(
   UserList,
-  (props, $store) => $store.dispatch('addFriends', $store.state.users.currentUser.id),
-  (props, $store) => get($store.getters.userById($store.state.users.currentUser.id), 'friends', [])
+  (props, $store) => $store.dispatch('fetchBlocks'),
+  (props, $store) => get($store.state.users.currentUser, 'blocks', [])
 )
 
 const UserSettings = {
diff --git a/src/hocs/with_load_more/with_load_more.js b/src/hocs/with_load_more/with_load_more.js
index 0f72ffd6..14d4303d 100644
--- a/src/hocs/with_load_more/with_load_more.js
+++ b/src/hocs/with_load_more/with_load_more.js
@@ -48,7 +48,7 @@ const withLoadMore = (Component, fetchEntries, getEntries) => {
           fetchEntries(this.$props, this.$store).then((newEntries) => {
             this.error = false
             this.loading = false
-            this.bottomedOut = newEntries.length === 0
+            this.bottomedOut = !newEntries || newEntries.length === 0
           }).catch(() => {
             this.error = true
             this.loading = false
diff --git a/src/modules/users.js b/src/modules/users.js
index 000cfd72..6ea4e0c9 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -85,6 +85,15 @@ export const mutations = {
   addNewUsers (state, users) {
     each(users, (user) => mergeOrAdd(state.users, state.usersObject, user))
   },
+  addBlocks (state, { blocks, page }) {
+    const user = state.currentUser
+    each(blocks, block => {
+      if (!find(user.blocks, { id: block.id })) {
+        user.blocks.push(block)
+      }
+    })
+    user.blocksPage = page + 1
+  },
   setUserForStatus (state, status) {
     status.user = state.usersObject[status.user.id]
   },
@@ -137,6 +146,14 @@ const users = {
       store.rootState.api.backendInteractor.fetchUser({ id })
         .then((user) => store.commit('addNewUsers', [user]))
     },
+    fetchBlocks (store) {
+      const page = store.state.currentUser.blocksPage || 1
+      return store.rootState.api.backendInteractor.fetchBlocks({ page })
+        .then((blocks) => {
+          store.commit('addBlocks', { blocks, page })
+          return blocks
+        })
+    },
     addFriends ({ rootState, commit }, fetchBy) {
       return new Promise((resolve, reject) => {
         const user = rootState.users.usersObject[fetchBy]
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 13d31d91..908edf7c 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -18,6 +18,7 @@ const MENTIONS_URL = '/api/statuses/mentions.json'
 const DM_TIMELINE_URL = '/api/statuses/dm_timeline.json'
 const FOLLOWERS_URL = '/api/statuses/followers.json'
 const FRIENDS_URL = '/api/statuses/friends.json'
+const BLOCKS_URL = '/api/statuses/blocks.json'
 const FOLLOWING_URL = '/api/friendships/create.json'
 const UNFOLLOWING_URL = '/api/friendships/destroy.json'
 const QVITTER_USER_PREF_URL = '/api/qvitter/set_profile_pref.json'
@@ -519,6 +520,21 @@ const fetchMutes = ({credentials}) => {
   }).then((data) => data.json())
 }
 
+const fetchBlocks = ({page, credentials}) => {
+  let url = BLOCKS_URL
+  if (page) {
+    url = url + `?page=${page}`
+  }
+  return fetch(url, {
+    headers: authHeaders(credentials)
+  }).then((data) => {
+    if (data.ok) {
+      return data.json()
+    }
+    throw new Error('Error fetching blocks', data)
+  })
+}
+
 const suggestions = ({credentials}) => {
   return fetch(SUGGESTIONS_URL, {
     headers: authHeaders(credentials)
@@ -560,6 +576,7 @@ const apiService = {
   fetchAllFollowing,
   setUserMute,
   fetchMutes,
+  fetchBlocks,
   register,
   getCaptcha,
   updateAvatar,
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index 80c5cc5e..43c914d9 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -63,6 +63,7 @@ const backendInteractorService = (credentials) => {
   }
 
   const fetchMutes = () => apiService.fetchMutes({credentials})
+  const fetchBlocks = (params) => apiService.fetchBlocks({credentials, ...params})
   const fetchFollowRequests = () => apiService.fetchFollowRequests({credentials})
 
   const getCaptcha = () => apiService.getCaptcha()
@@ -94,6 +95,7 @@ const backendInteractorService = (credentials) => {
     startFetching,
     setUserMute,
     fetchMutes,
+    fetchBlocks,
     register,
     getCaptcha,
     updateAvatar,
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index d20ce77f..1192b6cc 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -120,6 +120,7 @@ export const parseUser = (data) => {
   if (data.pleroma) {
     output.follow_request_count = data.pleroma.follow_request_count
   }
+  output.blocks = []
 
   return output
 }