Skip to content

Latest commit

 

History

History
351 lines (275 loc) · 8.31 KB

File metadata and controls

351 lines (275 loc) · 8.31 KB

🔍 VERIFICAÇÃO FINAL: Implementação do Botão "Adicionar Medida Caseira"

✅ CÓDIGO IMPLEMENTADO COM SUCESSO

Arquivos Modificados

  1. /src/components/platform/AddFoodToMealModal.tsx
  2. /src/components/platform/AddFoodModal.tsx

📝 RESUMO DA IMPLEMENTAÇÃO

Estados Adicionados (4 novos estados)

const [showCustomMeasure, setShowCustomMeasure] = useState(false);
const [customMeasureName, setCustomMeasureName] = useState('');
const [customMeasureGrams, setCustomMeasureGrams] = useState('');
const [isSavingMeasure, setIsSavingMeasure] = useState(false);

Funções Implementadas (2 novas funções)

1. handleSaveCustomMeasure()

- 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

2. handleCancelCustomMeasure()

- Fecha formulário
- Limpa todos os campos

UI Implementada

Botão Principal

 Adicionar medida caseira
- Variant: link
- Position: Logo abaixo do Select de medidas
- Visibility:  aparece quando formulário está fechado

Formulário Inline

┌─────────────────────────────────┐
 Nome da medida                  
 [ex: pacote, lata, sachê]       
                                 
 Peso em gramas                  
 [ex: 250]                       
                                 
 [Cancelar] [Salvar]             
└─────────────────────────────────┘

🎯 LOCALIZAÇÃO EXATA NO CÓDIGO

AddFoodToMealModal.tsx

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>
)}

🔧 COMO O CÓDIGO FUNCIONA

Fluxo de Estado

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

Query Supabase

await supabase
  .from('food_measures')
  .insert({
    food_id: selectedFood.id,
    measure_name: customMeasureName.trim(),
    grams: parseFloat(customMeasureGrams),
    is_default: false
  })
  .select()
  .single();

🧪 TESTE MANUAL PASSO A PASSO

Passo 1: Abrir Modal

  1. Acesse a aplicação
  2. Vá para "Planos Alimentares"
  3. Clique em "Criar Novo Plano" ou edite um existente
  4. Clique em "Adicionar Alimento" em alguma refeição

✅ Esperado: Modal de busca abre

Passo 2: Selecionar Alimento

  1. Digite qualquer alimento (ex: "arroz")
  2. Clique em um resultado

✅ Esperado: Modal muda para tela de porção

Passo 3: Verificar Botão

  1. Olhe logo abaixo do dropdown "Medida Caseira"
  2. DEVE TER: Botão "➕ Adicionar medida caseira"

✅ Esperado: Botão visível, estilo link, cor primary

Passo 4: Abrir Formulário

  1. Clique no botão "➕ Adicionar medida caseira"

✅ Esperado:

  • Botão desaparece
  • Formulário inline aparece
  • 2 campos + 2 botões visíveis

Passo 5: Testar Validação

  1. Tente clicar em "Salvar" sem preencher

✅ Esperado: Botão "Salvar" está disabled (cinza)

Passo 6: Preencher Inválido

  1. Nome: "Teste"
  2. Gramas: "-50"
  3. Clique em "Salvar"

✅ Esperado: Alert "Por favor, insira um peso válido em gramas."

Passo 7: Salvar Corretamente

  1. Nome: "Pacote"
  2. Gramas: "250"
  3. 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

Passo 8: Verificar Persistência

  1. Adicione quantidade (ex: 2)
  2. Clique em "Adicionar à Refeição"
  3. Reabra o modal
  4. Selecione o mesmo alimento

✅ Esperado: "Pacote (250g)" aparece na lista de medidas

Passo 9: Testar Duplicata

  1. Clique em "➕ Adicionar medida caseira"
  2. Nome: "Pacote"
  3. Gramas: "500"
  4. Clique em "Salvar"

✅ Esperado: Alert "Já existe uma medida com esse nome. Escolha outro nome."

Passo 10: Testar Cancelar

  1. Clique em "➕ Adicionar medida caseira"
  2. Preencha campos
  3. Clique em "Cancelar"

✅ Esperado:

  • Formulário fecha
  • Campos limpos
  • Botão "➕ Adicionar medida caseira" volta

🐛 SE O BOTÃO NÃO APARECER

Checklist de Troubleshooting

  1. Hard Refresh

    Windows/Linux: Ctrl + Shift + R
    Mac: Cmd + Shift + R
    
  2. Limpar Cache

    • Chrome: F12 → Application → Clear storage → Clear site data
    • Firefox: F12 → Storage → Clear All
  3. Verificar Console

    • F12 → Console
    • Procure por erros em vermelho
    • Erros comuns:
      • "showCustomMeasure is not defined"
      • "Button is not a function"
      • Erros de import
  4. Verificar Build

    npm run build
    • Deve completar sem erros
    • Verificar se arquivos .js foram gerados em /dist
  5. 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
  6. Verificar Estado React

    • Instale React DevTools extension
    • F12 → Components
    • Encontre AddFoodToMealModal
    • Verifique states:
      • showCustomMeasure: false
      • customMeasureName: ""
      • customMeasureGrams: ""
      • isSavingMeasure: false

📊 VERIFICAÇÃO NO BANCO DE DADOS

Query para Verificar Medidas Criadas

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;

Resultado Esperado

alimento               | measure_name | grams | is_default | created_at
-----------------------|--------------|-------|------------|-------------------
Arroz, integral, cozido| Pacote       | 250.0 | false      | 2025-10-04 ...

🎉 CONCLUSÃO

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.


📞 DEBUG ADICIONAL

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