diff --git a/app/src/main/java/ru/myitschool/work/ui/Composables.kt b/app/src/main/java/ru/myitschool/work/ui/Composables.kt new file mode 100644 index 0000000..8f01abc --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/Composables.kt @@ -0,0 +1,155 @@ +package ru.myitschool.work.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import ru.myitschool.work.R +import ru.myitschool.work.ui.theme.Gray +import ru.myitschool.work.ui.theme.Typography + +@Composable +fun BaseText24( + text: String, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified, + textAlign: TextAlign = TextAlign.Left +) { + Text( + text = text, + fontSize = 24.sp, + style = _root_ide_package_.ru.myitschool.work.ui.theme.Typography.bodyLarge, + modifier = modifier, + color = color, + textAlign = textAlign + ) +} + +@Composable +fun Logo() { + Image( + painter = painterResource(R.drawable.logo), + contentDescription = "Logo", + modifier = Modifier.padding(top = 40.dp, bottom = 60.dp) + ) +} + +@Composable +fun BaseText16( + text: String, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified +) { + Text( + text = text, + style = _root_ide_package_.ru.myitschool.work.ui.theme.Typography.bodySmall, + fontSize = 16.sp, + color = color, + modifier = modifier + ) +} + +@Composable +fun BaseText12( + modifier: Modifier = Modifier, + text: String, + color: Color = Color.Unspecified, +) { + Text( + text = text, + style = _root_ide_package_.ru.myitschool.work.ui.theme.Typography.bodySmall, + fontSize = 12.sp, + color = color, + modifier = modifier, + ) +} + +@Composable +fun BaseInputText( + placeholder: String= "", + modifier: Modifier = Modifier +) { + + var textState by remember { mutableStateOf("") } + + TextField( + value = textState, + onValueChange = { + textState = it + }, + shape = RoundedCornerShape(16.dp), + placeholder = { + _root_ide_package_.ru.myitschool.work.ui.BaseText16( + text = placeholder, + color = _root_ide_package_.ru.myitschool.work.ui.theme.Gray + ) + }, + textStyle = _root_ide_package_.ru.myitschool.work.ui.theme.Typography.bodySmall.copy(fontSize = 16.sp), + colors = TextFieldDefaults.colors( + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent + ), + singleLine = true, + modifier = modifier + ) +} + +@Composable +fun BaseText20( + text: String, + color: Color = Color.Unspecified, + style: TextStyle = _root_ide_package_.ru.myitschool.work.ui.theme.Typography.bodySmall, +) { + Text( + text = text, + style = style, + fontSize = 20.sp, + modifier = Modifier.padding(7.dp), + color = color + ) +} + +@Composable +fun BaseButton( + text: String, + btnColor: Color, + btnContentColor: Color, + onClick: () -> Unit, + icon: @Composable RowScope.() -> Unit = {}, + modifier: Modifier = Modifier.fillMaxWidth() +) { + Button( + onClick = onClick, + colors = ButtonDefaults.buttonColors( + containerColor = btnColor, + contentColor = btnContentColor, + disabledContainerColor = btnColor, + disabledContentColor = btnContentColor + ), + modifier = modifier, + shape = RoundedCornerShape(16.dp), + ) { + icon() + _root_ide_package_.ru.myitschool.work.ui.BaseText20(text = text) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/nav/AuthScreenDestination.kt b/app/src/main/java/ru/myitschool/work/ui/nav/AuthScreenDestination.kt index 52660b1..6a41bdf 100644 --- a/app/src/main/java/ru/myitschool/work/ui/nav/AuthScreenDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/nav/AuthScreenDestination.kt @@ -3,4 +3,4 @@ package ru.myitschool.work.ui.nav import kotlinx.serialization.Serializable @Serializable -data object AuthScreenDestination: AppDestination \ No newline at end of file +data object AuthScreenDestination: ru.myitschool.work.ui.nav.AppDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/nav/BookScreenDestination.kt b/app/src/main/java/ru/myitschool/work/ui/nav/BookScreenDestination.kt index 9a33073..6f5f601 100644 --- a/app/src/main/java/ru/myitschool/work/ui/nav/BookScreenDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/nav/BookScreenDestination.kt @@ -3,4 +3,4 @@ package ru.myitschool.work.ui.nav import kotlinx.serialization.Serializable @Serializable -data object BookScreenDestination: AppDestination \ No newline at end of file +data object BookScreenDestination: ru.myitschool.work.ui.nav.AppDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/nav/MainScreenDestination.kt b/app/src/main/java/ru/myitschool/work/ui/nav/MainScreenDestination.kt index deca45f..dd75b1f 100644 --- a/app/src/main/java/ru/myitschool/work/ui/nav/MainScreenDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/nav/MainScreenDestination.kt @@ -3,4 +3,4 @@ package ru.myitschool.work.ui.nav import kotlinx.serialization.Serializable @Serializable -data object MainScreenDestination: AppDestination \ No newline at end of file +data object MainScreenDestination: ru.myitschool.work.ui.nav.AppDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt index 01b0f32..7945bc2 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt @@ -29,7 +29,8 @@ fun AppNavHost( startDestination = AuthScreenDestination, ) { composable { - AuthScreen(navController = navController) + AuthScreen( + navController = navController) } composable { Box( diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt index f99978e..ad0dfeb 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt @@ -30,68 +30,126 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import ru.myitschool.work.R import ru.myitschool.work.core.TestIds +import ru.myitschool.work.ui.BaseButton +import ru.myitschool.work.ui.BaseInputText +import ru.myitschool.work.ui.BaseText12 +import ru.myitschool.work.ui.BaseText24 +import ru.myitschool.work.ui.Logo import ru.myitschool.work.ui.nav.MainScreenDestination +import ru.myitschool.work.ui.theme.Blue +import ru.myitschool.work.ui.theme.Red +import ru.myitschool.work.ui.theme.White + @Composable fun AuthScreen( viewModel: AuthViewModel = viewModel(), navController: NavController ) { - val state by viewModel.uiState.collectAsState() - - LaunchedEffect(Unit) { - viewModel.actionFlow.collect { - navController.navigate(MainScreenDestination) - } - } - Column( modifier = Modifier - .fillMaxSize() - .padding(all = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + .padding(20.dp) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally ) { - Text( + Logo() + + BaseText24( text = stringResource(R.string.auth_title), - style = MaterialTheme.typography.headlineSmall, textAlign = TextAlign.Center ) - when (val currentState = state) { - is AuthState.Data -> Content(viewModel, currentState) - is AuthState.Loading -> { - CircularProgressIndicator( - modifier = Modifier.size(64.dp) - ) - } + + Column( + modifier = Modifier.padding(vertical = 20.dp) + ) { + BaseInputText( + placeholder = stringResource(R.string.auth_label), + modifier = Modifier.fillMaxWidth() + ) + + BaseText12( + text = "Недействительный код сотрудника", + color = Red, + modifier = Modifier + .padding( + start = 10.dp, + top = 5.dp, + bottom = 0.dp + ) + .fillMaxWidth() + ) } + + BaseButton( + text = stringResource(R.string.auth_sign_in), + onClick = {}, + btnColor = Blue, + btnContentColor = White + ) } } -@Composable -private fun Content( - viewModel: AuthViewModel, - state: AuthState.Data -) { - var inputText by remember { mutableStateOf("") } - Spacer(modifier = Modifier.size(16.dp)) - TextField( - modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), - value = inputText, - onValueChange = { - inputText = it - viewModel.onIntent(AuthIntent.TextInput(it)) - }, - label = { Text(stringResource(R.string.auth_label)) } - ) - Spacer(modifier = Modifier.size(16.dp)) - Button( - modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(), - onClick = { - viewModel.onIntent(AuthIntent.Send(inputText)) - }, - enabled = true - ) { - Text(stringResource(R.string.auth_sign_in)) - } -} \ No newline at end of file + +//@Composable +//fun AuthScreen( +// viewModel: AuthViewModel = viewModel(), +// navController: NavController +//) { +// val state by viewModel.uiState.collectAsState() +// +// LaunchedEffect(Unit) { +// viewModel.actionFlow.collect { +// navController.navigate(MainScreenDestination) +// } +// } +// +// Column( +// modifier = Modifier +// .fillMaxSize() +// .padding(all = 24.dp), +// horizontalAlignment = Alignment.CenterHorizontally, +// verticalArrangement = Arrangement.Center +// ) { +// Text( +// text = stringResource(R.string.auth_title), +// style = MaterialTheme.typography.headlineSmall, +// textAlign = TextAlign.Center +// ) +// when (val currentState = state) { +// is AuthState.Data -> Content(viewModel, currentState) +// is AuthState.Loading -> { +// CircularProgressIndicator( +// modifier = Modifier.size(64.dp) +// ) +// } +// } +// } +//} +// +//@Composable +//private fun Content( +// viewModel: AuthViewModel, +// state: AuthState.Data +//) { +// var inputText by remember { mutableStateOf("") } +// Spacer(modifier = Modifier.size(16.dp)) +// TextField( +// modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), +// value = inputText, +// onValueChange = { +// inputText = it +// viewModel.onIntent(AuthIntent.TextInput(it)) +// }, +// label = { Text(stringResource(R.string.auth_label)) } +// ) +// Spacer(modifier = Modifier.size(16.dp)) +// Button( +// modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(), +// onClick = { +// viewModel.onIntent(AuthIntent.Send(inputText)) +// }, +// enabled = true +// ) { +// Text(stringResource(R.string.auth_sign_in)) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/theme/Color.kt b/app/src/main/java/ru/myitschool/work/ui/theme/Color.kt index 22226f4..1acc5bc 100644 --- a/app/src/main/java/ru/myitschool/work/ui/theme/Color.kt +++ b/app/src/main/java/ru/myitschool/work/ui/theme/Color.kt @@ -8,4 +8,12 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) + +val Blue = Color(0xFF004BFF) + +val Gray = Color(0xFF777777) + +val White = Color(0xFFFFFFFF) + +val Red = Color(0xFFFF4D4D) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/theme/Type.kt b/app/src/main/java/ru/myitschool/work/ui/theme/Type.kt index 61b2923..4ef268d 100644 --- a/app/src/main/java/ru/myitschool/work/ui/theme/Type.kt +++ b/app/src/main/java/ru/myitschool/work/ui/theme/Type.kt @@ -2,19 +2,34 @@ package ru.myitschool.work.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp +import ru.myitschool.work.R // Set of Material typography styles to start with + +val MontserratFontFamily = FontFamily( + Font(R.font.montserrat_bold, FontWeight.Bold), + Font(R.font.montserrat_medium, FontWeight.Medium), + Font(R.font.montserrat_semibold, weight = FontWeight.SemiBold) +) + val Typography = Typography( + bodySmall = TextStyle( + fontFamily = MontserratFontFamily, + fontWeight = FontWeight.Medium, + ), + bodyMedium = TextStyle( + fontFamily = MontserratFontFamily, + fontWeight = FontWeight.SemiBold, + ), bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) + fontFamily = MontserratFontFamily, + fontWeight = FontWeight.Bold, + ), + /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, diff --git a/app/src/main/res/drawable/logo.xml b/app/src/main/res/drawable/logo.xml new file mode 100644 index 0000000..1f187f8 --- /dev/null +++ b/app/src/main/res/drawable/logo.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/font/montserrat_bold.ttf b/app/src/main/res/font/montserrat_bold.ttf new file mode 100644 index 0000000..4033587 Binary files /dev/null and b/app/src/main/res/font/montserrat_bold.ttf differ diff --git a/app/src/main/res/font/montserrat_medium.ttf b/app/src/main/res/font/montserrat_medium.ttf new file mode 100644 index 0000000..c9a39ea Binary files /dev/null and b/app/src/main/res/font/montserrat_medium.ttf differ diff --git a/app/src/main/res/font/montserrat_semibold.ttf b/app/src/main/res/font/montserrat_semibold.ttf new file mode 100644 index 0000000..161477a Binary files /dev/null and b/app/src/main/res/font/montserrat_semibold.ttf differ