From a53555254a711654399836e0f5f052d629bf4380 Mon Sep 17 00:00:00 2001
From: Roger Braun <roger@rogerbraun.net>
Date: Sun, 9 Apr 2017 15:53:23 +0200
Subject: Add word-based muting to settings / statuses.

---
 src/components/settings/settings.vue | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

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

diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 478d761a..33d46e7e 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -8,6 +8,11 @@
         <h2>Theme</h2>
         <style-switcher></style-switcher>
       </div>
+      <div class="setting-item">
+        <h2>Filtering</h2>
+        <p>All notices containing these words will be muted, one per line</p>
+        <textarea id="muteWords" v-model="muteWordsString"></textarea>
+      </div>
       <div class="setting-item">
         <h2>Attachments</h2>
         <ul class="setting-list">
@@ -32,9 +37,13 @@
 <script src="./settings.js">
 </script>
 
-<style>
+<style lang="scss">
  .setting-item {
    margin: 1em 1em 1.4em;
+   textarea {
+     width: 100%;
+     height: 100px;
+   }
  }
  .setting-list {
    list-style-type: none;
-- 
cgit v1.2.3-70-g09d2


From 65646c5a125126bca97b0f5bf5f43c9544fd2cb2 Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson <shpuld@gmail.com>
Date: Sat, 3 Jun 2017 18:51:55 +0300
Subject: Add an option to initiate fetching older statuses automatically when
 scrolled 750 pixels or less from the bottom.

---
 src/components/settings/settings.js  | 4 ++++
 src/components/settings/settings.vue | 4 ++++
 src/components/timeline/timeline.js  | 7 +++++++
 src/main.js                          | 1 +
 src/modules/config.js                | 1 +
 5 files changed, 17 insertions(+)

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

diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js
index 4d0528b6..cfceedde 100644
--- a/src/components/settings/settings.js
+++ b/src/components/settings/settings.js
@@ -7,6 +7,7 @@ const settings = {
       hideAttachmentsLocal: this.$store.state.config.hideAttachments,
       hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv,
       hideNsfwLocal: this.$store.state.config.hideNsfw,
+      autoLoadLocal: this.$store.state.config.autoLoad,
       muteWordsString: this.$store.state.config.muteWords.join('\n')
     }
   },
@@ -23,6 +24,9 @@ const settings = {
     hideNsfwLocal (value) {
       this.$store.dispatch('setOption', { name: 'hideNsfw', value })
     },
+    autoLoadLocal (value) {
+      this.$store.dispatch('setOption', { name: 'autoLoad', value })
+    },
     muteWordsString (value) {
       value = filter(value.split('\n'), (word) => trim(word).length > 0)
       this.$store.dispatch('setOption', { name: 'muteWords', value })
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 33d46e7e..3fab1c1c 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -28,6 +28,10 @@
                 <input type="checkbox" id="hideNsfw" v-model="hideNsfwLocal">
                 <label for="hideNsfw">Enable clickthrough NSFW attachment hiding</label>
             </li>
+            <li>
+                <input type="checkbox" id="autoLoad" v-model="autoLoadLocal">
+                <label for="autoLoad">Enable automatic loading when scrolled to the bottom</label>
+            </li>
         </ul>
       </div>
     </div>
diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js
index d5a9adcc..6070e442 100644
--- a/src/components/timeline/timeline.js
+++ b/src/components/timeline/timeline.js
@@ -20,6 +20,8 @@ const Timeline = {
     const credentials = store.state.users.currentUser.credentials
     const showImmediately = this.timeline.visibleStatuses.length === 0
 
+    window.onscroll = this.scrollLoad
+
     timelineFetcher.fetchAndUpdate({
       store,
       credentials,
@@ -42,6 +44,11 @@ const Timeline = {
         older: true,
         showImmediately: true
       }).then(() => store.commit('setLoading', { timeline: this.timelineName, value: false }))
+    },
+    scrollLoad (e) {
+      if (this.timeline.loading === false && this.$store.state.config.autoLoad && (window.innerHeight + window.pageYOffset) >= (document.body.scrollHeight - 750)) {
+        this.fetchOlderStatuses()
+      }
     }
   }
 }
diff --git a/src/main.js b/src/main.js
index 35261578..351149f1 100644
--- a/src/main.js
+++ b/src/main.js
@@ -33,6 +33,7 @@ const persistedStateOptions = {
     'config.hideAttachments',
     'config.hideAttachmentsInConv',
     'config.hideNsfw',
+    'config.autoLoad',
     'config.muteWords',
     'statuses.notifications',
     'users.users'
diff --git a/src/modules/config.js b/src/modules/config.js
index f59dc6f0..c9152ecc 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -7,6 +7,7 @@ const defaultState = {
   hideAttachments: false,
   hideAttachmentsInConv: false,
   hideNsfw: true,
+  autoLoad: true,
   muteWords: []
 }
 
-- 
cgit v1.2.3-70-g09d2


From f915ae174d3454ade20b9f6c827ce84b04ad7089 Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson <shpuld@gmail.com>
Date: Wed, 7 Jun 2017 17:58:24 +0300
Subject: Add floating status-previews on reply-link mouseover in conversations
 and make them optional in the settings, fix a small visual inconsistency in
 muted statuses while editing the file already..

---
 src/components/conversation/conversation.js  | 17 ++++++++++++-
 src/components/conversation/conversation.vue | 38 +++++++++++++++++++++++++++-
 src/components/settings/settings.js          |  4 +++
 src/components/settings/settings.vue         |  4 +++
 src/components/status/status.js              |  9 +++++++
 src/components/status/status.vue             | 16 ++++++------
 src/main.js                                  |  1 +
 src/modules/config.js                        |  1 +
 8 files changed, 80 insertions(+), 10 deletions(-)

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

diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js
index 3e601c3d..c91e4fde 100644
--- a/src/components/conversation/conversation.js
+++ b/src/components/conversation/conversation.js
@@ -10,7 +10,12 @@ const sortAndFilterConversation = (conversation) => {
 const conversation = {
   data () {
     return {
-      highlight: null
+      highlight: null,
+      preview: {
+        x: 0,
+        y: 0,
+        status
+      }
     }
   },
   props: [
@@ -76,6 +81,16 @@ const conversation = {
     },
     setHighlight (id) {
       this.highlight = Number(id)
+    },
+    setPreview (id, x, y) {
+      if (id) {
+        this.preview.x = x
+        this.preview.y = y
+        this.preview.status = filter(this.conversation, { id: id })[0]
+        console.log(this.preview.status)
+      } else {
+        this.preview.status = null
+      }
     }
   }
 }
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index 96e8a5d7..e8d97f99 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -8,7 +8,17 @@
     </div>
     <div class="panel-body">
       <div class="timeline">
-        <status v-for="status in conversation" @goto="setHighlight" :key="status.id" :statusoid="status" :expandable='false' :focused="focused(status.id)" :inConversation='true' :highlight="highlight" :replies="getReplies(status.id)"></status>
+        <status v-for="status in conversation" @goto="setHighlight" :key="status.id" @preview="setPreview"  :statusoid="status" :expandable='false' :focused="focused(status.id)" :inConversation='true' :highlight="highlight" :replies="getReplies(status.id)"></status>
+      </div>
+    </div>
+    <div class="status-preview base00-background base03-border" :style="{ left: preview.x + 'px', top: preview.y + 'px'}" v-if="preview.status">
+      <img class="avatar" :src="preview.status.user.profile_image_url_original">
+      <div class="text">
+        <h4>
+          {{ preview.status.user.name }}
+          <small><a>{{ preview.status.user.screen_name}}</a></small>
+        </h4>
+        <div @click.prevent="linkClicked" class="status-content" v-html="preview.status.statusnet_html"></div>
       </div>
     </div>
   </div>
@@ -21,4 +31,30 @@
     border-bottom-style: solid;
     border-bottom-width: 1px;
   }
+
+  .status-preview {
+    position: absolute;
+    max-width: 35em;
+    padding: 0.5em;
+    display: flex;
+    border-color: inherit;
+    border-style: solid;
+    border-width: 1px;
+    border-radius: 4px;
+    box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
+    .avatar {
+      width: 32px;
+      height: 32px;
+      border-radius: 50%;
+    }
+    .text {
+      h4 {
+        margin-bottom: 0.4em;
+        small {
+          font-weight: lighter;
+        }
+      }
+      padding: 0 0.5em 0.5em 0.5em;
+    }
+  }
 </style>
diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js
index cfceedde..998aa354 100644
--- a/src/components/settings/settings.js
+++ b/src/components/settings/settings.js
@@ -8,6 +8,7 @@ const settings = {
       hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv,
       hideNsfwLocal: this.$store.state.config.hideNsfw,
       autoLoadLocal: this.$store.state.config.autoLoad,
+      hoverPreviewLocal: this.$store.state.config.hoverPreview,
       muteWordsString: this.$store.state.config.muteWords.join('\n')
     }
   },
@@ -27,6 +28,9 @@ const settings = {
     autoLoadLocal (value) {
       this.$store.dispatch('setOption', { name: 'autoLoad', value })
     },
+    hoverPreviewLocal (value) {
+      this.$store.dispatch('setOption', { name: 'hoverPreview', value })
+    },
     muteWordsString (value) {
       value = filter(value.split('\n'), (word) => trim(word).length > 0)
       this.$store.dispatch('setOption', { name: 'muteWords', value })
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 3fab1c1c..af0242c4 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -32,6 +32,10 @@
                 <input type="checkbox" id="autoLoad" v-model="autoLoadLocal">
                 <label for="autoLoad">Enable automatic loading when scrolled to the bottom</label>
             </li>
+            <li>
+                <input type="checkbox" id="hoverPreview" v-model="hoverPreviewLocal">
+                <label for="hoverPreview">Enable reply-link preview on mouse hover</label>
+            </li>
         </ul>
       </div>
     </div>
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 9448b64b..99dc1b95 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -100,6 +100,15 @@ const Status = {
     },
     toggleUserExpanded () {
       this.userExpanded = !this.userExpanded
+    },
+    replyEnter (id, event) {
+      if (this.$store.state.config.hoverPreview) {
+        let rect = event.target.getBoundingClientRect()
+        this.$emit('preview', Number(id), rect.left + 20, rect.top + 20 + window.pageYOffset);
+      }
+    },
+    replyLeave () {
+      this.$emit('preview', 0, 0, 0)
     }
   },
   watch: {
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index a921c9a6..e582a80d 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -19,7 +19,7 @@
       <div class="media status container muted">
         <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
         <small class="muteWords">{{muteWordHits.join(', ')}}</small>
-        <a href="#" class="unmute" @click.prevent="toggleMute"><i class="icon-eye-off"></i></a>
+        <a href="#" class="unmute" @click.prevent="toggleMute"><i class="fa icon-eye-off"></i></a>
       </div>
     </template>
     <template v-if="!muted">
@@ -56,7 +56,7 @@
                   </small>
                   <template v-if="isReply && !expandable">
                     <small>
-                      <a href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)" ><i class="icon-reply"></i></a>
+                      <a href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)"><i class="icon-reply" @mouseenter="replyEnter(status.in_reply_to_status_id, $event)" @mouseout="replyLeave()"></i></a>
                     </small>
                   </template>
                   -
@@ -70,7 +70,7 @@
                 <h4 class="replies" v-if="inConversation">
                   <small v-if="replies.length">Replies:</small>
                   <small v-for="reply in replies">
-                    <a href="#" @click.prevent="gotoOriginal(reply.id)">{{reply.name}}&nbsp;</a>
+                    <a href="#" @click.prevent="gotoOriginal(reply.id)" @mouseenter="replyEnter(reply.id, $event)" @mouseout="replyLeave()">{{reply.name}}&nbsp;</a>
                   </small>
                 </h4>
               </div>
@@ -178,10 +178,6 @@
        margin-right: -0.3em;
      }
 
