Commit 2251ecbd authored by Vinicius Monteiro's avatar Vinicius Monteiro

Código do ModalBottomSheet refatorado, foi criado componente reutilizável....

Código do ModalBottomSheet refatorado, foi criado componente reutilizável. Validações aplicados nos campos de cadastrar usuário
parents a8428371 4bb40cb9
......@@ -2,12 +2,16 @@ package com.br.vini.compose.api
import com.br.fechadura.mobile.api.model.Usuario
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBody
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBodyPatch
import com.br.fechadura.mobile.api.request.GrupoUsuarioPostRequestBody
import com.br.fechadura.mobile.api.request.LoginRequestBody
import com.br.fechadura.mobile.api.request.UsuarioRequestBody
import com.br.fechadura.mobile.api.request.PortaRequestBody
import com.br.fechadura.mobile.api.response.GrupoPortaPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBodyPatch
import com.br.fechadura.mobile.api.response.GrupoPortasResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuariosResponseBody
import com.br.fechadura.mobile.api.response.LoginResponseBody
......@@ -53,12 +57,15 @@ interface ApiEndpoint {
/* =========================================================================================================*/
// Grupo de Usuários
@GET("/grupoUsuarios")
@GET("/AllGrupoUsuarios")
suspend fun getGrupoUsuarios(): Response<GrupoUsuariosResponseBody>
@GET("/allGrupoUsuarios")
suspend fun getAllGrupoUsuarios() : Response<GrupoUsuariosResponseBody>
@POST("/grupoUsuarios")
suspend fun postGrupoUsuario(@Body requestBody : GrupoUsuarioPostRequestBody) : Response<GrupoUsuarioPostResponseBody>
@GET("/grupoUsuarios/{id}")
suspend fun getGrupoUsuarioById(@Path("id") id: String) : Response<GrupoUsuarioResponseBody>
......@@ -87,11 +94,14 @@ interface ApiEndpoint {
// Grupo de Portas
@GET("/allGrupoPortas")
suspend fun getGrupoPortas() : Response<GrupoPortasResponseBody>
suspend fun getAllGrupoPortas() : Response<GrupoPortasResponseBody>
@POST("/grupoPortas")
suspend fun postGrupoPortas(@Body requestBody: GrupoPortaRequestBody) : Response<GrupoPortaPostResponseBody>
@GET("/grupoPortas/{id}")
suspend fun getGrupoPortaById(@Path("id") id: String) : Response<GrupoPortaResponseBody>
@PATCH("/grupoPortas/{id}")
suspend fun patchGrupoPorta(@Path("id") id: String, @Body responseBody: GrupoPortaRequestBodyPatch) : Response<GrupoPortaResponseBodyPatch>
}
\ No newline at end of file
......@@ -3,12 +3,16 @@ package com.br.vini.compose.api
import androidx.datastore.preferences.protobuf.Api
import com.br.fechadura.mobile.api.model.Usuario
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBody
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBodyPatch
import com.br.fechadura.mobile.api.request.GrupoUsuarioPostRequestBody
import com.br.fechadura.mobile.api.request.LoginRequestBody
import com.br.fechadura.mobile.api.request.PortaRequestBody
import com.br.fechadura.mobile.api.request.UsuarioRequestBody
import com.br.fechadura.mobile.api.response.GrupoPortaPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBodyPatch
import com.br.fechadura.mobile.api.response.GrupoPortasResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuariosResponseBody
import com.br.fechadura.mobile.api.response.LoginResponseBody
......@@ -50,6 +54,10 @@ class ApiRepository: BaseRepository() {
return makeApiCall { ApiClient.apiEndpoint.getGrupoUsuarios() }
}
suspend fun postGrupoUsuario(requestBody: GrupoUsuarioPostRequestBody) : ApiState<GrupoUsuarioPostResponseBody> {
return makeApiCall { ApiClient.apiEndpoint.postGrupoUsuario(requestBody) }
}
suspend fun getGrupoUsuarioById(id: String) : ApiState<GrupoUsuarioResponseBody> {
return makeApiCall { ApiClient.apiEndpoint.getGrupoUsuarioById(id) }
}
......@@ -70,10 +78,10 @@ class ApiRepository: BaseRepository() {
return makeApiCall { ApiClient.apiEndpoint.patchPorta(id, requestBody) }
}
// Grupo de Portas
suspend fun getGrupoPortas() : ApiState<GrupoPortasResponseBody> {
return makeApiCall { ApiClient.apiEndpoint.getGrupoPortas() }
}
// // Grupo de Portas
// suspend fun getGrupoPortas() : ApiState<GrupoPortasResponseBody> {
// return makeApiCall { ApiClient.apiEndpoint.getGrupoPortas() }
// }
suspend fun postGrupoPorta(requestBody: GrupoPortaRequestBody) : ApiState<GrupoPortaPostResponseBody> {
return makeApiCall { ApiClient.apiEndpoint.postGrupoPortas(requestBody) }
......@@ -83,6 +91,10 @@ class ApiRepository: BaseRepository() {
return makeApiCall { ApiClient.apiEndpoint.getGrupoPortaById(id) }
}
suspend fun patchGrupoPorta(id: String, requestBody: GrupoPortaRequestBodyPatch) : ApiState<GrupoPortaResponseBodyPatch>{
return makeApiCall { ApiClient.apiEndpoint.patchGrupoPorta(id, requestBody) }
}
/*====================================Usado para fazer POST nas demais telas==============================================*/
// // Todos os usuários
......@@ -101,7 +113,7 @@ class ApiRepository: BaseRepository() {
}
// // Todos os usuários
// suspend fun getlAllGrupoPortas() : ApiState<GrupoPortasResponseBody> {
// return makeApiCall { ApiClient.apiEndpoint.getAllGrupoPortas() }
// }
suspend fun getlAllGrupoPortas() : ApiState<GrupoPortasResponseBody> {
return makeApiCall { ApiClient.apiEndpoint.getAllGrupoPortas() }
}
}
\ No newline at end of file
......@@ -23,7 +23,6 @@ abstract class BaseRepository {
val response: Response<T> = apiToBeCalled()
val responseBody = response.body()
println("Resposta JSON: ${responseBody?.let { Gson().toJson(it) }}")
if (response.isSuccessful) {
response.body()?.let {
......
......@@ -5,5 +5,6 @@ data class GrupoUsuario(
val nome: String,
val descricao: String,
val ativo: Boolean,
val usuarios: List<Usuario>,
val grupoPortas: List<GrupoPorta>
)
\ No newline at end of file
......@@ -7,7 +7,7 @@ data class Usuario (
val senha: String? = null,
val link_foto: String? = null,
val ativo: Boolean = false,
val grupoUsuarios: List<GrupoUsuario>? = null,
val portas: List<Porta>? = null,
val grupoUsuarios: List<Any>? = null,
val portas: List<Any>? = null,
val codigo_acesso: String? = null
)
\ No newline at end of file
package com.br.fechadura.mobile.api.request
import com.br.fechadura.mobile.api.model.Porta
data class GrupoPortaRequestBodyPatch(
var nome: String = "",
var descricao: String = "",
var ativo: Boolean = false,
var portas: List<Any>? = emptyList()
)
\ No newline at end of file
package com.br.fechadura.mobile.api.request
data class GrupoUsuarioPostRequestBody (
var nome: String = "",
var descricao: String = "",
var ativo: Boolean = true,
var usuarios: List<Any>? = emptyList(),
var grupoPortas: List<Any>? = emptyList()
)
\ No newline at end of file
package com.br.fechadura.mobile.api.response
import com.br.fechadura.mobile.api.model.Porta
data class GrupoPortaResponseBodyPatch(
var _id: String,
var nome: String,
var descricao: String,
var ativo: Boolean? = null,
var portas: List<Any>? = emptyList()
)
\ No newline at end of file
package com.br.fechadura.mobile.api.response
data class GrupoUsuarioPostResponseBody (
val _id: String,
val nome: String,
val descricao: String? = null,
val ativo: Boolean,
val usuarios: List<Any>? = emptyList(),
val grupoPortas: List<Any>? = emptyList()
)
\ No newline at end of file
package com.br.fechadura.mobile.sampledata
import com.br.fechadura.mobile.api.model.GrupoPorta
import com.br.fechadura.mobile.api.model.GrupoUsuario
import com.br.fechadura.mobile.api.model.Porta
import com.br.fechadura.mobile.api.model.Usuario
val sampleDataAmbiente = listOf(
"Bloco A",
"Bloco B",
"Bloco C",
"Bloco D",
"Garagem"
)
val sampleDataDoors = listOf(
Porta(_id = "1", descricao = "Porta A1", ambiente = "Bloco A", ativo = true),
Porta(_id = "2", descricao = "Porta A2", ambiente = "Bloco A", ativo = true),
Porta(_id = "3", descricao = "Porta A3", ambiente = "Bloco A", ativo = true),
Porta(_id = "4", descricao = "Porta A4", ambiente = "Bloco A", ativo = true),
Porta(_id = "5", descricao = "Porta A5", ambiente = "Bloco A", ativo = true),
Porta(_id = "6", descricao = "Porta B1", ambiente = "Bloco B", ativo = true),
Porta(_id = "7", descricao = "Porta B2", ambiente = "Bloco B", ativo = true),
Porta(_id = "8", descricao = "Porta B3", ambiente = "Bloco B", ativo = true),
Porta(_id = "9", descricao = "Porta B4", ambiente = "Bloco B", ativo = true),
Porta(_id = "10", descricao = "Porta B5", ambiente = "Bloco B", ativo = true),
Porta(_id = "11", descricao = "Porta C1", ambiente = "Bloco C", ativo = true),
Porta(_id = "12", descricao = "Porta C2", ambiente = "Bloco C", ativo = true),
Porta(_id = "13", descricao = "Porta C3", ambiente = "Bloco C", ativo = true),
Porta(_id = "14", descricao = "Porta C4", ambiente = "Bloco C", ativo = true),
Porta(_id = "15", descricao = "Porta C5", ambiente = "Bloco C", ativo = true),
Porta(_id = "16", descricao = "Porta D1", ambiente = "Bloco D", ativo = true),
Porta(_id = "17", descricao = "Porta D2", ambiente = "Bloco D", ativo = true),
Porta(_id = "18", descricao = "Porta D3", ambiente = "Bloco D", ativo = true),
Porta(_id = "19", descricao = "Porta D4", ambiente = "Bloco D", ativo = true),
Porta(_id = "20", descricao = "Porta D5", ambiente = "Bloco D", ativo = true),
Porta(_id = "21", descricao = "SEAN", ambiente = "Bloco D", ativo = true),
)
val sampleDataGroupDoors = listOf(
GrupoPorta(
_id = "1",
nome = "Salas de Informática",
descricao = "Todas as portas de salas de Informática",
ativo = true,
portas = sampleDataDoors.filter { it.ambiente == "Bloco A" } ),
GrupoPorta(
_id = "2",
nome = "Salas de Arquitetura e Urbanismo",
descricao = "Todas as portas das salas de Arquitetura e Urbanismo",
ativo = true,
portas = sampleDataDoors.filter { it.ambiente == "Bloco B" } ),
GrupoPorta(
_id = "3",
nome = "Salas de ADS",
descricao = "Todas as salas de ADS",
ativo = true,
portas = sampleDataDoors.filter { it.ambiente == "Bloco C" } ),
GrupoPorta(
_id = "4",
nome = "Salas de Matemática",
descricao = "Todas as salas de Matemática",
ativo = true,
portas = sampleDataDoors.filter { it.ambiente == "Bloco D" })
)
val sampleDataGroupUser = listOf(
GrupoUsuario(
_id = "1",
nome = "Alunos de Informática",
descricao = "Alunos Matutino do IFRO",
ativo = true,
grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Informática"}
),
GrupoUsuario(
_id = "2",
nome = "Salas de Arquitetura e Urbanismo",
descricao = "Alunos Noturno do IFRO",
ativo = true,
grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Arquitetura e Urbanismo"}
),
GrupoUsuario(
_id = "3",
nome = "Alunos de ADS",
descricao = "Alunos Noturno do IFRO",
ativo = true,
grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de ADS"}
),
GrupoUsuario(
_id = "4",
nome = "Alunos de Matemática",
descricao = "Alunos Noturno do IFRO",
ativo = true,
grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Matemática"}
)
)
val sampleData = listOf(
Usuario(_id = "1", nome = "Vinicius Daniel", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }) ,
Usuario(_id = "2", nome = "Guilherme", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "3", nome = "Fábio", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "4", nome = "Lucineia", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "5", nome = "Aminah", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "6", nome = "Cristopher", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "7", nome = "Mateus", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "8", nome = "Pablo", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "9", nome = "Theodoro", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "10", nome = "Alexandre", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "11", nome = "Wilgler", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "12", nome = "Gabriely", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "13", nome = "Mirelle", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "14", nome = "Luccas", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "15", nome = "Gustavo", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "16", nome = "José Junior", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
Usuario(_id = "17", nome = "Yasmin", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" })
)
\ No newline at end of file
//package com.br.fechadura.mobile.sampledata
//
//import com.br.fechadura.mobile.api.model.GrupoPorta
//import com.br.fechadura.mobile.api.model.GrupoUsuario
//import com.br.fechadura.mobile.api.model.Porta
//import com.br.fechadura.mobile.api.model.Usuario
//
//
//val sampleDataAmbiente = listOf(
// "Bloco A",
// "Bloco B",
// "Bloco C",
// "Bloco D",
// "Garagem"
//)
//val sampleDataDoors = listOf(
// Porta(_id = "1", descricao = "Porta A1", ambiente = "Bloco A", ativo = true),
// Porta(_id = "2", descricao = "Porta A2", ambiente = "Bloco A", ativo = true),
// Porta(_id = "3", descricao = "Porta A3", ambiente = "Bloco A", ativo = true),
// Porta(_id = "4", descricao = "Porta A4", ambiente = "Bloco A", ativo = true),
// Porta(_id = "5", descricao = "Porta A5", ambiente = "Bloco A", ativo = true),
// Porta(_id = "6", descricao = "Porta B1", ambiente = "Bloco B", ativo = true),
// Porta(_id = "7", descricao = "Porta B2", ambiente = "Bloco B", ativo = true),
// Porta(_id = "8", descricao = "Porta B3", ambiente = "Bloco B", ativo = true),
// Porta(_id = "9", descricao = "Porta B4", ambiente = "Bloco B", ativo = true),
// Porta(_id = "10", descricao = "Porta B5", ambiente = "Bloco B", ativo = true),
// Porta(_id = "11", descricao = "Porta C1", ambiente = "Bloco C", ativo = true),
// Porta(_id = "12", descricao = "Porta C2", ambiente = "Bloco C", ativo = true),
// Porta(_id = "13", descricao = "Porta C3", ambiente = "Bloco C", ativo = true),
// Porta(_id = "14", descricao = "Porta C4", ambiente = "Bloco C", ativo = true),
// Porta(_id = "15", descricao = "Porta C5", ambiente = "Bloco C", ativo = true),
// Porta(_id = "16", descricao = "Porta D1", ambiente = "Bloco D", ativo = true),
// Porta(_id = "17", descricao = "Porta D2", ambiente = "Bloco D", ativo = true),
// Porta(_id = "18", descricao = "Porta D3", ambiente = "Bloco D", ativo = true),
// Porta(_id = "19", descricao = "Porta D4", ambiente = "Bloco D", ativo = true),
// Porta(_id = "20", descricao = "Porta D5", ambiente = "Bloco D", ativo = true),
// Porta(_id = "21", descricao = "SEAN", ambiente = "Bloco D", ativo = true),
//)
//
//val sampleDataGroupDoors = listOf(
// GrupoPorta(
// _id = "1",
// nome = "Salas de Informática",
// descricao = "Todas as portas de salas de Informática",
// ativo = true,
// portas = sampleDataDoors.filter { it.ambiente == "Bloco A" } ),
// GrupoPorta(
// _id = "2",
// nome = "Salas de Arquitetura e Urbanismo",
// descricao = "Todas as portas das salas de Arquitetura e Urbanismo",
// ativo = true,
// portas = sampleDataDoors.filter { it.ambiente == "Bloco B" } ),
// GrupoPorta(
// _id = "3",
// nome = "Salas de ADS",
// descricao = "Todas as salas de ADS",
// ativo = true,
// portas = sampleDataDoors.filter { it.ambiente == "Bloco C" } ),
// GrupoPorta(
// _id = "4",
// nome = "Salas de Matemática",
// descricao = "Todas as salas de Matemática",
// ativo = true,
// portas = sampleDataDoors.filter { it.ambiente == "Bloco D" })
//)
//
//val sampleDataGroupUser = listOf(
// GrupoUsuario(
// _id = "1",
// nome = "Alunos de Informática",
// descricao = "Alunos Matutino do IFRO",
// ativo = true,
// grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Informática"}
// ),
// GrupoUsuario(
// _id = "2",
// nome = "Salas de Arquitetura e Urbanismo",
// descricao = "Alunos Noturno do IFRO",
// ativo = true,
// grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Arquitetura e Urbanismo"}
// ),
// GrupoUsuario(
// _id = "3",
// nome = "Alunos de ADS",
// descricao = "Alunos Noturno do IFRO",
// ativo = true,
// grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de ADS"}
// ),
// GrupoUsuario(
// _id = "4",
// nome = "Alunos de Matemática",
// descricao = "Alunos Noturno do IFRO",
// ativo = true,
// grupoPortas = sampleDataGroupDoors.filter { it.nome == "Salas de Matemática"}
// )
//)
//
//val sampleData = listOf(
// Usuario(_id = "1", nome = "Vinicius Daniel", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }) ,
// Usuario(_id = "2", nome = "Guilherme", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "3", nome = "Fábio", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "4", nome = "Lucineia", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "5", nome = "Aminah", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "6", nome = "Cristopher", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "7", nome = "Mateus", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "8", nome = "Pablo", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "9", nome = "Theodoro", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "10", nome = "Alexandre", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "11", nome = "Wilgler", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "12", nome = "Gabriely", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "13", nome = "Mirelle", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "14", nome = "Luccas", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "15", nome = "Gustavo", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "16", nome = "José Junior", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" }),
// Usuario(_id = "17", nome = "Yasmin", email = "teste@example.com", ativo = true, grupoUsuarios = sampleDataGroupUser.filter { it.nome == "Alunos de Informática" })
//)
\ No newline at end of file
......@@ -58,10 +58,24 @@ fun BottomBarNavigation() {
LaunchedEffect(navController) {
navController.addOnDestinationChangedListener { _, destination, _ ->
showBottomBar =
destination.route != "login" &&
destination.route != "carregamento" &&
destination.route != "visualizar-porta/{id}" &&
destination.route != "visualizar-usuario/{id}"
destination.route != "login" &&
destination.route != "carregamento" &&
destination.route != "visualizar-usuario/{id}" &&
destination.route != "cadastrar-usuario" &&
destination.route != "editar-usuario/{id}" &&
destination.route != "visualizar-porta/{id}" &&
destination.route != "cadastrar-porta" &&
destination.route != "editar-porta/{id}" &&
destination.route != "visualizar-grupo-usuario/{id}" &&
destination.route != "cadastrar-grupo-usuario" &&
destination.route != "editar-grupo-usuario/{id}" &&
destination.route != "visualizar-grupo-porta/{id}" &&
destination.route != "cadastrar-grupo-porta" &&
destination.route != "editar-grupo-porta/{id}"
}
}
......
package com.br.fechadura.mobile.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun <T> ModalBottomSheetDados(
title: String,
searchLabel: String,
itemList: List<T>,
selectedItems: List<String>,
onSelectItem: (String) -> Unit,
onRemoveItem: (String) -> Unit,
onDismissRequest: () -> Unit,
IdItem: (T) -> String,
itemLabel: (T) -> String,
itemDescription: (T) -> String? = { null }
) {
val sheetState = rememberModalBottomSheetState()
val scope = rememberCoroutineScope()
var searchText by remember { mutableStateOf(searchLabel) }
ModalBottomSheet(
containerColor = Color.White,
onDismissRequest = onDismissRequest,
sheetState = sheetState
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Text(
text = title,
fontSize = 16.sp,
style = MaterialTheme.typography.titleLarge,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center)
)
OutlinedTextField(
value = searchText,
onValueChange = { searchText = it },
label = { Text(text = "Pesquisar") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
if (selectedItems.isNotEmpty()) {
LazyRow(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(horizontal = 8.dp)
) {
items(selectedItems) { itemId ->
val item = itemList.find { IdItem(it) == itemId }
item?.let {
SelectedItem(
label = itemLabel(it),
onRemove = { onRemoveItem(itemId) }
)
}
}
}
}
Spacer(modifier = Modifier.height(8.dp))
val filteredItems = itemList.filter {
itemLabel(it).contains(searchText, ignoreCase = true)
}.filterNot { selectedItems.contains(IdItem(it)) }
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = Modifier.fillMaxSize()
) {
items(filteredItems) { item ->
Column(
modifier = Modifier
.fillMaxWidth()
.clickable {
val itemId = IdItem(item)
if (selectedItems.contains(itemId)) {
onRemoveItem(itemId)
} else {
onSelectItem(itemId)
}
}
.padding(vertical = 8.dp)
.background(
if (selectedItems.contains(itemLabel(item)))
Color(0x1F4CAF50)
else Color.Transparent
)
) {
Column {
Text(
text = itemLabel(item),
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
style = MaterialTheme.typography.bodyLarge
)
itemDescription(item)?.let {
Text(
text = it,
modifier = Modifier
.fillMaxWidth()
.padding(start = 16.dp)
.padding(top = 4.dp),
style = MaterialTheme.typography.bodyMedium,
color = Color.Gray
)
}
}
}
}
}
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
scope.launch { sheetState.hide() }.invokeOnCompletion {
if (!sheetState.isVisible) {
onDismissRequest()
}
}
}) {
Text(text = "Confirmar")
}
}
}
}
@Composable
fun SelectedItem(label: String, onRemove: () -> Unit) {
Surface(
modifier = Modifier.padding(4.dp),
color = Color(0xFF4CAF50).copy(alpha = 0.1f),
shape = MaterialTheme.shapes.small,
onClick = onRemove
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(8.dp)
) {
Text(
text = label,
color = Color(0xFF4CAF50),
style = MaterialTheme.typography.bodyMedium
)
Spacer(modifier = Modifier.width(4.dp))
IconButton(onClick = onRemove) {
Icon(
imageVector = Icons.Default.Close,
contentDescription = "Remover item",
tint = Color(0xFF4CAF50)
)
}
}
}
}
......@@ -28,7 +28,7 @@ import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.br.fechadura.mobile.R
import com.br.fechadura.mobile.api.model.GrupoPorta
import com.br.fechadura.mobile.sampledata.sampleDataDoors
@Composable
......@@ -94,8 +94,8 @@ fun TabelaGrupoPorta(grupoPorta: GrupoPorta, navController: NavController) {
}
}
@Preview
@Composable
private fun TabelaGrupoPortaPreview() {
TabelaGrupoPorta(grupoPorta = GrupoPorta(_id = "1", nome = "Salas de Informática", descricao = "Todas as portas de salas de Informática", ativo = true, portas = sampleDataDoors.filter { it.ambiente == "Bloco A" } ), navController = rememberNavController())
}
//@Preview
//@Composable
//private fun TabelaGrupoPortaPreview() {
// TabelaGrupoPorta(grupoPorta = GrupoPorta(_id = "1", nome = "Salas de Informática", descricao = "Todas as portas de salas de Informática", ativo = true, portas = sampleDataDoors.filter { it.ambiente == "Bloco A" } ), navController = rememberNavController())
//}
package com.br.fechadura.mobile.ui.screens
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
......@@ -36,7 +38,7 @@ fun InicioScreen(navController: NavController) {
.padding(innerPadding)
) {
Column(
modifier = Modifier.fillMaxSize() ,
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.SpaceBetween ,
horizontalAlignment = Alignment.CenterHorizontally
) {
......
package com.br.fechadura.mobile.ui.screens
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
import com.br.fechadura.mobile.ui.theme.FechaduraColor
import org.w3c.dom.Text
@Composable
fun TextFieldValidation(
label: String,
value: MutableState<String>,
errorValue: MutableState<String>
) {
fun valueValidation(
value: MutableState<String>,
errorValue: MutableState<String>
): Boolean {
return if (value.value.isNullOrBlank()) {
errorValue.value = "Campo obrigatório"
false
} else {
errorValue.value = ""
true
}
}
OutlinedTextField(
value = value.value,
onValueChange = { novoValue ->
value.value = novoValue
valueValidation(value, errorValue) // Valida quando o valor muda
},
label = {
Text(
label,
color = FechaduraColor,
fontSize = 13.sp
)
},
modifier = Modifier.fillMaxWidth(),
textStyle = TextStyle(color = Color.Black),
singleLine = true,
supportingText = {},
isError = errorValue.value.isNotEmpty(), // `isError` é verdadeiro quando há uma mensagem de erro
)
if (errorValue.value.isNotEmpty()) {
Text(
text = errorValue.value,
color = Color.Red,
fontSize = 12.sp
)
}
}
@Preview(showSystemUi = true)
@Composable
private fun Preview() {
val textState = remember { mutableStateOf("") }
val errorState = remember { mutableStateOf("") }
TextFieldValidation(
label = "Descrição",
value = textState,
errorValue = errorState
)
}
\ No newline at end of file
......@@ -26,6 +26,7 @@ import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import com.br.fechadura.mobile.ui.components.CaixaLoading
import com.br.fechadura.mobile.ui.components.ModalBottomSheetDados
import com.br.fechadura.mobile.ui.screens.LoadingScreen
import com.br.fechadura.mobile.ui.theme.FechaduraColor
import com.br.fechadura.mobile.ui.theme.onPrimaryLight
......@@ -276,205 +277,36 @@ fun CadastrarGrupoPorta(
}
}
// Portas
if (showBottomSheetPortas) {
ModalBottomSheet(
containerColor = Color.White,
onDismissRequest = { showBottomSheetPortas = false },
sheetState = sheetState
) {
when (portasState) {
is ApiState.Error -> {
// Exibir uma mensagem de erro ou uma tela de falha
Text("Erro ao carregar as portas.")
}
is ApiState.Created -> {}
is ApiState.Loading -> {
// Exibir uma tela de carregamento
LoadingScreen()
}
is ApiState.Success -> {
portasState.data?.let { responseData ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Text(
text = "Portas",
fontSize = 16.sp,
style = MaterialTheme.typography.titleLarge,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center),
)
OutlinedTextField(
value = searchQueryPortas,
onValueChange = { searchQueryPortas = it },
label = { Text(text = "Pesquisar portas") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
if (selectedPortas.isNotEmpty()) {
LazyRow(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(horizontal = 8.dp)
) {
items(selectedPortas.toList()) { portaId ->
val porta = responseData.data.find { it._id == portaId }
porta?.let {
Surface(
modifier = Modifier.padding(4.dp),
color = Color(0xFF4CAF50).copy(alpha = 0.1f),
shape = MaterialTheme.shapes.small,
onClick = {
val updatedSelection = selectedPortas - portaId
selectedPortas = updatedSelection
selectedTextPortas =
if (selectedPortas.isEmpty()) {
"Selecione as portas"
} else {
// Atualizar o texto para mostrar as descrições
selectedPortas
.mapNotNull { id -> responseData.data.find { it._id == id }?.descricao }
.joinToString(", ")
}
}
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(8.dp)
) {
Text(
text = porta.descricao,
color = Color(0xFF4CAF50),
style = MaterialTheme.typography.bodyMedium
)
Spacer(modifier = Modifier.width(4.dp))
IconButton(onClick = {
val updatedSelection =
selectedPortas - portaId
selectedPortas = updatedSelection
selectedTextPortas =
if (selectedPortas.isEmpty()) {
"Selecione as portas"
} else {
// Atualizar o texto para mostrar as descrições
selectedPortas
.mapNotNull { id -> responseData.data.find { it._id == id }?.descricao }
.joinToString(", ")
}
}) {
Icon(
imageVector = Icons.Default.Close,
contentDescription = "Remover porta",
tint = Color(0xFF4CAF50)
)
}
}
}
}
}
}
}
Spacer(modifier = Modifier.height(8.dp))
val filteredPortas = responseData.data
.filter {
it.descricao.contains(searchQueryPortas, ignoreCase = true)
}
.filterNot { it._id in selectedPortas }
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = Modifier.fillMaxSize()
) {
items(filteredPortas) { porta ->
Column(
modifier = Modifier
.fillMaxWidth()
.clickable {
val updatedSelection =
if (selectedPortas.contains(porta._id)) {
selectedPortas - porta._id
} else {
selectedPortas + porta._id
}
selectedPortas = updatedSelection
selectedTextPortas = if (selectedPortas.isEmpty()) {
"Selecione as portas"
} else {
// Atualizar o texto para mostrar as descrições
selectedPortas
.mapNotNull { id -> responseData.data.find { it._id == id }?.descricao }
.joinToString(", ")
}
}
.padding(vertical = 8.dp)
.background(
if (selectedPortas.contains(porta._id))
Color(0x1F4CAF50)
else Color.Transparent
)
) {
Column {
Text(
text = porta.descricao,
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
style = MaterialTheme.typography.bodyLarge
)
Text(
text = porta.ambiente ?: "",
modifier = Modifier
.fillMaxWidth()
.padding(start = 16.dp)
.padding(top = 4.dp),
style = MaterialTheme.typography.bodyMedium,
color = Color.Gray
)
}
}
}
}
if(showBottomSheetPortas) {
when (portasState) {
is ApiState.Error -> {
// Exibir uma mensagem de erro ou uma tela de falha
Text("Erro ao carregar as portas.")
}
Spacer(modifier = Modifier.height(16.dp))
is ApiState.Created -> {}
is ApiState.Loading -> {
// Exibir uma tela de carregamento
LoadingScreen()
}
Button(onClick = {
// Atualizar a descrição no TextField ao fechar o BottomSheet
selectedTextPortas = selectedPortas
.mapNotNull { id -> responseData.data.find { it._id == id }?.descricao }
.joinToString(", ")
scope.launch { sheetState.hide() }.invokeOnCompletion {
if (!sheetState.isVisible) {
showBottomSheetPortas = false
}
}
}) {
Text(text = "Confirmar")
}
}
}
is ApiState.Success -> {
portasState.data?.let { responseData ->
ModalBottomSheetDados(
title = "Portas",
searchLabel = searchQueryPortas,
itemList = responseData.data,
selectedItems = selectedPortas.map { it.toString() },
onSelectItem = { selectedPortas += it },
onRemoveItem = { selectedPortas -= it },
onDismissRequest = { showBottomSheetPortas = false },
itemLabel = { it.descricao },
IdItem = {it._id},
itemDescription = { it.ambiente }
)
}
}
}
if (postState is ApiState.Loading) {
CaixaLoading()
}
LaunchedEffect(Unit) {
portaViewModel.getAllPortas()
}
}
}
......
......@@ -39,7 +39,7 @@ fun GrupoPortaScreen(
var text by remember { mutableStateOf("") }
val grupoPortaViewModel: GrupoPortasViewModel = viewModel()
val grupoState by grupoPortaViewModel.grupoPortasResponseBody
val grupoState by grupoPortaViewModel.allGrupoPortaResponseBody
Scaffold(
topBar = {
......@@ -133,7 +133,7 @@ fun GrupoPortaScreen(
) {
Text(text = grupo.nome, color = Color.Black)
Text(text = if (grupo.nome.length > 25) "${grupo.nome.take(25)}..." else grupo.nome, color = Color.Black)
Text(
text = if (grupo.ativo) "Ativo" else "Não Ativo",
fontSize = 12.sp,
......@@ -158,6 +158,6 @@ fun GrupoPortaScreen(
// Carregamento inicial
LaunchedEffect(Unit) {
grupoPortaViewModel.getGrupoPortas()
grupoPortaViewModel.getAllGrupoPortas()
}
}
......@@ -132,7 +132,7 @@ fun GrupoUsuarioScreen(
.padding(20.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(text = grupo.nome, color = Color.Black)
Text(text = if (grupo.nome.length > 25) "${grupo.nome.take(25)}..." else grupo.nome, color = Color.Black)
Text(
text = if (grupo.ativo) "Ativo" else "Não Ativo",
fontSize = 12.sp,
......
......@@ -34,6 +34,7 @@ import com.br.fechadura.mobile.ui.theme.primaryLight
import com.br.fechadura.mobile.ui.theme.secondaryLight
import androidx.compose.material.ExposedDropdownMenuBox
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.ui.focus.onFocusChanged
import androidx.datastore.preferences.protobuf.Api
import androidx.lifecycle.viewmodel.compose.viewModel
import com.br.fechadura.mobile.ui.components.CaixaLoading
......@@ -49,6 +50,9 @@ fun CadastrarPorta(
var descricao by remember { mutableStateOf("") }
var ativo by remember { mutableStateOf(false) }
var erroDescricao: String? by remember { mutableStateOf(null) }
var erroAmbiente: String? by remember { mutableStateOf(null) }
// Lista de ambientes para o dropdown
val sampleDataAmbientes = listOf("Bloco A", "Bloco B", "Bloco C", "Bloco D")
var expanded by remember { mutableStateOf(false) }
......@@ -59,6 +63,21 @@ fun CadastrarPorta(
val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
fun descricaoValida(): Boolean {
if (descricao.isNullOrBlank()) {
erroDescricao = "Informe a descrição"
} else {
erroDescricao = null
}
return !descricao.isNullOrBlank()
}
fun ambienteValido(): Boolean {
return true
}
Scaffold(
snackbarHost = { SnackbarHost(hostState = snackbarHostState)},
topBar = {
......@@ -111,12 +130,20 @@ fun CadastrarPorta(
)
},
modifier = Modifier
.fillMaxWidth(),
.fillMaxWidth()
.onFocusChanged {
descricaoValida()
},
textStyle = TextStyle(color = Color.Black),
singleLine = true,
isError = portaState is ApiState.Error
supportingText = {
erroDescricao?.let { errorText ->
Text(text = errorText)
}
},
isError = !erroDescricao.isNullOrBlank(),
)
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = !expanded }
......@@ -195,11 +222,13 @@ fun CadastrarPorta(
}
Button(
onClick = {
cadastrarPortaViewModel.cadastrarPorta(
descricao,
selectedAmbiente,
ativo
)
if (descricaoValida()) {
cadastrarPortaViewModel.cadastrarPorta(
descricao,
selectedAmbiente,
ativo
)
}
},
Modifier
.fillMaxWidth()
......
package com.br.fechadura.mobile.ui.screens.portas
import android.health.connect.datatypes.units.Length
import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
......@@ -17,6 +19,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.TextStyle
......@@ -58,9 +61,19 @@ fun EditarPorta(
var expanded by remember { mutableStateOf(false) }
var ativo by remember { mutableStateOf(false) }
val context = LocalContext.current
// Lista de ambientes para o dropdown
val sampleDataAmbientes = listOf("Bloco A", "Bloco B", "Bloco C", "Bloco D")
fun descricaoValida(): Boolean {
return true
}
fun ambienteValido(): Boolean {
return true
}
Scaffold(
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
topBar = {
......@@ -226,13 +239,15 @@ fun EditarPorta(
is ApiState.Loading -> {}
is ApiState.Success -> {
portaEditaState.data?.let { responseData ->
scope.launch {
snackbarHostState
.showSnackbar(
message = "Porta atualizada com sucesso",
duration = SnackbarDuration.Short
)
}
Toast.makeText(context, "Porta atualizada com sucesso", Toast.LENGTH_LONG).show()
// scope.launch {
// snackbarHostState
// .showSnackbar(
// message = "Porta atualizada com sucesso",
// duration = SnackbarDuration.Short
// )
// }
navController.popBackStack()
}
}
......
......@@ -133,7 +133,7 @@ fun PortaScreen(
horizontalArrangement = Arrangement.SpaceBetween
) {
Column() {
Text(text = porta.descricao, color = Color.Black)
Text(text = if (porta.descricao.length > 25) "${porta.descricao.take(25)}..." else porta.descricao, color = Color.Black)
Text(text = porta.ambiente, color = outlineLight, fontSize = 13.sp)
}
Text(
......
......@@ -6,8 +6,10 @@ import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBody
import com.br.fechadura.mobile.api.request.GrupoPortaRequestBodyPatch
import com.br.fechadura.mobile.api.response.GrupoPortaPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBody
import com.br.fechadura.mobile.api.response.GrupoPortaResponseBodyPatch
import com.br.fechadura.mobile.api.response.GrupoPortasResponseBody
import com.br.fechadura.mobile.api.response.UsuarioPostResponseBody
import com.br.vini.compose.api.ApiRepository
......@@ -22,12 +24,12 @@ class GrupoPortasViewModel(
private val _grupoPortasResponseBody = mutableStateOf<ApiState<GrupoPortasResponseBody>>(ApiState.Created())
val grupoPortasResponseBody : State<ApiState<GrupoPortasResponseBody>> = _grupoPortasResponseBody
fun getGrupoPortas() {
viewModelScope.launch {
_grupoPortasResponseBody.value = ApiState.Loading()
_grupoPortasResponseBody.value = apiRepository.getGrupoPortas()
}
}
// fun getGrupoPortas() {
// viewModelScope.launch {
// _grupoPortasResponseBody.value = ApiState.Loading()
// _grupoPortasResponseBody.value = apiRepository.getGrupoPortas()
// }
// }
private val _grupoPortaResponseBody = mutableStateOf<ApiState<GrupoPortaResponseBody>>(ApiState.Created())
val grupoPortaResponseBody : State<ApiState<GrupoPortaResponseBody>> = _grupoPortaResponseBody
......@@ -39,6 +41,17 @@ class GrupoPortasViewModel(
}
}
private val _allGrupoPortaResponseBody = mutableStateOf<ApiState<GrupoPortasResponseBody>>(ApiState.Created())
val allGrupoPortaResponseBody : State<ApiState<GrupoPortasResponseBody>> = _allGrupoPortaResponseBody
fun getAllGrupoPortas() {
viewModelScope.launch {
_allGrupoPortaResponseBody.value = ApiState.Loading()
_allGrupoPortaResponseBody.value = apiRepository.getlAllGrupoPortas()
}
}
private val _cadastrarGrupoPorta = mutableStateOf<ApiState<GrupoPortaPostResponseBody>>(ApiState.Created())
val cadastrarGrupoPorta: State<ApiState<GrupoPortaPostResponseBody>> = _cadastrarGrupoPorta
......@@ -70,4 +83,21 @@ class GrupoPortasViewModel(
_cadastrarGrupoPorta.value = apiRepository.postGrupoPorta(requestBody)
}
}
private val _editarGrupoPorta = mutableStateOf<ApiState<GrupoPortaResponseBodyPatch>>(ApiState.Created())
val editarGrupoPorta: State<ApiState<GrupoPortaResponseBodyPatch>> = _editarGrupoPorta
fun patchGrupoPorta(id: String, patch: GrupoPortaRequestBodyPatch) {
viewModelScope.launch {
_editarGrupoPorta.value = ApiState.Loading()
_editarGrupoPorta.value = apiRepository.patchGrupoPorta(id, patch)
}
}
fun clearApiState() {
_grupoPortaResponseBody.value = ApiState.Created()
_editarGrupoPorta.value = ApiState.Created()
}
}
\ No newline at end of file
......@@ -3,8 +3,12 @@ package com.br.fechadura.mobile.viewModel
import android.app.Application
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.datastore.preferences.protobuf.Api
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.br.fechadura.mobile.api.request.GrupoUsuarioPostRequestBody
import com.br.fechadura.mobile.api.request.UsuarioRequestBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioPostResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuarioResponseBody
import com.br.fechadura.mobile.api.response.GrupoUsuariosResponseBody
import com.br.vini.compose.api.ApiRepository
......@@ -45,4 +49,29 @@ class GrupoUsuariosViewModel(
_grupoUsuarioResponse.value = apiRepository.getGrupoUsuarioById(id)
}
}
private val _cadastrarGrupoUsuario = mutableStateOf<ApiState<GrupoUsuarioPostResponseBody>>(ApiState.Created())
val cadastrarGrupoUsuario: State<ApiState<GrupoUsuarioPostResponseBody>> = _cadastrarGrupoUsuario
fun postGrupoUsuario(
nome: String,
descricao: String,
ativo: Boolean = true,
usuarios: List<Any> = emptyList(),
grupoPortas: List<Any> = emptyList()
) {
val requestBody = GrupoUsuarioPostRequestBody()
requestBody.nome = nome
requestBody.descricao = descricao
requestBody.ativo = ativo
requestBody.usuarios = usuarios
requestBody.grupoPortas = grupoPortas
viewModelScope.launch {
_cadastrarGrupoUsuario.value = ApiState.Loading()
_cadastrarGrupoUsuario.value = apiRepository.postGrupoUsuario(requestBody)
}
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment