126 lines
3.1 KiB
JavaScript
126 lines
3.1 KiB
JavaScript
import { useState, useEffect } from "react";
|
|
import { useHistory } from "react-router-dom";
|
|
import openSocket from "socket.io-client";
|
|
|
|
import { toast } from "react-toastify";
|
|
|
|
import { i18n } from "../../translate/i18n";
|
|
import api from "../../services/api";
|
|
import toastError from "../../errors/toastError";
|
|
|
|
const useAuth = () => {
|
|
const history = useHistory();
|
|
const [isAuth, setIsAuth] = useState(false);
|
|
const [loading, setLoading] = useState(true);
|
|
const [user, setUser] = useState({});
|
|
|
|
api.interceptors.request.use(
|
|
config => {
|
|
const token = localStorage.getItem("token");
|
|
if (token) {
|
|
config.headers["Authorization"] = `Bearer ${JSON.parse(token)}`;
|
|
setIsAuth(true);
|
|
}
|
|
return config;
|
|
},
|
|
error => {
|
|
Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
api.interceptors.response.use(
|
|
response => {
|
|
return response;
|
|
},
|
|
async error => {
|
|
const originalRequest = error.config;
|
|
if (error?.response?.status === 403 && !originalRequest._retry) {
|
|
originalRequest._retry = true;
|
|
|
|
const { data } = await api.post("/auth/refresh_token");
|
|
if (data) {
|
|
localStorage.setItem("token", JSON.stringify(data.token));
|
|
api.defaults.headers.Authorization = `Bearer ${data.token}`;
|
|
}
|
|
return api(originalRequest);
|
|
}
|
|
if (error?.response?.status === 401) {
|
|
localStorage.removeItem("token");
|
|
api.defaults.headers.Authorization = undefined;
|
|
setIsAuth(false);
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
useEffect(() => {
|
|
const token = localStorage.getItem("token");
|
|
(async () => {
|
|
if (token) {
|
|
try {
|
|
const { data } = await api.post("/auth/refresh_token");
|
|
api.defaults.headers.Authorization = `Bearer ${data.token}`;
|
|
setIsAuth(true);
|
|
setUser(data.user);
|
|
} catch (err) {
|
|
toastError(err);
|
|
}
|
|
}
|
|
setLoading(false);
|
|
})();
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const socket = openSocket(process.env.REACT_APP_BACKEND_URL);
|
|
|
|
socket.on("user", data => {
|
|
if (data.action === "update" && data.user.id === user.id) {
|
|
setUser(data.user);
|
|
}
|
|
});
|
|
|
|
return () => {
|
|
socket.disconnect();
|
|
};
|
|
}, [user]);
|
|
|
|
const handleLogin = async userData => {
|
|
setLoading(true);
|
|
|
|
try {
|
|
const { data } = await api.post("/auth/login", userData);
|
|
localStorage.setItem("token", JSON.stringify(data.token));
|
|
api.defaults.headers.Authorization = `Bearer ${data.token}`;
|
|
setUser(data.user);
|
|
setIsAuth(true);
|
|
toast.success(i18n.t("auth.toasts.success"));
|
|
history.push("/tickets");
|
|
setLoading(false);
|
|
} catch (err) {
|
|
toastError(err);
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const handleLogout = async () => {
|
|
setLoading(true);
|
|
|
|
try {
|
|
await api.delete("/auth/logout");
|
|
setIsAuth(false);
|
|
setUser({});
|
|
localStorage.removeItem("token");
|
|
api.defaults.headers.Authorization = undefined;
|
|
setLoading(false);
|
|
history.push("/login");
|
|
} catch (err) {
|
|
toastError(err);
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return { isAuth, user, loading, handleLogin, handleLogout };
|
|
};
|
|
|
|
export default useAuth;
|