useAddressPostalUtils.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import {AnyJson} from '~/types/interfaces'
  2. import {QUERY_TYPE} from "~/types/enums";
  3. import DataProvider from "~/services/data/dataProvider";
  4. export function useAddressPostalUtils($dataProvider: DataProvider) {
  5. /**
  6. * Fonction de recherche qui utilise l'API gouvernematal pour autocompléter les CP et villes.
  7. * @param research
  8. * @param field
  9. * @private
  10. */
  11. async function searchFunction(research: string, field: string): Promise<Array<AnyJson>> {
  12. if (research) {
  13. const response = await $dataProvider.invoke({
  14. type: QUERY_TYPE.DEFAULT,
  15. url: `https://api-adresse.data.gouv.fr/search/?q=${research}&type=municipality&autocomplete=1&limit=20`,
  16. params: {
  17. noXaccessId: true
  18. }
  19. })
  20. const apiResponse = response.data.features.map((data: AnyJson) => data.properties)
  21. // 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
  22. const defaultResponse = []
  23. if (field === 'addressPostal.addressCity') {
  24. defaultResponse.push({id: 0, postcode: null, city: research})
  25. } else {
  26. defaultResponse.push({id: 0, postcode: research, city: null})
  27. }
  28. return defaultResponse.concat(apiResponse)
  29. }
  30. return []
  31. }
  32. /**
  33. * Fonction permettant de mettre à jour le repo par rapport à la réponse (objet) de l'autocomplete
  34. * @param value
  35. * @param updateRepository
  36. * @private
  37. */
  38. function updateCpAddress(value: AnyJson, updateRepository: Function): void {
  39. //Si une valeur est présente
  40. if (value) {
  41. if (value.city)
  42. updateRepository(value.city, 'addressPostal.addressCity')
  43. if (value.postcode)
  44. updateRepository(value.postcode, 'addressPostal.postalCode')
  45. } else {
  46. //Cas où on efface les valeurs des champs
  47. updateRepository(null, 'addressPostal.addressCity')
  48. updateRepository(null, 'addressPostal.postalCode')
  49. }
  50. }
  51. return {
  52. searchFunction,
  53. updateCpAddress
  54. }
  55. }