handle axios error
This commit is contained in:
		
							parent
							
								
									b95a99aaff
								
							
						
					
					
						commit
						c7f973e27a
					
				| @ -23,6 +23,7 @@ | |||||||
|     "next": "13.1.6", |     "next": "13.1.6", | ||||||
|     "react": "18.2.0", |     "react": "18.2.0", | ||||||
|     "react-dom": "18.2.0", |     "react-dom": "18.2.0", | ||||||
|  |     "react-toastify": "^9.1.1", | ||||||
|     "swr": "^2.0.3", |     "swr": "^2.0.3", | ||||||
|     "yup": "^1.0.0" |     "yup": "^1.0.0" | ||||||
|   }, |   }, | ||||||
|  | |||||||
| @ -22,6 +22,7 @@ specifiers: | |||||||
|   prettier: 2.8.4 |   prettier: 2.8.4 | ||||||
|   react: 18.2.0 |   react: 18.2.0 | ||||||
|   react-dom: 18.2.0 |   react-dom: 18.2.0 | ||||||
|  |   react-toastify: ^9.1.1 | ||||||
|   swr: ^2.0.3 |   swr: ^2.0.3 | ||||||
|   typescript: ^4.9.5 |   typescript: ^4.9.5 | ||||||
|   yup: ^1.0.0 |   yup: ^1.0.0 | ||||||
| @ -39,6 +40,7 @@ dependencies: | |||||||
|   next: 13.1.6_biqbaboplfbrettd7655fr4n2y |   next: 13.1.6_biqbaboplfbrettd7655fr4n2y | ||||||
|   react: 18.2.0 |   react: 18.2.0 | ||||||
|   react-dom: 18.2.0_react@18.2.0 |   react-dom: 18.2.0_react@18.2.0 | ||||||
|  |   react-toastify: 9.1.1_biqbaboplfbrettd7655fr4n2y | ||||||
|   swr: 2.0.3_react@18.2.0 |   swr: 2.0.3_react@18.2.0 | ||||||
|   yup: 1.0.0 |   yup: 1.0.0 | ||||||
| 
 | 
 | ||||||
| @ -2638,6 +2640,17 @@ packages: | |||||||
|     resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} |     resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /react-toastify/9.1.1_biqbaboplfbrettd7655fr4n2y: | ||||||
|  |     resolution: {integrity: sha512-pkFCla1z3ve045qvjEmn2xOJOy4ZciwRXm1oMPULVkELi5aJdHCN/FHnuqXq8IwGDLB7PPk2/J6uP9D8ejuiRw==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: '>=16' | ||||||
|  |       react-dom: '>=16' | ||||||
|  |     dependencies: | ||||||
|  |       clsx: 1.2.1 | ||||||
|  |       react: 18.2.0 | ||||||
|  |       react-dom: 18.2.0_react@18.2.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: |   /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: | ||||||
|     resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} |     resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} | ||||||
|     peerDependencies: |     peerDependencies: | ||||||
|  | |||||||
| @ -4,6 +4,8 @@ import CssBaseline from '@mui/material/CssBaseline' | |||||||
| import NextLink, { type LinkProps as NextLinkProps } from 'next/link' | import NextLink, { type LinkProps as NextLinkProps } from 'next/link' | ||||||
| import { LinkProps } from '@mui/material/Link' | import { LinkProps } from '@mui/material/Link' | ||||||
| import { ThemeProvider, createTheme } from '@mui/material' | import { ThemeProvider, createTheme } from '@mui/material' | ||||||
|  | import { ToastContainer } from 'react-toastify' | ||||||
|  | import 'react-toastify/dist/ReactToastify.css' | ||||||
| import '@fontsource/roboto/300.css' | import '@fontsource/roboto/300.css' | ||||||
| import '@fontsource/roboto/400.css' | import '@fontsource/roboto/400.css' | ||||||
| import '@fontsource/roboto/500.css' | import '@fontsource/roboto/500.css' | ||||||
| @ -35,6 +37,15 @@ export default function App({ Component, pageProps }: AppProps) { | |||||||
|     <ThemeProvider theme={theme}> |     <ThemeProvider theme={theme}> | ||||||
|       <CssBaseline /> |       <CssBaseline /> | ||||||
|       <Component {...pageProps} /> |       <Component {...pageProps} /> | ||||||
|  |       <ToastContainer | ||||||
|  |         position="top-center" | ||||||
|  |         autoClose={3000} | ||||||
|  |         hideProgressBar | ||||||
|  |         newestOnTop={false} | ||||||
|  |         closeOnClick | ||||||
|  |         pauseOnFocusLoss={false} | ||||||
|  |         pauseOnHover | ||||||
|  |       /> | ||||||
|     </ThemeProvider> |     </ThemeProvider> | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,6 +2,19 @@ import axios, { type AxiosError } from 'axios' | |||||||
| import Router from 'next/router' | import Router from 'next/router' | ||||||
| import status from 'http-status' | import status from 'http-status' | ||||||
| import * as api from '@/api' | import * as api from '@/api' | ||||||
|  | import { toast } from 'react-toastify' | ||||||
|  | 
 | ||||||
|  | interface ErrorResponse { | ||||||
|  |   statusCode: number | ||||||
|  |   message: string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const throwError = (error: AxiosError<ErrorResponse>) => { | ||||||
|  |   toast.error( | ||||||
|  |     error.response?.data.message.toString() ?? error.response?.statusText, | ||||||
|  |   ) | ||||||
|  |   return Promise.reject(error) | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| axios.interceptors.request.use(function (config) { | axios.interceptors.request.use(function (config) { | ||||||
|   const accessToken = localStorage.getItem('accessToken') |   const accessToken = localStorage.getItem('accessToken') | ||||||
| @ -13,7 +26,7 @@ axios.interceptors.response.use( | |||||||
|   function (response) { |   function (response) { | ||||||
|     return response |     return response | ||||||
|   }, |   }, | ||||||
|   async function (error: AxiosError) { |   async function (error: AxiosError<ErrorResponse>) { | ||||||
|     // fail to refresh token
 |     // fail to refresh token
 | ||||||
|     if ( |     if ( | ||||||
|       error.config && |       error.config && | ||||||
| @ -21,7 +34,7 @@ axios.interceptors.response.use( | |||||||
|       error.config.method === 'put' |       error.config.method === 'put' | ||||||
|     ) { |     ) { | ||||||
|       Router.push('/login') |       Router.push('/login') | ||||||
|       return Promise.reject(error) |       return throwError(error) | ||||||
|     } |     } | ||||||
|     switch (error.response?.status) { |     switch (error.response?.status) { | ||||||
|       case status.UNAUTHORIZED: { |       case status.UNAUTHORIZED: { | ||||||
| @ -36,7 +49,7 @@ axios.interceptors.response.use( | |||||||
|         return error.config && axios.request(error.config) |         return error.config && axios.request(error.config) | ||||||
|       } |       } | ||||||
|       default: { |       default: { | ||||||
|         return Promise.reject(error) |         return throwError(error) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user