import buildURL from '../helpers/buildURL'  
 | 
import buildFullPath from '../core/buildFullPath'  
 | 
import settle from '../core/settle'  
 | 
import { isUndefined } from '../utils'  
 | 
  
 | 
/**  
 | 
 * 返回可选值存在的配置  
 | 
 * @param {Array} keys - 可选值数组  
 | 
 * @param {Object} config2 - 配置  
 | 
 * @return {{}} - 存在的配置项  
 | 
 */  
 | 
const mergeKeys = (keys, config2) => {  
 | 
    const config = {}  
 | 
    keys.forEach((prop) => {  
 | 
        if (!isUndefined(config2[prop])) {  
 | 
            config[prop] = config2[prop]  
 | 
        }  
 | 
    })  
 | 
    return config  
 | 
}  
 | 
export default (config) => new Promise((resolve, reject) => {  
 | 
    const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)  
 | 
    const _config = {  
 | 
        url: fullPath,  
 | 
        header: config.header,  
 | 
        complete: (response) => {  
 | 
            config.fullPath = fullPath  
 | 
            response.config = config  
 | 
            try {  
 | 
                // 对可能字符串不是json 的情况容错  
 | 
                if (typeof response.data === 'string') {  
 | 
                    response.data = JSON.parse(response.data)  
 | 
                }  
 | 
                // eslint-disable-next-line no-empty  
 | 
            } catch (e) {  
 | 
            }  
 | 
            settle(resolve, reject, response)  
 | 
        }  
 | 
    }  
 | 
    let requestTask  
 | 
    if (config.method === 'UPLOAD') {  
 | 
        delete _config.header['content-type']  
 | 
        delete _config.header['Content-Type']  
 | 
        const otherConfig = {  
 | 
        // #ifdef MP-ALIPAY  
 | 
            fileType: config.fileType,  
 | 
            // #endif  
 | 
            filePath: config.filePath,  
 | 
            name: config.name  
 | 
        }  
 | 
        const optionalKeys = [  
 | 
        // #ifdef APP-PLUS || H5  
 | 
            'files',  
 | 
            // #endif  
 | 
            // #ifdef H5  
 | 
            'file',  
 | 
            // #endif  
 | 
            // #ifdef H5 || APP-PLUS  
 | 
            'timeout',  
 | 
            // #endif  
 | 
            'formData'  
 | 
        ]  
 | 
        requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })  
 | 
    } else if (config.method === 'DOWNLOAD') {  
 | 
        // #ifdef H5 || APP-PLUS  
 | 
        if (!isUndefined(config.timeout)) {  
 | 
            _config.timeout = config.timeout  
 | 
        }  
 | 
        // #endif  
 | 
        requestTask = uni.downloadFile(_config)  
 | 
    } else {  
 | 
        const optionalKeys = [  
 | 
            'data',  
 | 
            'method',  
 | 
            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN  
 | 
            'timeout',  
 | 
            // #endif  
 | 
            'dataType',  
 | 
            // #ifndef MP-ALIPAY  
 | 
            'responseType',  
 | 
            // #endif  
 | 
            // #ifdef APP-PLUS  
 | 
            'sslVerify',  
 | 
            // #endif  
 | 
            // #ifdef H5  
 | 
            'withCredentials',  
 | 
            // #endif  
 | 
            // #ifdef APP-PLUS  
 | 
            'firstIpv4'  
 | 
        // #endif  
 | 
        ]  
 | 
        requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })  
 | 
    }  
 | 
    if (config.getTask) {  
 | 
        config.getTask(requestTask, config)  
 | 
    }  
 | 
})  
 |