import { MouseEventType } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useMemo, useState } from 'react'; import { FaHeart } from 'react-icons/fa'; import { CatalogType, IPurchasableOffer, Offer, ProductTypeEnum } from '../../../../../api'; import { LayoutAvatarImageView, LayoutGridItem, LayoutGridItemProps } from '../../../../../common'; import { useCatalog, useCatalogFavorites, useInventoryFurni } from '../../../../../hooks'; interface CatalogGridOfferViewProps extends LayoutGridItemProps { offer: IPurchasableOffer; selectOffer: (offer: IPurchasableOffer) => void; } export const CatalogGridOfferView: FC = props => { const { offer = null, selectOffer = null, itemActive = false, ...rest } = props; const [ isMouseDown, setMouseDown ] = useState(false); const { requestOfferToMover = null, currentType = CatalogType.NORMAL } = useCatalog(); const { isVisible = false } = useInventoryFurni(); const { isFavoriteOffer, toggleFavoriteOffer } = useCatalogFavorites(); const isFav = offer ? isFavoriteOffer(offer.offerId) : false; const iconUrl = useMemo(() => { if(!offer) return null; if(offer.pricingModel === Offer.PRICING_MODEL_BUNDLE) { return null; } return offer.product?.getIconUrl(offer) ?? null; }, [ offer ]); const onMouseEvent = (event: MouseEvent) => { switch(event.type) { case MouseEventType.MOUSE_DOWN: selectOffer(offer); setMouseDown(true); return; case MouseEventType.MOUSE_UP: setMouseDown(false); return; case MouseEventType.ROLL_OUT: if(!isMouseDown || !itemActive) return; if(currentType === CatalogType.BUILDER) return; if(!isVisible) return; requestOfferToMover(offer); return; } }; if(!offer) return null; const product = offer.product; if(!product) return null; return ( { iconUrl && !(offer.product.productType === ProductTypeEnum.ROBOT) &&
} { (offer.product.productType === ProductTypeEnum.ROBOT) && }
{ e.stopPropagation(); e.preventDefault(); toggleFavoriteOffer(offer.offerId, offer.localizationName, iconUrl); } } onMouseDown={ e => e.stopPropagation() } >
); };