import React, { useEffect, useState } from 'react'; import { View, Text, ScrollView, StyleSheet, Image, TouchableOpacity } from 'react-native'; import { useLocalSearchParams } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { getProduct, Product } from '../../../services/products'; import { subscribeToMedicine, unsubscribeFromMedicine } from '../../../services/notifications'; import { useAuth } from '../../../hooks/useAuth'; import { LoadingSpinner } from '../../../components/LoadingSpinner'; import { useThemeContext } from '../../../components/ThemeProvider'; import { spacing, borderRadius } from '../../../constants/theme'; import { useTranslation } from '../../../src/i18n'; export default function ProductDetailScreen() { const { source, id } = useLocalSearchParams<{ source: string; id: string }>(); const { colors } = useThemeContext(); const { t } = useTranslation(); const { isAuthenticated } = useAuth(); const [product, setProduct] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(false); const [isSubscribed, setIsSubscribed] = useState(false); const [togglingSub, setTogglingSub] = useState(false); useEffect(() => { if (!source || !id) return; const fetchProduct = async () => { try { const data = await getProduct(source, id); if (data) { setProduct(data); } else { setError(true); } } catch { setError(true); } finally { setIsLoading(false); } }; fetchProduct(); }, [source, id]); const handleToggleSubscription = async () => { if (!isAuthenticated || !id) return; setTogglingSub(true); const productId = product?._id || product?.id || id; try { if (isSubscribed) { await unsubscribeFromMedicine(productId); setIsSubscribed(false); } else { await subscribeToMedicine(productId, product?.name || null); setIsSubscribed(true); } } catch { // silently fail } finally { setTogglingSub(false); } }; if (isLoading) { return ; } if (error || !product) { return ( {t('product.notFound')} ); } const isCima = product.source === 'cima'; return ( {product.image_url ? ( ) : ( {t('product.noImage')} )} {product.name} {isCima ? 'CIMA' : t('product.parapharmacy')} {isAuthenticated && ( )} {product.brand ? ( {product.brand} ) : null} {product.category ? ( {product.category} ) : null} {isCima ? ( {t('product.cimaDetails')} {product.active_ingredient && ( )} {product.dosage && ( )} {product.form && ( )} {product.prescription && ( )} ) : ( {t('product.productInfo')} {product.price != null && ( )} {product.original_price != null && product.original_price > (product.price || 0) && ( )} {product.category && ( )} {product.brand && ( )} {product.source_url && ( )} )} {isCima && product.photos && product.photos.length > 0 && ( {t('product.images')} {product.photos.map((photo, i) => ( {photo.tipo} ))} )} ); } function InfoRow({ label, value, colors }: { label: string; value: string; colors: any }) { return ( {label} {value} ); } const styles = StyleSheet.create({ container: { flex: 1, }, image: { width: '100%', height: 260, backgroundColor: '#f5f5f5', }, imagePlaceholder: { width: '100%', height: 160, alignItems: 'center', justifyContent: 'center', }, placeholderText: { fontSize: 14, }, header: { padding: spacing.lg, }, nameRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', gap: spacing.sm, }, name: { flex: 1, fontSize: 22, fontWeight: 'bold', }, headerRight: { flexDirection: 'row', alignItems: 'center', gap: spacing.sm, }, bellButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center', }, badge: { paddingHorizontal: spacing.sm, paddingVertical: spacing.xs, borderRadius: borderRadius.full, overflow: 'hidden', }, badgeText: { color: '#fff', fontSize: 12, fontWeight: '700', }, brand: { fontSize: 15, marginTop: spacing.xs, }, category: { fontSize: 13, marginTop: spacing.xs, }, infoSection: { marginTop: spacing.sm, padding: spacing.lg, }, sectionTitle: { fontSize: 16, fontWeight: '600', marginBottom: spacing.sm, }, infoRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: spacing.sm, borderBottomWidth: 1, }, infoLabel: { fontSize: 13, flexShrink: 0, marginRight: spacing.sm, }, infoValue: { fontSize: 13, fontWeight: '500', flex: 1, textAlign: 'right', }, infoValueMultiline: { fontSize: 13, fontWeight: '500', flex: 1, textAlign: 'right', }, photosScroll: { marginTop: spacing.xs, }, photoItem: { marginRight: spacing.md, alignItems: 'center', width: 120, }, photoImage: { width: 120, height: 120, borderRadius: borderRadius.md, backgroundColor: '#f5f5f5', }, photoLabel: { fontSize: 11, marginTop: spacing.xs, }, errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, errorText: { fontSize: 16, }, });