import React, { useMemo } from "react"; import PropTypes from "prop-types"; import { DetailIcon, DetailText, EditIcon, EditIconContainer, EyeIcon, Line, MessageIcon, OfferAuthor, OfferAuthorName, OfferCardContainer, OfferCategory, OfferDetails, OfferFlexContainer, OfferImage, OfferImageContainer, OfferInfo, OfferLocation, OfferTitle, OfferTitleAboveImage, OfferViews, OfferDate, // PinIcon, RemoveIcon, RemoveIconContainer, LikeIcon, LikeIconContainer, CategoryIcon, CalendarIcon, PinIconContainer, PinOutlinedIcon, ButtonsContainer, TooltipInnerContainer, UnpinOutlinedIcon, AcceptIconContainer, AcceptIcon, } from "./OfferCard.styled"; import { ReactComponent as Message } from "../../../assets/images/svg/mail.svg"; import { useHistory } from "react-router-dom"; import { useDispatch, useSelector } from "react-redux"; import { selectUserId } from "../../../store/selectors/loginSelectors"; import useIsMobile from "../../../hooks/useIsMobile"; import { getImageUrl, variants } from "../../../util/helpers/imageUrlGetter"; import OfferDescription from "./OfferDescription/OfferDescription"; import CheckButton from "./CheckButton/CheckButton"; import { formatDateLocale } from "../../../util/helpers/dateHelpers"; import { toggleDeleteOfferModal, toggleEditOfferModal, } from "../../../store/actions/modal/modalActions"; import { Tooltip } from "@mui/material"; import { useTranslation } from "react-i18next"; import { replaceInRoute } from "../../../util/helpers/routeHelpers"; import { ADMIN_ITEM_DETAILS_PAGE, ITEM_DETAILS_PAGE, } from "../../../constants/pages"; import exchangeStatus from "../../../constants/exchangeStatus"; const OfferCard = (props) => { const dispatch = useDispatch(); const history = useHistory(); const userId = useSelector(selectUserId); const { isMobile } = useIsMobile(); const date = formatDateLocale(new Date(props.offer?._created)); const { t } = useTranslation(); const pinOffer = (event) => { event.stopPropagation(); dispatch( toggleDeleteOfferModal({ offer: props.offer, pin: true, pinnedOffer: props.offer.pinned, deleteOffer: false, }) ); }; const routeToItem = (itemId) => { if (!props.disabledCheckButton) { if (props.isAdmin) { history.push( replaceInRoute(ADMIN_ITEM_DETAILS_PAGE, { offerId: itemId, }) ); } else { history.push({ pathname: replaceInRoute(ITEM_DETAILS_PAGE, { offerId: itemId, }), state: { view: true, }, }); } } }; const messageUser = (event) => { event.stopPropagation(); props.messageUser(props.offer); }; const makeReview = (event) => { event.stopPropagation(); if (!props.disabledReviews) { props.makeReview(props.offer); } }; const openEditOfferModal = (event) => { event.stopPropagation(); dispatch( toggleEditOfferModal({ editOffer: true, offer: props.offer, isAdmin: props.isAdmin, customUserId: props?.offer?.userId, }) ); }; const openRemoveModal = (event) => { event.stopPropagation(); dispatch( toggleDeleteOfferModal({ offer: props.offer, isAdmin: props.isAdmin, }) ); }; const acceptExchange = (event) => { event.stopPropagation(); props.acceptExchange(); }; const showMessageIcon = useMemo(() => { if (userId === props.offer?.userId) { return false; } return true; }, [userId, props.offer]); return ( routeToItem(props?.offer?._id)} > {/* This only shows on vertical offer card */} routeToItem(props?.offer?._id)} > {props?.offer?.name} {/* ^^^^^^^ */} routeToItem(props?.offer?._id)} > {props?.offer?.name} {props?.offer?.user?.company?.name} {props?.offer?.location?.city} {props?.offer?.category?.name} {props.dontShowViews ? ( <> ) : ( {props?.offer?.views?.count} )} {date} {!props.halfwidth ? ( ) : ( <> )} {/* {props?.offer?.pinned && ( )} */} {props.isMyOffer ? ( <> ) : props.aboveChat ? ( props.exchangeState === exchangeStatus.ACCEPTED || props.exchangeState === exchangeStatus.REVIEWED ? ( ) : ( ) ) : ( )} {props.isAdmin && (!props?.offer?.pinned ? ( ) : ( ))} ); }; OfferCard.propTypes = { children: PropTypes.node, _id: PropTypes.string, title: PropTypes.string, description: PropTypes.string, category: PropTypes.string, author: PropTypes.string, location: PropTypes.string, image: PropTypes.node, quantity: PropTypes.number, package: PropTypes.string, numberOfViews: PropTypes.number, halfwidth: PropTypes.bool, sponsored: PropTypes.bool, offer: PropTypes.any, pinned: PropTypes.bool, vertical: PropTypes.bool, isMyOffer: PropTypes.bool, aboveChat: PropTypes.bool, disabledReviews: PropTypes.bool, messageUser: PropTypes.func, makeReview: PropTypes.func, dontShowViews: PropTypes.bool, skeleton: PropTypes.bool, disabledCheckButton: PropTypes.bool, isAdmin: PropTypes.bool, exchangeState: PropTypes.any, acceptExchange: PropTypes.func, }; OfferCard.defaultProps = { halfwidth: false, sponsored: false, messageUser: () => {}, makeReview: () => {}, }; export default OfferCard;