Vamos a realizar una ampliación del ejercicio de Usuarios, de forma que ahora se podrá acceder, una vez nos hayamos logeado, a la publicación de recetas. Para ello deberemos añadir una opción más en el menú que ya teníamos, quedando de la siguiente forma:
1. Sign in
2. Login
3. Change password
4. Logout
5. Recetas
6. Volver
Introduce opción:
Si se selecciona la opción 5 y no estamos logeados, se mostrará un mensaje indicando el problema. En caso de estar logeados se accederá a la screen de las recetas que mostrará el siguiente menú:
1. Seleccionar/Deseleccionar receta
2. Imprimir seleccion
3. Mostrar todas
4. Cambiar prioridad
5. Volver
Introduce opcion:
Seleccionar/Deseleccionar receta: Servirá para añadir o quitar una receta de una lista de RecetasUiState que habrá en el ViewModel (tipo que además de lo que tiene RecetaMock, que podemos ver más abajo en el aviso, tendrá un valor Int prioridad). La selección se hará por el id de la receta, si la receta ya aparecía en la lista será eliminada. Al añadir una nueva receta a la lista, se le asignará la prioridad por defecto que será el puesto que ocupe en la lista (el último).
Imprimir seleccion: Mostrará las recetas que tenemos seleccionadas ordenadas por la prioridad (usa sortedBy), por ejemplo de la siguiente forma:
1. Magdalenas de la abuela de Carlos Arguiñano (40)
2. Pan casero con tomates secos de Carlos Arguiñano (120)
3. Ensalada multicolor con cacahuete de Sonia de la Oz (10)
Mostrar todas: Mostrará la lista de todas las recetas del sistema, crea un formado de salida curioso, aunque no se muestren todos los datos.
Cambiar prioridad: Mostrará las recetas seleccionadas para que tengamos la pista con la prioridad del momento, y pasará a pedirnos tantos números como recetas tengamos seleccionadas, de forma que iremos indicando el nuevo orden que queremos tener, por ejemplo para la siguiente entrada:
Introduce un nuevo orden de prioridad
3
1
2
Cambiará las prioridades en la lista y al pulsar a Imprimir selección se mostrará:
1. Ensalada multicolor con cacahuete de Sonia de la Oz (10)
2. Pan casero con tomates secos de Carlos Arguiñano (120)
3. Magdalenas de la abuela de Carlos Arguiñano (40)
Volver: Nos devolverá al programa principal, que tendrá un bucle preguntando si queremos salir
...
1. Volver
Introduce opcion: 4
Quiere Salir [S|s]?
Si le decimos que S, saldremos de la aplicación. Cualquier otra tecla nos mantendrá en la aplicación mostrándose otra vez el menú de login.
✋ Importante: El código del la función Main podría ser de la siguiente manera:
fun main() {
val usuarioViewModel = UsuarioViewModel()
val recetaViewModel = RecetaViewModel()
var opcion: String = ""
do {
usuarioScreen(usuarioViewModel::onUsuarioEvent)
if (usuarioViewModel.usuarioUiState.estaLogeado) {
recetaScreen(
recetaViewModel.recetaRepository.get(),
recetaViewModel::onRecetaEvent
)
}
println("Quiere Salir [S|s]?")
opcion = readln()
} while (opcion.uppercase() != "S")
}
Pistas
Deberemos crear los paquetes, clases, interfaces y funciones necesarias para añadir la parte de las recetas cumpliendo con la arquitectura ya explicada. La clase de las recetas tendrá el siguiente código:
data class RecetaMock(
val id:Int,
val cookingTime: Int,
val recipeName: String,
var recipePicture: String?,
val chefName: String,
val chefMail: String,
var chefPicture: String?)
Puedes crear la lista de recetas en el lugar correspondiente, de la siguiente manera:
private var receta = mutableListOf<RecetaMock>(
RecetaMock(
id=1,
cookingTime = 40,
recipeName = "Magdalenas de la abuela",
recipePicture = "imagen1.png",
chefName = "Carlos Arguiñano",
chefMail = "carlos.arguiñano@gmail.com",
chefPicture = null
),
RecetaMock(
id=2,
cookingTime = 120,
recipeName = "Pan casero con tomates secos",
recipePicture = "imagen2.png",
chefName = "Carlos Arguiñano",
chefMail = "carlos.arguiñano@gmail.com",
chefPicture = null
),
RecetaMock(
id=3,
cookingTime = 10,
recipeName = "Ensalada multicolor con cacahuete",
recipePicture = "imagen3.png",
chefName = "Sonia de la Oz",
chefMail = "soniaoz@gmail.com",
chefPicture = null
),
RecetaMock(
id=4,
cookingTime = 35,
recipeName = "Caldo de almendras pasas y calabaza",
recipePicture = "imagen4.png",
chefName = "Mohamed Aldalay",
chefMail = "mohaaldala@gmail.com",
chefPicture = null
),
)