UserCard.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <template>
  2. <div class="card bg-bluegray-800 landing-user-card">
  3. <div class="card-body">
  4. <div class="d-flex" style="gap: 15px;">
  5. <div class="flex-shrink-1">
  6. <a :href="account.url" target="_blank">
  7. <img class="rounded-circle" :src="account.avatar" onerror="this.src='/storage/avatars/default.jpg';this.onerror=null;" width="50" height="50">
  8. </a>
  9. </div>
  10. <div class="flex-grow-1">
  11. <div v-if="account.name" class="display-name">
  12. <a :href="account.url" target="_blank">{{ account.name }}</a>
  13. </div>
  14. <p class="username">
  15. <a :href="account.url" target="_blank">&commat;{{ account.username }}</a>
  16. </p>
  17. <div class="user-stats">
  18. <div class="user-stats-item user-select-none">{{ formatCount(account.statuses_count) }} Posts</div>
  19. <div class="user-stats-item user-select-none">{{ formatCount(account.followers_count) }} Followers</div>
  20. <div class="user-stats-item user-select-none">{{ formatCount(account.following_count) }} Following</div>
  21. </div>
  22. <div v-if="account.bio" class="user-bio">
  23. <p class="small text-bluegray-400 mb-0">{{ truncate(account.bio) }}</p>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. </template>
  30. <script type="text/javascript">
  31. export default {
  32. props: ['account'],
  33. methods: {
  34. formatCount(val) {
  35. if(!val) {
  36. return 0;
  37. }
  38. return val.toLocaleString('en-CA', { compactDisplay: "short", notation: "compact"});
  39. },
  40. truncate(val, limit = 120) {
  41. if(!val || val.length < limit) {
  42. return val;
  43. }
  44. return val.slice(0, limit) + '...'
  45. }
  46. }
  47. }
  48. </script>