pinafore/src/routes/_store/computations/autosuggestComputations.js

60 lines
2.0 KiB
JavaScript

import { get } from '../../_utils/lodash-lite'
const MIN_PREFIX_LENGTH = 1
const ACCOUNT_SEARCH_REGEX = new RegExp(`(?:\\s|^)(@\\S{${MIN_PREFIX_LENGTH},})$`)
const EMOJI_SEARCH_REGEX = new RegExp(`(?:\\s|^)(:[^:]{${MIN_PREFIX_LENGTH},})$`)
function computeForAutosuggest (store, key, defaultValue) {
store.compute(key,
['currentInstance', 'currentComposeRealm', `autosuggestData_${key}`],
(currentInstance, currentComposeRealm, root) => (
get(root, [currentInstance, currentComposeRealm], defaultValue)
)
)
}
export function autosuggestComputations (store) {
computeForAutosuggest(store, 'composeFocused', false)
computeForAutosuggest(store, 'composeSelectionStart', 0)
computeForAutosuggest(store, 'autosuggestSelected', 0)
computeForAutosuggest(store, 'autosuggestSearchResults', [])
computeForAutosuggest(store, 'autosuggestType', null)
store.compute(
'currentComposeText',
['currentComposeData', 'currentComposeRealm'],
(currentComposeData, currentComposeRealm) => (
get(currentComposeData, [currentComposeRealm, 'text'], '')
)
)
store.compute(
'autosuggestSearchText',
['currentComposeText', 'composeSelectionStart'],
(currentComposeText, composeSelectionStart) => {
let selectionStart = composeSelectionStart
if (!currentComposeText || selectionStart < MIN_PREFIX_LENGTH) {
return ''
}
let textUpToCursor = currentComposeText.substring(0, selectionStart)
let match = textUpToCursor.match(ACCOUNT_SEARCH_REGEX) || textUpToCursor.match(EMOJI_SEARCH_REGEX)
return (match && match[1]) || ''
}
)
store.compute(
'autosuggestNumSearchResults',
['autosuggestSearchResults'],
(autosuggestSearchResults) => autosuggestSearchResults.length
)
store.compute(
'autosuggestShown',
['composeFocused', 'autosuggestSearchText', 'autosuggestNumSearchResults'],
(composeFocused, autosuggestSearchText, autosuggestNumSearchResults) => (
!!(composeFocused && autosuggestSearchText && autosuggestNumSearchResults)
)
)
}