Add a poorly done bottomsheet mail selector on the detail page.

This commit is contained in:
Thomas Andres Gomez 2021-12-09 15:11:17 +01:00
parent 6254ec4f02
commit 38c67504b2
5 changed files with 97 additions and 24 deletions

View file

@ -1,4 +1,4 @@
package com.pixelized.biblib.ui.composable.items
package com.pixelized.biblib.ui.composable.common
import androidx.compose.animation.Crossfade
import androidx.compose.runtime.*
@ -10,11 +10,9 @@ import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale
import com.pixelized.biblib.ui.theme.Animation
import com.pixelized.biblib.utils.BitmapCache
import com.pixelized.biblib.utils.injection.get
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.net.URL

View file

@ -19,6 +19,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.pixelized.biblib.R
import com.pixelized.biblib.ui.composable.common.Image
import com.pixelized.biblib.ui.data.BookThumbnailUio
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.theme.Teal200

View file

@ -2,9 +2,12 @@ package com.pixelized.biblib.ui.composable.pages
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.core.MutableTransitionState
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
@ -34,8 +37,10 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.pixelized.biblib.R
import com.pixelized.biblib.ui.composable.common.HtmlText
import com.pixelized.biblib.ui.composable.items.Image
import com.pixelized.biblib.ui.composable.common.Image
import com.pixelized.biblib.ui.data.BookUio
import com.pixelized.biblib.ui.data.MailUio
import com.pixelized.biblib.ui.theme.Animation
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.theme.Teal200
import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel
@ -48,6 +53,7 @@ import com.pixelized.biblib.utils.mock.BookMock
@Composable
@OptIn(ExperimentalAnimationApi::class)
fun DetailPage(
booksViewModel: IBooksViewModel = viewModel<BooksViewModel>(),
userViewModel: IUserViewModel = viewModel<UserViewModel>(),
@ -59,8 +65,11 @@ fun DetailPage(
.fillMaxHeight(),
elevation = 4.dp
) {
val bottomSheetVisibility = remember { MutableTransitionState(false) }
val book by booksViewModel.getBookDetail(bookId).observeAsState()
val user by userViewModel.user.observeAsState()
book?.let {
DetailPage(
book = it,
@ -69,32 +78,45 @@ fun DetailPage(
when {
emailCount == 1 -> {
val email: String? = user?.amazonEmails?.firstOrNull()
if (email != null) {
booksViewModel.send(id = bookId, mail = email)
}
email?.let { mail -> booksViewModel.send(id = bookId, mail = mail) }
}
emailCount > 1 -> {
// TODO choose email popup
bottomSheetVisibility.targetState = true
}
else -> Unit // TODO warning popup, no email.
}
}
)
}
AnimatedVisibility(
visibleState = bottomSheetVisibility,
enter = slideInVertically(
animationSpec = tween(Animation.MEDIUM_DURATION),
initialOffsetY = { it },
),
exit = slideOutVertically(
animationSpec = tween(Animation.MEDIUM_DURATION),
targetOffsetY = { it },
),
) {
SendMailBottomSheet(
user?.amazonEmails?.map { MailUio(it) } ?: listOf(),
onItemClick = { booksViewModel.send(id = bookId, mail = it.mail) },
onOutsideClick = { bottomSheetVisibility.targetState = false }
)
}
}
}
@Composable
@OptIn(ExperimentalAnimationApi::class)
fun DetailPage(
book: BookUio,
onEpubClick: () -> Unit = {},
onMobiClick: () -> Unit = {},
onSendClick: () -> Unit = {},
) {
val typography = MaterialTheme.typography
val pouet = remember { MutableTransitionState(false) }
Column(
modifier = Modifier
@ -179,13 +201,6 @@ fun DetailPage(
modifier = Modifier.padding(bottom = 16.dp)
)
}
AnimatedVisibility(
visibleState = pouet,
) {
SendMailBottomSheet()
}
}
@Composable
@ -229,15 +244,64 @@ private fun RowScope.Button(
}
@Composable
private fun SendMailBottomSheet() {
val data = listOf("pouet", "pouet")
LazyColumn(modifier = Modifier.fillMaxWidth()) {
items(data.size) { index: Int ->
Text(text = data[index])
private fun SendMailBottomSheet(
data: List<MailUio> = listOf(
MailUio("R.Giskard.Reventlov.Kindle@gmailcom"),
MailUio("R.Daneel.Olivaw.Kindle@gmailcom"),
),
onItemClick: (MailUio) -> Unit = {},
onOutsideClick: () -> Unit = {},
) {
val typography = MaterialTheme.typography
Box(
contentAlignment = Alignment.BottomCenter,
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.clickable { onOutsideClick() },
) {
Column(
modifier = Modifier.background(MaterialTheme.colors.background)
) {
Text(
modifier = Modifier.padding(horizontal = 16.dp).padding(top = 8.dp),
style = typography.caption,
text = "Send this EBook to:",
)
LazyColumn(
modifier = Modifier.fillMaxWidth()
) {
items(data.size) { index: Int ->
SendMailItem(uio = data[index], onClick = onItemClick)
}
}
Spacer(modifier = Modifier.height(16.dp))
}
}
}
@Composable
private fun SendMailItem(
uio: MailUio,
onClick: (MailUio) -> Unit = {},
) {
val typography = MaterialTheme.typography
Box(
modifier = Modifier
.height(48.dp)
.fillMaxWidth()
.clickable { onClick(uio) },
contentAlignment = Alignment.CenterStart
) {
Text(
modifier = Modifier.padding(horizontal = 16.dp),
style = typography.body1,
text = uio.mail
)
}
}
@Preview
@Composable
fun DetailPageLightPreview() {

View file

@ -0,0 +1,5 @@
package com.pixelized.biblib.ui.data
data class MailUio(
val mail: String,
)

View file

@ -0,0 +1,5 @@
package com.pixelized.biblib.utils.extention
import android.util.Log
fun logC(message: String): Int = Log.v("Composition", message)