Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. import axios from 'axios'
  2. import { useEffect, useReducer, useState } from 'react'
  3.  
  4. const initialResponse = { response: null, error: null, loading: false }
  5.  
  6. function responseReducer(state, action) {
  7. switch (action.type) {
  8. case 'INIT':
  9. return { response: null, error: null, loading: true }
  10. case 'SUCCESS':
  11. return { response: action.payload, error: null, loading: false }
  12. case 'FAIL':
  13. return { response: null, error: action.payload, loading: false }
  14. default:
  15. return initialResponse
  16. }
  17. }
  18.  
  19. const { CancelToken } = axios
  20.  
  21. export function useAxios({
  22. url,
  23. method = 'get',
  24. options = {},
  25. headers = {},
  26. trigger,
  27. anotherTrigger,
  28. }) {
  29. const [results, dispatch] = useReducer(responseReducer, initialResponse)
  30. const [innerTrigger, setInnerTrigger] = useState(0)
  31.  
  32. let outerTrigger = trigger
  33. outerTrigger = JSON.stringify(trigger)
  34.  
  35. dispatch({ type: 'INIT' })
  36.  
  37. useEffect(() => {
  38. if (!url) {
  39. return
  40. }
  41.  
  42.  
  43. const source = CancelToken.source()
  44.  
  45. axios({
  46. url,
  47. method,
  48. ...options,
  49. ...headers,
  50. cancelToken: source.token,
  51. })
  52. .then(r => {
  53. dispatch({ type: 'SUCCESS', payload: r })
  54. })
  55. .catch(e => {
  56. dispatch({ type: 'FAIL', payload: e })
  57. })
  58.  
  59. return () => {
  60. source.cancel()
  61. }
  62. }, [innerTrigger, outerTrigger])
  63.  
  64. return {
  65. ...results,
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement