Pular para o conteúdo principal

Registro de peso

Tela de Registro​

Ele permite ao usuário registrar seu peso corporal diário e visualizar a evolução ao longo do tempo usando um gráfico de linhas desenhado com a API Canvas do Compose.

Carregamento de dados​

Ao inicializar a tela é consultada a tabela Supabase peso_usuario, filtrando por id_usuario e ordenando os resultados em ordem crescente por data. Os registros são armazenados no estado registros: List<PesoUsuario>.

Restrição de uma inscrição por dia​

A tela verifica se já existe um registro para a data atual (fechaHoy) antes de exibir o campo de entrada. A variável yaExisteHoy é calculada comparando a data de cada registro com a data do sistema:

val fechaHoy = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date())
val yaExisteHoy = registros.any { it.fecha == fechaHoy }

Se já existir um registro para hoje, o campo de entrada será ocultado e uma mensagem informativa será exibida. Esta restrição é exclusivamente no nível da UI, não há restrição UNIQUE no banco de dados para esta combinação de colunas.

Inserção de um novo registro​

O usuário insere o peso no campo de texto (aceita valores decimais) e pressiona o botão confirmar. Um insert é executado no Supabase com o id_usuario, o valor do peso e a data atual.

Editando um registro existente​

Cada linha da listagem inclui um botão de edição que ativa o modo de edição online (editandoId). Após o commit, um update é executado no Supabase no registro identificado por seu id.

Excluindo um registro​

O botão delete para cada linha executa um delete no Supabase filtrando por id do registro.

Gráfico de evolução​

O gráfico é desenhado com Canvas do Jetpack Compose. A implementação normaliza os valores de peso para o intervalo [0, 1] em relação ao mínimo e máximo do histórico, mapeia-os para coordenadas de pixel na tela e os une com linhas usando drawPath. Cada ponto é representado por um círculo preenchido.

O eixo horizontal representa o tempo (as entradas são organizadas cronologicamente) e o eixo vertical representa o peso em quilogramas. Os valores mínimo e máximo são exibidos como rótulos de texto nas extremidades do eixo.

Se o histórico contiver menos de dois pontos, o gráfico não será renderizado (são necessários pelo menos dois pontos para desenhar uma linha).