Перейти к основному содержанию

Экраны

В этом разделе описывается каждый компонуемый элемент уровня экрана, его обязанности, параметры, которые он получает, и побочные эффекты, которые он производит.


SplashVideoScreen​

Фичеро: SplashVideoScreen.kt Рута: splash

Отображает экран приветствия с воспроизведением вступительного видео. Видео загружается из res/raw/video_app.mp4 с помощью VideoView, встроенного в Compose с AndroidView.

Поведение:

  • Появляется с затуханием в 500 мс в начале.
  • Через 2 секунды в нижней части появится индикатор прогресса и фирменный знак.
  • Автоматически переходит к loading после завершения видео (OnCompletionListener) или после 13-секундного тайм-аута, если видео не заканчивается.
  • Фон фиксированный белый независимо от системной темы.

Параметры:

ПараметрТипОписание
onVideoFinished() -> UnitОбратный вызов, вызываемый в конце видео

LoadingScreen (экран загрузки)​

Рута: 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). Навигация использует только UserId; остальное загружается в 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 (имя, фотография, премиум-статус, роль администратора).
  • Если у пользователя Премиум-подписка, он рассчитывает оставшиеся дни подписки (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​

Фичеро: 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).

В каждом пункте списка указана концепция (тип плана), способ оплаты, сумма и дата. В случае ошибки подключения отображается сообщение об ошибке с кнопкой повтора. Во время загрузки данных отображается скелетный список.

Параметры:

ПараметрТипОписание
idUsuarioIntID пользователя, историю которого просматривают
isDarkThemeBooleanУправляет активной визуальной темой
onBack() -> UnitВернуться в EditProfileScreen

PremiumSelectionScreen​

Фичеро: PremiumSelectionScreen.kt Рута: premium_selection/{idUsuario} Модель просмотра: PremiumSelectionViewModel

Экран заключения договора на премиум-подписку. Подробная документация находится в Funcionalidades - Suscripción Premium.