Просмотр исходного кода

feat: 优化延迟检测endTune流程

TIANYONG 1 год назад
Родитель
Сommit
c9d657e415

+ 24 - 0
src/page-instrument/evaluat-model/delay-check/index.module.less

@@ -236,4 +236,28 @@
     100% {
         opacity: 1;
     }
+}
+
+.tipBox {
+    position: fixed;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%,-50%);
+    z-index: 999;
+    background: #fff;
+    border-radius: 20px;
+    font-size: 12px;
+    .tipContent {
+        padding: 20px 20px 0;
+    }
+    .tipBtn {
+        border-radius: 20px;
+        background-color: var(--van-primary-color);
+        color: #fff;
+        width: 100px;
+        margin: 20px auto;
+        text-align: center;
+        line-height: 30px;
+        cursor: pointer;
+    }
 }

+ 48 - 5
src/page-instrument/evaluat-model/delay-check/index.tsx

@@ -48,6 +48,9 @@ export default defineComponent({
 			stopTimer: null as any,
 			volumeTimer: null as any,
 			earPhoneType: "" as "" | "有线耳机" | "蓝牙耳机",
+			startAbnormalTimer: null as any, // 发送startTune后,超过10秒没有收到sendResult回调,处理这类异常的定时器
+			startTuneResult: false, // 发送startTune后,能否收到正常的result回调
+			abnormalPopShow: false, // 异常弹窗
 		});
 		/** 获取耳机状态 */
 		const getEarphoneState = async () => {
@@ -91,6 +94,12 @@ export default defineComponent({
 						toggleTune("start");
 					}, 100);
 				}
+				// startTune效音通过返回后,调用endTune
+				if (header?.commond === "result") {
+					clearTimeout(data.startAbnormalTimer);
+					data.startTuneResult = true
+					toggleTune("stop");
+				}
 			}
 		};
 		onMounted(() => {
@@ -111,7 +120,7 @@ export default defineComponent({
 						data.count = 0;
 						clearTimeout(data.startTimer);
 						clearTimeout(data.stopTimer);
-						toggleTune("stop");
+						// toggleTune("stop");
 					}
 					data.step = 3;
 				}
@@ -136,16 +145,42 @@ export default defineComponent({
 
 		const toggleTune = async (state: "start" | "stop" | "finishTune") => {
 			if (state === "start") {
-				api_toggleTune("start", data.count);
-				data.stopTimer = setTimeout(() => {
-					api_toggleTune("stop");
-				}, 2000);
+				const res = await api_toggleTune("start", data.count);
+				// 用户没有授权,需要重置状态
+				if (res?.content?.reson) {
+					data.step = 2
+					data.checkStatus = 'init'
+					data.count = 0
+				} else {
+					// data.stopTimer = setTimeout(() => {
+					// 	api_toggleTune("stop");
+					// }, 2000);
+					data.startAbnormalTimer = setTimeout(() => {
+						/** startTune发出后,超过10秒没有收到回调,异常处理 */
+						if (!data.startTuneResult) {
+							api_toggleTune("stop");
+							// 给出异常提示,再来一次
+							data.abnormalPopShow = true
+						}
+					}, 10000);
+				}
 			} else if (state === "finishTune") {
 				data.checkStatus = "finish";
 				data.step = 6;
 				api_toggleTune("finishTune");
+			} else if (state === "stop") {
+				api_toggleTune("stop");
 			}
 		};
+
+		const resetCheck = () => {
+			clearTimeout(data.startAbnormalTimer);
+			data.abnormalPopShow = false
+			data.step = 2
+			data.checkStatus = 'init'
+			data.count = 0
+		}
+
 		return () => (
 			<Popup
 				teleport="body"
@@ -160,6 +195,14 @@ export default defineComponent({
 						clearTimeout(startTuneTimer)
 						emit("back")
 					}} />
+					{/* 异常提示弹窗 */}
+					{
+						data.abnormalPopShow && 
+						<div class={styles.tipBox}>
+							<div class={styles.tipContent}>检测失败,请确保设备麦克风、扬声器正常,重新开始检测</div>
+							<div class={styles.tipBtn} onClick={resetCheck}>再来一次</div>
+						</div>
+					}
 					<div class={[styles.item, data.step !== 7 && styles.show]}>
 						<Vue3Lottie animationData={bg}></Vue3Lottie>
 					</div>