untitled

Pasted Nov 11, 2026, 7:21 PM1 file277 lines

Scan to open on your phone

Point a camera at the QR code - it opens this exact paste, no app needed.

https://codepastes.com/zzgs7cs0qw0drzze
untitled
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