2022-06-01 20:33:36 +08:00

207 lines
5.8 KiB
TypeScript

import Taro, { useRouter } from '@tarojs/taro'
import { useEffect, useRef, useState } from 'react'
import {BASE_URL, WX_APPID} from '@/common/constant'
import useUserInfo from "./useUserInfo"
import qs from 'qs';
import useLogin from './useLogin';
import useLoginRequest from './useLoginRequest';
type Params = {
code: string|null
success: true|false
data: any,
msg: string,
loading: true|false,
error: any,
query: any,
filter: any,
sort: any,
total: number,
multiple: true|false, // 请求多次
count: number, // 第几次请求
token: string, // token
page?: number,
pageSize?: number
}
type option = {
url?: string,
method?: 'get'|'post'|'put'|'delete',
type?: string,
data?: any,
page?: number,
pageSize?: number,
pagination?: true|false,
base_url?: string
}
/**
* 返回状态信息,根据 http 状态错
* @param {Number} status
* @returns
*/
const showStatus = (status) => {
let message = ''
switch (status) {
case 400:
message = '请求错误(400)'
break
case 401:
message = '未授权,请重新登录(401)'
break
case 403:
message = '拒绝访问(403)'
break
case 404:
message = '请求出错(404)'
break
case 408:
message = '请求超时(408)'
break
case 500:
message = '服务器错误(500)'
break
case 501:
message = '服务未实现(501)'
break
case 502:
message = '网络错误(502)'
break
case 503:
message = '服务不可用(503)'
break
case 504:
message = '网络超时(504)'
break
case 505:
message = 'HTTP版本不受支持(505)'
break
default:
message = `连接出错(${status})!`
}
return `${message},请检查网络或联系管理员!`
}
/**
* axios 请求状态封装,返回响应式数据 fetch(), loading, error, code, msg 等常用方法/状态
* @param {Object} options 对象
* @param {String} options.url 请求的URL
* @param {String} options.method 请求的方法
* @param {Object} options.data 请求的参数
* @returns {Object} 返回fetch(), loading, error, code, msg
*/
export const useRequest = (options:option = {
url: '/',
method: 'get',
type: 'json',
data: {},
page: 1,
pageSize: 24,
pagination: false, // 是否分页
base_url: ''
}) => {
options.url = `${options.base_url||BASE_URL}${options.url}`
let params:Params = {
code: null, // 业务码
success: false, // 请求是否成功
data: {},
msg: '',
loading: true,
error: null,
query: {},
filter: null,
sort: '',
total: 0,
multiple: true, // 请求多次
count: 0, // 第几次请求
token: '', // token
}
const stateRef = useRef({...params})
const [state, setState] = useState({...stateRef.current})
const {removeToken, removeSessionKey} = useUserInfo()
const {login} = useLoginRequest()
useEffect(() => {
console.log('变化::', state.loading)
}, [state.loading])
// 请求函数
const fetchData = async (sub_options?:any) => {
stateRef.current.loading = true
setState((e) => ({...e, loading:true}))
console.log('tf:::', stateRef.current.loading)
stateRef.current.query = {
...sub_options,
...options.pagination && {
page: stateRef.current.page,
size: stateRef.current.pageSize,
},
...stateRef.current.filter,
...stateRef.current.sort
}
try {
let token = Taro.getStorageSync('token')
const q = {
...options,
...{
header: {
"Platform": 6,
"Appid": WX_APPID,
"Authorization": token || stateRef.current.token,
}
},
...options.method?.toUpperCase() == 'GET' ? {
data: stateRef.current.query
} : {
data: options.type?.toUpperCase() == 'FORMDATA' ? qs.stringify(stateRef.current.query) : stateRef.current.query
}
}
const result = await Taro.request(q as any)
const { statusCode } = result
const {
code,
msg,
data
} = result.data
if (statusCode === 200) {
stateRef.current.success = (code === 0 ? true : false)
stateRef.current.code = code
stateRef.current.msg = msg
stateRef.current.data = data
stateRef.current.total = data?.list ? data?.total : 0
}else{
if (statusCode === 401) {
removeToken()
removeSessionKey()
login()
} else {
Taro.showToast({
title: `错误:${showStatus(statusCode)}`,
icon: 'none'
})
}
}
} catch (e) {
stateRef.current.success = false
stateRef.current.error = true
stateRef.current.msg = e.errMsg
}
stateRef.current.error = false
stateRef.current.loading = false
setState(() => ({...stateRef.current}))
return stateRef.current
}
return {
fetchData,
state,
}
}