'use strict' import $ from 'jquery' import Events from '../_events' import '../../scss/_components/_ui.map.scss' import CONSTS from 'js/_consts' const MapAPI = (($) => { // Constants const NAME = 'jsMapAPI' const DATA_KEY = NAME const $BODY = $('body') const MAP_DRIVER = CONSTS.MAP_DRIVER const W = window class MapAPI { // Constructor constructor (el) { const ui = this const Drv = new MAP_DRIVER() ui.$el = $(el) const $el = ui.$el const config = $el.data() config.center = [ config.lng ? config.lng : $BODY.data('default-lng'), config.lat ? config.lat : $BODY.data('default-lat'), ] config.style = config.style ? jQuery.parseJSON(config.style) : null config['font-family'] = $BODY.css('font-family') if (!config.icon) { config.icon = '' } console.log(`${NAME}: init ${Drv.getName()}...`) Drv.init($el, config) ui.drv = Drv $el.on(Events.MAPAPILOADED, (e) => { ui.map = Drv.getMap() if (config.geojson) { console.log(`${NAME}: setting up geocode data`) Drv.addGeoJson(config) } else if (config.address) { console.log(config.address) console.log(`${NAME}: setting up address marker`) Drv.geocode(config.address, (results) => { console.log(results) const lat = results[0].geometry.location.lat() const lng = results[0].geometry.location.lng() console.log( `${NAME}: setting up single lat/lng marker lat: ${lat} lng: ${lng}` ) Drv.addMarker([lng, lat], config) ui.map.setCenter({ lat, lng }) }) } else if (config.lat && config.lng) { const lat = config.lat const lng = config.lng console.log( `${NAME}: setting up single lat/lng marker lat: ${lat} lng: ${lng}` ) Drv.addMarker([lng, lat], config) } $el.data(DATA_KEY, ui) $el.addClass(`${NAME}-active`) $el.trigger(Events.MAPLOADED) console.log(`${NAME}: Map is loaded`) }) } // Public methods getMap () { return ui.map } dispose () { const ui = this ui.$el = null $.removeData(ui.$el[0], DATA_KEY) ui.$el.removeClass(`${NAME}-active`) } static _jQueryInterface () { if (typeof W.localStorage !== 'undefined') { return this.each(() => { // attach functionality to el const $el = $(this) let data = $el.data(DATA_KEY) if (!data) { data = new MapAPI(this) $el.data(DATA_KEY, data) } }) } } } // jQuery interface $.fn[NAME] = MapAPI._jQueryInterface $.fn[NAME].Constructor = MapAPI $.fn[NAME].noConflict = () => { $.fn[NAME] = JQUERY_NO_CONFLICT return MapAPI._jQueryInterface } // auto-apply $(W).on(`${Events.AJAX} ${Events.LOADED}`, () => { $('.mapAPI-map-container').jsMapAPI() }) return MapAPI })($) export default MapAPI