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.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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<BooksViewModel>(),
 | 
			
		||||
    userViewModel: IUserViewModel = viewModel<UserViewModel>(),
 | 
			
		||||
| 
						 | 
				
			
			@ -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<MailUio> = 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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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