Registre de pes
Pantalla de registre
Permet a l'usuari registrar el pes corporal diari i visualitzar l'evolució temporal mitjançant un gràfic de línies dibuixat amb l'API de Canvas de Compose.
Càrrega de dades
En inicialitzar la pantalla es consulta la taula peso_usuario de Supabase filtrant per id_usuario i ordenant els resultats de forma ascendent per data. Els registres s'emmagatzemen a l'estat registros: List<PesoUsuario>.
Restricció d'un registre per dia
La pantalla comprova si ja hi ha un registre per a la data actual (fechaHoy) abans de mostrar el camp d'entrada. La variable yaExisteHoy es calcula comparant la data de cada registre amb la data del sistema:
val fechaHoy = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date())
val yaExisteHoy = registros.any { it.fecha == fechaHoy }
Si ja hi ha registre per avui, el camp d'entrada s'amaga i es mostra un missatge informatiu. Aquesta restricció és exclusivament a nivell d'UI, no hi ha una restricció UNIQUE a la base de dades per a aquesta combinació de columnes.
Inserció d'un registre nou
L'usuari introdueix el pes al camp de text (accepta valors decimals) i prem el botó de confirmar. S'executa un insert a Supabase amb el id_usuario, el valor de pes i la data actual.
Edició d'un registre existent
Cada fila del llistat inclou un botó d'edició que activa el mode d'edició en línia (editandoId). En confirmar, s'executa un update a Supabase sobre el registre identificat pel seu id.
Eliminació d'un registre
El botó d'esborrament de cada fila executa un delete a Supabase filtrant per id del registre.
Gràfic d'evolució
El gràfic es dibuixa amb Canvas de Jetpack Compose. La implementació normalitza els valors de pes al rang [0, 1] relatiu al mínim i màxim de l'historial, els mapeja a coordenades de píxel al canves i els uneix amb línies mitjançant drawPath. Cada punt es representa amb un cercle farcit.
L'eix horitzontal representa el temps (les entrades estan ordenades cronològicament) i l'eix vertical el pes en quilograms. Els valors mínim i màxim es mostren com a etiquetes de text als extrems de l'eix.
Si l'historial conté menys de dos punts, el gràfic no es renderitza (calen almenys dos punts per dibuixar una línia).