import { defineComponent, onMounted, onUnmounted, reactive, watch } from 'vue'; // import WaveSurfer from 'wavesurfer.js'; import styles from './index.module.less'; import MSticky from '@/components/m-sticky'; import MHeader from '@/components/m-header'; import { Button, Cell, Image, List, Popup, Slider, showDialog, showToast } from 'vant'; import iconDownload from './images/icon-download.png'; import iconShare from './images/icon-share.png'; import iconDelete from './images/icon-delete.png'; import iconMember from './images/icon-member.png'; import iconZan from './images/icon-zan.png'; import iconZanActive from './images/icon-zan-active.png'; import iconPlay from './images/icon-play.png'; import iconPause from './images/icon-pause.png'; import { postMessage, promisefiyPostMessage } from '@/helpers/native-message'; import { browser, getGradeCh, getSecondRPM } from '@/helpers/utils'; import { useRoute, useRouter } from 'vue-router'; import { api_userMusicDetail, api_userMusicRemove, api_userMusicStarPage } from './api'; import MEmpty from '@/components/m-empty'; import dayjs from 'dayjs'; import { nextTick } from 'process'; import MVideo from '@/components/m-video'; import ShareModel from './share-model'; import { usePageVisibility } from '@vant/use'; export default defineComponent({ name: 'creation-detail', setup() { const route = useRoute(); const router = useRouter(); const audioId = 'a' + +Date.now() + Math.floor(Math.random() * 100); const state = reactive({ id: route.query.id, deleteStatus: false, shareStatus: false, playType: '' as 'Audio' | 'Video' | '', // 播放类型 musicDetail: {} as any, timer: null as any, audioWidth: 0, paused: true, currentTime: 0, duration: 0.1, loop: false, dragStatus: false, // 是否开始拖动 isClick: false, list: [] as any, listState: { dataShow: true, // 判断是否有数据 loading: false, finished: false }, params: { page: 1, rows: 20 } }); const audioDom = new Audio(); audioDom.controls = true; audioDom.style.width = '100%'; audioDom.className = styles.audio; /** 改变播放时间 */ const handleChangeTime = (val: number) => { state.currentTime = val; clearTimeout(state.timer); state.timer = setTimeout(() => { // audioRef.value.currentTime = val; audioDom.currentTime = val; state.timer = null; }, 60); }; // 切换音频播放 const onToggleAudio = (e: any) => { e.stopPropagation(); if (audioDom.paused) { audioDom.play(); } else { audioDom.pause(); } state.paused = audioDom.paused; }; // 获取列表 const getStarList = async () => { try { if (state.isClick) return; state.isClick = true; const res = await api_userMusicStarPage({ userMusicId: state.id, ...state.params }); state.listState.loading = false; const result = res.data || {}; // 处理重复请求数据 if (state.list.length > 0 && result.current === 1) { return; } state.list = state.list.concat(result.rows || []); state.listState.finished = result.current >= result.pages; state.params.page = result.current + 1; state.listState.dataShow = state.list.length > 0; state.isClick = false; } catch { state.listState.dataShow = false; state.listState.finished = true; state.isClick = false; } }; const initAudio = () => { audioDom.src = state.musicDetail.videoUrl; audioDom.load(); audioDom.oncanplaythrough = () => { state.paused = audioDom.paused; state.duration = audioDom.duration; }; // 播放时监听 audioDom.addEventListener('timeupdate', () => { state.duration = audioDom.duration; state.currentTime = audioDom.currentTime; const rate = (state.currentTime / state.duration) * 100; state.audioWidth = rate > 100 ? 100 : rate; }); audioDom.addEventListener('ended', () => { state.paused = audioDom.paused; }); // const wavesurfer = WaveSurfer.create({ // container: document.querySelector(`#${audioId}`) as HTMLElement, // waveColor: '#fff', // progressColor: '#2FA1FD', // url: state.musicDetail.videoUrl, // cursorWidth: 0, // height: 35, // width: 'auto', // normalize: true, // // Set a bar width // barWidth: 2, // // Optionally, specify the spacing between bars // barGap: 2, // // And the bar radius // barRadius: 4, // barHeight: 0.6, // autoScroll: true, // /** If autoScroll is enabled, keep the cursor in the center of the waveform during playback */ // autoCenter: true, // hideScrollbar: false, // media: audioDom // }); // wavesurfer.once('interaction', () => { // // wavesurfer.play(); // }); // wavesurfer.once('ready', () => { // state.paused = audioDom.paused; // state.duration = audioDom.duration; // }); // wavesurfer.on('finish', () => { // state.paused = true; // }); // // 播放时监听 // audioDom.addEventListener('timeupdate', () => { // state.currentTime = audioDom.currentTime; // }); }; // 删除作品 const onDelete = async () => { try { await api_userMusicRemove({ id: state.id }); setTimeout(() => { state.deleteStatus = false; showToast('删除成功'); }, 100); setTimeout(() => { if (browser().isApp) { postMessage({ api: 'goBack' }); } else { router.back(); } }, 1200); } catch { // } }; // 下载 const onDownload = async () => { await promisefiyPostMessage({ api: 'saveFile', content: { url: state.musicDetail.videoUrl } }); }; const pageVisibility = usePageVisibility(); watch(pageVisibility, value => { console.log(value); if (value === 'hidden') { if (audioDom) { audioDom.pause(); state.paused = audioDom.paused; } } }); onMounted(async () => { try { const res = await api_userMusicDetail(state.id); // console.log(res); if (res.code === 999) { showDialog({ message: res.message, theme: 'round-button', confirmButtonColor: 'linear-gradient(73deg, #5BECFF 0%, #259CFE 100%)' }).then(() => { if (browser().isApp) { postMessage({ api: 'goBack' }); } else { router.back(); } }); return; } state.musicDetail = res.data || {}; getStarList(); // 判断是视频还是音频 if (res.data.videoUrl.lastIndexOf('mp4') !== -1) { state.playType = 'Video'; } else { state.playType = 'Audio'; // 初始化 nextTick(() => { initAudio(); }); } } catch { // } }); onUnmounted(() => { if (audioDom) { audioDom.pause(); state.paused = audioDom.paused; } }); return () => (
{state.playType === 'Video' && ( )} {state.playType === 'Audio' && (
{/*
{ e.stopPropagation(); }}>
*/}
{ e.stopPropagation(); }} onTouchmove={(e: TouchEvent) => { // emit('close'); }}>
{ handleChangeTime(val); }} onDragStart={() => { state.dragStatus = true; console.log('onDragStart'); }} onDragEnd={() => { state.dragStatus = false; console.log('onDragEnd'); }} />
{getSecondRPM(state.currentTime)}
/
{getSecondRPM(state.duration)}
)}
{{ icon: () => ( ), title: () => (

{state.musicDetail?.username} {state.musicDetail.vipFlag && ( )}

{state.musicDetail.subjectName}{' '} {getGradeCh(state.musicDetail.currentGradeNum - 1)}

), value: () => (
{state.musicDetail.likeNum}
) }}
曲目名称 {state.musicDetail?.musicSheetName}
{state.musicDetail.desc && (
{state.musicDetail.desc}
)}
点赞记录
{state.listState.dataShow ? ( {state.list.map((item: any, index: number) => ( {{ icon: () => ( ), title: () => (

{item.userName}

{item.subjectName}{' '} {getGradeCh(item.currentGradeNum - 1)}

), value: () => (
{dayjs(item.createTime).format('YYYY-MM-DD HH:mm')}
) }}
))}
) : ( )}

下载

(state.shareStatus = true)}> 分享

(state.deleteStatus = true)}> 删除

确定删除吗?

(state.shareStatus = false)} />
); } });