import { defineComponent, Directive, Ref, ref, Transition, Teleport, nextTick, computed, onMounted } from 'vue' import { Button, Cell, CellGroup, Dialog, Divider, Popover, Slider, Switch } from 'vant' import ButtonIcon from './icon' import runtime, * as RuntimeUtils from '/src/pages/detail/runtime' import Speed from '/src/pages/detail/speed' import detailState from '/src/pages/detail/state' import SettingState from '/src/pages/detail/setting-state' import appState from '/src/state' import FloatWraper from './float-wraper' import Evaluating from './evaluating' import iconTitle from '../popups/evaluating/icons/title.svg' import iconCancel from '../popups/evaluating/icons/cancel.svg' import iconConfirm from '../popups/evaluating/icons/confirm.svg' import { useClientType, useMenu, useOriginSearch, useWiredHeadsetCheck, useReload } from '../uses' import { permissionPopup } from '../popups/permission/permission' import { open as openMusicList } from '../music-list' import { postMessage } from '/src/helpers/native-message' import Popups from '../popups' import Setting from '../popups/setting' import evastyles from '../popups/evaluating/index.module.less' import ModelWraper from './model-wraper' import Follow from '../popups/follow' import { switchProps } from '../popups/setting/evaluat' import iconFollowEndBtn from '../popups/follow/icons/icon-followEndBtn.png' import iconEvaluatingEnd from './icons/icon-evaluatingEnd.png' import store from 'store' import { useRoute } from 'vue-router' import styles from './index.module.less' export const confirmShow: Ref = ref(false) export const startButtonShow = ref(true) export const evaluatingRef: Ref = ref({}) export const settingPopup: Ref = ref(null) export const suggestPopup: Ref = ref(null) export const followRef = ref(null) let openSuggestPopupFn = () => {} export const openSuggestPopup = () => { openSuggestPopupFn() } export const animate: Directive = { mounted: (el: HTMLElement) => { el.addEventListener('click', (evt: Event) => { let element = evt.target as HTMLElement element.classList.add(...['animate__animated', 'animate__tada']) }) el.addEventListener('animationend', (evt: Event) => { let element = evt.target as HTMLElement element.classList.remove(...['animate__animated', 'animate__tada']) }) }, } /** * 前置验证是否在APP中并且已经付费 * @param cb 回调函数 {status} 验证状态 * @returns */ const beforeCheck = (cb: (status: boolean) => void) => { const search = useOriginSearch() const setting = (search.setting || {}) as any const chargeType = detailState.activeDetail?.paymentType const orderStatus = detailState.activeDetail?.orderStatus const play = detailState.activeDetail?.play const membershipDays = appState.user?.membershipDays || 0 if (useClientType() === 'web' || play || setting.feeType === 'FREE') { return cb(true) } if ( chargeType?.includes('VIP') && chargeType?.includes('CHARGE') && !(membershipDays > 0) && orderStatus !== 'PAID' ) { permissionPopup.active = 'memberAndDemand' permissionPopup.show = true return cb(false) } if (chargeType === 'VIP' && !(membershipDays > 0)) { permissionPopup.active = 'member' permissionPopup.show = true return cb(false) } if (chargeType === 'CHARGE' && orderStatus !== 'PAID') { permissionPopup.active = 'demand' permissionPopup.show = true return cb(false) } cb(true) } const back: () => void = () => { postMessage({ api: 'back', }) } const startEvaluat = () => { console.log('开始评测') beforeCheck((status) => { if (status) { RuntimeUtils.setCurrentTime(0) runtime.evaluatingStatus = true } }) } type IModelType = 'practice' | 'evaluation' | 'follow' | 'init' export const modelType = ref('init') const modelWraperShow = ref(true) export const onChangeModelType = (type: IModelType) => { modelWraperShow.value = false if (type === modelType.value) return if (type === 'evaluation') { RuntimeUtils.changeSpeed(detailState.activeDetail?.originalSpeed, false) // 评测模式 startEvaluat() } else { const speeds = store.get('speeds') || {} const search = useOriginSearch() const speed = speeds[search.id as any] // 还原速度 if (speed) { RuntimeUtils.changeSpeed(speeds[search.id as any]) } } nextTick(() => { modelType.value = type }) } export default defineComponent({ name: 'Colexiu-Buttons', directives: { animate }, props: { onSetMusicScoreType: { type: Function, default: (n: any) => {}, }, }, emits: ['setMusicScoreType'], setup(props, { emit }) { const search = useOriginSearch() const route = { query: search } const [wiredStatus] = useWiredHeadsetCheck() const speedRef = ref() const [show] = useMenu() const camera = ref(false) //根据路由传参设置模式 const useRouteSetModelType = () => { if (route.query.modelType) { onChangeModelType(route.query.modelType as IModelType) } } onMounted(() => { useRouteSetModelType() }) // 固定调 const musicTypeShow = ref(false) const musicAction = ref('') const onSelect = (action: any) => { musicAction.value = action.text confirmShow.value = true } const hanldeSelect = () => { if (musicAction.value === '五线谱') { // if (SettingState.sett.type == 'staff') return SettingState.sett.type = 'staff' } else if (musicAction.value === '简谱') { // if (SettingState.sett.type === 'jianpu' && !SettingState.sett.keySignature) return SettingState.sett.type = 'jianpu' SettingState.sett.keySignature = false } else if (musicAction.value === '固定调') { // if (SettingState.sett.type === 'jianpu' && SettingState.sett.keySignature) return SettingState.sett.type = 'jianpu' SettingState.sett.keySignature = true } } const musicType = (type: string) => { if (type === 'staff') { return SettingState.sett.type === type } else if (type === 'shoudiao') { return SettingState.sett.type === 'jianpu' && !SettingState.sett.keySignature } else if (type === 'guding') { return SettingState.sett.type === 'jianpu' && SettingState.sett.keySignature } } return () => { const changeModeIsDisabled = (detailState.activeDetail?.isAppPlay ? detailState.activeDetail?.midiUrl === '' : runtime.isFirstPlay || runtime.audiosInstance?.length == 1) || runtime.evaluatingStatus || (detailState.activeDetail?.isAppPlay && detailState.midiPlayIniting) return (
{!route.query?.modelType && ( )}
{detailState.activeDetail?.musicSheetName}
{search.albumName &&
{search.albumName}
}
{wiredStatus.value && !evaluatingRef.value?.connentLoading && !startButtonShow.value && ( )} {followRef?.value?.data.start && ( )}
{/* route.query?.modelType 就不显示模式按钮 */} {!route.query?.modelType && modelType.value !== 'init' && !detailState.frozenMode && ( )} {modelType.value === 'evaluation' && ( <> (
), }} > {
off
} {SettingState.sett.camera && (
{SettingState.sett.opacity}
, }} >
)}
{!runtime.evaluatingStatus ? ( ) : ( )}
)} {modelType.value === 'practice' && ( <> )} {['practice', 'evaluation'].includes(modelType.value) && ( (runtime.speedShow = show)} vSlots={{ reference: () => ( ), }} > (runtime.speed = speed)} changed={RuntimeUtils.changeSpeed} mode={runtime.mode} changeMode={RuntimeUtils.changeMode} lib={{ speed: runtime.speed }} class={styles.speed} /> )} {detailState.activeDetail?.notation ? ( { if ( runtime.playState === 'play' || (runtime.evaluatingStatus && !startButtonShow.value) || followRef.value?.data.start ) { } else { musicTypeShow.value = val } }} > {{ reference: () => ( ), default: () => ( <> ), }} ) : null} {detailState.initRendered && ( <> )} {modelType.value === 'follow' && ( <> )}
{/* {!route.query?.modelType && modelType.value !== 'evaluation' && (
)}
*/} {detailState.initRendered && !detailState.frozenMode && ( )} , footer: () => (
(confirmShow.value = false)} /> { hanldeSelect() useReload() }} />
), }} v-model:show={confirmShow.value} message={'设置成功,是否立即重新加载?'} />
) } }, })