Complete Socratic adaptive exams in Flutter, Guardian WhatsApp alerts, and curriculum robustness

This commit is contained in:
Hamza-Ayed
2026-09-03 10:14:34 +03:00
parent ab482d85e4
commit 12049fd7da
12 changed files with 1444 additions and 26 deletions
@@ -6,6 +6,7 @@ import '../../../core/utils/saqel_toast.dart';
import '../../../data/models/subject_model.dart';
import '../../widgets/luxury_widgets.dart';
import '../player/socratic_video_player_screen.dart';
import '../exams/adaptive_exam_screen.dart';
class SubjectHubScreen extends StatefulWidget {
final SubjectModel subject;
@@ -250,7 +251,7 @@ class _SubjectHubScreenState extends State<SubjectHubScreen> with SingleTickerPr
IconButton(
icon: const Icon(CupertinoIcons.arrow_down_circle_fill, color: AppColors.saqelCyan, size: 28),
onPressed: () {
SaqelToast.showSuccess(context, 'تم تجهيز ملف ${ws.title} للتحميل', title: 'تحميل المذكرة 📄');
_showResourceSheet(context, ws.title, 'ورقة عمل ومذكرة مراجعة', 'PDF جاهز للطباعة بدقة عالية');
},
),
],
@@ -323,7 +324,15 @@ class _SubjectHubScreenState extends State<SubjectHubScreen> with SingleTickerPr
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
),
onPressed: () {
SaqelToast.showInfo(context, 'جاري توليد أسئلة الاختبار التكيفي من بنك الوزارة', title: 'بدء الامتحان 📝');
Navigator.of(context).push(
CupertinoPageRoute(
builder: (context) => AdaptiveExamScreen(
examId: idx + 1,
title: exam.title,
subjectTitle: widget.subject.title,
),
),
);
},
child: const Text('بدء الاختبار 🚀', style: TextStyle(fontSize: 12, fontWeight: FontWeight.w700)),
),
@@ -385,7 +394,7 @@ class _SubjectHubScreenState extends State<SubjectHubScreen> with SingleTickerPr
IconButton(
icon: const Icon(CupertinoIcons.eye_fill, color: AppColors.saqelCyan, size: 24),
onPressed: () {
SaqelToast.showInfo(context, 'جاري فتح ${tb.title} عبر عارض الكتب الذكي', title: 'الكتاب الوزاري 📚');
_showResourceSheet(context, tb.title, 'الكتاب المدرسي المعتمد', 'نسخة وزارة التربية والتعليم المنقحة والمحدثة');
},
),
],
@@ -395,4 +404,97 @@ class _SubjectHubScreenState extends State<SubjectHubScreen> with SingleTickerPr
},
);
}
void _showResourceSheet(BuildContext context, String title, String subtitle, String description) {
showModalBottomSheet(
context: context,
backgroundColor: AppColors.darkSurface,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
),
builder: (ctx) => SafeArea(
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColors.appleBlue.withAlpha(30),
borderRadius: BorderRadius.circular(14),
),
child: const Icon(CupertinoIcons.doc_text_fill, color: AppColors.saqelCyan, size: 26),
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
),
const SizedBox(height: 4),
Text(
subtitle,
style: const TextStyle(color: AppColors.saqelCyan, fontSize: 12, fontWeight: FontWeight.w600),
),
],
),
),
],
),
const SizedBox(height: 16),
Text(
description,
style: const TextStyle(color: AppColors.textSecondaryDark, fontSize: 13.5),
),
const SizedBox(height: 24),
Row(
children: [
Expanded(
child: OutlinedButton.icon(
style: OutlinedButton.styleFrom(
foregroundColor: Colors.white,
side: const BorderSide(color: AppColors.darkCardBorder),
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
onPressed: () {
Navigator.of(ctx).pop();
SaqelToast.showSuccess(context, 'تم تفعيل وضع القراءة دون إنترنت 📖', title: 'حفظ محلي');
},
icon: const Icon(CupertinoIcons.cloud_download, size: 18),
label: const Text('حفظ في الجهاز', style: TextStyle(fontWeight: FontWeight.w700)),
),
),
const SizedBox(width: 12),
Expanded(
child: ElevatedButton.icon(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.appleBlue,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
onPressed: () {
Navigator.of(ctx).pop();
SaqelToast.showInfo(context, 'جاري عرض محتوى $title بالكامل عبر عارض الكتب الذكي', title: 'فتح الوثيقة 📑');
},
icon: const Icon(CupertinoIcons.book, size: 18),
label: const Text('قراءة وتصفح', style: TextStyle(fontWeight: FontWeight.w800)),
),
),
],
),
],
),
),
),
);
}
}