Google Map In Nuxt

Coding | January 2024Read in Outline

<template>
 <Box ref="mapElement" w="full" flex="1" />
</template>

<script setup lang="ts">
    import { onMounted } from 'vue'

    import { Loader } from '@googlemaps/js-api-loader'

    import type { ComponentPublicInstance } from 'vue'
    import type Box from '~/components/core/layout/Box'

    const config = useRuntimeConfig()

    const mapElement = ref<ComponentPublicInstance<typeof Box> | null>(null)
    const map = ref<google.maps.Map>()
    const markers = []
    onMounted(() => {
        const loader = new Loader({
            apiKey: config.public.googlemapApiKey,
            version: 'weekly'
        })

        loader.importLibrary('maps').then(async () => {
            const { Map } = (await google.maps.importLibrary(
                'maps'
            )) as google.maps.MapsLibrary
            const savedPosition = localStorage.getItem('currentMapCenter')
            const mapCenter = savedPosition
                ? JSON.parse(savedPosition)
                : { lat: -34.397, lng: 150.644 }
            const savedZoom = localStorage.getItem('currentMapZoom')
            const mapZoom = savedZoom ? JSON.parse(savedZoom) : 5

            map.value = new Map(mapElement.value?.$el, {
                center: mapCenter,
                zoom: mapZoom,
                fullscreenControl: false,
                mapTypeControl: false,
                streetViewControl: false
            })
            navigator.geolocation.getCurrentPosition(
                (res) => {
                    const { latitude, longitude } = res.coords
                    markers.push(
                        new google.maps.Marker({
                            position: { lat: latitude, lng: longitude },
                            map: map.value
                        })
                    )
                },
                console.log,
                {}
            )
            map.value?.addListener('bounds_changed', () => {
                localStorage.setItem(
                    'currentMapCenter',
                    JSON.stringify(map.value?.getCenter())
                )
                localStorage.setItem(
                    'currentMapZoom',
                    JSON.stringify(map.value?.getZoom())
                )
            })

            map.value?.addListener(
                'click',
                (event: google.maps.FeatureMouseEvent) => {
                    const { latLng } = event
                    if (!latLng) {
                        return
                    }
                    const { lat, lng } = latLng

                    markers.push(
                        new google.maps.Marker({
                            position: { lat: lat(), lng: lng() },
                            map: map.value
                        })
                    )
                }
            )
        })
    })
</script>

<style></style>

© 2023-2024 HamP, Assets used in the site belongs to respective owner | View Source