From 8e0792b9d934b23391209b988588aefa8efb8938 Mon Sep 17 00:00:00 2001 From: Fawad Mirzad Date: Fri, 16 Oct 2020 16:44:19 +0200 Subject: [PATCH] Initial commit --- .gitignore | 1 + components/Circle.vue | 39 +++++++++++ components/Map.vue | 72 +++++++++++++++++++ components/Marker.vue | 42 +++++++++++ components/Polygon.vue | 35 ++++++++++ components/Rectangle.vue | 38 ++++++++++ index.js | 16 +++++ package-lock.json | 5 ++ package.json | 21 ++++++ readme.md | 0 utils/load-google-maps.js | 143 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 412 insertions(+) create mode 100644 .gitignore create mode 100644 components/Circle.vue create mode 100644 components/Map.vue create mode 100644 components/Marker.vue create mode 100644 components/Polygon.vue create mode 100644 components/Rectangle.vue create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 readme.md create mode 100644 utils/load-google-maps.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/components/Circle.vue b/components/Circle.vue new file mode 100644 index 0000000..99a3195 --- /dev/null +++ b/components/Circle.vue @@ -0,0 +1,39 @@ + + + diff --git a/components/Map.vue b/components/Map.vue new file mode 100644 index 0000000..2c39c3b --- /dev/null +++ b/components/Map.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/components/Marker.vue b/components/Marker.vue new file mode 100644 index 0000000..21e86b8 --- /dev/null +++ b/components/Marker.vue @@ -0,0 +1,42 @@ + + + diff --git a/components/Polygon.vue b/components/Polygon.vue new file mode 100644 index 0000000..7445d7b --- /dev/null +++ b/components/Polygon.vue @@ -0,0 +1,35 @@ + + + diff --git a/components/Rectangle.vue b/components/Rectangle.vue new file mode 100644 index 0000000..325c663 --- /dev/null +++ b/components/Rectangle.vue @@ -0,0 +1,38 @@ + + + diff --git a/index.js b/index.js new file mode 100644 index 0000000..e3ccd08 --- /dev/null +++ b/index.js @@ -0,0 +1,16 @@ +import GoogleMap from './components/Map' +import Marker from './components/Marker' +import Circle from './components/Circle' +import Polygon from './components/Polygon' +import Rectangle from './components/Rectangle' + +export default { + install: (app, options) => { + app.component('GoogleMap', GoogleMap) + app.component('Marker', Marker) + app.component('Circle', Circle) + app.component('Polygon', Polygon) + app.component('Rectangle', Rectangle) + app.provide('apiKey', options.apiKey) + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3d2942a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@fawmi/vue-google-maps", + "version": "0.0.34", + "lockfileVersion": 1 +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b176766 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "@fawmi/vue-google-maps", + "description": "Google Map components for Vue.js 3", + "version": "0.0.34", + "private": false, + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fawmi/vue-google-maps.git" + }, + "author": "Fawad Mirzad", + "license": "ISC", + "bugs": { + "url": "https://github.com/fawmi/vue-google-maps/issues" + }, + "homepage": "https://vue-map.netlify.app", + "dependencies": {} +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/utils/load-google-maps.js b/utils/load-google-maps.js new file mode 100644 index 0000000..2e3c6fe --- /dev/null +++ b/utils/load-google-maps.js @@ -0,0 +1,143 @@ +export class Loader { + constructor({ + apiKey, + libraries = [], + language, + region, + version, + mapIds + }) { + // @ts-ignore + this.callbacks = []; + this.CALLBACK = "__googleMapsCallback"; + this.version = version; + this.apiKey = apiKey; + this.libraries = libraries; + // @ts-ignore + this.language = language; + // @ts-ignore + this.region = region; + this.URL = 'https://maps.googleapis.com/maps/api/js'; + // @ts-ignore + this.mapIds = mapIds; + } + /** + * CreateUrl returns the Google Maps JavaScript API script url given the [[LoaderOptions]]. + * + * @ignore + */ + createUrl() { + let url = this.URL; + console.log(this.URL) + + url += `?callback=${this.CALLBACK}`; + + if (this.apiKey) { + url += `&key=${this.apiKey}`; + } + + if (this.libraries.length > 0) { + url += `&libraries=${this.libraries.join(",")}`; + } + + if (this.language) { + url += `&language=${this.language}`; + } + + if (this.region) { + url += `®ion=${this.region}`; + } + + if (this.version) { + url += `&v=${this.version}`; + } + + if (this.mapIds) { + url += `&map_ids=${this.mapIds.join(",")}`; + } + + return url; + } + + /** + * Load the Google Maps JavaScript API script and return a Promise. + */ + load() { + return this.loadPromise(); + } + + /** + * Load the Google Maps JavaScript API script and return a Promise. + * + * @ignore + */ + loadPromise() { + return new Promise((resolve, reject) => { + this.loadCallback((err) => { + if (!err) { + resolve(); + } else { + reject(err); + } + }); + }); + } + + /** + * Load the Google Maps JavaScript API script with a callback. + */ + loadCallback(fn) { + this.callbacks.push(fn); + this.execute(); + } + + /** + * Set the script on document. + */ + setScript() { + const url = this.createUrl(); + const script = document.createElement("script"); + + script.type = "text/javascript"; + script.src = url; + // @ts-ignore + script.onerror = this.loadErrorCallback.bind(this); + script.defer = true; + script.async = true; + document.head.appendChild(script); + } + + loadErrorCallback(e) { + this.onerrorEvent = e; + this.callback(); + } + + setCallback() { + window.__googleMapsCallback = this.callback.bind(this); + } + + callback() { + this.done = true; + this.loading = false; + + this.callbacks.forEach(cb => { + cb(this.onerrorEvent); + }); + + this.callbacks = []; + } + + execute() { + if (this.done) { + this.callback(); + } else { + if (this.loading) { + // do nothing but wait + } else { + this.loading = true; + this.setCallback(); + this.setScript(); + } + } + } +}