Show.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <div v-if="isUser">
  3. <main-header></main-header>
  4. <div class="container">
  5. <img class="avatar" src="/assets/notes.png" />
  6. <h2 class="has-text-centered username">@{{user.username}}</h2>
  7. <h5>A member since {{user.createdAt}}</h5>
  8. <div
  9. class="admin-functionality"
  10. v-if="$parent.role === 'admin' && !($parent.userId === user._id)"
  11. >
  12. <a
  13. class="button is-small is-info is-outlined"
  14. v-on:click="changeRank('admin')"
  15. v-if="user.role == 'default'"
  16. >Promote to Admin</a>
  17. <a
  18. class="button is-small is-danger is-outlined"
  19. v-on:click="changeRank('default')"
  20. v-if="user.role == 'admin'"
  21. >Demote to User</a>
  22. </div>
  23. <nav class="level">
  24. <div class="level-item has-text-centered">
  25. <p class="heading">Rank</p>
  26. <p class="title role">{{user.role}}</p>
  27. </div>
  28. <div class="level-item has-text-centered">
  29. <p class="heading">Songs Requested</p>
  30. <p class="title">{{ user.statistics.songsRequested }}</p>
  31. </div>
  32. <div class="level-item has-text-centered">
  33. <p class="heading">Likes</p>
  34. <p class="title">{{ user.liked.length }}</p>
  35. </div>
  36. <div class="level-item has-text-centered">
  37. <p class="heading">Dislikes</p>
  38. <p class="title">{{ user.disliked.length }}</p>
  39. </div>
  40. </nav>
  41. </div>
  42. <main-footer></main-footer>
  43. </div>
  44. </template>
  45. <script>
  46. import { Toast } from "vue-roaster";
  47. import MainHeader from "../MainHeader.vue";
  48. import MainFooter from "../MainFooter.vue";
  49. import io from "../../io";
  50. export default {
  51. data() {
  52. return {
  53. user: {},
  54. isUser: false
  55. };
  56. },
  57. methods: {
  58. changeRank(newRank) {
  59. this.socket.emit(
  60. "users.updateRole",
  61. this.user._id,
  62. newRank == "admin" ? "admin" : "default",
  63. res => {
  64. if (res.status == "error") Toast.methods.addToast(res.message, 2000);
  65. else this.user.role = newRank;
  66. Toast.methods.addToast(
  67. `User ${this.$route.params.username}'s rank has been changed to: ${newRank}`,
  68. 2000
  69. );
  70. }
  71. );
  72. }
  73. },
  74. mounted: function() {
  75. let _this = this;
  76. io.getSocket(socket => {
  77. _this.socket = socket;
  78. _this.socket.emit(
  79. "users.findByUsername",
  80. _this.$route.params.username,
  81. res => {
  82. if (res.status == "error") this.$router.go("/404");
  83. else {
  84. _this.user = res.data;
  85. this.user.createdAt = moment(this.user.createdAt).format("LL");
  86. _this.isUser = true;
  87. }
  88. }
  89. );
  90. });
  91. },
  92. components: { MainHeader, MainFooter }
  93. };
  94. </script>
  95. <style lang="scss" scoped>
  96. .container {
  97. padding: 25px;
  98. }
  99. .avatar {
  100. border-radius: 50%;
  101. width: 250px;
  102. display: block;
  103. margin: auto;
  104. }
  105. h5 {
  106. text-align: center;
  107. margin-bottom: 25px;
  108. font-size: 17px;
  109. }
  110. .role {
  111. text-transform: capitalize;
  112. }
  113. .level {
  114. margin-top: 40px;
  115. }
  116. .admin-functionality {
  117. text-align: center;
  118. margin: 0 auto;
  119. }
  120. @media (max-width: 350px) {
  121. .username {
  122. font-size: 2.9rem;
  123. word-wrap: break-all;
  124. }
  125. }
  126. </style>