microApi.js

import { Loading } from './class/Loading.js';
import { Throttle } from './class/Throttle.js';
import { decode, encode } from './encrypt/base64.js';
import { isJson } from './is.js';
import { safeData, getEnv, sleep, setUrlParams, getInfo, getUrlParamObj } from './base.js';
import { dataURLtoBlob, blobToFile } from './file.js';

/**
 * @module
 * @author linjielinlin 993353454@qq.com
 * @date 2022-05-22 00:41:33
 * @description 微信小程序/uniapp/taro公共函数
 */
/* eslint-disable no-constant-condition,no-undef */
let app = {};
let appConfig = {
    localEncrypt: false,
};
let isH5 = false;
// #ifdef  H5
isH5 = true;
// #endif
let ljCloud = {};
if (typeof uni !== 'undefined') {
    app = uni;
}
else if (typeof taro !== 'undefined') {
    app = taro;
}
else if (typeof wx !== 'undefined') {
    app = wx;
}
// 初始化loading
const L = new Loading(() => {
    app.showLoading({
        mask: true,
    });
}, app.hideLoading);
// 函数节流
const throttle = new Throttle();
/**
 * @description 默认拦截函数obj
 */
const interceptors = {
    request(argData) {
        L.loading(1);
        return argData;
    },
    async response(argData) {
        L.loading();
        return argData;
    },
};
/**
 * @description 初始化配置(uniCloud/request拦截)
 * @function
 * @param {any} argConfig
 * @param {boolean} argConfig.localEncrypt 本地缓存是否加密
 */
const init = (argConfig) => {
    console.debug('argConfig', argConfig);
    Object.assign(appConfig, argConfig);
    // 初始化uniCloud
    if (typeof uniCloud !== 'undefined' && appConfig?.uniCloud?.clientSecret) {
        ljCloud = uniCloud.init(appConfig.uniCloud);
        console.debug('ljCloud:', ljCloud);
    }
    // 初始化拦截器
    if (argConfig?.requestCb && argConfig?.responseCb) {
        setRequest(argConfig?.requestCb, argConfig?.responseCb);
    }
};
/**
 * @description 获取unicloud DB,返回实例
 * @function
 */
const getDb = () => {
    if (ljCloud.database) {
        return ljCloud.database();
    }
    else {
        console.debug('ljCloud.database() is undefined');
        return {};
    }
};
/**
 * @description 显示loading
 * @function
 */
const showLoading = () => {
    L.loading(1);
};
/**
 * @description 隐藏loading
 * @function
 */
const hideLoading = () => {
    L.loading();
};
/**
 * @description 修改设置拦截函数
 * @function
 * @param {function} argRequest 请求拦截
 * @param {function} argResponse 响应拦截
 */
const setRequest = (argRequest, argResponse) => {
    if (typeof argRequest === 'function') {
        interceptors.request = (argData) => {
            L.loading(1);
            return argRequest(argData);
        };
    }
    if (typeof argResponse === 'function') {
        interceptors.response = (argData) => {
            L.loading();
            return argResponse(argData);
        };
    }
};
/**
 * @description 使用ljapi
 * @function
 * @param {AnyObject} argOption 传入参数
 * @returns {argOption} 返回修改后的参数
 */
const ljApiFn = (argOption) => {
    argOption.params = Object.assign({
        path: argOption.url,
        data: safeData(argOption, 'params.data', {}),
    }, JSON.parse(getEnv('VUE_APP_LJAPIC')));
    argOption.params.type = getEnv('VUE_APP_LJAPITYPE');
    argOption.url = getEnv('VUE_APP_LJAPIURL');
    // argOption.method = 'GET'
    argOption.method = 'POST';
    return argOption;
};
/**
 * @description 封装小程序request
 * @function
 * @param {AnyObject} argOption http配置
 * @param {Bool} argIsMock 是否使用mock
 * @returns {promise}
 */
