import dayjs from "dayjs"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useLockFn } from "ahooks"; import { Box, Button, Snackbar } from "@mui/material"; import { deleteConnection } from "@/services/api"; import parseTraffic from "@/utils/parse-traffic"; import { t } from "i18next"; export interface ConnectionDetailRef { open: (detail: IConnectionsItem) => void; } export const ConnectionDetail = forwardRef( (props, ref) => { const [open, setOpen] = useState(false); const [detail, setDetail] = useState(null!); useImperativeHandle(ref, () => ({ open: (detail: IConnectionsItem) => { if (open) return; setOpen(true); setDetail(detail); }, })); const onClose = () => setOpen(false); return ( ) : null } /> ); }, ); interface InnerProps { data: IConnectionsItem; onClose?: () => void; } const InnerConnectionDetail = ({ data, onClose }: InnerProps) => { const { metadata, rulePayload } = data; const chains = [...data.chains].reverse().join(" / "); const rule = rulePayload ? `${data.rule}(${rulePayload})` : data.rule; const host = metadata.host ? `${metadata.host}:${metadata.remoteDestination}` : `${metadata.remoteDestination}:${metadata.destinationPort}`; const information = [ { label: t("Host"), value: host }, { label: t("Downloaded"), value: parseTraffic(data.download).join(" ") }, { label: t("Uploaded"), value: parseTraffic(data.upload).join(" ") }, { label: t("DL Speed"), value: parseTraffic(data.curDownload ?? -1).join(" ") + "/s", }, { label: t("UL Speed"), value: parseTraffic(data.curUpload ?? -1).join(" ") + "/s", }, { label: t("Chains"), value: chains }, { label: t("Rule"), value: rule }, { label: t("Process"), value: `${metadata.process}${ metadata.processPath ? `(${metadata.processPath})` : "" }`, }, { label: t("Time"), value: dayjs(data.start).fromNow() }, { label: t("Source"), value: `${metadata.sourceIP}:${metadata.sourcePort}`, }, { label: t("Destination"), value: metadata.remoteDestination }, { label: t("DestinationPort"), value: `${metadata.destinationPort}` }, { label: t("Type"), value: `${metadata.type}(${metadata.network})` }, ]; const onDelete = useLockFn(async () => deleteConnection(data.id)); return ( {information.map((each) => (
{each.label}: {each.value}
))}
); };