wip
This commit is contained in:
@@ -1,39 +1,39 @@
|
||||
<mk-drive>
|
||||
<nav ref="nav">
|
||||
<a @click="goRoot" href="/i/drive">%fa:cloud%%i18n:mobile.tags.mk-drive.drive%</a>
|
||||
<virtual each={ folder in hierarchyFolders }>
|
||||
<template each={ folder in hierarchyFolders }>
|
||||
<span>%fa:angle-right%</span>
|
||||
<a @click="move" href="/i/drive/folder/{ folder.id }">{ folder.name }</a>
|
||||
</virtual>
|
||||
<virtual v-if="folder != null">
|
||||
</template>
|
||||
<template v-if="folder != null">
|
||||
<span>%fa:angle-right%</span>
|
||||
<p>{ folder.name }</p>
|
||||
</virtual>
|
||||
<virtual v-if="file != null">
|
||||
</template>
|
||||
<template v-if="file != null">
|
||||
<span>%fa:angle-right%</span>
|
||||
<p>{ file.name }</p>
|
||||
</virtual>
|
||||
</template>
|
||||
</nav>
|
||||
<mk-uploader ref="uploader"/>
|
||||
<div class="browser { fetching: fetching }" v-if="file == null">
|
||||
<div class="info" v-if="info">
|
||||
<p v-if="folder == null">{ (info.usage / info.capacity * 100).toFixed(1) }% %i18n:mobile.tags.mk-drive.used%</p>
|
||||
<p v-if="folder != null && (folder.folders_count > 0 || folder.files_count > 0)">
|
||||
<virtual v-if="folder.folders_count > 0">{ folder.folders_count } %i18n:mobile.tags.mk-drive.folder-count%</virtual>
|
||||
<virtual v-if="folder.folders_count > 0 && folder.files_count > 0">%i18n:mobile.tags.mk-drive.count-separator%</virtual>
|
||||
<virtual v-if="folder.files_count > 0">{ folder.files_count } %i18n:mobile.tags.mk-drive.file-count%</virtual>
|
||||
<template v-if="folder.folders_count > 0">{ folder.folders_count } %i18n:mobile.tags.mk-drive.folder-count%</template>
|
||||
<template v-if="folder.folders_count > 0 && folder.files_count > 0">%i18n:mobile.tags.mk-drive.count-separator%</template>
|
||||
<template v-if="folder.files_count > 0">{ folder.files_count } %i18n:mobile.tags.mk-drive.file-count%</template>
|
||||
</p>
|
||||
</div>
|
||||
<div class="folders" v-if="folders.length > 0">
|
||||
<virtual each={ folder in folders }>
|
||||
<template each={ folder in folders }>
|
||||
<mk-drive-folder folder={ folder }/>
|
||||
</virtual>
|
||||
</template>
|
||||
<p v-if="moreFolders">%i18n:mobile.tags.mk-drive.load-more%</p>
|
||||
</div>
|
||||
<div class="files" v-if="files.length > 0">
|
||||
<virtual each={ file in files }>
|
||||
<template each={ file in files }>
|
||||
<mk-drive-file file={ file }/>
|
||||
</virtual>
|
||||
</template>
|
||||
<button class="more" v-if="moreFiles" @click="fetchMoreFiles">
|
||||
{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:mobile.tags.mk-drive.load-more%' }
|
||||
</button>
|
||||
|
@@ -6,7 +6,7 @@
|
||||
title={ file.name }
|
||||
onload={ onImageLoaded }
|
||||
style="background-color:rgb({ file.properties.average_color.join(',') })">
|
||||
<virtual v-if="kind != 'image'">%fa:file%</virtual>
|
||||
<template v-if="kind != 'image'">%fa:file%</template>
|
||||
<footer v-if="kind == 'image' && file.properties && file.properties.width && file.properties.height">
|
||||
<span class="size">
|
||||
<span class="width">{ file.properties.width }</span>
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<mk-follow-button>
|
||||
<button :class="{ wait: wait, follow: !user.is_following, unfollow: user.is_following }" v-if="!init" @click="onclick" disabled={ wait }>
|
||||
<virtual v-if="!wait && user.is_following">%fa:minus%</virtual>
|
||||
<virtual v-if="!wait && !user.is_following">%fa:plus%</virtual>
|
||||
<virtual v-if="wait">%fa:spinner .pulse .fw%</virtual>{ user.is_following ? '%i18n:mobile.tags.mk-follow-button.unfollow%' : '%i18n:mobile.tags.mk-follow-button.follow%' }
|
||||
<template v-if="!wait && user.is_following">%fa:minus%</template>
|
||||
<template v-if="!wait && !user.is_following">%fa:plus%</template>
|
||||
<template v-if="wait">%fa:spinner .pulse .fw%</template>{ user.is_following ? '%i18n:mobile.tags.mk-follow-button.unfollow%' : '%i18n:mobile.tags.mk-follow-button.follow%' }
|
||||
</button>
|
||||
<div class="init" v-if="init">%fa:spinner .pulse .fw%</div>
|
||||
<style lang="stylus" scoped>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<mk-images>
|
||||
<virtual each={ image in images }>
|
||||
<template each={ image in images }>
|
||||
<mk-images-image image={ image }/>
|
||||
</virtual>
|
||||
</template>
|
||||
<style lang="stylus" scoped>
|
||||
:scope
|
||||
display grid
|
||||
|
@@ -1,9 +1,9 @@
|
||||
<mk-init-following>
|
||||
<p class="title">気になるユーザーをフォロー:</p>
|
||||
<div class="users" v-if="!fetching && users.length > 0">
|
||||
<virtual each={ users }>
|
||||
<template each={ users }>
|
||||
<mk-user-card user={ this } />
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">おすすめのユーザーは見つかりませんでした。</p>
|
||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%読み込んでいます<mk-ellipsis/></p>
|
||||
|
@@ -1,52 +1,52 @@
|
||||
<mk-notification-preview :class="{ notification.type }">
|
||||
<virtual v-if="notification.type == 'reaction'">
|
||||
<template v-if="notification.type == 'reaction'">
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p><mk-reaction-icon reaction={ notification.reaction }/>{ notification.user.name }</p>
|
||||
<p class="post-ref">%fa:quote-left%{ getPostSummary(notification.post) }%fa:quote-right%</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'repost'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'repost'">
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:retweet%{ notification.post.user.name }</p>
|
||||
<p class="post-ref">%fa:quote-left%{ getPostSummary(notification.post.repost) }%fa:quote-right%</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'quote'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'quote'">
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:quote-left%{ notification.post.user.name }</p>
|
||||
<p class="post-preview">{ getPostSummary(notification.post) }</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'follow'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'follow'">
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:user-plus%{ notification.user.name }</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'reply'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'reply'">
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:reply%{ notification.post.user.name }</p>
|
||||
<p class="post-preview">{ getPostSummary(notification.post) }</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'mention'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'mention'">
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:at%{ notification.post.user.name }</p>
|
||||
<p class="post-preview">{ getPostSummary(notification.post) }</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'poll_vote'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'poll_vote'">
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
<div class="text">
|
||||
<p>%fa:chart-pie%{ notification.user.name }</p>
|
||||
<p class="post-ref">%fa:quote-left%{ getPostSummary(notification.post) }%fa:quote-right%</p>
|
||||
</div>
|
||||
</virtual>
|
||||
</template>
|
||||
<style lang="stylus" scoped>
|
||||
:scope
|
||||
display block
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<mk-notification :class="{ notification.type }">
|
||||
<mk-time time={ notification.created_at }/>
|
||||
<virtual v-if="notification.type == 'reaction'">
|
||||
<template v-if="notification.type == 'reaction'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.user.username }>
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -13,8 +13,8 @@
|
||||
%fa:quote-left%{ getPostSummary(notification.post) }%fa:quote-right%
|
||||
</a>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'repost'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'repost'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.post.user.username }>
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -27,8 +27,8 @@
|
||||
%fa:quote-left%{ getPostSummary(notification.post.repost) }%fa:quote-right%
|
||||
</a>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'quote'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'quote'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.post.user.username }>
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -39,8 +39,8 @@
|
||||
</p>
|
||||
<a class="post-preview" href={ '/' + notification.post.user.username + '/' + notification.post.id }>{ getPostSummary(notification.post) }</a>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'follow'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'follow'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.user.username }>
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -50,8 +50,8 @@
|
||||
<a href={ '/' + notification.user.username }>{ notification.user.name }</a>
|
||||
</p>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'reply'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'reply'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.post.user.username }>
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -62,8 +62,8 @@
|
||||
</p>
|
||||
<a class="post-preview" href={ '/' + notification.post.user.username + '/' + notification.post.id }>{ getPostSummary(notification.post) }</a>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'mention'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'mention'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.post.user.username }>
|
||||
<img class="avatar" src={ notification.post.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -74,8 +74,8 @@
|
||||
</p>
|
||||
<a class="post-preview" href={ '/' + notification.post.user.username + '/' + notification.post.id }>{ getPostSummary(notification.post) }</a>
|
||||
</div>
|
||||
</virtual>
|
||||
<virtual v-if="notification.type == 'poll_vote'">
|
||||
</template>
|
||||
<template v-if="notification.type == 'poll_vote'">
|
||||
<a class="avatar-anchor" href={ '/' + notification.user.username }>
|
||||
<img class="avatar" src={ notification.user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
@@ -88,7 +88,7 @@
|
||||
%fa:quote-left%{ getPostSummary(notification.post) }%fa:quote-right%
|
||||
</a>
|
||||
</div>
|
||||
</virtual>
|
||||
</template>
|
||||
<style lang="stylus" scoped>
|
||||
:scope
|
||||
display block
|
||||
|
@@ -1,12 +1,12 @@
|
||||
<mk-notifications>
|
||||
<div class="notifications" v-if="notifications.length != 0">
|
||||
<virtual each={ notification, i in notifications }>
|
||||
<template each={ notification, i in notifications }>
|
||||
<mk-notification notification={ notification }/>
|
||||
<p class="date" v-if="i != notifications.length - 1 && notification._date != notifications[i + 1]._date"><span>%fa:angle-up%{ notification._datetext }</span><span>%fa:angle-down%{ notifications[i + 1]._datetext }</span></p>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" disabled={ fetchingMoreNotifications }>
|
||||
<virtual v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</virtual>{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:mobile.tags.mk-notifications.more%' }
|
||||
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:mobile.tags.mk-notifications.more%' }
|
||||
</button>
|
||||
<p class="empty" v-if="notifications.length == 0 && !loading">%i18n:mobile.tags.mk-notifications.empty%</p>
|
||||
<p class="loading" v-if="loading">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
||||
|
@@ -1,12 +1,12 @@
|
||||
<mk-post-detail>
|
||||
<button class="read-more" v-if="p.reply && p.reply.reply_id && context == null" @click="loadContext" disabled={ loadingContext }>
|
||||
<virtual v-if="!contextFetching">%fa:ellipsis-v%</virtual>
|
||||
<virtual v-if="contextFetching">%fa:spinner .pulse%</virtual>
|
||||
<template v-if="!contextFetching">%fa:ellipsis-v%</template>
|
||||
<template v-if="contextFetching">%fa:spinner .pulse%</template>
|
||||
</button>
|
||||
<div class="context">
|
||||
<virtual each={ post in context }>
|
||||
<template each={ post in context }>
|
||||
<mk-post-detail-sub post={ post }/>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<div class="reply-to" v-if="p.reply">
|
||||
<mk-post-detail-sub post={ p.reply }/>
|
||||
@@ -58,9 +58,9 @@
|
||||
</footer>
|
||||
</article>
|
||||
<div class="replies" v-if="!compact">
|
||||
<virtual each={ post in replies }>
|
||||
<template each={ post in replies }>
|
||||
<mk-post-detail-sub post={ post }/>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<style lang="stylus" scoped>
|
||||
:scope
|
||||
|
@@ -5,13 +5,13 @@
|
||||
<div class="empty" v-if="!init && posts.length == 0">
|
||||
%fa:R comments%{ opts.empty || '%i18n:mobile.tags.mk-timeline.empty%' }
|
||||
</div>
|
||||
<virtual each={ post, i in posts }>
|
||||
<template each={ post, i in posts }>
|
||||
<mk-timeline-post post={ post }/>
|
||||
<p class="date" v-if="i != posts.length - 1 && post._date != posts[i + 1]._date">
|
||||
<span>%fa:angle-up%{ post._datetext }</span>
|
||||
<span>%fa:angle-down%{ posts[i + 1]._datetext }</span>
|
||||
</p>
|
||||
</virtual>
|
||||
</template>
|
||||
<footer v-if="!init">
|
||||
<button v-if="canFetchMore" @click="more" disabled={ fetching }>
|
||||
<span v-if="!fetching">%i18n:mobile.tags.mk-timeline.load-more%</span>
|
||||
|
@@ -53,7 +53,7 @@
|
||||
<div class="backdrop"></div>
|
||||
<div class="content">
|
||||
<button class="nav" @click="parent.toggleDrawer">%fa:bars%</button>
|
||||
<virtual v-if="hasUnreadNotifications || hasUnreadMessagingMessages">%fa:circle%</virtual>
|
||||
<template v-if="hasUnreadNotifications || hasUnreadMessagingMessages">%fa:circle%</template>
|
||||
<h1 ref="title">Misskey</h1>
|
||||
<button v-if="func" @click="func"><mk-raw content={ funcIcon }/></button>
|
||||
</div>
|
||||
@@ -234,8 +234,8 @@
|
||||
<div class="links">
|
||||
<ul>
|
||||
<li><a href="/">%fa:home%%i18n:mobile.tags.mk-ui-nav.home%%fa:angle-right%</a></li>
|
||||
<li><a href="/i/notifications">%fa:R bell%%i18n:mobile.tags.mk-ui-nav.notifications%<virtual v-if="hasUnreadNotifications">%fa:circle%</virtual>%fa:angle-right%</a></li>
|
||||
<li><a href="/i/messaging">%fa:R comments%%i18n:mobile.tags.mk-ui-nav.messaging%<virtual v-if="hasUnreadMessagingMessages">%fa:circle%</virtual>%fa:angle-right%</a></li>
|
||||
<li><a href="/i/notifications">%fa:R bell%%i18n:mobile.tags.mk-ui-nav.notifications%<template v-if="hasUnreadNotifications">%fa:circle%</template>%fa:angle-right%</a></li>
|
||||
<li><a href="/i/messaging">%fa:R comments%%i18n:mobile.tags.mk-ui-nav.messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href={ _CH_URL_ } target="_blank">%fa:tv%%i18n:mobile.tags.mk-ui-nav.ch%%fa:angle-right%</a></li>
|
||||
|
@@ -309,9 +309,9 @@
|
||||
<mk-user-overview-posts>
|
||||
<p class="initializing" v-if="initializing">%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-posts.loading%<mk-ellipsis/></p>
|
||||
<div v-if="!initializing && posts.length > 0">
|
||||
<virtual each={ posts }>
|
||||
<template each={ posts }>
|
||||
<mk-user-overview-posts-post-card post={ this }/>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="!initializing && posts.length == 0">%i18n:mobile.tags.mk-user-overview-posts.no-posts%</p>
|
||||
<style lang="stylus" scoped>
|
||||
@@ -438,9 +438,9 @@
|
||||
<mk-user-overview-photos>
|
||||
<p class="initializing" v-if="initializing">%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-photos.loading%<mk-ellipsis/></p>
|
||||
<div class="stream" v-if="!initializing && images.length > 0">
|
||||
<virtual each={ image in images }>
|
||||
<template each={ image in images }>
|
||||
<a class="img" style={ 'background-image: url(' + image.media.url + '?thumbnail&size=256)' } href={ '/' + image.post.user.username + '/' + image.post.id }></a>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="!initializing && images.length == 0">%i18n:mobile.tags.mk-user-overview-photos.no-photos%</p>
|
||||
<style lang="stylus" scoped>
|
||||
@@ -559,9 +559,9 @@
|
||||
|
||||
<mk-user-overview-keywords>
|
||||
<div v-if="user.keywords != null && user.keywords.length > 1">
|
||||
<virtual each={ keyword in user.keywords }>
|
||||
<template each={ keyword in user.keywords }>
|
||||
<a>{ keyword }</a>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="user.keywords == null || user.keywords.length == 0">%i18n:mobile.tags.mk-user-overview-keywords.no-keywords%</p>
|
||||
<style lang="stylus" scoped>
|
||||
@@ -593,9 +593,9 @@
|
||||
|
||||
<mk-user-overview-domains>
|
||||
<div v-if="user.domains != null && user.domains.length > 1">
|
||||
<virtual each={ domain in user.domains }>
|
||||
<template each={ domain in user.domains }>
|
||||
<a style="opacity: { 0.5 + (domain.weight / 2) }">{ domain.domain }</a>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="user.domains == null || user.domains.length == 0">%i18n:mobile.tags.mk-user-overview-domains.no-domains%</p>
|
||||
<style lang="stylus" scoped>
|
||||
@@ -628,9 +628,9 @@
|
||||
<mk-user-overview-frequently-replied-users>
|
||||
<p class="initializing" v-if="initializing">%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-frequently-replied-users.loading%<mk-ellipsis/></p>
|
||||
<div v-if="!initializing && users.length > 0">
|
||||
<virtual each={ users }>
|
||||
<template each={ users }>
|
||||
<mk-user-card user={ this.user }/>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="!initializing && users.length == 0">%i18n:mobile.tags.mk-user-overview-frequently-replied-users.no-users%</p>
|
||||
<style lang="stylus" scoped>
|
||||
@@ -680,9 +680,9 @@
|
||||
<mk-user-overview-followers-you-know>
|
||||
<p class="initializing" v-if="initializing">%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-followers-you-know.loading%<mk-ellipsis/></p>
|
||||
<div v-if="!initializing && users.length > 0">
|
||||
<virtual each={ user in users }>
|
||||
<template each={ user in users }>
|
||||
<a href={ '/' + user.username }><img src={ user.avatar_url + '?thumbnail&size=64' } alt={ user.name }/></a>
|
||||
</virtual>
|
||||
</template>
|
||||
</div>
|
||||
<p class="empty" v-if="!initializing && users.length == 0">%i18n:mobile.tags.mk-user-overview-followers-you-know.no-users%</p>
|
||||
<style lang="stylus" scoped>
|
||||
|
Reference in New Issue
Block a user