useAddresspostal.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { AnyJson } from '~/types/interfaces'
  2. import {QUERY_TYPE} from "~/types/enums";
  3. import { useContext } from '@nuxtjs/composition-api'
  4. import DataProvider from "~/services/data/dataProvider";
  5. /**
  6. * @category composables/data
  7. * @class UseAddressPostal
  8. * Use Classe pour gérer les deux champs postal code et adresseCity
  9. */
  10. export class UseAddressPostal {
  11. private $dataProvider!: DataProvider
  12. constructor() {
  13. const {$dataProvider} = useContext()
  14. this.$dataProvider = $dataProvider
  15. }
  16. public invoke(): AnyJson{
  17. return {
  18. searchFunction: (research: string, field: string) => this.searchFunction(research, field),
  19. updateCpAddress: (value:AnyJson, updateRepository: Function) => this.updateCpAddress(value, updateRepository),
  20. }
  21. }
  22. /**
  23. * Fonction de recherche qui utilise l'API gouvernematal pour autocompléter les CP et villes.
  24. * @param research
  25. * @param field
  26. * @private
  27. */
  28. private async searchFunction (research: string, field: string): Promise<Array<AnyJson>>{
  29. if(research){
  30. const response = await this.$dataProvider.invoke({
  31. type: QUERY_TYPE.DEFAULT,
  32. url: `https://api-adresse.data.gouv.fr/search/?q=${research}&type=municipality&autocomplete=1&limit=20`,
  33. params: {
  34. noXaccessId: true
  35. }
  36. })
  37. const apiResponse = response.data.features.map((data:AnyJson)=>data.properties)
  38. // Par défaut on insère les valeurs que l'utilisateur a écrit, car un nom de ville ou de CP peut être absent de l'API
  39. const defaultResponse = []
  40. if(field === 'addressPostal.addressCity'){
  41. defaultResponse.push({id:0, postcode: null, city: research})
  42. }else{
  43. defaultResponse.push({id:0, postcode: research, city: null})
  44. }
  45. return defaultResponse.concat(apiResponse)
  46. }
  47. return []
  48. }
  49. /**
  50. * Fonction permettant de mettre à jour le repo par rapport à la réponse (objet) de l'autocomplete
  51. * @param value
  52. * @param updateRepository
  53. * @private
  54. */
  55. private updateCpAddress(value:AnyJson, updateRepository: Function): void{
  56. //Si une valeur est présente
  57. if(value){
  58. if(value.city)
  59. updateRepository(value.city, 'addressPostal.addressCity')
  60. if(value.postcode)
  61. updateRepository(value.postcode, 'addressPostal.postalCode')
  62. }else{
  63. //Cas où on efface les valeurs des champs
  64. updateRepository(null, 'addressPostal.addressCity')
  65. updateRepository(null, 'addressPostal.postalCode')
  66. }
  67. }
  68. }