| useEffect(() => { | useEffect(() => { | ||||
| socketInit(userId); | socketInit(userId); | ||||
| }, [userId]); | }, [userId]); | ||||
| return ( | return ( | ||||
| <Router history={history}> | <Router history={history}> | ||||
| <Helmet> | <Helmet> |
| useEffect(() => { | useEffect(() => { | ||||
| if ( | if ( | ||||
| !filters.category.selectedCategoryLocally || | |||||
| (filters.category.selectedCategoryLocally && | |||||
| !("_id" in filters.category.selectedCategoryLocally)) || | |||||
| (filters.category.selectedCategoryLocally?._id === 0 && !isOpened) | (filters.category.selectedCategoryLocally?._id === 0 && !isOpened) | ||||
| ) { | ) { | ||||
| setIsOpened(false); | setIsOpened(false); |
| const CompanyChoser = forwardRef((props, ref) => { | const CompanyChoser = forwardRef((props, ref) => { | ||||
| const [isOpened, setIsOpened] = useState(false); | const [isOpened, setIsOpened] = useState(false); | ||||
| const [appliedFilters, setAppliedFilters] = useState(false); | |||||
| const filters = props.filters; | const filters = props.filters; | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| } | } | ||||
| }, [filters.companies.selectedCompaniesLocally]); | }, [filters.companies.selectedCompaniesLocally]); | ||||
| useEffect(() => { | |||||
| if (appliedFilters) { | |||||
| props?.offers?.apply(); | |||||
| setAppliedFilters(false); | |||||
| } | |||||
| }, [filters.companies.selectedCompaniesLocally]); | |||||
| const handleSetItemsSelected = (items) => { | |||||
| filters.companies.setSelectedCompanies(items); | |||||
| setAppliedFilters(true); | |||||
| }; | |||||
| return ( | return ( | ||||
| <FilterSubDropdown | <FilterSubDropdown | ||||
| searchPlaceholder={t("filters.company.placeholder")} | searchPlaceholder={t("filters.company.placeholder")} | ||||
| handleOpen={() => setIsOpened((prevIsOpened) => !prevIsOpened)} | handleOpen={() => setIsOpened((prevIsOpened) => !prevIsOpened)} | ||||
| icon={<CompanyIcon />} | icon={<CompanyIcon />} | ||||
| title={t("filters.company.title")} | title={t("filters.company.title")} | ||||
| setItemsSelected={filters.companies.setSelectedCompanies} | |||||
| setItemsSelected={handleSetItemsSelected} | |||||
| companies | companies | ||||
| offers={props.offers} | offers={props.offers} | ||||
| /> | /> |
| const LocationChoser = forwardRef((props, ref) => { | const LocationChoser = forwardRef((props, ref) => { | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const [appliedFilters, setAppliedFilters] = useState(false); | |||||
| const [isOpened, setIsOpened] = useState(false); | const [isOpened, setIsOpened] = useState(false); | ||||
| const filters = props.filters; | const filters = props.filters; | ||||
| setIsOpened(true); | setIsOpened(true); | ||||
| } | } | ||||
| }, [filters.locations.selectedLocationsLocally]); | }, [filters.locations.selectedLocationsLocally]); | ||||
| useEffect(() => { | |||||
| if (appliedFilters) { | |||||
| props?.offers?.apply(); | |||||
| setAppliedFilters(false); | |||||
| } | |||||
| }, [appliedFilters]); | |||||
| const handleSetItemsSelected = (items) => { | |||||
| filters.locations.setSelectedLocations(items); | |||||
| setAppliedFilters(true); | |||||
| }; | |||||
| return ( | return ( | ||||
| <FilterCheckboxDropdown | <FilterCheckboxDropdown | ||||
| searchPlaceholder={t("filters.location.placeholder")} | searchPlaceholder={t("filters.location.placeholder")} | ||||
| handleOpen={() => setIsOpened((prevIsOpened) => !prevIsOpened)} | handleOpen={() => setIsOpened((prevIsOpened) => !prevIsOpened)} | ||||
| icon={<LocationIcon />} | icon={<LocationIcon />} | ||||
| title={t("filters.location.title")} | title={t("filters.location.title")} | ||||
| setItemsSelected={filters.locations.setSelectedLocations} | |||||
| setItemsSelected={handleSetItemsSelected} | |||||
| offers={props.offers} | offers={props.offers} | ||||
| /> | /> | ||||
| ); | ); |
| useEffect(() => { | useEffect(() => { | ||||
| if (props?.queryStringHook?.isInitiallyLoaded || props.myOffers) { | if (props?.queryStringHook?.isInitiallyLoaded || props.myOffers) { | ||||
| if ( | if ( | ||||
| !filters.category.selectedCategoryLocally || | |||||
| (filters.category.selectedCategoryLocally && | |||||
| !("_id" in filters.category.selectedCategoryLocally)) || | |||||
| filters.category.selectedCategoryLocally?._id === 0 | filters.category.selectedCategoryLocally?._id === 0 | ||||
| ) { | ) { | ||||
| setIsOpened(false); | setIsOpened(false); | ||||
| } | } | ||||
| } else { | } else { | ||||
| if ( | if ( | ||||
| !filters.subcategory.selectedSubcategoryLocally || | |||||
| (filters.subcategory.selectedSubcategoryLocally && | |||||
| !("_id" in filters.subcategory.selectedSubcategoryLocally)) || | |||||
| filters.subcategory.selectedSubcategoryLocally?._id === 0 | filters.subcategory.selectedSubcategoryLocally?._id === 0 | ||||
| ) { | ) { | ||||
| setIsOpened(false); | setIsOpened(false); | ||||
| if ( | if ( | ||||
| !filters.category.selectedCategoryLocally || | |||||
| (filters.category.selectedCategoryLocally && | |||||
| !("_id" in filters.category.selectedCategoryLocally)) || | |||||
| filters.category.selectedCategoryLocally?._id === 0 | filters.category.selectedCategoryLocally?._id === 0 | ||||
| ) { | ) { | ||||
| setIsDisabled(true); | setIsDisabled(true); |
| const data = props.data; | const data = props.data; | ||||
| const [isOpened, setIsOpened] = useState(false); | const [isOpened, setIsOpened] = useState(false); | ||||
| const handleDelete = (item) => { | const handleDelete = (item) => { | ||||
| props.setItemsSelected([...props.filters.filter((p) => p !== item)]); | |||||
| props.offers.applyFilters(); | |||||
| console.log(item); | |||||
| console.log(props.filters) | |||||
| props.setItemsSelected([...props.filters.filter((p) => p?._id !== item?._id)]); | |||||
| }; | }; | ||||
| const handleOpen = () => { | const handleOpen = () => { | ||||
| setIsOpened((prevState) => !prevState); | setIsOpened((prevState) => !prevState); |
| filters={props.filters} | filters={props.filters} | ||||
| icon={props.icon} | icon={props.icon} | ||||
| data={data} | data={data} | ||||
| offers={props?.offers} | |||||
| searchPlaceholder={props.searchPlaceholder} | searchPlaceholder={props.searchPlaceholder} | ||||
| open={props?.open !== undefined ? props.open : isOpened} | open={props?.open !== undefined ? props.open : isOpened} | ||||
| handleOpen={handleOpen} | handleOpen={handleOpen} |
| label={props.firstOption.label} | label={props.firstOption.label} | ||||
| // number={item.numberOfProducts} | // number={item.numberOfProducts} | ||||
| fullWidth | fullWidth | ||||
| checked={!props.selected || props.selected._id === 0} | |||||
| checked={ | |||||
| (props?.selected && !("_id" in props?.selected)) || | |||||
| props?.selected?._id === 0 | |||||
| } | |||||
| onChange={props.setSelected} | onChange={props.setSelected} | ||||
| /> | /> | ||||
| </DropdownItem> | </DropdownItem> |
| const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
| const offer = useMemo(() => { | const offer = useMemo(() => { | ||||
| if (props.offer) { | if (props.offer) { | ||||
| if (props.offer._id === routeMatch.params?.offerId && !props?.createOffer) { | |||||
| if ( | |||||
| props.offer._id === routeMatch.params?.offerId && | |||||
| !props?.createOffer | |||||
| ) { | |||||
| return props.offer; | return props.offer; | ||||
| } | } | ||||
| if (props.createOffer) return props.offer.offer; | if (props.createOffer) return props.offer.offer; | ||||
| <DateButtonsContainer> | <DateButtonsContainer> | ||||
| {props.isMyOffer && ( | {props.isMyOffer && ( | ||||
| <ButtonsContainer> | <ButtonsContainer> | ||||
| <PinIconContainer onClick={showPinOfferModalHandler}> | |||||
| {offer?.pinned ? <UnpinIcon /> : <PinIcon />} | |||||
| </PinIconContainer> | |||||
| {props?.isAdmin && ( | |||||
| <PinIconContainer onClick={showPinOfferModalHandler}> | |||||
| {offer?.pinned ? <UnpinIcon /> : <PinIcon />} | |||||
| </PinIconContainer> | |||||
| )} | |||||
| <EditIconContainer onClick={showEditOfferModalHandler}> | <EditIconContainer onClick={showEditOfferModalHandler}> | ||||
| <EditIcon /> | <EditIcon /> | ||||
| </EditIconContainer> | </EditIconContainer> |
| const [images, setImages] = useState([]); | const [images, setImages] = useState([]); | ||||
| const [imagesCarouselModal, setImagesCarouselModal] = useState(false); | const [imagesCarouselModal, setImagesCarouselModal] = useState(false); | ||||
| useEffect(() => { | useEffect(() => { | ||||
| if (props?.offer?.images) { | if (props?.offer?.images) { | ||||
| props.offer.images.map((file) => { | props.offer.images.map((file) => { | ||||
| } | } | ||||
| }); | }); | ||||
| } | } | ||||
| return () => { | |||||
| setImages([]); | |||||
| }; | |||||
| }, [props?.offer?.images]); | }, [props?.offer?.images]); | ||||
| const date = formatDateLocale(new Date(offer?._created)); | const date = formatDateLocale(new Date(offer?._created)); | ||||
| const onModalClose = () => { | const onModalClose = () => { | ||||
| </OfferInfoContainer> | </OfferInfoContainer> | ||||
| </Details> | </Details> | ||||
| {imagesCarouselModal && ( | {imagesCarouselModal && ( | ||||
| <ImagesCarousel offer={props.offer} images={images} onModalClose={onModalClose} /> | |||||
| <ImagesCarousel | |||||
| offer={props.offer} | |||||
| images={images} | |||||
| onModalClose={onModalClose} | |||||
| /> | |||||
| )} | )} | ||||
| </> | </> | ||||
| ); | ); |
| import { | import { | ||||
| CategoryIcon, | CategoryIcon, | ||||
| CategoryIconContainer, | CategoryIconContainer, | ||||
| OfferCategoryContainer, | |||||
| OfferDescriptionCategory, | OfferDescriptionCategory, | ||||
| OfferDescriptionContainer, | OfferDescriptionContainer, | ||||
| OfferDescriptionTitle, | OfferDescriptionTitle, | ||||
| return ( | return ( | ||||
| <OfferDescriptionContainer> | <OfferDescriptionContainer> | ||||
| <OfferDescriptionTitle>{props.offerName}</OfferDescriptionTitle> | <OfferDescriptionTitle>{props.offerName}</OfferDescriptionTitle> | ||||
| <OfferDescriptionCategory> | |||||
| <OfferCategoryContainer> | |||||
| <CategoryIconContainer | <CategoryIconContainer | ||||
| color={selectedTheme.colors.iconStrokeDisabledColor} | color={selectedTheme.colors.iconStrokeDisabledColor} | ||||
| component="span" | component="span" | ||||
| > | > | ||||
| <CategoryIcon /> | <CategoryIcon /> | ||||
| </CategoryIconContainer> | </CategoryIconContainer> | ||||
| {props.categoryName} | |||||
| </OfferDescriptionCategory> | |||||
| <OfferDescriptionCategory> | |||||
| {props.categoryName} | |||||
| </OfferDescriptionCategory> | |||||
| </OfferCategoryContainer> | |||||
| </OfferDescriptionContainer> | </OfferDescriptionContainer> | ||||
| ); | ); | ||||
| }; | }; |
| font-family: ${selectedTheme.fonts.textFont}; | font-family: ${selectedTheme.fonts.textFont}; | ||||
| color: ${selectedTheme.colors.primaryDarkText}; | color: ${selectedTheme.colors.primaryDarkText}; | ||||
| `; | `; | ||||
| export const OfferCategoryContainer = styled(Box)` | |||||
| display: flex; | |||||
| flex-direction: row; | |||||
| white-space: nowrap; | |||||
| ` | |||||
| export const CategoryIconContainer = styled(Icon)` | export const CategoryIconContainer = styled(Icon)` | ||||
| margin-right: 4px; | margin-right: 4px; | ||||
| position: relative; | position: relative; | ||||
| top: 2px; | top: 2px; | ||||
| display: inline; | |||||
| & svg { | & svg { | ||||
| width: 14px; | width: 14px; | ||||
| position: relative; | position: relative; | ||||
| top: -6px; | |||||
| top: -4px; | |||||
| } | } | ||||
| `; | `; | ||||
| export const CategoryIcon = styled(Category)``; | export const CategoryIcon = styled(Category)``; |
| }) | }) | ||||
| ); | ); | ||||
| } else { | } else { | ||||
| history.push( | |||||
| replaceInRoute(ITEM_DETAILS_PAGE, { | |||||
| history.push({ | |||||
| pathname: replaceInRoute(ITEM_DETAILS_PAGE, { | |||||
| offerId: itemId, | offerId: itemId, | ||||
| }) | |||||
| ); | |||||
| }), | |||||
| state: { | |||||
| view: true, | |||||
| }, | |||||
| }); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; |
| ); | ); | ||||
| }; | }; | ||||
| const handleEditProfile = () => { | const handleEditProfile = () => { | ||||
| if (!props.profile?._blocked) { | |||||
| console.log("edit") | |||||
| console.log(props) | |||||
| if (!props.profile?._blocked || props?.isAdmin) { | |||||
| console.log("edit2") | |||||
| dispatch( | dispatch( | ||||
| toggleEditProfileModal({ | toggleEditProfileModal({ | ||||
| userId: props.profile._id, | userId: props.profile._id, | ||||
| ); | ); | ||||
| } | } | ||||
| }; | }; | ||||
| console.log(props) | |||||
| return ( | return ( | ||||
| <ButtonsContainer> | <ButtonsContainer> | ||||
| {props.profile?._blocked && !props.isMobile && <BlockedProfile />} | |||||
| {props.profile?._blocked && !props.isMobile && !props?.isAdmin && <BlockedProfile />} | |||||
| {props.isAdmin && ( | {props.isAdmin && ( | ||||
| <> | <> | ||||
| {props.profile?._blocked ? ( | {props.profile?._blocked ? ( |
| import FirstStepCreateReview from "./FirstStep/FirstStepCreateReview"; | import FirstStepCreateReview from "./FirstStep/FirstStepCreateReview"; | ||||
| import SecondStepCreateReview from "./SecondStep/SecondStepCreateReview"; | import SecondStepCreateReview from "./SecondStep/SecondStepCreateReview"; | ||||
| import ThirdStepCreateReview from "./ThirdStep/ThirdStepCreateReview"; | import ThirdStepCreateReview from "./ThirdStep/ThirdStepCreateReview"; | ||||
| import { useDispatch, useSelector } from "react-redux"; | |||||
| import { useDispatch } from "react-redux"; | |||||
| import { giveReview } from "../../store/actions/review/reviewActions"; | import { giveReview } from "../../store/actions/review/reviewActions"; | ||||
| import { selectUserId } from "../../store/selectors/loginSelectors"; | |||||
| import { reviewEnum } from "../../enums/reviewEnum"; | import { reviewEnum } from "../../enums/reviewEnum"; | ||||
| import { fetchExchange } from "../../store/actions/exchange/exchangeActions"; | import { fetchExchange } from "../../store/actions/exchange/exchangeActions"; | ||||
| import { closeModal } from "../../store/actions/modal/modalActions"; | import { closeModal } from "../../store/actions/modal/modalActions"; | ||||
| const [informations, setInformations] = useState({}); | const [informations, setInformations] = useState({}); | ||||
| const [currentStep, setCurrentStep] = useState(1); | const [currentStep, setCurrentStep] = useState(1); | ||||
| const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
| const userId = useSelector(selectUserId); | |||||
| const closeModalHandler = () => { | const closeModalHandler = () => { | ||||
| dispatch(closeModal()); | dispatch(closeModal()); | ||||
| }; | }; | ||||
| setTimeout(() => { | |||||
| dispatch(closeModal()); | |||||
| }, 3000); | |||||
| const handleApiResponseSuccess = () => { | const handleApiResponseSuccess = () => { | ||||
| dispatch(fetchExchange(props.exchange._id)); | dispatch(fetchExchange(props.exchange._id)); | ||||
| }; | }; | ||||
| dispatch( | dispatch( | ||||
| giveReview({ | giveReview({ | ||||
| review: { | review: { | ||||
| exchangeId: props.exchange._id, | |||||
| userId: userId, | |||||
| exchange: { | |||||
| _id: props.exchange._id, | |||||
| }, | |||||
| succeeded, | succeeded, | ||||
| communication, | communication, | ||||
| message: informations.comment, | message: informations.comment, |
| ThirdStepCreateReviewContainer, | ThirdStepCreateReviewContainer, | ||||
| } from "./ThirdStepCreateReview.styled"; | } from "./ThirdStepCreateReview.styled"; | ||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import { useDispatch } from "react-redux"; | |||||
| import { closeModal } from "../../../store/actions/modal/modalActions"; | |||||
| const ThirdStepCreateReview = () => { | const ThirdStepCreateReview = () => { | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const dispatch = useDispatch(); | |||||
| setTimeout(() => { | |||||
| dispatch(closeModal()); | |||||
| }, 3000); | |||||
| return ( | return ( | ||||
| <ThirdStepCreateReviewContainer> | <ThirdStepCreateReviewContainer> | ||||
| <LogoImage /> | <LogoImage /> |
| }; | }; | ||||
| const handleAcceptExchangeSuccess = () => { | const handleAcceptExchangeSuccess = () => { | ||||
| let interlocutor = userId === chat?.participants[0]._id ? 1 : 0; | let interlocutor = userId === chat?.participants[0]._id ? 1 : 0; | ||||
| console.log("accept salje i prima 3 POZVANA RESPONSE FUNKCIJA") | |||||
| acceptExchangeSocket( | acceptExchangeSocket( | ||||
| chat?._id, | chat?._id, | ||||
| userId, | userId, | ||||
| chat?.participants[interlocutor]._id, | chat?.participants[interlocutor]._id, | ||||
| () => { | () => { | ||||
| console.log("accept salje i prima 4 SOCKET FUNKCIJA") | |||||
| dispatch( | dispatch( | ||||
| addNewMessage({ | addNewMessage({ | ||||
| _id: chat?._id, | _id: chat?._id, |
| const isDisabledReviews = useMemo(() => { | const isDisabledReviews = useMemo(() => { | ||||
| if (!exchange.valid) return true; | if (!exchange.valid) return true; | ||||
| if (exchange.seller?.userId === userId && exchange.seller?.givenReview) | |||||
| if (exchange.seller?.user._id === userId && exchange.seller?.givenReview) | |||||
| return true; | return true; | ||||
| if (exchange.buyer?.userId === userId && exchange.buyer?.givenReview) | |||||
| if (exchange.buyer?.user._id === userId && exchange.buyer?.givenReview) | |||||
| return true; | return true; | ||||
| return false; | return false; | ||||
| }, [exchange, userId]); | }, [exchange, userId]); |
| }; | }; | ||||
| const messageUser = (offer) => { | const messageUser = (offer) => { | ||||
| const chatItem = chats.find( | const chatItem = chats.find( | ||||
| (item) => item.chat.offerId === offer?._id | |||||
| (item) => item.offer._id === offer?._id | |||||
| ); | ); | ||||
| if (chatItem !== undefined) { | if (chatItem !== undefined) { | ||||
| history.push(DIRECT_CHAT_PAGE, { | history.push(DIRECT_CHAT_PAGE, { | ||||
| chatId: chatItem.chat._id | |||||
| chatId: chatItem._id | |||||
| }); | }); | ||||
| } else { | } else { | ||||
| if (offer?.userId !== userId) { | |||||
| if (offer?.user?._id !== userId) { | |||||
| history.push(`/messages/newMessage`, { | history.push(`/messages/newMessage`, { | ||||
| offerId: offer?._id, | offerId: offer?._id, | ||||
| }); | }); |
| const handleClickCategory = () => { | const handleClickCategory = () => { | ||||
| props?.offers?.filters?.locations.clear(); | props?.offers?.filters?.locations.clear(); | ||||
| props?.offers?.filters?.subcategory.clear(); | props?.offers?.filters?.subcategory.clear(); | ||||
| props?.offers?.filters?.companies?.clear(); | |||||
| props?.offers?.applyFilters(); | props?.offers?.applyFilters(); | ||||
| }; | }; | ||||
| const handleClickSubcategory = () => { | const handleClickSubcategory = () => { | ||||
| props?.offers?.filters?.locations.clear(); | props?.offers?.filters?.locations.clear(); | ||||
| props?.offers?.filters?.companies?.clear(); | |||||
| props?.offers?.applyFilters(); | props?.offers?.applyFilters(); | ||||
| }; | }; | ||||
| const goBack = () => { | const goBack = () => { |
| const Offers = (props) => { | const Offers = (props) => { | ||||
| const offers = props?.offers; | const offers = props?.offers; | ||||
| const arrayForMapping = Array.apply(null, Array(4)).map(() => {}); | const arrayForMapping = Array.apply(null, Array(4)).map(() => {}); | ||||
| console.log("rerender") | |||||
| return ( | return ( | ||||
| <> | <> | ||||
| <OffersFilterButton /> | <OffersFilterButton /> | ||||
| <OffersSearchField /> | <OffersSearchField /> | ||||
| <OffersNotFound /> | |||||
| <OffersNotFound skeleton={props?.skeleton} /> | |||||
| <OffersList | <OffersList | ||||
| loading={props?.skeleton} | loading={props?.skeleton} | ||||
| offers={offers} | offers={offers} |
| offer={item} | offer={item} | ||||
| halfwidth={props?.isGrid} | halfwidth={props?.isGrid} | ||||
| messageUser={messageOneUser} | messageUser={messageOneUser} | ||||
| isMyOffer={item?.userId === userId || props?.isAdmin} | |||||
| isMyOffer={item?.user._id === userId || props?.isAdmin} | |||||
| isAdmin={props?.isAdmin} | isAdmin={props?.isAdmin} | ||||
| /> | /> | ||||
| ); | ); |
| const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
| const searchRef = useRef(null); | const searchRef = useRef(null); | ||||
| useEffect(() => { | |||||
| return () => { | |||||
| dispatch(setProfileOffers([])); | |||||
| }; | |||||
| }, []); | |||||
| useEffect(() => { | useEffect(() => { | ||||
| dispatch( | dispatch( | ||||
| fetchProfileOffers({ | fetchProfileOffers({ | ||||
| sortOption: sortOption, | sortOption: sortOption, | ||||
| append: isMobile && append, | append: isMobile && append, | ||||
| page: paging.currentPage, | page: paging.currentPage, | ||||
| isAdmin: props?.isAdmin, | |||||
| }) | }) | ||||
| ); | ); | ||||
| setAppend(true); | setAppend(true); | ||||
| <ProfileOffersHeaderSkeleton /> | <ProfileOffersHeaderSkeleton /> | ||||
| {isMobile ? ( | {isMobile ? ( | ||||
| <SkeletonContainer> | <SkeletonContainer> | ||||
| <SkeletonOfferCard vertical /> | |||||
| <SkeletonOfferCard vertical /> | |||||
| <SkeletonOfferCard vertical /> | |||||
| <SkeletonOfferCard vertical skeleton /> | |||||
| <SkeletonOfferCard vertical skeleton /> | |||||
| <SkeletonOfferCard vertical skeleton /> | |||||
| </SkeletonContainer> | </SkeletonContainer> | ||||
| ) : ( | ) : ( | ||||
| <> | <> | ||||
| {arrayForMapping.map((item, index) => ( | {arrayForMapping.map((item, index) => ( | ||||
| <SkeletonOfferCard key={index} /> | |||||
| <SkeletonOfferCard key={index} skeleton /> | |||||
| ))} | ))} | ||||
| </> | </> | ||||
| )} | )} |
| import useSorting from "./useSorting"; | import useSorting from "./useSorting"; | ||||
| const useMyOffers = () => { | const useMyOffers = () => { | ||||
| const applyFilters = () => { | |||||
| paging.changePage(1); | |||||
| setAppliedFilters(false); | |||||
| }; | |||||
| const filters = useFilters(true); | const filters = useFilters(true); | ||||
| const sorting = useSorting(); | const sorting = useSorting(); | ||||
| const mineOffers = useSelector(selectMineOffers); | const mineOffers = useSelector(selectMineOffers); | ||||
| setAppliedFilters(false); | setAppliedFilters(false); | ||||
| } | } | ||||
| const applyFilters = () => { | |||||
| paging.changePage(1); | |||||
| setAppliedFilters(false); | |||||
| }; | |||||
| // Filter, search and sort all mine offers | // Filter, search and sort all mine offers | ||||
| const allOffersToShow = useMemo(() => { | const allOffersToShow = useMemo(() => { | ||||
| let mineOffersFiltered = [...mineOffers]; | let mineOffersFiltered = [...mineOffers]; |
| export default (informations, offer, images) => ({ | export default (informations, offer, images) => ({ | ||||
| images: informations?.image || offer?.images || images, | images: informations?.image || offer?.images || images, | ||||
| condition: informations?.condition || offer?.condition || "default", | |||||
| condition: | |||||
| informations?.condition || | |||||
| (typeof offer?.condition === "string" && | |||||
| offer?.condition?.charAt(0)?.toUpperCase() + | |||||
| offer?.condition?.slice(1)) || | |||||
| "default", | |||||
| }); | }); |
| import UserReviews from "../../components/UserReviews/UserReviews"; | import UserReviews from "../../components/UserReviews/UserReviews"; | ||||
| import { selectOffer } from "../../store/selectors/offersSelectors"; | import { selectOffer } from "../../store/selectors/offersSelectors"; | ||||
| import ProfileMini from "../../components/ProfileMini/ProfileMini"; | import ProfileMini from "../../components/ProfileMini/ProfileMini"; | ||||
| import history from "../../store/utils/history"; | |||||
| const ItemDetailsPage = (props) => { | const ItemDetailsPage = (props) => { | ||||
| const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
| const offerId = props.match.params.offerId; | const offerId = props.match.params.offerId; | ||||
| useEffect(() => { | useEffect(() => { | ||||
| dispatch(fetchOneOffer(offerId)); | |||||
| const view = history?.location?.state?.view; | |||||
| console.log(view) | |||||
| dispatch(fetchOneOffer({ offerId, view })); | |||||
| () => dispatch(clearSelectedOffer()); | () => dispatch(clearSelectedOffer()); | ||||
| }, []); | }, []); | ||||
| setFingerprint: "/affiliate/fingerprint", | setFingerprint: "/affiliate/fingerprint", | ||||
| }, | }, | ||||
| offers: { | offers: { | ||||
| getOneOffer: "offers", | |||||
| getOneOffer: "offers/{offerId}", | |||||
| getOffers: "offers", | getOffers: "offers", | ||||
| getFeaturedOffers: "offers/featured", | getFeaturedOffers: "offers/featured", | ||||
| addOffer: "/users/{userId}/offers", | addOffer: "/users/{userId}/offers", | ||||
| locations: "locations", | locations: "locations", | ||||
| mineOffers: "users", | mineOffers: "users", | ||||
| profileOffers: "users/{userId}/offers", | profileOffers: "users/{userId}/offers", | ||||
| profileOffersAsAdmin: "admin/users/{userId}/offers", | |||||
| removeOffer: "/users/{userId}/offers/{offerId}", | removeOffer: "/users/{userId}/offers/{offerId}", | ||||
| removeOfferAsAdmin: "/admin/offers/{offerId}", | removeOfferAsAdmin: "/admin/offers/{offerId}", | ||||
| pinOffer: "admin/offers/{id}/pin", | pinOffer: "admin/offers/{id}/pin", | ||||
| exchange: { | exchange: { | ||||
| getExchange: "exchanges", | getExchange: "exchanges", | ||||
| validateExchange: "exchanges", | validateExchange: "exchanges", | ||||
| acceptExchange: "users/{userId}/exchanges/{exchangeId}/accept" | |||||
| acceptExchange: "users/{userId}/exchanges/{exchangeId}/accept", | |||||
| }, | }, | ||||
| reviews: { | reviews: { | ||||
| getUserReviews: "/users/{userId}/reviews", | getUserReviews: "/users/{userId}/reviews", |
| import axios from "axios"; | import axios from "axios"; | ||||
| import queryString from "qs"; | |||||
| // import queryString from "qs"; | |||||
| const request = axios.create({ | const request = axios.create({ | ||||
| // baseURL: "http://192.168.88.150:3001/", // DJOLE | // baseURL: "http://192.168.88.150:3001/", // DJOLE | ||||
| // baseURL: "http://192.168.88.175:3005/", | // baseURL: "http://192.168.88.175:3005/", | ||||
| // baseURL: "http://192.168.88.143:3001/", // DULE | // baseURL: "http://192.168.88.143:3001/", // DULE | ||||
| // baseURL: "https://trampa-api.dilig.net/", | // baseURL: "https://trampa-api.dilig.net/", | ||||
| // baseURL: "https://trampa-api-test.dilig.net/", | |||||
| baseURL: "http://localhost:3001/", | |||||
| baseURL: "https://trampa-api-test.dilig.net/", | |||||
| // baseURL: "http://localhost:3001/", | |||||
| // baseURL: process.env.REACT_APP_BASE_API_URL, | // baseURL: process.env.REACT_APP_BASE_API_URL, | ||||
| headers: { | headers: { | ||||
| "Content-Type": "application/json", | "Content-Type": "application/json", | ||||
| }, | }, | ||||
| // withCredentials: true, | // withCredentials: true, | ||||
| paramsSerializer: (params) => | |||||
| queryString.stringify(params, { arrayFormat: "comma" }), | |||||
| // paramsSerializer: (params) => | |||||
| // queryString.stringify(params, { arrayFormat: "comma" }), | |||||
| }); | }); | ||||
| export const getRequest = (url, params = null, options = null) => { | export const getRequest = (url, params = null, options = null) => { |
| return getRequest(apiEndpoints.offers.getOffers); | return getRequest(apiEndpoints.offers.getOffers); | ||||
| }; | }; | ||||
| export const attemptFetchOneOffer = (payload) => { | export const attemptFetchOneOffer = (payload) => { | ||||
| const url = `${apiEndpoints.offers.getOneOffer}/${payload}`; | |||||
| return getRequest(url); | |||||
| return getRequest( | |||||
| replaceInUrl(apiEndpoints.offers.getOneOffer, { | |||||
| offerId: payload.offerId, | |||||
| }), | |||||
| payload.queryObject | |||||
| ); | |||||
| }; | }; | ||||
| export const attemptFetchMoreOffers = (page, payload) => { | export const attemptFetchMoreOffers = (page, payload) => { | ||||
| if (payload) | if (payload) | ||||
| }) + `?${queryString}` | }) + `?${queryString}` | ||||
| ); | ); | ||||
| }; | }; | ||||
| export const attemptFetchProfileOffersAsAdmin = (userId, queryString = "") => { | |||||
| return getRequest( | |||||
| replaceInUrl(apiEndpoints.offers.profileOffersAsAdmin, { | |||||
| userId: userId, | |||||
| }) + `?${queryString}` | |||||
| ); | |||||
| }; | |||||
| export const attemptRemoveOffer = (payload, offerId) => { | export const attemptRemoveOffer = (payload, offerId) => { | ||||
| return deleteRequest( | return deleteRequest( | ||||
| replaceInUrl(apiEndpoints.offers.removeOffer, { | replaceInUrl(apiEndpoints.offers.removeOffer, { |
| // const baseURL = "http://192.168.88.143:3001/"; // DULE | // const baseURL = "http://192.168.88.143:3001/"; // DULE | ||||
| // const baseURL = "http://192.168.88.175:3005/"; | // const baseURL = "http://192.168.88.175:3005/"; | ||||
| // const baseURL = "https://trampa-api.dilig.net/"; | // const baseURL = "https://trampa-api.dilig.net/"; | ||||
| // const baseURL = "https://trampa-api-test.dilig.net/"; | |||||
| const baseURL = "https://trampa-api-test.dilig.net/"; | |||||
| // const baseURL = "http://192.168.88.150:3001/"; // DJOLE | // const baseURL = "http://192.168.88.150:3001/"; // DJOLE | ||||
| const baseURL = "http://localhost:3001/"; | |||||
| // const baseURL = "http://localhost:3001/"; | |||||
| // const baseURL = process.env.REACT_APP_BASE_API_URL | // const baseURL = process.env.REACT_APP_BASE_API_URL | ||||
| //Interceptor unique name | //Interceptor unique name | ||||
| } | } | ||||
| // If refresh token is expired, log out user | // If refresh token is expired, log out user | ||||
| console.log(new Date(refreshTokenDecoded?.exp * 1000)) | |||||
| console.log(new Date()) | |||||
| if (new Date() > new Date(refreshTokenDecoded?.exp * 1000)) { | if (new Date() > new Date(refreshTokenDecoded?.exp * 1000)) { | ||||
| dispatch(logoutUser()); | dispatch(logoutUser()); | ||||
| return Promise.resolve(response) | return Promise.resolve(response) |
| attemptFetchFeaturedOffers, | attemptFetchFeaturedOffers, | ||||
| attemptFetchOffers, | attemptFetchOffers, | ||||
| attemptFetchOneOffer, | attemptFetchOneOffer, | ||||
| attemptFetchProfileOffersAsAdmin, | |||||
| attemptPinOffer, | attemptPinOffer, | ||||
| attemptRemoveOffer, | attemptRemoveOffer, | ||||
| attemptRemoveOfferAsAdmin, | attemptRemoveOfferAsAdmin, | ||||
| function* fetchOneOffer(payload) { | function* fetchOneOffer(payload) { | ||||
| try { | try { | ||||
| const data = yield call(attemptFetchOneOffer, payload.payload); | |||||
| let offerId = payload.payload; | |||||
| console.log("sagabb", payload.payload); | |||||
| const queryObject = new URLSearchParams(); | |||||
| if (typeof payload.payload === "object") { | |||||
| offerId = payload.payload.offerId; | |||||
| queryObject.set("view", "true"); | |||||
| } | |||||
| const data = yield call(attemptFetchOneOffer, { | |||||
| offerId, | |||||
| queryObject, | |||||
| }); | |||||
| if (!data?.data) throw new Error(); | if (!data?.data) throw new Error(); | ||||
| yield put(fetchOneOfferSuccess(data?.data)); | yield put(fetchOneOfferSuccess(data?.data)); | ||||
| } catch (e) { | } catch (e) { | ||||
| queryString = yield select(selectQueryString); | queryString = yield select(selectQueryString); | ||||
| } | } | ||||
| console.log(queryString.toString()); | console.log(queryString.toString()); | ||||
| const data = yield call( | |||||
| attemptFetchProfileOffers, | |||||
| userId, | |||||
| convertQueryStringForBackend(queryString) | |||||
| ); | |||||
| let data; | |||||
| if (payload.payload.isAdmin) { | |||||
| data = yield call( | |||||
| attemptFetchProfileOffersAsAdmin, | |||||
| userId, | |||||
| convertQueryStringForBackend(queryString) | |||||
| ); | |||||
| } else { | |||||
| data = yield call( | |||||
| attemptFetchProfileOffers, | |||||
| userId, | |||||
| convertQueryStringForBackend(queryString) | |||||
| ); | |||||
| } | |||||
| if (payload.payload.append) { | if (payload.payload.append) { | ||||
| yield put(addProfileOffers(data.data.offers)); | yield put(addProfileOffers(data.data.offers)); | ||||
| } else { | } else { | ||||
| const offerData = payload.payload.offerData; | const offerData = payload.payload.offerData; | ||||
| const formData = new FormData(); | const formData = new FormData(); | ||||
| formData.append("category[name]", offerData.category.name); | formData.append("category[name]", offerData.category.name); | ||||
| formData.append("condition", offerData.condition); | |||||
| formData.append("condition", offerData.condition.toLowerCase()); | |||||
| formData.append("description", offerData.description); | formData.append("description", offerData.description); | ||||
| // const oldImages = []; | // const oldImages = []; | ||||
| for (var i = 0; i < offerData.images.length; i++) { | for (var i = 0; i < offerData.images.length; i++) { |
| try { | try { | ||||
| console.log(payload); | console.log(payload); | ||||
| const data = yield call(attemptFetchReview, payload.payload); | const data = yield call(attemptFetchReview, payload.payload); | ||||
| yield put(setReviews([...data.data].reverse())); | |||||
| yield put(setReviews([...data.data.reviews].reverse())); | |||||
| yield put(fetchReviewsSuccess()); | yield put(fetchReviewsSuccess()); | ||||
| } catch (e) { | } catch (e) { | ||||
| yield put(fetchReviewsError()); | yield put(fetchReviewsError()); |