/** * This file is part of the SplendidBear Websites' projects. * * Copyright (c) 2026 @ www.splendidbear.org * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ import React, { memo, useMemo } from 'react'; import { IMAGES } from '@mine-utils'; import { func, shape, bool, number, string } from 'prop-types'; const bombSrc = area => { if (null === area) return null; const vert = ['left', 'center', 'right'][area[0]] ?? null; const hor = ['top', 'middle', 'bottom'][area[1]] ?? null; if (null === vert || null === hor) return IMAGES.bombEmpty; return IMAGES.bombPos(hor, vert); }; const GridField = memo(function GridField({ cell, onClick, onMouseEnter }) { const { currentImage, currentObj, active, lastClickedRed, lastClickedBlue, bombTargetArea } = cell; const fieldClass = 'field' + (active ? ' active' : '') + (active && 'm' === currentObj ? ' mine' : '') + ' color-' + currentObj; const bombSourceString = useMemo(() => bombSrc(bombTargetArea), [bombTargetArea]); return (
Field of target {bombSourceString && ( Field of bomb target )} {(lastClickedRed || lastClickedBlue) && ( Last clicked area )}
{isNaN(currentImage) && (
)} {!isNaN(currentImage) && 0 !== currentImage && (
{currentImage}
)}
); }); export default GridField; GridField.propTypes = { cell: shape({ currentImage: string, currentObj: string, active: bool, lastClickedRed: bool, lastClickedBlue: bool, bombTargetArea: number, }).isRequired, onClick: func.isRequired, onMouseEnter: func.isRequired, };