import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import CitySelectModal, { REGIONS } from './CitySelectModal'; import { useOverlayClose } from '../hooks/useOverlayClose'; interface BusinessNameInputModalProps { onClose: () => void; onSubmit: (businessName: string, address: string, category: string, officialSiteUrl: string) => void; } const BusinessNameInputModal: React.FC = ({ onClose, onSubmit }) => { const { t } = useTranslation(); const [businessName, setBusinessName] = useState(''); const [selectedCity, setSelectedCity] = useState(''); const [detailAddress, setDetailAddress] = useState(''); const [category, setCategory] = useState(''); const [officialSiteUrl, setOfficialSiteUrl] = useState(''); const [isCityModalOpen, setIsCityModalOpen] = useState(false); const overlayCloseHandlers = useOverlayClose(onClose); useEffect(() => { document.body.style.overflow = 'hidden'; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', handleKeyDown); return () => { document.body.style.overflow = ''; document.removeEventListener('keydown', handleKeyDown); }; }, [onClose]); const handleCitySelect = (city: string) => { const region = REGIONS.find(r => r.cities.includes(city)); // 특별시/광역시는 도 이름 없이 도시명만 사용 const prefix = region && region.label !== '특별시 / 광역시' ? `${region.label} ` : ''; setSelectedCity(`${prefix}${city}`); }; const isValid = businessName.trim().length > 0 && selectedCity.length > 0 && detailAddress.trim().length > 0; const handleSubmit = () => { if (!isValid) return; const fullAddress = `${selectedCity} ${detailAddress.trim()}`; // 프로토콜 없이 입력하면 https:// 를 붙여서 전달 const trimmedUrl = officialSiteUrl.trim(); const normalizedUrl = trimmedUrl && !/^https?:\/\//i.test(trimmedUrl) ? `https://${trimmedUrl}` : trimmedUrl; onSubmit(businessName.trim(), fullAddress, category.trim(), normalizedUrl); onClose(); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && isValid) handleSubmit(); }; // CitySelectModal의 selected prop용 — 도시명만 추출 const cityOnly = selectedCity.split(' ').pop() ?? ''; return createPortal( <>
e.stopPropagation()}>
{t('landing.hero.manualModalTitle')}

{t('landing.hero.manualModalSubtitle')}

setBusinessName(e.target.value)} onKeyDown={handleKeyDown} maxLength={50} autoFocus />
setDetailAddress(e.target.value)} onKeyDown={handleKeyDown} maxLength={100} />
setCategory(e.target.value)} onKeyDown={handleKeyDown} maxLength={30} />
setOfficialSiteUrl(e.target.value)} onKeyDown={handleKeyDown} maxLength={2048} />
{isCityModalOpen && ( { handleCitySelect(city); setIsCityModalOpen(false); }} onClose={() => setIsCityModalOpen(false)} /> )} , document.body ); }; export default BusinessNameInputModal;