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 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -43,11 +53,17 @@
+
+
+
+
+
- {
+ "keyToString": {
+ "ApkExportedModule": "My_Application.app",
+ "ExportApk.ApkPathForMy_Application.app": "C:\\Users\\Danil\\Desktop\\MDP\\labs\\app",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.cidr.known.project.marker": "true",
+ "cidr.known.project.marker": "true",
+ "com.android.tools.idea.devicemanager.tab": "Physical",
+ "last_opened_file_path": "C:/Users/Danil/Downloads/test",
+ "project.structure.last.edited": "Build Variants",
+ "project.structure.proportion": "0.17",
+ "project.structure.side.proportion": "0.2",
+ "settings.editor.selected.configurable": "trusted.hosts"
+ },
+ "keyToStringList": {
+ "ExportApk.BuildVariants": [
+ "release"
+ ]
}
-}]]>
+}
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -150,6 +246,11 @@
+
+
+
+
+
@@ -167,7 +268,14 @@
1696075970008
-
+
+ 1696755925297
+
+
+
+ 1696755925297
+
+
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 @@
+
+
+