Add send eBook through mail feature.

This commit is contained in:
Thomas Andres Gomez 2021-12-10 13:41:23 +01:00
parent 38c67504b2
commit 82aa5ec62a
2 changed files with 50 additions and 65 deletions

View file

@ -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))
} }
} }

View file

@ -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 {