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.
 
 

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