Skip to content

Instantly share code, notes, and snippets.

@nathanbarrett
Created April 14, 2019 19:02
Show Gist options
  • Save nathanbarrett/23591f6fb4583f16f7cdc2d0e6373a87 to your computer and use it in GitHub Desktop.
Save nathanbarrett/23591f6fb4583f16f7cdc2d0e6373a87 to your computer and use it in GitHub Desktop.
Vue JS directive for mounting Google's Places Autocomplete on an input
"use strict";
export const addressAutocomplete = {
bind(el, binding) {
const callback = binding.value;
if(callback && typeof callback !== "function") {
console.error("Value for google places directive must be a function");
return;
}
const autocomplete = new google.maps.places.Autocomplete(el, {
types: ['geocode'],
fields: ['address_components', 'formatted_address']
});
autocomplete.addListener('place_changed', () => {
let formattedResults = formatPlacesAutocompleteResults(autocomplete.getPlace());
if(callback) {
callback(formattedResults);
}
})
}
}
function formatPlacesAutocompleteResults(results) {
if( ! results || ! results.address_components) {
throw new Error('Invalid Google Places Automplete Results Given');
}
let full_address = results.formatted_address;
let address, city, region, postal_code, street_number, route;
for(let place of results.address_components) {
if(place.types.indexOf('street_number') >= 0) {
street_number = place.short_name;
continue;
}
if(place.types.indexOf('route') >= 0) {
route = place.short_name;
continue;
}
if(place.types.indexOf('locality') >= 0) {
city = place.long_name;
continue;
}
if(place.types.indexOf('administrative_area_level_1') >= 0) {
region = place.long_name;
continue;
}
if(place.types.indexOf('postal_code') >= 0) {
postal_code = place.long_name;
}
}
if(street_number || route) {
address = street_number + ' ' + route;
}
return { full_address, address, city, region, postal_code, street_number, route };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment