كتالوج المنتجات
{isLoading ? (جاري تحميل المنتجات...
لا توجد منتجات حالياً. قد يكون النظام يعمل على تهيئة قاعدة البيانات.
import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { initializeApp } from 'firebase/app'; import { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } from 'firebase/auth'; import { getFirestore, doc, setDoc, onSnapshot, collection, query, getDocs } from 'firebase/firestore'; import { ShoppingCart, ShoppingBag, Trash2, Loader, X, ServerCrash } from 'lucide-react'; // --- Global Variables (Provided by Canvas Environment) --- // We must use these global variables for Firebase configuration and authentication. const firebaseConfig = typeof __firebase_config !== 'undefined' ? JSON.parse(__firebase_config) : null; const initialAuthToken = typeof __initial_auth_token !== 'undefined' ? __initial_auth_token : null; const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-ecommerce-app'; // --- Utility Functions --- /** * Initializes Firebase, authenticates the user, and sets up auth state listener. * @param {function} setDb - React setter for Firestore instance. * @param {function} setAuth - React setter for Auth instance. * @param {function} setUserId - React setter for user ID. * @param {function} setIsAuthReady - React setter for auth readiness state. */ const initializeFirebase = async (setDb, setAuth, setUserId, setIsAuthReady) => { try { if (!firebaseConfig) { console.error("Firebase configuration is missing."); return; } const app = initializeApp(firebaseConfig); const dbInstance = getFirestore(app); const authInstance = getAuth(app); setDb(dbInstance); setAuth(authInstance); // 1. Initial Authentication if (initialAuthToken) { await signInWithCustomToken(authInstance, initialAuthToken); } else { await signInAnonymously(authInstance); } // 2. Auth State Listener const unsubscribe = onAuthStateChanged(authInstance, (user) => { const currentUserId = user?.uid || crypto.randomUUID(); setUserId(currentUserId); setIsAuthReady(true); console.log("Firebase Auth State Changed. User ID:", currentUserId); }); return () => unsubscribe(); } catch (error) { console.error("Error initializing Firebase:", error); setIsAuthReady(true); // Still mark as ready even on failure to avoid infinite loading } }; /** * Ensures the public product collection has initial data. * @param {object} db - Firestore instance. */ const initializeProducts = async (db) => { const collectionPath = `/artifacts/${appId}/public/data/products`; const productsRef = collection(db, collectionPath); const snapshot = await getDocs(productsRef); if (snapshot.empty) { console.log("Product collection empty. Seeding initial data."); const initialProducts = [ { id: "p101", name: "Laptop Gaming Pro", price: 12500, description: "Powerful performance for competitive gaming.", imageUrl: "https://placehold.co/150x150/007AFF/ffffff?text=Laptop", category: "Electronics" }, { id: "p102", name: "Wireless Headset X", price: 799, description: "Noise-cancelling, all-day comfort.", imageUrl: "https://placehold.co/150x150/FF3B30/ffffff?text=Headset", category: "Accessories" }, { id: "p103", name: "Mechanical Keyboard", price: 450, description: "Tactile keys for fast typing.", imageUrl: "https://placehold.co/150x150/FF9500/ffffff?text=Keyboard", category: "Accessories" }, { id: "p104", name: "Smartwatch Elite", price: 2100, description: "Health tracking and notifications.", imageUrl: "https://placehold.co/150x150/34C759/ffffff?text=Watch", category: "Wearables" }, { id: "p105", name: "Portable Speaker", price: 550, description: "Deep bass and 10 hours battery life.", imageUrl: "https://placehold.co/150x150/007AFF/ffffff?text=Speaker", category: "Audio" }, ]; for (const product of initialProducts) { const productDocRef = doc(db, collectionPath, product.id); await setDoc(productDocRef, product); } } }; // --- Components --- /** * Product Card component to display product information and add to cart action. */ const ProductCard = React.memo(({ product, addItemToCart }) => (
{product.description}
العربة فارغة حالياً.
أضف بعض المنتجات لتبدأ التسوق.
{item.name}
{item.quantity} x {item.price.toLocaleString('en-US', { style: 'currency', currency: 'MAD', minimumFractionDigits: 0 })}
هذا نموذج، عملية الدفع غير فعالة.
{error}
المرجو مراجعة الـ Console للتفاصيل التقنية.
جاري تحميل المنتجات...
لا توجد منتجات حالياً. قد يكون النظام يعمل على تهيئة قاعدة البيانات.