Scan to open on your phone
Point a camera at the QR code - it opens this exact paste, no app needed.
https://codepastes.com/zzgs7cs0qw0drzzeuntitledPlain Text
package com.negocio.desinfectantes.ui.productos
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.background
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Save
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import com.negocio.desinfectantes.data.PresentacionEntity
import android.net.Uri
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.font.FontWeight
import coil3.compose.AsyncImage
import com.negocio.desinfectantes.data.AlmacenImagenPresentacion
import kotlinx.coroutines.launch
import androidx.compose.runtime.rememberCoroutineScope
private val Navy = Color(0xFF101D35)
private val CardBlue = Color(0xFF1B2D4A)
private val AccentBlue = Color(0xFF2585F5)
private val SoftBlue = Color(0xFFA9BEDB)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun EditarPresentacionScreen(
nombreProducto: String,
nombreAroma: String,
presentacion: PresentacionEntity,
onVolver: () -> Unit,
onGuardar: (String, Int, Double) -> Unit,
onEliminar: () -> Unit
) {
var nombre by remember(presentacion.id) {
mutableStateOf(presentacion.nombre)
}
var contenido by remember(presentacion.id) {
mutableStateOf(presentacion.contenidoMl.toString())
}
var precio by remember(presentacion.id) {
mutableStateOf(
presentacion.precio.toString().removeSuffix(".0")
)
}
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()
var fotoSeleccionada by remember {
mutableStateOf<Uri?>(
presentacion.fotoUri?.let { Uri.parse(it) }
)
}
var eliminarFoto by remember {
mutableStateOf(false)
}
val selectorFoto = rememberLauncherForActivityResult(
contract = ActivityResultContracts.PickVisualMedia()
) { uri ->
if (uri != null) {
fotoSeleccionada = uri
eliminarFoto = false
}
}
var mostrarConfirmacionEliminar by remember {
mutableStateOf(false)
}
val contenidoValido = contenido.toIntOrNull()?.let { it > 0 } ?: false
val precioValido = precio.toDoubleOrNull()?.let { it >= 0 } ?: false
Column(
modifier = Modifier
.fillMaxSize()
.background(Navy)
.verticalScroll(rememberScrollState())
.padding(20.dp)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
IconButton(onClick = onVolver) {
Icon(
imageVector = Icons.Default.ArrowBack,
contentDescription = "Volver",
tint = Color.White
)
}
}
Spacer(modifier = Modifier.height(10.dp))
Text(
text = "Editar presentación",
color = Color.White,
style = MaterialTheme.typography.headlineSmall
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "$nombreProducto • $nombreAroma",
color = SoftBlue,
style = MaterialTheme.typography.bodyMedium
)
Spacer(modifier = Modifier.height(24.dp))
OutlinedTextField(
value = nombre,
onValueChange = { nombre = it },
label = { Text("Nombre de la presentación") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
colors = OutlinedTextFieldDefaults.colors(
focusedTextColor = Color.White,
unfocusedTextColor = Color.White,
focusedBorderColor = AccentBlue,
unfocusedBorderColor = SoftBlue,
focusedLabelColor = AccentBlue,
unfocusedLabelColor = SoftBlue,
cursorColor = AccentBlue
)
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = contenido,
onValueChange = { contenido = it },
label = { Text("Contenido en mililitros (ml)") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
colors = OutlinedTextFieldDefaults.colors(
focusedTextColor = Color.White,
unfocusedTextColor = Color.White,
focusedBorderColor = AccentBlue,
unfocusedBorderColor = SoftBlue,
focusedLabelColor = AccentBlue,
unfocusedLabelColor = SoftBlue,
cursorColor = AccentBlue
)
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = precio,
onValueChange = { precio = it },
label = { Text("Precio de venta") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal
),
colors = OutlinedTextFieldDefaults.colors(
focusedTextColor = Color.White,
unfocusedTextColor = Color.White,
focusedBorderColor = AccentBlue,
unfocusedBorderColor = SoftBlue,
focusedLabelColor = AccentBlue,
unfocusedLabelColor = SoftBlue,
cursorColor = AccentBlue
)
)
Spacer(modifier = Modifier.height(28.dp))
Button(
onClick = {
onGuardar(
nombre.trim(),
contenido.toInt(),
precio.toDouble()
)
},
modifier = Modifier
.fillMaxWidth()
.height(54.dp),
enabled = nombre.isNotBlank() && contenidoValido && precioValido,
colors = ButtonDefaults.buttonColors(
containerColor = AccentBlue
)
) {
Icon(
imageVector = Icons.Default.Save,
contentDescription = null
)
Spacer(modifier = Modifier.width(8.dp))
Text("Guardar cambios")
}
Spacer(modifier = Modifier.height(14.dp))
OutlinedButton(
onClick = {
mostrarConfirmacionEliminar = true
},
modifier = Modifier
.fillMaxWidth()
.height(54.dp),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = Color.Red
)
) {
Icon(
imageVector = Icons.Default.Delete,
contentDescription = null
)
Spacer(modifier = Modifier.width(8.dp))
Text("Eliminar presentación")
}
}
if (mostrarConfirmacionEliminar) {
AlertDialog(
onDismissRequest = {
mostrarConfirmacionEliminar = false
},
title = {
Text("Eliminar presentación")
},
text = {
Text(
"¿Estás seguro de que deseas eliminar " +
"${presentacion.nombre}? Esta acción no se puede deshacer."
)
},
confirmButton = {
TextButton(
onClick = {
mostrarConfirmacionEliminar = false
onEliminar()
}
) {
Text(
"Eliminar",
color = Color.Red
)
}
},
dismissButton = {
TextButton(
onClick = {
mostrarConfirmacionEliminar = false
}
) {
Text("Cancelar")
}
}
)
}
}
8,829 chars · codepastes.com