دليل دمج نظام التنبيهات الشامل

يوضح هذا الدليل كيفية دمج نظام التنبيهات المتخصص في تطبيق الموبايل، حيث يغطي الأقسام الأربعة الرئيسية والإجراءات المرتبطة بها لضمان تجربة مستخدم سلسة وتفاعلية.

1. أقسام التنبيهات ونقاط الوصول (API Endpoints)

يتم تصنيف التنبيهات حسب الغرض منها. يمكن جلب البيانات لكل تبويب باستخدام الروابط المخصصة التالية:

النظام (System)

/api/v1/notifications/system

يحتوي على: المتابعات، الحظر، الطرد، وتنبيهات النظام الأساسية.

المكافآت (Reward)

/api/v1/notifications/reward

يحتوي على: هدايا التصنيف، مشتريات العضوية، والجوائز.

التشغيل (Operation)

/api/v1/notifications/operation

يحتوي على: رسائل الإدارة اليدوية والرسائل التشغيلية العامّة.

الفريق (Team)

/api/v1/notifications/team

يحتوي على: الاحتفالات بالوصول إلى المستويات الجديدة وإنجازات المجتمع.

2. مصفوفة الإجراءات (The Action Matrix)

عند النقر على التنبيه، يجب فحص حقل action لتحديد كيفية التنقل داخل التطبيق.

مفتاح الإجراء (Key) سلوك الواجهة (UI Behavior) محتوى action_path
user فتح الملف الشخصي يحتوي على معرف المستخدم (User ID).
room الانضمام للغرفة يحتوي على الـ UID الخاص بالغرفة.
url فتح رابط خارجي يحتوي على رابط صالح (https://...).
post فتح منشور/لحظة يحتوي على معرف المنشور (Post ID).
null تنبيه ثابت لا يتطلب أي إجراء تنقل.

3. معالجة البيانات الإضافية (Metadata Handling)

بالنسبة لتنبيهات "الفريق" أو التنبيهات المتقدمة، يوفر حقل metadata بيانات بتنسيق JSON لعرض واجهات غنية بالوسائط.

مثال لإنجاز رفع المستوى (Level Up):

{
    "type": "team",
    "metadata": {
        "user": {
            "id": 4,
            "name": "User Name",
            "image": "https://.../user.jpg"
        },
        "level": {
            "order": 50,
            "image": "https://.../celebration_art.png"
        }
    }
}

4. منطق التنفيذ (Implementation Logic)

مثال بلغة Dart لتطبيق Flutter يوضح كيفية التعامل مع ضغطة التنبيه:

void onNotificationTap(Map<String, dynamic> notification) {
  final action = notification['action'];
  final path = notification['action_path'];

  if (action == 'user') {
    Navigator.push(context, MaterialPageRoute(builder: (context) => ProfilePage(userId: path)));
  } else if (action == 'room') {
    JoinRoom(roomUid: path);
  } else if (action == 'url') {
    launchURL(path);
  } else if (action == 'post') {
    ViewPost(postId: path);
  }
}

5. ملخص الحقول (Summary of Fields)

  • title: العنوان الوصفي (مثل: "تهانينا!").
  • description: نص محتوى الرسالة.
  • image_path: الأيقونة الرئيسية أو الصورة البديلة.
  • metadata: بيانات غنية لتنسيقات العرض الخاصة.
  • type: معرف القسم (Section Identifier).