import React from 'react'; import { GeneratedAssets } from '../types'; import { Play, Clock, Music, Mic, Video, Image as ImageIcon, Download } from 'lucide-react'; /** * ResultList 컴포넌트의 Props 정의 * @interface ResultListProps * @property {GeneratedAssets[]} history - 생성된 에셋들의 배열 (기록) * @property {(asset: GeneratedAssets) => void} onSelect - 목록에서 에셋 선택 시 호출될 콜백 함수 * @property {string} [currentId] - 현재 선택된 에셋의 ID (선택 사항, UI에서 강조 표시용) */ interface ResultListProps { history: GeneratedAssets[]; onSelect: (asset: GeneratedAssets) => void; currentId?: string; } /** * 생성 기록 목록 컴포넌트 * 이전에 생성된 AI 광고 영상/포스터 목록을 보여주고, 클릭 시 해당 에셋을 다시 볼 수 있도록 합니다. */ const ResultList: React.FC = ({ history, onSelect, currentId }) => { // 파일 강제 다운로드 핸들러 const handleDirectDownload = async (e: React.MouseEvent, url: string, filename: string) => { e.stopPropagation(); e.preventDefault(); try { const response = await fetch(url); const blob = await response.blob(); const blobUrl = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = blobUrl; a.download = filename; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(blobUrl); a.remove(); } catch (err) { console.error("다운로드 실패:", err); window.open(url, '_blank'); } }; if (history.length === 0) return null; return (

생성 기록 (History)

{history.length}
{history.map((asset) => (
onSelect(asset)} className={`group relative bg-white/5 border rounded-2xl overflow-hidden cursor-pointer transition-all hover:scale-[1.02] hover:shadow-xl hover:shadow-purple-500/10 ${currentId === asset.id ? 'border-purple-500 ring-1 ring-purple-500 bg-white/10' : 'border-white/10 hover:border-purple-500/50'} `} > {/* 포스터 썸네일 */}
{asset.posterUrl ? ( {asset.businessName} { e.currentTarget.style.display = 'none'; // 이미지 숨김 e.currentTarget.nextElementSibling?.classList.remove('hidden'); // 대체 div 표시 (구조상 별도 처리 필요하지만 간단히 숨김 처리) // 부모 요소에 배경색이 있으므로 이미지가 숨겨지면 배경색이 보임. // 더 완벽하게 하려면 state로 관리해야 하나, 여기선 간단히 처리. }} /> ) : (
)} {/* 이미지 로드 실패 시 보여줄 폴백 (JS로 제어하기보다, 위 onError에서 이미지 숨기면 아래 배경이 보임) */}
{asset.audioMode === 'Song' ? (
) : (
)}
{asset.textEffect}
{/* 정보 영역 */}

{asset.businessName}

{asset.sourceUrl && ( e.stopPropagation()} className="text-xs text-blue-400 hover:underline truncate block mb-2 opacity-70 hover:opacity-100"> {asset.sourceUrl} )}
{/* 생성 날짜 및 시간 */} {new Date(asset.createdAt).toLocaleDateString()} {/* 장르 또는 비디오 타입 표시 */} {asset.audioMode === 'Song' ? ( <>{asset.musicGenre || 'Music'} ) : ( <> Narration )}
{/* 하단 버튼 영역 */}
{asset.finalVideoPath ? ( ) : null}
))}
); }; export default ResultList;