Add some code for drawer.
This commit is contained in:
		
							parent
							
								
									83098df743
								
							
						
					
					
						commit
						5053ac7360
					
				
					 7 changed files with 60 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -21,6 +21,7 @@ fun Image(
 | 
			
		|||
    modifier: Modifier = Modifier,
 | 
			
		||||
    contentModifier: Modifier = Modifier,
 | 
			
		||||
    alignment: Alignment = Alignment.Center,
 | 
			
		||||
    placeHolderScale: ContentScale = ContentScale.Fit,
 | 
			
		||||
    contentScale: ContentScale = ContentScale.Fit,
 | 
			
		||||
    alpha: Float = DefaultAlpha,
 | 
			
		||||
    colorFilter: ColorFilter? = null
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +35,7 @@ fun Image(
 | 
			
		|||
                contentDescription = contentDescription,
 | 
			
		||||
                modifier = contentModifier,
 | 
			
		||||
                alignment = alignment,
 | 
			
		||||
                contentScale = contentScale,
 | 
			
		||||
                contentScale = placeHolderScale,
 | 
			
		||||
                alpha = alpha,
 | 
			
		||||
                colorFilter = colorFilter,
 | 
			
		||||
            )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,6 @@ import androidx.compose.runtime.livedata.observeAsState
 | 
			
		|||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.focus.focusModifier
 | 
			
		||||
import androidx.compose.ui.graphics.ColorFilter
 | 
			
		||||
import androidx.compose.ui.layout.ContentScale
 | 
			
		||||
import androidx.compose.ui.platform.LocalContext
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +72,7 @@ fun DetailPageComposable(book: BookUio) {
 | 
			
		|||
                .wrapContentHeight()
 | 
			
		||||
                .padding(vertical = 16.dp)
 | 
			
		||||
                .clip(RoundedCornerShape(16.dp)),
 | 
			
		||||
            placeHolderScale = ContentScale.FillWidth,
 | 
			
		||||
            contentScale = ContentScale.FillWidth,
 | 
			
		||||
            placeHolder = painterResource(id = R.drawable.ic_launcher_foreground),
 | 
			
		||||
            contentUrl = book.cover,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ import androidx.compose.foundation.layout.wrapContentHeight
 | 
			
		|||
import androidx.compose.foundation.lazy.LazyColumn
 | 
			
		||||
import androidx.compose.foundation.lazy.rememberLazyListState
 | 
			
		||||
import androidx.compose.foundation.rememberScrollState
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.*
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.paging.compose.LazyPagingItems
 | 
			
		||||
| 
						 | 
				
			
			@ -26,10 +26,17 @@ import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigab
 | 
			
		|||
fun HomePageComposable(
 | 
			
		||||
    navigationViewModel: INavigationViewModel,
 | 
			
		||||
    booksViewModel: IBooksViewModel,
 | 
			
		||||
    page: Page?,
 | 
			
		||||
) {
 | 
			
		||||
    var currentPage by remember { mutableStateOf<Page.Home?>(null) }
 | 
			
		||||
    currentPage = page as? Page.Home ?: currentPage
 | 
			
		||||
 | 
			
		||||
    // https://issuetracker.google.com/issues/177245496
 | 
			
		||||
    val lazyBooks: LazyPagingItems<BookThumbnailUio> =
 | 
			
		||||
        booksViewModel.news.collectAsLazyPagingItems()
 | 
			
		||||
    val data: LazyPagingItems<BookThumbnailUio> = when(currentPage) {
 | 
			
		||||
        is Page.Home.New -> booksViewModel.books.collectAsLazyPagingItems()
 | 
			
		||||
        else -> booksViewModel.news.collectAsLazyPagingItems()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    val lazyListState = rememberLazyListState()
 | 
			
		||||
    val scrollableState = rememberScrollState()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +46,7 @@ fun HomePageComposable(
 | 
			
		|||
        verticalArrangement = Arrangement.spacedBy(8.dp),
 | 
			
		||||
        state = lazyListState,
 | 
			
		||||
    ) {
 | 
			
		||||
        items(lazyBooks) { thumbnail ->
 | 
			
		||||
        items(data) { thumbnail ->
 | 
			
		||||
            BookThumbnailComposable(
 | 
			
		||||
                thumbnail = thumbnail!!,
 | 
			
		||||
                modifier = Modifier
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,15 +64,12 @@ fun LoginScreenComposable(
 | 
			
		|||
    authenticationViewModel: IAuthenticationViewModel = viewModel<AuthenticationViewModel>(),
 | 
			
		||||
    bookViewModel: IBooksViewModel = viewModel<BooksViewModel>()
 | 
			
		||||
) {
 | 
			
		||||
    // TODO:
 | 
			
		||||
    LaunchedEffect("merde") {
 | 
			
		||||
        authenticationViewModel.clearState()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Box(
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .fillMaxWidth()
 | 
			
		||||
            .fillMaxHeight()
 | 
			
		||||
    ) {
 | 
			
		||||
    Box(modifier = Modifier.fillMaxSize()) {
 | 
			
		||||
        authenticationViewModel.PrepareLoginWithGoogle()
 | 
			
		||||
        LoginScreenNavigationComposable(
 | 
			
		||||
            navigationViewModel,
 | 
			
		||||
| 
						 | 
				
			
			@ -91,8 +88,7 @@ private fun LoginScreenContentComposable(
 | 
			
		|||
) {
 | 
			
		||||
    Column(
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .fillMaxWidth()
 | 
			
		||||
            .fillMaxHeight()
 | 
			
		||||
            .fillMaxSize()
 | 
			
		||||
            .verticalScroll(rememberScrollState())
 | 
			
		||||
            .padding(16.dp)
 | 
			
		||||
    ) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,11 +45,12 @@ fun MainScreenComposable(
 | 
			
		|||
    // coroutine
 | 
			
		||||
    val coroutineScope = rememberCoroutineScope()
 | 
			
		||||
    // scaffold & toolbar
 | 
			
		||||
    val canNavigateBack = page !is Page.HomePage
 | 
			
		||||
    val canNavigateBack = page !is Page.Home
 | 
			
		||||
    val scaffoldState = rememberScaffoldState()
 | 
			
		||||
 | 
			
		||||
    // TODO:
 | 
			
		||||
    LaunchedEffect(key1 = "MainScreen", block = {
 | 
			
		||||
        navigationViewModel.navigateTo(Page.HomePage, true)
 | 
			
		||||
        navigationViewModel.navigateTo(Page.Home.New, true)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    Scaffold(
 | 
			
		||||
| 
						 | 
				
			
			@ -65,11 +66,30 @@ fun MainScreenComposable(
 | 
			
		|||
                }
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
        drawerContent = { DrawerContentComposable() }
 | 
			
		||||
        drawerContent = {
 | 
			
		||||
            DrawerContentComposable(
 | 
			
		||||
                onNewClick = {
 | 
			
		||||
                    coroutineScope.launch { scaffoldState.drawerState.close() }
 | 
			
		||||
                },
 | 
			
		||||
                onBookClick = {
 | 
			
		||||
                    coroutineScope.launch { scaffoldState.drawerState.close() }
 | 
			
		||||
                },
 | 
			
		||||
                onSeriesClick = {
 | 
			
		||||
                    coroutineScope.launch { scaffoldState.drawerState.close() }
 | 
			
		||||
                },
 | 
			
		||||
                onAuthorClick = {
 | 
			
		||||
                    coroutineScope.launch { scaffoldState.drawerState.close() }
 | 
			
		||||
                },
 | 
			
		||||
                onTagClick = {
 | 
			
		||||
                    coroutineScope.launch { scaffoldState.drawerState.close() }
 | 
			
		||||
                },
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    ) {
 | 
			
		||||
        HomePageComposable(
 | 
			
		||||
            navigationViewModel = navigationViewModel,
 | 
			
		||||
            booksViewModel = booksViewModel,
 | 
			
		||||
            page = page,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        AnimatedVisibility(
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +158,13 @@ fun NavigationIcon(
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun DrawerContentComposable() {
 | 
			
		||||
fun DrawerContentComposable(
 | 
			
		||||
    onNewClick: () -> Unit,
 | 
			
		||||
    onBookClick: () -> Unit,
 | 
			
		||||
    onSeriesClick: () -> Unit,
 | 
			
		||||
    onAuthorClick: () -> Unit,
 | 
			
		||||
    onTagClick: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    val typography = MaterialTheme.typography
 | 
			
		||||
    Column(
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
| 
						 | 
				
			
			@ -168,27 +194,27 @@ fun DrawerContentComposable() {
 | 
			
		|||
        DrawerLink(
 | 
			
		||||
            text = "Nouveautés",
 | 
			
		||||
            imageVector = Icons.Default.NewReleases,
 | 
			
		||||
            onClick = {},
 | 
			
		||||
            onClick = onNewClick,
 | 
			
		||||
        )
 | 
			
		||||
        DrawerLink(
 | 
			
		||||
            text = "Livres",
 | 
			
		||||
            imageVector = Icons.Default.AutoStories,
 | 
			
		||||
            onClick = {},
 | 
			
		||||
            onClick = onBookClick,
 | 
			
		||||
        )
 | 
			
		||||
        DrawerLink(
 | 
			
		||||
            text = "Séries",
 | 
			
		||||
            imageVector = Icons.Default.AutoAwesomeMotion,
 | 
			
		||||
            onClick = {},
 | 
			
		||||
            onClick = onSeriesClick,
 | 
			
		||||
        )
 | 
			
		||||
        DrawerLink(
 | 
			
		||||
            text = "Auteurs",
 | 
			
		||||
            imageVector = Icons.Default.SupervisorAccount,
 | 
			
		||||
            onClick = {},
 | 
			
		||||
            onClick = onAuthorClick,
 | 
			
		||||
        )
 | 
			
		||||
        DrawerLink(
 | 
			
		||||
            text = "Étiquettes",
 | 
			
		||||
            imageVector = Icons.Default.LocalOffer,
 | 
			
		||||
            onClick = {},
 | 
			
		||||
            onClick = onTagClick,
 | 
			
		||||
        )
 | 
			
		||||
        Spacer(modifier = Modifier.weight(1f))
 | 
			
		||||
        Text(
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +278,7 @@ fun ToolbarComposableLightPreview() {
 | 
			
		|||
fun MainScreenComposablePreview() {
 | 
			
		||||
    BibLibTheme {
 | 
			
		||||
        MainScreenComposable(
 | 
			
		||||
            INavigationViewModel.Mock(page = Page.HomePage),
 | 
			
		||||
            INavigationViewModel.Mock(page = Page.Home.New),
 | 
			
		||||
            IBooksViewModel.Mock()
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,14 +19,17 @@ interface INavigationViewModel {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        sealed class Page : Navigable() {
 | 
			
		||||
            object HomePage : Page()
 | 
			
		||||
            sealed class Home : Page() {
 | 
			
		||||
                object New: Home()
 | 
			
		||||
                object All: Home()
 | 
			
		||||
            }
 | 
			
		||||
            data class Detail(val bookId: Int) : Page()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class Mock(
 | 
			
		||||
        screen: Navigable.Screen = Navigable.Screen.SplashScreen,
 | 
			
		||||
        page: Navigable.Page = Navigable.Page.HomePage
 | 
			
		||||
        page: Navigable.Page = Navigable.Page.Home.New
 | 
			
		||||
    ) : INavigationViewModel {
 | 
			
		||||
        override val screen: LiveData<Navigable.Screen> = MutableLiveData(screen)
 | 
			
		||||
        override val page: LiveData<Navigable.Page> = MutableLiveData(page)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ import java.util.*
 | 
			
		|||
class NavigationViewModel : ViewModel(), INavigationViewModel {
 | 
			
		||||
    private val stack = Stack<Navigable?>()
 | 
			
		||||
    private val _screen = MutableLiveData<Screen>(Screen.SplashScreen)
 | 
			
		||||
    private val _page = MutableLiveData<Page>(Page.HomePage)
 | 
			
		||||
    private val _page = MutableLiveData<Page>()
 | 
			
		||||
 | 
			
		||||
    override val screen: LiveData<Screen> get() = _screen
 | 
			
		||||
    override val page: LiveData<Page> get() = _page
 | 
			
		||||
| 
						 | 
				
			
			@ -49,8 +49,7 @@ class NavigationViewModel : ViewModel(), INavigationViewModel {
 | 
			
		|||
        return if (stack.isEmpty()) {
 | 
			
		||||
            null
 | 
			
		||||
        } else {
 | 
			
		||||
            stack.pop()
 | 
			
		||||
            while (stack.isNotEmpty() && stack.peek() == null) stack.pop()
 | 
			
		||||
            do stack.pop() while (stack.isNotEmpty() && stack.peek() == null)
 | 
			
		||||
            return if (stack.isNotEmpty()) stack.peek() else null
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue