import React, { useMemo } from 'react'; import { useSignalVisualRailHeight } from '../../hooks/useSignalVisualRailHeight'; import type { TrendSearchConditionDto } from '../../utils/trendSearchApi'; import { computeMatchRate, getTrafficLightState } from '../../utils/virtualSignalMetrics'; import { buildTrendSearchMetrics } from '../../utils/trendSearchMetrics'; import VirtualSignalEqualizer from '../virtual/VirtualSignalEqualizer'; import VirtualConditionList from '../virtual/VirtualConditionList'; import VirtualSignalTrafficLight from '../virtual/VirtualSignalTrafficLight'; import VirtualIndicatorCompareTable from '../virtual/VirtualIndicatorCompareTable'; interface Props { conditions: TrendSearchConditionDto[]; matchRate: number; matchedCount: number; totalConditions: number; updatedAt?: number; } const TrendSearchCardSignalPanel: React.FC = ({ conditions, matchRate, matchedCount, totalConditions, updatedAt, }) => { const metrics = useMemo(() => buildTrendSearchMetrics(conditions), [conditions]); const resolvedMatch = useMemo( () => computeMatchRate(metrics, matchRate), [metrics, matchRate], ); const trafficState = useMemo( () => getTrafficLightState(resolvedMatch, metrics), [resolvedMatch, metrics], ); const { visualRef, lightRef } = useSignalVisualRailHeight([ conditions.length, resolvedMatch, trafficState, ]); if (conditions.length === 0) { return

조건 데이터 없음

; } const updatedLabel = updatedAt ? new Date(updatedAt).toLocaleTimeString('ko-KR', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false, }) : '—'; return (
SIGNAL INTELLIGENCE & MATCH RATES
갱신 {updatedLabel} {matchedCount}/{totalConditions} 조건 · 일치율 {resolvedMatch}%
); }; export default TrendSearchCardSignalPanel;