-     .greentext {
-         color: green;
-     }
-
      a {
          display: inline-block;
          word-break: break-all;
@@ -222,6 +218,10 @@
      }
  }
 
+ .greentext {
+     color: green;
+ }
+
  .status-conversation {
    border-left-style: solid;
  }
@@ -278,7 +278,7 @@
  }
 
  .muted {
-   padding: 0.1em 0.7em 0.1em 0.8em;
+   padding: 0.1em 0.4em 0.1em 0.8em;
    button {
      margin-left: auto;
    }
diff --git a/src/main.js b/src/main.js
index 351149f1..e5ecf228 100644
--- a/src/main.js
+++ b/src/main.js
@@ -34,6 +34,7 @@ const persistedStateOptions = {
     'config.hideAttachmentsInConv',
     'config.hideNsfw',
     'config.autoLoad',
+    'config.hoverPreview',
     'config.muteWords',
     'statuses.notifications',
     'users.users'
diff --git a/src/modules/config.js b/src/modules/config.js
index c9152ecc..f7d6e9c8 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -8,6 +8,7 @@ const defaultState = {
   hideAttachmentsInConv: false,
   hideNsfw: true,
   autoLoad: true,
+  hoverPreview: true,
   muteWords: []
 }
 
-- 
cgit v1.2.3-70-g09d2

