From 07fb5e867c284fe040fe519bdd0fd343cee19291 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Sun, 6 May 2018 16:25:17 -0700 Subject: [PATCH] isolate autosuggestion state (#273) fixes #261 --- routes/_actions/autosuggest.js | 62 +++++++ routes/_actions/compose.js | 22 --- routes/_actions/emoji.js | 22 --- .../compose/ComposeAutosuggest.html | 153 +++++------------- .../compose/ComposeAutosuggestionList.html | 9 +- routes/_components/compose/ComposeInput.html | 59 ++++--- .../computations/autosuggestComputations.js | 56 +++++++ routes/_store/computations/computations.js | 2 + routes/_store/mixins/autosuggestMixins.js | 19 +++ routes/_store/mixins/mixins.js | 2 + .../_store/observers/autosuggestObservers.js | 42 +++++ routes/_store/observers/observers.js | 2 + webpack.client.config.js | 4 +- 13 files changed, 271 insertions(+), 183 deletions(-) create mode 100644 routes/_actions/autosuggest.js create mode 100644 routes/_store/computations/autosuggestComputations.js create mode 100644 routes/_store/mixins/autosuggestMixins.js create mode 100644 routes/_store/observers/autosuggestObservers.js diff --git a/routes/_actions/autosuggest.js b/routes/_actions/autosuggest.js new file mode 100644 index 0000000..43facca --- /dev/null +++ b/routes/_actions/autosuggest.js @@ -0,0 +1,62 @@ +import { store } from '../_store/store' + +export async function insertUsername (realm, username, startIndex, endIndex) { + let { currentInstance } = store.get() + let oldText = store.getComposeData(realm, 'text') + let pre = oldText.substring(0, startIndex) + let post = oldText.substring(endIndex) + let newText = `${pre}@${username} ${post}` + store.setComposeData(realm, {text: newText}) + store.setForAutosuggest(currentInstance, realm, {autosuggestSearchResults: []}) +} + +export async function clickSelectedAutosuggestionUsername (realm) { + let { + composeSelectionStart, + autosuggestSearchText, + autosuggestSelected, + autosuggestSearchResults + } = store.get() + let account = autosuggestSearchResults[autosuggestSelected] + let startIndex = composeSelectionStart - autosuggestSearchText.length + let endIndex = composeSelectionStart + await insertUsername(realm, account.acct, startIndex, endIndex) +} + +export function insertEmojiAtPosition (realm, emoji, startIndex, endIndex) { + let { currentInstance } = store.get() + let oldText = store.getComposeData(realm, 'text') || '' + let pre = oldText.substring(0, startIndex) + let post = oldText.substring(endIndex) + let newText = `${pre}:${emoji.shortcode}: ${post}` + store.setComposeData(realm, {text: newText}) + store.setForAutosuggest(currentInstance, realm, {autosuggestSearchResults: []}) +} + +export async function clickSelectedAutosuggestionEmoji (realm) { + let { + composeSelectionStart, + autosuggestSearchText, + autosuggestSelected, + autosuggestSearchResults + } = store.get() + let emoji = autosuggestSearchResults[autosuggestSelected] + let startIndex = composeSelectionStart - autosuggestSearchText.length + let endIndex = composeSelectionStart + await insertEmojiAtPosition(realm, emoji, startIndex, endIndex) +} + +export function selectAutosuggestItem (item) { + let { + currentComposeRealm, + composeSelectionStart, + autosuggestSearchText + } = store.get() + let startIndex = composeSelectionStart - autosuggestSearchText.length + let endIndex = composeSelectionStart + if (item.acct) { + /* no await */ insertUsername(currentComposeRealm, item.acct, startIndex, endIndex) + } else { + /* no await */ insertEmojiAtPosition(currentComposeRealm, item, startIndex, endIndex) + } +} diff --git a/routes/_actions/compose.js b/routes/_actions/compose.js index 5a763d1..81d432a 100644 --- a/routes/_actions/compose.js +++ b/routes/_actions/compose.js @@ -50,28 +50,6 @@ export async function postStatus (realm, text, inReplyToId, mediaIds, } } -export async function insertUsername (realm, username, startIndex, endIndex) { - let oldText = store.getComposeData(realm, 'text') - let pre = oldText.substring(0, startIndex) - let post = oldText.substring(endIndex) - let newText = `${pre}@${username} ${post}` - store.setComposeData(realm, {text: newText}) -} - -export async function clickSelectedAutosuggestionUsername (realm) { - let { - composeSelectionStart, - composeAutosuggestionSearchText, - composeAutosuggestionSelected, - composeAutosuggestionSearchResults - } = store.get() - composeAutosuggestionSelected = composeAutosuggestionSelected || 0 - let account = composeAutosuggestionSearchResults[composeAutosuggestionSelected] - let startIndex = composeSelectionStart - composeAutosuggestionSearchText.length - let endIndex = composeSelectionStart - await insertUsername(realm, account.acct, startIndex, endIndex) -} - export function setReplySpoiler (realm, spoiler) { let contentWarning = store.getComposeData(realm, 'contentWarning') let contentWarningShown = store.getComposeData(realm, 'contentWarningShown') diff --git a/routes/_actions/emoji.js b/routes/_actions/emoji.js index d63a6a2..7877bfe 100644 --- a/routes/_actions/emoji.js +++ b/routes/_actions/emoji.js @@ -28,25 +28,3 @@ export function insertEmoji (realm, emoji) { let newText = `${pre}:${emoji.shortcode}: ${post}` store.setComposeData(realm, {text: newText}) } - -export function insertEmojiAtPosition (realm, emoji, startIndex, endIndex) { - let oldText = store.getComposeData(realm, 'text') || '' - let pre = oldText.substring(0, startIndex) - let post = oldText.substring(endIndex) - let newText = `${pre}:${emoji.shortcode}: ${post}` - store.setComposeData(realm, {text: newText}) -} - -export async function clickSelectedAutosuggestionEmoji (realm) { - let { - composeSelectionStart, - composeAutosuggestionSearchText, - composeAutosuggestionSelected, - composeAutosuggestionSearchResults - } = store.get() - composeAutosuggestionSelected = composeAutosuggestionSelected || 0 - let emoji = composeAutosuggestionSearchResults[composeAutosuggestionSelected] - let startIndex = composeSelectionStart - composeAutosuggestionSearchText.length - let endIndex = composeSelectionStart - await insertEmojiAtPosition(realm, emoji, startIndex, endIndex) -} diff --git a/routes/_components/compose/ComposeAutosuggest.html b/routes/_components/compose/ComposeAutosuggest.html index e7c6a9f..b12902b 100644 --- a/routes/_components/compose/ComposeAutosuggest.html +++ b/routes/_components/compose/ComposeAutosuggest.html @@ -1,10 +1,10 @@