const request = async (argOption, argIsMock = false) => {
    let apiUrl = argOption.url;
    if (getEnv('VUE_APP_LJAPITYPE') === 'get' || argIsMock) {
        argOption = ljApiFn(argOption);
    }
    else {
        argOption = (await interceptors.request(argOption));
    }
    return new Promise((resolve, reject) => {
        const config = {
            url: argOption.url,
            method: argOption.method || 'GET',
            data: argOption.params,
            success(res = { data: {} }) {
                console.debug('response:', res);
                if (!argIsMock && getEnv('VUE_APP_LJAPITYPE') === 'set') {
                    argOption.url = apiUrl;
                    argOption.params.data = JSON.stringify(res.data);
                    request(argOption, 1);
                }
                res.config = argOption.config || {};
                return resolve(interceptors.response(res));
            },
            fail(err) {
                return reject(interceptors.response(err));
            },
        };
        Object.assign(config, argOption.config);
        app.request(config);
    });
};
/**
 * @description 图片上传 单图/多图
 * @function
 * @param {object} argOption 参数配置
 * @returns {promise} 上传回调
 */
const uploadImg = async (argOption) => {
    var error, filePath;
    argOption.config = argOption.config || {};
    var data = {
        url: argOption.params.url,
        filePath: '',
        name: argOption.params.name || 'file',
        formData: null,
        header: argOption.config.header || {},
    };
    filePath = argOption.params.filePath;
    const uploadOne = async (argPath) => {
        data.filePath = argPath;
        let res = await P('uploadFile', data).catch((err) => {
            error = err;
        });
        // #ifdef  H5
        URL.revokeObjectURL(argPath);
        // #endif
        if (res) {
            res.data = JSON.parse(res.data);
            return interceptors.response(res);
        }
        else {
            return Promise.reject(error);
        }
    };
    delete argOption.params.url;
    delete argOption.params.filePath;
    delete argOption.params.name;
    delete argOption.config.header['content-type'];
    argOption = interceptors.request(argOption);
    data.formData = argOption.params;
    data.header = argOption.config.header || {};
    // 单张上传
    if (typeof filePath === 'string') {
        return uploadOne(filePath);
    }
    else {
        const temUploadFn = filePath.map(uploadOne);
        let res = await Promise.all(temUploadFn).catch((err) => {
            error = err;
        });
        if (res) {
            return res;
        }
        else {
            return Promise.reject(error);
        }
    }
};
/**
 * @function
 * @description 请求云函数
 * @param {object} argOption
 * @param {string} argOption.name 云函数名
 * @param {object} argOption.params 参数
 * @param {object} argOption.config 请求配置
 * }
 */
const requestCloud = async (argOption) => {
    argOption = interceptors.request(argOption);
    let e;
    let res = await ljCloud
        .callFunction({
        name: argOption.name,
        data: argOption.params,
    })
        .catch((err) => {
        e = err;
    });
    if (!res) {
        res = e;
    }
    res.config = argOption.config || {};
    return interceptors.response(res);
};
/**
 * @function
 * @description 检查是否有更新
 */
const checkUpdate = () => {
    console.debug('checking update');
    if (!safeData(app, 'getUpdateManager')) {
        return;
    }
    const updateManager = app.getUpdateManager();
    updateManager.onUpdateReady(function () {
        app.showModal({
            title: '更新提示',
            content: '新版本已经准备好,是否重启应用?',
            success: function (res) {
                if (res.confirm) {
                    // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
                    updateManager.applyUpdate();
                }
            },
        });
    });
};
/**
 * @function
 * @description 检查用户授权状态,未授权弹出授权,(userInfo除外),将拿到的权限放在authSetting 中
 * @param {string} argSet 要检查的权限,userInfo时:已授权会返回userInfo数据
 * @returns {promise}
 */
const checkSetting = (argSet) => {
    app.removeStorage({
        key: 'authSetting',
    });
    return new Promise(function (resolve, reject) {
        app.getSetting({
            success(res) {
                app.setStorageSync('authSetting', res.authSetting);
                if (!res.authSetting['scope.' + argSet]) {
                    if (argSet === 'userInfo') {
                        return reject(new Error('未授权用户信息'));
                    }
                    app.authorize({
                        scope: 'scope.' + argSet,
                        success(rs) {
                            return resolve(rs);
                        },
                        fail(err) {
                            return reject(err);
                        },
                    });
                }
                else {
                    if (argSet === 'userInfo') {
                        app.getUserInfo({
                            success: (res) => {
                                return resolve(res);
                            },
                            fail: (err) => {
                                return reject(err);
                            },
                        });
                    }
                    else {
                        return resolve(res);
                    }
                }
            },
            fail(err) {
                return reject(err);
            },
        });
    });
};
/**
 * @description 获取地理位置 (类型,)
 * @function
 * @param {string} argType 类型
 * @param {boolean} argAltitude 是否高精度
 * @returns {promise}
 */
const getLocation = (argType = 'gcj02', argAltitude = false) => {
    const location = () => {
        return new Promise(function (resolve, reject) {
            app.getLocation({
                altitude: argAltitude,
                type: argType,
                success: (res) => {
                    return resolve(res);
                },
                fail: (err) => {
                    return reject(err);
                },
            });
        });
    };
    const re = async () => {
        try {
            await checkSetting('userLocation');
            const re = await location();
            return re;
        }
        catch (err) {
            if (typeof err === 'object' && err.errMsg) {
                app.show({
                    title: '您已拒绝地理位置授权,可以在设置中重新打开',
                    icon: 'none',
                });
            }
            return Promise.reject(err);
        }
    };
    return re();
};
/**
 * @description 回到顶部/某个位置
 * @function
 * @param {number} scrollTop 滚动距离
 * @param {number} duration 时间
 * @param {any} ...arg 其他参数selector/offsetTop/success/fail/complete
 * @returns {promise}
 */
const scrollTop = (scrollTop = 0, duration = 0, ...arg) => {
    return P('pageScrollTo', {
        scrollTop: scrollTop,
        duration: duration,
        ...arg,
    });
};
/**
 * @description toast默认为文字提示,默认推迟320ms显示
 * @function
 * @param {string} argTitle title
 * @param {object} argOption 配置
 * argOption.icon:'图标',
 * argOption.delay: '延时显示ms'
 * argOption.duration:"显示时间"
 * @returns {promise}
 */
const toast = async (argTitle, argOption = {
    icon: 'none',
    delay: 0,
    duration: 1500,
}) => {
    argOption.title = argTitle;
    if (argOption.delay) {
        await sleep(argOption.delay);
    }
    hideLoading();
    return P('showToast', argOption);
};
/**
 * @function
 * @description 设置标题
 * @param  {string} argTitle 标题
 */
const setTitle = (argTitle) => {
    app.setNavigationBarTitle &&
        app.setNavigationBarTitle({
            title: argTitle,
        });
};
/**
 * @function
 * @description uniapp跳到特定页面
 * @param  {string} argPage 标题
 * @param  {object} argParams url参数
 * @param  {string|number} argType 跳转类型 switchTab reload redirectTo reLaunch navigateTo
 * @param {boolean} argForce 是否取消节流非H5生效
 */
