Newer
Older
<main class="main pusher page-profile" v-title="labels.usernameProfile">
<div v-if="isLoading" class="ui vertical segment">
<div class="ui centered active inline loader"></div>
</div>
<div class="ui head vertical stripe segment container">
<div class="ui stackable grid" v-if="object">
<div class="ui five wide column">

Agate
committed
<button class="ui pointing dropdown icon small basic right floated button" ref="dropdown" v-dropdown="{direction: 'downward'}" style="position: absolute; right: 1em; top: 1em;">
<i class="ellipsis vertical icon"></i>
<div class="menu">
<div
role="button"
class="basic item"
v-for="obj in getReportableObjs({account: object})"
:key="obj.target.type + obj.target.id"
@click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
<i class="share icon" /> {{ obj.label }}
</div>
<div class="divider"></div>
<router-link class="basic item" v-if="$store.state.auth.availablePermissions['moderation']" :to="{name: 'manage.moderation.accounts.detail', params: {id: object.full_username}}">
<i class="wrench icon"></i>
<translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
</router-link>
</div>

Agate
committed
</button>
<h1 class="ui center aligned icon header">
<i v-if="!object.icon" class="circular inverted user success icon"></i>
<img alt="" class="ui big circular image" v-else v-lazy="$store.getters['instance/absoluteUrl'](object.icon.urls.medium_square_crop)" />
<div class="ellispsis content">
<div class="ui very small hidden divider"></div>
<div class="ui very small hidden divider"></div>
<div class="sub header ellipsis" :title="object.full_username">
{{ object.full_username }}
</div>
<template v-if="object.full_username === $store.state.auth.fullUsername">
<div class="ui very small hidden divider"></div>
<translate translate-context="Content/Profile/Button.Paragraph">This is you!</translate>
</div>
</template>
</h1>
<div class="ui small hidden divider"></div>
<div v-if="$store.getters['ui/layoutVersion'] === 'large'">
<rendered-description
@updated="$emit('updated', $event)"
:content="object.summary"
:field-name="'summary'"
:update-url="`users/${$store.state.auth.username}/`"
:can-update="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername"></rendered-description>
</div>
<div class="ui eleven wide column">
<div class="ui head vertical stripe segment">
<div class="ui container">
<div class="ui secondary pointing center aligned menu">
<router-link class="item" :exact="true" :to="{name: 'profile.overview', params: routerParams}">
<translate translate-context="Content/Profile/Link">Overview</translate>
</router-link>
<router-link class="item" :exact="true" :to="{name: 'profile.activity', params: routerParams}">
<translate translate-context="Content/Profile/*">Activity</translate>
</router-link>
</div>
<div class="ui hidden divider"></div>
<router-view @updated="fetch" :object="object"></router-view>
</main>
</template>
<script>
import { mapState } from "vuex"
import axios from 'axios'
import ReportMixin from '@/components/mixins/Report'
export default {
mixins: [ReportMixin],
props: {
username: {type: String, required: true},
domain: {type: String, required: false, default: null},
},
data () {
return {
object: null,
isLoading: false,
}
},
created() {

Agate
committed
let authenticated = this.$store.state.auth.authenticated
if (!authenticated && this.domain && this.$store.getters['instance/domain'] != this.domain) {
this.$router.push({name: 'login', query: {next: this.$route.fullPath}})
} else {
this.fetch()
}
beforeRouteUpdate (to, from, next) {
to.meta.preserveScrollPosition = true
next()
},
methods: {
fetch () {
let self = this
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
self.isLoading = true
axios.get(`federation/actors/${this.fullUsername}/`).then((response) => {
self.object = response.data
self.isLoading = false
})
}
},
computed: {
labels() {
let msg = this.$pgettext('Head/Profile/Title', "%{ username }'s profile")
let usernameProfile = this.$gettextInterpolate(msg, {
username: this.username
})
return {
usernameProfile
}
},
fullUsername () {
if (this.username && this.domain) {
return `${this.username}@${this.domain}`
} else {
return `${this.username}@${this.$store.getters['instance/domain']}`
}
},
routerParams () {
if (this.domain) {
return {username: this.username, domain: this.domain}
} else {
return {username: this.username}
}
},
displayName () {
return this.object.name || this.object.preferred_username
}
},
watch: {
domain () {
this.fetch()
},
username () {
this.fetch()
}