102 lines
2.7 KiB
TypeScript
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',
|
|
},
|
|
});
|