Skip to content
Snippets Groups Projects
ProfileBase.vue 5.71 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
    
    Agate's avatar
    Agate committed
      <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">
    
              <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>
    
              <h1 class="ui center aligned icon header">
    
    Agate's avatar
    Agate committed
                <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>
    
                  <span>{{ displayName }}</span>
    
                  <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>
    
    Agate's avatar
    Agate committed
                  <div class="ui basic success label">
    
                    <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>
    
            </div>
          </div>
    
      </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() {
    
        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
    
          self.object = null
    
          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()
        }