const toPage = (argPage = '', argParams = {}, argType = '', argForce = false) => {
    const toPageFn = () => {
        console.debug('toPage params:', argPage, argParams, argType, argForce);
        // 后退处理
        let pages = (typeof getCurrentPages !== 'undefined' && getCurrentPages()) || [];
        if (!argPage || argPage === 'back') {
            if (isH5) {
                window.history.go(+('-' + (argType || 1)));
            }
            else {
                // -1时返回首页
                if (pages.length > 1 && argType !== '-1') {
                    app.navigateBack({
                        delta: +argType || 1,
                    });
                }
                else {
                    app.reLaunch({
                        url: '/pages/index/index' + setUrlParams(argParams),
                    });
                }
            }
            return;
        }
        // 每次进入首页都重载
        if (argPage === 'index' || argPage === '/pages/index/index') {
            app.reLaunch({
                url: '/pages/' + argPage + '/index' + setUrlParams(argParams),
            });
            return;
        }
        let temUrl = '/pages/' + argPage + '/index' + setUrlParams(argParams);
        // 匹配绝对路径和url
        if (argPage[0] === '/' || /http:\/\/|https:\/\//.test(argPage)) {
            temUrl = argPage + setUrlParams(argParams);
        }
        if (isH5 && /http:\/\/|https:\/\//.test(argPage)) {
            temUrl = argPage + setUrlParams(argParams);
            window.location.replace(temUrl);
            return;
        }
        switch (argType) {
            case 'switchTab':
                app.switchTab({
                    url: temUrl,
                });
                break;
            case 'reload':
                app.reLaunch({
                    url: temUrl,
                });
                break;
            case 'redirectTo':
                if (isH5) {
                    window.location.replace('#' + temUrl);
                }
                else {
                    app.redirectTo({
                        url: temUrl,
                    });
                }
                break;
            case 'reLaunch':
                app.reLaunch({
                    url: temUrl,
                });
                break;
            default:
                // 超10层处理
                if (!isH5 && pages.length >= 10) {
                    app.redirectTo({
                        url: temUrl,
                    });
                    return;
                }
                app.navigateTo &&
                    app.navigateTo({
                        url: temUrl,
                    });
                break;
        }
    };
    if (isH5 || argForce) {
        toPageFn();
    }
    else {
        throttle.throttle(toPageFn);
    }
};
/**
 * @function
 * @description 获取当前页面数据obj
 * @returns {object}
 */
const getCurrentPage = () => {
    let pages = (typeof getCurrentPages !== 'undefined' && getCurrentPages()) || [];
    return pages[pages.length - 1] || {};
};
/**
 * @function
 * @description 获取当前页url
 * @param {boolean} argWithParams 是否附带参数
 * @returns {string}
 */
const getCurrentPageUrl = (argWithParams = true) => {
    let currentPage = getCurrentPage();
    let url = currentPage.route || '';
    let options = currentPage.options || {};
    if (argWithParams) {
        url += setUrlParams(options);
    }
    return url || '';
};
/**
 * @function
 * @description 获取微信登录code
 * @returns {promise}
 */
const login = () => {
    return new Promise(function (resolve, reject) {
        app.login({
            timeout: 5000,
            success: function (rs) {
                app.setStorageSync('code', rs.code);
                console.debug('micro login info:', rs);
                return resolve(rs);
            },
            fail: function (err) {
                toast('请检查网络');
                return reject(err);
            },
        });
    });
};
/**
 * @function
 * @description 获取用户信息
 * @param {object} argData 用户数据(点按钮授权时传入)
 * @returns {promise}
 */
async function getUserInfo(argData) {
    L.loading(1);
    const _login = await login().catch((err) => {
        console.error(err);
        L.loading();
    });
    const setUserInfo = (argData) => {
        L.loading();
        return argData;
    };
    if (argData) {
        if (argData.target) {
            argData.target.code = _login.code;
        }
        return setUserInfo(argData.target);
    }
    else {
        const _checkSetting = await checkSetting('userInfo').catch((err) => {
            console.error('unAuthor', err);
            L.loading();
        });
        _checkSetting.code = _login.code;
        return setUserInfo(_checkSetting);
    }
}
/**
 * @function
 * @description 下载图片到手机
 * @param {array} argImgList 图片url,数组或字符串
 * @param {boolean} argIsLocal 是否是本地临时文件路径或永久文件路径
 * @returns {promise} 出错时无promise
 */
