vp-changelog.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <script setup lang="ts">
  2. import { onMounted, ref } from 'vue'
  3. import axios from 'axios'
  4. import VPLink from '../common/vp-link.vue'
  5. import VPMarkdown from '../common/vp-markdown.vue'
  6. import { useLang } from '../../composables/lang'
  7. import { useLocale } from '../../composables/locale'
  8. import changelogLocale from '../../../i18n/component/changelog.json'
  9. interface Release {
  10. id: number
  11. name: string
  12. }
  13. const loading = ref(true)
  14. const releases = ref<Release[]>([])
  15. const currentRelease = ref()
  16. const changelog = useLocale(changelogLocale)
  17. const lang = useLang()
  18. const onVersionChange = (val) => {
  19. const _releases = releases.value
  20. currentRelease.value = _releases[_releases.findIndex((r) => r.name === val)]
  21. }
  22. onMounted(async () => {
  23. try {
  24. const { data } = await axios.get<Release[]>(
  25. 'https://api.github.com/repos/element-plus/element-plus/releases'
  26. )
  27. releases.value = data
  28. currentRelease.value = data[0]
  29. } catch {
  30. releases.value = []
  31. currentRelease.value = undefined
  32. // do something
  33. } finally {
  34. loading.value = false
  35. }
  36. })
  37. </script>
  38. <template>
  39. <div class="changelogs">
  40. <ClientOnly>
  41. <ElSkeleton :loading="loading">
  42. <div class="changelog-versions">
  43. <p>{{ changelog['select-version'] }}:</p>
  44. <ElSelect
  45. :model-value="currentRelease.name"
  46. :placeholder="changelog['select-version']"
  47. style="min-width: 200px"
  48. @change="onVersionChange"
  49. >
  50. <ElOption
  51. v-for="release in releases"
  52. :key="release.id"
  53. :value="release.name"
  54. >
  55. {{ release.name }}
  56. </ElOption>
  57. </ElSelect>
  58. </div>
  59. <ElCard v-if="currentRelease">
  60. <template #header>
  61. <div class="changelog-header">
  62. <div class="changelog-meta">
  63. <p class="changelog-by">
  64. {{ changelog['published-by'] }}
  65. <strong>{{ currentRelease.author.login }}</strong>
  66. </p>
  67. <p class="changelog-date">
  68. {{
  69. new Date(currentRelease.published_at).toLocaleString(lang)
  70. }}
  71. </p>
  72. </div>
  73. <div class="operators">
  74. <VPLink :href="currentRelease.html_url">
  75. {{ changelog['open-link'] }}
  76. </VPLink>
  77. </div>
  78. </div>
  79. </template>
  80. <div>
  81. <VPMarkdown :content="currentRelease.body" />
  82. </div>
  83. </ElCard>
  84. </ElSkeleton>
  85. </ClientOnly>
  86. </div>
  87. </template>
  88. <style lang="scss" scoped>
  89. .changelog-versions {
  90. display: flex;
  91. align-items: center;
  92. justify-content: space-between;
  93. margin-bottom: 1rem;
  94. p {
  95. margin-right: 2rem;
  96. }
  97. }
  98. .changelog-header {
  99. display: flex;
  100. align-items: flex-start;
  101. justify-content: space-between;
  102. .changelog-meta {
  103. display: flex;
  104. flex: 1;
  105. flex-direction: column;
  106. p {
  107. margin: 0;
  108. }
  109. }
  110. .link-item {
  111. line-height: 1.7;
  112. }
  113. }
  114. </style>