import React, { useState, useEffect } from 'react'; import './AlertsView.css'; const iconMap = { bell: ( ), store: ( ), }; function AlertsView({ onNotificationChange }) { const [availability, setAvailability] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchAvailabilityNotifications = async () => { try { setLoading(true); setError(null); const notifsRes = await fetch('/api/notifications/mine', { credentials: 'include' }); if (notifsRes.status === 401) { setError('Por favor, inicia sesión para ver tus avisos.'); setLoading(false); return; } let notifsData = { global: [], pharmacy: [] }; if (notifsRes.ok) { notifsData = await notifsRes.json(); } const mergedAvailability = [ ...(notifsData.global || []).map(item => ({ ...item, scope: 'global' })), ...(notifsData.pharmacy || []).map(item => ({ ...item, scope: 'pharmacy' })), ].sort((a, b) => (b.created_at || '').localeCompare(a.created_at || '')); setAvailability(mergedAvailability); } catch (err) { console.error('Error fetching availability notifications:', err); setError('No se pudieron cargar los avisos.'); } finally { setLoading(false); } }; useEffect(() => { fetchAvailabilityNotifications(); }, []); const handleDeleteAvailability = async (item) => { try { const res = await fetch('/api/notifications/mine', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ scope: item.scope, id: item.id }), }); if (res.ok || res.status === 204) { setAvailability(prev => prev.filter(i => !(i.scope === item.scope && i.id === item.id))); onNotificationChange?.(); // Also update local storage if possible to reflect that we unsubscribed try { const STORAGE_KEY = 'farmaclic.subscriptions.v1'; const raw = localStorage.getItem(STORAGE_KEY); if (raw) { const parsed = JSON.parse(raw); if (Array.isArray(parsed)) { const keyToSearch = item.scope === 'pharmacy' ? `${item.medicine_nregistro}:${item.pharmacy_id}` : item.medicine_nregistro; const filtered = parsed.filter(k => k !== keyToSearch); localStorage.setItem(STORAGE_KEY, JSON.stringify(filtered)); } } } catch (e) { console.warn('Could not update localStorage subscriptions:', e); } } else { throw new Error('Error deleting availability alert'); } } catch (err) { console.error(err); setError('No se pudo eliminar la alerta de disponibilidad.'); } }; return (

Mis Avisos

Mantente al día con tus medicamentos.

{loading &&

Cargando avisos...

} {!loading && error &&

{error}

} {!loading && !error && ( <> {/* Availability Section */}

Disponibilidad

{availability.length === 0 ? (

No tienes suscripciones de disponibilidad.

) : ( availability.map((alert) => { const cardColor = alert.scope === 'pharmacy' ? 'primary' : 'tertiary'; const cardIcon = alert.scope === 'pharmacy' ? 'store' : 'bell'; const key = `${alert.scope}:${alert.id}`; return (
{iconMap[cardIcon]}

{alert.medicine_name || alert.medicine_nregistro}

{alert.scope === 'pharmacy' ? (
🏥 {alert.pharmacy_name || `Farmacia #${alert.pharmacy_id}`} {alert.pharmacy_address && (

📍 {alert.pharmacy_address}

)}
) : ( 🔔 Notificarme cuando esté disponible )}
); }) )}
)}
); } export default AlertsView;