forked from kaverti/website
514 lines
17 KiB
Vue
514 lines
17 KiB
Vue
<style>
|
|
.limit{
|
|
margin-top: 0.5rem;
|
|
word-break: break-all;
|
|
}
|
|
</style>
|
|
<template>
|
|
<div class='route_container user_route columns'>
|
|
<div class="column is-4" style="float: left">
|
|
<div class="box has-text-centered">
|
|
<div class="columns is-vcentered is-mobile">
|
|
<div class="column is-narrow"><h1 class="title">{{username}}</h1></div>
|
|
<tooltips>
|
|
<b-tooltip style="padding-left: 2px; padding-right: 2px;" v-if='user && user.system' class="is-success" label="This user is a system user operated by administrators that mainly run API operations.">
|
|
<b-tag rounded class="is-success">SYSTEM <i class="fas fa-info-circle"></i> </b-tag>
|
|
</b-tooltip>
|
|
<b-tooltip style="padding-left: 2px; padding-right: 2px;" v-if='user && user.bot' class="is-info" label="This user is a bot account that can run automated API operations.">
|
|
|
|
<b-tag rounded class="is-info">BOT <i class="fas fa-info-circle"></i> </b-tag>
|
|
|
|
</b-tooltip>
|
|
<b-tooltip class="is-light" label="User is boosting the Kaverti Discord server.">
|
|
<b-tag class="is-light" rounded v-if='user && user.booster'>BOOSTER <i class="fas fa-info-circle"></i></b-tag>
|
|
</b-tooltip>
|
|
<b-tooltip style="padding-left: 2px; padding-right: 2px;" v-if='user && user.admin' class="is-danger" label="User is an official Kaverti administrator.">
|
|
|
|
<b-tag rounded class="is-danger">ADMIN <i class="fas fa-info-circle"></i> </b-tag>
|
|
|
|
</b-tooltip>
|
|
<b-tooltip style="padding-left: 2px; padding-right: 2px;" v-if='user && user.hidden' class="is-info" label="User is not discoverable in the user list.">
|
|
|
|
<b-tag rounded>HIDDEN <i class="fas fa-info-circle"></i> </b-tag>
|
|
|
|
</b-tooltip>
|
|
</tooltips>
|
|
</div>
|
|
<img width=65% style="padding-top: 10px; padding-bottom: 10px;"
|
|
:src = userPicture
|
|
>
|
|
<div class='user_description limit' v-if='user && user.description && user.description.length' v-html='user.description'></div>
|
|
<br>
|
|
<div v-if='user'>User was created on: {{user.createdAt | formatDate('date') }}</div>
|
|
<div v-if='user && $store.state.developerMode'>UID: {{user.id}}</div>
|
|
<br>
|
|
<menu-button
|
|
v-if='$store.state.admin'
|
|
:options='[
|
|
{ event: "scrub_username", value: "Scrub Username" },
|
|
{ event: "scrub_desc", value: "Scrub Description" },
|
|
{ event: "refresh_avatar", value: "Refresh Avatar" }
|
|
]'
|
|
@scrub_desc='scrubDesc'
|
|
@scrub_username='scrubUsername'
|
|
@refresh_avatar="refreshAvatar"
|
|
>
|
|
<button class='button button--thin_text'>
|
|
<font-awesome-icon :icon='["fa", "cog"]' style='margin-right: 0.25rem;' />
|
|
Manage user
|
|
</button>
|
|
</menu-button><br>
|
|
<b-button @click="removeFriend" v-if="$store.state.experimentsStore.relationships && relationship.type === 'accepted' && user.username !== $store.state.username && $store.state.username" class='is-danger button' icon-left="minus">
|
|
Remove Friend
|
|
</b-button>
|
|
<b-button @click="removeFriend" v-if="$store.state.experimentsStore.relationships && relationship.type === 'pending' && user.username !== $store.state.username && $store.state.username" class='is-warning button' icon-left="minus">
|
|
Pending Friend Request
|
|
</b-button>
|
|
<b-button @click="doRelationshipAccept" v-if="$store.state.experimentsStore.relationships && relationship.type === 'pendingCanAccept' && user.username !== $store.state.username && $store.state.username" class='is-success button' icon-left="plus">
|
|
Accept Friend Request
|
|
</b-button>
|
|
<b-button @click="removeFriend" v-if="$store.state.experimentsStore.relationships && relationship.type === 'pendingCanAccept' && user.username !== $store.state.username && $store.state.username" class='is-danger button' icon-left="minus">
|
|
Deny Friend Request
|
|
</b-button>
|
|
<b-button @click="doRelationship" v-if="$store.state.experimentsStore.relationships && user && relationship.type === 'notFriends' && user.username !== $store.state.username && $store.state.username" class='is-info button' icon-left="plus">
|
|
Send friend request
|
|
</b-button>
|
|
</div>
|
|
</div>
|
|
<div class="column is-8-fullhd">
|
|
<b-button v-if="!user.userWallOptOut && $store.state.username" class="menu_button" :key='"user-menu-item-wall"' @click='$router.push(`/user/${username}/wall`)'>
|
|
User Wall
|
|
</b-button>
|
|
<b-tooltip v-if="!user.userWallOptOut && !$store.state.username" label="You can only view a user's wall when logged in">
|
|
<b-button v-if="!user.userWallOptOut && !$store.state.username" disabled="disabled" class="menu_button disabled" :key='"user-menu-item-wall"'>
|
|
User Wall
|
|
</b-button>
|
|
</b-tooltip>
|
|
<b-button class="menu_button" :key='"user-menu-item-posts"' @click='$router.push(`/u/${username}/posts`)'>
|
|
Posts
|
|
</b-button>
|
|
<b-button class="menu_button" :key='"user-menu-item-threads"' @click='$router.push(`/u/${username}/threads`)'>
|
|
Threads
|
|
</b-button>
|
|
<b-button class="menu_button" :key='"user-menu-item-threads"' @click='$router.push(`/u/${username}/items`)'>
|
|
Marketplace Items
|
|
</b-button>
|
|
<b-button class="menu_button" :key='"user-menu-item-threads"' @click='$router.push(`/u/${username}/inventory`)'>
|
|
Inventory
|
|
</b-button>
|
|
<b-button class="menu_button" :key='"user-menu-item-threads"' @click='$router.push(`/u/${username}/friends`)'>
|
|
Friends
|
|
</b-button>
|
|
<br/> <br/>
|
|
<div class="column box">
|
|
<router-view :username='username'></router-view>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import AjaxErrorHandler from '../../assets/js/errorHandler'
|
|
import MenuButton from '../MenuButton'
|
|
|
|
export default {
|
|
name: 'user',
|
|
components: {MenuButton},
|
|
data () {
|
|
return {
|
|
menuItems: [
|
|
/* { name: 'Wall', route: 'wall' }, */
|
|
{ name: 'Posts', route: 'posts' },
|
|
{ name: 'Threads', route: 'threads' },
|
|
/* { name: 'Friends', route: 'friends' } */
|
|
],
|
|
selected: 0,
|
|
|
|
username: this.$route.params.username,
|
|
user: null,
|
|
relationship: false,
|
|
relationships: {
|
|
type: ''
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
$route (to) {
|
|
this.selected = this.getIndexFromRoute(to.path)
|
|
}
|
|
},
|
|
computed: {
|
|
userColor () {
|
|
if(this.user) {
|
|
return this.user.color
|
|
} else {
|
|
return null
|
|
}
|
|
},
|
|
userPicture () {
|
|
if(this.user && this.user.picture) {
|
|
return 'http://localhost/user/avatars/full/' + this.user.picture + '.png'
|
|
} else {
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
resetFetchData () {
|
|
this.offset = 0;
|
|
this.users = [];
|
|
|
|
this.fetchData();
|
|
},
|
|
fetchData () {
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/${this.$route.params.username}`)
|
|
.then(res => this.user = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
},
|
|
scrubDesc () {
|
|
this.axios
|
|
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'admin/user/scrub', {
|
|
description: "descscram",
|
|
user: this.username
|
|
})
|
|
.then(() => {
|
|
this.resetFetchData()
|
|
})
|
|
.catch(AjaxErrorHandler(this.$store))
|
|
},
|
|
refreshAvatar () {
|
|
this.axios
|
|
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'admin/user/avatar', {
|
|
user: this.username
|
|
})
|
|
.then(() => {
|
|
this.resetFetchData()
|
|
})
|
|
.catch(AjaxErrorHandler(this.$store))
|
|
},
|
|
scrubUsername () {
|
|
this.axios
|
|
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'admin/user/scrub', {
|
|
username: "usernamescram",
|
|
user: this.username
|
|
})
|
|
.then(() => {
|
|
this.description.loading = false
|
|
})
|
|
.catch(AjaxErrorHandler(this.$store))
|
|
},
|
|
refreshFriend() {
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
},
|
|
removeFriend () {
|
|
this.axios
|
|
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/remove', {
|
|
friend: this.$route.params.username
|
|
})
|
|
.then(() => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data, this.refreshFriend())
|
|
.catch(e => {
|
|
this.refreshFriend()
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
.catch(e => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
|
|
AjaxErrorHandler(this.$store)(e, error => {
|
|
this.description.error = error.message
|
|
})
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data, this.refreshFriend())
|
|
.catch(e => {
|
|
this.refreshFriend()
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
},
|
|
doRelationship () {
|
|
this.axios
|
|
.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/send', {
|
|
friend: this.$route.params.username
|
|
})
|
|
.then(() => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
.catch(e => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
|
|
AjaxErrorHandler(this.$store)(e, error => {
|
|
this.description.error = error.message
|
|
})
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
},
|
|
doRelationshipAccept () {
|
|
this.axios
|
|
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/accept', {
|
|
friend: this.$route.params.username
|
|
})
|
|
.then(() => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
.catch(e => {
|
|
this.refreshFriend()
|
|
this.description.loading = false
|
|
|
|
AjaxErrorHandler(this.$store)(e, error => {
|
|
this.description.error = error.message
|
|
})
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
})
|
|
},
|
|
getIndexFromRoute (path) {
|
|
let selectedIndex
|
|
let route = path.split('/')[3]
|
|
|
|
this.menuItems.forEach((item, index) => {
|
|
if(item.route === route) {
|
|
selectedIndex = index
|
|
}
|
|
})
|
|
|
|
return selectedIndex
|
|
}
|
|
},
|
|
created () {
|
|
this.resetFetchData()
|
|
this.selected = this.getIndexFromRoute(this.$route.path)
|
|
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/${this.$route.params.username}`)
|
|
.then(res => this.user = res.data)
|
|
|
|
this.axios
|
|
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `relationships/get/${this.$route.params.username}`)
|
|
.then(res => this.relationship = res.data)
|
|
.catch(e => {
|
|
let invalidId = e.response.data.errors.find(error => {
|
|
return error.name === 'accountDoesNotExist'
|
|
})
|
|
|
|
if(invalidId) {
|
|
this.$store.commit('set404Page', true)
|
|
} else {
|
|
AjaxErrorHandler(this.$store)(e)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang='scss' scoped>
|
|
@import '../../assets/scss/variables.scss';
|
|
|
|
.user_route {
|
|
width: 70%;
|
|
}
|
|
|
|
.user_header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
margin-bottom: 1.5rem;
|
|
background-color: #fff;
|
|
padding: 1rem;
|
|
border-radius: 0.25rem;
|
|
border: thin solid $color__gray--darker;
|
|
|
|
@at-root #{&}__icon {
|
|
height: 6rem;
|
|
width: 6rem;
|
|
line-height: 5.5rem;
|
|
@include text($font--role-emphasis, 5rem);
|
|
text-align: center;
|
|
background-color: $color__gray--darkest;
|
|
color: #fff;
|
|
}
|
|
@at-root #{&}__info {
|
|
display: flex;
|
|
flex-direction: column;
|
|
margin-left: 1rem;
|
|
width: calc(100% - 6rem);
|
|
}
|
|
@at-root #{&}__username {
|
|
margin-top: -0.25rem;
|
|
font-size: 2rem;
|
|
font-weight: bold
|
|
}
|
|
@at-root #{&}__date {
|
|
color: $color__darkgray--primary;
|
|
font-size: 1.5rem;
|
|
}
|
|
}
|
|
.user_description {
|
|
white-space: pre-line;
|
|
margin-top: 0.5rem;
|
|
}
|
|
.user__view_holder {
|
|
display: flex;
|
|
flex-direction: row;
|
|
}
|
|
.user__links {
|
|
width: 8rem;
|
|
display: table;
|
|
|
|
@at-root #{&}__menu_item {
|
|
cursor: pointer;
|
|
margin-bottom: 0.5rem;
|
|
position: relative;
|
|
|
|
&:hover { color: $color__darkgray--primary; }
|
|
|
|
@at-root #{&}--selected {
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
}
|
|
.menu_button {
|
|
margin: 2px;
|
|
}
|
|
.user__view {
|
|
flex-grow: 1;
|
|
width: 0;
|
|
}
|
|
|
|
@media (max-width: $breakpoint--tablet) {
|
|
.user_route {
|
|
width: inherit;
|
|
overflow-x: hidden;
|
|
}
|
|
.user__view_holder {
|
|
flex-direction: column;
|
|
}
|
|
.user_header {
|
|
@at-root #{&}__icon {
|
|
height: 250px;
|
|
width: 50px;
|
|
}
|
|
@at-root #{&}__username {
|
|
font-size: 1.75rem;
|
|
}
|
|
@at-root #{&}__date {
|
|
font-size: 1.25rem;
|
|
}
|
|
}
|
|
.user__links {
|
|
display: flex;
|
|
flex-direction: row;
|
|
|
|
@at-root #{&}__menu_item {
|
|
margin-right: 0.5rem;
|
|
|
|
&:hover {
|
|
color: $color__text--primary;
|
|
}
|
|
|
|
@at-root #{&}--selected::before {
|
|
width: 100%;
|
|
height: 0.2rem;
|
|
left: 0rem;
|
|
top: auto;
|
|
border-radius: 1rem;
|
|
bottom: -0.375rem;
|
|
}
|
|
}
|
|
}
|
|
.user__view {
|
|
width: auto;
|
|
}
|
|
}
|
|
</style>
|