fix(photoPackAPI): improve latitude and longitude handling with numeric validation

fix(PhotoInformation): refactor coordinate checks for map display logic
This commit is contained in:
alexsparkes
2026-05-05 21:50:31 +01:00
parent ed3c67816a
commit 449b7839c2
3 changed files with 43 additions and 21 deletions

View File

@@ -330,8 +330,8 @@ function getPhotoPackBackground(isOffline) {
...(selected.colour && { colour: selected.colour }),
...(selected.camera && { camera: selected.camera }),
...(selected.category && { category: selected.category }),
...(selected.latitude &&
selected.longitude && {
...(selected.latitude != null &&
selected.longitude != null && {
latitude: selected.latitude,
longitude: selected.longitude,
}),
@@ -395,8 +395,8 @@ async function prefetchPhotoPackImages(queueManager, pool, currentPhoto, current
...(photo.colour && { colour: photo.colour }),
...(photo.camera && { camera: photo.camera }),
...(photo.category && { category: photo.category }),
...(photo.latitude &&
photo.longitude && {
...(photo.latitude != null &&
photo.longitude != null && {
latitude: photo.latitude,
longitude: photo.longitude,
}),

View File

@@ -1,5 +1,14 @@
import variables from 'config/variables';
const toNumericCoordinate = (value) => {
if (value === null || value === undefined || value === '') {
return null;
}
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : null;
};
const responseParser = {
pexels: (data, query) => {
const photos = data.photos || [];
@@ -59,17 +68,27 @@ const responseParser = {
};
},
default: (data) => ({
photographer: data.photographer,
location: data.location?.name || data.location || 'Unknown',
url: { default: data.file },
blur_hash: data.blur_hash || null,
colour: data.colour,
...(data.photo_page && { photo_page: data.photo_page }),
...(data.photographer_page && { photographer_page: data.photographer_page }),
...(data.category && { category: data.category }),
...(data.camera && { camera: data.camera }),
}),
default: (data) => {
const latitude = toNumericCoordinate(data.location?.latitude);
const longitude = toNumericCoordinate(data.location?.longitude);
return {
photographer: data.photographer,
location: data.location?.name || data.location || 'Unknown',
url: { default: data.file },
blur_hash: data.blur_hash || null,
colour: data.colour,
...(latitude !== null && longitude !== null && { latitude, longitude }),
...(data.photo_page && { photo_page: data.photo_page }),
...(data.photographer_page && { photographer_page: data.photographer_page }),
...(data.category && { category: data.category }),
...(data.camera && { camera: data.camera }),
...(data.views !== undefined && { views: data.views }),
...(data.downloads !== undefined && { downloads: data.downloads }),
...(data.likes !== undefined && { likes: data.likes }),
...(data.description && { description: data.description }),
};
},
};
/**
@@ -363,8 +382,8 @@ export function buildPhotoPool() {
...(photo.colour && { colour: photo.colour }),
...(photo.camera && { camera: photo.camera }),
...(photo.category && { category: photo.category }),
...(photo.latitude &&
photo.longitude && { latitude: photo.latitude, longitude: photo.longitude }),
...(photo.latitude != null &&
photo.longitude != null && { latitude: photo.latitude, longitude: photo.longitude }),
...(photo.photo_page && { photo_page: photo.photo_page }),
...(photo.photographer_page && { photographer_page: photo.photographer_page }),
});

View File

@@ -278,6 +278,9 @@ function PhotoInformation({ info, url, api }) {
const [shareModal, openShareModal] = useState(false);
const [excludeModal, openExcludeModal] = useState(false);
const [favouriteTooltipText, setFavouriteTooltipText] = useState(t('widgets.quote.favourite'));
const latitude = Number(info.latitude);
const longitude = Number(info.longitude);
const hasCoordinates = Number.isFinite(latitude) && Number.isFinite(longitude);
// Handle pack link click
const handlePackClick = (packId) => {
@@ -406,7 +409,7 @@ function PhotoInformation({ info, url, api }) {
{/* PRIMARY SECTION - Always Visible */}
<div className="primary-content">
<div className="primary-main-row">
{localStorage.getItem('photoMap') === 'true' && info.latitude && info.longitude && (
{localStorage.getItem('photoMap') === 'true' && hasCoordinates && (
<Suspense
fallback={
<div className="location-map-section location-map-section--compact">
@@ -414,7 +417,7 @@ function PhotoInformation({ info, url, api }) {
</div>
}
>
<LocationMap latitude={info.latitude} longitude={info.longitude} compact />
<LocationMap latitude={latitude} longitude={longitude} compact />
</Suspense>
)}
<div className="photoInformation-text">
@@ -435,10 +438,10 @@ function PhotoInformation({ info, url, api }) {
{/* EXPANDED SECTION - CSS :hover controlled */}
<div className="extra-content">
{localStorage.getItem('photoMap') === 'true' && info.latitude && info.longitude && (
{localStorage.getItem('photoMap') === 'true' && hasCoordinates && (
<>
<Suspense fallback={<div className="location-map-container" />}>
<LocationMap latitude={info.latitude} longitude={info.longitude} />
<LocationMap latitude={latitude} longitude={longitude} />
</Suspense>
<div className="section-divider" />
</>