const downloadImgs = async (argImgList, argIsLocal = false) => {
    try {
        let isAuth = true;
        let res = null;
        let imgList = [];
        if (argImgList && typeof argImgList === 'string') {
            imgList = [argImgList];
        }
        imgList = argImgList;
        if (!imgList.length) {
            console.error('参数有误!');
            return Promise.reject(false);
        }
        L.loading(1);
        await checkSetting('writePhotosAlbum').catch((err) => {
            console.error('writePhotosAlbum error:', err);
            isAuth = false;
            L.loading();
        });
        // 拒绝授权处理
        if (!isAuth) {
            res = await P('showModal', {
                title: '提示',
                content: '需要您授权保存相册',
                showCancel: false,
                async success() {
                    const res = await P('openSetting');
                    if (res.authSetting['scope.writePhotosAlbum']) {
                        app.showModal({
                            title: '提示',
                            content: '已获得权限,请重新操作!',
                            showCancel: false,
                        });
                        return true;
                    }
                    else {
                        app.showModal({
                            title: '提示',
                            content: '未获得权限,将无法保存到相册哦~',
                            showCancel: false,
                        });
                        return false;
                    }
                },
            });
        }
        for (const img of imgList) {
            let tempFilePath = img;
            if (!argIsLocal) {
                res = await P('downloadFile', {
                    url: img,
                });
                tempFilePath = res.tempFilePath;
            }
            let saveFail = false;
            await P('saveImageToPhotosAlbum', {
                filePath: tempFilePath,
            }).catch((err) => {
                saveFail = true;
                console.error('saveImageToPhotosAlbum error:', err);
            });
            if (saveFail) {
                L.loading();
                toast('保存到相册失败,请重试!');
                return Promise.reject(false);
            }
        }
        L.loading();
        toast('下载完成!');
        return Promise.resolve(true);
    }
    catch (e) {
        console.log(e);
        return Promise.reject(false);
    }
};
/**
 * @function
 * @description 上传图片,返回临时图片路径
 * @param {object} argOptions
 * argOptions.count: 9,最多可以选择的图片张数
 * argOptions.sizeType: ['original', 'compressed'], 所选的图片的尺寸
 * argOptions.sourceType: ['album', 'camera'] album ,从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
 * argOptions.disCompress: false 是否关闭图片压缩,默认开启
 * } 外加选择图片chooseImage配置
 * @param {number} argMb 超过多少M压缩,默认1M(仅支持jpg)
 * @param {number} argQuality 压缩质量默认80
 * @param {number} argMaxSize 图片最长边默认1920
 * @returns {promise} 返回临时图片路径[{tempFilePath:'临时路径',size: '不压缩时返回'}]
 */
const uploadImgs = async (argOptions = {
    // 最多可以选择的图片张数
    count: 9,
    // 所选的图片的尺寸
    sizeType: ['original', 'compressed'],
    // album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
    sourceType: ['album', 'camera'],
    // 是否关闭图片压缩,默认开启
    disCompress: false,
    // reType:'base64'
}, argMb = 1, argQuality = 90, argMaxSize = 1920) => {
    var maxSize = argMaxSize || 1920;
    let err = '';
    const res = await P('chooseImage', {
        count: argOptions.count || 9,
        sizeType: argOptions.sizeType || ['original', 'compressed'],
        sourceType: argOptions.sourceType || ['album', 'camera'],
    }).catch((error) => {
        err = error;
    });
    if (!res) {
        console.error('chooseImage error:', err);
        return Promise.reject(err);
    }
    console.debug('select files:', res);
    showLoading();
    // 按需压缩
    const tempFiles = res.tempFiles;
    // 压缩图片
    const compressImage = async (argData) => {
        if (argData.size > argMb * 1024 * 1024) {
            console.debug('compressImage params:', argData);
            if (!isH5 && !argOptions.disCompress) {
                return P('compressImage', {
                    src: argData.path,
                    quality: argQuality,
                });
            }
            const getBase64Image = async (argData) => {
                if (argData && !argData.img) {
                    return { path: null, file: null };
                }
                console.debug('canvas compress start');
                var canvas = document.createElement('canvas');
                var img = argData.img;
                let scaleRate;
                if (img.width > img.height && img.width > maxSize) {
                    scaleRate = img.width / maxSize;
                    img.width = maxSize;
                    img.height = img.height / scaleRate;
                }
                if (img.height > img.width && img.height > maxSize) {
                    scaleRate = img.height / maxSize;
                    img.height = maxSize;
                    img.width = img.width / scaleRate;
                }
                canvas.width = img.width;
                canvas.height = img.height;
                var ctx = canvas.getContext('2d');
                ctx && ctx.drawImage(img, 0, 0, img.width, img.height);
                let rate = argQuality / 100;
                // base64Url
                var base64Url = canvas.toDataURL('image/jpeg', rate);
                if (argOptions.reType === 'base64') {
                    return {
                        path: base64Url,
                        file: null,
                    };
                }
                else {
                    let blob = dataURLtoBlob(base64Url);
                    var file = blobToFile(blob, argData.name);
                    console.debug('old:', argData.size / 1024, 'new:', base64Url.length / 1024, 'fileSize:', file.size / 1024, file, typeof file);
                    return {
                        path: base64Url,
                        file: file,
                    };
                }
            };
            const loadImg = async (argData) => {
                return new Promise((resolve, reject) => {
                    var img = new Image();
                    img.src = argData.path;
                    img.onload = function () {
                        return resolve({
                            img,
                            name: argData.name || '',
                        });
                    };
                    img.onerror = function (error) {
                        return reject(error);
                    };
                });
            };
            let file = await getBase64Image(await loadImg(argData));
            if (safeData(file, 'file.size') > argMb * 1024 * 1024) {
                console.debug('二次压缩', file);
                // 控制质量
                argQuality = argQuality / 2;
                file = await getBase64Image(await loadImg(file));
            }
            return Promise.resolve({
                // 临时路径
                tempFilePath: file.path,
                file: file.file,
                fileName: argData.name || '',
                // 大小
                size: safeData(file, 'file.size', null),
            });
        }
        return Promise.resolve({
            tempFilePath: argData.path,
            size: argData.size,
            fileName: argData.name || '',
            file: argData,
        });
    };
    const tempFilePathsFn = tempFiles.map(compressImage);
    let tempFilePaths = [];
    tempFilePaths = await Promise.all(tempFilePathsFn).catch((error) => {
        console.error('compressImage error:', error);
        err = error;
    });
    hideLoading();
    if (!tempFilePaths) {
        return Promise.reject(err);
    }
    return Promise.resolve(tempFilePaths);
};
/**
 * @function
 * @description 检测浏览器状态,系统状态 *
 * @returns {object} {
 * ua: ua,
 * platform: 平台,
 * isMobile: 移动端,
 * isWin: winPC端,
 * isIphone: iphone,
 * isIpad: ipad,
 * isMac: mac,
 * isAppleMobile: 苹果移动端webview
 * isSafari: Safari浏览器,
 * isIos: Ios平台,
 * isAndroid: android平台,
 * isIE: 显示8 9 10, true为11以上
 * ...
 * }
 */
const getSystemInfo = () => {
    if (typeof app === 'object' && safeData(app, 'getSystemInfoSync')) {
        let info = app.getSystemInfoSync();
        let defInfo = getInfo();
        defInfo.platform = info.platform || defInfo.platform;
        info.iosVersion =
            info.isIos && info.system.match(/\d./) && info.system.match(/\d./)[0];
        return Object.assign(info, defInfo);
    }
    return getInfo();
};
/**
 * @function
 * @description 获取storage的值,默认将json转为obj
 * @param {string} argKey 要获取的key
 * @param {boolean} argNoJson true时不自动转换JSON字符串
 * @returns {promise} key对应的数据
 */
const getStorage = async (argKey, argNoJson = false) => {
    let res = await P('getStorage', {
        key: argKey,
    });
    if (appConfig.localEncrypt) {
        res = decode(res.data);
    }
    if (!res || !res.data) ;
    // 默认转义JSON字符串
    if (!argNoJson && isJson(res.data)) {
        res.data = JSON.parse(res.data);
    }
    return res.data || res || '';
};
/**
 * @function
 * @description 获取storage的值,默认将json转为obj
 * @param {string} argKey 要获取的key
 * @param {boolean} argNoJson true时不自动转换JSON字符串
 * @returns {any} key对应的数据
 */
