| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- import React, { useMemo, useState } 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,
- } from "./OfferCard.styled";
- import DeleteOffer from "./DeleteOffer/DeleteOffer";
- import { ReactComponent as Message } from "../../../assets/images/svg/mail.svg";
- import { useHistory } from "react-router-dom";
- import CreateOffer from "../CreateOfferCard/CreateOffer";
- import { 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";
-
- const OfferCard = (props) => {
- const [deleteOfferModal, setDeleteOfferModal] = useState(false);
- const [editOfferModal, setEditOfferModal] = useState(false);
- const history = useHistory();
- const userId = useSelector(selectUserId);
- const { isMobile } = useIsMobile();
- const date = formatDateLocale(new Date(props.offer?._created));
-
- const pinOffer = (event) => {
- event.stopPropagation();
- };
- const routeToItem = (itemId) => {
- if (!props.disabledCheckButton) {
- history.push(`/proizvodi/${itemId}`);
- }
- };
- 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();
- setEditOfferModal(true);
- };
- const openRemoveModal = (event) => {
- event.stopPropagation();
- setDeleteOfferModal(true);
- };
-
- const closeModalHandler = () => {
- setDeleteOfferModal(false);
- };
-
- const closeCreateOfferModal = () => {
- setEditOfferModal(false);
- };
-
- const showMessageIcon = useMemo(() => {
- if (userId === props.offer?.userId) {
- return false;
- }
- return true;
- }, [userId, props.offer]);
-
- if (deleteOfferModal || editOfferModal) {
- document.body.style.overflow = "hidden";
- } else {
- document.body.style.overflow = "auto";
- }
-
- return (
- <React.Fragment>
- <OfferCardContainer
- vertical={props.vertical}
- sponsored={
- props?.pinned !== undefined
- ? props?.pinned?.toString()
- : props?.offer?.pinned?.toString()
- }
- halfwidth={props.halfwidth ? 1 : 0}
- onClick={() => routeToItem(props?.offer?._id)}
- >
- {/* This only shows on vertical offer card */}
- <OfferTitleAboveImage
- vertical={props.vertical}
- onClick={() => routeToItem(props?.offer?._id)}
- >
- {props?.offer?.name}
- </OfferTitleAboveImage>
- {/* ^^^^^^^ */}
-
- <OfferFlexContainer vertical={props.vertical}>
- <OfferImageContainer vertical={props.vertical}>
- <OfferImage
- src={
- props?.offer?.images
- ? getImageUrl(
- props?.offer?.images[0],
- variants.offerCard,
- isMobile
- )
- : ""
- }
- vertical={props.vertical}
- ></OfferImage>
- </OfferImageContainer>
- <OfferInfo vertical={props.vertical}>
- <OfferTitle
- vertical={props.vertical}
- onClick={() => routeToItem(props?.offer?._id)}
- >
- {props?.offer?.name}
- </OfferTitle>
- <OfferAuthor>
- <OfferAuthorName vertical={props.vertical}>
- {props?.offer?.user?.company?.name}
- </OfferAuthorName>
- <OfferLocation vertical={props.vertical}>
- {props?.offer?.location?.city}
- </OfferLocation>
- </OfferAuthor>
- <OfferDetails>
- <OfferCategory vertical={props.vertical}>
- <DetailIcon color="black" component="span" size="16px">
- <CategoryIcon />
- </DetailIcon>
- <DetailText>{props?.offer?.category?.name}</DetailText>
- </OfferCategory>
-
- {props.dontShowViews ? (
- <></>
- ) : (
- <OfferViews vertical={props.vertical}>
- <DetailIcon color="black" component="span" size="16px">
- <EyeIcon />
- </DetailIcon>
- <DetailText>{props?.offer?.views?.count}</DetailText>
- </OfferViews>
- )}
- <OfferDate vertical={props.vertical}>
- <DetailIcon component="span" size="16px">
- <CalendarIcon />
- </DetailIcon>
- <DetailText>{date}</DetailText>
- </OfferDate>
- </OfferDetails>
- </OfferInfo>
- {!props.halfwidth ? (
- <React.Fragment>
- <Line />
- <OfferDescription description={props?.offer?.description} />
- <CheckButton
- disabled={props.disabledCheckButton}
- offerId={props?.offer?._id}
- sponsored={props.sponsored}
- />
- </React.Fragment>
- ) : (
- <></>
- )}
-
- {props.isMyOffer ? (
- <>
- <RemoveIconContainer
- vertical={props.vertical}
- onClick={openRemoveModal}
- >
- <RemoveIcon />
- </RemoveIconContainer>
- <EditIconContainer
- vertical={props.vertical}
- onClick={openEditOfferModal}
- >
- <EditIcon />
- </EditIconContainer>
- </>
- ) : props.aboveChat ? (
- <LikeIconContainer
- disabled={props.disabledReviews}
- onClick={makeReview}
- >
- <LikeIcon disabled={props.disabledReviews} />
- </LikeIconContainer>
- ) : (
- <MessageIcon
- showMessageIcon={showMessageIcon}
- vertical={props.vertical}
- onClick={messageUser}
- >
- <Message />
- </MessageIcon>
- )}
- {props.isAdmin && !props.pinned && (
- <PinIconContainer showMessageIcon onClick={pinOffer}>
- <PinOutlinedIcon />
- </PinIconContainer>
- )}
- {props?.offer?.pinned && <PinIcon isMyOffer={props.isMyOffer} />}
- </OfferFlexContainer>
- </OfferCardContainer>
- {deleteOfferModal && (
- <DeleteOffer
- offer={props.offer}
- closeModalHandler={closeModalHandler}
- />
- )}
- {editOfferModal && (
- <CreateOffer
- editOffer
- closeCreateOfferModal={closeCreateOfferModal}
- offer={props.offer}
- />
- )}
- </React.Fragment>
- );
- };
-
- 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,
- };
- OfferCard.defaultProps = {
- halfwidth: false,
- sponsored: false,
- messageUser: () => {},
- makeReview: () => {},
- };
-
- export default OfferCard;
|