Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 2x 2x 2x | import * as ExpoLocation from 'expo-location';
import type { LocationSuggestion } from '@/models/event';
export const CURRENT_LOCATION_LABEL = 'Current location';
function buildAddressLabel(
geocodedAddress?: ExpoLocation.LocationGeocodedAddress,
): string {
if (!geocodedAddress) {
return CURRENT_LOCATION_LABEL;
}
if (geocodedAddress.formattedAddress) {
return geocodedAddress.formattedAddress;
}
const parts = [
geocodedAddress.name,
geocodedAddress.streetNumber && geocodedAddress.street
? `${geocodedAddress.street} ${geocodedAddress.streetNumber}`
: geocodedAddress.street,
geocodedAddress.district,
geocodedAddress.city,
geocodedAddress.region,
geocodedAddress.country,
].filter((value): value is string => Boolean(value?.trim()));
const uniqueParts = parts.filter(
(part, index) =>
index === parts.findIndex((candidate) => candidate.toLowerCase() === part.toLowerCase()),
);
return uniqueParts.join(', ') || CURRENT_LOCATION_LABEL;
}
export async function getCurrentLocationSuggestion(): Promise<LocationSuggestion | null> {
try {
const permission = await ExpoLocation.requestForegroundPermissionsAsync();
if (permission.status !== ExpoLocation.PermissionStatus.GRANTED) {
return null;
}
const position = await ExpoLocation.getCurrentPositionAsync({
accuracy: ExpoLocation.Accuracy.Balanced,
});
const addresses = await ExpoLocation.reverseGeocodeAsync({
latitude: position.coords.latitude,
longitude: position.coords.longitude,
});
return {
display_name: buildAddressLabel(addresses[0]),
lat: String(position.coords.latitude),
lon: String(position.coords.longitude),
};
} catch {
return null;
}
}
|