انتقل إلى المحتوى الرئيسي

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 والشعار وزر تسجيل الدخول. يتضمن محدد السمة في الزاوية اليمنى العليا.

حدود:

المعلمةاكتبالوصف
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
onToggleTheme() -> Unitالتبديل بين المظهر الفاتح والداكن
onNavigateToLogin() -> Unitانتقل إلى شاشة تسجيل الدخول

##شاشة تسجيل الدخول

فيشيرو: LoginScreen.kt روتا: login نموذج العرض: LoginViewModel

يدير مصادقة المستخدمين الحاليين باستخدام معرف وكلمة المرور.

تدفق المصادقة:

  1. يقوم المستخدم بإدخال المعرف وكلمة المرور الخاصة به.
  2. يستعلم ViewModel عن AuthRepository.getUserByDni(dni).
  3. إذا تم العثور على سجل وتطابق كلمة المرور، فسيتم استدعاء SecureSessionManager.iniciarSesion(...) لاستمرار الجلسة.
  4. يتم استدعاء onLoginSuccess مع بيانات المستخدم. ينتقل التطبيق إلى profile/{idUsuario}؛ يتم تحميل بيانات الملف الشخصي (الاسم، المشرف، المميز) حديثًا من Supabase على ProfileViewModel.
  5. إذا كانت بيانات الاعتماد غير صحيحة، فسيتم عرض رسالة خطأ على الشاشة.

حدود:

المعلمةاكتبالوصف
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
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 بشكل افتراضي.

حدود:

المعلمةاكتبالوصف
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
onBack() -> Unitالعودة إلى LoginScreen

نسيت كلمة المرور​

فيشيرو: ForgotPasswordScreen.kt روتا: forgot نموذج العرض: ForgotPasswordViewModel

مسار استعادة كلمة المرور في خطوتين:

الخطوة 1: يقوم المستخدم بإدخال رقم التعريف والبريد الإلكتروني الخاص به. يتم استدعاء AuthRepository.verifyCredentials(dni, email) للتحقق من وجود الزوج. إذا كان صحيحا، انتقل إلى الخطوة 2.

الخطوة 2: يقوم المستخدم بإدخال كلمة المرور الجديدة وتأكيدها. إذا كانت متطابقة، فسيتم تحديث الحقل contraseniaHash باستخدام AuthRepository.updatePassword(userId, newPass).

حدود:

المعلمةاكتبالوصف
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
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()

حدود:

المعلمةاكتبالوصف
userIdIntمعرف المستخدم في قاعدة البيانات
isPremiumBooleanحالة الاشتراك المميز (مكملة للحالة التي تم تحميلها بواسطة ViewModel)
darkThemeBooleanيتحكم في الموضوع المرئي النشط
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).

حدود:

المعلمةاكتبالوصف
idUsuarioIntمعرف المستخدم للتحرير
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
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).

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

حدود:

المعلمةاكتبالوصف
idUsuarioIntمعرف المستخدم الذي تتم استشارة تاريخه
isDarkThemeBooleanيتحكم في الموضوع المرئي النشط
onBack() -> Unitالعودة إلى EditProfileScreen

شاشة التحديد المميزة​

فيشيرو: PremiumSelectionScreen.kt روتا: premium_selection/{idUsuario} نموذج العرض: PremiumSelectionViewModel

شاشة التعاقد على الاشتراك المميز. الوثائق التفصيلية موجودة في Funcionalidades - Suscripción Premium.