Skip to content
Snippets Groups Projects
user.vue 6.37 KiB
Newer Older
syuilo's avatar
wip
syuilo committed
<template>
syuilo's avatar
syuilo committed
<mk-ui>
syuilo's avatar
syuilo committed
	<template slot="header" v-if="!fetching"><img :src="user.avatarUrl" alt="">{{ user | userName }}</template>
syuilo's avatar
syuilo committed
	<main v-if="!fetching">
syuilo's avatar
syuilo committed
		<div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div>
syuilo's avatar
syuilo committed
		<div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div>
syuilo's avatar
wip
syuilo committed
		<header>
syuilo's avatar
syuilo committed
			<div class="banner" :style="style"></div>
syuilo's avatar
wip
syuilo committed
			<div class="body">
				<div class="top">
					<a class="avatar">
						<img :src="user.avatarUrl" alt="avatar"/>
syuilo's avatar
wip
syuilo committed
					</a>
syuilo's avatar
syuilo committed
					<mk-mute-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
syuilo's avatar
syuilo committed
					<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
syuilo's avatar
wip
syuilo committed
				</div>
				<div class="title">
syuilo's avatar
syuilo committed
					<h1>{{ user | userName }}</h1>
					<span class="username"><mk-acct :user="user" :detail="true" /></span>
syuilo's avatar
syuilo committed
					<span class="followed" v-if="user.isFollowed">%i18n:@follows-you%</span>
syuilo's avatar
wip
syuilo committed
				</div>
syuilo's avatar
syuilo committed
				<div class="description">
					<misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/>
				</div>
syuilo's avatar
wip
syuilo committed
				<div class="info">
syuilo's avatar
syuilo committed
					<p class="location" v-if="user.host === null && user.profile.location">
						%fa:map-marker%{{ user.profile.location }}
syuilo's avatar
wip
syuilo committed
					</p>
