NahdaAIنهضة
Firebase & Supabase • المستوى الرابع • الدرس 3

مشروع تطبيقي — بناء تطبيق دردشة فورية بـ Firebase

العودة لفهرس المستوى

أهداف المشروع

  • دمج Auth + Firestore + Real-time Sync في تطبيق واحد.
  • بناء نظام تسجيل وإرسال رسائل فورية بين مستخدمين.
  • إدارة حالة المصادقة مع onAuthStateChanged.
  • تطبيق أنماط معمارية حقيقية لتطبيقات الإنتاج.

1. البنية المعمارية للتطبيق

تطبيق الدردشة نموذج مثالي لدمج خدمات Firebase. سيعتمد على:

javascript
// البنية الكاملة

┌─────────────────────────────────────────┐
│           المستخدم (المتصفح)            │
└─────────────────────────────────────────┘
                    │
       ┌────────────┼────────────┐
       ▼            ▼            ▼
   ┌────────┐  ┌─────────┐  ┌─────────┐
   │  Auth  │  │Firestore│  │ FCM     │
   │        │  │         │  │ (إشعارات)│
   └────────┘  └─────────┘  └─────────┘
       │            │            │
       ▼            ▼            ▼
   ┌──────────────────────────────────┐
   │        Firebase Backend           │
   └──────────────────────────────────┘

2. دورة حياة الرسالة

كيف تنتقل الرسالة من المرسل إلى المستقبل في الوقت الفعلي:

javascript
// 1. المرسل يُرسل رسالة
await addDoc(collection(db, 'messages'), {
  content: 'مرحباً!',
  senderId: 'user-1',
  roomId: 'room-1',
  createdAt: serverTimestamp()
});

// 2. Firestore يُحدّث المستند فوراً
// 3. onSnapshot يلتقط التغيير في كل متصفح مفتوح
onSnapshot(query(collection(db, 'messages'), orderBy('createdAt')), (snap) => {
  // كل المستخدمين المفتوحين يستقبلون الرسالة فوراً
});

// التأخير: عادة < 200ms

// 4. (اختياري) Cloud Function يُرسل FCM
// للمستخدمين الذين أغلقوا المتصفح

3. الكود الكامل المطلوب تنفيذه

المطلوب في هذا المشروع: 6 دوال أساسية + اختبار تلقائي:

register

تسجيل مستخدم جديد بالبريد.

login

تسجيل الدخول.

logout

تسجيل الخروج.

sendMessage

إرسال رسالة إلى Firestore.

listenToMessages

الاستماع الفوري للرسائل الجديدة.

watchAuth

مراقبة حالة المصادقة.

التطبيق العملي المباشر

تحدي المشروع: دردشة كاملة

  1. أضف login(email, password) مع signInWithEmailAndPassword.
  2. أضف logout() مع signOut.
  3. أضف sendMessage(roomId, senderId, content) مع addDoc + serverTimestamp.
  4. أضف listenToMessages(roomId, callback) مع onSnapshot.
  5. أضف watchAuth(callback) مع onAuthStateChanged.
  6. أضف اختباراً تلقائياً شاملاً.
⏳ جارٍ التحميل...