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} 成功时返回WS实例,失败时reject错误信息 */ export const initWebSocket = (wsUrl : string) : Promise => { 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} 是否成功触发震动 */ 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 }