import { useEffect, useState } from 'react'; import type { ChangeEvent, KeyboardEvent } from 'react'; import { parseMileageQuery } from '../../utils/mileage'; import styles from './PlaybackControls.module.scss'; interface PlaybackControlsProps { playing: boolean; onTogglePlay: () => void; onStop: () => void; onCapture: () => void; /** 측점 검색: 이동했으면 true, 이 영상에 없는 측점이라 이동 못 했으면 false. */ onJumpToMileage: (mileage: number) => boolean; /** 측점선 토글을 외부 상태로 제어할 때 사용(미지정 시 내부 상태). */ lineOn?: boolean; onToggleLine?: () => void; } export function PlaybackControls({ playing, onTogglePlay, onStop, onCapture, onJumpToMileage, lineOn: lineOnProp, onToggleLine, }: PlaybackControlsProps) { const [query, setQuery] = useState(''); const [notFound, setNotFound] = useState(false); const [lineOnInternal, setLineOnInternal] = useState(false); const lineOn = lineOnProp ?? lineOnInternal; const toggleLine = onToggleLine ?? (() => setLineOnInternal((v) => !v)); // '측점 없음' 안내는 잠깐만 표시(1.8초 후 자동 사라짐). useEffect(() => { if (!notFound) return; const t = setTimeout(() => setNotFound(false), 1800); return () => clearTimeout(t); }, [notFound]); const handleQueryChange = (e: ChangeEvent): void => { setQuery(e.target.value); setNotFound(false); // 다시 입력하면 안내 숨김 }; const handleQueryKeyDown = (e: KeyboardEvent): void => { if (e.key !== 'Enter') return; const mileage = parseMileageQuery(query); // Enter 후에도 입력값 유지 → 같은 측점 재Enter 시 통과방향 다음 위치로 순환 검색. // 이 영상에 없는 측점(이동 실패) 또는 형식 오류면 '측점 없음' 안내를 잠깐 띄운다. const moved = mileage !== null ? onJumpToMileage(mileage) : false; setNotFound(!moved); }; // 포커스를 잃으면(다른 곳 클릭 등) 입력값 삭제. const handleQueryBlur = (): void => { setQuery(''); setNotFound(false); }; return (
{notFound && ( ⚠ 측점 없음 )}
); }