Add the send to kindle feature.

This commit is contained in:
Thomas Andres Gomez 2022-07-21 14:01:48 +02:00
parent 3c75c7a990
commit f14c2258f6
8 changed files with 103 additions and 18 deletions

View file

@ -38,7 +38,10 @@ fun DetailBottomSheet(
scrimColor = ShadowPalette.scrim, scrimColor = ShadowPalette.scrim,
sheetState = bottomDetailState.bottomSheetState, sheetState = bottomDetailState.bottomSheetState,
sheetContent = { sheetContent = {
DetailScreen(detail = bottomDetailState.bookDetail) DetailScreen(
viewModel = bottomDetailState.viewModel,
detail = bottomDetailState.bookDetail,
)
}, },
content = content, content = content,
) )
@ -77,8 +80,8 @@ fun rememberDetailBottomSheetState(
@Stable @Stable
class DetailBottomSheetState constructor( class DetailBottomSheetState constructor(
private val context: Context, private val context: Context,
private val viewModel: BookDetailViewModel,
private val scope: CoroutineScope, private val scope: CoroutineScope,
val viewModel: BookDetailViewModel,
val bottomSheetState: ModalBottomSheetState, val bottomSheetState: ModalBottomSheetState,
bookDetail: MutableState<BookDetailUio?>, bookDetail: MutableState<BookDetailUio?>,
) { ) {

View file

@ -28,6 +28,10 @@ class BookDetailViewModel @Inject constructor(
} }
} }
suspend fun send(bookId: Int, mail: String) {
client.service.send(bookId = bookId, mail = mail)
}
private suspend fun getBookDetail(id: Int): BookDetailUio { private suspend fun getBookDetail(id: Int): BookDetailUio {
val factory = BookFactory() val factory = BookFactory()
val response = client.service.detail(id) val response = client.service.detail(id)

View file

@ -18,6 +18,7 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@ -41,12 +42,14 @@ import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.theme.color.ShadowPalette import com.pixelized.biblib.ui.theme.color.ShadowPalette
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default import com.pixelized.biblib.utils.extention.default
import com.pixelized.biblib.utils.extention.showToast
import com.skydoves.landscapist.CircularReveal import com.skydoves.landscapist.CircularReveal
import com.skydoves.landscapist.glide.GlideImage import com.skydoves.landscapist.glide.GlideImage
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.Serializable import java.io.Serializable
@Stable @Stable
@Immutable
data class BookDetailUio( data class BookDetailUio(
val id: Int, val id: Int,
val title: String, val title: String,
@ -64,8 +67,10 @@ data class BookDetailUio(
fun DetailScreen( fun DetailScreen(
detailState: DetailBottomSheetState = LocalDetailBottomSheetState.current, detailState: DetailBottomSheetState = LocalDetailBottomSheetState.current,
profileViewModel: ProfileViewModel = hiltViewModel(), profileViewModel: ProfileViewModel = hiltViewModel(),
viewModel: BookDetailViewModel = hiltViewModel(),
detail: BookDetailUio? = null, detail: BookDetailUio? = null,
) { ) {
val context = LocalContext.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val sheet = rememberModalBottomSheetState( val sheet = rememberModalBottomSheetState(
initialValue = ModalBottomSheetValue.Hidden, initialValue = ModalBottomSheetValue.Hidden,
@ -82,13 +87,20 @@ fun DetailScreen(
.heightIn(min = 1.dp) .heightIn(min = 1.dp)
.animateContentSize() .animateContentSize()
) { ) {
val user by derivedStateOf { profileViewModel.user } val user = profileViewModel.user
if (user.isSuccessful()) { if (user.isSuccessful()) {
DetailScreenSendContent( DetailScreenSendContent(
modifier = Modifier modifier = Modifier
.navigationBarsPadding() .navigationBarsPadding()
.padding(bottom = MaterialTheme.bibLib.dimen.dp16), .padding(bottom = MaterialTheme.bibLib.dimen.dp16),
emails = (user as StateUio.Success<UserUio>).value.amazonEmails, emails = user.value.amazonEmails,
onEmail = { mail ->
detail?.id?.let { bookId ->
scope.launch {
viewModel.send(bookId = bookId, mail = mail)
}
}
}
) )
} }
} }
@ -99,7 +111,28 @@ fun DetailScreen(
DetailScreenContent( DetailScreenContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
book = detail, book = detail,
onSend = { scope.launch { sheet.show() } } onSend = {
// check
val user = profileViewModel.user
if (user.isSuccessful()) {
val mails = user.value.amazonEmails
when {
mails.isEmpty() -> {
context.showToast(context.getString(R.string.error_no_amazon_email),)
}
mails.size == 1 -> {
scope.launch {
viewModel.send(bookId = detail.id, mail = mails.first())
}
}
else -> {
scope.launch { sheet.show() }
}
}
} else {
// TODO()
}
}
) )
} else { } else {
Box(modifier = Modifier.fillMaxSize()) Box(modifier = Modifier.fillMaxSize())

View file

@ -5,29 +5,19 @@ import android.content.res.Configuration.UI_MODE_NIGHT_YES
import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.spring import androidx.compose.animation.core.spring
import androidx.compose.foundation.horizontalScroll
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.material.* import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.paging.LoadState
import androidx.paging.PagingData import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.items import androidx.paging.compose.items
import com.pixelized.biblib.ui.scaffold.LocalCategorySearchBottomSheetState import com.pixelized.biblib.ui.scaffold.LocalCategorySearchBottomSheetState
@ -36,8 +26,8 @@ import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel
import com.pixelized.biblib.ui.scaffold.SearchFilter import com.pixelized.biblib.ui.scaffold.SearchFilter
import com.pixelized.biblib.ui.screen.home.common.item.MicroBookThumbnail import com.pixelized.biblib.ui.screen.home.common.item.MicroBookThumbnail
import com.pixelized.biblib.ui.screen.home.common.item.MicroBookThumbnailUio import com.pixelized.biblib.ui.screen.home.common.item.MicroBookThumbnailUio
import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnail import com.pixelized.biblib.ui.screen.home.page.search.item.SearchFilter
import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio import com.pixelized.biblib.ui.screen.home.page.search.item.rememberSearchFilter
import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default import com.pixelized.biblib.utils.extention.default

View file

@ -1,4 +1,4 @@
package com.pixelized.biblib.ui.screen.home.page.search package com.pixelized.biblib.ui.screen.home.page.search.item
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.horizontalScroll
@ -18,6 +18,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel
import com.pixelized.biblib.ui.scaffold.SearchFilter import com.pixelized.biblib.ui.scaffold.SearchFilter
import com.pixelized.biblib.ui.screen.home.page.search.SearchViewModel
import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default import com.pixelized.biblib.utils.extention.default

View file

@ -0,0 +1,52 @@
package com.pixelized.biblib.ui.screen.home.page.search.item
import android.content.res.Configuration
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.History
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib
@Composable
fun SearchHistory() {
SearchHistoryContent(
label = ""
)
}
@Composable
private fun SearchHistoryContent(
modifier: Modifier = Modifier,
label : String,
) {
Row(
modifier = modifier.padding(all = MaterialTheme.bibLib.dimen.dp16)
) {
Icon(
modifier = Modifier.padding(end = MaterialTheme.bibLib.dimen.dp8),
imageVector = Icons.Default.History,
contentDescription = null,
)
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.body1,
text = label,
)
}
}
@Composable
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun SearchHistoryContentPreview() {
BibLibTheme {
SearchHistoryContentPreview()
}
}

View file

@ -20,6 +20,7 @@
<string name="error_authentication">Oups, la connection a échoué !</string> <string name="error_authentication">Oups, la connection a échoué !</string>
<string name="error_book">Oups! le téléchargement de la librairy à échoué !</string> <string name="error_book">Oups! le téléchargement de la librairy à échoué !</string>
<string name="error_offline">Vous êtes hors ligne.</string> <string name="error_offline">Vous êtes hors ligne.</string>
<string name="error_no_amazon_email">Vous n\'avez aucun mail lié à votre compte. Merci de vous rendre sur https://bib.bibulle.fr/ et d\'éditez voter profile pour en ajouter un.</string>
<string name="loading_authentication">Ouverture de BibLibrary.</string> <string name="loading_authentication">Ouverture de BibLibrary.</string>
<string name="loading_book">Téléchargement de BibLibrary.</string> <string name="loading_book">Téléchargement de BibLibrary.</string>

View file

@ -26,6 +26,7 @@
<string name="error_authentication">Oops, connection failed!</string> <string name="error_authentication">Oops, connection failed!</string>
<string name="error_book">Oops! library download failed!</string> <string name="error_book">Oops! library download failed!</string>
<string name="error_offline">You are offline.</string> <string name="error_offline">You are offline.</string>
<string name="error_no_amazon_email">You have no email linked to your account. Please go to https://bib.bibulle.fr/ and edit your profile to add one.</string>
<string name="loading_authentication">Opening the BibLibrary.</string> <string name="loading_authentication">Opening the BibLibrary.</string>
<string name="loading_book">Downloading the BibLibrary.</string> <string name="loading_book">Downloading the BibLibrary.</string>