| المقياس | القيمة | Metric | Value |
|---|---|---|---|
| إجمالي ملفات Dart | 35+ | Dart Files | 35+ |
| إجمالي أسطر الكود | ~4,500 | Lines of Code | ~4,500 |
| تغطية الاختبارات | ممتازة (270 اختبار) | Test Coverage | Excellent (270 tests) |
| تقييم جودة الكود | A (ممتاز) | Code Quality | A (Excellent) |
| الإصدار الحالي | 1.3.0 | Current Version | 1.3.0 |
الملف: lib/services/hadith_loader.dart
// المشكلة: لا يوجد try-catch
final List<dynamic> jsonList = json.decode(jsonString);الحل:
static Future<List<Hadith>> loadHadiths() async {
try {
final String jsonString = await rootBundle.loadString(
'assets/json/40-hadith-nawawi.json',
);
final List<dynamic> jsonList = json.decode(jsonString);
return jsonList.map((item) => Hadith.fromJson(item)).toList();
} on FormatException catch (e) {
throw Exception('خطأ في تنسيق ملف البيانات: $e');
} catch (e) {
throw Exception('فشل تحميل الأحاديث: $e');
}
}الملف: lib/services/preferences_service.dart:27
// المشكلة: قد يفشل DateTime.parse
return DateTime.parse(timeString);الحل:
static Future<DateTime?> getLastReadTime() async {
final prefs = await SharedPreferences.getInstance();
final timeString = prefs.getString(lastReadTimeKey);
if (timeString == null) return null;
try {
return DateTime.parse(timeString);
} catch (e) {
// إذا كانت البيانات تالفة، نمسحها
await prefs.remove(lastReadTimeKey);
return null;
}
}الملف: lib/screens/hadith_details_screen.dart:324
// المشكلة: الرقم 42 مكتوب يدوياً
onPressed: widget.index < 42 ? () => _navigateToNextHadith(context) : null,الحل: استخدام طول القائمة الفعلي من HadithCubit
الملف: lib/screens/home_screen.dart:417-425
- البحث يتم على كل حرف بدون debounce
- البحث case-sensitive
- القائمة تُنشأ من جديد في كل مرة
الحل:
// إضافة debounce للبحث
Timer? _debounce;
void _onSearchChanged(String value) {
if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 300), () {
setState(() {
_searchQuery = value.trim().toLowerCase();
});
});
}
// بحث غير حساس لحالة الأحرف
final filtered = _searchQuery.isEmpty
? state.hadiths
: state.hadiths.where((h) =>
h.hadith.toLowerCase().contains(_searchQuery) ||
h.description.toLowerCase().contains(_searchQuery),
).toList();الملف: lib/cubit/audio_player_cubit.dart:65-72
- Stream الموضع يرسل تحديثات كثيرة جداً
الحل: استخدام throttle أو distinct
الملفات المتأثرة:
lib/widgets/hadith_tile.dartlib/widgets/audio_player_widget.dart
الحل:
Semantics(
label: 'الحديث رقم $index',
child: InkWell(
// ...
),
)بعض الأزرار تفتقر إلى tooltip للمستخدمين
لا يمكن للمستخدم حفظ أحاديث مفضلةفقط "آخر قراءة" موجود
تم تنفيذ:
- ✅ إضافة
FavoritesCubit - ✅ تخزين قائمة المفضلة في SharedPreferences
- ✅ إضافة أيقونة قلب في شاشة التفاصيل
- ✅ إضافة فلتر للمفضلة في الشاشة الرئيسية
لا يوجد مشاركة كصورةلا يوجد نسخ للنص
تم تنفيذ:
- ✅ مشاركة كصورة (ShareableHadithCard)
- ✅ اختيار ثيم الصورة
- ✅ مشاركة الحديث فقط أو مع الشرح
لا توجد إشعاراتلا يوجد تذكير بحديث اليوم
تم تنفيذ:
- ✅ NotificationService للإشعارات المحلية
- ✅ ReminderCubit لإدارة التذكيرات
- ✅ شاشة إعدادات للتحكم بالتذكيرات
- ✅ اختيار وقت التذكير
- ✅ دعم إعادة جدولة بعد إعادة تشغيل الجهاز
لا يوجد وضع قراءة مركزلا يوجد تمرير تلقائي مع الصوت
تم تنفيذ:
- ✅ وضع القراءة المركز (FocusedReadingScreen)
- ✅ التحكم بالإيماءات (إظهار/إخفاء عناصر التحكم)
- ✅ التنقل بين الأحاديث بالتمرير
- ✅ بحث برقم الحديث
- ✅ فلترة المفضلة موجودة
- ✅ سجل البحث
لا توجد إحصائيات قراءةلا يوجد تتبع للتقدم التفصيلي
تم تنفيذ:
- ✅ ReadingStatsCubit لإحصائيات القراءة
- ✅ عرض الأحاديث المقروءة والمتبقية
- ✅ نسبة الإنجاز مع شريط تقدم
- ✅ تحديد الأحاديث كمقروءة/غير مقروءة
- ✅ دعم اللغة الإنجليزية
- ✅ ترجمة كاملة للأحاديث والشروحات
- ⏳ دعم اللغة الفرنسية (قادم)
الملفات المتأثرة:
lib/cubit/font_size_cubit.dart- State مع Cubit في نفس الملفlib/cubit/audio_player_cubit.dart- State مع Cubit في نفس الملف
// lib/core/constants.dart
class AppConstants {
static const int audioSkipSeconds = 10;
static const double minFontSize = 12.0;
static const double maxFontSize = 30.0;
static const double fontSizeStep = 2.0;
static const List<double> playbackSpeeds = [0.5, 0.75, 1.0, 1.25, 1.5, 2.0];
static const Duration searchDebounce = Duration(milliseconds: 300);
}نقل كل النصوص المتكررة إلى AppStrings
| الأولوية | الملف | نوع الاختبار |
|---|---|---|
| حرجة | hadith_cubit_test.dart |
تحميل، أخطاء |
| حرجة | audio_player_cubit_test.dart |
تشغيل، إيقاف، تقديم |
| عالية | preferences_service_test.dart |
قراءة، كتابة |
| عالية | theme_cubit_test.dart |
تبديل الثيمات |
| متوسطة | font_size_cubit_test.dart |
زيادة، تقليل |
| متوسطة | last_read_cubit_test.dart |
حفظ، استرجاع |
- تحميل التطبيق والتنقل
- تشغيل الصوت والتحكم
- البحث والفلترة
- تغيير الثيم
- إضافة معالجة الأخطاء لـ JSON
- إصلاح DateTime parsing
- إزالة الأرقام المكتوبة يدوياً
- إضافة validation للمدخلات
- تحسين البحث (debounce + case-insensitive + Arabic normalization)
- تقليل تحديثات Stream
- فصل State من Cubit files
- إنشاء constants file
- كتابة Unit tests للـ Cubits (257 اختبار)
- كتابة Integration tests (13 اختبار)
- إعداد CI/CD للاختبارات
- إضافة Semantic labels
- إضافة tooltips متسقة
- تحسين تجربة لوحة المفاتيح
- نظام المفضلة (FavoritesCubit)
- التذكيرات اليومية (ReminderCubit, NotificationService)
- وضع القراءة المركز (FocusedReadingScreen)
- الإحصائيات (ReadingStatsCubit)
- مشاركة كصورة (ShareImageService)
- دعم لغات إضافية (v2.0)
- دعم اللغة الإنجليزية | English language support ✅
- المزامنة السحابية | Cloud sync
- تطبيق Apple Watch | Apple Watch app
- دعم اللغة الفرنسية | French language support
| الجانب | قبل | بعد | الحالة |
|---|---|---|---|
| معالجة الأخطاء | ضعيفة | شاملة | ✅ |
| تغطية الاختبارات | 5% | 95%+ (270 اختبار) | ✅ |
| إمكانية الوصول | محدودة | متوافقة WCAG | ✅ |
| الأداء | جيد | ممتاز | ✅ |
| المميزات | أساسية | متقدمة | ✅ |
| دعم اللغات | عربي فقط | عربي وإنجليزي | ✅ |
- ✅ نظام المفضلة مع الفلترة | Favorites with filtering
- ✅ إحصائيات القراءة والتقدم | Reading statistics
- ✅ مشاركة كصورة مع ثيمات متعددة | Share as image
- ✅ وضع القراءة المركز | Focused reading mode
- ✅ التذكيرات اليومية مع شاشة الإعدادات | Daily reminders
- ✅ دعم اللغة الإنجليزية | English language support
- ✅ البحث برقم الحديث | Search by hadith number
- ✅ سجل البحث | Search history
- ✅ عناوين الأحاديث | Hadith titles
- ✅ شروحات محسنة بتنسيق Markdown | Enhanced markdown descriptions
- ✅ 270 اختبار وحدة وتكامل | 270 unit and integration tests
- اختر issue من القائمة
- أنشئ branch جديد:
feature/issue-name - اكتب الاختبارات أولاً (TDD)
- نفذ الحل
- تأكد من مرور جميع الاختبارات
- افتح Pull Request