import { defineComponent, onMounted, onUnmounted, reactive, ref, watch } from 'vue'; import styles from './index.module.less'; import { postMessage } from '@/helpers/native-message'; import icon_title from './images/icon-title.png'; import icon_back from './images/icon-back.png'; import icon_setting from './images/icon-setting.png'; import iconPlay from './images/icon-play.png'; import iconPause from './images/icon-pause.png'; import beat from './images/btn-2.png'; import tempo from './images/btn-3.png'; import randDom from './images/btn-1.png'; import iconPlus from './images/icon-plus.png'; import iconAdd from './images/icon-add.png'; import { getImage } from './images/music'; import '@vant/touch-emulator'; // import j2 from './images/music/j-2.png'; import { Popover, Popup, showToast } from 'vant'; import SettingModal from './setting-modal'; import { randomScoreElement, renderScore, setting, elementDirection } from './setting'; import { handleStartTick, hendleEndTick } from './tick'; import { handleStartBeat, hendleEndBeat } from './beat-tick'; import { browser } from '@/helpers/utils'; import { useRoute } from 'vue-router'; export default defineComponent({ name: 'tempo-practice', props: { dataJson: { type: Object, default: () => {} }, modeType: { type: String, default: '' }, show: { type: Boolean, default: false } }, setup(props, { expose }) { const route = useRoute(); const state = reactive({ modeType: '' as any, platform: route.query.platform, // microapp 老师端应用里面打开单独处理返回逻辑 win: route.query.win, settingStatus: false, speedList: [ { text: '40', value: 40, color: '#060606' }, { text: '50', value: 50, color: '#060606' }, { text: '60', value: 60, color: '#060606' }, { text: '70', value: 70, color: '#060606' }, { text: '80', value: 80, color: '#060606' }, { text: '90', value: 90, color: '#060606' }, { text: '100', value: 100, color: '#060606' }, { text: '110', value: 110, color: '#060606' }, { text: '120', value: 120, color: '#060606' }, { text: '130', value: 130, color: '#060606' }, { text: '140', value: 140, color: '#060606' }, { text: '150', value: 150, color: '#060606' }, { text: '160', value: 160, color: '#060606' }, { text: '170', value: 170, color: '#060606' }, { text: '180', value: 180, color: '#060606' }, { text: '190', value: 190, color: '#060606' }, { text: '200', value: 200, color: '#060606' } ], dataJson: {} as any }); // 返回 const goback = () => { if (state.platform === 'microapp') { window.parent.postMessage( { api: 'iframe_exit' }, '*' ); return; } if (!browser().isApp) { window.close(); return; } postMessage({ api: 'goBack' }); }; /** 播放切换 */ const handlePlay = async () => { if (setting.playState === 'pause') { setting.playState = 'play'; if (setting.playType === 'beat') { await handleStartTick(); } else { await handleStartBeat(); } } else { handleStop(); } }; /** 播放类型 */ const handlePlayType = () => { handleStop(); if (setting.playType === 'beat') { setting.playType = 'tempo'; } else { setting.playType = 'beat'; } }; const handleStop = () => { setting.playState = 'pause'; if (setting.playType === 'beat') { hendleEndTick(); } else { hendleEndBeat(); } }; // {"element":"jianpu","beat":"4-4","barLine":"1","tempo":["1","2","3"]}' const onIframeHandle = (ev: MessageEvent) => { // 获取配置 if (ev.data.api === 'getTempoSetting') { window.parent.postMessage( { api: 'getTempoSetting', data: JSON.stringify({ setting: { element: setting.element, beat: setting.beat, barLine: setting.barLine, tempo: setting.tempo, scorePart: setting.scorePart, playType: setting.playType, speed: setting.speed }, coverImg: '' }) }, '*' ); } if (ev.data.api === 'setPlayState') { if (ev.data.data) { handlePlay(); } else { handleStop(); } } if (ev.data.api === 'resetPlay') { resetSetting(); } }; const resetSetting = () => { try { let dataJson = props.dataJson; if (route.query.dataJson) { dataJson = JSON.parse(route.query.dataJson as any); } console.log(dataJson, 'dataJson', props.dataJson); setting.element = dataJson.element; setting.beat = dataJson.beat; setting.barLine = dataJson.barLine; setting.tempo = dataJson.tempo; setting.scorePart = dataJson.scorePart; setting.playType = dataJson.playType; setting.speed = dataJson.speed; state.dataJson = dataJson; } catch { // } }; // watch( // () => props.show, // val => { // console.log(val, props.show); // if (!val) { // // resetSetting(); // handleStop(); // } else { // resetSetting(); // } // } // ); onMounted(() => { if (route.query.modeType) { state.modeType = route.query.modeType; } resetSetting(); state.speedList.forEach((item: any) => { if (item.value === setting.speed) item.color = '#1CACF1'; }); if (setting?.scorePart?.length <= 0) { renderScore(); } window.addEventListener('message', onIframeHandle); }); onUnmounted(() => { window.removeEventListener('message', onIframeHandle); }); expose({ resetSetting }); return () => (