diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 964035f..b623ea4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,24 +10,34 @@ - - - - - - - - - - - + + + + + + + + + + + + + + - - + + + + + + + + + - + + + + - + + + + + + + + + @@ -167,7 +268,14 @@ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f460dfd..b5725c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + (getServices()[1]) + itemsIndexed(items){ + _, item -> + BasketItem(item = item) + } + } + Box(modifier = Modifier + .clip(RoundedCornerShape(15.dp, 15.dp, 0.dp, 0.dp)) + .background(Color.Transparent) + .height(130.dp), + ){ + Column (modifier = Modifier + .fillMaxWidth() + .height(100.dp) + .background(Color.White) + .padding(PaddingValues(15.dp)), + ){ + Row ( + horizontalArrangement = Arrangement.SpaceBetween, + ){ + Text( + text = "Total:", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(1f) + ) + Text( + text = "40$", + style = MaterialTheme.typography.bodyMedium + ) + } + Row ( + horizontalArrangement = Arrangement.SpaceBetween, + ){ + Text( + text = "Date:", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(1f) + ) + Text( + text = "11.11.2023:", + style = MaterialTheme.typography.bodyMedium + ) + } + } + Button( + onClick = { /*TODO*/ }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape) + .align(Alignment.BottomCenter), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "Confirm order", style = MaterialTheme.typography.bodyMedium.copy(Color.White)) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Basket/BasketItem.kt b/app/src/main/java/com/example/myapplication/Basket/BasketItem.kt new file mode 100644 index 0000000..4344837 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Basket/BasketItem.kt @@ -0,0 +1,150 @@ +package com.example.myapplication.Basket + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.myapplication.TestServiceItem +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextPrimary +import com.example.myapplication.ui.theme.TextSecondary + +@Composable +fun BasketItem(item: TestServiceItem){ + Box( + modifier = Modifier + .padding(0.dp, 0.dp, 0.dp, 10.dp) + .height(150.dp) + .shadow( + elevation = 4.dp, + shape = RoundedCornerShape(15.dp), + clip = false + ), + ){ + Row( + modifier = Modifier + .fillMaxWidth() + .height(145.dp) + .background(color = Color.White, RoundedCornerShape(15.dp)) + .padding(15.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ){ + Image( + painter = painterResource(id = item.image), + contentDescription = null, + modifier = Modifier + .fillMaxHeight() + .heightIn(min = 100.dp) + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + contentScale = ContentScale.FillHeight, + ) + + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.Top, + ){ + var animalsString = "" + item.name?.let { + Text( + text = it, + color = TextPrimary, + style = MaterialTheme.typography.bodyMedium) + } + item.animals?.forEach { animal -> animalsString += "$animal, " } + Text( + text = animalsString, + color = TextSecondary, + style = MaterialTheme.typography.bodyMedium + ) + } + + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Text( + text = "$${item.price}", + color = TextPrimary, + style = MaterialTheme.typography.bodyMedium + ) + Row(verticalAlignment = Alignment.CenterVertically){ + var num by remember { mutableIntStateOf(5) } + Text( + text = num.toString(), + color = TextPrimary + ) + Column(verticalArrangement = Arrangement.SpaceAround){ + Button( + onClick = { num+=1 }, + modifier = Modifier + .size(42.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "+") + } + Button( + onClick = { num-=1 }, + modifier = Modifier + .size(42.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "-") + } + } + } + } + } + } +} diff --git a/app/src/main/java/com/example/myapplication/List_of_Services/AddService.kt b/app/src/main/java/com/example/myapplication/List_of_Services/AddService.kt new file mode 100644 index 0000000..e948aa0 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/List_of_Services/AddService.kt @@ -0,0 +1,214 @@ +package com.example.myapplication.List_of_Services + +import android.content.ContentResolver +import android.content.Intent +import android.graphics.BitmapFactory +import android.provider.MediaStore +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.ExposedDropdownMenuBox +import androidx.compose.material.ExposedDropdownMenuDefaults +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +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.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.UIComponents.MyTextField +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextPrimary +import com.example.myapplication.ui.theme.TextSecondary +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@Composable +fun AddService (navController: NavController){ + var serviceName = "" + var price = "" + var animals = "" + val availableAnimals = listOf("Dogs", "Cats") + var expanded by remember { mutableStateOf(false) } + Column ( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Box( + modifier = Modifier + .padding(0.dp, 0.dp, 0.dp, 10.dp) + .height(150.dp) + .shadow( + elevation = 4.dp, + shape = RoundedCornerShape(15.dp), + clip = false + ), + ){ + Row( + modifier = Modifier + .fillMaxWidth() + .height(145.dp) + .background(color = Color.White, RoundedCornerShape(15.dp)) + .padding(15.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ){ + /* Image( + bitmap = selectedImage!!, + contentDescription = null, + modifier = Modifier + .fillMaxHeight() + .heightIn(min = 100.dp) + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + contentScale = ContentScale.FillHeight, + )*/ + + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.Top, + ){ + var animalsString = "" + serviceName?.let { + Text( + text = it, + color = TextPrimary, + style = MaterialTheme.typography.bodyMedium) + } + animals?.forEach { animal -> animalsString += "$animal, " } + Text( + text = animalsString, + color = TextSecondary, + style = MaterialTheme.typography.bodyMedium + ) + } + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Text( + text = "${price}$", + style = MaterialTheme.typography.bodyMedium, + ) + } + } + } + Column ( + ){ + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Service name"){ + newValue -> + serviceName = newValue + } + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + availableAnimals.forEach { + DropdownMenuItem(onClick = { animals += "$it, " }) { + Text(it) + } + } + } + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Price"){ + newValue -> + price = newValue + } + } + } + Button( + onClick = { +// val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) +// launcher.launch(intent) + }, + modifier = Modifier + .height(60.dp) + .padding(top = 10.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "Upload image", style = MaterialTheme.typography.bodyMedium.copy(Color.White)) + } + Button( + onClick = { + + }, + modifier = Modifier + .height(60.dp) + .padding(top = 10.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "Add service", style = MaterialTheme.typography.bodyMedium.copy(Color.White)) + } + } +} + +private suspend fun loadSelectedImage(uri: android.net.Uri, contentResolver: ContentResolver): ImageBitmap { + return withContext(Dispatchers.IO) { + val inputStream = contentResolver.openInputStream(uri) + val bitmap = BitmapFactory.decodeStream(inputStream) + bitmap.asImageBitmap() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/List_of_Services/ListOfServices.kt b/app/src/main/java/com/example/myapplication/List_of_Services/ListOfServices.kt index 6d91cda..19adf6e 100644 --- a/app/src/main/java/com/example/myapplication/List_of_Services/ListOfServices.kt +++ b/app/src/main/java/com/example/myapplication/List_of_Services/ListOfServices.kt @@ -1,8 +1,43 @@ package com.example.myapplication.List_of_Services +import SearchBar +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.example.myapplication.getServices +import com.example.myapplication.ui.theme.BlueMain @Composable -fun ListOfServices(){ +fun ListOfServices(navController: NavHostController){ + Column( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(bottom = 60.dp) + ){ + SearchBar( + modifier = Modifier) + { + searchText -> + //TODO search logic + } + LazyColumn(modifier = Modifier.padding(15.dp, 0.dp)){ + var serviceList = getServices() + itemsIndexed(serviceList){_, item -> + Service(item) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/List_of_Services/Service.kt b/app/src/main/java/com/example/myapplication/List_of_Services/Service.kt new file mode 100644 index 0000000..5c57219 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/List_of_Services/Service.kt @@ -0,0 +1,131 @@ +package com.example.myapplication.List_of_Services + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.example.myapplication.TestServiceItem +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextPrimary +import com.example.myapplication.ui.theme.TextSecondary +import java.security.Provider.Service + +@Composable +fun Service(item: TestServiceItem){ + Box( + modifier = Modifier + .padding(0.dp, 0.dp, 0.dp, 10.dp) + .height(150.dp) + .shadow( + elevation = 4.dp, + shape = RoundedCornerShape(15.dp), + clip = false + ), + ){ + Row( + modifier = Modifier + .fillMaxWidth() + .height(145.dp) + .background(color = Color.White, RoundedCornerShape(15.dp)) + .padding(15.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ){ + Image( + painter = painterResource(id = item.image), + contentDescription = null, + modifier = Modifier + .fillMaxHeight() + .heightIn(min = 100.dp) + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + contentScale = ContentScale.FillHeight, + ) + + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.Top, + ){ + var animalsString = "" + item.name?.let { + Text( + text = it, + color = TextPrimary, + style = MaterialTheme.typography.bodyMedium) + } + item.animals?.forEach { animal -> animalsString += "$animal, " } + Text( + text = animalsString, + color = TextSecondary, + style = MaterialTheme.typography.bodyMedium + ) + } + Column( + modifier = Modifier + .fillMaxHeight() + .widthIn(max = (LocalConfiguration.current.screenWidthDp / 3).dp), + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Text( + text = "$${item.price}", + color = TextPrimary, + style = MaterialTheme.typography.bodyMedium, + ) + Button( + onClick = { /*TODO*/ }, + modifier = Modifier + .size(42.dp) + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ){ + Text(text = "+") + } + } + } + } +} diff --git a/app/src/main/java/com/example/myapplication/Navbar/NavBar.kt b/app/src/main/java/com/example/myapplication/Navbar/NavBar.kt index 02222f6..e247fa9 100644 --- a/app/src/main/java/com/example/myapplication/Navbar/NavBar.kt +++ b/app/src/main/java/com/example/myapplication/Navbar/NavBar.kt @@ -2,11 +2,19 @@ package com.example.myapplication.Navbar import android.annotation.SuppressLint import android.content.Context +import android.content.res.Resources +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem @@ -20,16 +28,25 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.ControlledComposition import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.max import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat.getColor import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.compose.NavHost import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import com.example.myapplication.R +import com.example.myapplication.ui.theme.BlueMain import com.example.myapplication.ui.theme.BlueNavbar +import com.example.myapplication.ui.theme.GreenBtn @OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterialScaffoldPaddingParameter") @@ -37,22 +54,32 @@ import com.example.myapplication.ui.theme.BlueNavbar fun NavBar(){ val navController = rememberNavController() val items = listOf( - NavItem.Basket, NavItem.ListOfServices, + NavItem.Basket, NavItem.Profile ) - Scaffold(bottomBar = { BottomNavigation( - backgroundColor = BlueNavbar + backgroundColor = BlueNavbar, + modifier = Modifier + .fillMaxWidth() + .height(60.dp) + .clip(RoundedCornerShape(15.dp, 15.dp, 0.dp, 0.dp)), ){ val navBackStackEntry by navController.currentBackStackEntryAsState() val currentDestination = navBackStackEntry?.destination items.forEach { screen -> BottomNavigationItem( - icon = { ContextCompat.getDrawable(LocalContext.current, screen.icon)}, + icon = { + Icon(painterResource(screen.icon), + null, + modifier = Modifier, + GreenBtn) + }, selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, + modifier = Modifier + .padding(15.dp), onClick = { navController.navigate(screen.route){ popUpTo(navController.graph.findStartDestination().id) { diff --git a/app/src/main/java/com/example/myapplication/Navbar/NavController.kt b/app/src/main/java/com/example/myapplication/Navbar/NavController.kt index 2788142..0d48236 100644 --- a/app/src/main/java/com/example/myapplication/Navbar/NavController.kt +++ b/app/src/main/java/com/example/myapplication/Navbar/NavController.kt @@ -6,41 +6,81 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.example.myapplication.Basket.Basket +import com.example.myapplication.List_of_Services.AddService import com.example.myapplication.List_of_Services.ListOfServices +import com.example.myapplication.Orders.Orders +import com.example.myapplication.Profile.Login import com.example.myapplication.Profile.Profile +import com.example.myapplication.Profile.ProfileChange +import com.example.myapplication.Profile.ProfileNotAuth +import com.example.myapplication.Profile.Registration @Composable fun NavController(navController : NavHostController){ NavHost( navController = navController, - startDestination = "list_of_services" + startDestination = NavItem.Profile.route ){ composable( - "list_of_services" + NavItem.ListOfServices.route ){ - ListOfServices() + ListOfServices(navController) } composable( - "basket/{userId}" +// "${NavItem.Basket.route}/{userId}" + "${NavItem.Basket.route}" ){ - backStackEntry -> - backStackEntry.arguments?.getString("userId")?.let { - Basket( - navController, - it.toLong() - ) - } + Basket(navController) +// backStackEntry -> +// backStackEntry.arguments?.getString("userId")?.let { +// Basket( +// navController, +// it.toLong() +// ) +// } } composable( - "profile/{userId}" +// "${NavItem.Profile.route}/{userId}" + "${NavItem.Profile.route}" ){ - backStackEntry -> - backStackEntry.arguments?.getString("userId")?.let { - Profile( - navController, - it.toLong() - ) - } + Profile(navController) +// backStackEntry -> +// backStackEntry.arguments?.getString("userId")?.let { +// Profile( +// navController, +// it.toLong() +// ) +// } + } + composable( + "${NavItem.ProfileChange.route}" + ){ + ProfileChange(navController) + } + composable( + "${NavItem.Orders.route}" + ){ + Orders(navController) + } + composable( + "${NavItem.ProfileNotAuth.route}" + ){ + ProfileNotAuth(navController) + } + composable( + "${NavItem.Login.route}" + ){ + Login(navController) + } + composable( + "${NavItem.Registration.route}" + ){ + Registration(navController) + } + composable( + "${NavItem.AddService.route}" + ){ + AddService(navController) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Navbar/NavItem.kt b/app/src/main/java/com/example/myapplication/Navbar/NavItem.kt index 5f7a05d..9259845 100644 --- a/app/src/main/java/com/example/myapplication/Navbar/NavItem.kt +++ b/app/src/main/java/com/example/myapplication/Navbar/NavItem.kt @@ -1,7 +1,9 @@ package com.example.myapplication.Navbar import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.vectorResource import com.example.myapplication.R @@ -21,4 +23,28 @@ sealed class NavItem( "profile", R.drawable.icon_profile ) + object ProfileChange : NavItem( + "profile_change", + R.drawable.icon_profile + ) + object Orders : NavItem( + "orders", + R.drawable.icon_profile + ) + object ProfileNotAuth : NavItem( + "profile_not_auth", + R.drawable.icon_profile + ) + object Login : NavItem( + "login", + R.drawable.icon_profile + ) + object Registration : NavItem( + "registration", + R.drawable.icon_profile + ) + object AddService : NavItem( + "add_service", + R.drawable.icon_list_of_services + ) } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Orders/OrderItem.kt b/app/src/main/java/com/example/myapplication/Orders/OrderItem.kt new file mode 100644 index 0000000..7a90f0c --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Orders/OrderItem.kt @@ -0,0 +1,69 @@ +package com.example.myapplication.Orders + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.modifier.modifierLocalConsumer +import androidx.compose.ui.unit.dp +import com.example.myapplication.ui.theme.TextPrimary +import com.example.myapplication.ui.theme.TextSecondary +import java.util.Date + +@Composable +fun OrderItem (orderId: Int, date: String, price: Double, list: String){ + Column(modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(15.dp))){ + Column ( + modifier = Modifier + .padding(0.dp, 0.dp, 0.dp, 0.dp) + .shadow( + elevation = 4.dp, + shape = RoundedCornerShape(15.dp), + clip = false + ) + ){ + Row ( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .background(Color.White) + .fillMaxWidth() + .padding(horizontal = 15.dp, vertical = 10.dp), + ){ + Text(text = "Order:$orderId", modifier = Modifier.weight(1f), style = MaterialTheme.typography.bodyMedium) + Text(text = "$price$", style = MaterialTheme.typography.bodyMedium) + } + Row ( + modifier = Modifier + .background(Color.White) + .fillMaxWidth() + .padding(horizontal = 15.dp), + ){ + Text(text = date, style = MaterialTheme.typography.bodyMedium) + } + } + Row ( + modifier = Modifier + .background(Color.White) + .fillMaxWidth() + .padding(15.dp) + ){ + Text(text = list, style = MaterialTheme.typography.bodyMedium.copy(TextSecondary)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Orders/Orders.kt b/app/src/main/java/com/example/myapplication/Orders/Orders.kt new file mode 100644 index 0000000..22975fd --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Orders/Orders.kt @@ -0,0 +1,27 @@ +package com.example.myapplication.Orders + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.ui.theme.BlueMain +import java.util.Date + +@Composable +fun Orders (navController: NavController){ + Column ( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ){ + OrderItem(orderId = 1, date = "11.11.2023", price = 40.0, list = "Inoculation x2") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Profile/Login.kt b/app/src/main/java/com/example/myapplication/Profile/Login.kt new file mode 100644 index 0000000..935ba0a --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Profile/Login.kt @@ -0,0 +1,107 @@ +package com.example.myapplication.Profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.TextUnitType +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.Navbar.NavItem +import com.example.myapplication.UIComponents.MyTextField +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextSecondary + +@Composable +fun Login (navController: NavController){ + Column( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ){ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 30.dp), + horizontalArrangement = Arrangement.Center + ){ + Text( + text = "PetMed", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White, fontSize = TextUnit(16.0f, TextUnitType.Em)) + ) + } + Column ( + ){ + Row (modifier = Modifier + .padding(vertical = 5.dp) + ){ + MyTextField(label = "Email", onValueChanged = {}) + } + Row (modifier = Modifier + .padding(vertical = 5.dp) + ){ + MyTextField(label = "Password", onValueChanged = {}) + } + } + Button( + onClick = { navController.navigate(NavItem.ListOfServices.route) }, + modifier = Modifier + .height(60.dp) + .padding(top = 10.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Login", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White) + ) + } + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ){ + Text( + text = "Don't have an account? ", + style = MaterialTheme.typography.bodyMedium + .copy(TextSecondary) + ) + Text( + text = "Sign up", + style = MaterialTheme.typography.bodyMedium + .copy(GreenBtn), + modifier = Modifier + .clickable { navController.navigate(NavItem.Registration.route) } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Profile/Profile.kt b/app/src/main/java/com/example/myapplication/Profile/Profile.kt index 54ff3e4..396449f 100644 --- a/app/src/main/java/com/example/myapplication/Profile/Profile.kt +++ b/app/src/main/java/com/example/myapplication/Profile/Profile.kt @@ -1,6 +1,154 @@ package com.example.myapplication.Profile +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ExitToApp +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController +import com.example.myapplication.Navbar.NavItem +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.RedBtn -fun Profile(navController: NavHostController, userId : Long){ +@Composable +fun Profile(navController: NavHostController){ + Column ( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Box(modifier = Modifier + .clip(CircleShape) + .size(200.dp) + .background(Color.White) + ){ + // TODO: upload profile image + } + Box(modifier = Modifier.padding(15.dp)){ + Text( + text = "Name Surname", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center), + textAlign = TextAlign.Center, + ) + } + Box(modifier = Modifier.padding(15.dp)){ + Text( + text = "example@mail.ex", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center), + textAlign = TextAlign.Center, + ) + } + Button( + onClick = { navController.navigate(NavItem.ProfileChange.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape) + .padding(vertical = 5.dp), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Change profile", + style = MaterialTheme.typography.bodyMedium, + color = Color.White + ) + } + Button( + onClick = { navController.navigate(NavItem.Orders.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape) + .padding(vertical = 5.dp), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Orders", + style = MaterialTheme.typography.bodyMedium, + color = Color.White + ) + } + Button( + onClick = { navController.navigate(NavItem.AddService.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape) + .padding(vertical = 5.dp), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Add service", + style = MaterialTheme.typography.bodyMedium, + color = Color.White + ) + } + Button( + onClick = { navController.navigate(NavItem.ProfileNotAuth.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape) + .padding(vertical = 5.dp), + colors = ButtonDefaults.buttonColors( + containerColor = RedBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Icon( + Icons.Default.ExitToApp, + contentDescription = null, + modifier = Modifier, + ) + Text( + text = "Exit", + style = MaterialTheme.typography.bodyMedium, + color = Color.White + ) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Profile/ProfileChange.kt b/app/src/main/java/com/example/myapplication/Profile/ProfileChange.kt new file mode 100644 index 0000000..f6f0b9a --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Profile/ProfileChange.kt @@ -0,0 +1,127 @@ +package com.example.myapplication.Profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowDown +import androidx.compose.material3.AlertDialogDefaults.shape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.modifier.modifierLocalConsumer +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.example.myapplication.R +import com.example.myapplication.UIComponents.MyTextField +import com.example.myapplication.ui.theme.BlueBorder +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextSecondary + +@Composable +fun ProfileChange (navController: NavHostController){ + Column ( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Box(modifier = Modifier + .clip(CircleShape) + .size(200.dp) + .background(Color.White) + .padding(PaddingValues(0.dp)) + ){ + Icon( + painterResource(id = R.drawable.upload), + contentDescription = null, + modifier = Modifier.align(Alignment.Center), + GreenBtn + ) + } + Box(modifier = Modifier.padding(15.dp)){ + Text( + text = "Name Surname", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center), + textAlign = TextAlign.Center, + ) + } + Box(modifier = Modifier.padding(15.dp)){ + Text( + text = "example@mail.ex", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center), + textAlign = TextAlign.Center, + ) + } + Column ( + ){ + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Name", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Surname", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Email", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Old password", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "New password", onValueChanged = {}) + } + } + Button( + onClick = { /*TODO*/ }, + modifier = Modifier + .height(60.dp) + .padding(top = 10.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text(text = "Confirm changes", style = MaterialTheme.typography.bodyMedium.copy(Color.White)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Profile/ProfileNotAuth.kt b/app/src/main/java/com/example/myapplication/Profile/ProfileNotAuth.kt new file mode 100644 index 0000000..9464552 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Profile/ProfileNotAuth.kt @@ -0,0 +1,81 @@ +package com.example.myapplication.Profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.Navbar.NavItem +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn + +@Composable +fun ProfileNotAuth (navController: NavController){ + Column( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ){ + Row ( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(bottom = 15.dp) + ){ + Button( + onClick = { navController.navigate(NavItem.Login.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Login", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White) + ) + } + } + Button( + onClick = { navController.navigate(NavItem.Registration.route) }, + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Registration", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Profile/Registration.kt b/app/src/main/java/com/example/myapplication/Profile/Registration.kt new file mode 100644 index 0000000..fae696f --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Profile/Registration.kt @@ -0,0 +1,107 @@ +package com.example.myapplication.Profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.TextUnitType +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.Navbar.NavItem +import com.example.myapplication.UIComponents.MyTextField +import com.example.myapplication.ui.theme.BlueMain +import com.example.myapplication.ui.theme.GreenBtn +import com.example.myapplication.ui.theme.TextSecondary + +@Composable +fun Registration (navController: NavController){ + Column( + modifier = Modifier + .fillMaxSize() + .background(BlueMain) + .padding(15.dp) + .padding(bottom = 60.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ){ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 30.dp), + horizontalArrangement = Arrangement.Center, + ){ + Text( + text = "PetMed", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White, fontSize = TextUnit(16.0f, TextUnitType.Em)) + ) + } + Column ( + ){ + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Name", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Surname", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Email", onValueChanged = {}) + } + Row (modifier = Modifier.padding(vertical = 5.dp)){ + MyTextField(label = "Password", onValueChanged = {}) + } + } + Button( + onClick = { navController.navigate(NavItem.ListOfServices.route) }, + modifier = Modifier + .height(60.dp) + .padding(top = 10.dp) + .fillMaxWidth() + .clip(CircleShape), + colors = ButtonDefaults.buttonColors( + containerColor = GreenBtn, + contentColor = Color.White + ), + contentPadding = PaddingValues(0.dp), + ) { + Text( + text = "Registration", + style = MaterialTheme.typography.bodyMedium + .copy(Color.White) + ) + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ){ + Text( + text = "Already have a account? ", + style = MaterialTheme.typography.bodyMedium + .copy(TextSecondary) + ) + Text( + text = "Login", + style = MaterialTheme.typography.bodyMedium + .copy(GreenBtn), + modifier = Modifier.clickable { navController.navigate(NavItem.Login.route) } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/TestServiceItem.kt b/app/src/main/java/com/example/myapplication/TestServiceItem.kt new file mode 100644 index 0000000..f03b46a --- /dev/null +++ b/app/src/main/java/com/example/myapplication/TestServiceItem.kt @@ -0,0 +1,59 @@ +package com.example.myapplication + +import android.os.Parcel +import android.os.Parcelable +import kotlin.collections.ArrayList + +data class TestServiceItem( + val image: Int, + val name: String?, + val animals: ArrayList?, + val price: Double +) : Parcelable { + + constructor(parcel: Parcel) : this( + parcel.readInt(), + parcel.readString(), + parcel.createStringArrayList(), + parcel.readDouble() + ) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeInt(image) + parcel.writeString(name) + parcel.writeStringList(animals) + parcel.writeDouble(price) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): TestServiceItem { + return TestServiceItem(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} + +fun getServices(): List{ + return listOf( + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats","Dogs", "Cats","Dogs", "Cats","Dogs", "Cats","Dogs", "Cats","Dogs", "Cats","Dogs", "Cats",), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + TestServiceItem(R.drawable.image_service, "Inoculation", arrayListOf("Dogs", "Cats"), 20.0), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/UIComponents/Button.kt b/app/src/main/java/com/example/myapplication/UIComponents/Button.kt deleted file mode 100644 index ba85118..0000000 --- a/app/src/main/java/com/example/myapplication/UIComponents/Button.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.myapplication.UIComponents - -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color - -@Composable -fun Button(color: Color, text: String){ -} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/UIComponents/MyTextField.kt b/app/src/main/java/com/example/myapplication/UIComponents/MyTextField.kt new file mode 100644 index 0000000..406cf6a --- /dev/null +++ b/app/src/main/java/com/example/myapplication/UIComponents/MyTextField.kt @@ -0,0 +1,62 @@ +package com.example.myapplication.UIComponents + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.unit.dp +import com.example.myapplication.ui.theme.BlueBorder +import com.example.myapplication.ui.theme.TextSecondary + +@Composable +fun MyTextField ( + label: String, + onValueChanged: (String) -> Unit +){ + val textState = remember { mutableStateOf(TextFieldValue()) } + val text by rememberUpdatedState(newValue = textState.value) + Row ( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .clip(RoundedCornerShape(15.dp)) + .fillMaxWidth() + .background(Color.White) + .border(2.dp, color = BlueBorder, RoundedCornerShape(15.dp)) + .height(45.dp) + .padding(horizontal = 15.dp), + ){ + if(textState.value.text.isEmpty()){ + Text( + text = label, + style = MaterialTheme.typography.bodyMedium.copy(color = TextSecondary) + ) + } + BasicTextField( + value = text, + onValueChange = { newValue -> + textState.value = newValue + }, + modifier = Modifier.fillMaxWidth(), + textStyle = MaterialTheme.typography.bodyMedium, + singleLine = true, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/UIComponents/SearchBar.kt b/app/src/main/java/com/example/myapplication/UIComponents/SearchBar.kt index d4dadde..3d7d324 100644 --- a/app/src/main/java/com/example/myapplication/UIComponents/SearchBar.kt +++ b/app/src/main/java/com/example/myapplication/UIComponents/SearchBar.kt @@ -1,5 +1,10 @@ +import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.res.stringResource import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -9,31 +14,66 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Search import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.TextFieldDefaults.indicatorLine 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.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.myapplication.R +import com.example.myapplication.ui.theme.TextSecondary @OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchBar( - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + onSearch: (String) -> Unit ) { + var searchText by remember { mutableStateOf("") } + TextField( - value = "", - onValueChange = {}, + value = searchText, + onValueChange = { + searchText = it + onSearch(it) + }, leadingIcon = { Icon( imageVector = Icons.Default.Search, - contentDescription = null + contentDescription = "Search", + modifier = Modifier, + TextSecondary ) }, placeholder = { - Text(stringResource(R.string.placeholder_search)) + Text(stringResource(R.string.placeholder_search), style = MaterialTheme.typography.bodyMedium.copy(TextSecondary)) }, modifier = modifier .fillMaxWidth() - .heightIn(min = 56.dp) + .height(80.dp) + .padding(15.dp) + .clip(RoundedCornerShape(15.dp)), + singleLine = true, + colors = TextFieldDefaults.textFieldColors( + textColor = Color.Black, + containerColor = Color.White, + placeholderColor = TextSecondary, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Red, + ), ) +} + +@Preview +@Composable +fun testSearchBar(){ + SearchBar(modifier = Modifier){} } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Color.kt b/app/src/main/java/com/example/myapplication/ui/theme/Color.kt index 38a4fed..a4aa858 100644 --- a/app/src/main/java/com/example/myapplication/ui/theme/Color.kt +++ b/app/src/main/java/com/example/myapplication/ui/theme/Color.kt @@ -16,4 +16,5 @@ val GreenBtn = Color(0xFF009688) val TextPrimary = Color(0xFF212121) val TextSecondary = Color(0xFF757575) val White = Color(0xFFFFFFFF) -val BlueNavbar = Color(0x6603A9F4) +val BlueNavbar = Color(0xFF79D5FF) +val BlueBorder = Color(0xFF79D5FF) diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt b/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt index 3baf50b..d0e4e84 100644 --- a/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt +++ b/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt @@ -3,6 +3,7 @@ package com.example.myapplication.ui.theme import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.Typography import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme @@ -13,6 +14,7 @@ import androidx.compose.runtime.SideEffect import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.text.TextStyle import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Type.kt b/app/src/main/java/com/example/myapplication/ui/theme/Type.kt index 64846a0..7d1a50b 100644 --- a/app/src/main/java/com/example/myapplication/ui/theme/Type.kt +++ b/app/src/main/java/com/example/myapplication/ui/theme/Type.kt @@ -2,18 +2,19 @@ package com.example.myapplication.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 com.example.myapplication.R // Set of Material typography styles to start with val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, + bodyMedium = TextStyle( + fontFamily = FontFamily(Font(R.font.roboto_serif_regular)), fontWeight = FontWeight.Normal, fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp + color = TextPrimary ) /* Other default text styles to override titleLarge = TextStyle( diff --git a/app/src/main/res/drawable/icon_calendar.xml b/app/src/main/res/drawable/icon_calendar.xml new file mode 100644 index 0000000..5bf392d --- /dev/null +++ b/app/src/main/res/drawable/icon_calendar.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/image_service.png b/app/src/main/res/drawable/image_service.png new file mode 100644 index 0000000..5bbf8a4 Binary files /dev/null and b/app/src/main/res/drawable/image_service.png differ diff --git a/app/src/main/res/drawable/upload.xml b/app/src/main/res/drawable/upload.xml new file mode 100644 index 0000000..a9d6885 --- /dev/null +++ b/app/src/main/res/drawable/upload.xml @@ -0,0 +1,9 @@ + + +