import {
|
MapType,
|
getMapInfo,
|
IS_AMAP
|
} from '../../../../helpers/location'
|
import { createCallout } from './callout'
|
|
let maps
|
const callbacksMap = {}
|
const GOOGLE_MAP_CALLBACKNAME = '__map_callback__'
|
|
export function loadMaps (libraries, callback) {
|
const mapInfo = getMapInfo()
|
if (!mapInfo.key) {
|
console.error('Map key not configured.')
|
return
|
}
|
const callbacks = (callbacksMap[mapInfo.type] = callbacksMap[mapInfo.type] || [])
|
if (maps) {
|
callback(maps)
|
} else if (
|
window[mapInfo.type] &&
|
window[mapInfo.type].maps
|
) {
|
maps = IS_AMAP ? window[mapInfo.type] : window[mapInfo.type].maps
|
maps.Callout = maps.Callout || createCallout(maps)
|
callback(maps)
|
} else if (callbacks.length) {
|
callbacks.push(callback)
|
} else {
|
callbacks.push(callback)
|
const globalExt = window
|
const callbackName = GOOGLE_MAP_CALLBACKNAME + mapInfo.type
|
globalExt[callbackName] = function () {
|
delete globalExt[callbackName]
|
maps = IS_AMAP ? window[mapInfo.type] : window[mapInfo.type].maps
|
maps.Callout = createCallout(maps)
|
callbacks.forEach((callback) => callback(maps))
|
callbacks.length = 0
|
}
|
const script = document.createElement('script')
|
let src = getScriptBaseUrl(mapInfo.type)
|
|
if (mapInfo.type === MapType.QQ) {
|
libraries.push('geometry')
|
}
|
if (libraries.length) {
|
src += `libraries=${libraries.join('%2C')}&`
|
}
|
|
if (IS_AMAP) {
|
handleAMapSecurityPolicy(mapInfo)
|
}
|
script.src = `${src}key=${mapInfo.key}&callback=${callbackName}`
|
script.onerror = function () {
|
console.error('Map load failed.')
|
}
|
document.body.appendChild(script)
|
}
|
}
|
|
function getScriptBaseUrl (mapType) {
|
const urlMap = {
|
qq: 'https://map.qq.com/api/js?v=2.exp&',
|
google: 'https://maps.googleapis.com/maps/api/js?',
|
AMap: 'https://webapi.amap.com/maps?v=2.0&'
|
}
|
|
return urlMap[mapType]
|
}
|
|
function handleAMapSecurityPolicy (mapInfo) {
|
window._AMapSecurityConfig = {
|
securityJsCode: mapInfo.securityJsCode || '',
|
serviceHost: mapInfo.serviceHost || ''
|
}
|
}
|