No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

236 líneas
8.4 KiB

  1. // ** UseJWT import to get config
  2. import axios from "axios";
  3. import {isUserLoggedIn} from "../utils/Utils";
  4. import jwtApplicationConfig from "auth/jwtApplicationConfig";
  5. import jwt_decode from "jwt-decode";
  6. import {apiPath} from "./utils";
  7. //import axios from "axios";
  8. export const refreshIntervalName = 'refreshInterval'
  9. export const predictProductionQty = 'predictProductionQty'
  10. export const predictUsageCount = 'predictUsageCount'
  11. export const windowCount = 'windowCount'
  12. import {useNavigate} from "react-router-dom";
  13. import {useDispatch} from "react-redux";
  14. import { REFRESH_TOKEN } from 'utils/ApiPathConst';
  15. // ** Handle User Login
  16. export const handleLogin = data => {
  17. return dispatch => {
  18. dispatch({
  19. type: 'LOGIN',
  20. data,
  21. jwtApplicationConfig,
  22. accessToken: data['accessToken'],
  23. refreshToken: data['refreshToken']
  24. })
  25. // console.log(data)
  26. // ** Add to user, accessToken & refreshToken to localStorage
  27. localStorage.setItem('userData', JSON.stringify(data))
  28. localStorage.setItem('accessToken', data.accessToken)
  29. localStorage.setItem('refreshToken', data.refreshToken)
  30. localStorage.setItem('axiosToken', "Bearer " + data.accessToken)
  31. //localStorage.setItem(config.storageUserRoleKeyName, JSON.stringify(data.role).slice(1).slice(0, -1))
  32. localStorage.setItem(refreshIntervalName, "60")
  33. // for demo only
  34. localStorage.setItem(windowCount, '0')
  35. localStorage.setItem(predictProductionQty, '0')
  36. localStorage.setItem(predictUsageCount, '0')
  37. }
  38. }
  39. export const isLocalTokenValid = () => {
  40. axios.get(`${apiPath}/test`)
  41. .then((response) => {
  42. if(response.status === 200){
  43. return true;
  44. }
  45. else{
  46. return false;
  47. }
  48. })
  49. .catch(error => {
  50. console.log(error);
  51. return false;
  52. });
  53. return false;
  54. }
  55. export const isTokenValid = () =>{
  56. if(localStorage.getItem('accessToken') !== null && localStorage.getItem('accessToken') !== 'null'){
  57. let isExpired = false;
  58. const token = localStorage.getItem('accessToken');
  59. let decodedToken=jwt_decode(token);
  60. let dateNow = new Date();
  61. if(decodedToken.exp < dateNow.getTime())
  62. isExpired = true;
  63. return isExpired;
  64. }
  65. else{
  66. return false;
  67. }
  68. }
  69. // ** Handle User Logout
  70. export const handleLogoutFunction = () => {
  71. return dispatch => {
  72. dispatch({
  73. type: 'LOGOUT',
  74. accessToken: null,
  75. refreshToken: null
  76. }
  77. )
  78. // console.log("logout");
  79. // ** Remove user, accessToken & refreshToken from localStorage
  80. localStorage.removeItem('userData')
  81. localStorage.removeItem('accessToken')
  82. localStorage.removeItem('refreshToken')
  83. localStorage.removeItem('webtoken')
  84. localStorage.removeItem('transactionid')
  85. //localStorage.removeItem(config.storageUserRoleKeyName)
  86. localStorage.removeItem('expiredAlertShown')
  87. localStorage.removeItem(refreshIntervalName)
  88. localStorage.removeItem(windowCount)
  89. localStorage.removeItem(predictProductionQty)
  90. localStorage.removeItem(predictUsageCount)
  91. // setTimeout(()=> localStorage.removeItem("expiredAlertShown"), 5000)
  92. }
  93. }
  94. // ** Handle axios token
  95. export const SetupAxiosInterceptors = () => {
  96. const navigate = useNavigate()
  97. const dispatch = useDispatch();
  98. //const updateLastRequestTime = useContext(TimerContext);
  99. let isRefreshToken= false;
  100. axios.interceptors.request.use(
  101. config => {
  102. // ** Get token from localStorage
  103. const accessToken = localStorage.getItem("accessToken")
  104. // ** If token is present add it to request's Authorization Header
  105. if (isUserLoggedIn()) {
  106. config.headers.Authorization = `${jwtApplicationConfig.tokenType} ${accessToken}`
  107. }
  108. config.headers['X-Authorization'] = process.env.REACT_APP_API_KEY
  109. return config
  110. },
  111. error => {
  112. Promise.reject(error)
  113. }
  114. )
  115. axios.interceptors.response.use(
  116. response => {
  117. //updateLastRequestTime(Date.now());
  118. return response;
  119. },
  120. async (error) => {
  121. // const { config, response: { status } } = error
  122. if (error.response.status === 401 && error.config.url !== apiPath + REFRESH_TOKEN) {
  123. // Make a request to refresh the access token
  124. const refreshToken = localStorage.getItem('refreshToken');
  125. if (isRefreshToken) {
  126. return;
  127. }
  128. isRefreshToken = true;
  129. return axios
  130. .post(`${apiPath}${REFRESH_TOKEN}`, {
  131. refreshToken: refreshToken // Replace with your refresh token
  132. })
  133. .then((response) => {
  134. if (response.status === 200) {
  135. const newAccessToken = response.data.accessToken;
  136. const newRefreshToken = response.data.refreshToken;
  137. localStorage.setItem('accessToken', newAccessToken);
  138. localStorage.setItem('refreshToken', newRefreshToken);
  139. isRefreshToken = false;
  140. window.location.reload();
  141. }
  142. })
  143. .catch((refreshError) => {
  144. dispatch(handleLogoutFunction());
  145. navigate('/login');
  146. isRefreshToken = false;
  147. window.location.reload();
  148. throw refreshError;
  149. });
  150. } else {
  151. if (error.response.status === 401) {
  152. if (localStorage.getItem("expiredAlertShown") === null) {
  153. localStorage.setItem("expiredAlertShown", true)
  154. alert("登入驗證已過期,請重新登入。")
  155. }
  156. }
  157. // ** if (status === 401) {
  158. // if (response.status === 401) {
  159. // if (localStorage.getItem("expiredAlertShown") === null) {
  160. // localStorage.setItem("expiredAlertShown", true)
  161. // alert("登入驗證已過期,請重新登入。")
  162. // }
  163. // }
  164. // if (response && response.status === 401) {
  165. // if (localStorage.getItem("expiredAlertShown") === null) {
  166. // localStorage.setItem("expiredAlertShown", true)
  167. // alert("登入驗證已過期,請重新登入。")
  168. // }
  169. // }
  170. if (localStorage.getItem("expiredAlertShown")) {
  171. await dispatch(handleLogoutFunction());
  172. await navigate('/login');
  173. await window.location.reload();
  174. }
  175. if (error.response.status === 500){
  176. //setIsUploading(false);
  177. }
  178. // console.log(error)
  179. }
  180. return Promise.reject(error)
  181. }
  182. )
  183. }
  184. export const handleRefreshTokenFunction = () => {
  185. // const token = localStorage.getItem('accessToken');
  186. let isRefresh = false;
  187. if (!isRefresh) {
  188. const refreshToken = localStorage.getItem('refreshToken');
  189. isRefresh = true;
  190. axios.post(`${apiPath}${REFRESH_TOKEN}`, {
  191. refreshToken: refreshToken
  192. }).then((response) => {
  193. if (response.status === 200) {
  194. const newAccessToken = response.data.accessToken;
  195. const newRefreshToken = response.data.refreshToken;
  196. localStorage.setItem('accessToken', newAccessToken);
  197. localStorage.setItem('refreshToken', newRefreshToken);
  198. // token = newAccessToken;
  199. isRefresh = false;
  200. } else {
  201. // token = null;
  202. isRefresh = false;
  203. }
  204. })
  205. .catch((refreshError) => {
  206. console.log('Failed to refresh token');
  207. console.log(refreshError)
  208. // token = null
  209. isRefresh = false;
  210. });
  211. }
  212. return isRefresh;
  213. }