modeView.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { defineComponent, onMounted, watch, reactive, ref, nextTick } from "vue";
  2. import styles from "./index.module.less";
  3. import backImg from "./image/back.png";
  4. import nameImg from "./image/zt.png";
  5. import lxMode from "./image/lxMode.json";
  6. import glMode from "./image/glMode.json";
  7. import pcMode from "./image/pcMode.json";
  8. import { headTopData } from "./index";
  9. import TheVip from "../custom-plugins/the-vip";
  10. import { getQuery } from "/src/utils/queryString";
  11. import { storeData } from "/src/store";
  12. import state from "/src/state";
  13. import { studentQueryUserInfo } from "../api";
  14. import { usePageVisibility } from "@vant/use";
  15. import { Vue3Lottie } from "vue3-lottie";
  16. import { popImgs, hanldeConfirmPop, hanldeClosePop, evaluatingData } from "/src/view/evaluating"
  17. import { Popup } from "vant";
  18. import AbnormalPop from "/src/view/abnormal-pop";
  19. import { smoothAnimationState } from "../view-detail/smoothAnimation";
  20. export default defineComponent({
  21. name: "modeView",
  22. setup() {
  23. const query = getQuery();
  24. const data = reactive({
  25. showPC: false,
  26. showStudent: false,
  27. showVip: false,
  28. });
  29. const modeImgDom1 = ref();
  30. const modeImgDom2 = ref();
  31. const modeImgDom3 = ref();
  32. const openGuid = () => {
  33. // 加载后 判断 端口号 加载对应的引导
  34. if (storeData.platformType !== "STUDENT" || storeData.user.clientType !== "STUDENT") {
  35. // PC
  36. data.showPC = true;
  37. } else {
  38. // 从课堂乐器学生端课件预览默认不显示会员
  39. if (storeData.user.vipMember || state.paymentType === "FREE" || query.showCourseMember === "true") {
  40. // 学生端
  41. data.showStudent = true;
  42. } else {
  43. // vip
  44. data.showVip = true;
  45. state.isVip = true;
  46. }
  47. }
  48. };
  49. const getUserInfo = async () => {
  50. const res = await studentQueryUserInfo();
  51. const student = res?.data || {};
  52. storeData.user.vipMember = student.vipMember;
  53. // console.log("🚀 ~ student:", student);
  54. if (storeData.user.vipMember) {
  55. data.showVip = false;
  56. state.isVip = false;
  57. openGuid();
  58. }
  59. };
  60. const pageVisible = usePageVisibility();
  61. watch(
  62. () => pageVisible.value,
  63. (val) => {
  64. if (val === "visible") {
  65. if (storeData.user.vipMember) return;
  66. console.log("页面显示");
  67. getUserInfo();
  68. }
  69. }
  70. );
  71. watch(
  72. () => headTopData.modeType,
  73. (value, oldValue) => {
  74. // headTopData.modeType 值 刚开始是 "" 所以 第一次切换时候不触发播放动画
  75. if (!oldValue) return;
  76. nextTick(() => {
  77. if (value === "show") {
  78. modeImgDom1.value?.pause();
  79. modeImgDom2.value?.pause();
  80. modeImgDom3.value?.pause();
  81. } else if (value === "init") {
  82. modeImgDom1.value?.play();
  83. modeImgDom2.value?.play();
  84. modeImgDom3.value?.play();
  85. }
  86. });
  87. }
  88. );
  89. onMounted(() => {
  90. openGuid();
  91. });
  92. watch(
  93. () => evaluatingData.socketErrorStatus,
  94. () => {
  95. if (evaluatingData.socketErrorStatus === 2) {
  96. setTimeout(() => {
  97. evaluatingData.socketErrorPop = false;
  98. }, 1000);
  99. }
  100. }
  101. );
  102. return () => (
  103. <div class={[styles.modeView, headTopData.modeType !== "init" && styles.hidden]}>
  104. <img
  105. src={backImg}
  106. class={styles.back}
  107. onClick={() => {
  108. smoothAnimationState.isShow.value = state.melodyLine;
  109. // 返回的时候 跳转到之前记录的模式
  110. if(headTopData.oldModeType !== "practise"){
  111. headTopData.handleChangeModeType(headTopData.oldModeType)
  112. }
  113. headTopData.modeType = "show";
  114. }}
  115. />
  116. <img src={nameImg} class={styles.name} />
  117. <div class={[styles.modeBox, ((!state.isPercussion && !state.enableEvaluation) || (state.isPercussion && state.enableEvaluation) || (state.isPercussion && !state.enableEvaluation)) && styles.twoModeBox]}>
  118. <Vue3Lottie ref={modeImgDom1} class={styles.modeImg} animationData={lxMode} autoPlay={false} loop={true} onClick={() => {
  119. smoothAnimationState.isShow.value = state.melodyLine;
  120. headTopData.handleChangeModeType("practise")
  121. } }></Vue3Lottie>
  122. {!state.isPercussion && <Vue3Lottie ref={modeImgDom2} class={styles.modeImg} animationData={glMode} autoPlay={false} loop={true} onClick={() => headTopData.handleChangeModeType("follow")}></Vue3Lottie>}
  123. {state.enableEvaluation && <Vue3Lottie ref={modeImgDom3} class={styles.modeImg} animationData={pcMode} autoPlay={false} loop={true} onClick={() => headTopData.handleChangeModeType("evaluating")}></Vue3Lottie>}
  124. </div>
  125. {data.showVip && <TheVip />}
  126. {/** 延迟检测中途,socket出错,网络提示弹窗 */}
  127. {/* {
  128. state.modeType !== 'evaluating' &&
  129. <div>
  130. <Popup teleport="body" closeOnClickOverlay={false} class={["popup-custom", "van-scale", evaluatingData.socketErrorStatus === 2 && styles.socketErrorStatus]} transition="van-scale" v-model:show={evaluatingData.socketErrorPop} overlay-style={evaluatingData.socketErrorStatus === 2?{ background: "initial" }:{}}>
  131. <AbnormalPop onConfirm={hanldeConfirmPop} onClose={hanldeClosePop} />
  132. </Popup>
  133. </div>
  134. } */}
  135. </div>
  136. );
  137. },
  138. });