Edgar
07/19/2023, 3:00 PMStylianos Gakis
07/19/2023, 3:07 PMEdgar
07/19/2023, 3:10 PMChrimaeon
07/19/2023, 3:15 PMEdgar
07/19/2023, 3:16 PM@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ContactListScreen(
state: ContactListState,
newContact: Contact?,
onEvent: (ContactListEvent) -> Unit
) {
Scaffold(
floatingActionButton = {
FloatingActionButton(
onClick = {
onEvent(ContactListEvent.OnAddNewContactClick)
},
shape = RoundedCornerShape(25.dp)
) {
Icon(
imageVector = Icons.Rounded.PersonAdd,
contentDescription = "Add Contact"
)
}
}
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(vertical = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
item {
Text(
text = "My Contacts (${state.contacts.size})",
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
fontWeight = FontWeight.Bold
)
}
items(state.contacts) { contact ->
ContactListItem(
contact = contact,
modifier = Modifier.fillMaxWidth()
.clickable {
onEvent(ContactListEvent.SelectContact(contact))
}
.padding(horizontal = 16.dp)
)
}
}
}
AddContactSheet(
state = state,
newContact = newContact,
isOpen = state.isAddContactSheetOpen,
onEvent = onEvent,
modifier = Modifier
)
}
below below my AddContactSheet Screen
package com.example.kmmcontacllistapp.contacts.presentation.components
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.Close
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
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.unit.dp
import com.example.kmmcontacllistapp.contacts.domain.Contact
import com.example.kmmcontacllistapp.contacts.presentation.BottomSheetFromWish
import com.example.kmmcontacllistapp.contacts.presentation.ContactListEvent
import com.example.kmmcontacllistapp.contacts.presentation.ContactListState
@Composable
fun AddContactSheet(
state: ContactListState,
newContact: Contact?,
isOpen: Boolean,
onEvent: (ContactListEvent) -> Unit,
modifier: Modifier = Modifier
) {
BottomSheetFromWish(
visible = isOpen,
modifier = modifier.fillMaxWidth()
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.TopStart
) {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(Modifier.height(60.dp))
if (newContact?.photosBytes == null) {
Box(
modifier = Modifier
.size(150.dp)
.clip(RoundedCornerShape(40))
.background(MaterialTheme.colorScheme.secondaryContainer)
.clickable {
onEvent(ContactListEvent.OnAddPhotoClicked)
}
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.onSecondaryContainer,
shape = RoundedCornerShape(50.dp)
),
contentAlignment = Alignment.Center
) {
Icon(
imageVector = Icons.Rounded.Add,
contentDescription = "Add photo",
tint = MaterialTheme.colorScheme.onSecondaryContainer,
modifier = Modifier.size(40.dp)
)
}
} else {
ContactPhoto(
contact = newContact,
modifier = Modifier
.size(150.dp)
.clickable {
onEvent(ContactListEvent.OnAddPhotoClicked)
}
)
}
Spacer(Modifier.height(16.dp))
ContactTextField(
value = newContact?.firstName ?: "",
placeholder = "First Name",
error = state.firstNameError,
onValueChanged = {
onEvent(ContactListEvent.OnFirstNameChanged(it))
},
modifier = Modifier.fillMaxWidth()
)
Spacer(Modifier.height(16.dp))
ContactTextField(
value = newContact?.lastName ?: "",
placeholder = "Last Name",
error = state.lastNameError,
onValueChanged = {
onEvent(ContactListEvent.OnLastNameChanged(it))
},
modifier = Modifier.fillMaxWidth()
)
Spacer(Modifier.height(16.dp))
ContactTextField(
value = newContact?.email ?: "",
placeholder = "Email",
error = state.emailError,
onValueChanged = {
onEvent(ContactListEvent.OnEmailChanged(it))
},
modifier = Modifier.fillMaxWidth()
)
Spacer(Modifier.height(16.dp))
ContactTextField(
value = newContact?.phoneNumber ?: "",
placeholder = "Phone Number",
error = state.phoneNumberError,
onValueChanged = {
onEvent(ContactListEvent.OnPhoneNumberChanged(it))
},
modifier = Modifier.fillMaxWidth()
)
Button(onClick = {
onEvent(ContactListEvent.SaveContact)
}
) {
Text(text = "Save")
}
}
IconButton(
onClick = {
onEvent(ContactListEvent.DismissContact)
}
) {
Icon(
Icons.Rounded.Close,
contentDescription = "Close"
)
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun ContactTextField(
value: String,
placeholder: String,
error: String?,
onValueChanged: (String) -> Unit,
modifier: Modifier = Modifier
) {
Column(modifier) {
OutlinedTextField(
value = value,
placeholder = {
Text(text = placeholder)
},
onValueChange = onValueChanged,
shape = RoundedCornerShape(20.dp),
modifier = Modifier.fillMaxWidth()
)
if (error != null) {
Text(
text = error,
color = MaterialTheme.colorScheme.error
)
}
}
}
Edgar
07/19/2023, 3:18 PMChrimaeon
07/19/2023, 3:20 PMmodifier.fillMaxWidth
Stylianos Gakis
07/19/2023, 3:22 PMEdgar
07/19/2023, 3:23 PMBottomSheetFromWish(
visible = isOpen,
modifier = modifier.fillMaxWidth()
.background(MaterialTheme.colorScheme.background)
not workingChrimaeon
07/19/2023, 3:24 PMEdgar
07/19/2023, 3:24 PMChrimaeon
07/19/2023, 3:25 PMfillMaxSize
not just fill the width.Edgar
07/19/2023, 3:27 PMChrimaeon
07/19/2023, 3:29 PMEdgar
07/19/2023, 3:30 PMEdgar
07/19/2023, 3:33 PMChrimaeon
07/19/2023, 3:33 PMEdgar
07/19/2023, 3:33 PMChrimaeon
07/19/2023, 3:34 PMEdgar
07/19/2023, 3:37 PMChrimaeon
07/19/2023, 3:38 PMEdgar
07/19/2023, 3:49 PMChrimaeon
07/19/2023, 4:15 PMEdgar
07/19/2023, 4:41 PMChris Sinco [G]
07/20/2023, 3:33 AMEdgar
07/20/2023, 12:22 PM