UNPKG

instruct-request-axios

Version:
193 lines (153 loc) 7.42 kB
import {TipPluginOption,TipOptionObject,TipMessage,TipGetMessage} from "./type.d"; import {RequestPlugin} from '../../type'; export type TipPlugin = RequestPlugin<any,TipOptionObject>; export default { // 默认的配置 defaultOption:{ fail:{ timeout:'请求超时', default:'服务繁忙' }, failType:'error', duration:3000, tip:true, tipType:{ success:'success', default:'info' }, messageKey:'msg' } as TipOptionObject, install(target,config:TipPluginOption) { // 全局配置 let option = this.createConfig(config,this.defaultOption); target.push({ name:'tip', trigger:(config)=>{ if(config.requestData.tip) { let useOption:TipOptionObject = this.createConfig(this.compatible(config.requestData.tip),this.compatible(option)); let tipType:keyof TipOptionObject = config.status === 'success' ? 'tip' : 'fail'; // 设置允许提示 if(useOption[tipType] !== false){ let tip:string | TipGetMessage,useTipType,codeType:string,useCodeStatus:any; /* 获取codeType */ if(config.status === 'success') { useCodeStatus = config.responseRestData && config.responseRestData[target.getConfig('codeKey',config,useOption) as string]; if(target.verificationSuccessful(config.responseData, useOption,config)){ codeType = 'success' } } else { useCodeStatus = config.responseData.status ? config.responseData.status : config.responseData.response && config.responseData.response.status; if(config.responseData && config.responseData.response === undefined) { codeType = 'timeout' } } if(!codeType) { codeType = 'default'; } /* 获取codeType */ /* 获取提示文本 */ let tipMessage = this.getConfig(tipType,useOption); if(tipMessage && typeof tipMessage === 'object') { let tipResult = this.getTipMessage(tipMessage,codeType,useCodeStatus); // 获取提示文本 if(tipResult) { tip = tipResult; } else { tip = tipMessage.default; } } else { if(tipType === 'tip'){ if(typeof useOption.messageKey === 'function') { tip = useOption.messageKey(config.responseData,codeType,useCodeStatus); } else { tip = config.responseRestData && config.responseRestData[useOption.messageKey] || '' } } else { tip = ''; } } if(typeof tip === 'function'){ tip = tip(config.responseData,codeType,useCodeStatus); } /* 获取提示文本 */ /* 获取提示类型以及相应配置 */ let tipTypeConfig = this.getConfig(tipType+'Type',useOption); if(tipTypeConfig) { let tipTypeof = typeof tipTypeConfig; if(tipTypeof === 'string') useTipType = tipTypeConfig; else if(tipTypeof === 'function') { let resultTipConfig = tipTypeConfig(codeType,tip, useCodeStatus, config.responseData ); if(resultTipConfig) { switch(typeof resultTipConfig) { case 'string' : useTipType = resultTipConfig;break; case 'object' : useTipType = resultTipConfig.type,tip = resultTipConfig.tip;break; } } if(!useTipType) { useTipType = typeof option[tipType+'Type'] === 'string' ? option[tipType+'Type'] : this.defaultOption[tipType+'Type']; } } else if(tipTypeof === 'object'){ useTipType = tipTypeConfig[codeType]; } } /* 获取提示类型以及相应配置 */ /* 执行提示 */ if(tip && useTipType) { let duration; if(typeof useOption.duration === 'function') { duration = useOption.duration( config.status === 'success', codeType,tip as string, useCodeStatus, config.responseData ) } else { duration = useOption.duration } // 执行判断是否执行提示 return target.message(useTipType,config,{ content:tip as string, duration: duration === undefined ? option.duraction : duration }) } /* 执行提示 */ } } }, type:'post', zIndex:-100 }); }, // 获取提示文本 getTipMessage(data:TipMessage,codeType:keyof TipMessage,code:number | any){ return data[code] ? data[code] : data[codeType]; }, // 创建配置文件 createConfig(option:TipOptionObject,defaultOption:TipOptionObject):TipOptionObject{ // 返回配置 return Object.assign({},defaultOption,option); }, // 获取配置 getConfig<T extends keyof TipOptionObject>(key: T,option):TipOptionObject[T]{ if(typeof option[key] === 'boolean') { return this.defaultOption[key]; } else { return option[key]; } }, // 兼容 compatible(option:TipPluginOption):TipOptionObject | undefined{ if (!option || typeof option === 'boolean') { return undefined; } return option as TipOptionObject; }, // 注册 register(target,option?:TipOptionObject){ return target && target.$use(this,option); } } as TipPlugin; export { TipPluginOption,TipOptionObject }