import { ContentCopyRounded } from "@mui/icons-material"; import { alpha, Box, Button, IconButton } from "@mui/material"; import { writeText } from "@tauri-apps/plugin-clipboard-manager"; import type { Ref } from "react"; import { useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; import useSWR from "swr"; import { BaseDialog, DialogRef } from "@/components/base"; import { getNetworkInterfacesInfo } from "@/services/cmds"; import { showNotice } from "@/services/notice-service"; export function NetworkInterfaceViewer({ ref }: { ref?: Ref }) { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [isV4, setIsV4] = useState(true); useImperativeHandle(ref, () => ({ open: () => { setOpen(true); }, close: () => setOpen(false), })); const { data: networkInterfaces } = useSWR( "clash-verge-rev-internal://network-interfaces", getNetworkInterfacesInfo, { fallbackData: [], // default data before fetch }, ); return ( {t("settings.modals.networkInterface.title")} } contentSx={{ width: 450 }} disableOk cancelBtn={t("shared.actions.close")} onClose={() => setOpen(false)} onCancel={() => setOpen(false)} > {networkInterfaces.map((item) => (

{item.name}

{isV4 && ( <> {item.addr.map( (address) => address.V4 && ( ), )} )} {!isV4 && ( <> {item.addr.map( (address) => address.V6 && ( ), )} )}
))}
); } const AddressDisplay = ({ label, content, }: { label: string; content: string; }) => { return ( {label} ({ borderRadius: "8px", padding: "2px 2px 2px 8px", background: palette.mode === "dark" ? alpha(palette.background.paper, 0.3) : alpha(palette.grey[400], 0.3), })} > {content} { await writeText(content); showNotice.success( "shared.feedback.notifications.common.copySuccess", ); }} > ); };