index.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <template>
  2. <div class="w-full overflow-y-scroll flex flex-col p-2 gap-5">
  3. <div
  4. v-if="newsList === null"
  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. </template>
  25. </div>
  26. </template>
  27. <script setup lang="ts">
  28. import { useDebug } from '~/store/useDebug'
  29. import { useHeader } from '~/store/useHeader'
  30. interface NewsList {
  31. id: number
  32. date: string
  33. title: string
  34. description: string
  35. preview: string
  36. type: string
  37. }
  38. definePageMeta({
  39. name: 'Новости',
  40. middleware: ['user-only'],
  41. })
  42. const api = useApi()
  43. const debug = useDebug()
  44. const header = useHeader()
  45. const newsList = ref<NewsList | null>(null)
  46. header.setAdditionalMenu([
  47. {
  48. name: 'Debug',
  49. icon: 'bug-report',
  50. action: () => debug.show(),
  51. },
  52. {
  53. name: 'Trigger error',
  54. icon: 'bug-report',
  55. action: () => {
  56. throw new Error('Test Error <3')
  57. },
  58. },
  59. ])
  60. onMounted(async () => {
  61. newsList.value = await api.get('/news/')
  62. })
  63. </script>