Add send eBook through mail feature.
This commit is contained in:
parent
38c67504b2
commit
82aa5ec62a
2 changed files with 50 additions and 65 deletions
|
|
@ -1,11 +1,6 @@
|
||||||
package com.pixelized.biblib.ui.composable.pages
|
package com.pixelized.biblib.ui.composable.pages
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
|
||||||
import androidx.compose.animation.ExperimentalAnimationApi
|
import androidx.compose.animation.ExperimentalAnimationApi
|
||||||
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.clickable
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
|
|
@ -20,7 +15,7 @@ import androidx.compose.material.icons.filled.Send
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
|
|
@ -40,7 +35,6 @@ import com.pixelized.biblib.ui.composable.common.HtmlText
|
||||||
import com.pixelized.biblib.ui.composable.common.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.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
|
||||||
|
|
@ -50,10 +44,11 @@ import com.pixelized.biblib.ui.viewmodel.user.UserViewModel
|
||||||
import com.pixelized.biblib.utils.BitmapCache
|
import com.pixelized.biblib.utils.BitmapCache
|
||||||
import com.pixelized.biblib.utils.injection.ServiceLocator
|
import com.pixelized.biblib.utils.injection.ServiceLocator
|
||||||
import com.pixelized.biblib.utils.mock.BookMock
|
import com.pixelized.biblib.utils.mock.BookMock
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
@OptIn(ExperimentalMaterialApi::class, ExperimentalAnimationApi::class)
|
||||||
fun DetailPage(
|
fun DetailPage(
|
||||||
booksViewModel: IBooksViewModel = viewModel<BooksViewModel>(),
|
booksViewModel: IBooksViewModel = viewModel<BooksViewModel>(),
|
||||||
userViewModel: IUserViewModel = viewModel<UserViewModel>(),
|
userViewModel: IUserViewModel = viewModel<UserViewModel>(),
|
||||||
|
|
@ -65,46 +60,41 @@ fun DetailPage(
|
||||||
.fillMaxHeight(),
|
.fillMaxHeight(),
|
||||||
elevation = 4.dp
|
elevation = 4.dp
|
||||||
) {
|
) {
|
||||||
val bottomSheetVisibility = remember { MutableTransitionState(false) }
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
|
||||||
|
|
||||||
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 {
|
ModalBottomSheetLayout(
|
||||||
DetailPage(
|
sheetState = sheetState,
|
||||||
book = it,
|
sheetContent = {
|
||||||
onSendClick = {
|
SendMailBottomSheet(
|
||||||
val emailCount = user?.amazonEmails?.size ?: 0
|
user?.amazonEmails?.map { MailUio(it) } ?: listOf(),
|
||||||
when {
|
onItemClick = {
|
||||||
emailCount == 1 -> {
|
booksViewModel.send(id = bookId, mail = it.mail)
|
||||||
val email: String? = user?.amazonEmails?.firstOrNull()
|
},
|
||||||
email?.let { mail -> booksViewModel.send(id = bookId, mail = mail) }
|
)
|
||||||
}
|
},
|
||||||
emailCount > 1 -> {
|
|
||||||
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(
|
book?.let {
|
||||||
user?.amazonEmails?.map { MailUio(it) } ?: listOf(),
|
DetailPage(
|
||||||
onItemClick = { booksViewModel.send(id = bookId, mail = it.mail) },
|
book = it,
|
||||||
onOutsideClick = { bottomSheetVisibility.targetState = false }
|
onSendClick = {
|
||||||
)
|
val emailCount = user?.amazonEmails?.size ?: 0
|
||||||
|
when {
|
||||||
|
emailCount == 1 -> {
|
||||||
|
val email: String? = user?.amazonEmails?.firstOrNull()
|
||||||
|
email?.let { mail -> booksViewModel.send(id = bookId, mail = mail) }
|
||||||
|
}
|
||||||
|
emailCount > 1 -> {
|
||||||
|
coroutineScope.launch { sheetState.show() }
|
||||||
|
}
|
||||||
|
else -> Unit // TODO warning popup, no email.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -250,34 +240,27 @@ private fun SendMailBottomSheet(
|
||||||
MailUio("R.Daneel.Olivaw.Kindle@gmailcom"),
|
MailUio("R.Daneel.Olivaw.Kindle@gmailcom"),
|
||||||
),
|
),
|
||||||
onItemClick: (MailUio) -> Unit = {},
|
onItemClick: (MailUio) -> Unit = {},
|
||||||
onOutsideClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val typography = MaterialTheme.typography
|
val typography = MaterialTheme.typography
|
||||||
|
|
||||||
Box(
|
Column(
|
||||||
contentAlignment = Alignment.BottomCenter,
|
modifier = Modifier.fillMaxWidth(),
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.fillMaxHeight()
|
|
||||||
.clickable { onOutsideClick() },
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Text(
|
||||||
modifier = Modifier.background(MaterialTheme.colors.background)
|
modifier = Modifier
|
||||||
|
.padding(horizontal = 16.dp)
|
||||||
|
.padding(top = 8.dp),
|
||||||
|
style = typography.caption,
|
||||||
|
text = "Send this eBook to:",
|
||||||
|
)
|
||||||
|
LazyColumn(
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(
|
items(data.size) { index: Int ->
|
||||||
modifier = Modifier.padding(horizontal = 16.dp).padding(top = 8.dp),
|
SendMailItem(uio = data[index], onClick = onItemClick)
|
||||||
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))
|
|
||||||
}
|
}
|
||||||
|
Spacer(modifier = Modifier.height(16.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,9 @@ class BooksViewModel : ViewModel(), IBooksViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun send(id: Int, mail: String) {
|
override fun send(id: Int, mail: String) {
|
||||||
// TODO()
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
client.service.send(bookId = id, mail = mail)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun loadNewBooks(): Boolean {
|
private suspend fun loadNewBooks(): Boolean {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue