- ✅
/src/components/platform/AddFoodToMealModal.tsx - ✅
/src/components/platform/AddFoodModal.tsx
const [showCustomMeasure, setShowCustomMeasure] = useState(false);
const [customMeasureName, setCustomMeasureName] = useState('');
const [customMeasureGrams, setCustomMeasureGrams] = useState('');
const [isSavingMeasure, setIsSavingMeasure] = useState(false);- Valida nome não vazio
- Valida gramas > 0
- Verifica duplicatas
- INSERT no Supabase (food_measures)
- Recarrega medidas
- Seleciona nova medida automaticamente
- Fecha formulário e limpa campos
- Tratamento completo de erros- Fecha formulário
- Limpa todos os campos➕ Adicionar medida caseira
- Variant: link
- Position: Logo abaixo do Select de medidas
- Visibility: Só aparece quando formulário está fechado┌─────────────────────────────────┐
│ Nome da medida │
│ [ex: pacote, lata, sachê] │
│ │
│ Peso em gramas │
│ [ex: 250] │
│ │
│ [Cancelar] [Salvar] │
└─────────────────────────────────┘Linha 34-37: Estados
const [showCustomMeasure, setShowCustomMeasure] = useState(false);
const [customMeasureName, setCustomMeasureName] = useState('');
const [customMeasureGrams, setCustomMeasureGrams] = useState('');
const [isSavingMeasure, setIsSavingMeasure] = useState(false);Linha 141-192: Função handleSaveCustomMeasure
const handleSaveCustomMeasure = async () => {
// ... validações e INSERT
};Linha 194-198: Função handleCancelCustomMeasure
const handleCancelCustomMeasure = () => {
setShowCustomMeasure(false);
setCustomMeasureName('');
setCustomMeasureGrams('');
};Linha 494-557: UI (Botão + Formulário)
{!showCustomMeasure && (
<Button onClick={() => setShowCustomMeasure(true)}>
➕ Adicionar medida caseira
</Button>
)}
{showCustomMeasure && (
<div className="mt-4 p-4 border rounded-lg bg-muted/30 space-y-4">
{/* Formulário completo */}
</div>
)}INICIAL:
showCustomMeasure = false
customMeasureName = ''
customMeasureGrams = ''
isSavingMeasure = false
USUÁRIO CLICA NO BOTÃO:
showCustomMeasure = true
→ Botão desaparece
→ Formulário aparece
USUÁRIO PREENCHE E CLICA SALVAR:
isSavingMeasure = true
→ Botão muda para "Salvando..."
→ Campos ficam disabled
APÓS INSERT BEM-SUCEDIDO:
→ loadMeasures(food.id) recarrega
→ setSelectedMeasure(data.id) seleciona nova
→ showCustomMeasure = false
→ customMeasureName = ''
→ customMeasureGrams = ''
→ isSavingMeasure = false
→ Formulário fecha
→ Botão volta
await supabase
.from('food_measures')
.insert({
food_id: selectedFood.id,
measure_name: customMeasureName.trim(),
grams: parseFloat(customMeasureGrams),
is_default: false
})
.select()
.single();- Acesse a aplicação
- Vá para "Planos Alimentares"
- Clique em "Criar Novo Plano" ou edite um existente
- Clique em "Adicionar Alimento" em alguma refeição
✅ Esperado: Modal de busca abre
- Digite qualquer alimento (ex: "arroz")
- Clique em um resultado
✅ Esperado: Modal muda para tela de porção
- Olhe logo abaixo do dropdown "Medida Caseira"
- DEVE TER: Botão "➕ Adicionar medida caseira"
✅ Esperado: Botão visível, estilo link, cor primary
- Clique no botão "➕ Adicionar medida caseira"
✅ Esperado:
- Botão desaparece
- Formulário inline aparece
- 2 campos + 2 botões visíveis
- Tente clicar em "Salvar" sem preencher
✅ Esperado: Botão "Salvar" está disabled (cinza)
- Nome: "Teste"
- Gramas: "-50"
- Clique em "Salvar"
✅ Esperado: Alert "Por favor, insira um peso válido em gramas."
- Nome: "Pacote"
- Gramas: "250"
- Clique em "Salvar"
✅ Esperado:
- Botão muda para "Salvando..."
- Formulário fecha após ~1 segundo
- Dropdown recarrega
- "Pacote (250g)" aparece no dropdown
- "Pacote (250g)" está selecionado automaticamente
- Adicione quantidade (ex: 2)
- Clique em "Adicionar à Refeição"
- Reabra o modal
- Selecione o mesmo alimento
✅ Esperado: "Pacote (250g)" aparece na lista de medidas
- Clique em "➕ Adicionar medida caseira"
- Nome: "Pacote"
- Gramas: "500"
- Clique em "Salvar"
✅ Esperado: Alert "Já existe uma medida com esse nome. Escolha outro nome."
- Clique em "➕ Adicionar medida caseira"
- Preencha campos
- Clique em "Cancelar"
✅ Esperado:
- Formulário fecha
- Campos limpos
- Botão "➕ Adicionar medida caseira" volta
-
Hard Refresh
Windows/Linux: Ctrl + Shift + R Mac: Cmd + Shift + R -
Limpar Cache
- Chrome: F12 → Application → Clear storage → Clear site data
- Firefox: F12 → Storage → Clear All
-
Verificar Console
- F12 → Console
- Procure por erros em vermelho
- Erros comuns:
- "showCustomMeasure is not defined"
- "Button is not a function"
- Erros de import
-
Verificar Build
npm run build
- Deve completar sem erros
- Verificar se arquivos .js foram gerados em /dist
-
Verificar DevTools Elements
- F12 → Elements
- Encontre o Select de "Medida Caseira"
- Verifique se o botão está no DOM logo depois
- Se não estiver, há problema no JSX
-
Verificar Estado React
- Instale React DevTools extension
- F12 → Components
- Encontre AddFoodToMealModal
- Verifique states:
- showCustomMeasure: false
- customMeasureName: ""
- customMeasureGrams: ""
- isSavingMeasure: false
SELECT
f.name as alimento,
fm.measure_name,
fm.grams,
fm.is_default,
fm.created_at
FROM food_measures fm
JOIN foods f ON f.id = fm.food_id
WHERE fm.is_default = false
ORDER BY fm.created_at DESC
LIMIT 10;alimento | measure_name | grams | is_default | created_at
-----------------------|--------------|-------|------------|-------------------
Arroz, integral, cozido| Pacote | 250.0 | false | 2025-10-04 ...
STATUS: ✅ IMPLEMENTAÇÃO COMPLETA
- ✅ Código implementado em ambos modais
- ✅ Estados criados
- ✅ Funções implementadas
- ✅ UI renderizada
- ✅ Validações no lugar
- ✅ Integração Supabase funcionando
- ✅ Build compilado sem erros
O botão "➕ Adicionar medida caseira" DEVE aparecer logo abaixo do dropdown de medidas.
Se não estiver aparecendo, siga o checklist de troubleshooting acima.
Se ainda não funcionar, execute no console do navegador:
// Verificar se componente está carregado
console.log(document.querySelector('[class*="AddFoodToMealModal"]'));
// Verificar se botão está no DOM
console.log(document.querySelector('button:contains("Adicionar medida caseira")'));
// Forçar re-render (se usar React DevTools)
// Components → AddFoodToMealModal → (clicar no ícone de refresh)Data da implementação: 2025-10-04 Build hash: index-CHCcGi6J.js Status: ✅ PRONTO PARA USO