Skip to main content

Analizador de Alimentos NutriScan

Este componente React permite analizar alimentos a partir de imágenes utilizando inteligencia artificial. Se comunica con funciones asincrónicas para realizar análisis nutricionales automáticos o búsquedas manuales cuando es necesario.


🔍 Ubicación

src/components/nutriscan/FoodAnalyzer.tsx


📦 Dependencias utilizadas

import { useState } from 'react';
import ImageUpload from './ImageUpload';
import ProcessingState from './ProcessingState';
import NutritionCard from './NutritionCard';
import ManualSearch from './ManualSearch';
import { ShoppingBasket, Search, RotateCcw, ImagePlus } from 'lucide-react';
  • React: Manejo de estado con useState.
  • Componentes personalizados: ImageUpload, ProcessingState, NutritionCard, ManualSearch.
  • lucide-react: Íconos SVG reutilizables como Search, ImagePlus, etc.

🧩 Propiedades del componente

interface FoodAnalyzerProps {
analizarImagen: (base64: string, token: string, nombreManual?: string) => Promise<RespuestaNutriScan>;
confirmarConsulta?: (id: number, nombreConfirmado: string, token: string) => Promise<RespuestaNutriScan>;
}
PropiedadTipoDescripción
analizarImagen(base64, token, nombreManual?) => Promise<RespuestaNutriScan>Función para analizar la imagen con IA.
confirmarConsulta(id, nombreConfirmado, token) => Promise<RespuestaNutriScan> (opcional)Función para confirmar una sugerencia del sistema si requiere validación manual.

🧠 Lógica interna

📷 Selección de imagen

const handleImageSelect = (imageUrl: string) => {
setSelectedImage(imageUrl);
setNutritionData(null);
setHasError(false);
};
  • Limpia el estado anterior y guarda la imagen seleccionada para análisis.

⚙️ Análisis automático

const handleAnalyzeImage = async () => {
const token = localStorage.getItem("token");
const result = await analizarImagen(selectedImage, token);
...
};
  • Utiliza el token del usuario desde localStorage.
  • Llama a analizarImagen para obtener el resultado del backend.
  • Si se requiere confirmación, activa el flujo de búsqueda manual.
  • Si no, muestra la información nutricional recibida en una tarjeta.

🔍 Búsqueda manual

const handleManualSearch = async (productName: string) => {
const result = await confirmarConsulta(lastRegistroId, productName, token);
...
};
  • Ejecutada cuando la IA requiere confirmación del usuario.
  • Envía el nombre del producto elegido manualmente al backend.
  • Muestra la respuesta recibida como nutrición válida.

🔄 Reset de estado

const handleReset = () => {
setSelectedImage(null);
setNutritionData(null);
...
};
  • Limpia todos los estados y permite al usuario comenzar un nuevo análisis.

💬 Estructura de datos

NutritionData

interface NutritionData {
food: string;
calories?: number;
nutritionInfo: string;
}

RespuestaNutriScan

interface RespuestaNutriScan {
mensajeGPT: string;
requiereConfirmacion: boolean;
sugerencia?: string;
registro: {
id: number;
consulta: string;
};
}

🎨 Diseño y estructura visual

  • Interfaz amigable con fondo degradado.

  • Imagen del alimento cargada al centro.

  • Botones estilizados con íconos para analizar y reiniciar.

  • Vista condicional según el estado:

    • Componente ImageUpload si aún no hay imagen.
    • Componente ProcessingState mientras analiza.
    • Componente ManualSearch si se requiere validación.
    • Componente NutritionCard al mostrar resultados.

💡 Ejemplo de uso

<FoodAnalyzer
analizarImagen={analizarImagenFn}
confirmarConsulta={confirmarConsultaFn}
/>
  • analizarImagenFn: función definida que conecta con la API backend.
  • confirmarConsultaFn: función opcional para la validación de alimentos no reconocidos.

📝 Notas adicionales

  • Usa localStorage para recuperar el token de autenticación del usuario.
  • El análisis puede requerir confirmación manual en casos ambiguos.
  • El estado se maneja con useState de forma granular (imagen, error, procesamiento, etc.).
  • El flujo es progresivo: subir → analizar → mostrar o confirmar → mostrar.
  • La estructura es totalmente reactiva y fluida para el usuario final.