/v1.0

AddressField

AddressField renderiza un selector de ubicación de Google Maps junto con desplegables autocomplete en cascada (país, subdivisión, ciudad, barrio) e inputs de texto para calle, número, piso, departamento, código postal y notas. Cuando el usuario arrastra el marcador o busca una dirección, el componente hace geocodificación inversa y rellena los campos automáticamente.

Props

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | label | string | No | — | Etiqueta mostrada sobre el componente. | | description | string | No | — | Texto de ayuda mostrado debajo del componente. | | value | AddressValue | Sí | — | Objeto de dirección actual (ver forma AddressValue más abajo). | | onChange | (value: AddressValue) => void | Sí | — | Llamado con el objeto de dirección actualizado ante cualquier cambio. | | countrySearchPath | string | Sí | — | Ruta API para buscar países (ej. /v1/countries). | | subdivisionSearchPath | string | Sí | — | Ruta API para buscar provincias/estados. | | citySearchPath | string | Sí | — | Ruta API para buscar ciudades. | | neighborhoodSearchPath | string | Sí | — | Ruta API para buscar barrios. | | apiBaseUrl | string | No | urls.apiBase | URL base para todas las llamadas autocomplete. | | useAuthToken | boolean | No | true | Si se debe adjuntar el token de autenticación a las requests autocomplete. | | searchParam | string | No | 'search' | Nombre del parámetro de query-string usado para el término de búsqueda. | | itemLabelKey | string | No | 'name' | Clave del objeto resultado usada como etiqueta de visualización. | | itemIdKey | string | No | 'id' | Clave del objeto resultado usada como identificador. | | apiKey | string | No | keys.googleMaps | Clave de la API de Google Maps JavaScript. | | width | number \| string | No | '100%' | Ancho del contenedor del mapa. | | mapHeight | number \| string | No | 300 | Alto del mapa en píxeles. | | zoom | number | No | 14 | Nivel de zoom inicial del mapa. | | initialCenter | { lat: number; lng: number } | No | — | Sobreescribe el centro inicial del mapa. Por defecto usa las coordenadas en value. | | markerIdleSrc | string | No | '/assets/markers/idle.svg' | URL de la imagen del marcador en reposo. | | markerDraggingSrc | string | No | '/assets/markers/drag.svg' | URL de la imagen del marcador al arrastrar. | | inputPlaceholder | string | No | 'Buscar dirección...' | Placeholder del input de búsqueda del mapa. | | language | string | No | — | Código de idioma para el locale de Google Maps. | | region | string | No | — | Región para el sesgo de geocodificación de Google Maps. | | geocodeOnDragEnd | boolean | No | true | Si se realiza geocodificación inversa al soltar el marcador. | | extraInputs | ('block' \| 'lot' \| 'meter_number')[] | No | [] | Inputs opcionales adicionales a mostrar (manzana, lote, número de medidor). | | containerStyle | React.CSSProperties | No | — | Estilos del contenedor exterior. | | headerStyle | React.CSSProperties | No | — | Estilos del área de encabezado del campo. | | bodyStyle | React.CSSProperties | No | — | Estilos del área de cuerpo del campo. | | labelStyle | React.CSSProperties | No | — | Estilos del elemento de etiqueta. | | descriptionStyle | React.CSSProperties | No | — | Estilos del párrafo de descripción. | | className | string | No | — | Clase CSS del contenedor exterior. |

Forma de AddressValue

interface AddressValue {
  name?: string;
  street: string;
  number?: string;
  floor?: string;
  apartment?: string;
  block?: string;
  lot?: string;
  meter_number?: string;
  zone_id?: number | null;
  neighborhood_id?: number | null;
  city_id?: number | null;
  subdivision_id?: number | null;
  country_id?: number | null;
  neighborhood_name?: string;
  city_name?: string;
  subdivision_name?: string;
  country_name?: string;
  formatted_address?: string;
  latitude?: number | null;
  longitude?: number | null;
  postal_code?: string;
  notes?: string;
  country?: any | null;
  subdivision?: any | null;
  city?: any | null;
  neighborhood?: any | null;
}

Uso

Básico

import React, { useState } from 'react';
import AddressField from '@/components/fields/AddressField';

export default function Example() {
  const [address, setAddress] = useState({ street: '' });

  return (
    <AddressField
      label="Dirección de entrega"
      value={address}
      onChange={setAddress}
      countrySearchPath="/v1/countries"
      subdivisionSearchPath="/v1/subdivisions"
      citySearchPath="/v1/cities"
      neighborhoodSearchPath="/v1/neighborhoods"
    />
  );
}

Con inputs extra y altura de mapa personalizada

<AddressField
  label="Dirección del inmueble"
  value={address}
  onChange={setAddress}
  countrySearchPath="/v1/countries"
  subdivisionSearchPath="/v1/subdivisions"
  citySearchPath="/v1/cities"
  neighborhoodSearchPath="/v1/neighborhoods"
  mapHeight={400}
  zoom={16}
  extraInputs={['block', 'lot']}
/>