From cd9a7dd48802fff8942ae607a23677cfb43a7b14 Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Tue, 12 Mar 2019 17:16:57 -0400
Subject: #436: integrate mastoAPI notifications

---
 src/components/notification/notification.vue | 83 ++++++++++++++++------------
 1 file changed, 48 insertions(+), 35 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 5e9cef97..b281c7cf 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -1,44 +1,57 @@
 <template>
-  <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
-  <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
-    <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
-    </a>
-    <div class='notification-right'>
-      <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
-      <span class="notification-details">
-        <div class="name-and-action">
-          <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
-          <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-          <span v-if="notification.type === 'like'">
-            <i class="fa icon-star lit"></i>
-            <small>{{$t('notifications.favorited_you')}}</small>
-          </span>
-          <span v-if="notification.type === 'repeat'">
-            <i class="fa icon-retweet lit" :title="$t('tool_tip.repeat')"></i>
-            <small>{{$t('notifications.repeated_you')}}</small>
-          </span>
-          <span v-if="notification.type === 'follow'">
-            <i class="fa icon-user-plus lit"></i>
-            <small>{{$t('notifications.followed_you')}}</small>
-          </span>
-        </div>
-        <div class="timeago">
-          <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
-            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+  <div class="notification-item">
+    <button @click.prevent="dismiss" class="btn-dismiss">{{$t("notifications.dismiss")}}</button>
+    <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
+    <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
+      <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+        <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
+      </a>
+      <div class='notification-right'>
+        <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
+        <span class="notification-details">
+          <div class="name-and-action">
+            <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
+            <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+            <span v-if="notification.type === 'like'">
+              <i class="fa icon-star lit"></i>
+              <small>{{$t('notifications.favorited_you')}}</small>
+            </span>
+            <span v-if="notification.type === 'repeat'">
+              <i class="fa icon-retweet lit" :title="$t('tool_tip.repeat')"></i>
+              <small>{{$t('notifications.repeated_you')}}</small>
+            </span>
+            <span v-if="notification.type === 'follow'">
+              <i class="fa icon-user-plus lit"></i>
+              <small>{{$t('notifications.followed_you')}}</small>
+            </span>
+          </div>
+          <div class="timeago">
+            <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
+              <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+            </router-link>
+          </div>
+        </span>
+        <div class="follow-text" v-if="notification.type === 'follow'">
+          <router-link :to="userProfileLink(notification.action.user)">
+            @{{notification.action.user.screen_name}}
           </router-link>
         </div>
-      </span>
-      <div class="follow-text" v-if="notification.type === 'follow'">
-        <router-link :to="userProfileLink(notification.action.user)">
-          @{{notification.action.user.screen_name}}
-        </router-link>
+        <template v-else>
+          <status class="faint" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
+        </template>
       </div>
-      <template v-else>
-        <status class="faint" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
-      </template>
     </div>
   </div>
 </template>
 
 <script src="./notification.js"></script>
+
+<style lang="scss">
+@import '../../_variables.scss';
+
+.notification-item {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+}
+</style>
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 2f7d890ad228a2aeb8643373c9c9a6d925c6ff7f Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Wed, 13 Mar 2019 14:08:03 -0400
Subject: #436: add dismiss button, disable is_seen part

---
 src/components/notification/notification.vue       | 93 +++++++++++-----------
 src/components/status/status.js                    |  6 +-
 src/components/status/status.vue                   |  3 +
 .../entity_normalizer/entity_normalizer.service.js |  6 +-
 .../notifications_fetcher.service.js               | 22 ++---
 5 files changed, 68 insertions(+), 62 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index b281c7cf..87b0fde2 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -1,57 +1,54 @@
 <template>
