import React, { useState, useCallback, useContext } from "react"; import { toast } from "react-toastify"; import { format, parseISO } from "date-fns"; import { makeStyles } from "@material-ui/core/styles"; import { green } from "@material-ui/core/colors"; import { Button, TableBody, TableRow, TableCell, IconButton, Table, TableHead, Paper, Tooltip, Typography, CircularProgress, } from "@material-ui/core"; import { Edit, CheckCircle, SignalCellularConnectedNoInternet2Bar, SignalCellularConnectedNoInternet0Bar, SignalCellular4Bar, CropFree, DeleteOutline, } from "@material-ui/icons"; import MainContainer from "../../components/MainContainer"; import MainHeader from "../../components/MainHeader"; import MainHeaderButtonsWrapper from "../../components/MainHeaderButtonsWrapper"; import Title from "../../components/Title"; import TableRowSkeleton from "../../components/TableRowSkeleton"; import api from "../../services/api"; import WhatsAppModal from "../../components/WhatsAppModal"; import ConfirmationModal from "../../components/ConfirmationModal"; import QrcodeModal from "../../components/QrcodeModal"; import { i18n } from "../../translate/i18n"; import { WhatsAppsContext } from "../../context/WhatsApp/WhatsAppsContext"; import toastError from "../../errors/toastError"; //-------- import { AuthContext } from "../../context/Auth/AuthContext"; import { Can } from "../../components/Can"; const useStyles = makeStyles(theme => ({ mainPaper: { flex: 1, padding: theme.spacing(1), overflowY: "scroll", ...theme.scrollbarStyles, }, customTableCell: { display: "flex", alignItems: "center", justifyContent: "center", }, tooltip: { backgroundColor: "#f5f5f9", color: "rgba(0, 0, 0, 0.87)", fontSize: theme.typography.pxToRem(14), border: "1px solid #dadde9", maxWidth: 450, }, tooltipPopper: { textAlign: "center", }, buttonProgress: { color: green[500], }, })); const CustomToolTip = ({ title, content, children }) => { const classes = useStyles(); return ( {title} {content && {content}} } > {children} ); }; const Connections = () => { //-------- const { user } = useContext(AuthContext); const classes = useStyles(); const { whatsApps, loading } = useContext(WhatsAppsContext); const [whatsAppModalOpen, setWhatsAppModalOpen] = useState(false); const [qrModalOpen, setQrModalOpen] = useState(false); const [selectedWhatsApp, setSelectedWhatsApp] = useState(null); const [confirmModalOpen, setConfirmModalOpen] = useState(false); const confirmationModalInitialState = { action: "", title: "", message: "", whatsAppId: "", open: false, }; const [confirmModalInfo, setConfirmModalInfo] = useState( confirmationModalInitialState ); const handleStartWhatsAppSession = async whatsAppId => { try { await api.post(`/whatsappsession/${whatsAppId}`); } catch (err) { toastError(err); } }; const handleRequestNewQrCode = async whatsAppId => { try { await api.put(`/whatsappsession/${whatsAppId}`); } catch (err) { toastError(err); } }; const handleOpenWhatsAppModal = () => { setSelectedWhatsApp(null); setWhatsAppModalOpen(true); }; const handleCloseWhatsAppModal = useCallback(() => { setWhatsAppModalOpen(false); setSelectedWhatsApp(null); }, [setSelectedWhatsApp, setWhatsAppModalOpen]); const handleOpenQrModal = whatsApp => { setSelectedWhatsApp(whatsApp); setQrModalOpen(true); }; const handleCloseQrModal = useCallback(() => { setSelectedWhatsApp(null); setQrModalOpen(false); }, [setQrModalOpen, setSelectedWhatsApp]); const handleEditWhatsApp = whatsApp => { setSelectedWhatsApp(whatsApp); setWhatsAppModalOpen(true); }; const handleOpenConfirmationModal = (action, whatsAppId) => { if (action === "disconnect") { setConfirmModalInfo({ action: action, title: i18n.t("connections.confirmationModal.disconnectTitle"), message: i18n.t("connections.confirmationModal.disconnectMessage"), whatsAppId: whatsAppId, }); } if (action === "delete") { setConfirmModalInfo({ action: action, title: i18n.t("connections.confirmationModal.deleteTitle"), message: i18n.t("connections.confirmationModal.deleteMessage"), whatsAppId: whatsAppId, }); } setConfirmModalOpen(true); }; const handleSubmitConfirmationModal = async () => { if (confirmModalInfo.action === "disconnect") { try { await api.delete(`/whatsappsession/${confirmModalInfo.whatsAppId}`); } catch (err) { toastError(err); } } if (confirmModalInfo.action === "delete") { try { await api.delete(`/whatsapp/${confirmModalInfo.whatsAppId}`); toast.success(i18n.t("connections.toasts.deleted")); } catch (err) { toastError(err); } } setConfirmModalInfo(confirmationModalInitialState); }; const renderActionButtons = whatsApp => { return ( ( <> {whatsApp.status === "qrcode" && ( )} {whatsApp.status === "DISCONNECTED" && ( <> {" "} )} {(whatsApp.status === "CONNECTED" || whatsApp.status === "PAIRING" || whatsApp.status === "TIMEOUT") && ( )} {whatsApp.status === "OPENING" && ( )} )} /> ); }; const renderStatusToolTips = whatsApp => { return (
{whatsApp.status === "DISCONNECTED" && ( )} {whatsApp.status === "OPENING" && ( )} {whatsApp.status === "qrcode" && ( )} {whatsApp.status === "CONNECTED" && ( )} {(whatsApp.status === "TIMEOUT" || whatsApp.status === "PAIRING") && ( )}
); }; return ( ( {confirmModalInfo.message} {i18n.t("connections.title")} ( )} /> {i18n.t("connections.table.name")} {i18n.t("connections.table.status")} ( {i18n.t("connections.table.session")} )} /> {i18n.t("connections.table.lastUpdate")} {i18n.t("connections.table.default")} {i18n.t("connections.table.actions")} {loading ? ( ) : ( <> {whatsApps?.length > 0 && whatsApps.map(whatsApp => ( {whatsApp.name} {renderStatusToolTips(whatsApp)} ( {renderActionButtons(whatsApp)} )} /> {format(parseISO(whatsApp.updatedAt), "dd/MM/yy HH:mm")} {whatsApp.isDefault && (
)}
handleEditWhatsApp(whatsApp)} > ( { handleOpenConfirmationModal("delete", whatsApp.id); }} > )} />
))} )}
)} /> ); }; export default Connections;