sponsor-list.vue 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <script lang="ts" setup>
  2. import { computed } from 'vue'
  3. import { isDark } from '../../composables/dark'
  4. import { useLang } from '../../composables/lang'
  5. import sponsorLocale from '../../../i18n/component/sponsor.json'
  6. import { sendEvent } from '../../../config/analytics'
  7. const onItemClick = (item: any) => {
  8. sendEvent('sp_click', item.name, 'index')
  9. }
  10. defineProps({
  11. sponsors: Array,
  12. sponsorType: String,
  13. })
  14. const lang = useLang()
  15. const sponsorLang = computed(() => sponsorLocale[lang.value])
  16. const langZhCN = 'zh-CN'
  17. const getSponsorName = (sponsor) => {
  18. if (lang.value === langZhCN) {
  19. return sponsor.name_cn || sponsor.name
  20. }
  21. return sponsor.name
  22. }
  23. const getSponsorSlogan = (sponsor) => {
  24. if (lang.value === langZhCN) {
  25. return sponsor.slogan_cn || sponsor.slogan
  26. }
  27. return sponsor.slogan
  28. }
  29. </script>
  30. <template>
  31. <h2 class="text-center mb-4 text-xl">{{ sponsorLang[sponsorType] }}</h2>
  32. <div class="grid gap-1 sponsor-list platinum">
  33. <a
  34. v-for="(sponsor, i) in sponsors"
  35. :key="i"
  36. :class="['sponsor flex px-4 rounded-md', sponsor.className]"
  37. :href="sponsor.url"
  38. target="_blank"
  39. @click="onItemClick(sponsor)"
  40. >
  41. <img
  42. :class="sponsor.isDark && isDark ? 'filter invert' : ''"
  43. width="45"
  44. :src="sponsor.img"
  45. :alt="sponsor.name"
  46. />
  47. <div>
  48. <p>
  49. <span class="name">{{ getSponsorName(sponsor) }}</span>
  50. </p>
  51. <p>{{ getSponsorSlogan(sponsor) }}</p>
  52. </div>
  53. </a>
  54. </div>
  55. </template>