const getStorageSync = (argKey, argNoJson = false) => {
    let data = app.getStorageSync(argKey);
    if (appConfig.localEncrypt) {
        data = decode(data);
    }
    // 默认转义JSON字符串
    if (!argNoJson && isJson(data)) {
        data = JSON.parse(data);
    }
    return data;
};
/**
 * @function
 * @description 退出登录或登录失效,清除本地数据
 * @param {string} argKey 要删除的key,不填为删除全部
 * @param {string} argExtraKey:额外保留的key如:'vuex,ticket'
 * @param {boolean} isForce 是否强制删除全部
 */
const clearStorageSync = async (argKey = '', argExtraKey = '', isForce = false) => {
    if (argKey) {
        app.removeStorageSync(argKey);
    }
    else if (isForce) {
        app.clearStorageSync();
    }
    else {
        let res = await P('getStorageInfo');
        res.keys.forEach((v) => {
            if (!isForce) {
                let extraKey = ',' + argExtraKey + ',';
                if (extraKey.match(',' + v + ',')) {
                    return;
                }
            }
            app.removeStorageSync(v);
        });
    }
};
/**
 * @function
 * @description 设置storage的值,默认将obj转为json
 * @param {string} argKey 要设置的key
 * @param {string|AnyObject} argData 要设置的值
 * @returns {promise} key对应的数据
 */
const setStorage = async (argKey, argData) => {
    let temData = argData;
    if (appConfig.localEncrypt) {
        if (typeof argData === 'object') {
            argData = JSON.stringify(argData);
        }
        temData = encode(argData);
    }
    const res = await P('setStorage', {
        key: argKey,
        data: temData,
    }).catch((err) => {
        console.error('setStorage', err);
    });
    return res.data || res || '';
};
/**
 * @function
 * @description wx/taro/uni api转Promise
 * @param {string} argApi 需要转promise的API名称
 * @param {object} argOptions {} api对应的配置,除了success和fail
 * @returns {promise}
 */
const P = (argApi, argOptions = {}) => {
    return new Promise(function (resolve, reject) {
        if (!argApi && argOptions.success) {
            return argOptions.success(resolve, reject);
        }
        const options = {
            success: resolve,
            fail: reject,
        };
        Object.assign(options, argOptions);
        if (app[argApi]) {
            app[argApi](options);
        }
        else {
            return reject('无此方法');
        }
    });
};
/**
 * 描述
 * @function
 * @description 微信实时日志记录
 * @date 2019-09-26
 * @returns {AnyObject}
 */
const wxLog = () => {
    // logLevel 1 error 2 warn 3 info 4 debug
    const logLevel = +getStorageSync('logLevel');
    switch (logLevel) {
        case 1:
            console.warn = () => { };
        // eslint-disable-next-line no-fallthrough
        case 2:
            console.info = () => { };
        // eslint-disable-next-line no-fallthrough
        case 3:
            console.log = () => { };
    }
    if (!wx) {
        return {};
    }
    let log = null;
    if (wx) {
        log = wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : null;
    }
    return {
        debug() {
            if (!log)
                return;
            log.debug.apply(log, arguments);
        },
        info() {
            if (!log)
                return;
            log.info.apply(log, arguments);
        },
        warn() {
            if (!log)
                return;
            log.warn.apply(log, arguments);
        },
        error() {
            if (!log)
                return;
            log.error.apply(log, arguments);
        },
        setFilterMsg(msg) {
            // 从基础库2.7.3开始支持
            if (!log || !log.setFilterMsg)
                return;
            if (typeof msg !== 'string')
                return;
            log.setFilterMsg(msg);
        },
        addFilterMsg(msg) {
            // 从基础库2.8.1开始支持
            if (!log || !log.addFilterMsg)
                return;
            if (typeof msg !== 'string')
                return;
            log.addFilterMsg(msg);
        },
    };
};
/**
 * 描述
 * @function
 * @description 小程序云函数调用
 * @param {string} argOption 云函数配置
 * @date 2019-09-26
 * @returns {promise}
 */
