Map.vue 3.0 KB

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