import React, { useState, useRef, useCallback } from 'react'; import { searchNaverLocal, NaverLocalSearchItem, AutocompleteRequest } from '../../utils/api'; type SearchType = 'url' | 'name'; interface UrlInputContentProps { onAnalyze: (value: string, type?: SearchType) => void; onAutocomplete?: (data: AutocompleteRequest) => void; error: string | null; } const UrlInputContent: React.FC = ({ onAnalyze, onAutocomplete, error }) => { const [inputValue, setInputValue] = useState(''); const [searchType, setSearchType] = useState('url'); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [autocompleteResults, setAutocompleteResults] = useState([]); const [isAutocompleteLoading, setIsAutocompleteLoading] = useState(false); const [showAutocomplete, setShowAutocomplete] = useState(false); const debounceRef = useRef(null); const autocompleteRef = useRef(null); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (inputValue.trim()) { onAnalyze(inputValue.trim(), searchType); } }; const searchTypeOptions = [ { value: 'url' as SearchType, label: 'URL' }, { value: 'name' as SearchType, label: '업체명' }, ]; const getPlaceholder = () => { return searchType === 'url' ? 'https://www.castad.com' : '업체명을 입력하세요'; }; const getGuideText = () => { return searchType === 'url' ? 'URL에서 가져온 정보로 영상이 자동 생성됩니다.' : '업체명으로 검색하여 정보를 가져옵니다.'; }; // 업체명 검색 시 자동완성 (디바운스 적용) const handleAutocompleteSearch = useCallback(async (query: string) => { if (!query.trim() || searchType !== 'name') { setAutocompleteResults([]); setShowAutocomplete(false); return; } setIsAutocompleteLoading(true); try { const response = await searchNaverLocal(query); setAutocompleteResults(response.items || []); setShowAutocomplete(response.items && response.items.length > 0); } catch (error) { console.error('자동완성 검색 오류:', error); setAutocompleteResults([]); setShowAutocomplete(false); } finally { setIsAutocompleteLoading(false); } }, [searchType]); // 자동완성 항목 선택 const handleSelectAutocomplete = (item: NaverLocalSearchItem) => { const request: AutocompleteRequest = { address: item.address, roadAddress: item.roadAddress, title: item.title, }; setInputValue(item.title.replace(/<[^>]*>/g, '')); // HTML 태그 제거 setShowAutocomplete(false); setAutocompleteResults([]); if (onAutocomplete) { onAutocomplete(request); } }; return (
{/* 로고 */}
ADO2
{/* URL 입력 폼 */}
{/* 드롭다운 */}
{isDropdownOpen && (
{searchTypeOptions.map((option) => ( ))}
)}
{/* 입력 필드 */}
{ const value = e.target.value; setInputValue(value); // 업체명 검색일 때 자동완성 검색 (디바운스) if (searchType === 'name') { if (debounceRef.current) { clearTimeout(debounceRef.current); } debounceRef.current = setTimeout(() => { handleAutocompleteSearch(value); }, 300); } }} onFocus={() => { if (searchType === 'name' && autocompleteResults.length > 0) { setShowAutocomplete(true); } }} placeholder={getPlaceholder()} className="url-input-field" /> {/* 자동완성 결과 */} {showAutocomplete && searchType === 'name' && (
{isAutocompleteLoading ? (
검색 중...
) : ( autocompleteResults.map((item, index) => ( )) )}
)}
{/* 에러 메시지 */} {error && (

{error}

)}
{/* 안내 텍스트 */}

{getGuideText()}

); }; export default UrlInputContent;