index.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <div
  3. v-if="albums"
  4. class="w-screen flex flex-col gap-5 pt-3"
  5. >
  6. <DynamicScroller
  7. :items="albums"
  8. :min-item-size="230"
  9. class="h-full"
  10. page-mode
  11. >
  12. <template v-slot="{ item, index, active }">
  13. <DynamicScrollerItem
  14. :item="item"
  15. :active="active"
  16. :data-index="index"
  17. :min-item-size="500"
  18. :size-dependencies="[
  19. item.title
  20. ]"
  21. >
  22. <div class="bg-background-100 rounded-md mx-2">
  23. <NuxtLink
  24. :to="`/gallery/${item.id}`"
  25. >
  26. <NuxtImg
  27. class="w-full rounded-t-md min-h-[300px] max-h-[300px] object-cover"
  28. :src="item.preview"
  29. alt="Фото"
  30. />
  31. <p
  32. class="text-center text-sm font-semibold my-3 px-3"
  33. v-text="item.title"
  34. />
  35. <p
  36. class="text-xs text-right mb-2 pr-2 pb-1"
  37. v-text="item.date"
  38. />
  39. </NuxtLink>
  40. </div>
  41. <div class="h-[16px]" />
  42. </DynamicScrollerItem>
  43. </template>
  44. </DynamicScroller>
  45. </div>
  46. <div
  47. v-else
  48. class="w-screen h-full flex justify-center items-center"
  49. >
  50. <ILoader class="w-16 h-16 text-foreground" />
  51. </div>
  52. </template>
  53. <script setup lang="ts">
  54. import { DynamicScroller, DynamicScrollerItem } from 'vue-virtual-scroller'
  55. import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
  56. import { useGalleryApi } from '~/composables/useGalleryApi'
  57. import { useLogger } from '~/composables/useLogger'
  58. definePageMeta({
  59. name: 'Галерея',
  60. middleware: ['user-only'],
  61. })
  62. const albums = ref<object>()
  63. const { gallery } = useGalleryApi()
  64. const log = useLogger('Gallery')
  65. onMounted(async () => {
  66. try {
  67. if (!gallery) {
  68. log.error('Модуль галереи не инициализирован')
  69. return
  70. }
  71. albums.value = await gallery.getAlbums()
  72. } catch (e) {
  73. log.error('Ошибка при получении альбомов:', e)
  74. }
  75. })
  76. </script>