Note: This release is in preview. Features described here don’t become generally available until the latest general availability date that Salesforce announces for this release. Before then, and where features are noted as beta, pilot, or developer preview, we can’t guarantee general availability within any particular time frame or at all. Make your purchase decisions only on the basis of generally available products and features.
LocationService Example
Here’s a basic example of a Lightning web component that gets the user’s current
location and displays it on a map.
The HTML template provides the bare minimum for a location-based interface. There’s an element
to display the map, a bit of static help text, and a button to get the location. There are two
interesting aspects of this template:
- Disabling the Get Current Location button using the disabled attribute when not in a supported Salesforce mobile app. This attribute is set based on the results of isAvailable() when the component is initialized.
- A spinner that indicates “indeterminate progress” while waiting for the current location request to resolve.
1<!-- locationServiceExample.html -->
2<template>
3
4 <div class="slds-text-align_center">
5 <span class="slds-text-heading_large">Where in the World Am I?</span>
6 </div>
7
8 <!-- After the current location is received,
9 its value is displayed here: -->
10 <template lwc:if={currentLocation}>
11 <div class="slds-m-vertical_large slds-p-vertical_medium
12 slds-text-align_left slds-border_top slds-border_bottom">
13
14 <!-- Current location as latitude and longitude -->
15 Your current location is:
16 <pre>{currentLocationAsString}</pre>
17
18 <!-- Current location as a map -->
19 <lightning-map map-markers={currentLocationAsMarker} zoom-level=16>
20 </lightning-map>
21 </div>
22 </template>
23
24 <!-- While request is processing, show spinner -->
25 <div class="slds-m-around_large">
26 <template lwc:if={requestInProgress}>
27 <div class="slds-is-relative">
28 <lightning-spinner
29 alternative-text="Getting location...">
30 </lightning-spinner>
31 </div>
32 </template>
33 </div>
34
35 <!-- Static help text -->
36 <div class="slds-text-align_center slds-text-color_weak slds-m-vertical_large">
37 Click <strong>Get Current Location</strong> to see where you are.
38 </div>
39
40 <!-- The get-current-location button;
41 Disabled if LocationService isn't available -->
42 <div class="slds-align_absolute-center slds-m-vertical_large">
43 <lightning-button
44 variant="brand"
45 disabled={locationButtonDisabled}
46 icon-name="utility:target"
47 label="Get Current Location"
48 title="Use your device's GPS and other location sensors to determine your current location"
49 onclick={handleGetCurrentLocationClick}>
50 </lightning-button>
51 </div>
52</template>Once the current location is determined, we use the lightning-map base component to display it. Each phase of the location request lifecycle writes a console message.
1// locationServiceExample.js
2import { LightningElement } from 'lwc';
3import { ShowToastEvent } from 'lightning/platformShowToastEvent';
4import { getLocationService } from 'lightning/mobileCapabilities';
5
6export default class LocationServiceExample extends LightningElement {
7
8 // Internal component state
9 myLocationService;
10 currentLocation;
11 locationButtonDisabled = false;
12 requestInProgress = false;
13
14 // When component is initialized, detect whether to enable Location button
15 connectedCallback() {
16 this.myLocationService = getLocationService();
17 if (this.myLocationService == null || !this.myLocationService.isAvailable()) {
18 this.locationButtonDisabled = true;
19 }
20 }
21
22 handleGetCurrentLocationClick(event) {
23 // Reset current location
24 this.currentLocation = null;
25
26 if(this.myLocationService != null && this.myLocationService.isAvailable()) {
27
28 // Configure options for location request
29 const locationOptions = {
30 enableHighAccuracy: true
31 }
32
33 // Show an "indeterminate progress" spinner before we start the request
34 this.requestInProgress = true;
35
36 // Make the request
37 // Uses anonymous function to handle results or errors
38 this.myLocationService
39 .getCurrentPosition(locationOptions)
40 .then((result) => {
41 this.currentLocation = result;
42
43 // result is a Location object
44 console.log(JSON.stringify(result));
45
46 this.dispatchEvent(
47 new ShowToastEvent({
48 title: 'Location Detected',
49 message: 'Location determined successfully.',
50 variant: 'success'
51 })
52 );
53 })
54 .catch((error) => {
55 // Handle errors here
56 console.error(error);
57
58 // Inform the user we ran into something unexpected
59 this.dispatchEvent(
60 new ShowToastEvent({
61 title: 'LocationService Error',
62 message:
63 'There was a problem locating you: ' +
64 JSON.stringify(error) +
65 ' Please try again.',
66 variant: 'error',
67 mode: 'sticky'
68 })
69 );
70 })
71 .finally(() => {
72 console.log('#finally');
73 // Remove the spinner
74 this.requestInProgress = false;
75 });
76 } else {
77 // LocationService is not available
78 // Not running on hardware with GPS, or some other context issue
79 console.log('Get Location button should be disabled and unclickable. ');
80 console.log('Somehow it got clicked: ');
81 console.log(event);
82
83 // Let user know they need to use a mobile phone with a GPS
84 this.dispatchEvent(
85 new ShowToastEvent({
86 title: 'LocationService Is Not Available',
87 message: 'Try again from the Salesforce app on a mobile device.',
88 variant: 'error'
89 })
90 );
91 }
92 }
93
94 // Format LocationService result Location object as a simple string
95 get currentLocationAsString() {
96 return `Lat: ${this.currentLocation.coords.latitude}, Long: ${this.currentLocation.coords.longitude}`;
97 }
98
99 // Format Location object for use with lightning-map base component
100 get currentLocationAsMarker() {
101 return [{
102 location: {
103 Latitude: this.currentLocation.coords.latitude,
104 Longitude: this.currentLocation.coords.longitude
105 },
106 title: 'My Location'
107 }]
108 }
109}