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.
 
 

77 regels
2.7 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. console.log(refreshError)
  37. token.current = null
  38. isRefresh.current = false;
  39. });
  40. }
  41. }, []);
  42. // Function to check token expiry
  43. const checkTokenExpiry = useCallback(() => {
  44. // Check if token is present and its expiry time
  45. if (token.current) {
  46. const tokenExp = JSON.parse(atob(token.current.split('.')[1])).exp;
  47. const currentTime = Math.floor(Date.now() / 1000);
  48. const expiryTime = tokenExp - 30; // Refresh 30 seconds before expiry
  49. // console.log("check refresh Token");
  50. // console.log(currentTime);
  51. // console.log(new Date(currentTime*1000).toLocaleString());
  52. // console.log(expiryTime);
  53. // console.log(new Date(expiryTime*1000).toLocaleString());
  54. // console.log('accessToken: ' + localStorage.getItem('accessToken'));
  55. // console.log('refreshToken: ' + localStorage.getItem('refreshToken'));
  56. if (currentTime >= expiryTime) {
  57. if(isUserLoggedIn()){
  58. handleRefreshToken();
  59. }
  60. }
  61. }
  62. }, [token]);
  63. // Start the timer on component mount
  64. useEffect(() => {
  65. const timer = setInterval(checkTokenExpiry, 10000); // Check every 10 second
  66. return () => clearInterval(timer); // Cleanup timer on unmount
  67. }, [checkTokenExpiry]);
  68. return <RefreshTokenContext.Provider value={{}}>{children}</RefreshTokenContext.Provider>;
  69. };
  70. export { RefreshTokenContext, RefreshTokenProvider };