import { memo, useCallback } from 'react'; import type { PromotionContext, PromotionPiece, PieceSet, PromotionVisuals } from '../types'; import { CachedPieceImg } from '../hooks/usePieceCache'; import { resolvePieceImageSrc } from '../defaultPieces'; const PROMO_PIECES: readonly PromotionPiece[] = ['q', 'r', 'b', 'n']; const PROMO_LABELS: Record = { q: 'Queen', r: 'Rook', b: 'Bishop', n: 'Knight', }; interface PromotionDialogProps { promotion: PromotionContext; pieceSet?: PieceSet; flipPieces?: boolean; visuals?: Partial; onSelect: (piece: PromotionPiece) => void; onDismiss: () => void; } export const PromotionDialog = memo(function PromotionDialog({ promotion, pieceSet, flipPieces = false, visuals = {}, onSelect, onDismiss, }: PromotionDialogProps) { const piecePath = pieceSet?.path; const panelRadius = visuals.panelRadius || '10px'; const optionRadius = visuals.optionRadius || '8px'; const renderPiece = useCallback( (color: 'w' | 'b', piece: PromotionPiece) => { const key = `${color}${piece.toUpperCase()}`; const src = resolvePieceImageSrc(key, piecePath); return ; }, [piecePath], ); return (
e.stopPropagation()} onTouchStart={(e) => e.stopPropagation()} onClick={onDismiss} >
e.stopPropagation()} style={{ backgroundColor: visuals.panelColor || 'rgba(248, 244, 236, 0.98)', borderRadius: panelRadius, padding: '16px 18px', display: 'flex', flexDirection: 'column', gap: '12px', minWidth: '220px', boxShadow: visuals.panelShadow || '0 18px 40px rgba(0, 0, 0, 0.25)', border: `1px solid ${visuals.panelBorderColor || 'rgba(139, 107, 74, 0.25)'}`, }} > Select promotion piece
{PROMO_PIECES.map((piece) => ( ))}
); });