syuilo's avatar
syuilo committed
					<p class="birthday" v-if="user.host === null && user.profile.birthday">
						%fa:birthday-cake%{{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳)
syuilo's avatar
wip
syuilo committed
					</p>
				</div>
				<div class="status">
こぴなたみぽ's avatar
こぴなたみぽ committed
					<a>
syuilo's avatar
syuilo committed
						<b>{{ user.notesCount | number }}</b>
syuilo's avatar
syuilo committed
						<i>%i18n:@notes%</i>
syuilo's avatar
wip
syuilo committed
					</a>
syuilo's avatar
syuilo committed
					<a :href="user | userPage('following')">
syuilo's avatar
syuilo committed
						<b>{{ user.followingCount | number }}</b>
syuilo's avatar
syuilo committed
						<i>%i18n:@following%</i>
syuilo's avatar
wip
syuilo committed
					</a>
syuilo's avatar
syuilo committed
					<a :href="user | userPage('followers')">
syuilo's avatar
syuilo committed
						<b>{{ user.followersCount | number }}</b>
syuilo's avatar
syuilo committed
						<i>%i18n:@followers%</i>
syuilo's avatar
wip
syuilo committed
					</a>
				</div>
			</div>
syuilo's avatar
syuilo committed
				<a :data-active="page == 'home'" @click="page = 'home'">%fa:home% %i18n:@overview%</a>
				<a :data-active="page == 'notes'" @click="page = 'notes'">%fa:R comment-alt% %i18n:@timeline%</a>
				<a :data-active="page == 'media'" @click="page = 'media'">%fa:image% %i18n:@media%</a>
syuilo's avatar
wip
syuilo committed
		<div class="body">
syuilo's avatar
syuilo committed
			<x-home v-if="page == 'home'" :user="user"/>
syuilo's avatar
syuilo committed
			<mk-user-timeline v-if="page == 'notes'" :user="user" key="tl"/>
			<mk-user-timeline v-if="page == 'media'" :user="user" :with-media="true" key="media"/>
syuilo's avatar
wip
syuilo committed
		</div>
syuilo's avatar
syuilo committed
	</main>
syuilo's avatar
wip
syuilo committed
</mk-ui>
</template>

<script lang="ts">
import Vue from 'vue';
syuilo's avatar
syuilo committed
import * as age from 's-age';
syuilo's avatar
syuilo committed
import parseAcct from '../../../../../misc/acct/parse';
こぴなたみぽ's avatar
こぴなたみぽ committed
import Progress from '../../../common/scripts/loading';
syuilo's avatar
syuilo committed
import XHome from './user/home.vue';
syuilo's avatar
wip
syuilo committed

export default Vue.extend({
syuilo's avatar
syuilo committed
	components: {
		XHome
	},
syuilo's avatar
wip
syuilo committed
	data() {
		return {
			fetching: true,
syuilo's avatar
syuilo committed
			user: null,
syuilo's avatar
syuilo committed
			page: 'home'
syuilo's avatar
wip
syuilo committed
		};
	},
	computed: {
		age(): number {
syuilo's avatar
syuilo committed
			return age(this.user.profile.birthday);
syuilo's avatar
syuilo committed
		},
		style(): any {
			if (this.user.bannerUrl == null) return {};
			return {
				backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
syuilo's avatar
syuilo committed
				backgroundImage: `url(${ this.user.bannerUrl })`
			};
syuilo's avatar
wip
syuilo committed
		}
	},
syuilo's avatar
syuilo committed
	watch: {
		$route: 'fetch'
	},
syuilo's avatar
syuilo committed
	created() {
		this.fetch();
	},
syuilo's avatar
syuilo committed
	methods: {
		fetch() {
			Progress.start();

			(this as any).api('users/show', parseAcct(this.$route.params.user)).then(user => {
syuilo's avatar
syuilo committed
				this.user = user;
				this.fetching = false;
こぴなたみぽ's avatar
こぴなたみぽ committed

syuilo's avatar
syuilo committed
				Progress.done();
Aya Morisawa's avatar
Aya Morisawa committed
				document.title = `${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`;
syuilo's avatar
syuilo committed
			});
		}
syuilo's avatar
wip
syuilo committed
	}
});
</script>

syuilo's avatar
syuilo committed
<style lang="stylus" scoped>
syuilo's avatar
syuilo committed
main
	$bg = var(--face)
syuilo's avatar
syuilo committed

syuilo's avatar
syuilo committed
	> .is-suspended
syuilo's avatar
syuilo committed
	> .is-remote
syuilo's avatar
syuilo committed
		&.is-suspended
			color #570808
			background #ffdbdb

		&.is-remote
			color #573c08
			background #fff0db
syuilo's avatar
syuilo committed

		> p
			margin 0 auto
syuilo's avatar
syuilo committed
			padding 14px
			max-width 600px
syuilo's avatar
syuilo committed
			font-size 14px
syuilo's avatar
syuilo committed

			> a
				font-weight bold

syuilo's avatar
syuilo committed
			@media (max-width 500px)
syuilo's avatar
syuilo committed
				padding 12px
syuilo's avatar
syuilo committed
				font-size 12px

syuilo's avatar
wip
syuilo committed
	> header
syuilo's avatar
syuilo committed
		background $bg
syuilo's avatar
wip
syuilo committed

		> .banner
			padding-bottom 33.3%
syuilo's avatar
syuilo committed
			background-color rgba(0, 0, 0, 0.1)
syuilo's avatar
wip
syuilo committed
			background-size cover
			background-position center

		> .body
			padding 12px
			margin 0 auto
			max-width 600px

			> .top
				&:after
					content ''
					display block
					clear both

				> .avatar
					display block
					float left
					width 25%
					height 40px

					> img
						display block
						position absolute
						left -2px
						bottom -2px
						width 100%
syuilo's avatar
syuilo committed
						background $bg
						border 3px solid $bg
syuilo's avatar
wip
syuilo committed
						border-radius 6px

						@media (min-width 500px)
							left -4px
							bottom -4px
syuilo's avatar
syuilo committed
							border 4px solid $bg
syuilo's avatar
wip
syuilo committed
							border-radius 12px

Tosuke's avatar
Tosuke committed
				> .mk-mute-button
					float right

syuilo's avatar
syuilo committed
				> .mk-follow-button
syuilo's avatar
wip
syuilo committed
					float right

			> .title
				margin 8px 0

				> h1
					margin 0
					line-height 22px
					font-size 20px
syuilo's avatar
syuilo committed
					color var(--mobileUserPageName)
syuilo's avatar
wip
syuilo committed

				> .username
					display inline-block
					line-height 20px
					font-size 16px
					font-weight bold
syuilo's avatar
syuilo committed
					color var(--mobileUserPageAcct)
syuilo's avatar
wip
syuilo committed

				> .followed
					margin-left 8px
					padding 2px 4px
					font-size 12px
syuilo's avatar
syuilo committed
					color var(--mobileUserPageFollowedFg)
					background var(--mobileUserPageFollowedBg)
syuilo's avatar
wip
syuilo committed
					border-radius 4px

			> .description
				margin 8px 0
syuilo's avatar
syuilo committed
				color var(--mobileUserPageDescription)
syuilo's avatar
wip
syuilo committed

			> .info
				margin 8px 0

				> p
					display inline
					margin 0 16px 0 0
syuilo's avatar
syuilo committed
					color var(--text)
syuilo's avatar
wip
syuilo committed

					> i
						margin-right 4px

			> .status
				> a
syuilo's avatar
syuilo committed
					color var(--text)
syuilo's avatar
wip
syuilo committed

					&:not(:last-child)
						margin-right 16px

					> b
						margin-right 4px
						font-size 16px
syuilo's avatar
syuilo committed
						color var(--mobileUserPageStatusHighlight)
syuilo's avatar
wip
syuilo committed

					> i
						font-size 14px

syuilo's avatar
syuilo committed
		position -webkit-sticky
syuilo's avatar
syuilo committed
		top 47px
syuilo's avatar
syuilo committed
		box-shadow 0 4px 4px var(--mobileUserPageHeaderShadow)
syuilo's avatar
syuilo committed
		background-color $bg
		z-index 2
syuilo's avatar
syuilo committed

syuilo's avatar
wip
syuilo committed
			display flex
			justify-content center
			margin 0 auto
			max-width 600px

			> a
				display block
				flex 1 1
				text-align center
syuilo's avatar
syuilo committed
				line-height 48px
				font-size 12px
syuilo's avatar
wip
syuilo committed
				text-decoration none
syuilo's avatar
syuilo committed
				color var(--text)
syuilo's avatar
wip
syuilo committed
				border-bottom solid 2px transparent

syuilo's avatar
syuilo committed
				@media (min-width 400px)
					line-height 52px
					font-size 14px

syuilo's avatar
syuilo committed
				&[data-active]
syuilo's avatar
wip
syuilo committed
					font-weight bold
syuilo's avatar
syuilo committed
					color var(--primary)
					border-color var(--primary)
syuilo's avatar
wip
syuilo committed

	> .body
syuilo's avatar
syuilo committed
		max-width 680px
		margin 0 auto
syuilo's avatar
wip
syuilo committed
		padding 8px

		@media (min-width 500px)
			padding 16px

syuilo's avatar
syuilo committed
		@media (min-width 600px)
			padding 32px

syuilo's avatar
wip
syuilo committed
</style>