Última toma: {med.lastTaken ? new Date(med.lastTaken).toLocaleString() : 'Nunca'}
))}
)}
Historial Reciente
{loading ? (
Cargando historial...
) : medications.length === 0 ? (
Historial de cumplimiento aparecerá aquí.
) : (
{medications.flatMap(med =>
(med.history || []).slice(-5).sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)).map((item, index) => ( // Mostrar las últimas 5 entradas y ordenar por fecha
);
}
// Pantalla del Doctor Virtual (IA)
function VirtualDoctorScreen() {
const [messages, setMessages] = useState([]);
const [input, setInput] = useState('');
const [loading, setLoading] = useState(false);
const [showModal, setShowModal] = useState(false);
const [modalContent, setModalContent] = useState({ title: '', message: '' });
const callGeminiAPI = async (prompt) => {
setLoading(true);
try {
let chatHistory = [];
chatHistory.push({ role: "user", parts: [{ text: prompt }] });
const payload = { contents: chatHistory };
const apiKey = ""; // La clave API será proporcionada por el entorno de Canvas
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json();
if (result.candidates && result.candidates.length > 0 &&
result.candidates[0].content && result.candidates[0].content.parts &&
result.candidates[0].content.parts.length > 0) {
const text = result.candidates[0].content.parts[0].text;
return text.replace(/\*/g, ''); // Eliminar asteriscos
} else {
console.error("Respuesta inesperada de la API de Gemini:", result);
return "Lo siento, no pude obtener una respuesta en este momento. Inténtalo de nuevo más tarde.";
}
} catch (error) {
console.error("Error al llamar a la API de Gemini:", error);
return "Hubo un error al conectar con el Doctor Virtual. Por favor, verifica tu conexión.";
} finally {
setLoading(false);
}
};
const handleSendMessage = async () => {
if (input.trim() === '') return;
const newUserMessage = { sender: 'user', text: input };
setMessages((prevMessages) => [...prevMessages, newUserMessage]);
setInput('');
setLoading(true);
const aiResponse = await callGeminiAPI(input);
const newAiMessage = { sender: 'ai', text: aiResponse };
setMessages((prevMessages) => [...prevMessages, newAiMessage]);
setLoading(false);
};
return (
Doctor Virtual
Disclaimer Legal:
La información proporcionada por el Doctor Virtual es solo para fines educativos e informativos. No sustituye la consulta, diagnóstico o tratamiento médico profesional. Siempre busca el consejo de un médico u otro proveedor de salud calificado para cualquier pregunta que puedas tener sobre una condición médica.
{messages.length === 0 && (
¡Hola! Pregúntame sobre tus medicamentos.
Ej: "¿Para qué sirve el paracetamol?"
);
}
// Nueva Pantalla: Asistente de Medicamentos (IA)
function MedicationAssistantScreen() {
const [medicationName, setMedicationName] = useState('');
const [queryType, setQueryType] = useState('sideEffects'); // 'sideEffects' o 'interactions'
const [response, setResponse] = useState('');
const [loading, setLoading] = useState(false);
const [showModal, setShowModal] = useState(false);
const [modalContent, setModalContent] = useState({ title: '', message: '' });
const callGeminiAPI = async (prompt) => {
setLoading(true);
try {
let chatHistory = [];
chatHistory.push({ role: "user", parts: [{ text: prompt }] });
const payload = { contents: chatHistory };
const apiKey = ""; // La clave API será proporcionada por el entorno de Canvas
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
const res = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await res.json();
if (result.candidates && result.candidates.length > 0 &&
result.candidates[0].content && result.candidates[0].content.parts &&
result.candidates[0].content.parts.length > 0) {
const text = result.candidates[0].content.parts[0].text;
return text.replace(/\*/g, ''); // Eliminar asteriscos
} else {
console.error("Respuesta inesperada de la API de Gemini:", result);
return "Lo siento, no pude obtener información en este momento. Inténtalo de nuevo más tarde.";
}
} catch (error) {
console.error("Error al llamar a la API de Gemini:", error);
return "Hubo un error al conectar con el Asistente. Por favor, verifica tu conexión.";
} finally {
setLoading(false);
}
};
const handleGetInfo = async () => {
if (!medicationName.trim()) {
setModalContent({ title: "Medicamento Requerido", message: "Por favor, ingresa el nombre del medicamento." });
setShowModal(true);
return;
}
let prompt = "";
if (queryType === "sideEffects") {
prompt = `Dame una lista concisa de los efectos secundarios comunes del medicamento ${medicationName}. Si no conoces el medicamento, indícalo.`;
} else { // interactions
prompt = `Enumera las posibles interacciones del medicamento ${medicationName} con otros medicamentos o sustancias comunes (alcohol, alimentos). Si no conoces el medicamento, indícalo.`;
}
setResponse("Buscando información...");
const aiResponse = await callGeminiAPI(prompt);
setResponse(aiResponse);
};
return (
Asistente de Medicamentos ✨
Disclaimer Legal:
La información proporcionada por el Asistente de Medicamentos es solo para fines educativos e informativos. No sustituye la consulta, diagnóstico o tratamiento médico profesional. Siempre busca el consejo de un médico u otro proveedor de salud calificado para cualquier pregunta que puedas tener sobre una condición médica.
Obtener Información
setMedicationName(e.target.value)}
required
/>
{response && (
Resultado:
{response}
)}
{showModal && (
setShowModal(false)}
/>
)}
);
}
// Pantalla SOS Medicamentos
function SOSScreen() {
const [contact, setContact] = useState('');
const [message, setMessage] = useState('');
const [showModal, setShowModal] = useState(false);
const [modalContent, setModalContent] = useState({ title: '', message: '' });
const handleSendSOS = () => {
if (!contact.trim()) {
setModalContent({ title: "Contacto Requerido", message: "Por favor, ingresa un número de contacto o nombre." });
setShowModal(true);
return;
}
// Simulación de envío de SMS/Notificación
setModalContent({
title: "Alerta Enviada",
message: `Se ha enviado una alerta a ${contact}. En una aplicación real, esto enviaría un SMS o notificación push.`,
});
setShowModal(true);
setMessage('');
setContact('');
};
return (
SOS Medicamentos
Envía una alerta rápida a un familiar o contacto de emergencia si necesitas ayuda o te quedas sin medicamentos.
setContact(e.target.value)}
/>
{showModal && (
setShowModal(false)}
/>
)}
);
}
// Pantalla de Emergencia Médica (Lock Screen accesible)
function EmergencyScreen({ onNavigate }) {
const { db, userId, currentProfileId, profiles, isAuthReady } = useAppContext();
const [currentProfile, setCurrentProfile] = useState(null);
const [medications, setMedications] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
if (db && userId && currentProfileId && isAuthReady) {
setLoading(true);
setError(null);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
// Fetch current profile details
const profileDocRef = doc(db, `artifacts/${appId}/users/${userId}/profiles`, currentProfileId);
const unsubscribeProfile = onSnapshot(profileDocRef, (docSnap) => {
if (docSnap.exists()) {
setCurrentProfile({ id: docSnap.id, ...docSnap.data() });
} else {
console.warn("Perfil actual no encontrado para emergencia.");
setCurrentProfile(null);
}
}, (err) => {
console.error("Error al cargar perfil para emergencia:", err);
setError("Error al cargar datos de emergencia.");
});
// Fetch medications for the current profile
const medsColRef = collection(db, `artifacts/${appId}/users/${userId}/profiles/${currentProfileId}/medications`);
const unsubscribeMeds = onSnapshot(medsColRef, (snapshot) => {
const fetchedMeds = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
setMedications(fetchedMeds);
setLoading(false);
}, (err) => {
console.error("Error al cargar medicamentos para emergencia:", err);
setError("Error al cargar medicamentos de emergencia.");
setLoading(false);
});
return () => {
unsubscribeProfile();
unsubscribeMeds();
};
}
}, [db, userId, currentProfileId, isAuthReady]);
if (loading) {
return (
);
}
// Nueva Pantalla de Bienvenida (Splash Screen)
function SplashScreen({ onNavigate }) {
return (
Saludify
Tu salud, tu control.
);
}
// Componente principal de la aplicación
function App() {
const [currentPage, setCurrentPage] = useState('splash'); // Iniciar en la pantalla de bienvenida
const { isAuthReady } = useAppContext();
const renderPage = () => {
if (!isAuthReady) {
return (
Cargando Saludify...
);
}
switch (currentPage) {
case 'splash':
return ;
case 'home':
return ;
case 'add-medication':
return ;
case 'virtual-doctor':
return ;
case 'medication-assistant':
return ;
case 'sos-medication':
return ;
case 'emergency-mode':
return ;
case 'profile':
return ;
default:
return ;
}
};
return (