Auto-show zoomed map when EXIF location data is detected

- Automatically display map when photo contains GPS coordinates
- Zoom to level 15 for EXIF locations (more detailed view)
- Add contextual header explaining location source
- Improve map container styling with shadow and colored header
- Show helpful message for EXIF vs manual location selection
This commit is contained in:
2025-11-16 17:18:30 +00:00
parent 51a8b4999d
commit 7dc1ff740b

View File

@@ -55,6 +55,7 @@ export function LocationSelector({ photos, onLocationChange, initialLocation }:
setSelectedLocation(coords); setSelectedLocation(coords);
setLocationSource('exif'); setLocationSource('exif');
setValidationError(null); setValidationError(null);
setShowMap(true); // Automatically show map with EXIF location
onLocationChange(coords, 'exif'); onLocationChange(coords, 'exif');
} else { } else {
setValidationError('Photo location is outside Ireland. Please select a location manually.'); setValidationError('Photo location is outside Ireland. Please select a location manually.');
@@ -87,8 +88,9 @@ export function LocationSelector({ photos, onLocationChange, initialLocation }:
? [selectedLocation.latitude, selectedLocation.longitude] ? [selectedLocation.latitude, selectedLocation.longitude]
: defaultCenter; : defaultCenter;
// Create map instance // Create map instance with higher zoom for EXIF locations
const map = L.map(mapRef.current).setView(initialCenter, selectedLocation ? 13 : 7); const initialZoom = selectedLocation && locationSource === 'exif' ? 15 : selectedLocation ? 13 : 7;
const map = L.map(mapRef.current).setView(initialCenter, initialZoom);
// Add OpenStreetMap tiles // Add OpenStreetMap tiles
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
@@ -315,11 +317,23 @@ export function LocationSelector({ photos, onLocationChange, initialLocation }:
{/* Map Picker */} {/* Map Picker */}
{showMap && ( {showMap && (
<div className="border border-gray-300 rounded-lg overflow-hidden"> <div className="border border-gray-300 rounded-lg overflow-hidden shadow-lg">
<div className="bg-gray-100 px-4 py-2 border-b border-gray-300"> <div className="bg-blue-50 px-4 py-3 border-b border-blue-200">
<p className="text-sm text-gray-700"> <div className="flex items-start">
Click on the map to select a location, or drag the marker to adjust. <svg className="h-5 w-5 text-blue-600 mt-0.5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor">
</p> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<div>
<p className="text-sm font-medium text-blue-900">
{locationSource === 'exif' ? 'Location from Photo' : 'Select Location'}
</p>
<p className="text-sm text-blue-700 mt-1">
{locationSource === 'exif'
? 'This location was extracted from your photo. You can adjust it by dragging the marker or clicking a new location.'
: 'Click on the map to select a location, or drag the marker to adjust.'}
</p>
</div>
</div>
</div> </div>
<div ref={mapRef} className="w-full h-96" /> <div ref={mapRef} className="w-full h-96" />
</div> </div>