Files
tra-app/src/components/touch-btn/touch-btn.ts
T
2026-03-18 17:11:08 +08:00

116 lines
3.4 KiB
TypeScript

import { ErrorMessageEnum, ShowErrorTipOptions } from './touch-btn.types';
import { get_base_url } from '@/api/request.js';
import { getPhoneEnvBool } from '@/common/common.js';
const IsAndEnv = getPhoneEnvBool('AND')
const url = '/traapp/asrAiModelSocket/open';
const _baseUrl = get_base_url(url).split('http').join('ws');
export const wsUrl = _baseUrl + url;
// export const wsUrl = 'ws://10.10.10.4:8000/ws/asr';
const windowInfo = uni.getWindowInfo();
// 安全区域信息
const safeArea = windowInfo.safeArea;
// 按钮高度
const btnHeight = (windowInfo.screenWidth / 750) * 234;
// 按钮的顶部边界
export const bottomAreaTopBoundary = safeArea.bottom - btnHeight;
// 屏幕横向分割线
export const horizontalSplitX = safeArea.right / 2;
/**
* 封装WebSocket连接为Promise
* @param {string} wsUrl - WebSocket连接地址
* @returns {Promise<UniApp.SocketTask>} 成功时返回WS实例,失败时reject错误信息
*/
export const initWebSocket = (wsUrl : string) : Promise<UniApp.SocketTask> => {
console.log('wsUrl', wsUrl);
return new Promise((resolve, reject) => {
// 1. 创建WS连接
const ws = uni.connectSocket({
url: wsUrl,
fail: (err) => {
console.error('WS连接创建失败:', err);
// 连接创建失败直接reject
reject(new Error(`WS连接创建失败:${err.errMsg || err.message}`));
},
success: () => {
}
});
// 2. 监听连接成功(核心:连接成功时resolve,返回WS实例)
const onOpenHandler = (res) => {
resolve(ws);
};
// 4. 监听连接错误(出错时reject)
const onErrorHandler = (err) => {
console.log('WS连接错误', err, wsUrl);
// reject返回错误信息
reject(new Error(`WS连接错误:${err.errMsg || err.message}`));
};
// 5. 监听连接关闭(如果在open前关闭,也reject)
const onCloseHandler = (err) => {
console.log('WS连接已关闭', err);
// 连接未成功就关闭,执行reject
reject(new Error(`WS连接已关闭:${err.errMsg || err.message}`));
};
// 绑定监听事件
ws.onOpen(onOpenHandler);
ws.onError(onErrorHandler);
ws.onClose(onCloseHandler);
});
};
/**
* 错误提示统一处理函数(极简版)
* @param errorCode 错误码(枚举类型,直接对应提示文本)
* @param options 可选参数:延迟显示时间
* @returns 固定返回false(保持原有返回值类型)
*/
export function showErrorTip(
errorMsg : ErrorMessageEnum | string,
options : ShowErrorTipOptions = {}
) : boolean {
// 解构可选参数,设置默认延迟时间为200ms
const { delayTime = 200 } = options;
// 延迟显示对应的错误提示
setTimeout(() => {
uni.showToast({
title: errorMsg, // 直接使用枚举值作为提示文本
icon: 'none'
});
}, delayTime); // 使用传入的延迟时间(或默认200ms)
return false;
}
/**
* 跨平台震动反馈封装(适配安卓/iOS)轻震
* @returns {Promise<boolean>} 是否成功触发震动
*/
export const vibrateLight = () : void => {
// #ifdef APP-PLUS
try {
if (IsAndEnv) {
uni.vibrateShort({
success: function () {
}
});
} else {
let UIImpactFeedbackGenerator = plus.ios.importClass(
'UIImpactFeedbackGenerator'
)
let impact = new UIImpactFeedbackGenerator()
impact.prepare()
impact.init(1)
impact.impactOccurred()
}
} catch (error) {
console.error('震动功能执行异常:', error);
}
// #endif
}