import { useState, useEffect } from 'react'; import { MapContainer, TileLayer, Marker, Popup, useMap } from 'react-leaflet'; import 'leaflet/dist/leaflet.css'; import L from 'leaflet'; import api from '../api/api'; import { useAuth } from '../context/AuthContext'; import { Star, MapPin, Navigation, Crosshair, Filter, Loader2, Search as SearchIcon } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; // Fix for default marker icons in Leaflet delete L.Icon.Default.prototype._getIconUrl; L.Icon.Default.mergeOptions({ iconRetinaUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon-2x.png', iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png', shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png', }); const RecenterMap = ({ coords }) => { const map = useMap(); useEffect(() => { if (coords) { map.setView(coords, 13); } }, [coords, map]); return null; }; const ExploreMap = () => { const [photographers, setPhotographers] = useState([]); const [userLocation, setUserLocation] = useState(null); const [loading, setLoading] = useState(true); const [isFilterOpen, setIsFilterOpen] = useState(false); const [filters, setFilters] = useState({ specialty: '', price: 'all', availableNow: false }); const navigate = useNavigate(); useEffect(() => { // Get user's current location if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { const coords = [position.coords.latitude, position.coords.longitude]; setUserLocation(coords); fetchNearby(coords[0], coords[1]); }, (err) => { console.error('Location error:', err); // Default to some city center if blocked (e.g. Hyderabad) const defaultCoords = [17.3850, 78.4867]; setUserLocation(defaultCoords); fetchNearby(defaultCoords[0], defaultCoords[1]); } ); } }, []); const fetchNearby = async (lat, lng) => { try { setLoading(true); const response = await api.get(`/users/nearby?lat=${lat}&lng=${lng}&radius=10000`); setPhotographers(response.data); setLoading(false); } catch (error) { console.error('Failed to fetch nearby photographers:', error); setLoading(false); } }; const filteredPhotographers = photographers.filter(pg => { if (filters.specialty && !pg.specialty?.toLowerCase().includes(filters.specialty.toLowerCase())) return false; if (filters.price !== 'all') { const price = pg.price || 0; if (filters.price === 'budget' && price > 50) return false; if (filters.price === 'mid' && (price < 50 || price > 150)) return false; if (filters.price === 'pro' && price < 150) return false; } return true; }); return (
{pg.specialty}
Initializing SnapLocal Pro Map...