BrixCafe/app/screens/user/GrainsScreen.tsx
2025-04-23 04:45:54 +01:00

102 lines
2.7 KiB
TypeScript

import { View, Text, StyleSheet, ScrollView, TouchableOpacity, ActivityIndicator } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { ArrowLeft } from 'lucide-react-native';
import { router } from "expo-router";
import ProductCard from '@/components/ProductCard';
import COLORS from '@/constants/colors';
import { collection, getDocs } from 'firebase/firestore';
import { useEffect, useState } from 'react';
import { db } from '@/firebase/config';
import { Product } from '@/constants/types';
export default function GrainsScreen() {
const [products, setProducts] = useState<Product[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchProducts = async () => {
try {
setLoading(true);
const querySnapshot = await getDocs(collection(db, 'products'));
const items: Product[] = querySnapshot.docs.map(doc => ({
id: doc.id,
...(doc.data() as Omit<Product, 'id'>),
}));
setProducts(items);
} catch (error) {
console.error("Erreur lors de la récupération des produits :", error);
} finally {
setLoading(false);
}
};
fetchProducts();
}, []);
return (
<SafeAreaView style={styles.container}>
<View style={styles.header}>
<TouchableOpacity style={styles.backButton} onPress={() => router.back()}>
<ArrowLeft size={24} color="#666" />
</TouchableOpacity>
<Text style={styles.headerTitle}>Grains de café</Text>
</View>
{loading ? (
<View style={styles.loadingContainer}>
<ActivityIndicator size="large" color={COLORS.primary} />
<Text style={styles.loadingText}>Chargement...</Text>
</View>
) : (
<ScrollView contentContainerStyle={styles.content}>
{products.map((product) => (
<ProductCard key={product.id} {...product} />
))}
</ScrollView>
)}
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
header: {
height: 60,
justifyContent: 'center',
alignItems: 'center',
position: 'relative',
backgroundColor: '#fff',
borderBottomWidth: 1,
borderBottomColor: '#eee',
marginTop: 5,
},
backButton: {
position: 'absolute',
left: 20,
top: '50%',
transform: [{ translateY: -12 }],
},
headerTitle: {
fontSize: 20,
fontWeight: '600',
color: '#333',
},
content: {
padding: 15,
backgroundColor: COLORS.background_user,
paddingBottom: 10,
},
loadingContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
loadingText: {
marginTop: 10,
fontSize: 16,
color: '#666',
},
});