mirror of
https://github.com/mue/mue.git
synced 2026-07-11 18:31:47 +02:00
fix(photoPackAPI): improve latitude and longitude handling with numeric validation
fix(PhotoInformation): refactor coordinate checks for map display logic
This commit is contained in:
@@ -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,
|
||||
}),
|
||||
|
||||
@@ -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 }),
|
||||
});
|
||||
|
||||
@@ -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" />
|
||||
</>
|
||||
|
||||
Reference in New Issue
Block a user