diff --git a/.local.config.js b/.local.config.js index 28cf028..6386cb0 100644 --- a/.local.config.js +++ b/.local.config.js @@ -38,6 +38,10 @@ const localDevConfig = ({ uniacid: 1, domain: 'https://test.aigc-quickapp.com', }, + 'local-2': { // 测试平台 + uniacid: 2, + domain: 'http://localhost:8050/', + }, })['2811']; // 选择要使用的环境配置 export default localDevConfig; \ No newline at end of file diff --git a/common/js/uniapp.utils.js b/common/js/uniapp.utils.js index e450d28..2034bd9 100644 --- a/common/js/uniapp.utils.js +++ b/common/js/uniapp.utils.js @@ -6,13 +6,23 @@ /** * 显示错误信息 * @param {Exception} err + * @param {Boolean} useModal */ -const showError = (err) => { - uni.showToast({ - title: err?.message || err?.errMsg || err?.toString(), - icon: 'none', - duration: 2000 - }); +const showError = (err, useModal = false) => { + const content = err?.message || err?.errMsg || err?.toString(); + if (!useModal) { + uni.showToast({ + title: content, + icon: 'none', + duration: 3000 + }); + } else { + uni.showModal({ + title: '错误提示', + content, + showCancel: false, + }) + } } /** @@ -33,43 +43,92 @@ export const makePhoneCall = (mobile) => { } /** - * 拷贝文本 + * 拷贝文本(返回 Promise) * @param {*} text * @param {*} options + * @returns {Promise} 返回 Promise,成功时 resolve,失败时 reject */ -export const copyText = (text, { copySuccess = '', copyFailed = '' } = {}) => { - try { - console.log('copyText'); - uni.setClipboardData({ - data: `${text}`, - success: () => { - console.error('复制成功'); - try { - uni.showToast({ - title: copySuccess, - icon: 'success', - duration: 2000 - }); - } catch (e) { - showError(e); +export const copyTextAsync = (text, { copySuccess = '', copyFailed = '' } = {}) => { + return new Promise((resolve, reject) => { + // 输入验证 + if (!text && text !== '') { + const error = new Error('复制文本不能为空'); + showError(error); + reject(error); + return; + } + + // 超时监测 + const timeoutId = setTimeout(() => { + let error = new Error('复制操作长时间无响应,请检查相关权限及配置是否正确'); + // #ifdef MP-WEIXIN + error = new Error([ + '复制操作长时间无响应!', + '原因:', + '1.微信平台->用户隐私保护指引->"剪贴板"功能未添加或审核未通过;', + '2.微信平台对剪贴板API调用频率有限制' + ].join('\r\n')); + // #endif + showError(error, true); + reject(error); + }, 5000); + + try { + uni.setClipboardData({ + data: `${text}`, + success: (res) => { + clearTimeout(timeoutId); + + try { + if (copySuccess) { + uni.showToast({ + title: copySuccess, + icon: 'success', + duration: 2000 + }); + } + } catch (e) { + showError(e); + } + + resolve(res); + }, + fail: (err) => { + clearTimeout(timeoutId); + try { + uni.showToast({ + title: err.message || err.errMsg || copyFailed || '复制失败', + icon: 'none', + duration: 2000 + }); + } catch (e) { + showError(e); + } + reject(err); } - }, - fail: (err) => { - console.error('复制失败:', err); - try { - uni.showToast({ - title: err.message || err.errMsg || copyFailed, - icon: 'none', - duration: 2000 - }); - } catch (e) { - showError(e); - } - } + }); + } catch (err) { + clearTimeout(timeoutId); + showError(err); + reject(err); + } + }); +} + +/** + * 拷贝文本(回调形式,兼容旧代码) + * @param {*} text + * @param {*} options + * @param {Function} callback 回调函数,接收 (success, error) 参数 + */ +export const copyText = (text, options = {}, callback) => { + copyTextAsync(text, options) + .then(res => { + if (callback) callback(true, null); + }) + .catch(err => { + if (callback) callback(false, err); }); - } catch (err) { - showError(err); - } } /**