Skip to content

Commit 0186e9e

Browse files
committed
drop duplicate listing coordinates
1 parent 74e913e commit 0186e9e

6 files changed

Lines changed: 236 additions & 66 deletions

File tree

src/app/(forms)/profile/listings/[slug]/page.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default async function EditListingPage({ params }) {
4343
.single();
4444

4545
const { data: listing } = await supabase
46-
.from("listings")
46+
.from("listings_private_data")
4747
.select()
4848
.eq("owner_id", user.id)
4949
.match({ slug })

src/components/ListingRead/ListingRead.jsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ const ListingRead = memo(function Listing({
7777
? listing.name
7878
: listing.owner_first_name
7979
: getListingDisplayName(listing, user);
80+
const coordinates = listing?.coordinates;
8081

8182
if (!listing && presentation !== "demo") {
8283
console.log("Listing not found");
@@ -158,15 +159,15 @@ const ListingRead = memo(function Listing({
158159
<MapThumbnail
159160
height="320px"
160161
initialViewState={{
161-
longitude: listing.longitude,
162-
latitude: listing.latitude,
162+
longitude: coordinates.longitude,
163+
latitude: coordinates.latitude,
163164
zoom: initialZoomLevel,
164165
}}
165166
interactive={false}
166167
>
167168
<Marker
168-
longitude={listing.longitude}
169-
latitude={listing.latitude}
169+
longitude={coordinates.longitude}
170+
latitude={coordinates.latitude}
170171
anchor="center"
171172
onClick={(event) => {
172173
event.originalEvent.stopPropagation();
@@ -216,7 +217,7 @@ const ListingRead = memo(function Listing({
216217
<Button
217218
variant="secondary"
218219
size="small"
219-
href={`https://maps.apple.com/?ll=${listing.latitude},${listing.longitude}&q=${encodeURIComponent(
220+
href={`https://maps.apple.com/?ll=${coordinates.latitude},${coordinates.longitude}&q=${encodeURIComponent(
220221
listing.name
221222
)}`}
222223
target="_blank"
@@ -226,7 +227,7 @@ const ListingRead = memo(function Listing({
226227
<Button
227228
variant="secondary"
228229
size="small"
229-
href={`https://maps.google.com/?q=${listing.latitude},${listing.longitude}`}
230+
href={`https://maps.google.com/?q=${coordinates.latitude},${coordinates.longitude}`}
230231
target="_blank"
231232
>
232233
{t("Actions.openInGoogleMaps")}

src/components/ListingWrite/ListingWrite.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,7 @@ export default function ListingWrite({
114114
);
115115

116116
const [coordinates, setCoordinates] = useState<Coordinates | null>(
117-
initialListing
118-
? {
119-
latitude: initialListing.latitude,
120-
longitude: initialListing.longitude,
121-
}
122-
: null
117+
initialListing?.coordinates ?? null
123118
);
124119

125120
const [areaName, setAreaName] = useState<string>(
@@ -264,10 +259,6 @@ export default function ListingWrite({
264259
...(listingType !== "residential" && { name: validatedName }),
265260
description,
266261
location: `POINT(${selectedCoordinates.longitude} ${selectedCoordinates.latitude})`,
267-
// Temporarily store the coordinates as longitude and latitude floats in the database as well
268-
// ...because I can't get the geometry type to convert to to long and lat dynamically if a user goes direct to a listing, e.g. http://localhost:3000/map?listing=9xvN9zxH0rzZ
269-
longitude: selectedCoordinates.longitude,
270-
latitude: selectedCoordinates.latitude,
271262
area_name: areaName,
272263
country_code: countryCode,
273264
accepted_items: acceptedItems.filter((item) => item.trim() !== ""),

src/components/MapImmersive/MapImmersive.jsx

Lines changed: 76 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,20 @@ const DEFAULT_COORDINATES = {
5353
zoom: 9,
5454
};
5555

56+
function getListingCoordinates(listing) {
57+
return listing?.coordinates ?? null;
58+
}
59+
5660
function hasValidCoordinates(listing) {
61+
const coordinates = getListingCoordinates(listing);
62+
5763
return (
5864
listing &&
5965
!listing.error &&
60-
typeof listing.latitude === "number" &&
61-
typeof listing.longitude === "number" &&
62-
Number.isFinite(listing.latitude) &&
63-
Number.isFinite(listing.longitude)
66+
typeof coordinates?.latitude === "number" &&
67+
typeof coordinates?.longitude === "number" &&
68+
Number.isFinite(coordinates.latitude) &&
69+
Number.isFinite(coordinates.longitude)
6470
);
6571
}
6672

@@ -86,7 +92,9 @@ export default function MapImmersive({
8692
isDesktop,
8793
countryCode,
8894
}) {
95+
const selectedListingCoordinates = getListingCoordinates(selectedListing);
8996
const isFirstLoad = useRef(true);
97+
const hasCenteredSelectedListingRef = useRef(false);
9098
const [lastKnownPosition, setLastKnownPosition] = useState(null);
9199
const [isListingInView, setIsListingInView] = useState(true);
92100
const hasInitialPosition =
@@ -111,11 +119,14 @@ export default function MapImmersive({
111119

112120
// If there's a selected listing with valid coords, center on it instead of using IP location
113121
if (hasValidCoordinates(selectedListing)) {
122+
const coordinates = getListingCoordinates(selectedListing);
123+
114124
mapRef.current?.flyTo({
115-
center: [selectedListing.longitude, selectedListing.latitude],
125+
center: [coordinates.longitude, coordinates.latitude],
116126
zoom: 12,
117127
duration: 0,
118128
});
129+
hasCenteredSelectedListingRef.current = true;
119130
}
120131

121132
const bounds = mapRef.current.getMap().getBounds();
@@ -133,9 +144,10 @@ export default function MapImmersive({
133144

134145
// Check if selected listing is in view (only when it has valid coords)
135146
if (hasValidCoordinates(selectedListing)) {
147+
const coordinates = getListingCoordinates(selectedListing);
136148
const isInView = bounds.contains([
137-
selectedListing.longitude,
138-
selectedListing.latitude,
149+
coordinates.longitude,
150+
coordinates.latitude,
139151
]);
140152
setIsListingInView(isInView);
141153
}
@@ -144,8 +156,10 @@ export default function MapImmersive({
144156
const handleFlyToListing = useCallback(() => {
145157
if (!hasValidCoordinates(selectedListing) || !mapRef.current) return;
146158

159+
const coordinates = getListingCoordinates(selectedListing);
160+
147161
mapRef.current.flyTo({
148-
center: [selectedListing.longitude, selectedListing.latitude],
162+
center: [coordinates.longitude, coordinates.latitude],
149163
duration: 1500,
150164
});
151165
}, [selectedListing]);
@@ -154,32 +168,52 @@ export default function MapImmersive({
154168
let protocol = new Protocol();
155169
maplibregl.addProtocol("pmtiles", protocol.tile);
156170

157-
// Only handle initial positioning on first load
158-
if (isFirstLoad.current) {
159-
isFirstLoad.current = false;
160-
161-
// If there's a selected listing in URL with valid coords, center on it
162-
if (hasValidCoordinates(selectedListing)) {
163-
mapRef.current?.flyTo({
164-
center: [selectedListing.longitude, selectedListing.latitude],
165-
zoom: 12,
166-
duration: 0,
167-
});
168-
}
169-
// If no listing but we have IP coordinates, use those
170-
else if (initialCoordinates) {
171-
mapRef.current?.flyTo({
172-
center: [initialCoordinates.longitude, initialCoordinates.latitude],
173-
zoom: initialCoordinates.zoom,
174-
duration: 0,
175-
});
176-
}
177-
}
178-
179171
return () => {
180172
maplibregl.removeProtocol("pmtiles");
181173
};
182-
}, []); // Empty dependency array as before
174+
}, []);
175+
176+
useEffect(() => {
177+
if (
178+
!isFirstLoad.current ||
179+
selectedListing ||
180+
!initialCoordinates ||
181+
!mapRef.current
182+
) {
183+
return;
184+
}
185+
186+
isFirstLoad.current = false;
187+
mapRef.current.flyTo({
188+
center: [initialCoordinates.longitude, initialCoordinates.latitude],
189+
zoom: initialCoordinates.zoom,
190+
duration: 0,
191+
});
192+
}, [initialCoordinates, mapRef, selectedListing]);
193+
194+
useEffect(() => {
195+
if (
196+
!mapRef.current ||
197+
!hasValidCoordinates(selectedListing) ||
198+
hasCenteredSelectedListingRef.current
199+
) {
200+
return;
201+
}
202+
203+
const coordinates = getListingCoordinates(selectedListing);
204+
205+
mapRef.current.flyTo({
206+
center: [coordinates.longitude, coordinates.latitude],
207+
zoom: 12,
208+
duration: 0,
209+
});
210+
hasCenteredSelectedListingRef.current = true;
211+
}, [
212+
mapRef,
213+
selectedListing,
214+
selectedListingCoordinates?.latitude,
215+
selectedListingCoordinates?.longitude,
216+
]);
183217

184218
// Set mapController to set relationship between MapSearch and MapImmersive
185219
// Can't get this to work, perhaps delete all mapController and createMapLibreGlMapController code if I can't get it working
@@ -193,9 +227,11 @@ export default function MapImmersive({
193227
// Update lastKnownPosition when we have a valid position
194228
useEffect(() => {
195229
if (hasValidCoordinates(selectedListing)) {
230+
const coordinates = getListingCoordinates(selectedListing);
231+
196232
setLastKnownPosition({
197-
latitude: selectedListing.latitude,
198-
longitude: selectedListing.longitude,
233+
latitude: coordinates.latitude,
234+
longitude: coordinates.longitude,
199235
});
200236
} else if (initialCoordinates && !lastKnownPosition) {
201237
setLastKnownPosition(initialCoordinates);
@@ -210,9 +246,10 @@ export default function MapImmersive({
210246
}
211247

212248
const bounds = mapRef.current.getMap().getBounds();
249+
const coordinates = getListingCoordinates(selectedListing);
213250
const isInView = bounds.contains([
214-
selectedListing.longitude,
215-
selectedListing.latitude,
251+
coordinates.longitude,
252+
coordinates.latitude,
216253
]);
217254
console.log("isInView", isInView);
218255
setIsListingInView(isInView);
@@ -269,13 +306,13 @@ export default function MapImmersive({
269306
initialViewState={{
270307
longitude:
271308
(hasValidCoordinates(selectedListing)
272-
? selectedListing.longitude
309+
? selectedListingCoordinates.longitude
273310
: null) ??
274311
initialCoordinates?.longitude ??
275312
DEFAULT_COORDINATES.longitude,
276313
latitude:
277314
(hasValidCoordinates(selectedListing)
278-
? selectedListing.latitude
315+
? selectedListingCoordinates.latitude
279316
: null) ??
280317
initialCoordinates?.latitude ??
281318
DEFAULT_COORDINATES.latitude,
@@ -308,8 +345,8 @@ export default function MapImmersive({
308345
.map((listing) => (
309346
<DrawerTrigger key={listing.id}>
310347
<Marker
311-
longitude={listing.longitude}
312-
latitude={listing.latitude}
348+
longitude={listing.coordinates.longitude}
349+
latitude={listing.coordinates.latitude}
313350
anchor="center"
314351
onClick={(event) => {
315352
event.originalEvent.stopPropagation();

0 commit comments

Comments
 (0)