Merge pull request #699 from h3poteto/performance
Improve performance when users type new status
This commit is contained in:
commit
322dd4634f
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -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,11 +209,12 @@ 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 () {
|
||||||
|
if (this.openSuggest) {
|
||||||
this.openSuggest = false
|
this.openSuggest = false
|
||||||
this.startIndex = null
|
this.startIndex = null
|
||||||
this.matchWord = null
|
this.matchWord = null
|
||||||
|
@ -230,6 +222,7 @@ export default {
|
||||||
this.filteredSuggestion = []
|
this.filteredSuggestion = []
|
||||||
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts')
|
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredAccounts')
|
||||||
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags')
|
this.$store.commit('TimelineSpace/Modals/NewToot/Status/clearFilteredHashtags')
|
||||||
|
}
|
||||||
},
|
},
|
||||||
suggestHighlight (index) {
|
suggestHighlight (index) {
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue