Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

239 wiersze
8.6 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(refreshIntervalName)
  87. localStorage.removeItem(windowCount)
  88. localStorage.removeItem(predictProductionQty)
  89. localStorage.removeItem(predictUsageCount)
  90. setTimeout(()=> localStorage.removeItem("expiredAlertShown"), 5000)
  91. }
  92. }
  93. // ** Handle axios token
  94. export const SetupAxiosInterceptors = () => {
  95. const navigate = useNavigate()
  96. const dispatch = useDispatch();
  97. //const updateLastRequestTime = useContext(TimerContext);
  98. let isRefreshToken= false;
  99. axios.interceptors.request.use(
  100. config => {
  101. // ** Get token from localStorage
  102. const accessToken = localStorage.getItem("accessToken")
  103. // ** If token is present add it to request's Authorization Header
  104. if (isUserLoggedIn()) {
  105. config.headers.Authorization = `${jwtApplicationConfig.tokenType} ${accessToken}`
  106. }
  107. config.headers['X-Authorization'] = process.env.REACT_APP_API_KEY
  108. return config
  109. },
  110. error => {
  111. Promise.reject(error)
  112. }
  113. )
  114. axios.interceptors.response.use(
  115. response => {
  116. //updateLastRequestTime(Date.now());
  117. return response;
  118. },
  119. async (error) => {
  120. // ** const { config, response: { status } } = error
  121. if (error.response.status === 401 && error.config.url !== apiPath + REFRESH_TOKEN) {
  122. // Make a request to refresh the access token
  123. const refreshToken = localStorage.getItem('refreshToken');
  124. if (isRefreshToken) {
  125. return;
  126. }
  127. isRefreshToken = true;
  128. return axios
  129. .post(`${apiPath}${REFRESH_TOKEN}`, {
  130. refreshToken: refreshToken // Replace with your refresh token
  131. })
  132. .then((response) => {
  133. if (response.status === 200) {
  134. const newAccessToken = response.data.accessToken;
  135. const newRefreshToken = response.data.refreshToken;
  136. localStorage.setItem('accessToken', newAccessToken);
  137. localStorage.setItem('refreshToken', newRefreshToken);
  138. isRefreshToken = false;
  139. window.location.reload();
  140. }
  141. })
  142. .catch((refreshError) => {
  143. dispatch(handleLogoutFunction());
  144. navigate('/login');
  145. isRefreshToken = false;
  146. window.location.reload();
  147. throw refreshError;
  148. });
  149. } else {
  150. if (isUserLoggedIn()){
  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. } else {
  176. if (error.response.status === 401) {
  177. await dispatch(handleLogoutFunction());
  178. await navigate('/login');
  179. // await window.location.reload();
  180. }
  181. }
  182. }
  183. return Promise.reject(error)
  184. }
  185. )
  186. }
  187. export const handleRefreshTokenFunction = () => {
  188. // const token = localStorage.getItem('accessToken');
  189. let isRefresh = false;
  190. if (!isRefresh) {
  191. const refreshToken = localStorage.getItem('refreshToken');
  192. isRefresh = true;
  193. axios.post(`${apiPath}${REFRESH_TOKEN}`, {
  194. refreshToken: refreshToken
  195. }).then((response) => {
  196. if (response.status === 200) {
  197. const newAccessToken = response.data.accessToken;
  198. const newRefreshToken = response.data.refreshToken;
  199. localStorage.setItem('accessToken', newAccessToken);
  200. localStorage.setItem('refreshToken', newRefreshToken);
  201. // token = newAccessToken;
  202. isRefresh = false;
  203. } else {
  204. // token = null;
  205. isRefresh = false;
  206. }
  207. })
  208. .catch((refreshError) => {
  209. console.log('Failed to refresh token');
  210. console.log(refreshError)
  211. // token = null
  212. isRefresh = false;
  213. });
  214. }
  215. return isRefresh;
  216. }