Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

OfferCard.js 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import React, { useMemo, useState } from "react";
  2. import PropTypes from "prop-types";
  3. import {
  4. CheckButton,
  5. DetailIcon,
  6. DetailText,
  7. EditIcon,
  8. EditIconContainer,
  9. EyeIcon,
  10. Line,
  11. MessageIcon,
  12. OfferAuthor,
  13. OfferAuthorName,
  14. OfferCardContainer,
  15. OfferCategory,
  16. OfferDescription,
  17. OfferDescriptionText,
  18. OfferDescriptionTitle,
  19. OfferDetails,
  20. OfferFlexContainer,
  21. OfferImage,
  22. OfferImageContainer,
  23. OfferInfo,
  24. OfferLocation,
  25. OfferTitle,
  26. OfferTitleAboveImage,
  27. OfferViews,
  28. PinIcon,
  29. RemoveIcon,
  30. RemoveIconContainer,
  31. LikeIcon,
  32. LikeIconContainer,
  33. } from "./OfferCard.styled";
  34. import DeleteOffer from "./DeleteOffer/DeleteOffer";
  35. import { ReactComponent as Category } from "../../../assets/images/svg/category.svg";
  36. import { ReactComponent as Message } from "../../../assets/images/svg/mail.svg";
  37. import selectedTheme from "../../../themes";
  38. import { useHistory } from "react-router-dom";
  39. import CreateOffer from "../CreateOfferCard/CreateOffer";
  40. import { useSelector } from "react-redux";
  41. import { selectUserId } from "../../../store/selectors/loginSelectors";
  42. const OfferCard = (props) => {
  43. const [deleteOfferModal, setDeleteOfferModal] = useState(false);
  44. const [editOfferModal, setEditOfferModal] = useState(false);
  45. const history = useHistory();
  46. const userId = useSelector(selectUserId);
  47. const routeToItem = (itemId) => {
  48. history.push(`/proizvodi/${itemId}`);
  49. };
  50. const messageUser = () => {
  51. props.messageUser(props.offer);
  52. };
  53. const makeReview = () => {
  54. if (!props.disabledReviews) {
  55. props.makeReview(props.offer);
  56. }
  57. };
  58. const closeModalHandler = () => {
  59. setDeleteOfferModal(false);
  60. };
  61. const closeCreateOfferModal = () => {
  62. setEditOfferModal(false);
  63. };
  64. const showMessageIcon = useMemo(() => {
  65. if (userId === props.offer?.userId) {
  66. return false;
  67. }
  68. return true;
  69. }, [userId, props.offer]);
  70. if (deleteOfferModal || editOfferModal) {
  71. document.body.style.overflow = "hidden";
  72. } else {
  73. document.body.style.overflow = "auto";
  74. }
  75. return (
  76. <React.Fragment>
  77. <OfferCardContainer
  78. vertical={props.vertical}
  79. sponsored={
  80. props?.pinned !== undefined
  81. ? props?.pinned?.toString()
  82. : props?.offer?.pinned?.toString()
  83. }
  84. halfwidth={props.halfwidth ? 1 : 0}
  85. >
  86. <OfferTitleAboveImage
  87. vertical={props.vertical}
  88. onClick={() => routeToItem(props?.offer?._id)}
  89. >
  90. {props?.offer?.name}
  91. </OfferTitleAboveImage>
  92. <OfferFlexContainer vertical={props.vertical}>
  93. <OfferImageContainer vertical={props.vertical}>
  94. <OfferImage
  95. src={props?.offer?.images ? props?.offer?.images[0] : ""}
  96. vertical={props.vertical}
  97. ></OfferImage>
  98. </OfferImageContainer>
  99. <OfferInfo vertical={props.vertical}>
  100. <OfferTitle
  101. vertical={props.vertical}
  102. onClick={() => routeToItem(props?.offer?._id)}
  103. >
  104. {props?.offer?.name}
  105. </OfferTitle>
  106. <OfferAuthor>
  107. <OfferAuthorName vertical={props.vertical}>
  108. {props?.offer?.user?.company?.name}
  109. </OfferAuthorName>
  110. <OfferLocation vertical={props.vertical}>
  111. {props?.offer?.location?.city}
  112. </OfferLocation>
  113. </OfferAuthor>
  114. <OfferDetails>
  115. <OfferCategory vertical={props.vertical}>
  116. <DetailIcon color="black" component="span" size="16px">
  117. <Category width={"14px"} />
  118. </DetailIcon>
  119. <DetailText>{props?.offer?.category?.name}</DetailText>
  120. </OfferCategory>
  121. {props.dontShowViews ? (
  122. <></>
  123. ) : (
  124. <OfferViews vertical={props.vertical}>
  125. <DetailIcon color="black" component="span" size="16px">
  126. <EyeIcon />
  127. </DetailIcon>
  128. <DetailText>{props?.offer?.views?.count}</DetailText>
  129. </OfferViews>
  130. )}
  131. </OfferDetails>
  132. </OfferInfo>
  133. {!props.halfwidth ? (
  134. <React.Fragment>
  135. <Line />
  136. <OfferDescription>
  137. <OfferDescriptionTitle>Opis:</OfferDescriptionTitle>
  138. <OfferDescriptionText>
  139. {props?.offer?.description}
  140. </OfferDescriptionText>
  141. </OfferDescription>
  142. <CheckButton
  143. variant={props.sponsored ? "contained" : "outlined"}
  144. buttoncolor={selectedTheme.primaryPurple}
  145. textcolor={
  146. props.sponsored ? "white" : selectedTheme.primaryPurple
  147. }
  148. style={{ fontWeight: "600" }}
  149. onClick={() => routeToItem(props?.offer?._id)}
  150. >
  151. Pogledaj proizvod
  152. </CheckButton>
  153. </React.Fragment>
  154. ) : (
  155. <></>
  156. )}
  157. {props.isMyOffer ? (
  158. <>
  159. <RemoveIconContainer
  160. vertical={props.vertical}
  161. onClick={() => setDeleteOfferModal(true)}
  162. >
  163. <RemoveIcon />
  164. </RemoveIconContainer>
  165. <EditIconContainer
  166. vertical={props.vertical}
  167. onClick={() => setEditOfferModal(true)}
  168. >
  169. <EditIcon />
  170. </EditIconContainer>
  171. </>
  172. ) : props.aboveChat ? (
  173. <LikeIconContainer
  174. disabled={props.disabledReviews}
  175. onClick={makeReview}
  176. >
  177. <LikeIcon disabled={props.disabledReviews} />
  178. </LikeIconContainer>
  179. ) : (
  180. <MessageIcon
  181. showMessageIcon={showMessageIcon}
  182. vertical={props.vertical}
  183. onClick={messageUser}
  184. >
  185. <Message />
  186. </MessageIcon>
  187. )}
  188. {props?.offer?.pinned && <PinIcon isMyOffer={props.isMyOffer} />}
  189. </OfferFlexContainer>
  190. </OfferCardContainer>
  191. {deleteOfferModal && (
  192. <DeleteOffer
  193. offer={props.offer}
  194. closeModalHandler={closeModalHandler}
  195. />
  196. )}
  197. {editOfferModal && (
  198. <CreateOffer
  199. editOffer
  200. closeCreateOfferModal={closeCreateOfferModal}
  201. offer={props.offer}
  202. />
  203. )}
  204. </React.Fragment>
  205. );
  206. };
  207. OfferCard.propTypes = {
  208. children: PropTypes.node,
  209. _id: PropTypes.string,
  210. title: PropTypes.string,
  211. description: PropTypes.string,
  212. category: PropTypes.string,
  213. author: PropTypes.string,
  214. location: PropTypes.string,
  215. image: PropTypes.node,
  216. quantity: PropTypes.number,
  217. package: PropTypes.string,
  218. numberOfViews: PropTypes.number,
  219. halfwidth: PropTypes.bool,
  220. sponsored: PropTypes.bool,
  221. offer: PropTypes.any,
  222. pinned: PropTypes.bool,
  223. vertical: PropTypes.bool,
  224. isMyOffer: PropTypes.bool,
  225. aboveChat: PropTypes.bool,
  226. disabledReviews: PropTypes.bool,
  227. messageUser: PropTypes.func,
  228. makeReview: PropTypes.func,
  229. dontShowViews: PropTypes.bool,
  230. skeleton: PropTypes.bool,
  231. };
  232. OfferCard.defaultProps = {
  233. halfwidth: false,
  234. sponsored: false,
  235. messageUser: () => {},
  236. makeReview: () => {},
  237. };
  238. export default OfferCard;