Kobana UI
GitHub

CityCombobox

Combobox de busca assíncrona de cidades com debounce e indicador de carregamento.

Carregando...

Instalação

npx @kobana/ui add city-combobox

Dependências instaladas automaticamente: button, command, popover (shadcn/ui), lucide-react

Importação

import { CityCombobox } from "@/components/kobana/city-combobox"
import type { CityOption } from "@/components/kobana/city-combobox"

Props

PropTipoDefaultDescrição
valuestringValor selecionado (corresponde a CityOption.value)
onValueChange(value: string) => voidDisparado quando o usuário seleciona uma cidade
onSearch(query: string) => Promise<CityOption[]>Callback assíncrono que busca cidades pelo termo digitado
placeholderstring"Selecione uma cidade"Texto exibido quando nada está selecionado
disabledbooleanfalseDesabilita o controle
emptyTextstring"Nenhuma cidade encontrada."Texto exibido quando a busca não retorna resultados
classNamestringClasses adicionais aplicadas ao botão de disparo

CityOption

interface CityOption {
  value: string
  label: string
}

Uso

async function searchCities(query: string): Promise<CityOption[]> {
  const res = await fetch(`/api/cities?search=${encodeURIComponent(query)}`)
  const data = await res.json()
  return data.cities.map((c) => ({ value: c.ibgeCode, label: `${c.name} - ${c.state}` }))
}

function Example() {
  const [city, setCity] = React.useState("")

  return (
    <CityCombobox
      value={city}
      onValueChange={setCity}
      onSearch={searchCities}
    />
  )
}

O componente faz debounce de 300ms no termo digitado antes de chamar onSearch, exibe um spinner enquanto a busca está em andamento e não conhece nenhuma URL de API — a fonte de dados é totalmente injetada via onSearch.

On this page