From 93cbb58212ebb83cee5bc89f8cef1ebb58969f5c Mon Sep 17 00:00:00 2001
From: Henry Jameson <me@hjkos.com>
Date: Thu, 17 Jan 2019 22:11:51 +0300
Subject: [PATCH] fix login and favorites tab...

---
 src/components/user_profile/user_profile.js   | 13 ++++
 src/components/user_profile/user_profile.vue  |  2 +-
 src/modules/users.js                          | 61 +++++++++----------
 src/services/api/api.service.js               | 12 ++++
 .../entity_normalizer.service.js              |  8 +++
 5 files changed, 64 insertions(+), 32 deletions(-)

diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js
index 7f17ef69..c9197a1c 100644
--- a/src/components/user_profile/user_profile.js
+++ b/src/components/user_profile/user_profile.js
@@ -5,13 +5,16 @@ import Timeline from '../timeline/timeline.vue'
 const UserProfile = {
   created () {
     this.$store.commit('clearTimeline', { timeline: 'user' })
+    this.$store.commit('clearTimeline', { timeline: 'favorites' })
     this.$store.dispatch('startFetching', ['user', this.fetchBy])
+    this.$store.dispatch('startFetching', ['favorites', this.fetchBy])
     if (!this.user.id) {
       this.$store.dispatch('fetchUser', this.fetchBy)
     }
   },
   destroyed () {
     this.$store.dispatch('stopFetching', 'user')
+    this.$store.dispatch('stopFetching', 'favorites')
   },
   computed: {
     timeline () {
@@ -26,6 +29,9 @@ const UserProfile = {
     userName () {
       return this.$route.params.name || this.user.screen_name
     },
+    isUs () {
+      return this.userId === this.$store.state.users.currentUser.id
+    },
     friends () {
       return this.user.friends
     },
@@ -65,21 +71,28 @@ const UserProfile = {
     }
   },
   watch: {
+    // TODO get rid of this copypasta
     userName () {
       if (this.isExternal) {
         return
       }
       this.$store.dispatch('stopFetching', 'user')
+      this.$store.dispatch('stopFetching', 'favorites')
       this.$store.commit('clearTimeline', { timeline: 'user' })
+      this.$store.commit('clearTimeline', { timeline: 'favorites' })
       this.$store.dispatch('startFetching', ['user', this.fetchBy])
+      this.$store.dispatch('startFetching', ['favorites', this.fetchBy])
     },
     userId () {
       if (!this.isExternal) {
         return
       }
       this.$store.dispatch('stopFetching', 'user')
+      this.$store.dispatch('stopFetching', 'favorites')
       this.$store.commit('clearTimeline', { timeline: 'user' })
+      this.$store.commit('clearTimeline', { timeline: 'favorites' })
       this.$store.dispatch('startFetching', ['user', this.fetchBy])
+      this.$store.dispatch('startFetching', ['favorites', this.fetchBy])
     },
     user () {
       if (this.user.id && !this.user.followers) {
diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue
index 265fc65b..e53727ff 100644
--- a/src/components/user_profile/user_profile.vue
+++ b/src/components/user_profile/user_profile.vue
@@ -20,7 +20,7 @@
           <i class="icon-spin3 animate-spin"></i>
         </div>
       </div>
-      <Timeline :label="$t('user_card.favorites')" :embedded="true" :title="$t('user_profile.favorites_title')" :timeline="favorites"/>
+      <Timeline v-if="isUs" :label="$t('user_card.favorites')" :embedded="true" :title="$t('user_profile.favorites_title')" :timeline="favorites"/>
     </tab-switcher>
   </div>
   <div v-else class="panel user-profile-placeholder">
diff --git a/src/modules/users.js b/src/modules/users.js
index 33c02a07..c4d479f9 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -207,39 +207,38 @@ const users = {
         const commit = store.commit
         commit('beginLogin')
         store.rootState.api.backendInteractor.verifyCredentials(accessToken)
-          .then((response) => {
-            if (response.ok) {
-              response.json()
-                .then((user) => {
-                  // user.credentials = userCredentials
-                  user.credentials = accessToken
-                  commit('setCurrentUser', user)
-                  commit('addNewUsers', [user])
+          .then((data) => {
+            if (!data.error) {
+              const { user } = data
+              // user.credentials = userCredentials
+              user.credentials = accessToken
+              commit('setCurrentUser', user)
+              commit('addNewUsers', [user])
 
-                  getNotificationPermission()
-                    .then(permission => commit('setNotificationPermission', permission))
+              getNotificationPermission()
+                .then(permission => commit('setNotificationPermission', permission))
 
-                  // Set our new backend interactor
-                  commit('setBackendInteractor', backendInteractorService(accessToken))
+              // Set our new backend interactor
+              commit('setBackendInteractor', backendInteractorService(accessToken))
 
-                  if (user.token) {
-                    store.dispatch('initializeSocket', user.token)
-                  }
+              if (user.token) {
+                store.dispatch('initializeSocket', user.token)
+              }
 
-                  // Start getting fresh tweets.
-                  store.dispatch('startFetching', 'friends')
+              // Start getting fresh tweets.
+              store.dispatch('startFetching', 'friends')
 
-                  // Get user mutes and follower info
-                  store.rootState.api.backendInteractor.fetchMutes().then((mutedUsers) => {
-                    each(mutedUsers, (user) => { user.muted = true })
-                    store.commit('addNewUsers', mutedUsers)
-                  })
+              // Get user mutes and follower info
+              store.rootState.api.backendInteractor.fetchMutes().then((mutedUsers) => {
+                each(mutedUsers, (user) => { user.muted = true })
+                store.commit('addNewUsers', mutedUsers)
+              })
 
-                  // Fetch our friends
-                  store.rootState.api.backendInteractor.fetchFriends({ id: user.id })
-                    .then((friends) => commit('addNewUsers', friends))
-                })
+              // Fetch our friends
+              store.rootState.api.backendInteractor.fetchFriends({ id: user.id })
+                .then((friends) => commit('addNewUsers', friends))
             } else {
+              const response = data.error
               // Authentication failed
               commit('endLogin')
               if (response.status === 401) {
@@ -251,11 +250,11 @@ const users = {
             commit('endLogin')
             resolve()
           })
-          .catch((error) => {
-            console.log(error)
-            commit('endLogin')
-            reject('Failed to connect to server, try again')
-          })
+        .catch((error) => {
+          console.log(error)
+          commit('endLogin')
+          reject('Failed to connect to server, try again')
+        })
       })
     }
   }
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 0e267276..c45f8572 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -366,6 +366,18 @@ const verifyCredentials = (user) => {
     method: 'POST',
     headers: authHeaders(user)
   })
+    .then((response) => {
+      if (response.ok) {
+        return response.json()
+      } else {
+        return {
+          error: response
+        }
+      }
+    })
+    .then((data) => ({
+      user: parseUser(data)
+    }))
 }
 
 const favorite = ({ id, credentials }) => {
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index ca0f36db..fa35bba3 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -80,6 +80,14 @@ export const parseUser = (data) => {
 
     output.statusnet_profile_url = data.statusnet_profile_url
     output.is_local = data.is_local
+
+    // QVITTER ONLY FOR NOW
+    // Really only applies to logged in user, really.. I THINK
+    output.rights = data.rights
+    output.no_rich_text = data.no_rich_text
+    output.default_scope = data.default_scope
+    output.hide_network = data.hide_network
+    output.background_image = data.background_image
   }
 
   output.created_at = new Date(data.created_at)