instruct-request-axios
Version:
193 lines (153 loc) • 7.42 kB
text/typescript
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 }