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.animation.Crossfade
import androidx.compose.runtime.* 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.BitmapPainter
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import com.pixelized.biblib.ui.theme.Animation
import com.pixelized.biblib.utils.BitmapCache import com.pixelized.biblib.utils.BitmapCache
import com.pixelized.biblib.utils.injection.get import com.pixelized.biblib.utils.injection.get
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.net.URL 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 androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.biblib.R 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.data.BookThumbnailUio
import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.theme.Teal200 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.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.core.MutableTransitionState 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.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@ -34,8 +37,10 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.pixelized.biblib.R import com.pixelized.biblib.R
import com.pixelized.biblib.ui.composable.common.HtmlText 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.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.BibLibTheme
import com.pixelized.biblib.ui.theme.Teal200 import com.pixelized.biblib.ui.theme.Teal200
import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel
@ -48,6 +53,7 @@ import com.pixelized.biblib.utils.mock.BookMock
@Composable @Composable
@OptIn(ExperimentalAnimationApi::class)
fun DetailPage( fun DetailPage(
booksViewModel: IBooksViewModel = viewModel<BooksViewModel>(), booksViewModel: IBooksViewModel = viewModel<BooksViewModel>(),
userViewModel: IUserViewModel = viewModel<UserViewModel>(), userViewModel: IUserViewModel = viewModel<UserViewModel>(),
@ -59,8 +65,11 @@ fun DetailPage(
.fillMaxHeight(), .fillMaxHeight(),
elevation = 4.dp elevation = 4.dp
) { ) {
val bottomSheetVisibility = remember { MutableTransitionState(false) }
val book by booksViewModel.getBookDetail(bookId).observeAsState() val book by booksViewModel.getBookDetail(bookId).observeAsState()
val user by userViewModel.user.observeAsState() val user by userViewModel.user.observeAsState()
book?.let { book?.let {
DetailPage( DetailPage(
book = it, book = it,
@ -69,32 +78,45 @@ fun DetailPage(
when { when {
emailCount == 1 -> { emailCount == 1 -> {
val email: String? = user?.amazonEmails?.firstOrNull() val email: String? = user?.amazonEmails?.firstOrNull()
if (email != null) { email?.let { mail -> booksViewModel.send(id = bookId, mail = mail) }
booksViewModel.send(id = bookId, mail = email)
}
} }
emailCount > 1 -> { emailCount > 1 -> {
// TODO choose email popup bottomSheetVisibility.targetState = true
} }
else -> Unit // TODO warning popup, no email. 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 @Composable
@OptIn(ExperimentalAnimationApi::class)
fun DetailPage( fun DetailPage(
book: BookUio, book: BookUio,
onEpubClick: () -> Unit = {}, onEpubClick: () -> Unit = {},
onMobiClick: () -> Unit = {}, onMobiClick: () -> Unit = {},
onSendClick: () -> Unit = {}, onSendClick: () -> Unit = {},
) { ) {
val typography = MaterialTheme.typography val typography = MaterialTheme.typography
val pouet = remember { MutableTransitionState(false) }
Column( Column(
modifier = Modifier modifier = Modifier
@ -179,13 +201,6 @@ fun DetailPage(
modifier = Modifier.padding(bottom = 16.dp) modifier = Modifier.padding(bottom = 16.dp)
) )
} }
AnimatedVisibility(
visibleState = pouet,
) {
SendMailBottomSheet()
}
} }
@Composable @Composable
@ -229,15 +244,64 @@ private fun RowScope.Button(
} }
@Composable @Composable
private fun SendMailBottomSheet() { private fun SendMailBottomSheet(
val data = listOf("pouet", "pouet") data: List<MailUio> = listOf(
LazyColumn(modifier = Modifier.fillMaxWidth()) { MailUio("R.Giskard.Reventlov.Kindle@gmailcom"),
items(data.size) { index: Int -> MailUio("R.Daneel.Olivaw.Kindle@gmailcom"),
Text(text = data[index]) ),
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 @Preview
@Composable @Composable
fun DetailPageLightPreview() { 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)