Запись веса
##РегистроСкрин
Он позволяет пользователю записывать свой ежедневный вес тела и визуализировать его динамику с течением времени с помощью линейного графика, нарисованного с помощью API Canvas Compose.
Загрузка данных
При инициализации экрана обращается к таблице Supabase peso_usuario, фильтрует по id_usuario и упорядочивает результаты в порядке возрастания по дате. Регистры хранятся в состоянии registros: List<PesoUsuario>.
Ограничение одной регистрации в день
Перед отображением поля ввода на экране проверяется, существует ли уже запись на текущую дату (fechaHoy). Переменная yaExisteHoy рассчитывается путем сравнения даты каждой записи с системной датой:
val fechaHoy = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date())
val yaExisteHoy = registros.any { it.fecha == fechaHoy }
Если запись на сегодняшний день уже существует, поле ввода скрывается и отображается информационное сообщение. Это ограничение действует исключительно на уровне пользовательского интерфейса, в базе данных нет ограничения UNIQUE для этой комбинации столбцов.
Вставка новой записи
Пользователь вводит вес в текстовое поле (принимаются десятичные значения) и нажимает кнопку подтверждения. insert выполняется в Supabase с id_usuario, значением веса и текущей датой.
Редактирование существующей записи
Каждая строка в списке содержит кнопку редактирования, которая активирует режим онлайн-редактирования (editandoId). После фиксации update запускается в Supabase для записи, идентифицируемой ее id.
Удаление записи
Кнопка удаления для каждой строки запускает delete в фильтрации Supabase по id записи.
График эволюции
График нарисован с помощью Canvas Jetpack Compose. Реализация нормализует значения веса в диапазоне [0, 1] относительно минимума и максимума истории, сопоставляет их с координатами пикселей на холсте и объединяет их со строками с помощью drawPath. Каждая точка представлена закрашенным кружком.
Горизонтальная ось представляет время (записи расположены в хронологическом порядке), а вертикальная ось представляет вес в килограммах. Минимальные и максимальные значения отображаются в виде текстовых меток на концах оси.
Если в истории меньше двух точек, график не отображается (для построения линии необходимо не менее двух точек).