import React, { useState, useEffect } from "react"; import { useParams, useHistory } from "react-router-dom"; import { toast } from "react-toastify"; import openSocket from "socket.io-client"; import clsx from "clsx"; import { Paper, makeStyles } from "@material-ui/core"; import ContactDrawer from "../ContactDrawer"; import MessageInput from "../MessageInput/"; import TicketHeader from "../TicketHeader"; import TicketInfo from "../TicketInfo"; import TicketActionButtons from "../TicketActionButtons"; import MessagesList from "../MessagesList"; import api from "../../services/api"; import { i18n } from "../../translate/i18n"; const drawerWidth = 320; const useStyles = makeStyles(theme => ({ root: { display: "flex", height: "100%", position: "relative", overflow: "hidden", }, mainWrapper: { flex: 1, height: "100%", display: "flex", flexDirection: "column", overflow: "hidden", borderTopLeftRadius: 0, borderBottomLeftRadius: 0, borderLeft: "0", marginRight: -drawerWidth, transition: theme.transitions.create("margin", { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), }, mainWrapperShift: { borderTopRightRadius: 0, borderBottomRightRadius: 0, transition: theme.transitions.create("margin", { easing: theme.transitions.easing.easeOut, duration: theme.transitions.duration.enteringScreen, }), marginRight: 0, }, })); const Ticket = () => { const { ticketId } = useParams(); const history = useHistory(); const classes = useStyles(); const [drawerOpen, setDrawerOpen] = useState(false); const [loading, setLoading] = useState(true); const [contact, setContact] = useState({}); const [ticket, setTicket] = useState({}); useEffect(() => { setLoading(true); const delayDebounceFn = setTimeout(() => { const fetchTicket = async () => { try { const { data } = await api.get("/tickets/" + ticketId); setContact(data.contact); setTicket(data); setLoading(false); } catch (err) { setLoading(false); const errorMsg = err.response?.data?.error; if (errorMsg) { if (i18n.exists(`backendErrors.${errorMsg}`)) { toast.error(i18n.t(`backendErrors.${errorMsg}`)); } else { toast.error(err.response.data.error); } if (err.response.status === 404) { history.push("/tickets"); } } else { toast.error("Unknown error"); } } }; fetchTicket(); }, 500); return () => clearTimeout(delayDebounceFn); }, [ticketId, history]); useEffect(() => { const socket = openSocket(process.env.REACT_APP_BACKEND_URL); socket.emit("joinChatBox", ticketId); socket.on("ticket", data => { if (data.action === "updateStatus") { setTicket(data.ticket); } if (data.action === "delete") { toast.success("Ticket deleted sucessfully."); history.push("/tickets"); } }); socket.on("contact", data => { if (data.action === "update") { setContact(prevState => { if (prevState.id === data.contact?.id) { return { ...prevState, ...data.contact }; } return prevState; }); } }); return () => { socket.disconnect(); }; }, [ticketId, history]); const handleDrawerOpen = () => { setDrawerOpen(true); }; const handleDrawerClose = () => { setDrawerOpen(false); }; return (
); }; export default Ticket;