Экраны
В этом разделе описывается каждый компонуемый элемент уровня экрана, его обязанности, параметры, которые он получает, и побочные эффекты, которые он производит.
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, слоган и кнопка входа в систему. Включает выбор темы в правом верхнем углу.
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
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). Навигация использует только UserId; остальное загружается в 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 (имя, фотография, премиум-статус, роль администратора).
- Если у пользователя Премиум-подписка, он рассчитывает оставшиеся дни подписки (
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
Фичеро: 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 | ID пользователя, историю которого просматривают |
isDarkTheme | Boolean | Управляет активной визуальной темой |
onBack | () -> Unit | Вернуться в EditProfileScreen |
PremiumSelectionScreen
Фичеро: PremiumSelectionScreen.kt
Рута: premium_selection/{idUsuario}
Модель просмотра: PremiumSelectionViewModel
Экран заключения договора на премиум-подписку. Подробная документация находится в Funcionalidades - Suscripción Premium.