Skip to main content

@54vie/location - Location Services

Module providing location services for 54VIE Super App.

Installation

pnpm add @54vie/location

Current Location

import { useLocation, LocationService } from '@54vie/location';

// Hook
function NearbyStores() {
const {
location,
isLoading,
error,
hasPermission,
requestPermission,
refresh,
} = useLocation();

if (!hasPermission) {
return <Button onPress={requestPermission}>Allow Location</Button>;
}

if (isLoading) return <Loading />;

return <StoreList lat={location.latitude} lng={location.longitude} />;
}

// Direct
const service = new LocationService();
const position = await service.getCurrentPosition({
accuracy: 'high',
timeout: 15000,
});

Location Tracking

import { useTracking } from '@54vie/location';

function DeliveryTracking() {
const {
isTracking,
positions,
distance,
start,
stop,
pause,
resume,
} = useTracking();

return (
<View>
<MapView>
<Polyline coordinates={positions} />
</MapView>
<Text>Distance: {distance.toFixed(2)} km</Text>
<Button onPress={isTracking ? stop : start}>
{isTracking ? 'Stop' : 'Start'} Tracking
</Button>
</View>
);
}

Geofencing

import { useGeofence } from '@54vie/location';

function StorePromotion() {
const { addRegion, onEnter, onExit } = useGeofence();

useEffect(() => {
addRegion({
id: 'store-1',
name: 'Store ABC',
latitude: 10.7769,
longitude: 106.7009,
radius: 100, // meters
});

onEnter((region) => {
showNotification(`Welcome to ${region.name}!`);
});

onExit((region) => {
showNotification(`Thanks for visiting ${region.name}!`);
});
}, []);
}

Geocoding

import { useGeocoding, GeocodingService } from '@54vie/location';

// Hook
function AddressInput() {
const { geocode, reverseGeocode, isLoading } = useGeocoding();

const handleAddressSubmit = async (address) => {
const location = await geocode(address);
console.log(location); // { latitude, longitude }
};

const handleMapPress = async (lat, lng) => {
const address = await reverseGeocode(lat, lng);
console.log(address); // { street, ward, district, city }
};
}

Address Autocomplete

import { useAddressSearch } from '@54vie/location';

function AddressSearch() {
const { search, results, isLoading } = useAddressSearch();

return (
<View>
<TextInput
placeholder="Search address..."
onChangeText={search}
/>
<FlatList
data={results}
renderItem={({ item }) => (
<ListItem
title={item.formattedAddress}
subtitle={item.district}
onPress={() => selectAddress(item)}
/>
)}
/>
</View>
);
}

Map Components

import { MapView, Marker, Polyline, Circle } from '@54vie/location';

function StoreMap() {
return (
<MapView
initialRegion={{
latitude: 10.7769,
longitude: 106.7009,
latitudeDelta: 0.01,
longitudeDelta: 0.01,
}}
showsUserLocation
>
<Marker
coordinate={{ latitude: 10.7769, longitude: 106.7009 }}
title="Store ABC"
/>
<Circle
center={{ latitude: 10.7769, longitude: 106.7009 }}
radius={500}
fillColor="rgba(0, 122, 255, 0.1)"
/>
</MapView>
);
}

Vietnam Support

import { formatVietnamAddress, VIETNAM_LANDMARKS } from '@54vie/location';

// Format address
const formatted = formatVietnamAddress({
street: '123 Nguyen Hue',
ward: 'Ben Nghe',
district: 'Quan 1',
city: 'Ho Chi Minh',
});
// "123 Nguyen Hue, Phuong Ben Nghe, Quan 1, TP. Ho Chi Minh"

// Popular locations
console.log(VIETNAM_LANDMARKS.hoChiMinh.center);
// { lat: 10.7769, lng: 106.7009 }