Skip to content

Commit

Permalink
Merge pull request #27 from indigotech/feature/components
Browse files Browse the repository at this point in the history
Feature/components
  • Loading branch information
VituHonda authored Sep 18, 2024
2 parents 2582bae + ad684be commit 145259d
Show file tree
Hide file tree
Showing 11 changed files with 134 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ data class NewUserRequest(
val birthDate: String,
val password: String,
val role: Roles
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ class UserRepository private constructor() {
suspend fun newUser(newUserRequest: NewUserRequest) {
try {
UserRetrofitService.userRetrofitService.newUser(token, newUserRequest)
} catch (e: IOException) {
throw Exception("Erro de rede ao cadastrar usuário: ${e.message}")
} catch (e: HttpException) {
throw Exception("Erro ao cadastrar usuário: ${e.message()}")
} catch (e: Exception) {
throw Exception("Erro desconhecido ao cadastrar usuário: ${e.message}")
}
Expand Down
26 changes: 7 additions & 19 deletions app/src/main/java/com/example/greetingcard/view/LoginScreen.kt
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
package com.example.greetingcard.view

import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import com.example.greetingcard.view.component.ButtonDefault
import com.example.greetingcard.view.component.InputFields
import com.example.greetingcard.view.component.ShowErrors
import com.example.greetingcard.view.component.TitleH1
import com.example.greetingcard.viewModel.LoginViewModel

@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun LoginScreen(navController: NavHostController) {
val viewModel: LoginViewModel = viewModel()
Expand All @@ -33,7 +34,7 @@ fun LoginScreen(navController: NavHostController) {
.padding(innerPadding)
) {
Spacer(modifier = Modifier.height(24.dp))
Title()
H1(title = "Bem vindo(a) à Taqtile!")
Spacer(modifier = Modifier.height(48.dp))
InputFields(
viewModel.emailState,
Expand All @@ -53,7 +54,7 @@ fun LoginScreen(navController: NavHostController) {
ShowErrors(viewModel.passwordErrorMessages)
Spacer(modifier = Modifier.height(36.dp))
if (!viewModel.isLoading) {
LoginButton(onClick = {
ButtonDefault("Entrar", onClick = {
viewModel.validateAndSetEmailErrors()
viewModel.validateAndSetPasswordErrors()
if (viewModel.emailErrorMessages.isEmpty() && viewModel.passwordErrorMessages.isEmpty()) {
Expand All @@ -75,16 +76,3 @@ fun LoginScreen(navController: NavHostController) {
}
}

@Composable
private fun Title() {
Text(
fontWeight = FontWeight.Bold, fontSize = 24.sp, text = "Bem vindo(a) à Taqtile!"
)
}

@Composable
private fun LoginButton(onClick: () -> Unit) {
Button(onClick = onClick, modifier = Modifier.fillMaxWidth()) {
Text(fontSize = 20.sp, text = "Entrar")
}
}
20 changes: 7 additions & 13 deletions app/src/main/java/com/example/greetingcard/view/NewUserScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Button
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import com.example.greetingcard.model.Roles
import com.example.greetingcard.view.component.ButtonDefault
import com.example.greetingcard.view.component.InputFields
import com.example.greetingcard.view.component.ShowErrors
import com.example.greetingcard.view.component.TitleH1
import com.example.greetingcard.viewModel.NewUserViewModel

@RequiresApi(Build.VERSION_CODES.O)
Expand All @@ -57,7 +57,7 @@ private fun NewUserForm(navController: NavHostController) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(fontWeight = FontWeight.Bold, fontSize = 24.sp, text = "Novo usuário")
TitleH1(title = "Novo usuário")
Spacer(modifier = Modifier.height(12.dp))
InputFields(
viewModel.nameState,
Expand Down Expand Up @@ -107,27 +107,21 @@ private fun NewUserForm(navController: NavHostController) {
ShowErrors(viewModel.roleErrorMessages)
Spacer(modifier = Modifier.height(12.dp))

Button(
ButtonDefault(
buttonText = "Cadastrar",
onClick = {
viewModel.validateAndSetAllErrors()
viewModel.addNewUser()

Toast.makeText(context, viewModel.birthDateLocalDate.toString() ,Toast.LENGTH_LONG).show()

if(viewModel.noErrors()) {
viewModel.addNewUser()
navController.navigate("UserListScreen")
Toast.makeText(context, "Sucesso ao Cadastrar usuário" ,Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context, "Erro ao Cadastrar usuário}" ,Toast.LENGTH_LONG).show()
}

},
modifier = Modifier
.fillMaxWidth(0.7f)

) {
Text(text = "Cadastrar")
}
)
ShowErrors(viewModel.addNewUserErrorMessages)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.example.greetingcard.view.component

import androidx.compose.foundation.layout.height
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

@Composable
fun ButtonDefault(buttonText: String, onClick: () -> Unit) {
Button(
onClick = onClick,
modifier = Modifier.height(44.dp),
colors = ButtonDefaults.buttonColors(Color.LightGray)
) {
ButtonText(buttonText)
}
}

@Composable
private fun ButtonText(buttonText: String) {
Text(
text = buttonText,
fontWeight = FontWeight.Normal,
color = Color.Black
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.example.greetingcard.view.component

import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
Expand All @@ -11,11 +13,14 @@ import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.greetingcard.viewModel.NewUserViewModel

Expand All @@ -33,7 +38,7 @@ fun InputFields(
) {
Column() {
val viewModel: NewUserViewModel = viewModel()
Text(text = title)
InputLabel(title = title)
OutlinedTextField(
value = value,
onValueChange = { newValue ->
Expand All @@ -43,7 +48,7 @@ fun InputFields(
},
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp),
.border(1.dp, Color(0xFF777777), RoundedCornerShape(16.dp)),
keyboardOptions = KeyboardOptions(
keyboardType = type
),
Expand All @@ -52,7 +57,22 @@ fun InputFields(
isPassword -> PasswordVisualTransformation()
isDateField -> viewModel.dateVisualTransformation()
else -> VisualTransformation.None
}
},
)
}
}

@Composable
private fun InputLabel(title: String) {
Box(
modifier = Modifier
.padding(bottom = 12.dp)
) {
Text(
text = title,
fontSize = 12.sp,
fontWeight = FontWeight.Normal,
color = Color(0xFF777777)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

@Composable
fun ShowErrors(errorMessages: List<String>) {
Expand All @@ -14,6 +16,8 @@ fun ShowErrors(errorMessages: List<String>) {
Text(
text = error,
color = Color.Red,
fontSize = 12.sp,
fontWeight = FontWeight.Normal,
modifier = Modifier.padding(bottom = 8.dp)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.greetingcard.view.component

import android.print.PrintAttributes
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

@Composable
fun TitleH1(title: String) {
Box(
modifier = Modifier
.padding(top = 20.dp, bottom = 20.dp)
) {
Text(
text = title,
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
color = Color.Black
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class NewUserViewModel : ViewModel() {
var emailState by mutableStateOf("")
var phoneState by mutableStateOf("")
var birthDateState by mutableStateOf("")
var birthDateFormatted by mutableStateOf("")
var passwordState by mutableStateOf("")
var roleState by mutableStateOf<Roles?>(null)

Expand All @@ -42,7 +43,6 @@ class NewUserViewModel : ViewModel() {
var passwordErrorMessages by mutableStateOf(listOf<String>())
var roleErrorMessages by mutableStateOf(listOf<String>())
var addNewUserErrorMessages by mutableStateOf(listOf<String>())
var birthDateLocalDate by mutableStateOf<LocalDate?>(null)

var isLoading by mutableStateOf(false)

Expand Down Expand Up @@ -131,19 +131,32 @@ class NewUserViewModel : ViewModel() {

private fun validateAndSetBirthDateErrors() {


val day = birthDateState.substring(0, 2).toInt()
val month = birthDateState.substring(2, 4).toInt()
val year = birthDateState.substring(4, 8).toInt()

val date = LocalDate.of(year,month,day)

val errors = mutableListOf<String>()

if (!date.isBefore(LocalDate.now())) {
errors.add("A data deve ser uma data passada.")
if (birthDateState.length != 8) {
errors.add("A data deve estar no formato dd/MM/yyyy.")
} else {
birthDateLocalDate = date
val day = birthDateState.substring(0, 2).toIntOrNull()
val month = birthDateState.substring(2, 4).toIntOrNull()
val year = birthDateState.substring(4, 8).toIntOrNull()

if (day == null || month == null || year == null) {
errors.add("A data contém valores inválidos.")
} else {
val date = try {
LocalDate.of(year, month, day)
} catch (e: DateTimeException) {
null
}

if (date == null) {
errors.add("Data inválida.")
} else if (!date.isBefore(LocalDate.now())) {
errors.add("A data deve estar no passado.")
} else {
birthDateFormatted = date.toString()
}
}
}

birthDateErrorMessages = errors
Expand All @@ -167,7 +180,7 @@ class NewUserViewModel : ViewModel() {
phone = phoneState,
password = passwordState,
role = Roles.USER,
birthDate = birthDateLocalDate.toString()
birthDate = "1999-03-03"
)

viewModelScope.launch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ class UserListViewModel : ViewModel() {

private val userRepository = UserRepository.getInstance()

init {
loadUsers()
}

var isLoading by mutableStateOf(false)
var userList = MutableStateFlow<PagingData<ListUserItem>>(PagingData.empty())
var loadErrorMessages by mutableStateOf(listOf<String>())
Expand Down

0 comments on commit 145259d

Please sign in to comment.