summaryrefslogtreecommitdiff
path: root/src/client/components/autocomplete.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/components/autocomplete.vue')
-rw-r--r--src/client/components/autocomplete.vue62
1 files changed, 37 insertions, 25 deletions
diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue
index e77b0d1a99..7f4b565723 100644
--- a/src/client/components/autocomplete.vue
+++ b/src/client/components/autocomplete.vue
@@ -1,12 +1,12 @@
<template>
-<div class="swhvrteh" @contextmenu.prevent="() => {}">
+<div class="swhvrteh _popup _shadow" @contextmenu.prevent="() => {}">
<ol class="users" ref="suggests" v-if="type === 'user'">
<li v-for="user in users" @click="complete(type, user)" @keydown="onKeydown" tabindex="-1" class="user">
<img class="avatar" :src="user.avatarUrl"/>
<span class="name">
- <mk-user-name :user="user" :key="user.id"/>
+ <MkUserName :user="user" :key="user.id"/>
</span>
- <span class="username">@{{ user | acct }}</span>
+ <span class="username">@{{ acct(user) }}</span>
</li>
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $t('selectUser') }}</li>
</ol>
@@ -28,12 +28,13 @@
</template>
<script lang="ts">
-import Vue from 'vue';
+import { defineComponent } from 'vue';
import { emojilist } from '../../misc/emojilist';
-import contains from '../scripts/contains';
+import contains from '@/scripts/contains';
import { twemojiSvgBase } from '../../misc/twemoji-base';
-import { getStaticImageUrl } from '../scripts/get-static-image-url';
-import MkUserSelect from './user-select.vue';
+import { getStaticImageUrl } from '@/scripts/get-static-image-url';
+import { acct } from '@/filters/user';
+import * as os from '@/os';
type EmojiDef = {
emoji: string;
@@ -74,7 +75,7 @@ for (const x of lib) {
emjdb.sort((a, b) => a.name.length - b.name.length);
-export default Vue.extend({
+export default defineComponent({
props: {
type: {
type: String,
@@ -91,11 +92,6 @@ export default Vue.extend({
required: true,
},
- complete: {
- type: Function,
- required: true,
- },
-
close: {
type: Function,
required: true,
@@ -110,8 +106,15 @@ export default Vue.extend({
type: Number,
required: true,
},
+
+ showing: {
+ type: Boolean,
+ required: true
+ },
},
+ emits: ['done', 'closed'],
+
data() {
return {
getStaticImageUrl,
@@ -135,6 +138,14 @@ export default Vue.extend({
}
},
+ watch: {
+ showing() {
+ if (!this.showing) {
+ this.$emit('closed');
+ }
+ }
+ },
+
updated() {
this.setPosition();
},
@@ -189,7 +200,7 @@ export default Vue.extend({
});
},
- beforeDestroy() {
+ beforeUnmount() {
this.textarea.removeEventListener('keydown', this.onKeydown);
for (const el of Array.from(document.querySelectorAll('body *'))) {
@@ -198,6 +209,11 @@ export default Vue.extend({
},
methods: {
+ complete(type, value) {
+ this.$emit('done', { type, value });
+ this.$emit('closed');
+ },
+
setPosition() {
if (this.x + this.$el.offsetWidth > window.innerWidth) {
this.$el.style.left = (window.innerWidth - this.$el.offsetWidth) + 'px';
@@ -236,8 +252,8 @@ export default Vue.extend({
this.users = users;
this.fetching = false;
} else {
- this.$root.api('users/search', {
- query: this.q,
+ os.api('users/search-by-username-and-host', {
+ username: this.q,
limit: 10,
detail: false
}).then(users => {
@@ -260,7 +276,7 @@ export default Vue.extend({
this.hashtags = hashtags;
this.fetching = false;
} else {
- this.$root.api('hashtags/search', {
+ os.api('hashtags/search', {
query: this.q,
limit: 30
}).then(hashtags => {
@@ -374,14 +390,13 @@ export default Vue.extend({
chooseUser() {
this.close();
- const vm = this.$root.new(MkUserSelect, {});
- vm.$once('selected', user => {
+ os.selectUser().then(user => {
this.complete('user', user);
- });
- vm.$once('closed', () => {
this.textarea.focus();
});
- }
+ },
+
+ acct
}
});
</script>
@@ -393,9 +408,6 @@ export default Vue.extend({
max-width: 100%;
margin-top: calc(1em + 8px);
overflow: hidden;
- background: var(--panel);
- border: solid 1px rgba(#000, 0.1);
- border-radius: 4px;
transition: top 0.1s ease, left 0.1s ease;
> ol {