review
This commit is contained in:
parent
e5020d6936
commit
0032802f0a
4 changed files with 61 additions and 65 deletions
|
@ -8,7 +8,7 @@ import { take } from 'lodash'
|
||||||
* Intended usage is:
|
* Intended usage is:
|
||||||
* <emoji-input v-model="something">
|
* <emoji-input v-model="something">
|
||||||
* <input v-model="something"/>
|
* <input v-model="something"/>
|
||||||
* </emoji-input>
|
* </EmojiInput>
|
||||||
*
|
*
|
||||||
* Works only with <input> and <textarea>. Intended to use with only one nested
|
* Works only with <input> and <textarea>. Intended to use with only one nested
|
||||||
* input. It will find first input or textarea and work with that, multiple
|
* input. It will find first input or textarea and work with that, multiple
|
||||||
|
|
|
@ -21,65 +21,61 @@ export default function suggest (data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function suggestEmoji (emojis) {
|
export const suggestEmoji = (emojis) => input => {
|
||||||
return input => {
|
const noPrefix = input.toLowerCase().substr(1)
|
||||||
const noPrefix = input.toLowerCase().substr(1)
|
return emojis
|
||||||
return emojis
|
.filter(({ displayText }) => displayText.toLowerCase().startsWith(noPrefix))
|
||||||
.filter(({ displayText }) => displayText.toLowerCase().startsWith(noPrefix))
|
.sort((a, b) => {
|
||||||
.sort((a, b) => {
|
|
||||||
let aScore = 0
|
|
||||||
let bScore = 0
|
|
||||||
|
|
||||||
// Make custom emojis a priority
|
|
||||||
aScore += Number(!!a.imageUrl) * 10
|
|
||||||
bScore += Number(!!b.imageUrl) * 10
|
|
||||||
|
|
||||||
// Sort alphabetically
|
|
||||||
const alphabetically = a.displayText > b.displayText ? 1 : -1
|
|
||||||
|
|
||||||
return bScore - aScore + alphabetically
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function suggestUsers (users) {
|
|
||||||
return input => {
|
|
||||||
const noPrefix = input.toLowerCase().substr(1)
|
|
||||||
return users.filter(
|
|
||||||
user =>
|
|
||||||
user.screen_name.toLowerCase().startsWith(noPrefix) ||
|
|
||||||
user.name.toLowerCase().startsWith(noPrefix)
|
|
||||||
|
|
||||||
/* taking only 20 results so that sorting is a bit cheaper, we display
|
|
||||||
* only 5 anyway. could be inaccurate, but we ideally we should query
|
|
||||||
* backend anyway
|
|
||||||
*/
|
|
||||||
).slice(0, 20).sort((a, b) => {
|
|
||||||
let aScore = 0
|
let aScore = 0
|
||||||
let bScore = 0
|
let bScore = 0
|
||||||
|
|
||||||
// Matches on screen name (i.e. user@instance) makes a priority
|
// Make custom emojis a priority
|
||||||
aScore += a.screen_name.toLowerCase().startsWith(noPrefix) * 2
|
aScore += a.imageUrl ? 10 : 0
|
||||||
bScore += b.screen_name.toLowerCase().startsWith(noPrefix) * 2
|
bScore += b.imageUrl ? 10 : 0
|
||||||
|
|
||||||
// Matches on name takes second priority
|
// Sort alphabetically
|
||||||
aScore += a.name.toLowerCase().startsWith(noPrefix)
|
const alphabetically = a.displayText > b.displayText ? 1 : -1
|
||||||
bScore += b.name.toLowerCase().startsWith(noPrefix)
|
|
||||||
|
|
||||||
const diff = bScore * 10 - aScore * 10
|
return bScore - aScore + alphabetically
|
||||||
|
})
|
||||||
// Then sort alphabetically
|
}
|
||||||
const nameAlphabetically = a.name > b.name ? 1 : -1
|
|
||||||
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
|
export const suggestUsers = (users) => input => {
|
||||||
|
const noPrefix = input.toLowerCase().substr(1)
|
||||||
return diff + nameAlphabetically + screenNameAlphabetically
|
return users.filter(
|
||||||
/* eslint-disable camelcase */
|
user =>
|
||||||
}).map(({ screen_name, name, profile_image_url_original }) => ({
|
user.screen_name.toLowerCase().startsWith(noPrefix) ||
|
||||||
displayText: screen_name,
|
user.name.toLowerCase().startsWith(noPrefix)
|
||||||
detailText: name,
|
|
||||||
imageUrl: profile_image_url_original,
|
/* taking only 20 results so that sorting is a bit cheaper, we display
|
||||||
replacement: '@' + screen_name + ' '
|
* only 5 anyway. could be inaccurate, but we ideally we should query
|
||||||
}))
|
* backend anyway
|
||||||
/* eslint-enable camelcase */
|
*/
|
||||||
}
|
).slice(0, 20).sort((a, b) => {
|
||||||
|
let aScore = 0
|
||||||
|
let bScore = 0
|
||||||
|
|
||||||
|
// Matches on screen name (i.e. user@instance) makes a priority
|
||||||
|
aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
|
||||||
|
bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
|
||||||
|
|
||||||
|
// Matches on name takes second priority
|
||||||
|
aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
|
||||||
|
bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
|
||||||
|
|
||||||
|
const diff = (bScore - aScore) * 10
|
||||||
|
|
||||||
|
// Then sort alphabetically
|
||||||
|
const nameAlphabetically = a.name > b.name ? 1 : -1
|
||||||
|
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
|
||||||
|
|
||||||
|
return diff + nameAlphabetically + screenNameAlphabetically
|
||||||
|
/* eslint-disable camelcase */
|
||||||
|
}).map(({ screen_name, name, profile_image_url_original }) => ({
|
||||||
|
displayText: screen_name,
|
||||||
|
detailText: name,
|
||||||
|
imageUrl: profile_image_url_original,
|
||||||
|
replacement: '@' + screen_name + ' '
|
||||||
|
}))
|
||||||
|
/* eslint-enable camelcase */
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
<span v-if="safeDMEnabled">{{ $t('post_status.direct_warning_to_first_only') }}</span>
|
<span v-if="safeDMEnabled">{{ $t('post_status.direct_warning_to_first_only') }}</span>
|
||||||
<span v-else>{{ $t('post_status.direct_warning_to_all') }}</span>
|
<span v-else>{{ $t('post_status.direct_warning_to_all') }}</span>
|
||||||
</p>
|
</p>
|
||||||
<emoji-input
|
<EmojiInput
|
||||||
v-if="newStatus.spoilerText || alwaysShowSubject"
|
v-if="newStatus.spoilerText || alwaysShowSubject"
|
||||||
:suggest="emojiSuggestor"
|
:suggest="emojiSuggestor"
|
||||||
v-model="newStatus.spoilerText"
|
v-model="newStatus.spoilerText"
|
||||||
|
@ -44,8 +44,8 @@
|
||||||
v-model="newStatus.spoilerText"
|
v-model="newStatus.spoilerText"
|
||||||
class="form-post-subject"
|
class="form-post-subject"
|
||||||
/>
|
/>
|
||||||
</emoji-input>
|
</EmojiInput>
|
||||||
<emoji-input
|
<EmojiInput
|
||||||
:suggest="emojiUserSuggestor"
|
:suggest="emojiUserSuggestor"
|
||||||
v-model="newStatus.status"
|
v-model="newStatus.status"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
class="form-post-body"
|
class="form-post-body"
|
||||||
>
|
>
|
||||||
</textarea>
|
</textarea>
|
||||||
</emoji-input>
|
</EmojiInput>
|
||||||
<div class="visibility-tray">
|
<div class="visibility-tray">
|
||||||
<div class="text-format" v-if="formattingOptionsEnabled">
|
<div class="text-format" v-if="formattingOptionsEnabled">
|
||||||
<label for="post-content-type" class="select">
|
<label for="post-content-type" class="select">
|
||||||
|
|
|
@ -22,20 +22,20 @@
|
||||||
<div class="setting-item" >
|
<div class="setting-item" >
|
||||||
<h2>{{$t('settings.name_bio')}}</h2>
|
<h2>{{$t('settings.name_bio')}}</h2>
|
||||||
<p>{{$t('settings.name')}}</p>
|
<p>{{$t('settings.name')}}</p>
|
||||||
<emoji-input :suggest="emojiSuggestor" v-model="newName">
|
<EmojiInput :suggest="emojiSuggestor" v-model="newName">
|
||||||
<input
|
<input
|
||||||
v-model="newName"
|
v-model="newName"
|
||||||
id="username"
|
id="username"
|
||||||
classname="name-changer"
|
classname="name-changer"
|
||||||
/>
|
/>
|
||||||
</emoji-input>
|
</EmojiInput>
|
||||||
<p>{{$t('settings.bio')}}</p>
|
<p>{{$t('settings.bio')}}</p>
|
||||||
<emoji-input :suggest="emojiUserSuggestor" v-model="newBio">
|
<EmojiInput :suggest="emojiUserSuggestor" v-model="newBio">
|
||||||
<textarea
|
<textarea
|
||||||
v-model="newBio"
|
v-model="newBio"
|
||||||
classname="bio"
|
classname="bio"
|
||||||
/>
|
/>
|
||||||
</emoji-input>
|
</EmojiInput>
|
||||||
<p>
|
<p>
|
||||||
<input type="checkbox" v-model="newLocked" id="account-locked">
|
<input type="checkbox" v-model="newLocked" id="account-locked">
|
||||||
<label for="account-locked">{{$t('settings.lock_account_description')}}</label>
|
<label for="account-locked">{{$t('settings.lock_account_description')}}</label>
|
||||||
|
|
Loading…
Reference in a new issue