'use client' import { useEffect, useMemo, useRef, useState } from 'react' import TaobaoImageGalleryModal from './TaobaoImageGalleryModal' import { TaobaoDetailSummary } from '@/lib/taobao-detail-plus' function extractItemId(value: string): string | null { const match = value.trim().match(/\d{8,20}/) return match ? match[0] : null } export default function HeaderTaobaoSearch() { const [keyword, setKeyword] = useState('') const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [result, setResult] = useState(null) const [isExpanded, setIsExpanded] = useState(false) const [isModalOpen, setIsModalOpen] = useState(false) const containerRef = useRef(null) const inputRef = useRef(null) const normalizedItemId = useMemo(() => extractItemId(keyword), [keyword]) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { // 如果没有正在加载,也没有结果展示,或者用户点击了很远的地方,则收起 if (!isLoading && !result && !error) { setIsExpanded(false) } } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, [isLoading, result, error]) // 当展开时,自动聚焦输入框 useEffect(() => { if (isExpanded) { setTimeout(() => inputRef.current?.focus(), 100) } }, [isExpanded]) const handleSearch = async (event?: React.FormEvent) => { event?.preventDefault() if (!normalizedItemId) { setError('请输入正确的商品ID') setResult(null) return } try { setIsLoading(true) setError(null) const response = await fetch(`/api/taobao-detail-plus?itemId=${encodeURIComponent(normalizedItemId)}`, { method: 'GET', cache: 'no-store', }) const payload = await response.json().catch(() => null) if (!response.ok || !payload?.success) { throw new Error(payload?.error?.message || '商品查询失败,请稍后再试') } setResult(payload.data) } catch (searchError) { setResult(null) setError(searchError instanceof Error ? searchError.message : '商品查询失败,请稍后再试') } finally { setIsLoading(false) } } const handleClear = () => { setKeyword('') setError(null) setResult(null) // 如果清空后失焦,考虑是否收起 } const showDropdown = isExpanded && (isLoading || error || result) return (
{/* 搜索容器:控制宽度动画 */}
{/* 点击触发图标 (在左侧保持固定) */} {/* 实际输入框:宽度随容器展开 */}
setKeyword(e.target.value)} onFocus={() => setIsExpanded(true)} placeholder="粘贴链接或商品ID" className="w-full border-none bg-transparent py-2.5 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-0 dark:text-gray-100 dark:placeholder:text-gray-500" />
{/* 清空按钮 */} {isExpanded && keyword && ( )}
{/* 搜索结果下拉面板 (仅在展开且有状态时显示) */} {showDropdown && (
{isLoading && (
)} {error && !isLoading && (
{error}
)} {result && !isLoading && (
{result.mainImageUrl ? ( // eslint-disable-next-line @next/next/no-img-element ) : (
)}
{result.title}
¥{result.price} · {result.shopName}
SKU 图片
{result.skuImages?.length || 0}
详情图片
{result.descImages?.length || 0}
)}
支持自动从商品链接中提取 ID
)} {/* 全量图片预览弹窗 */} {result && ( setIsModalOpen(false)} result={result} /> )}
) }