item.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { defineComponent, ref } from 'vue'
  2. import { Button, Icon, Image, Tag } from 'vant'
  3. import classNames from 'classnames'
  4. import MusicIcon from './icons/music-icon.png'
  5. import InitUserIcon from './icons/init-user-icon.png'
  6. import FavoriteIcon from '../album/favorite.svg'
  7. import FavoritedIcon from '../album/favorited.svg'
  8. import styles from './item.module.less'
  9. import request from '@/helpers/request'
  10. const chargeTypes = {
  11. CHARGE: '点播',
  12. FREE: '免费',
  13. VIP: 'VIP'
  14. }
  15. export default defineComponent({
  16. name: 'MusicItem',
  17. props: {
  18. data: {
  19. type: Object,
  20. default: {}
  21. },
  22. onClick: {
  23. type: Function,
  24. default: (item: any) => {}
  25. }
  26. },
  27. setup({ data, onClick }) {
  28. const favorite = ref(data.favorite)
  29. const favoriteLoading = ref(false)
  30. const toggleFavorite = async (evt: MouseEvent) => {
  31. evt.stopPropagation()
  32. favoriteLoading.value = true
  33. try {
  34. await request.post('/api-student/music/sheet/favorite/' + data.id)
  35. favorite.value = !favorite.value
  36. } catch (error) {}
  37. favoriteLoading.value = false
  38. }
  39. return () => (
  40. <div
  41. class={styles.item}
  42. onClick={() => {
  43. onClick(data)
  44. }}
  45. >
  46. <header class={styles.header}>
  47. <div class={styles.mate}>
  48. <Image src={MusicIcon} round class={styles.icon} />
  49. <div class={styles.info}>
  50. <h4>{data.musicSheetName}</h4>
  51. <p>{data.composer}</p>
  52. </div>
  53. </div>
  54. <div class={styles.buttons}>
  55. <Button
  56. class={classNames(
  57. styles.btn,
  58. styles[data.chargeType.toLocaleLowerCase()]
  59. )}
  60. >
  61. {chargeTypes[data.chargeType]}
  62. <Icon name="arrow" />
  63. </Button>
  64. </div>
  65. </header>
  66. <footer class={styles.footer}>
  67. <div class={styles.user}>
  68. <Image
  69. round
  70. src={data.addUserAvatar || InitUserIcon}
  71. class={styles.userIcon}
  72. />
  73. <p>{data.addName}</p>
  74. <div class={styles.tags}>
  75. {(data.subjectNames || '').split(',').map(item => (
  76. <Tag>{item}</Tag>
  77. ))}
  78. </div>
  79. </div>
  80. <div class={styles.icons}>
  81. <Button
  82. style={{ border: 'none' }}
  83. onClick={toggleFavorite}
  84. loading={favoriteLoading.value}
  85. >
  86. <Icon
  87. class={styles.favorite}
  88. name={favorite.value ? FavoritedIcon : FavoriteIcon}
  89. />
  90. </Button>
  91. </div>
  92. </footer>
  93. </div>
  94. )
  95. }
  96. })