This commit is contained in:
Andras Schmelczer 2026-05-06 22:40:46 +01:00
parent 28323f145e
commit 94f9c0d594
76 changed files with 3238 additions and 1230 deletions

View file

@ -1,6 +1,6 @@
import { useState, useCallback, useRef, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import type { PostcodeGeometry } from '../../types';
import type { MapFlyToOptions, PostcodeGeometry } from '../../types';
import { authHeaders } from '../../lib/api';
import { useIsMobile } from '../../hooks/useIsMobile';
import { useLocationSearch, type SearchResult } from '../../hooks/useLocationSearch';
@ -8,6 +8,8 @@ import { PlaceSearchInput } from '../ui/PlaceSearchInput';
import { LocateIcon } from '../ui/icons/LocateIcon';
import { SearchIcon } from '../ui/icons/SearchIcon';
declare const __DEV__: boolean;
export interface SearchedLocation {
postcode: string;
geometry: PostcodeGeometry;
@ -35,13 +37,18 @@ const ZOOM_FOR_TYPE: Record<string, number> = {
isolated_dwelling: 16,
};
const DEV_CURRENT_LOCATION = {
latitude: 51.5033635,
longitude: -0.1276248,
};
export default function LocationSearch({
onFlyTo,
onLocationSearched,
onCurrentLocationFound,
onMouseEnter,
}: {
onFlyTo: (lat: number, lng: number, zoom: number) => void;
onFlyTo: (lat: number, lng: number, zoom: number, options?: MapFlyToOptions) => void;
onLocationSearched?: (postcode: SearchedLocation | null) => void;
onCurrentLocationFound?: (lat: number, lng: number) => void;
onMouseEnter?: () => void;
@ -162,7 +169,7 @@ export default function LocationSearch({
const [locating, setLocating] = useState(false);
const locateUser = useCallback(async () => {
if (!navigator.geolocation) {
if (!__DEV__ && !navigator.geolocation) {
setError(t('locationSearch.geolocationUnsupported'));
return;
}
@ -170,15 +177,27 @@ export default function LocationSearch({
setLocating(true);
search.close();
try {
const position = await new Promise<GeolocationPosition>((resolve, reject) => {
navigator.geolocation.getCurrentPosition(resolve, reject, {
enableHighAccuracy: true,
timeout: 10000,
});
});
const { latitude, longitude } = position.coords;
onFlyTo(latitude, longitude, 17);
onCurrentLocationFound?.(latitude, longitude);
const { latitude, longitude } = __DEV__
? DEV_CURRENT_LOCATION
: await new Promise<GeolocationCoordinates>((resolve, reject) => {
if (!navigator.geolocation) {
reject(new Error('Geolocation unsupported'));
return;
}
navigator.geolocation.getCurrentPosition(
(position) => resolve(position.coords),
reject,
{
enableHighAccuracy: true,
timeout: 10000,
}
);
});
if (onCurrentLocationFound) {
onCurrentLocationFound(latitude, longitude);
} else {
onFlyTo(latitude, longitude, 17);
}
search.clear();
if (isMobile) setExpanded(false);
} catch {