You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

79 lines
2.8 KiB

  1. import { createContext, useEffect, useRef, useCallback } from 'react';
  2. import { apiPath } from 'auth/utils';
  3. import { REFRESH_TOKEN } from 'utils/ApiPathConst';
  4. import axios from 'axios';
  5. import {
  6. isUserLoggedIn,
  7. } from "utils/Utils";
  8. const RefreshTokenContext = createContext();
  9. const RefreshTokenProvider = ({ children }) => {
  10. const token = useRef(localStorage.getItem('accessToken'));
  11. const isRefresh = useRef(false);
  12. // handle Refresh Token Logic
  13. const handleRefreshToken = useCallback(() => {
  14. if (!isRefresh.current) {
  15. const refreshToken = localStorage.getItem('refreshToken');
  16. isRefresh.current = true;
  17. axios
  18. .post(`${apiPath}${REFRESH_TOKEN}`, {
  19. refreshToken: refreshToken
  20. })
  21. .then((response) => {
  22. if (response.status === 200) {
  23. const newAccessToken = response.data.accessToken;
  24. const newRefreshToken = response.data.refreshToken;
  25. localStorage.setItem('accessToken', newAccessToken);
  26. localStorage.setItem('refreshToken', newRefreshToken);
  27. token.current = newAccessToken;
  28. isRefresh.current = false;
  29. } else {
  30. token.current = null;
  31. isRefresh.current = false;
  32. }
  33. })
  34. .catch((refreshError) => {
  35. console.log('Failed to refresh token');
  36. if (refreshError != undefined){
  37. console.log(refreshError)
  38. }
  39. token.current = null
  40. isRefresh.current = false;
  41. });
  42. }
  43. }, []);
  44. // Function to check token expiry
  45. const checkTokenExpiry = useCallback(() => {
  46. // Check if token is present and its expiry time
  47. if (token.current) {
  48. const tokenExp = JSON.parse(atob(token.current.split('.')[1])).exp;
  49. const currentTime = Math.floor(Date.now() / 1000);
  50. const expiryTime = tokenExp - 30; // Refresh 30 seconds before expiry
  51. // console.log("check refresh Token");
  52. // console.log(currentTime);
  53. // console.log(new Date(currentTime*1000).toLocaleString());
  54. // console.log(expiryTime);
  55. // console.log(new Date(expiryTime*1000).toLocaleString());
  56. // console.log('accessToken: ' + localStorage.getItem('accessToken'));
  57. // console.log('refreshToken: ' + localStorage.getItem('refreshToken'));
  58. if (currentTime >= expiryTime) {
  59. if(isUserLoggedIn()){
  60. handleRefreshToken();
  61. }
  62. }
  63. }
  64. }, [token]);
  65. // Start the timer on component mount
  66. useEffect(() => {
  67. const timer = setInterval(checkTokenExpiry, 10000); // Check every 10 second
  68. return () => clearInterval(timer); // Cleanup timer on unmount
  69. }, [checkTokenExpiry]);
  70. return <RefreshTokenContext.Provider value={{}}>{children}</RefreshTokenContext.Provider>;
  71. };
  72. export { RefreshTokenContext, RefreshTokenProvider };