Merge pull request #699 from h3poteto/performance

Improve performance when users type new status
This commit is contained in:
AkiraFukushima 2018-11-12 22:28:58 +09:00 committed by GitHub
commit 322dd4634f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 69 deletions

View File

@ -92,6 +92,8 @@ export default {
}, },
data () { data () {
return { return {
status: '',
spoiler: '',
showContentWarning: false, showContentWarning: false,
visibilityList: Visibility visibilityList: Visibility
} }
@ -110,6 +112,7 @@ export default {
blockSubmit: state => state.blockSubmit, blockSubmit: state => state.blockSubmit,
visibility: state => state.visibility, visibility: state => state.visibility,
sensitive: state => state.sensitive, sensitive: state => state.sensitive,
initialStatus: state => state.initialStatus,
visibilityIcon: (state) => { visibilityIcon: (state) => {
switch (state.visibility) { switch (state.visibility) {
case Visibility.Public.value: case Visibility.Public.value:
@ -143,22 +146,6 @@ export default {
} }
} }
}, },
status: {
get () {
return this.$store.state.TimelineSpace.Modals.NewToot.status
},
set (value) {
this.$store.commit('TimelineSpace/Modals/NewToot/updateStatus', value)
}
},
spoiler: {
get () {
return this.$store.state.TimelineSpace.Modals.NewToot.spoiler
},
set (value) {
this.$store.commit('TimelineSpace/Modals/NewToot/updateSpoiler', value)
}
},
pinedHashtag: { pinedHashtag: {
get () { get () {
return this.$store.state.TimelineSpace.Modals.NewToot.pinedHashtag return this.$store.state.TimelineSpace.Modals.NewToot.pinedHashtag
@ -172,6 +159,8 @@ export default {
newTootModal: function (newState, oldState) { newTootModal: function (newState, oldState) {
if (!oldState && newState) { if (!oldState && newState) {
this.showContentWarning = false this.showContentWarning = false
this.spoiler = ''
this.status = this.initialStatus
} }
} }
}, },

View File

@ -132,35 +132,38 @@ export default {
} }
}, },
methods: { methods: {
startSuggest (e) { async startSuggest (e) {
const currentValue = e.target.value const currentValue = e.target.value
// Start suggest after user stop writing // Start suggest after user stop writing
setTimeout(() => { setTimeout(async () => {
if (currentValue === this.status) { if (currentValue === this.status) {
this.suggest(e) await this.suggest(e)
} }
}, 500) }, 700)
}, },
async suggest (e) { 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.sectionStart: Cursor position
// e.target.value: current value of the textarea // 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) { if (!start || !word) {
this.closeSuggest() this.closeSuggest()
return false 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 { try {
await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchAccount', word) await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchAccount', word)
this.openSuggest = true this.openSuggest = true
@ -173,12 +176,7 @@ export default {
return false return false
} }
}, },
async suggestHashtag (e) { async suggestHashtag (start, word) {
const [start, word] = suggestText(e.target.value, e.target.selectionStart, '#')
if (!start || !word) {
this.closeSuggest()
return false
}
try { try {
await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchHashtag', word) await this.$store.dispatch('TimelineSpace/Modals/NewToot/Status/searchHashtag', word)
this.openSuggest = true this.openSuggest = true
@ -191,14 +189,7 @@ export default {
return false return false
} }
}, },
suggestEmoji (e) { suggestEmoji (start, word) {
// 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
}
// Find native emojis // Find native emojis
const filteredEmojiName = emojilib.ordered.filter(emoji => `:${emoji}`.includes(word)) const filteredEmojiName = emojilib.ordered.filter(emoji => `:${emoji}`.includes(word))
const filteredNativeEmoji = filteredEmojiName.map((name) => { const filteredNativeEmoji = filteredEmojiName.map((name) => {
@ -218,18 +209,20 @@ export default {
return (array.findIndex(ar => e.name === ar.name) === i) return (array.findIndex(ar => e.name === ar.name) === i)
}) })
} else { } else {
this.openSuggest = false this.closeSuggest()
} }
return true return true
}, },
closeSuggest () { closeSuggest () {
this.openSuggest = false if (this.openSuggest) {
this.startIndex = null this.openSuggest = false
this.matchWord = null this.startIndex = null
this.highlightedIndex = 0 this.matchWord = null
this.filteredSuggestion = [] this.highlightedIndex = 0
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts') this.filteredSuggestion = []
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags') this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts')
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags')
}
}, },
suggestHighlight (index) { suggestHighlight (index) {
if (index < 0) { if (index < 0) {

View File

@ -10,13 +10,12 @@ const NewToot = {
}, },
state: { state: {
modalOpen: false, modalOpen: false,
status: '', initialStatus: '',
replyToMessage: null, replyToMessage: null,
blockSubmit: false, blockSubmit: false,
attachedMedias: [], attachedMedias: [],
visibility: Visibility.Public.value, visibility: Visibility.Public.value,
sensitive: false, sensitive: false,
spoiler: '',
attachedMediaId: 0, attachedMediaId: 0,
pinedHashtag: false, pinedHashtag: false,
hashtags: [] hashtags: []
@ -28,8 +27,8 @@ const NewToot = {
setReplyTo (state, message) { setReplyTo (state, message) {
state.replyToMessage = message state.replyToMessage = message
}, },
updateStatus (state, status) { updateInitialStatus (state, status) {
state.status = status state.initialStatus = status
}, },
changeBlockSubmit (state, value) { changeBlockSubmit (state, value) {
state.blockSubmit = value state.blockSubmit = value
@ -55,9 +54,6 @@ const NewToot = {
changeSensitive (state, value) { changeSensitive (state, value) {
state.sensitive = value state.sensitive = value
}, },
updateSpoiler (state, value) {
state.spoiler = value
},
updateMediaId (state, value) { updateMediaId (state, value) {
state.attachedMediaId = value state.attachedMediaId = value
}, },
@ -93,8 +89,8 @@ const NewToot = {
const mentionAccounts = [message.account.acct].concat(message.mentions.map(a => a.acct)) const mentionAccounts = [message.account.acct].concat(message.mentions.map(a => a.acct))
.filter((a, i, self) => self.indexOf(a) === i) .filter((a, i, self) => self.indexOf(a) === i)
.filter((a) => a !== rootState.TimelineSpace.account.username) .filter((a) => a !== rootState.TimelineSpace.account.username)
commit('updateInitialStatus', `${mentionAccounts.map(m => `@${m}`).join(' ')} `)
commit('changeModal', true) commit('changeModal', true)
commit('updateStatus', `${mentionAccounts.map(m => `@${m}`).join(' ')} `)
let value = Visibility.Public.value let value = Visibility.Public.value
Object.keys(Visibility).map((key, index) => { Object.keys(Visibility).map((key, index) => {
const target = Visibility[key] const target = Visibility[key]
@ -105,20 +101,19 @@ const NewToot = {
commit('changeVisibilityValue', value) commit('changeVisibilityValue', value)
}, },
openModal ({ dispatch, commit, state, rootState }) { openModal ({ dispatch, commit, state, rootState }) {
commit('changeModal', true)
if (!state.replyToMessage && state.pinedHashtag) { if (!state.replyToMessage && state.pinedHashtag) {
commit('updateStatus', state.hashtags.map(t => ` #${t.name}`).join()) commit('updateInitialStatus', state.hashtags.map(t => ` #${t.name}`).join())
} }
commit('changeModal', true)
dispatch('fetchVisibility') dispatch('fetchVisibility')
}, },
closeModal ({ commit }) { closeModal ({ commit }) {
commit('changeModal', false) commit('changeModal', false)
commit('updateStatus', '') commit('updateInitialStatus', '')
commit('setReplyTo', null) commit('setReplyTo', null)
commit('changeBlockSubmit', false) commit('changeBlockSubmit', false)
commit('clearAttachedMedias') commit('clearAttachedMedias')
commit('changeSensitive', false) commit('changeSensitive', false)
commit('updateSpoiler', '')
commit('changeVisibilityValue', Visibility.Public.value) commit('changeVisibilityValue', Visibility.Public.value)
}, },
uploadImage ({ state, commit, rootState }, image) { uploadImage ({ state, commit, rootState }, image) {

View File

@ -1,5 +1,5 @@
// https://github.com/tootsuite/mastodon/blob/master/app/javascript/mastodon/components/autosuggest_textarea.js // 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 word
let left = str.slice(0, cursorPosition).search(/\S+$/) let left = str.slice(0, cursorPosition).search(/\S+$/)
@ -11,7 +11,7 @@ const textAtCursorMatch = (str, cursorPosition, separator = '@') => {
word = str.slice(left, right + cursorPosition) 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] return [null, null]
} }