Pantallas
#شاشات
يصف هذا القسم كل مادة قابلة للتركيب على مستوى الشاشة، ومسؤولياتها، والمعلمات التي تتلقاها، والتأثيرات الجانبية التي تنتجها.
سبلاشفيديوسكرين
فيشيرو: SplashVideoScreen.kt
روتا: splash
يعرض شاشة ترحيب مع تشغيل فيديو تمهيدي. يتم تحميل الفيديو من res/raw/video_app.mp4 باستخدام VideoView المدمج في Compose باستخدام AndroidView.
السلوك:
- يظهر مع تلاشي قدره 500 مللي ثانية في البداية.
- بعد ثانيتين، يظهر مؤشر التقدم والعلامة التجارية في المنطقة السفلية.
- ينتقل تلقائيًا إلى
loadingعند الانتهاء من الفيديو (OnCompletionListener) أو بعد مهلة 13 ثانية إذا لم ينته الفيديو. - الخلفية ثابتة باللون الأبيض بغض النظر عن سمة النظام.
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
onVideoFinished | () -> Unit | تم استدعاء رد الاتصال في نهاية الفيديو |
شاشة التحميل (شاشة التحميل)
روتا: loading
شاشة متوسطة تتحقق من وجود جلسة مستمرة صالحة على SecureSessionManager. ليس لديه قابل للتركيب خاص به، ويتم تنفيذ المنطق مباشرة في المسار loading القابل للتركيب الخاص بـ NavHost.
السلوك:
- اقرأ الجلسة المحفوظة باستخدام
SecureSessionManager.obtenerSesion(). - في حالة وجود جلسة صالحة، انتقل مباشرة إلى
profile/{idUsuario}. - إذا لم تكن هناك جلسة، انتقل إلى
main.
##الشاشة الرئيسية
فيشيرو: MainScreen.kt
روتا: main
شاشة الترحيب للمستخدمين غير المصادقين. يُظهر شعار Trainium والشعار وزر تسجيل الدخول. يتضمن محدد السمة في الزاوية اليمنى العليا.
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onToggleTheme | () -> Unit | التبديل بين المظهر الفاتح والداكن |
onNavigateToLogin | () -> Unit | انتقل إلى شاشة تسجيل الدخول |
##شاشة تسجيل الدخول
فيشيرو: LoginScreen.kt
روتا: login
نموذج العرض: LoginViewModel
يدير مصادقة المستخدمين الحاليين باستخدام معرف وكلمة المرور.
تدفق المصادقة:
- يقوم المستخدم بإدخال المعرف وكلمة المرور الخاصة به.
- يستعلم ViewModel عن
AuthRepository.getUserByDni(dni). - إذا تم العثور على سجل وتطابق كلمة المرور، فسيتم استدعاء
SecureSessionManager.iniciarSesion(...)لاستمرار الجلسة. - يتم استدعاء
onLoginSuccessمع بيانات المستخدم. ينتقل التطبيق إلىprofile/{idUsuario}؛ يتم تحميل بيانات الملف الشخصي (الاسم، المشرف، المميز) حديثًا من Supabase علىProfileViewModel. - إذا كانت بيانات الاعتماد غير صحيحة، فسيتم عرض رسالة خطأ على الشاشة.
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onBack | () -> Unit | العودة إلى MainScreen |
onNavigateToRegister | () -> Unit | انتقل إلى التسجيل |
onNavigateToForgot | () -> Unit | انتقل إلى استعادة كلمة المرور |
onLoginSuccess | (String, Int, Int, Int) -> Unit | رد الاتصال باستخدام (الاسم، isAdmin، معرف المستخدم، isPremium). يستخدم التنقل معرف المستخدم فقط؛ يتم تحميل الباقي في ViewModel الخاص بـ ProfileScreen. |
##تسجيل الشاشة
فيشيرو: RegisterScreen.kt
روتا: register
نموذج العرض: RegisterViewModel
نموذج تسجيل مستخدم جديد. اجمع الاسم والمعرف والبريد الإلكتروني وكلمة المرور ورقم الهاتف وقم بالتفويض إلى AuthRepository.insertUser(...).
تم تنفيذ عمليات التحقق:
- يجب تعبئة جميع الحقول المطلوبة.
- لا يمكن تسجيل DNI بالفعل (التحقق المسبق باستخدام
AuthRepository.userExistsByDni). - يتم إدراج المستخدم الجديد بـ
admin=0وpremium=falseبشكل افتراضي.
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onBack | () -> Unit | العودة إلى LoginScreen |
نسيت كلمة المرور
فيشيرو: ForgotPasswordScreen.kt
روتا: forgot
نموذج العرض: ForgotPasswordViewModel
مسار استعادة كلمة المرور في خطوتين:
الخطوة 1: يقوم المستخدم بإدخال رقم التعريف والبريد الإلكتروني الخاص به. يتم استدعاء AuthRepository.verifyCredentials(dni, email) للتحقق من وجود الزوج. إذا كان صحيحا، انتقل إلى الخطوة 2.
الخطوة 2: يقوم المستخدم بإدخال كلمة المرور الجديدة وتأكيدها. إذا كانت متطابقة، فسيتم تحديث الحقل contraseniaHash باستخدام AuthRepository.updatePassword(userId, newPass).
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onBack | () -> Unit | العودة إلى LoginScreen |
##شاشة الملف الشخصي
فيشيرو: ProfileScreen.kt
روتا: profile/{idUsuario}
نموذج العرض: ProfileViewModel
المحور الرئيسي للتطبيق بعد تسجيل الدخول. يعرض الصورة الرمزية للمستخدم واسمه وشارة المميز/المسؤول وأزرار الوصول إلى كل قسم.
الوظيفة عند التحميل:
- استرداد بيانات المستخدم المحدثة من Supabase (الاسم، الصورة، الحالة المتميزة، دور المسؤول).
- إذا كان المستخدم Premium، فإنه يقوم بحساب الأيام المتبقية من الاشتراك (
ProfileViewModel.diasRestantes) من الحقلfechaFinللنموذجUsuarioويظهرها على الشارة. إذا انتهت صلاحية الاشتراك اليوم، فسيتم عرض "انتهاء الصلاحية اليوم". إذا كان هناك 7 أيام أو أقل متبقية، يتحول المؤشر إلى اللون الأحمر كتحذير. - التحقق مما إذا كان هناك أي حجوزات تم إلغاؤها تلقائيًا بسبب صيانة الآلات للتاريخ الحالي. إذا كان الأمر كذلك، فسيتم عرض معلومات
AlertDialogمرة واحدة لكل جلسة (يتم التحكم فيها بواسطة المتغير العامavisoMostrado).
أيقونات العناوين:
يتضمن ProfileScreen في الرأس رمز لغة (الكرة الأرضية)، وأيقونة سمة (الشمس/القمر)، وأيقونة إعدادات تنتقل إلى edit_profile.
** أزرار التنقل المتاحة: **
| زر | متاح لـ | الوجهة |
|---|---|---|
| آلات | الكل | maquinas/{isAdmin}/{idUsuario} |
| حجوزاتي | الكل | reservas/{isAdmin}/{idUsuario} |
| أطباق | الكل | platos/{isAdmin}/{idUsuario} |
| سجل الوزن | الكل | registro/{idUsuario} |
| بريميوم | الكل | premium_selection/{idUsuario} |
| تسجيل الخروج | الكل | main (popUpTo 0) + SecureSessionManager.cerrarSesion() |
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
userId | Int | معرف المستخدم في قاعدة البيانات |
isPremium | Boolean | حالة الاشتراك المميز (مكملة للحالة التي تم تحميلها بواسطة ViewModel) |
darkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onToggleTheme | () -> Unit | التبديل بين المظهر الفاتح والداكن |
onToggleLanguage | () -> Unit | افتح محدد اللغة |
onLogout | () -> Unit | رد اتصال تسجيل الخروج |
onNavigateToMaquinas | () -> Unit | انتقل إلى كتالوج الآلة |
onNavigateToPlatos | () -> Unit | انتقل إلى كتالوج الأطباق |
onNavigateToRegistroPeso | () -> Unit | انتقل إلى سجل الوزن |
onNavigateToReservas | () -> Unit | انتقل إلى الحجوزات |
onNavigateToEditProfile | () -> Unit | انتقل إلى تحرير الملف الشخصي |
onNavigateToPremium | () -> Unit | انتقل إلى اختيار الخطة المميزة |
تحرير شاشة الملف الشخصي
فيشيرو: EditProfileScreen.kt
روتا: edit_profile/{idUsuario}
نموذج العرض: EditProfileViewModel
يسمح للمستخدم بتعديل الاسم والبريد الإلكتروني ورقم الهاتف وكلمة المرور وصورة الملف الشخصي. يتم تحديد الصورة من معرض الجهاز باستخدام ActivityResultContracts.GetContent() وتحويلها إلى Base64 باستخدام ImageUtils.uriToBase64. عند الحفظ، تقوم بالتفويض إلى UsuarioRepository.update(...).
قسم الإشعارات: تتضمن الشاشة قسم تكوين إشعار الحجز مع عنصري تحكم:
Switchلتفعيل أو إلغاء تنشيط الإشعارات عالميًا (NotificationSettingsManager.setNotificationsEnabled).- مجموعة
FilterChipمع خيارات التقدم المتاحة (10، 15، 30، 60 و120 دقيقة)، مرئية فقط عند تنشيط الإشعارات. يستمر التفضيل معNotificationSettingsManager.setMinutesBefore(minutes).
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
idUsuario | Int | معرف المستخدم للتحرير |
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onBack | () -> Unit | العودة إلى ProfileScreen |
onNavigateToHistorial | (Int) -> Unit | انتقل إلى سجل الدفع |
onNavigateToPremium | () -> Unit | انتقل إلى اختيار الخطة المميزة |
شاشة ماكويناس
فيشيرو: MaquinasScreen.kt
روتا: maquinas/{isAdmin}/{idUsuario}
نموذج العرض: MaquinasViewModel
كتالوج آلات الصالة الرياضية مع وظيفة الحجز للمستخدمين القياسيين وإدارة الصيانة للمسؤولين. يتضمن التحقق من المدة القصوى البالغة 60 دقيقة لكل حجز. عندما تقوم بإنشاء حجز، قم بجدولة تذكير تلقائيًا باستخدام NotificationHelper.
الوثائق التفصيلية موجودة في Funcionalidades - Máquinas y reservas.
شاشة الحجز
فيشيرو: ReservasScreen.kt
روتا: reservas/{isAdmin}/{idUsuario}
نموذج العرض: ReservasViewModel
قائمة الحجوزات بنظام التصفية حسب خمسة معايير: القادمة، اليوم، الماضية، الكل والتاريخ. يتضمن زر تصدير إلى تقويم الجهاز لكل حجز، وإدارة الإشعارات عند الإلغاء. الوثائق التفصيلية موجودة في Funcionalidades - Máquinas y reservas.
##شاشة اللوحات
فيشيرو: PlatosScreen.kt
روتا: platos/{isAdmin}/{idUsuario}
نموذج العرض: PlatosViewModel
كتالوج الأطباق الغذائية. الوثائق التفصيلية موجودة في Funcionalidades - Platos y nutrición.
شاشة التسجيل
فيشيرو: RegistroScreen.kt
روتا: registro/{idUsuario}
نموذج العرض: RegistroViewModel
السيطرة على وزن الجسم مع الرسم البياني للتطور. الوثائق التفصيلية موجودة في Funcionalidades - Registro de peso.
##الشاشة التاريخية
فيشيرو: HistorialScreen.kt
روتا: historial/{idUsuario}
نموذج العرض: HistorialViewModel
يعرض سجل الدفع الخاص بالمستخدم مرتبة حسب التاريخ التنازلي. يتم خصم الدفعات من PagoRepository.getByUser(idUsuario).
يعرض كل عنصر في القائمة المفهوم (نوع الخطة) وطريقة الدفع والمبلغ والتاريخ. في حالة حدوث خطأ في الاتصال، يتم عرض رسالة خطأ مع زر إعادة المحاولة. أثناء تحميل البيانات، يتم عرض قائمة هيكلية.
حدود:
| المعلمة | اكتب | الوصف |
|---|---|---|
idUsuario | Int | معرف المستخدم الذي تتم استشارة تاريخه |
isDarkTheme | Boolean | يتحكم في الموضوع المرئي النشط |
onBack | () -> Unit | العودة إلى EditProfileScreen |
شاشة التحديد المميزة
فيشيرو: PremiumSelectionScreen.kt
روتا: premium_selection/{idUsuario}
نموذج العرض: PremiumSelectionViewModel
شاشة التعاقد على الاشتراك المميز. الوثائق التفصيلية موجودة في Funcionalidades - Suscripción Premium.