import React, { useEffect, useState } from 'react'; import { View, Text, ScrollView, StyleSheet, TouchableOpacity, Linking } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import MapView, { Marker } from 'react-native-maps'; import { getPharmacy, getPharmacyMedicines } from '../../services/pharmacies'; import { LoadingSpinner } from '../../components/LoadingSpinner'; import { useThemeContext } from '../../components/ThemeProvider'; import { spacing, borderRadius } from '../../constants/theme'; import { Pharmacy, PharmacyMedicine } from '../../types'; export default function PharmacyDetailScreen() { const { id } = useLocalSearchParams<{ id: string }>(); const router = useRouter(); const { colors } = useThemeContext(); const [pharmacy, setPharmacy] = useState(null); const [medicines, setMedicines] = useState([]); const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (!id) return; const fetchPharmacy = async () => { try { const [pharmData, medData] = await Promise.all([ getPharmacy(Number(id)), getPharmacyMedicines(Number(id)), ]); setPharmacy(pharmData); setMedicines(medData as PharmacyMedicine[]); } catch (error) { console.error('Error fetching pharmacy:', error); } finally { setIsLoading(false); } }; fetchPharmacy(); }, [id]); const handleCall = () => { if (pharmacy?.phone) { Linking.openURL(`tel:${pharmacy.phone}`); } }; const handleDirections = () => { if (pharmacy) { const url = `https://www.google.com/maps/dir/?api=1&destination=${pharmacy.latitude},${pharmacy.longitude}`; Linking.openURL(url); } }; if (isLoading) { return ; } if (!pharmacy) { return ( Farmacia no encontrada ); } return ( {pharmacy.name} Llamar Cómo llegar {pharmacy.address} {pharmacy.phone && ( {pharmacy.phone} )} Medicamentos ({medicines.length}) {medicines.length === 0 ? ( No hay medicamentos disponibles ) : ( medicines.map((med) => ( router.push(`/medicine/${med.medicine_nregistro}`)} > {med.medicine_name} Reg: {med.medicine_nregistro} {med.price.toFixed(2)} € Stock: {med.stock} )) )} ); } const styles = StyleSheet.create({ container: { flex: 1, }, header: { padding: spacing.md, }, name: { fontSize: 22, fontWeight: 'bold', }, actionsRow: { flexDirection: 'row', justifyContent: 'space-around', padding: spacing.md, borderBottomWidth: 1, }, actionButton: { flexDirection: 'row', alignItems: 'center', padding: spacing.sm, }, actionText: { marginLeft: spacing.xs, fontWeight: '500', }, infoSection: { padding: spacing.md, marginTop: spacing.sm, }, infoRow: { flexDirection: 'row', alignItems: 'flex-start', marginBottom: spacing.sm, }, infoText: { flex: 1, marginLeft: spacing.sm, fontSize: 16, }, mapContainer: { height: 200, marginTop: spacing.sm, }, map: { flex: 1, }, medicinesSection: { marginTop: spacing.sm, padding: spacing.md, }, sectionTitle: { fontSize: 18, fontWeight: '600', marginBottom: spacing.md, }, noMedicines: { textAlign: 'center', padding: spacing.xl, }, medicineCard: { flexDirection: 'row', justifyContent: 'space-between', borderRadius: borderRadius.md, padding: spacing.md, marginBottom: spacing.sm, }, medicineInfo: { flex: 1, }, medicineName: { fontSize: 16, fontWeight: '500', }, medicineNregistro: { fontSize: 12, marginTop: spacing.xs, }, medicineStock: { alignItems: 'flex-end', }, price: { fontSize: 16, fontWeight: '600', }, stock: { fontSize: 12, marginTop: spacing.xs, }, errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, errorText: { fontSize: 16, }, });