Files
tra-app/src/components/touch-btn/touch-btn.ts
T

120 lines
3.6 KiB
TypeScript

import { ErrorCode, ShowErrorTipOptions } from './touch-btn.types';
import { get_base_url } from '@/api/request.js';
import { getToken, getPhoneEnvBool } from '@/common/common.js';
const IsAndEnv = getPhoneEnvBool('AND')
// const url = '/trapractice/voiceCallSocket/voiceCall'
// const url = '/traapp/voiceTransSocket/open';
// const url = '/traapp/asrAiModelSocket/open';
const url = '/traapp/asrAiModelSocket/open';
const _baseUrl = get_base_url(url).split('http').join('ws');
export const wsUrl = _baseUrl + url + '?summary=' + getToken();
// export const wsUrl = 'wss://ty_chat_test.home.tymas.cn:8000/ws/audio';
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(
errorCode : ErrorCode,
options : ShowErrorTipOptions = {}
) : boolean {
// 解构可选参数,设置默认延迟时间为200ms
const { delayTime = 200 } = options;
// 延迟显示对应的错误提示
setTimeout(() => {
uni.showToast({
title: errorCode, // 直接使用枚举值作为提示文本
icon: 'none'
});
}, delayTime); // 使用传入的延迟时间(或默认200ms)
return false;
}
/**
* 跨平台震动反馈封装(适配安卓/iOS)轻震
* @returns {Promise<boolean>} 是否成功触发震动
*/
export const vibrateLight = () : void => {
// #ifdef APP-PLUS
try {
if (IsAndEnv) {
uni.vibrateShort({
success: function () {
console.log('success');
}
});
} else {
let UIImpactFeedbackGenerator = plus.ios.importClass(
'UIImpactFeedbackGenerator'
)
let impact = new UIImpactFeedbackGenerator()
impact.prepare()
impact.init(1)
impact.impactOccurred()
}
} catch (error) {
console.error('震动功能执行异常:', error);
}
// #endif
}