summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2019-02-17 23:41:47 +0900
committerGitHub <noreply@github.com>2019-02-17 23:41:47 +0900
commit1d5a54ff6f74569fa89c4083301d9b01eb80ad29 (patch)
tree0695f8ee6942b49236b880bb228be45b26282e90 /src/client
parentFix #4300 (#4304) (diff)
downloadmisskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.tar.gz
misskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.tar.bz2
misskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.zip
ハッシュタグでユーザー検索できるように (#4298)
* ハッシュタグでユーザー検索できるように * :art: * Increase limit * リモートユーザーも表示 * Fix bug * Fix bug * Improve performance
Diffstat (limited to 'src/client')
-rw-r--r--src/client/app/common/views/components/mfm.ts8
-rw-r--r--src/client/app/common/views/components/user-list.vue2
-rw-r--r--src/client/app/common/views/pages/explore.vue86
-rw-r--r--src/client/app/common/views/pages/follow.vue2
-rw-r--r--src/client/app/desktop/script.ts2
-rw-r--r--src/client/app/desktop/views/components/user-card.vue2
-rw-r--r--src/client/app/desktop/views/deck/deck.user-column.vue2
-rw-r--r--src/client/app/desktop/views/home/user/user.header.vue2
-rw-r--r--src/client/app/mobile/script.ts1
-rw-r--r--src/client/app/mobile/views/components/user-preview.vue2
-rw-r--r--src/client/app/mobile/views/pages/user/index.vue2
11 files changed, 90 insertions, 21 deletions
diff --git a/src/client/app/common/views/components/mfm.ts b/src/client/app/common/views/components/mfm.ts
index e322c53a38..78734200a7 100644
--- a/src/client/app/common/views/components/mfm.ts
+++ b/src/client/app/common/views/components/mfm.ts
@@ -40,7 +40,11 @@ export default Vue.component('misskey-flavored-markdown', {
},
customEmojis: {
required: false,
- }
+ },
+ isNote: {
+ type: Boolean,
+ default: true
+ },
},
render(createElement) {
@@ -204,7 +208,7 @@ export default Vue.component('misskey-flavored-markdown', {
return [createElement('router-link', {
key: Math.random(),
attrs: {
- to: `/tags/${encodeURIComponent(token.node.props.hashtag)}`,
+ to: this.isNote ? `/tags/${encodeURIComponent(token.node.props.hashtag)}` : `/explore/tags/${encodeURIComponent(token.node.props.hashtag)}`,
style: 'color:var(--mfmHashtag);'
}
}, `#${token.node.props.hashtag}`)];
diff --git a/src/client/app/common/views/components/user-list.vue b/src/client/app/common/views/components/user-list.vue
index 8541e85433..ee44eac860 100644
--- a/src/client/app/common/views/components/user-list.vue
+++ b/src/client/app/common/views/components/user-list.vue
@@ -13,7 +13,7 @@
<p class="username">@{{ user | acct }}</p>
</div>
<div class="description" v-if="user.description" :title="user.description">
- <mfm :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/>
+ <mfm :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/>
</div>
</div>
</div>
diff --git a/src/client/app/common/views/pages/explore.vue b/src/client/app/common/views/pages/explore.vue
index 79fa26b70f..2d273d3fd2 100644
--- a/src/client/app/common/views/pages/explore.vue
+++ b/src/client/app/common/views/pages/explore.vue
@@ -1,29 +1,53 @@
<template>
<div>
- <mk-user-list :make-promise="verifiedUsers">
- <span><fa :icon="faBookmark"/> {{ $t('verified-users') }}</span>
+ <mk-user-list v-if="tag != null" :make-promise="tagUsers" :key="tag">
+ <fa :icon="faHashtag" fixed-width/>{{ tag }}
</mk-user-list>
- <mk-user-list :make-promise="popularUsers">
- <span><fa :icon="faChartLine"/> {{ $t('popular-users') }}</span>
- </mk-user-list>
- <mk-user-list :make-promise="recentlyUpdatedUsers">
- <span><fa :icon="faCommentAlt"/> {{ $t('recently-updated-users') }}</span>
- </mk-user-list>
- <mk-user-list :make-promise="recentlyRegisteredUsers">
- <span><fa :icon="faPlus"/> {{ $t('recently-registered-users') }}</span>
+ <mk-user-list v-if="tag != null" :make-promise="tagRemoteUsers" :key="tag">
+ <fa :icon="faHashtag" fixed-width/>{{ tag }} ({{ $t('federated') }})
</mk-user-list>
+
+ <ui-container :body-togglable="true">
+ <template slot="header"><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
+
+ <div class="vxjfqztj">
+ <router-link v-for="tag in tags" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
+ </div>
+ </ui-container>
+
+ <template v-if="tag == null">
+ <mk-user-list :make-promise="verifiedUsers">
+ <fa :icon="faBookmark" fixed-width/>{{ $t('verified-users') }}
+ </mk-user-list>
+ <mk-user-list :make-promise="popularUsers">
+ <fa :icon="faChartLine" fixed-width/>{{ $t('popular-users') }}
+ </mk-user-list>
+ <mk-user-list :make-promise="recentlyUpdatedUsers">
+ <fa :icon="faCommentAlt" fixed-width/>{{ $t('recently-updated-users') }}
+ </mk-user-list>
+ <mk-user-list :make-promise="recentlyRegisteredUsers">
+ <fa :icon="faPlus" fixed-width/>{{ $t('recently-registered-users') }}
+ </mk-user-list>
+ </template>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
-import { faChartLine, faPlus } from '@fortawesome/free-solid-svg-icons';
+import { faChartLine, faPlus, faHashtag } from '@fortawesome/free-solid-svg-icons';
import { faBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
i18n: i18n('common/views/pages/explore.vue'),
+ props: {
+ tag: {
+ type: String,
+ required: false
+ }
+ },
+
data() {
return {
verifiedUsers: () => this.$root.api('users', {
@@ -49,11 +73,49 @@ export default Vue.extend({
sort: '+createdAt',
limit: 10
}),
- faBookmark, faChartLine, faCommentAlt, faPlus
+ tags: [],
+ faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag
};
},
+
+ computed: {
+ tagUsers(): () => Promise<any> {
+ return () => this.$root.api('hashtags/users', {
+ tag: this.tag,
+ state: 'alive',
+ origin: 'local',
+ sort: '+follower',
+ limit: 30
+ });
+ },
+
+ tagRemoteUsers(): () => Promise<any> {
+ return () => this.$root.api('hashtags/users', {
+ tag: this.tag,
+ state: 'alive',
+ origin: 'remote',
+ sort: '+follower',
+ limit: 30
+ });
+ },
+ },
+
+ created() {
+ this.$root.api('hashtags/list', {
+ sort: '+attachedLocalUsers',
+ limit: 30
+ }).then(tags => {
+ this.tags = tags;
+ });
+ }
});
</script>
<style lang="stylus" scoped>
+.vxjfqztj
+ padding 16px
+
+ > *
+ margin-right 16px
+
</style>
diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue
index 4d1febaec0..f8d12a2dca 100644
--- a/src/client/app/common/views/pages/follow.vue
+++ b/src/client/app/common/views/pages/follow.vue
@@ -12,7 +12,7 @@
</router-link>
<span class="username">@{{ user | acct }}</span>
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
</div>
</main>
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index c66171e3af..8c8e3c3fbf 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -146,6 +146,7 @@ init(async (launch, os) => {
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/deck/deck.hashtag-column.vue').then(m => m.default) },
{ path: '/featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) },
{ path: '/explore', component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) },
+ { path: '/explore/tags/:tag', props: true, component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) },
{ path: '/i/favorites', component: () => import('./views/deck/deck.favorites-column.vue').then(m => m.default) }
]}
: { path: '/', component: MkHome, children: [
@@ -160,6 +161,7 @@ init(async (launch, os) => {
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/home/tag.vue').then(m => m.default) },
{ path: '/featured', name: 'featured', component: () => import('./views/home/featured.vue').then(m => m.default) },
{ path: '/explore', name: 'explore', component: () => import('../common/views/pages/explore.vue').then(m => m.default) },
+ { path: '/explore/tags/:tag', name: 'explore', props: true, component: () => import('../common/views/pages/explore.vue').then(m => m.default) },
{ path: '/i/favorites', component: () => import('./views/home/favorites.vue').then(m => m.default) },
]},
{ path: '/i/messaging/:user', component: MkMessagingRoom },
diff --git a/src/client/app/desktop/views/components/user-card.vue b/src/client/app/desktop/views/components/user-card.vue
index 21a4ab9f6c..61b3be9305 100644
--- a/src/client/app/desktop/views/components/user-card.vue
+++ b/src/client/app/desktop/views/components/user-card.vue
@@ -10,7 +10,7 @@
<span class="username">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
</div>
</div>
diff --git a/src/client/app/desktop/views/deck/deck.user-column.vue b/src/client/app/desktop/views/deck/deck.user-column.vue
index d6618c5716..813667f6aa 100644
--- a/src/client/app/desktop/views/deck/deck.user-column.vue
+++ b/src/client/app/desktop/views/deck/deck.user-column.vue
@@ -25,7 +25,7 @@
</header>
<div class="info">
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
<div class="fields" v-if="user.fields">
<dl class="field" v-for="(field, i) in user.fields" :key="i">
diff --git a/src/client/app/desktop/views/home/user/user.header.vue b/src/client/app/desktop/views/home/user/user.header.vue
index debfb24393..1219a07916 100644
--- a/src/client/app/desktop/views/home/user/user.header.vue
+++ b/src/client/app/desktop/views/home/user/user.header.vue
@@ -23,7 +23,7 @@
<ui-button @click="menu" ref="menu" :inline="true"><fa icon="ellipsis-h"/></ui-button>
</div>
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
<div class="fields" v-if="user.fields">
<dl class="field" v-for="(field, i) in user.fields" :key="i">
diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts
index dbdc0f630c..9bec577d7b 100644
--- a/src/client/app/mobile/script.ts
+++ b/src/client/app/mobile/script.ts
@@ -133,6 +133,7 @@ init((launch) => {
{ path: '/tags/:tag', component: MkTag },
{ path: '/featured', name: 'featured', component: () => import('./views/pages/featured.vue').then(m => m.default) },
{ path: '/explore', name: 'explore', component: () => import('./views/pages/explore.vue').then(m => m.default) },
+ { path: '/explore/tags/:tag', name: 'explore', props: true, component: () => import('./views/pages/explore.vue').then(m => m.default) },
{ path: '/share', component: MkShare },
{ path: '/games/reversi/:game?', name: 'reversi', component: MkReversi },
{ path: '/@:user', name: 'user', component: () => import('./views/pages/user/index.vue').then(m => m.default), children: [
diff --git a/src/client/app/mobile/views/components/user-preview.vue b/src/client/app/mobile/views/components/user-preview.vue
index b40e6f7619..ea8bbe242f 100644
--- a/src/client/app/mobile/views/components/user-preview.vue
+++ b/src/client/app/mobile/views/components/user-preview.vue
@@ -10,7 +10,7 @@
</header>
<div class="body">
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
</div>
</div>
diff --git a/src/client/app/mobile/views/pages/user/index.vue b/src/client/app/mobile/views/pages/user/index.vue
index 48b65624ef..d7fb3d4d58 100644
--- a/src/client/app/mobile/views/pages/user/index.vue
+++ b/src/client/app/mobile/views/pages/user/index.vue
@@ -22,7 +22,7 @@
<span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span>
</div>
<div class="description">
- <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
+ <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
</div>
<div class="fields" v-if="user.fields">
<dl class="field" v-for="(field, i) in user.fields" :key="i">