import React, { useEffect, useRef, useState } from 'react'; import { useSpring } from 'react-spring'; import { useTheme } from 'styled-components'; import { getImageSource } from '../../helpers/getImageSource'; import { usePrevious } from '../../hooks'; import AnimatedFavoriteIcon from '../../icons/AnimatedFavoriteIcon'; import { CommunityLibraryIcon } from '../../icons'; import CardHeaderContent from '../BoardCard/components/CardHeaderContent'; import FavoriteToast from '../FavoriteToast'; import TagsDisplayArea from '../TagsDisplayArea'; import Typography from '../Typography'; import { ITEM_THUMBNAIL_DEFAULT_URL } from './constants'; import { ItemCardProps } from './interfaces'; import { CardFooter, CardHeader, Divider, FavoriteButton, HoverDrawer, Row, StyledCard, ThumbnailWrapper, PendingTag, } from './styles'; import { useGetElementSize } from '../../hooks/'; const ItemCard = (props: ItemCardProps) => { const theme = useTheme(); const [hover, setHover] = useState(); const cardRef = useRef(null); const { width: cardWidth } = useGetElementSize(cardRef); const prevIsFavorite = usePrevious(props.isFavorite); const [showFavoriteToast, setShowFavoriteToast] = useState(false); const isCommunityItem = props.isCommunityItem !== false; const isPending = props.status === 'PENDING' || props.status === 'IN_REVIEW'; const expand = useSpring({ opacity: hover ? 1 : 0, }); useEffect(() => { if (props.isFavorite && prevIsFavorite === false) { // show favorite toast for 3 seconds setShowFavoriteToast(true); setTimeout(() => { setShowFavoriteToast(false); }, 3000); } }, [props.isFavorite]); return ( setHover(true)} onMouseLeave={() => setHover(false)} disableHoverState={props.disableHoverState} onClick={() => {}} ref={cardRef} > props.onClick?.()}> props.onClick?.()} minHeight={props.imageAreaMinHeight} maxHeight={props.imageAreaMaxHeight || 324} withPadding={Boolean(props.thumbnailUrl)} > {isPending && ( Pending )} {!props.disableHoverState && hover && (isCommunityItem || props.tags) && ( {isCommunityItem && ( Community Library )} {props.tags && isCommunityItem && } {props.tags && } )} {props.showFavorite !== false && ( {Boolean(props.favoriteCount) && ( {props.favoriteCount} )} )} ); }; export default ItemCard;