From 487d228a9b13b4b0c905e7aefcabd10dbe3877f4 Mon Sep 17 00:00:00 2001 From: Nikell1 Date: Fri, 28 Nov 2025 19:51:36 +0300 Subject: [PATCH] add bookScreen --- .../java/ru/myitschool/work/ui/Composables.kt | 38 ++++ .../work/ui/nav/MainScreenDestination.kt | 4 +- .../work/ui/screen/auth/AuthScreen.kt | 7 +- .../work/ui/screen/book/BookScreen.kt | 118 +++++++++++ .../work/ui/screen/main/MainScreen.kt | 183 ++++++++++-------- app/src/main/res/drawable/add_icon.xml | 11 ++ 6 files changed, 278 insertions(+), 83 deletions(-) create mode 100644 app/src/main/res/drawable/add_icon.xml diff --git a/app/src/main/java/ru/myitschool/work/ui/Composables.kt b/app/src/main/java/ru/myitschool/work/ui/Composables.kt index 0d8c56c..942cc8d 100644 --- a/app/src/main/java/ru/myitschool/work/ui/Composables.kt +++ b/app/src/main/java/ru/myitschool/work/ui/Composables.kt @@ -1,10 +1,15 @@ package ru.myitschool.work.ui +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope +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.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -12,15 +17,19 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults 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.platform.testTag 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.core.TestIds.Main import ru.myitschool.work.ui.theme.Black +import ru.myitschool.work.ui.theme.Blue import ru.myitschool.work.ui.theme.Gray import ru.myitschool.work.ui.theme.LightBlue import ru.myitschool.work.ui.theme.LightGray @@ -193,4 +202,33 @@ fun BaseButton( icon() BaseText20(text = text) } +} + +@Composable +fun ErrorScreen() { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 20.dp, vertical = 40.dp) + ) { + + Spacer(modifier = Modifier.height(80.dp)) + + BaseText24( + text = "Ошибка загрузки данных", + textAlign = TextAlign.Center, + modifier = Modifier + .testTag(Main.ERROR) + .width(250.dp) + ) + + Spacer(modifier = Modifier.height(30.dp)) + + BaseButton( + modifier = Modifier.testTag(Main.REFRESH_BUTTON), + text = "Обновить", + btnColor = Blue, + btnContentColor = White, + onClick = {} + ) + } } \ 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 dd75b1f..f4e2b9e 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,6 @@ package ru.myitschool.work.ui.nav import kotlinx.serialization.Serializable @Serializable -data object MainScreenDestination: ru.myitschool.work.ui.nav.AppDestination \ No newline at end of file +data object MainScreenDestination: AppDestination { + val userData = "" +} \ No newline at end of file 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 c68b048..28d8695 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 @@ -3,10 +3,12 @@ package ru.myitschool.work.ui.screen.auth import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme @@ -48,8 +50,9 @@ fun AuthScreen( ) { Column( modifier = Modifier - .padding(20.dp) - .fillMaxSize(), + .fillMaxHeight() + .width(200.dp) + .padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Logo() diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt index 1f77967..2b3a552 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt @@ -1,11 +1,129 @@ package ru.myitschool.work.ui.screen.book +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +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.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import ru.myitschool.work.R +import ru.myitschool.work.core.TestIds.Main +import ru.myitschool.work.ui.BaseButton +import ru.myitschool.work.ui.BaseNoBackgroundButton +import ru.myitschool.work.ui.BaseText16 +import ru.myitschool.work.ui.BaseText20 +import ru.myitschool.work.ui.BaseText24 +import ru.myitschool.work.ui.nav.BookScreenDestination +import ru.myitschool.work.ui.theme.Black +import ru.myitschool.work.ui.theme.Blue +import ru.myitschool.work.ui.theme.Gray +import ru.myitschool.work.ui.theme.LightGray +import ru.myitschool.work.ui.theme.MontserratFontFamily +import ru.myitschool.work.ui.theme.White @Composable fun BookScreen( navController: NavController ) { + Column( + ) { + Row( + + ) { + BaseText24( + text = "Новая встреча" + ) + BaseNoBackgroundButton( + text = "Назад", + onClick = {} + ) + } + Column( + + ) { + BaseText16( + text = "Доступные даты" + ) + + BookDateList() + + BaseText16( + text = "Выберите место встречи" + ) + + BookPlaceList() + + BaseButton( + text = "Бронировать", + btnColor = Blue, + btnContentColor = White, + onClick = { navController.navigate(BookScreenDestination)}, + modifier = Modifier + .testTag(Main.ADD_BUTTON) + .padding(horizontal = 10.dp, vertical = 15.dp) + .fillMaxWidth(), + icon = {Image( + painter = painterResource(R.drawable.add_icon), + contentDescription = "plus Icon" + )} + + ) + } + } +} + +@Composable +fun BookPlaceList() { + BookPlaceListElement() +} + +@Composable +fun BookPlaceListElement() { + +} + +@Composable +fun BookDateList() { + BookDateListElement() + BookDateListElement() + BookDateListElement() + BookDateListElement() + BookDateListElement() + BookDateListElement() + BookDateListElement() + +} + +@Composable +fun BookDateListElement() { + Button( + border = BorderStroke(1.dp, Black), + onClick = {}, + modifier = Modifier + .width(60.dp) + .padding(0.dp), + colors = ButtonColors( + contentColor = Black, + containerColor = Color.Transparent, + disabledContentColor = Black, + disabledContainerColor = Color.Transparent), + shape = RoundedCornerShape(16.dp) + ) { + BaseText16(text = "16.06") + } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/main/MainScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainScreen.kt index 9847bfd..baecf74 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/main/MainScreen.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainScreen.kt @@ -31,6 +31,8 @@ import ru.myitschool.work.ui.BaseNoBackgroundButton import ru.myitschool.work.ui.BaseText14 import ru.myitschool.work.ui.BaseText16 import ru.myitschool.work.ui.BaseText20 +import ru.myitschool.work.ui.BaseText24 +import ru.myitschool.work.ui.ErrorScreen import ru.myitschool.work.ui.nav.BookScreenDestination import ru.myitschool.work.ui.theme.Black import ru.myitschool.work.ui.theme.Blue @@ -43,110 +45,131 @@ fun MainScreen( navController: NavController ) { Column ( + horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .background(LightGray) .fillMaxSize() + .width(400.dp) + ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .clip(RoundedCornerShape(bottomStart = 16.dp, bottomEnd = 16.dp)) - .background(Blue) - .fillMaxWidth() - .padding(10.dp) - ) { - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - BaseNoBackgroundButton( - text = "Обновить", - onClick = { }, - modifier = Modifier.testTag(Main.REFRESH_BUTTON) - ) + val dateError = false - BaseNoBackgroundButton( - text = "Выйти", - onClick = { }, - modifier = Modifier.testTag(Main.LOGOUT_BUTTON) - ) - } - - Image( - painter = painterResource(R.drawable.avatar), - contentDescription = "User avatar", - modifier = Modifier - .testTag(Main.PROFILE_IMAGE) - .padding(20.dp) - ) - - BaseText20( - text = "Артемий Артемиев Иванович", - color = White, - textAlign = TextAlign.Center, - modifier = Modifier - .testTag(Main.PROFILE_NAME) - .width(250.dp), - style = Typography.bodyLarge - ) - - Spacer(modifier = Modifier.height(20.dp)) - } - Column( - verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier - .fillMaxSize() - .padding(20.dp) - .clip(RoundedCornerShape(16.dp)) - .background(White) - ) { + if(!dateError) { Column( - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = "Ваши забронированные места", - style = Typography.bodyMedium, - color = Black, - fontSize = 16.sp, - modifier = Modifier.padding( - horizontal = 10.dp, - vertical = 20.dp - ) - ) - BookList() - } - BaseButton( - text = "Бронировать", - btnColor = Blue, - btnContentColor = White, - onClick = { navController.navigate(BookScreenDestination)}, + horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .testTag(Main.ADD_BUTTON) - .padding(horizontal = 10.dp, vertical = 15.dp) + .clip(RoundedCornerShape(bottomStart = 16.dp, bottomEnd = 16.dp)) + .background(Blue) .fillMaxWidth() - ) + .padding(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + + BaseNoBackgroundButton( + text = "Обновить", + onClick = { }, + modifier = Modifier.testTag(Main.REFRESH_BUTTON) + ) + + BaseNoBackgroundButton( + text = "Выйти", + onClick = { }, + modifier = Modifier.testTag(Main.LOGOUT_BUTTON) + ) + } + + Image( + painter = painterResource(R.drawable.avatar), + contentDescription = "User avatar", + modifier = Modifier + .testTag(Main.PROFILE_IMAGE) + .padding(20.dp) + ) + + BaseText20( + text = "Артемий Артемиев Иванович", + color = White, + textAlign = TextAlign.Center, + modifier = Modifier + .testTag(Main.PROFILE_NAME) + .width(250.dp), + style = Typography.bodyLarge + ) + + Spacer(modifier = Modifier.height(20.dp)) + } + Column( + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxSize() + .padding(20.dp) + .clip(RoundedCornerShape(16.dp)) + .background(White) + ) { + Column( + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = "Ваши забронированные места", + style = Typography.bodyMedium, + color = Black, + fontSize = 16.sp, + modifier = Modifier.padding( + horizontal = 10.dp, + vertical = 20.dp + ) + ) + BookList() + } + BaseButton( + text = "Бронировать", + btnColor = Blue, + btnContentColor = White, + onClick = { navController.navigate(BookScreenDestination)}, + modifier = Modifier + .testTag(Main.ADD_BUTTON) + .padding(horizontal = 10.dp, vertical = 15.dp) + .fillMaxWidth(), + icon = {Image( + painter = painterResource(R.drawable.add_icon), + contentDescription = "plus Icon" + )} + + ) + } + } + else { + ErrorScreen() } } } +val bookListData = listOf( + "Конгресс Холл", + "Конгресс Холл", + "Конгресс Холл" +) + @Composable fun BookList() { Column( modifier = Modifier.padding(horizontal = 20.dp) ) { - BookListElement() - BookListElement() - BookListElement() - BookListElement() + for ((index, book) in bookListData.withIndex()) { + BookListElement(index) + } } } @Composable -fun BookListElement() { +fun BookListElement(index: Int) { Row( modifier = Modifier - .testTag(Main.getIdItemByPosition(1)) + .testTag(Main.getIdItemByPosition(index)) .fillMaxWidth() .padding(vertical = 20.dp), horizontalArrangement = Arrangement.SpaceBetween diff --git a/app/src/main/res/drawable/add_icon.xml b/app/src/main/res/drawable/add_icon.xml new file mode 100644 index 0000000..3a2acfa --- /dev/null +++ b/app/src/main/res/drawable/add_icon.xml @@ -0,0 +1,11 @@ + + +