All files / src/services deviceLocationService.ts

14.28% Statements 3/21
0% Branches 0/12
0% Functions 0/5
15% Lines 3/20

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 622x     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;
  }
}