-  <div class="notification-item">
-    <button @click.prevent="dismiss" class="btn-dismiss">{{$t("notifications.dismiss")}}</button>
-    <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
-    <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
-      <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-        <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
-      </a>
-      <div class='notification-right'>
-        <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
-        <span class="notification-details">
-          <div class="name-and-action">
-            <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
-            <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-            <span v-if="notification.type === 'like'">
-              <i class="fa icon-star lit"></i>
-              <small>{{$t('notifications.favorited_you')}}</small>
-            </span>
-            <span v-if="notification.type === 'repeat'">
-              <i class="fa icon-retweet lit" :title="$t('tool_tip.repeat')"></i>
-              <small>{{$t('notifications.repeated_you')}}</small>
-            </span>
-            <span v-if="notification.type === 'follow'">
-              <i class="fa icon-user-plus lit"></i>
-              <small>{{$t('notifications.followed_you')}}</small>
-            </span>
-          </div>
-          <div class="timeago">
-            <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
-              <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
-            </router-link>
-          </div>
-        </span>
-        <div class="follow-text" v-if="notification.type === 'follow'">
-          <router-link :to="userProfileLink(notification.action.user)">
-            @{{notification.action.user.screen_name}}
+  <status 
+    v-if="notification.type === 'mention'" 
+    :compact="true" 
+    :statusoid="notification.status"
+    isNotification="true"
+    @dismissNotification="dismiss"
+  >
+  </status>
+  <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
+    <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
+    </a>
+    <div class='notification-right'>
+      <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
+      <span class="notification-details">
+        <div class="name-and-action">
+          <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
+          <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+          <span v-if="notification.type === 'like'">
+            <i class="fa icon-star lit"></i>
+            <small>{{$t('notifications.favorited_you')}}</small>
+          </span>
+          <span v-if="notification.type === 'repeat'">
+            <i class="fa icon-retweet lit" :title="$t('tool_tip.repeat')"></i>
+            <small>{{$t('notifications.repeated_you')}}</small>
+          </span>
+          <span v-if="notification.type === 'follow'">
+            <i class="fa icon-user-plus lit"></i>
+            <small>{{$t('notifications.followed_you')}}</small>
+          </span>
+        </div>
+        <div class="timeago">
+          <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
+            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
           </router-link>
         </div>
-        <template v-else>
-          <status class="faint" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
-        </template>
+        <span class="button-icon" @click.prevent="dismiss">
+          <i class="button-icon icon-cancel delete-status"></i>
+        </span>
+      </span>
+      <div class="follow-text" v-if="notification.type === 'follow'">
+        <router-link :to="userProfileLink(notification.action.user)">
+          @{{notification.action.user.screen_name}}
+        </router-link>
       </div>
+      <template v-else>
+        <status class="faint" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
+      </template>
     </div>
   </div>
 </template>
 
 <script src="./notification.js"></script>
-
-<style lang="scss">
-@import '../../_variables.scss';
-
-.notification-item {
-  display: flex;
-  flex: 1;
-  flex-direction: column;
-}
-</style>
\ No newline at end of file
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 9e18fe15..4cd26be3 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -25,7 +25,8 @@ const Status = {
     'replies',
     'isPreview',
     'noHeading',
-    'inlineExpanded'
+    'inlineExpanded',
+    'isNotification'
   ],
   data () {
     return {
@@ -365,6 +366,9 @@ const Status = {
     setMedia () {
       const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments
       return () => this.$store.dispatch('setMedia', attachments)
+    },
+    dismissNotification () {
+      this.$emit('dismissNotification')
     }
   },
   watch: {
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 1f6d0325..28a44346 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -52,6 +52,9 @@
                 <a :href="status.external_url" target="_blank" v-if="!status.is_local && !isPreview" class="source_url" title="Source">
                   <i class="button-icon icon-link-ext-alt"></i>
                 </a>
+                <span class="button-icon" v-if="isNotification" @click.prevent="dismissNotification">
+                  <i class="button-icon icon-cancel delete-status"></i>
+                </span>
                 <template v-if="expandable && !isPreview">
                   <a href="#" @click.prevent="toggleExpanded" title="Expand">
                     <i class="button-icon icon-plus-squared"></i>
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 81b88bf0..4e6248bb 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -65,8 +65,7 @@ export const parseUser = (data) => {
       output.muted = pleroma.muted
     }
 
-    // Missing, trying to recover
-    output.is_local = !output.screen_name.includes('@')
+    // TODO: handle is_local
   } else {
     output.screen_name = data.screen_name
 
@@ -179,8 +178,7 @@ export const parseStatus = (data) => {
     output.summary_html = data.spoiler_text
     output.external_url = data.url
 
-    // FIXME missing!!
-    output.is_local = false
+    // TODO: handle is_local
   } else {
     output.favorited = data.favorited
     output.fave_num = data.fave_num
diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js
index 3ecdae6a..9eac5ab4 100644
--- a/src/services/notifications_fetcher/notifications_fetcher.service.js
+++ b/src/services/notifications_fetcher/notifications_fetcher.service.js
@@ -16,17 +16,21 @@ const fetchAndUpdate = ({store, credentials, older = false}) => {
       args['until'] = timelineData.minId
     }
   } else {
-    // load unread notifications repeadedly to provide consistency between browser tabs
-    const notifications = timelineData.data
-    const unread = notifications.filter(n => !n.seen).map(n => n.id)
-    if (!unread.length) {
+    if (timelineData.maxId !== Number.POSITIVE_INFINITY) {
       args['since'] = timelineData.maxId
-    } else {
-      args['since'] = Math.min(...unread) - 1
-      if (timelineData.maxId !== Math.max(...unread)) {
-        args['until'] = Math.max(...unread, args['since'] + 20)
-      }
     }
+    // # disabled until is_seen is impelented on the BE
+    // load unread notifications repeadedly to provide consistency between browser tabs
+    // const notifications = timelineData.data
+    // const unread = notifications.filter(n => !n.seen).map(n => n.id)
+    // if (!unread.length) {
+    //   args['since'] = timelineData.maxId
+    // } else {
+    //   args['since'] = Math.min(...unread) - 1
+    //   if (timelineData.maxId !== Math.max(...unread)) {
+    //     args['until'] = Math.max(...unread, args['since'] + 20)
+    //   }
+    // }
   }
 
   args['timeline'] = 'notifications'
-- 
cgit v1.2.3-70-g09d2


From e5e1d4c643d6b69217fb9a62b60f3f9c94ef4714 Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Thu, 14 Mar 2019 07:55:39 -0400
Subject: #436: fix notification order, follow type link issue, duplicate key

---
 src/components/notification/notification.vue                | 7 ++++++-
 src/components/notifications/notifications.vue              | 2 +-
 src/modules/statuses.js                                     | 8 ++++----
 src/services/entity_normalizer/entity_normalizer.service.js | 2 +-
 src/services/notification_utils/notification_utils.js       | 6 +++---
 5 files changed, 15 insertions(+), 10 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 87b0fde2..6e8e9844 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -30,7 +30,12 @@
             <small>{{$t('notifications.followed_you')}}</small>
           </span>
         </div>
-        <div class="timeago">
+        <div class="timeago" v-if="notification.type === 'follow'">
+          <span class="faint">
+            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+          </span>
+        </div>
+        <div class="timeago" v-else>
           <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
             <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
           </router-link>
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 6438361d..5a5f8ed8 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -13,7 +13,7 @@
         <button v-if="notifications.length" @click.prevent="clear" class="read-button">{{$t('notifications.clear')}}</button>
       </div>
       <div class="panel-body">
-        <div v-for="notification in visibleNotifications" :key="notification.action.id" class="notification" :class='{"unseen": !notification.seen}'>
+        <div v-for="notification in visibleNotifications" :key="notification.action.id + notification.id" class="notification" :class='{"unseen": !notification.seen}'>
           <div class="notification-overlay"></div>
           <notification :notification="notification"></notification>
         </div>
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index fde783a5..4cc3907d 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -269,11 +269,11 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
 }
 
 const addNewNotifications = (state, { dispatch, notifications, older, visibleNotificationTypes }) => {
-  const allStatuses = state.allStatuses
-  const allStatusesObject = state.allStatusesObject
+  // const allStatuses = state.allStatuses
+  // const allStatusesObject = state.allStatusesObject
   each(notifications, (notification) => {
-    notification.action = mergeOrAdd(allStatuses, allStatusesObject, notification.action).item
-    notification.status = notification.status && mergeOrAdd(allStatuses, allStatusesObject, notification.status).item
+    // notification.action = mergeOrAdd(allStatuses, allStatusesObject, notification.action).item
+    // notification.status = notification.status && mergeOrAdd(allStatuses, allStatusesObject, notification.status).item
 
     // Only add a new notification if we don't have one for the same action
     if (!state.notifications.idStore.hasOwnProperty(notification.id)) {
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 5444a1e3..4ca7f56b 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -275,7 +275,7 @@ export const parseNotification = (data) => {
     output.status = output.type === 'follow'
       ? parseFollow(data)
       : parseStatus(data.status)
-    if (data.type === 'reblog') {
+    if (data.type === 'reblog' || data.type === 'favourite') {
       output.status.user = parseUser(data.account)
       output.status.created_at = new Date(data.created_at)
     }
diff --git a/src/services/notification_utils/notification_utils.js b/src/services/notification_utils/notification_utils.js
index cd8f3f9e..8afd114e 100644
--- a/src/services/notification_utils/notification_utils.js
+++ b/src/services/notification_utils/notification_utils.js
@@ -10,8 +10,8 @@ export const visibleTypes = store => ([
 ].filter(_ => _))
 
 const sortById = (a, b) => {
-  const seqA = Number(a.action.id)
-  const seqB = Number(b.action.id)
+  const seqA = Number(a.id)
+  const seqB = Number(b.id)
   const isSeqA = !Number.isNaN(seqA)
   const isSeqB = !Number.isNaN(seqB)
   if (isSeqA && isSeqB) {
@@ -21,7 +21,7 @@ const sortById = (a, b) => {
   } else if (!isSeqA && isSeqB) {
     return -1
   } else {
-    return a.action.id > b.action.id ? -1 : 1
+    return a.id > b.id ? -1 : 1
   }
 }
 
-- 
cgit v1.2.3-70-g09d2


From 52326e65515317be4815aaef320965313f84d64b Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Thu, 14 Mar 2019 11:57:24 -0400
Subject: #436: remove clear & dismiss UI updates

---
 src/components/notification/notification.js    |  3 ---
 src/components/notification/notification.vue   |  5 ----
 src/components/notifications/notifications.js  |  3 ---
 src/components/notifications/notifications.vue |  3 +--
 src/components/status/status.js                |  6 +----
 src/components/status/status.vue               |  3 ---
 src/i18n/en.json                               |  2 --
 src/modules/statuses.js                        | 36 +-------------------------
 src/services/api/api.service.js                | 25 +-----------------
 9 files changed, 4 insertions(+), 82 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js
index c86f22bb..fe5b7018 100644
--- a/src/components/notification/notification.js
+++ b/src/components/notification/notification.js
@@ -21,9 +21,6 @@ const Notification = {
     },
     userProfileLink (user) {
       return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
-    },
-    dismiss () {
-      this.$store.dispatch('dismissNotifications', { id: this.notification.id })
     }
   },
   computed: {
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 6e8e9844..fa931fb6 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -3,8 +3,6 @@
     v-if="notification.type === 'mention'" 
     :compact="true" 
     :statusoid="notification.status"
-    isNotification="true"
-    @dismissNotification="dismiss"
   >
   </status>
   <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
@@ -40,9 +38,6 @@
             <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
           </router-link>
         </div>
-        <span class="button-icon" @click.prevent="dismiss">
-          <i class="button-icon icon-cancel delete-status"></i>
-        </span>
       </span>
       <div class="follow-text" v-if="notification.type === 'follow'">
         <router-link :to="userProfileLink(notification.action.user)">
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 68004d54..e1c53c58 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -55,9 +55,6 @@ const Notifications = {
     markAsSeen () {
       this.$store.dispatch('markNotificationsAsSeen')
     },
-    clear () {
-      this.$store.dispatch('clearNotifications')
-    },
     fetchOlderNotifications () {
       const store = this.$store
       const credentials = store.state.users.currentUser.credentials
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 5a5f8ed8..05f51f6c 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -9,8 +9,7 @@
         <div @click.prevent class="loadmore-error alert error" v-if="error">
           {{$t('timeline.error_fetching')}}
         </div>
-        <!-- <button v-if="unseenCount" @click.prevent="markAsSeen" class="read-button">{{$t('notifications.read')}}</button> -->
-        <button v-if="notifications.length" @click.prevent="clear" class="read-button">{{$t('notifications.clear')}}</button>
+        <button v-if="unseenCount" @click.prevent="markAsSeen" class="read-button">{{$t('notifications.read')}}</button>
       </div>
       <div class="panel-body">
         <div v-for="notification in visibleNotifications" :key="notification.action.id + notification.id" class="notification" :class='{"unseen": !notification.seen}'>
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 4cd26be3..9e18fe15 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -25,8 +25,7 @@ const Status = {
     'replies',
     'isPreview',
     'noHeading',
-    'inlineExpanded',
-    'isNotification'
+    'inlineExpanded'
   ],
   data () {
     return {
@@ -366,9 +365,6 @@ const Status = {
     setMedia () {
       const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments
       return () => this.$store.dispatch('setMedia', attachments)
-    },
-    dismissNotification () {
-      this.$emit('dismissNotification')
     }
   },
   watch: {
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 28a44346..1f6d0325 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -52,9 +52,6 @@
                 <a :href="status.external_url" target="_blank" v-if="!status.is_local && !isPreview" class="source_url" title="Source">
                   <i class="button-icon icon-link-ext-alt"></i>
                 </a>
-                <span class="button-icon" v-if="isNotification" @click.prevent="dismissNotification">
-                  <i class="button-icon icon-cancel delete-status"></i>
-                </span>
                 <template v-if="expandable && !isPreview">
                   <a href="#" @click.prevent="toggleExpanded" title="Expand">
                     <i class="button-icon icon-plus-squared"></i>
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 38abfaf5..01fe2fba 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -62,8 +62,6 @@
     "load_older": "Load older notifications",
     "notifications": "Notifications",
     "read": "Read!",
-    "clear": "Clear!",
-    "dismiss": "Dismiss!",
     "repeated_you": "repeated your status",
     "no_more_notifications": "No more notifications"
   },
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 4cc3907d..1eb1a3e3 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -1,4 +1,4 @@
-import { remove, slice, each, find, findIndex, maxBy, minBy, merge, first, last, isArray } from 'lodash'
+import { remove, slice, each, find, maxBy, minBy, merge, first, last, isArray } from 'lodash'
 import apiService from '../services/api/api.service.js'
 // import parse from '../services/status_parser/status_parser.js'
 
@@ -390,27 +390,6 @@ export const mutations = {
       notification.seen = true
     })
   },
-  clearNotifications (state) {
-    state.notifications.data = []
-    state.notifications.idStore = {}
-    state.notifications.maxId = 0
-    state.notifications.minId = 0
-  },
-  dismissNotifications (state, { id }) {
-    const { data } = state.notifications
-    const idx = findIndex(data, { id })
-
-    if (idx !== -1) {
-      const notification = data[idx]
-      data.splice(idx, 1)
-      delete state.notifications.idStore[id]
-      if (state.notifications.maxId === notification.id) {
-        state.notifications.maxId = data.length ? maxBy(data, 'id').id : 0
-      } else if (state.notifications.minId === notification.id) {
-        state.notifications.minId = data.length ? minBy(data, 'id').id : 0
-      }
-    }
-  },
   queueFlush (state, { timeline, id }) {
     state.timelines[timeline].flushMarker = id
   }
@@ -495,19 +474,6 @@ const statuses = {
         id: rootState.statuses.notifications.maxId,
         credentials: rootState.users.currentUser.credentials
       })
-    },
-    clearNotifications ({ rootState, commit }) {
-      commit('clearNotifications')
-      apiService.clearNotifications({
-        credentials: rootState.users.currentUser.credentials
-      })
-    },
-    dismissNotifications ({ rootState, commit }, { id }) {
-      commit('dismissNotifications', { id })
-      apiService.dismissNotifications({
-        id,
-        credentials: rootState.users.currentUser.credentials
-      })
     }
   },
   mutations
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 9d3139ce..03553d75 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -43,8 +43,6 @@ const SUGGESTIONS_URL = '/api/v1/suggestions'
 
 const MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites'
 const MASTODON_USER_NOTIFICATIONS_URL = '/api/v1/notifications'
-const MASTODON_USER_NOTIFICATIONS_CLEAR_URL = '/api/v1/notifications/clear'
-const MASTODON_USER_NOTIFICATIONS_DISMISS_URL = '/api/v1/notifications/dismiss'
 
 import { each, map } from 'lodash'
 import { parseStatus, parseUser, parseNotification } from '../entity_normalizer/entity_normalizer.service.js'
@@ -577,25 +575,6 @@ const markNotificationsAsSeen = ({id, credentials}) => {
   }).then((data) => data.json())
 }
 
-const clearNotifications = ({ credentials }) => {
-  return fetch(MASTODON_USER_NOTIFICATIONS_CLEAR_URL, {
-    headers: authHeaders(credentials),
-    method: 'POST'
-  }).then((data) => data.json())
-}
-
-const dismissNotifications = ({ id, credentials }) => {
-  const body = new FormData()
-
-  body.append('id', id)
-
-  return fetch(MASTODON_USER_NOTIFICATIONS_DISMISS_URL, {
-    body,
-    headers: authHeaders(credentials),
-    method: 'POST'
-  }).then((data) => data.json())
-}
-
 const apiService = {
   verifyCredentials,
   fetchTimeline,
@@ -636,9 +615,7 @@ const apiService = {
   approveUser,
   denyUser,
   suggestions,
-  markNotificationsAsSeen,
-  clearNotifications,
-  dismissNotifications
+  markNotificationsAsSeen
 }
 
 export default apiService
-- 
cgit v1.2.3-70-g09d2


From 13e727b5eebb60330bc87c7ccc70109683c5b963 Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Mon, 18 Mar 2019 14:42:09 -0400
Subject: #436: sync notification with timeline

---
 src/components/notification/notification.vue             | 16 ++++++++--------
 src/modules/statuses.js                                  |  5 +++++
 .../entity_normalizer/entity_normalizer.service.js       | 10 ++++++----
 3 files changed, 19 insertions(+), 12 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index fa931fb6..7d88c90b 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -6,15 +6,15 @@
   >
   </status>
   <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
-    <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
+    <a class='avatar-container' :href="notification.action.account.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.account.profile_image_url_original"/>
     </a>
     <div class='notification-right'>
-      <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
+      <UserCard :user="notification.action.account" :rounded="true" :bordered="true" v-if="userExpanded"/>
       <span class="notification-details">
         <div class="name-and-action">
-          <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
-          <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+          <span class="username" v-if="!!notification.action.account.name_html" :title="'@'+notification.action.account.screen_name" v-html="notification.action.account.name_html"></span>
+          <span class="username" v-else :title="'@'+notification.action.account.screen_name">{{ notification.action.account.name }}</span>
           <span v-if="notification.type === 'like'">
             <i class="fa icon-star lit"></i>
             <small>{{$t('notifications.favorited_you')}}</small>
@@ -30,18 +30,18 @@
         </div>
         <div class="timeago" v-if="notification.type === 'follow'">
           <span class="faint">
-            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+            <timeago :since="notification.action.notified_at" :auto-update="240"></timeago>
           </span>
         </div>
         <div class="timeago" v-else>
           <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
-            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+            <timeago :since="notification.action.notified_at" :auto-update="240"></timeago>
           </router-link>
         </div>
       </span>
       <div class="follow-text" v-if="notification.type === 'follow'">
         <router-link :to="userProfileLink(notification.action.user)">
-          @{{notification.action.user.screen_name}}
+          @{{notification.action.account.screen_name}}
         </router-link>
       </div>
       <template v-else>
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index e18b0d1f..f14b8703 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -271,7 +271,12 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
 }
 
 const addNewNotifications = (state, { dispatch, notifications, older, visibleNotificationTypes }) => {
+  const allStatuses = state.allStatuses
+  const allStatusesObject = state.allStatusesObject
   each(notifications, (notification) => {
+    notification.action = mergeOrAdd(allStatuses, allStatusesObject, notification.action).item
+    notification.status = notification.status && mergeOrAdd(allStatuses, allStatusesObject, notification.status).item
+
     // Only add a new notification if we don't have one for the same action
     if (!state.notifications.idStore.hasOwnProperty(notification.id)) {
       state.notifications.maxId = notification.id > state.notifications.maxId
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 36a9508a..3bd42b94 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -180,8 +180,8 @@ export const parseStatus = (data) => {
     // Missing!! fix in UI?
     // output.in_reply_to_screen_name = ???
 
-    // Not exactly the same but works
-    output.statusnet_conversation_id = data.id
+    // It breaks the conversation when combined with notification
+    // output.statusnet_conversation_id = data.id
 
     if (output.type === 'retweet') {
       output.retweeted_status = parseStatus(data.reblog)
@@ -218,7 +218,6 @@ export const parseStatus = (data) => {
     output.in_reply_to_status_id = data.in_reply_to_status_id
     output.in_reply_to_user_id = data.in_reply_to_user_id
     output.in_reply_to_screen_name = data.in_reply_to_screen_name
-
     output.statusnet_conversation_id = data.statusnet_conversation_id
 
     if (output.type === 'retweet') {
@@ -266,6 +265,8 @@ export const parseFollow = (data) => {
   output.visibility = true
   output.created_at = new Date(data.created_at)
   output.user = parseUser(data.account)
+  output.notified_at = output.created_at
+  output.account = output.user
 
   return output
 }
@@ -286,7 +287,8 @@ export const parseNotification = (data) => {
       : parseStatus(data.status)
     if (data.type === 'reblog' || data.type === 'favourite') {
       output.status.user = parseUser(data.account)
-      output.status.created_at = new Date(data.created_at)
+      output.status.account = parseUser(data.account)
+      output.status.notified_at = new Date(data.created_at)
     }
     output.action = output.status // not sure
     output.from_profile = parseUser(data.account)
-- 
cgit v1.2.3-70-g09d2


From 0db66e2905a7394a5abf91c85de27cc95ced1c42 Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Sun, 31 Mar 2019 13:41:22 -0400
Subject: #436 - keep original naming

---
 src/components/notification/notification.vue               | 14 +++++++-------
 .../entity_normalizer/entity_normalizer.service.js         |  4 ----
 2 files changed, 7 insertions(+), 11 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 7d88c90b..282ee6c1 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -6,15 +6,15 @@
   >
   </status>
   <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
-    <a class='avatar-container' :href="notification.action.account.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.account.profile_image_url_original"/>
+    <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
     </a>
     <div class='notification-right'>
       <UserCard :user="notification.action.account" :rounded="true" :bordered="true" v-if="userExpanded"/>
       <span class="notification-details">
         <div class="name-and-action">
-          <span class="username" v-if="!!notification.action.account.name_html" :title="'@'+notification.action.account.screen_name" v-html="notification.action.account.name_html"></span>
-          <span class="username" v-else :title="'@'+notification.action.account.screen_name">{{ notification.action.account.name }}</span>
+          <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
+          <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
           <span v-if="notification.type === 'like'">
             <i class="fa icon-star lit"></i>
             <small>{{$t('notifications.favorited_you')}}</small>
@@ -30,18 +30,18 @@
         </div>
         <div class="timeago" v-if="notification.type === 'follow'">
           <span class="faint">
-            <timeago :since="notification.action.notified_at" :auto-update="240"></timeago>
+            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
           </span>
         </div>
         <div class="timeago" v-else>
           <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
-            <timeago :since="notification.action.notified_at" :auto-update="240"></timeago>
+            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
           </router-link>
         </div>
       </span>
       <div class="follow-text" v-if="notification.type === 'follow'">
         <router-link :to="userProfileLink(notification.action.user)">
-          @{{notification.action.account.screen_name}}
+          @{{notification.action.user.screen_name}}
         </router-link>
       </div>
       <template v-else>
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 546ae1c6..9d00162f 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -267,8 +267,6 @@ export const parseFollow = (data) => {
   output.visibility = true
   output.created_at = new Date(data.created_at)
   output.user = parseUser(data.account)
-  output.notified_at = output.created_at
-  output.account = output.user
 
   return output
 }
@@ -289,8 +287,6 @@ export const parseNotification = (data) => {
       : parseStatus(data.status)
     if (data.type === 'reblog' || data.type === 'favourite') {
       output.status.user = parseUser(data.account)
-      output.status.account = parseUser(data.account)
-      output.status.notified_at = new Date(data.created_at)
     }
     output.action = output.status // not sure
     output.from_profile = parseUser(data.account)
-- 
cgit v1.2.3-70-g09d2


From ecacc933e78050d67fe1424513911e01308492ca Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Sun, 31 Mar 2019 13:47:23 -0400
Subject: #436 - keep original naming

---
 src/components/notification/notification.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 282ee6c1..fa931fb6 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -10,7 +10,7 @@
       <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
     </a>
     <div class='notification-right'>
-      <UserCard :user="notification.action.account" :rounded="true" :bordered="true" v-if="userExpanded"/>
+      <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
       <span class="notification-details">
         <div class="name-and-action">
           <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
-- 
cgit v1.2.3-70-g09d2


From 06fd3a9c5f0c1da263c12317723c0d39e548c8a2 Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Sun, 31 Mar 2019 14:50:34 -0400
Subject: #436 - apply patch

---
 src/components/notification/notification.vue       | 24 +++++++++++-----------
 src/modules/users.js                               |  2 +-
 .../entity_normalizer/entity_normalizer.service.js |  5 +----
 3 files changed, 14 insertions(+), 17 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index fa931fb6..e5876cfa 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -1,20 +1,20 @@
 <template>
   <status 
-    v-if="notification.type === 'mention'" 
-    :compact="true" 
+    v-if="notification.type === 'mention'"
+    :compact="true"
     :statusoid="notification.status"
   >
   </status>
   <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else>
-    <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/>
+    <a class='avatar-container' :href="notification.from_profile.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+      <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.from_profile.profile_image_url_original" />
     </a>
     <div class='notification-right'>
-      <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/>
+      <UserCard :user="notification.from_profile" :rounded="true" :bordered="true" v-if="userExpanded" />
       <span class="notification-details">
         <div class="name-and-action">
-          <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span>
-          <span class="username" v-else :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+          <span class="username" v-if="!!notification.from_profile.name_html" :title="'@'+notification.from_profile.screen_name" v-html="notification.from_profile.name_html"></span>
+          <span class="username" v-else :title="'@'+notification.from_profile.screen_name">{{ notification.from_profile.name }}</span>
           <span v-if="notification.type === 'like'">
             <i class="fa icon-star lit"></i>
             <small>{{$t('notifications.favorited_you')}}</small>
@@ -30,22 +30,22 @@
         </div>
         <div class="timeago" v-if="notification.type === 'follow'">
           <span class="faint">
-            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+            <timeago :since="notification.created_at" :auto-update="240"></timeago>
           </span>
         </div>
         <div class="timeago" v-else>
           <router-link v-if="notification.status" :to="{ name: 'conversation', params: { id: notification.status.id } }" class="faint-link">
-            <timeago :since="notification.action.created_at" :auto-update="240"></timeago>
+            <timeago :since="notification.created_at" :auto-update="240"></timeago>
           </router-link>
         </div>
       </span>
       <div class="follow-text" v-if="notification.type === 'follow'">
-        <router-link :to="userProfileLink(notification.action.user)">
-          @{{notification.action.user.screen_name}}
+        <router-link :to="userProfileLink(notification.from_profile)">
+          @{{notification.from_profile.screen_name}}
         </router-link>
       </div>
       <template v-else>
-        <status class="faint" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
+        <status class="faint" :compact="true" :statusoid="notification.action" :noHeading="true"></status>
       </template>
     </div>
   </div>
diff --git a/src/modules/users.js b/src/modules/users.js
index 1a507d31..2c525526 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -123,7 +123,7 @@ export const mutations = {
   },
   setUserForNotification (state, notification) {
     notification.action.user = state.usersObject[notification.action.user.id]
-    notification.from_profile = state.usersObject[notification.action.user.id]
+    notification.from_profile = state.usersObject[notification.from_profile.id]
   },
   setColor (state, { user: { id }, highlighted }) {
     const user = state.usersObject[id]
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 9d00162f..8e3cb066 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -285,10 +285,7 @@ export const parseNotification = (data) => {
     output.status = output.type === 'follow'
       ? parseFollow(data)
       : parseStatus(data.status)
-    if (data.type === 'reblog' || data.type === 'favourite') {
-      output.status.user = parseUser(data.account)
-    }
-    output.action = output.status // not sure
+    output.action = output.status // TODO: Refactor, this is unneeded
     output.from_profile = parseUser(data.account)
   } else {
     const parsedNotice = parseStatus(data.notice)
-- 
cgit v1.2.3-70-g09d2


From 6482201dc9e54d458bec48794260ffa1749c512b Mon Sep 17 00:00:00 2001
From: dave <starpumadev@gmail.com>
Date: Mon, 1 Apr 2019 12:22:49 -0400
Subject: #436 - sync notification & timeline users

---
 src/components/notification/notification.js  | 4 ++--
 src/components/notification/notification.vue | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

(limited to 'src/components/notification/notification.vue')

diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js
index 95fd312e..4ad7de36 100644
--- a/src/components/notification/notification.js
+++ b/src/components/notification/notification.js
@@ -33,13 +33,13 @@ const Notification = {
       return highlightStyle(highlight[user.screen_name])
     },
     userInStore () {
-      return this.$store.getters.findUser(this.notification.action.user.id)
+      return this.$store.getters.findUser(this.notification.from_profile.id)
     },
     user () {
       if (this.userInStore) {
         return this.userInStore
       }
-      return {}
+      return this.notification.from_profile
     }
   }
 }
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index bf952479..77ad89e1 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -10,7 +10,7 @@
       <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.from_profile.profile_image_url_original" />
     </a>
     <div class='notification-right'>
-      <UserCard :user="notification.from_profile" :rounded="true" :bordered="true" v-if="userExpanded" />
+      <UserCard :user="user" :rounded="true" :bordered="true" v-if="userExpanded" />
       <span class="notification-details">
         <div class="name-and-action">
           <span class="username" v-if="!!notification.from_profile.name_html" :title="'@'+notification.from_profile.screen_name" v-html="notification.from_profile.name_html"></span>
-- 
cgit v1.2.3-70-g09d2

