import { ContentCopyRounded } from '@mui/icons-material' import { alpha, Box, Button, CircularProgress, 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 { BaseDialog, BaseEmpty, DialogRef } from '@/components/base' import { useNetworkInterfaces } from '@/hooks/use-network' 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 { networkInterfaces, loading } = useNetworkInterfaces() const isEmpty = networkInterfaces.length === 0 const getAddressIp = (address: IAddress) => isV4 ? address.V4?.ip : address.V6?.ip return ( {t('settings.modals.networkInterface.title')} } contentSx={{ width: 450 }} disableOk cancelBtn={t('shared.actions.close')} onClose={() => setOpen(false)} onCancel={() => setOpen(false)} > {loading && isEmpty ? ( ) : isEmpty ? ( ) : ( networkInterfaces.map((item) => (

{item.name}

{item.addr.map((address) => { const ip = getAddressIp(address) return ( ip && ( ) ) })}
)) )}
) } 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', ) }} > ) }