LoopComponent.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div>
  3. <div class="mb-4">
  4. <p class="text-center">
  5. <!-- <a :class="[tab == 'popular'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('popular')">Popular</a> -->
  6. <a :class="[tab == 'new'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('new')">New</a>
  7. <!-- <a :class="[tab == 'random'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('random')">Random</a> -->
  8. <a :class="[tab == 'about'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('about')">About</a>
  9. </p>
  10. </div>
  11. <div v-if="tab != 'about'" class="row loops-container">
  12. <div class="col-12 col-md-4 mb-3" v-for="(loop, index) in loops">
  13. <div class="card border border-success">
  14. <div class="embed-responsive embed-responsive-1by1">
  15. <video class="embed-responsive-item" :src="videoSrc(loop)" preload="none" width="100%" height="100%" loop @click="toggleVideo(loop, $event)" :poster="posterSrc(loop)"></video>
  16. </div>
  17. <div class="card-body">
  18. <p class="username font-weight-bolder lead d-flex justify-content-between"><a :href="loop.account.url">{{loop.account.acct}}</a> <a :href="loop.url">{{timestamp(loop)}}</a></p>
  19. <p class="small text-muted text-truncate" v-html="getTitle(loop)"></p>
  20. <div class="small text-muted d-flex justify-content-between mb-0">
  21. <span>{{loop.favourites_count}} Likes</span>
  22. <span>{{loop.reblogs_count}} Shares</span>
  23. <span>{{loop.reply_count}} Comments</span>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. <div v-else class="col-12">
  30. <div class="card">
  31. <div class="card-body">
  32. <p class="lead text-center mb-0">Loops are an exciting new way to explore short videos on Pixelfed.</p>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. </template>
  38. <style type="text/css">
  39. .loops-container .card {
  40. box-shadow: none;
  41. }
  42. .loops-container .card .card-img-top{
  43. border-radius: 0;
  44. }
  45. .loops-container a {
  46. color: #343a40;
  47. }
  48. a.hashtag,
  49. .loops-container .card-body a:hover {
  50. color: #28a745 !important;
  51. }
  52. </style>
  53. <script type="text/javascript">
  54. Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
  55. get: function(){
  56. return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
  57. }
  58. })
  59. export default {
  60. data() {
  61. return {
  62. 'version': 1,
  63. 'loops': [],
  64. 'tab': 'new'
  65. }
  66. },
  67. mounted() {
  68. axios.get('/api/v2/loops')
  69. .then(res => {
  70. this.loops = res.data;
  71. })
  72. },
  73. methods: {
  74. videoSrc(loop) {
  75. return loop.media_attachments[0].url;
  76. },
  77. posterSrc(loop) {
  78. return loop.media_attachments[0].preview_url;
  79. },
  80. setTab(tab) {
  81. this.tab = tab;
  82. },
  83. toggleVideo(loop, $event) {
  84. let el = $event.target;
  85. $('video').each(function() {
  86. if(el.src != $(this)[0].src) {
  87. $(this)[0].pause();
  88. }
  89. });
  90. if(!el.playing) {
  91. el.play();
  92. //this.incrementLoop(loop);
  93. } else {
  94. el.pause();
  95. }
  96. },
  97. incrementLoop(loop) {
  98. // axios.post('/api/v2/loops/watch', {
  99. // id: loop.id
  100. // }).then(res => {
  101. // console.log(res.data);
  102. // });
  103. },
  104. timestamp(loop) {
  105. let ts = new Date(loop.created_at);
  106. return ts.toLocaleDateString();
  107. },
  108. getTitle(loop) {
  109. let content = loop.content : 'Untitled';
  110. return content.trim();
  111. }
  112. }
  113. }
  114. </script>