import { Fragment } from 'react'; import type { ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Tag, Tooltip } from 'antd'; import { ApiOutlined, ArrowUpOutlined, AreaChartOutlined, BarsOutlined, CloudDownloadOutlined, CloudServerOutlined, ControlOutlined, FileTextOutlined, PoweroffOutlined, ReloadOutlined, } from '@ant-design/icons'; import { formatPanelVersion } from '@/lib/panel-version'; import type { Status } from '@/models/status'; interface OverviewActionBarProps { status: Status; isMobile: boolean; accessLogEnable: boolean; panelVersion: string; latestVersion: string; updateAvailable: boolean; onStopXray: () => void; onRestartXray: () => void; onOpenLogs: () => void; onOpenXrayLogs: () => void; onOpenAmneziaWGLogs: () => void; onOpenConfig: () => void; onOpenBackup: () => void; onOpenSystemHistory: () => void; onOpenXrayMetrics: () => void; onOpenPanelUpdate: () => void; onOpenVersionSwitch: () => void; } interface BarAction { key: string; icon: ReactNode; text: string; onClick: () => void; primary?: boolean; } const XRAY_STATE_KEYS: Record = { running: 'pages.index.xrayStatusRunning', stop: 'pages.index.xrayStatusStop', error: 'pages.index.xrayStatusError', }; export default function OverviewActionBar({ status, isMobile, accessLogEnable, panelVersion, latestVersion, updateAvailable, onStopXray, onRestartXray, onOpenLogs, onOpenXrayLogs, onOpenAmneziaWGLogs, onOpenConfig, onOpenBackup, onOpenSystemHistory, onOpenXrayMetrics, onOpenPanelUpdate, onOpenVersionSwitch, }: OverviewActionBarProps) { const { t } = useTranslation(); const stateText = t(XRAY_STATE_KEYS[status.xray.state] ?? 'pages.index.xrayStatusUnknown'); const hasVersion = !!status.xray.version && status.xray.version !== 'Unknown'; const size = isMobile ? ('small' as const) : ('middle' as const); const actionGroups: BarAction[][] = [ [ { key: 'restart', icon: , text: t('pages.index.restartXray'), onClick: onRestartXray, primary: true, }, { key: 'stop', icon: , text: t('pages.index.stopXray'), onClick: onStopXray, }, ], [ { key: 'logs', icon: , text: t('pages.index.logs'), onClick: onOpenLogs }, ...(accessLogEnable ? [ { key: 'accessLogs', icon: , text: t('pages.index.accessLogs'), onClick: onOpenXrayLogs, }, ] : []), ...(status.amneziawg.configured ? [ { key: 'amneziawgLogs', icon: , text: t('pages.index.amneziawgLogs'), onClick: onOpenAmneziaWGLogs, }, ] : []), { key: 'config', icon: , text: t('pages.index.config'), onClick: onOpenConfig, }, { key: 'backup', icon: , text: t('pages.index.backupTitle'), onClick: onOpenBackup, }, ], [ { key: 'history', icon: , text: t('pages.index.systemHistoryTitle'), onClick: onOpenSystemHistory, }, { key: 'metrics', icon: , text: t('pages.index.xrayMetricsTitle'), onClick: onOpenXrayMetrics, }, ], ]; const statePill = ( {`${t('pages.index.xrayStatus')} ยท ${stateText}`} {hasVersion && ( )} ); return (
{status.xray.state === 'error' && status.xray.errorMsg ? ( {status.xray.errorMsg}}> {statePill} ) : ( statePill )} {updateAvailable ? ( } onClick={onOpenPanelUpdate} > {`${t('update')} ${formatPanelVersion(latestVersion)}`} ) : ( )}
{actionGroups.map((group, groupIndex) => ( {groupIndex > 0 && } {group.map((action) => ( ))} ))}
); }