import { type PointerEvent, type SyntheticEvent, type RefObject, } from "react"; import { ArrowLeft, Share2, Download, MapPin, ShoppingCart, RefreshCw, RotateCcw, Paintbrush, Loader2, } from "lucide-react"; import type { Product } from "../../types"; import type { SegmentMeta } from "../../hooks/useSegmentCanvas"; interface RoomPreviewPanelProps { previewImage?: string | null; offset: { x: number; y: number }; zoom: number; imageSize: { width: number; height: number }; wrapperRef: RefObject; canvasRef: RefObject; selectedProduct: Product | null; selectedMasks: Set; hoveredMask: number; segmentMeta: Map; isApplying: boolean; onBack: () => void; onPointerDown: (event: PointerEvent) => void; onPointerMove: (event: PointerEvent) => void; onPointerUp: (event: PointerEvent) => void; updateImageSize: (img: HTMLImageElement) => void; onCanvasMouseMove: (e: React.MouseEvent) => void; onCanvasMouseLeave: () => void; onCanvasClick: (e: React.MouseEvent) => void; onApplyTexture: () => void; onReset: () => void; onDownload: () => Promise; onShare: () => Promise; } export function RoomPreviewPanel({ previewImage, offset, zoom, imageSize, wrapperRef, canvasRef, selectedProduct, selectedMasks, hoveredMask, segmentMeta, isApplying, onBack, onPointerDown, onPointerMove, onPointerUp, updateImageSize, onCanvasMouseMove, onCanvasMouseLeave, onCanvasClick, onApplyTexture, onReset, onDownload, onShare, }: RoomPreviewPanelProps) { const canApply = selectedMasks.size > 0 && selectedProduct != null; const getLabel = (index: number) => segmentMeta.get(index)?.label ?? `Zona ${index}`; return (
{/* ── Mobile top bar ───────────────────────────────────────── */} {/* pr-12 reserva espacio a la derecha para el botón .hr-close del padre */}
{/* ── Desktop top bar ──────────────────────────────────────── */}
| Encuentra tu tienda {selectedProduct?.detailUrl ? ( Ir a la página del producto ) : ( )}
{/* ── Área de imagen + canvas ──────────────────────────────── */}
{previewImage ? (
0 ? { width: imageSize.width, height: imageSize.height } : {}), }} > Vista previa de la habitación e.preventDefault()} onLoad={(event: SyntheticEvent) => updateImageSize(event.currentTarget) } style={{ display: "block", width: imageSize.width > 0 ? "100%" : "auto", height: imageSize.height > 0 ? "100%" : "auto", maxWidth: imageSize.width > 0 ? "none" : "100%", maxHeight: imageSize.height > 0 ? "none" : "100%", objectFit: "contain", }} />
) : (
No hay vista previa disponible aún.
)}
{/* ── Hint de selección ────────────────────────────────────── */} {previewImage && selectedMasks.size === 0 && (
{hoveredMask > 0 ? `${getLabel(hoveredMask)} — haz clic para seleccionar` : "Haz clic sobre una zona de la imagen para seleccionarla"}
)} {/* ── Mobile bottom bar ────────────────────────────────────── */}
{selectedProduct && (
{selectedProduct.name}

{selectedProduct.brand}

{selectedProduct.name}

)} {!selectedProduct && selectedMasks.size > 0 && (

{[...selectedMasks].map(getLabel).join(", ")}

)} {!selectedProduct && selectedMasks.size === 0 &&
}
{canApply && ( )}
{/* ── Desktop bottom bar ───────────────────────────────────── */}
{selectedProduct && (
{selectedProduct.name}

{selectedProduct.brand}

{selectedProduct.name}

)} {selectedMasks.size > 0 && (

{[...selectedMasks].map(getLabel).join(", ")}

)}
{canApply && ( )}
); }