LoopComponent.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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">
  14. <div class="embed-responsive embed-responsive-1by1">
  15. <video class="embed-responsive-item" :src="videoSrc(loop)" preload="auto" loop @click="toggleVideo(loop, $event)"></video>
  16. </div>
  17. <div class="card-body">
  18. <p class="username font-weight-bolder"><a :href="loop.account.url">{{loop.account.acct}}</a> , <a :href="loop.url">{{timestamp(loop)}}</a></p>
  19. <p class="small text-muted" v-html="loop.content"></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>0 Loops</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. border-radius: 0;
  42. }
  43. .loops-container .card .card-img-top{
  44. border-radius: 0;
  45. }
  46. .loops-container a {
  47. color: #343a40;
  48. }
  49. a.hashtag,
  50. .loops-container .card-body a:hover {
  51. color: #28a745 !important;
  52. }
  53. </style>
  54. <script type="text/javascript">
  55. Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
  56. get: function(){
  57. return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
  58. }
  59. })
  60. export default {
  61. data() {
  62. return {
  63. 'version': 1,
  64. 'loops': [],
  65. 'tab': 'popular'
  66. }
  67. },
  68. mounted() {
  69. axios.get('/api/v2/loops')
  70. .then(res => {
  71. this.loops = res.data;
  72. })
  73. },
  74. methods: {
  75. videoSrc(loop) {
  76. return loop.media_attachments[0].url;
  77. },
  78. setTab(tab) {
  79. this.tab = tab;
  80. },
  81. toggleVideo(loop, $event) {
  82. let el = $event.target;
  83. $('video').each(function() {
  84. if(el.src != $(this)[0].src) {
  85. $(this)[0].pause();
  86. }
  87. });
  88. if(!el.playing) {
  89. el.play();
  90. this.incrementLoop(loop);
  91. } else {
  92. el.pause();
  93. }
  94. },
  95. incrementLoop(loop) {
  96. axios.post('/api/v2/loops/watch', {
  97. id: loop.id
  98. }).then(res => {
  99. console.log(res.data);
  100. });
  101. },
  102. timestamp(loop) {
  103. let ts = new Date(loop.created_at);
  104. return ts.toLocaleDateString();
  105. }
  106. }
  107. }
  108. </script>