116 lines
3.4 KiB
TypeScript
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
|
|
}
|
|
|