const cloudApi = async (argOption = {}) => {
    if (wx) {
        L.loading(1);
        let error = '';
        const res = await wx.cloud.callFunction(argOption).catch((err) => {
            toast(`云函数:${argOption.name}调用失败!`);
            error = err;
        });
        L.loading();
        if (error) {
            return Promise.reject(error);
        }
        return Promise.resolve(res);
    }
    else {
        return Promise.reject('暂不支持');
    }
};
/**
 * @function
 * @description 富文本格式处理 for 小程序rich-text
 * @param {string} argData 富文本
 * @returns {string}
 */
const getRichText = (argData) => {
    if (!argData) {
        return '';
    }
    const imgReg = /<img.*?(?:>|\/>)/gi;
    const styleReg = /style="([^"]*)"/g;
    // 处理空格
    argData = argData.replace(/&nbsp;/g, '\xa0');
    argData = String(argData).replace(imgReg, (match) => {
        let newStyleImg = '';
        // 图片样式保留原来style添加大小限制,若原来img没有设style则直接插进去
        if (!match.match('max-width:100%')) {
            let temStyle = safeData(match.match(styleReg), '0', '');
            if (temStyle) {
                temStyle =
                    temStyle.slice(0, temStyle.length - 1) +
                        ';max-width:100%;height:auto;"';
                newStyleImg = match.replace(styleReg, temStyle);
            }
            else {
                newStyleImg = match.replace(/<img/gim, '<img style="max-width:100%;height:auto;"');
            }
        }
        else {
            newStyleImg = match;
        }
        // #ifdef MP
        // newStyleImg = newStyleImg.replace(/px;/gim, 'rpx;')
        // #endif
        return newStyleImg;
    });
    return argData;
};
/**
 * @function
 * @description 页面刷新
 */
const refresh = () => {
    let nowPage = getCurrentPage();
    let options = getUrlParamObj(safeData(nowPage, '$page.fullPath'));
    nowPage.onLoad && nowPage.onLoad(options);
    nowPage.onReady && nowPage.onReady();
    nowPage.onShow && nowPage.onShow();
};
/**
 * @function
 * @description: 获取dom节点相关信息
 * @param {object}  argThis: 当前this,
 * @param {string} argId id/class
 * @param {Boolean} getAll 是否获取全部 true时,返回数组
 * @param {object} argOptions 修改默认返回具体参考:https://uniapp.dcloud.io/api/ui/nodes-info?id=nodesreffields
 * @return: object/array
 */
const getDom = async (argThis, argId, getAll = false, argOptions) => {
    let temOptions = {
        id: true,
        dataset: true,
        rect: true,
        size: true,
        scrollOffset: true,
        computedStyle: [],
        context: true,
        properties: [],
    };
    if (isH5) {
        delete temOptions.properties;
    }
    if (argOptions) {
        Object.assign(temOptions, argOptions);
    }
    return new Promise((resolve, rejects) => {
        let nodesRef;
        let temDom = uni.createSelectorQuery().in(argThis);
        nodesRef = temDom[getAll ? 'selectAll' : 'select'](argId);
        nodesRef
            .fields(temOptions, (res) => {
            if (getAll && Array.isArray(res) && res.length) {
                resolve(res);
            }
            if (!getAll && res) {
                resolve(res);
            }
            rejects(res);
        })
            .exec();
    });
};
/**
 * @description APP:返回 uni/wx/taro实例
 * @constant {object}
 */
const APP = app;
/**
 * @description IS_H5:是否为H5
 * @constant {boolean}
 * @default false
 */
const IS_H5 = isH5;

export { APP, IS_H5, P, checkSetting, checkUpdate, clearStorageSync, cloudApi, downloadImgs, getCurrentPage, getCurrentPageUrl, getDb, getDom, getLocation, getRichText, getStorage, getStorageSync, getSystemInfo, getUserInfo, hideLoading, init, ljApiFn, login, refresh, request, requestCloud, scrollTop, setRequest, setStorage, setTitle, showLoading, toPage, toast, uploadImg, uploadImgs, wxLog };