import { createElement } from 'react' import { Handle, Position, type NodeProps, type Node } from '@xyflow/react' import { type LucideIcon } from 'lucide-react' import type { NodeData } from '@/types' import { resolveNodeColors } from '@/utils/nodeColors' import { resolveNodeIcon } from '@/utils/nodeIcons' import { useThemeStore } from '@/stores/themeStore' import { THEMES } from '@/utils/themes' import { useCanvasStore } from '@/stores/canvasStore' import { maskIp } from '@/utils/maskIp' interface BaseNodeProps extends NodeProps> { icon: LucideIcon } export function BaseNode({ data, selected, icon: typeIcon }: BaseNodeProps) { const activeTheme = useThemeStore((s) => s.activeTheme) const hideIp = useCanvasStore((s) => s.hideIp) const theme = THEMES[activeTheme] const resolvedIcon = resolveNodeIcon(typeIcon, data.custom_icon) const colors = resolveNodeColors(data, activeTheme) const statusColor = theme.colors.statusColors[data.status] const isOnline = data.status === 'online' return (
{/* Icon */}
{createElement(resolvedIcon, { size: 15 })}
{/* Details */}
{data.label}
{data.ip && (
{hideIp ? maskIp(data.ip) : data.ip}
)}
{/* Status dot */}
) }