import { Button, Card, Dropdown, Popconfirm, Space, Spin, Modal } from 'antd'; import dayjs from 'dayjs'; import React, { useState } from 'react'; import { defaultErrorHandler, defaultSuccessHandler, trpc, } from '../../api/trpc'; import { useCurrentWorkspaceId } from '../../store/user'; import { Loading } from '../Loading'; import { getMonitorLink } from './provider'; import { NotFoundTip } from '../NotFoundTip'; import { MonitorInfo as MonitorInfoType } from '../../../types'; import { MonitorHealthBar } from './MonitorHealthBar'; import { last } from 'lodash-es'; import { ColorTag } from '../ColorTag'; import { useNavigate } from 'react-router'; import { MonitorEventList } from './MonitorEventList'; import { useEvent } from '../../hooks/useEvent'; import { MonitorDataMetrics } from './MonitorDataMetrics'; import { MonitorDataChart } from './MonitorDataChart'; import { DeleteOutlined, MoreOutlined } from '@ant-design/icons'; import { MonitorBadgeView } from './MonitorBadgeView'; interface MonitorInfoProps { monitorId: string; } export const MonitorInfo: React.FC = React.memo((props) => { const workspaceId = useCurrentWorkspaceId(); const { monitorId } = props; const [currectResponse, setCurrentResponse] = useState(0); const navigate = useNavigate(); const [showBadge, setShowBadge] = useState(false); const { data: monitorInfo, isInitialLoading, isLoading, } = trpc.monitor.get.useQuery({ workspaceId, monitorId, }); const changeActiveMutation = trpc.monitor.changeActive.useMutation({ onSuccess: defaultSuccessHandler, onError: defaultErrorHandler, }); const deleteMutation = trpc.monitor.delete.useMutation({ onSuccess: defaultSuccessHandler, onError: defaultErrorHandler, }); const clearEventsMutation = trpc.monitor.clearEvents.useMutation({ onSuccess: defaultSuccessHandler, onError: defaultErrorHandler, }); const clearDataMutation = trpc.monitor.clearData.useMutation({ onSuccess: defaultSuccessHandler, onError: defaultErrorHandler, }); const trpcUtils = trpc.useContext(); const handleStart = useEvent(async () => { await changeActiveMutation.mutateAsync({ workspaceId, monitorId, active: true, }); trpcUtils.monitor.get.refetch({ workspaceId, monitorId, }); trpcUtils.monitor.events.refetch({ workspaceId, monitorId, }); }); const handleStop = useEvent(async () => { await changeActiveMutation.mutateAsync({ workspaceId, monitorId, active: false, }); trpcUtils.monitor.get.refetch({ workspaceId, monitorId, }); trpcUtils.monitor.events.refetch({ workspaceId, monitorId, }); }); const handleDelete = useEvent(async () => { Modal.confirm({ title: 'Warning', content: 'Did you sure delete this monitor?', okButtonProps: { danger: true, }, onOk: async () => { await deleteMutation.mutateAsync({ workspaceId, monitorId, }); await trpcUtils.monitor.all.refetch(); navigate('/monitor', { replace: true, }); }, }); }); const handleClearEvents = useEvent(() => { Modal.confirm({ title: 'Warning', content: 'Are you sure want to delete all events for this monitor?', okButtonProps: { danger: true, }, onOk: async () => { await clearEventsMutation.mutateAsync({ workspaceId, monitorId, }); trpcUtils.monitor.events.refetch({ workspaceId, monitorId, }); }, }); }); const handleClearData = useEvent(() => { Modal.confirm({ title: 'Warning', content: 'Are you sure want to delete all heartbeats for this monitor?', okButtonProps: { danger: true, }, onOk: async () => { await clearDataMutation.mutateAsync({ workspaceId, monitorId, }); trpcUtils.monitor.data.reset(); trpcUtils.monitor.recentData.reset(); }, }); }); if (isInitialLoading) { return ; } if (!monitorInfo) { return ; } return (
{monitorInfo.name} {monitorInfo.active === false && (
Stopped
)}
{getMonitorLink(monitorInfo as any as MonitorInfoType)}
Monitored for {dayjs().diff(dayjs(monitorInfo.createdAt), 'days')}{' '} days
{monitorInfo.active ? ( ) : ( )} setShowBadge(true), }, { type: 'divider', }, { key: 'delete', label: 'Delete', danger: true, onClick: handleDelete, }, ], }} >
{ setCurrentResponse(last(items)?.value ?? 0); }} />
); }); MonitorInfo.displayName = 'MonitorInfo';