teqo-backup/src/components/StateSelect.tsx
Francisco Solla 398a91e54a feat(S9): captura de novidades da campanha na home pública (form + CTA do hero)
Seção 'Receba as novidades da campanha' acima do rodapé: nome + WhatsApp
obrigatórios, e-mail/estado/cidade/comentário opcionais, toggle pré-selecionado
'Quero fazer parte do time' gravado como subscription.campaignLevel
(time|esporadico). CTA secundário do hero vira o atalho (#novidades, scroll
suave). Contact + Subscription em withPayloadTransaction com consentimento
novo fail-closed por chave estável 'campanha-novidades' — nada é gravado sem o
texto aprovado no admin. Migration 20260819_192605 (state de contact nullable
+ coluna campaign_level). Impl plan, changelog, int + e2e.
2026-08-20 02:19:58 +00:00

30 lines
870 B
TypeScript

import { StateNames } from '@/lib/states'
import { FormCombobox, type ComboboxOption } from './FormCombobox'
interface StateSelectProps {
placeholder?: string
/** S9 — the campaign home capture makes the state optional. Defaults to
* true so the WhatsApp flow stays as strict as before. */
required?: boolean
}
const stateOptions: ComboboxOption[] = Object.entries(StateNames)
.map(([code, name]) => ({ value: code, label: name, keywords: [code] }))
.sort((a, b) => a.label.localeCompare(b.label, 'pt-BR'))
export const StateSelect = ({
placeholder = 'Selecione um estado',
required = true,
}: StateSelectProps) => {
return (
<FormCombobox
name="state"
id="state"
options={stateOptions}
placeholder={placeholder}
minChars={1}
required={required}
emptyMessage="Nenhum estado encontrado."
/>
)
}