import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; import { Tracker } from 'meteor/tracker'; import GoogleMapsLoader from 'google-maps'; class GkeysC { constructor() { this.gmapkey = new ReactiveVar(null); const self = this; this.callbacks = []; Meteor.startup(() => { Meteor.call('getMapKey', (error, key) => { // console.log(google.maps); GoogleMapsLoader.KEY = key; GoogleMapsLoader.LIBRARIES = ['places']; // The google-maps npm package (v3.2.1) builds the script URL without // `loading=async`, which Google now warns about. It exposes no hook for // extra params, so wrap createUrl to append it (no node_modules edit). const origCreateUrl = GoogleMapsLoader.createUrl; GoogleMapsLoader.createUrl = () => `${origCreateUrl()}&loading=async`; GoogleMapsLoader.load(() => { self.gmapkey.set(key); console.log('GMaps script just loaded'); self.doCallbacks(key); }); }); }); } doCallbacks(key) { for (let i = 0; i < this.callbacks.length; i += 1) { this.callbacks[i](null, key); } this.callbacks = []; } load(callback) { this.callbacks.push(callback); Tracker.autorun((computation) => { const key = this.gmapkey.get(); if (key) { // already loaded // console.log('GMaps already loaded'); this.doCallbacks(key); computation.stop(); } else { console.log('Waiting for the gkey'); } }); } } const Gkeys = new GkeysC(); export default Gkeys;