import * as React from 'react'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import ErrorIcon from '@mui/icons-material/Error'; import Skeleton from '@mui/material/Skeleton'; import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; import CardActionArea from '@mui/material/CardActionArea'; import CircularProgress from '@mui/material/CircularProgress'; import Stack from '@mui/material/Stack'; import { DateTime } from 'luxon'; import { useQueryClient } from '@tanstack/react-query'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import useDeleteConnection from 'hooks/useDeleteConnection'; import ConnectionContextMenu from 'components/AppConnectionContextMenu'; import useFormatMessage from 'hooks/useFormatMessage'; import { ConnectionPropType } from 'propTypes/propTypes'; import { CardContent, Typography } from './style'; import useConnectionFlows from 'hooks/useConnectionFlows'; import useTestConnection from 'hooks/useTestConnection'; const countTranslation = (value) => ( <> {value}
); function AppConnectionRow(props) { const formatMessage = useFormatMessage(); const enqueueSnackbar = useEnqueueSnackbar(); const { id, key, formattedData, verified, createdAt, reconnectable } = props.connection; const [verificationVisible, setVerificationVisible] = React.useState(false); const contextButtonRef = React.useRef(null); const [anchorEl, setAnchorEl] = React.useState(null); const queryClient = useQueryClient(); const { mutateAsync: deleteConnection } = useDeleteConnection(); const { mutate: testConnection, isPending: isTestConnectionPending } = useTestConnection( { connectionId: id }, { onSettled: () => { setTimeout(() => setVerificationVisible(false), 3000); }, }, ); const handleClose = () => { setAnchorEl(null); }; const { data, isLoading: isConnectionFlowsLoading } = useConnectionFlows({ connectionId: id, }); const flowCount = data?.meta?.count; const onContextMenuClick = () => setAnchorEl(contextButtonRef.current); const onContextMenuAction = React.useCallback( async (event, action) => { if (action.type === 'delete') { await deleteConnection(id); await queryClient.invalidateQueries({ queryKey: ['apps', key, 'connections'], }); enqueueSnackbar(formatMessage('connection.deletedMessage'), { variant: 'success', SnackbarProps: { 'data-test': 'snackbar-delete-connection-success', }, }); } else if (action.type === 'test') { setVerificationVisible(true); testConnection({ variables: { id } }); } }, [ deleteConnection, id, queryClient, key, enqueueSnackbar, formatMessage, testConnection, ], ); const relativeCreatedAt = DateTime.fromMillis( parseInt(createdAt, 10), ).toRelative(); return ( <> {formattedData?.screenName} {formatMessage('connection.addedAt', { datetime: relativeCreatedAt, })} {verificationVisible && isTestConnectionPending && ( <> {formatMessage('connection.testing')} )} {verificationVisible && !isTestConnectionPending && verified && ( <> {formatMessage('connection.testSuccessful')} )} {verificationVisible && !isTestConnectionPending && !verified && ( <> {formatMessage('connection.testFailed')} )} {formatMessage('connection.flowCount', { count: countTranslation( isConnectionFlowsLoading ? ( ) : ( flowCount ), ), })} {anchorEl && ( )} ); } AppConnectionRow.propTypes = { connection: ConnectionPropType.isRequired, }; export default AppConnectionRow;