PostCard.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <div class="timeline-status-component">
  3. <div class="card bg-bluegray-800 landing-post-card" style="border-radius: 15px;">
  4. <div class="card-header border-0 bg-bluegray-700" style="border-top-left-radius: 15px;border-top-right-radius: 15px;">
  5. <div class="media align-items-center">
  6. <a :href="post.account.url" class="mr-2" target="_blank">
  7. <img :src="post.account.avatar" style="border-radius:30px;" width="30" height="30" onerror="this.src='/storage/avatars/default.jpg?v=0';this.onerror=null;">
  8. </a>
  9. <div class="media-body d-flex justify-content-between align-items-center">
  10. <p class="font-weight-bold username mb-0">
  11. <a :href="post.account.url" class="text-white" target="_blank">&commat;{{ post.account.username }}</a>
  12. </p>
  13. <p class="font-weight-bold mb-0">
  14. <a v-if="range === 'daily'" :href="post.url" class="text-bluegray-500" target="_blank">Posted {{ timeago(post.created_at) }} ago</a>
  15. <a v-else :href="post.url" class="text-bluegray-400" target="_blank">View Post</a>
  16. </p>
  17. </div>
  18. </div>
  19. </div>
  20. <div class="card-body m-0 p-0">
  21. <post-content :status="post" />
  22. </div>
  23. </div>
  24. </div>
  25. </template>
  26. <script type="text/javascript">
  27. import PostContent from './../../partials/post/PostContent';
  28. export default {
  29. props: [
  30. 'post',
  31. 'range'
  32. ],
  33. components: {
  34. 'post-content': PostContent,
  35. },
  36. methods: {
  37. timestampToAgo(ts) {
  38. let date = Date.parse(ts);
  39. let seconds = Math.floor((new Date() - date) / 1000);
  40. let interval = Math.floor(seconds / 63072000);
  41. if (interval < 0) {
  42. return "0s";
  43. }
  44. if (interval >= 1) {
  45. return interval + "y";
  46. }
  47. interval = Math.floor(seconds / 604800);
  48. if (interval >= 1) {
  49. return interval + "w";
  50. }
  51. interval = Math.floor(seconds / 86400);
  52. if (interval >= 1) {
  53. return interval + "d";
  54. }
  55. interval = Math.floor(seconds / 3600);
  56. if (interval >= 1) {
  57. return interval + "h";
  58. }
  59. interval = Math.floor(seconds / 60);
  60. if (interval >= 1) {
  61. return interval + "m";
  62. }
  63. return Math.floor(seconds) + "s";
  64. },
  65. timeago(ts) {
  66. let short = this.timestampToAgo(ts);
  67. return short;
  68. if(
  69. short.endsWith('s') ||
  70. short.endsWith('m') ||
  71. short.endsWith('h')
  72. ) {
  73. return short;
  74. }
  75. const intl = new Intl.DateTimeFormat(undefined, {
  76. year: 'numeric',
  77. month: 'short',
  78. day: 'numeric',
  79. hour: 'numeric',
  80. minute: 'numeric'
  81. });
  82. return intl.format(new Date(ts));
  83. },
  84. }
  85. }
  86. </script>