import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue' import { useRoute, useRouter } from 'vue-router' import request from '@/helpers/request' import ColHeader from '@/components/col-header' import { postMessage } from '@/helpers/native-message' import { Button, Icon, Image, List, NavBar, Sticky } from 'vant' // import classNames from 'classnames' // import Footer from '../album/footer' // import FavoriteIcon from '../album/favorite.svg' // import FavoritedIcon from '../album/favorited.svg' import styles from './index.module.less' // import Item from '../list/item' import { useRect } from '@vant/use' import { useEventListener, useWindowScroll } from '@vueuse/core' import { getRandomKey, musicBuy } from '../music' import { state } from '@/state' import IconPan from './pan.png' import oStart from './oStart.png' import iStart from './iStart.png' import Title from '../component/title' import Song from '../component/song' import ColResult from '@/components/col-result' import MusicGrid from '../component/music-grid' import { useEventTracking } from '@/helpers/hooks' const noop = () => {} export default defineComponent({ name: 'AlbumDetail', props: { onItemClick: { type: Function, default: noop } }, setup({ onItemClick }) { localStorage.setItem('behaviorId', getRandomKey()) const router = useRouter() const params = reactive({ search: '', relatedNum: 6, //相关专辑数 page: 1, rows: 200 }) const albumDetail = ref(null) // const data = ref(null) const rows = ref([]) const loading = ref(false) // const finished = ref(false) const isError = ref(false) const favorited = ref(0) const albumFavoriteCount = ref(0) const headers = ref(null) const background = ref('rgba(55, 205, 177, 0)') const color = ref('#fff') const heightInfo = ref('auto') const route = useRoute() const FetchList = async (id?: any) => { if (loading.value) { return } loading.value = true isError.value = false try { const res = await request.post('/music/album/detail', { prefix: state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student', data: { id: id || route.params.id, ...params } }) const { musicSheetList, ...rest } = res.data rows.value = [...musicSheetList.rows] const musicTagNames = rest?.musicTagNames?.split(',') || [] albumDetail.value = { ...rest, musicTagNames } favorited.value = rest.favorite albumFavoriteCount.value = rest.albumFavoriteCount } catch (error) { isError.value = true } loading.value = false } const favoriteLoading = ref(false) onMounted(() => { FetchList() useEventListener(document, 'scroll', evt => { const { y } = useWindowScroll() if (y.value > 20) { background.value = `rgba(255, 255, 255)` color.value = 'black' postMessage({ api: 'backIconChange', content: { iconStyle: 'black' } }) } else { background.value = 'transparent' color.value = '#fff' postMessage({ api: 'backIconChange', content: { iconStyle: 'white' } }) } }) useEventTracking('专辑') }) const toggleFavorite = async (id: number) => { favoriteLoading.value = true try { await request.post('/music/album/favorite/' + id, { prefix: state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student' }) favorited.value = favorited.value === 1 ? 0 : 1 albumFavoriteCount.value += favorited.value ? 1 : -1 } catch (error) {} favoriteLoading.value = false } return () => { return (
{ nextTick(() => { const { height } = useRect(headers as any) heightInfo.value = height }) }} />
{albumDetail.value?.albumName}
{albumDetail.value?.musicTagNames?.map((tag: any) => ( {tag} ))}
{albumDetail.value?.albumDesc}
共{albumDetail.value?.musicSheetCount}首曲目{state.platformType}
toggleFavorite(albumDetail.value?.id)} > {albumFavoriteCount.value}人收藏
<Song list={rows.value} onDetail={(item: any) => { if (onItemClick === noop || !onItemClick) { musicBuy(item, () => {}, { albumId: route.params.id, albumName: albumDetail.value?.albumName }) } else { onItemClick(item) } }} /> {rows.value && rows.value.length <= 0 && ( <ColResult btnStatus={false} tips="暂无曲目" /> )} </div> {albumDetail.value?.relatedMusicAlbum && albumDetail.value?.relatedMusicAlbum.length > 0 && ( <> <Title title="相关专辑" onMore={() => { router.push({ path: '/music-album' }) }} /> <MusicGrid list={albumDetail.value?.relatedMusicAlbum} onGoto={(n: any) => { router .push({ name: 'music-album-detail', params: { id: n.id } }) .then(() => { FetchList(n.id) window.scrollTo(0, 0) }) }} /> </> )} </div> </div> ) } } })