'use client' import { memo, useState, useCallback } from 'react' import { Handle, Position } from '@xyflow/react' import type { NodeProps } from '@xyflow/react' import type { ThresholdNodeData } from '@/lib/types' function ThresholdNode({ data, selected }: NodeProps) { const nodeData = data as ThresholdNodeData const [minThreshold, setMinThreshold] = useState(nodeData.minThreshold) const [maxThreshold, setMaxThreshold] = useState(nodeData.maxThreshold) const currentValue = nodeData.currentValue // Calculate status const getStatus = () => { if (currentValue < minThreshold) return { label: 'Below Min', color: 'red', bg: 'bg-red-500' } if (currentValue > maxThreshold) return { label: 'Overflow', color: 'amber', bg: 'bg-amber-500' } return { label: 'Active', color: 'green', bg: 'bg-emerald-500' } } const status = getStatus() const fillPercent = Math.min(100, Math.max(0, ((currentValue - minThreshold) / (maxThreshold - minThreshold)) * 100)) return (
{/* Input Handle */} {/* Header */}
{nodeData.label}
{status.label}
{/* Body */}
{/* Current Value Display */}
${currentValue.toLocaleString()}

Current Value

{/* Visual Bar */}
{/* Fill */}
maxThreshold ? 'bg-amber-400' : 'bg-emerald-400' }`} style={{ width: currentValue < minThreshold ? `${(currentValue / minThreshold) * 33}%` : currentValue > maxThreshold ? '100%' : `${33 + fillPercent * 0.67}%` }} /> {/* Min marker */}
{/* Max marker */}
$0 Min Max
{/* Threshold Controls */}
${minThreshold.toLocaleString()}
setMinThreshold(Number(e.target.value))} className="w-full h-2 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-red-500" />
${maxThreshold.toLocaleString()}
setMaxThreshold(Number(e.target.value))} className="w-full h-2 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-amber-500" />
{/* Output Handle */}
) } export default memo(ThresholdNode)