Add a poorly done bottomsheet mail selector on the detail page.
This commit is contained in:
parent
6254ec4f02
commit
38c67504b2
5 changed files with 97 additions and 24 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.pixelized.biblib.ui.data
|
||||||
|
|
||||||
|
data class MailUio(
|
||||||
|
val mail: String,
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.pixelized.biblib.utils.extention
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
|
||||||
|
fun logC(message: String): Int = Log.v("Composition", message)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue