import { useState } from 'react' import { useNavigate } from 'react-router-dom' import { motion } from 'framer-motion' import { useTranslation } from 'react-i18next' import { Flower2, MapPin, Truck, Store as StoreIcon, Star, ArrowRight } from 'lucide-react' import { zoneLookup } from '../api/client' import { useShop } from '../store/shop' import { PetalLayer, Pressable } from './components/motion' import { BRAND } from './brand' import LanguageSwitcher from '../i18n/LanguageSwitcher' // Floom 패턴: 진입 즉시 ZIP 입력 → 배송 가능 매장 필터링 export default function ZipGate() { const { t } = useTranslation() const [zip, setZip] = useState('') const [result, setResult] = useState(null) const [loading, setLoading] = useState(false) const [err, setErr] = useState('') const { setZone } = useShop() const nav = useNavigate() const lookup = async (e: React.FormEvent) => { e.preventDefault(); setErr(''); setResult(null) if (!/^\d{5}$/.test(zip)) { setErr(t('zip.errInvalid')); return } setLoading(true) try { const r = await zoneLookup(zip) setResult(r) if (!r?.deliverable) setErr(t('zip.errNotDeliverable')) } catch { setErr(t('zip.errFailed')) } finally { setLoading(false) } } const choose = (s: any) => { setZone(zip, s.storeId, s.storeName); nav('/home') } return (
{/* 배경 보태니컬 글로우 */}

Montvale Florist

{t('zip.since', { year: BRAND.founded })}

{BRAND.tagline}

{t('zip.lead')}

setZip(e.target.value.replace(/\D/g, '').slice(0, 5))} placeholder={t('zip.placeholder')} inputMode="numeric" autoFocus className="flex-1 px-4 py-3.5 rounded-2xl bg-blush-50 border border-blush-100 text-center text-lg tracking-[0.3em] outline-none focus:border-blush-400 transition-colors" /> {loading ? '…' : <>{t('zip.go')} }
{err &&

{err}

} {result?.deliverable && (
{t('zip.availableStores')}
{(result.stores || []).map((s: any) => ( choose(s)} className="w-full flex items-center justify-between bg-blush-50 hover:bg-blush-100 border border-blush-100 rounded-2xl px-4 py-3.5 text-left"> {s.storeName} {t('zip.radiusSameDay', { radius: s.radiusMi, cutoff: s.sameDayCutoff, tz: s.timezone })} ))}
)}
{[1, 2, 3, 4, 5].map(i => )} {BRAND.rating}★ · {t('zip.reviews', { n: BRAND.reviewCount.toLocaleString() })}
) }