diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt index 2c54a05..66ab463 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/common/Image.kt @@ -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 diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/items/BookItem.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/items/BookItem.kt index 275397d..fd9b746 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/items/BookItem.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/items/BookItem.kt @@ -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 diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPage.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPage.kt index 3f2e836..30dd30a 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPage.kt @@ -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(), userViewModel: IUserViewModel = viewModel(), @@ -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 = 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() { diff --git a/app/src/main/java/com/pixelized/biblib/ui/data/MailUio.kt b/app/src/main/java/com/pixelized/biblib/ui/data/MailUio.kt new file mode 100644 index 0000000..d9c17cc --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/ui/data/MailUio.kt @@ -0,0 +1,5 @@ +package com.pixelized.biblib.ui.data + +data class MailUio( + val mail: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt new file mode 100644 index 0000000..85fe020 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt @@ -0,0 +1,5 @@ +package com.pixelized.biblib.utils.extention + +import android.util.Log + +fun logC(message: String): Int = Log.v("Composition", message) \ No newline at end of file