From 83268663931d6cfc9782c1853ba38894cdd3c875 Mon Sep 17 00:00:00 2001 From: SlimusMinus Date: Mon, 24 Aug 2026 01:26:06 +0300 Subject: [PATCH] added map on post --- src/components/feed/FeedContent.jsx | 2 ++ src/pages/MainFeed.jsx | 20 +++++++++++++++++++- src/pages/PostOnFeed.jsx | 15 +++++++++++++-- src/styles/card.css | 22 +++++++++++++++------- src/styles/chat.css | 24 +----------------------- 5 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/components/feed/FeedContent.jsx b/src/components/feed/FeedContent.jsx index c65c2ec..22e6227 100644 --- a/src/components/feed/FeedContent.jsx +++ b/src/components/feed/FeedContent.jsx @@ -15,6 +15,7 @@ export default function FeedContent({ onDelete, onMarkFound, onImageClick, + onLocationClick, onAuthRequired, t, }) { @@ -79,6 +80,7 @@ export default function FeedContent({ onMarkFound={activeNav === "myads" ? onMarkFound : undefined} isOwner={activeNav === "myads"} onImageClick={onImageClick} + onLocationClick={onLocationClick} onAuthRequired={onAuthRequired} /> )); diff --git a/src/pages/MainFeed.jsx b/src/pages/MainFeed.jsx index 4e6e478..f69f877 100644 --- a/src/pages/MainFeed.jsx +++ b/src/pages/MainFeed.jsx @@ -54,6 +54,11 @@ export default function MainFeed() { const isSearchView = new URLSearchParams(location.search).get("view") === "search"; const isMapView = new URLSearchParams(location.search).get("view") === "map"; + // параметры фокуса карты на конкретном объявлении (?view=map&post=ID&lat=..&lng=..) + const mapFocusParams = new URLSearchParams(location.search); + const focusPostId = isMapView ? mapFocusParams.get("post") : null; + const focusLat = parseFloat(mapFocusParams.get("lat")); + const focusLng = parseFloat(mapFocusParams.get("lng")); const hasActiveFilters = searchQuery.trim().length > 0 || selectedCities.length > 0; const hasSearchParams = searchQuery.trim().length > 0 || selectedCities.length > 0; const searchPrompt = isSearchView && !hasSearchParams; @@ -201,6 +206,18 @@ export default function MainFeed() { feedRef.current?.scrollTo({ top: 0, behavior: "smooth" }); }, [isMapView, navigate]); + // Клик по локации на карточке — карта с фокусом на этом объявлении + const handleLocationClick = useCallback((ad) => { + const params = new URLSearchParams({ view: "map", post: ad.id }); + if (ad.latitude != null && ad.longitude != null) { + params.set("lat", ad.latitude); + params.set("lng", ad.longitude); + } + setActiveNav("map"); + navigate(`/feed?${params.toString()}`); + feedRef.current?.scrollTo({ top: 0, behavior: "smooth" }); + }, [navigate]); + const handleProfileClick = useCallback(() => { if (!isAuthenticated) modals.open("auth"); else modals.open("profile"); @@ -276,7 +293,7 @@ export default function MainFeed() {
{isMapView ? ( - + ) : ( <>
@@ -295,6 +312,7 @@ export default function MainFeed() { onDelete={actions.handleDelete} onMarkFound={actions.handleMarkFound} onImageClick={handleImageClick} + onLocationClick={handleLocationClick} onAuthRequired={() => modals.open("auth")} t={t} /> diff --git a/src/pages/PostOnFeed.jsx b/src/pages/PostOnFeed.jsx index aa85eb3..1e17823 100644 --- a/src/pages/PostOnFeed.jsx +++ b/src/pages/PostOnFeed.jsx @@ -11,7 +11,7 @@ import DateCalendarPopup from "../components/DateCalendarPopup"; import Toast from "../components/Toast"; import {useTranslation} from 'react-i18next'; -export default function PostOnFeed({ ad, liked, likeCountAdj, onLike, onEdit, onDelete, onMarkFound, isOwner, onImageClick, onAuthRequired }) { +export default function PostOnFeed({ ad, liked, likeCountAdj, onLike, onEdit, onDelete, onMarkFound, isOwner, onImageClick, onLocationClick, onAuthRequired }) { const { t } = useTranslation(); const [showCalendar, setShowCalendar] = useState(false); const [descExpanded, setDescExpanded] = useState(false); @@ -131,7 +131,18 @@ export default function PostOnFeed({ ad, liked, likeCountAdj, onLike, onEdit, on
- {address &&
{address}
} + {address && ( +
{ + e.stopPropagation(); + onLocationClick?.(ad); + }} + > + {address} +
+ )} {createdAt && (