From e104ac0e6bacb449d52ec3f8782790f8e80e5581 Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Mon, 12 Nov 2018 22:07:13 +0900
Subject: [PATCH] Change suggestion logic for performance
---
.../TimelineSpace/Modals/NewToot/Status.vue | 71 +++++++++----------
src/renderer/utils/suggestText.js | 4 +-
2 files changed, 34 insertions(+), 41 deletions(-)
diff --git a/src/renderer/components/TimelineSpace/Modals/NewToot/Status.vue b/src/renderer/components/TimelineSpace/Modals/NewToot/Status.vue
index 95237537..6cd39cd2 100644
--- a/src/renderer/components/TimelineSpace/Modals/NewToot/Status.vue
+++ b/src/renderer/components/TimelineSpace/Modals/NewToot/Status.vue
@@ -132,35 +132,38 @@ export default {
}
},
methods: {
- startSuggest (e) {
+ async startSuggest (e) {
const currentValue = e.target.value
// Start suggest after user stop writing
- setTimeout(() => {
+ setTimeout(async () => {
if (currentValue === this.status) {
- this.suggest(e)
+ await this.suggest(e)
}
- }, 500)
+ }, 700)
},
async suggest (e) {
- const emoji = this.suggestEmoji(e)
- if (emoji) {
- return true
- }
- const ac = await this.suggestAccount(e)
- if (ac) {
- return true
- }
- const tag = await this.suggestHashtag(e)
- return tag
- },
- async suggestAccount (e) {
// e.target.sectionStart: Cursor position
// e.target.value: current value of the textarea
- const [start, word] = suggestText(e.target.value, e.target.selectionStart, '@')
+ const [start, word] = suggestText(e.target.value, e.target.selectionStart)
if (!start || !word) {
this.closeSuggest()
return false
}
+ switch (word.charAt(0)) {
+ case ':':
+ await this.suggestEmoji(start, word)
+ return true
+ case '@':
+ await this.suggestAccount(start, word)
+ return true
+ case '#':
+ await this.suggestHashtag(start, word)
+ return true
+ default:
+ return false
+ }
+ },
+ async suggestAccount (start, word) {
try {
await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchAccount', word)
this.openSuggest = true
@@ -173,12 +176,7 @@ export default {
return false
}
},
- async suggestHashtag (e) {
- const [start, word] = suggestText(e.target.value, e.target.selectionStart, '#')
- if (!start || !word) {
- this.closeSuggest()
- return false
- }
+ async suggestHashtag (start, word) {
try {
await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchHashtag', word)
this.openSuggest = true
@@ -191,14 +189,7 @@ export default {
return false
}
},
- suggestEmoji (e) {
- // e.target.sectionStart: Cursor position
- // e.target.value: current value of the textarea
- const [start, word] = suggestText(e.target.value, e.target.selectionStart, ':')
- if (!start || !word) {
- this.closeSuggest()
- return false
- }
+ suggestEmoji (start, word) {
// Find native emojis
const filteredEmojiName = emojilib.ordered.filter(emoji => `:${emoji}`.includes(word))
const filteredNativeEmoji = filteredEmojiName.map((name) => {
@@ -218,18 +209,20 @@ export default {
return (array.findIndex(ar => e.name === ar.name) === i)
})
} else {
- this.openSuggest = false
+ this.closeSuggest()
}
return true
},
closeSuggest () {
- this.openSuggest = false
- this.startIndex = null
- this.matchWord = null
- this.highlightedIndex = 0
- this.filteredSuggestion = []
- this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts')
- this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags')
+ if (this.openSuggest) {
+ this.openSuggest = false
+ this.startIndex = null
+ this.matchWord = null
+ this.highlightedIndex = 0
+ this.filteredSuggestion = []
+ this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts')
+ this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags')
+ }
},
suggestHighlight (index) {
if (index < 0) {
diff --git a/src/renderer/utils/suggestText.js b/src/renderer/utils/suggestText.js
index 2f7dd800..a1e42526 100644
--- a/src/renderer/utils/suggestText.js
+++ b/src/renderer/utils/suggestText.js
@@ -1,5 +1,5 @@
// https://github.com/tootsuite/mastodon/blob/master/app/javascript/mastodon/components/autosuggest_textarea.js
-const textAtCursorMatch = (str, cursorPosition, separator = '@') => {
+const textAtCursorMatch = (str, cursorPosition, separators = ['@', '#', ':']) => {
let word
let left = str.slice(0, cursorPosition).search(/\S+$/)
@@ -11,7 +11,7 @@ const textAtCursorMatch = (str, cursorPosition, separator = '@') => {
word = str.slice(left, right + cursorPosition)
}
- if (!word || word.trim().length < 3 || [separator].indexOf(word[0]) === -1) {
+ if (!word || word.trim().length < 3 || separators.indexOf(word[0]) === -1) {
return [null, null]
}