Map.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <!--
  2. Leaflet map
  3. @see https://leafletjs.com/
  4. -->
  5. <template>
  6. <div id="map-wrap">
  7. <client-only>
  8. <l-map :zoom="zoom" :center="center">
  9. <l-tile-layer :url="layerUrl" />
  10. <l-marker
  11. :lat-lng="latLong"
  12. draggable
  13. @update:latLng="onMoveMarker"
  14. />
  15. </l-map>
  16. <v-btn class="mr-4 ot_green ot_white--text" @click="updateMap">
  17. {{ $t('updateMap') }}
  18. </v-btn>
  19. </client-only>
  20. </div>
  21. </template>
  22. <script lang="ts">
  23. import { defineComponent, computed, ref, toRefs, useContext, ComputedRef, Ref } from '@nuxtjs/composition-api'
  24. import { ToRefs } from '@vue/composition-api'
  25. import { QUERY_TYPE, TYPE_ALERT } from '~/types/enums'
  26. import { AddressPostal } from '~/models/Core/AddressPostal'
  27. import { AnyJson, alert } from '~/types/interfaces'
  28. export default defineComponent({
  29. props: {
  30. address: {
  31. type: Object as () => AddressPostal,
  32. required: true
  33. },
  34. zoom: {
  35. type: Number,
  36. required: true
  37. }
  38. },
  39. setup (props, { emit }) {
  40. const { $dataProvider, store } = useContext()
  41. const { address }: ToRefs = toRefs(props)
  42. const latitude: Ref<number> = ref(address.value.latitude)
  43. const longitude: Ref<number> = ref(address.value.longitude)
  44. const center: ComputedRef<Array<number>> = computed(() => [latitude.value, longitude.value])
  45. const latLong: ComputedRef<Array<number>> = computed(() => [latitude.value, longitude.value])
  46. const layerUrl: string = 'https://{s}.tile.osm.org/{z}/{x}/{y}.png'
  47. const updateMap = async () => {
  48. const response = await $dataProvider.invoke({
  49. type: QUERY_TYPE.DEFAULT,
  50. url: `gps-coordinate-searching?street=${address.value.streetAddress} ${address.value.streetAddressSecond} ${address.value.streetAddressThird}&cp=${address.value.postalCode}&city=${address.value.addressCity}`
  51. })
  52. if (response.length > 0) {
  53. latitude.value = response[0].latitude
  54. longitude.value = response[0].longitude
  55. address.value.latitude = response[0].latitude
  56. address.value.longitude = response[0].longitude
  57. emit('updateAddress', address.value)
  58. } else {
  59. const alert: alert = {
  60. type: TYPE_ALERT.ALERT,
  61. message: 'no_coordinate_corresponding'
  62. }
  63. store.commit('page/setAlert', alert)
  64. }
  65. }
  66. const onMoveMarker = async (event: AnyJson) => {
  67. const response = await $dataProvider.invoke({
  68. type: QUERY_TYPE.DEFAULT,
  69. url: `gps-coordinate-reverse/${event.lat}/${event.lng}`
  70. })
  71. address.value.streetAddress = response.streetAddress
  72. address.value.streetAddressSecond = response.streetAddressSecond
  73. address.value.streetAddressThird = response.streetAddressThird
  74. address.value.postalCode = response.cp
  75. address.value.addressCity = response.city
  76. emit('updateAddress', address.value)
  77. }
  78. return {
  79. updateMap,
  80. center,
  81. latLong,
  82. layerUrl,
  83. onMoveMarker
  84. }
  85. }
  86. })
  87. </script>
  88. <style scoped>
  89. #map-wrap{
  90. height: 30vh;
  91. }
  92. </style>