index.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <div class="w-full flex flex-col p-2 gap-5">
  3. <div
  4. v-if="!newsList"
  5. class="w-full h-full"
  6. >
  7. <div
  8. v-for="i of Array.from({ length: 10 }).map((i, idx) => idx)"
  9. :key="i"
  10. :class="i === 0 ? 'mt-0 mb-4' : 'my-4'"
  11. class="w-full h-64 loading rounded-md opacity-30"
  12. />
  13. </div>
  14. <template v-else>
  15. <!-- <WallPost
  16. v-for="news in newsList"
  17. :key="news.id"
  18. :image="news.preview.length > 0 ? news.preview : `/nophoto.png`"
  19. :title="news.title"
  20. :description="news.description"
  21. :date="news.date"
  22. @click="navigateTo(`/news/${news.id}`)"
  23. /> -->
  24. <DynamicScroller
  25. :items="newsList"
  26. :min-item-size="230"
  27. class="h-full"
  28. page-mode
  29. >
  30. <template v-slot="{ item, index, active }">
  31. <DynamicScrollerItem
  32. :item="item"
  33. :active="active"
  34. :data-index="index"
  35. :size-dependencies="[
  36. item.description
  37. ]"
  38. >
  39. <WallPost
  40. :key="item.id"
  41. :image="item.preview.length > 0 ? item.preview : `/nophoto.png`"
  42. :title="item.title"
  43. :description="item.description"
  44. :date="item.date"
  45. @click="navigateTo(`/news/${item.id}`)"
  46. />
  47. <div class="h-[30px]" />
  48. </DynamicScrollerItem>
  49. </template>
  50. </DynamicScroller>
  51. </template>
  52. </div>
  53. </template>
  54. <script setup lang="ts">
  55. import type { NewsList } from '~/types/news'
  56. import { DynamicScroller, DynamicScrollerItem } from 'vue-virtual-scroller'
  57. import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
  58. definePageMeta({
  59. name: 'Новости',
  60. middleware: ['user-only'],
  61. })
  62. const { $api } = useNuxtApp()
  63. const newsList = ref<NewsList>()
  64. onMounted(async () => {
  65. newsList.value = await $api.news.getPosts()
  66. })
  67. </script>