Skip to content

Commit

Permalink
prepare next navigation implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed May 5, 2024
1 parent 6fcc17a commit 04a864a
Show file tree
Hide file tree
Showing 24 changed files with 139 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class AiringTodayRepository(
page = p,
nsfw = n,
)
}
}.distinctUntilChanged()

private val airingPreFilter = query.transform {
return@transform emitAll(apolloClient.query(it.toGraphQL()).toFlow())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class PopularNextSeasonRepository(
season = season,
year = year
)
}
}.distinctUntilChanged()
private val fallbackQuery = query.transform {
return@transform emitAll(fallbackClient.query(it.toGraphQL()).toFlow())
}.mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class PopularSeasonRepository(
type = t,
nsfw = n
)
}
}.distinctUntilChanged()
private val fallbackQuery = query.transform {
return@transform emitAll(fallbackClient.query(it.toGraphQL()).toFlow())
}.mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class TrendingRepository(
type = t,
nsfw = n
)
}
}.distinctUntilChanged()
private val fallbackQuery = query.transform {
return@transform emitAll(fallbackClient.query(it.toGraphQL()).toFlow())
}.mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.datlag.aniflow.ui.navigation.screen.initial.settings.component
package dev.datlag.aniflow.ui.navigation.screen.settings.component

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,12 @@ data object StateSaver {
popularNextLoading.update { false }
return state
}

fun updateAllLoading() {
airingLoading.update { true }
trendingLoading.update { true }
popularCurrentLoading.update { true }
popularNextLoading.update { true }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
package dev.datlag.aniflow.ui.navigation

import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.layout
import com.arkivanov.decompose.ComponentContext
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.stack.Children
import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.predictiveBackAnimation
import com.arkivanov.decompose.extensions.compose.stack.animation.slide
import com.arkivanov.decompose.extensions.compose.stack.animation.stackAnimation
import com.arkivanov.decompose.extensions.compose.stack.animation.stackAnimator
import com.arkivanov.decompose.router.stack.*
import dev.datlag.aniflow.common.onRender
import dev.datlag.aniflow.model.ifValueOrNull
import dev.datlag.aniflow.other.UserHelper
import dev.datlag.aniflow.ui.navigation.screen.initial.InitialScreenComponent
import dev.datlag.aniflow.ui.navigation.screen.medium.MediumScreenComponent
import dev.datlag.aniflow.ui.navigation.screen.settings.SettingsScreen
import dev.datlag.aniflow.ui.navigation.screen.settings.SettingsScreenComponent
import io.github.aakira.napier.Napier
import org.kodein.di.DI
import org.kodein.di.instance

Expand Down Expand Up @@ -40,6 +48,9 @@ class RootComponent(
di = di,
onMediumDetails = {
navigation.push(RootConfig.Details(it))
},
onProfile = {
navigation.push(RootConfig.Settings)
}
)
is RootConfig.Details -> MediumScreenComponent(
Expand All @@ -48,6 +59,10 @@ class RootComponent(
initialMedium = rootConfig.medium,
onBack = navigation::pop
)
is RootConfig.Settings -> SettingsScreenComponent(
componentContext = componentContext,
di = di
)
}
}

Expand All @@ -59,9 +74,40 @@ class RootComponent(
stack = stack,
animation = predictiveBackAnimation(
backHandler = this.backHandler,
fallbackAnimation = stackAnimation(
animator = slide()
),
fallbackAnimation = stackAnimation { child ->
when (child.configuration) {
is RootConfig.Settings -> stackAnimator(tween()) { factor, _, content ->
content(
Modifier.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)

layout(placeable.width, placeable.height) {
placeable.placeRelative(y = -(placeable.height.toFloat() * factor).toInt(), x = 0)
}
}
)
}
is RootConfig.Home -> {
val current = stack.value.active

when (current.configuration) {
is RootConfig.Settings -> stackAnimator(tween()) { factor, _, content ->
content(
Modifier.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)

layout(placeable.width, placeable.height) {
placeable.placeRelative(y = -(placeable.height.toFloat() * factor).toInt(), x = 0)
}
}
)
}
else -> slide()
}
}
else -> slide()
}
},
onBack = {
navigation.pop()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ sealed class RootConfig {
data class Details(val medium: Medium) : RootConfig() {
constructor(id: Int) : this(Medium(id))
}

@Serializable
data object Settings : RootConfig()
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ interface InitialComponent : Component {
val pages: Value<ChildPages<View, Component>>

fun selectPage(index: Int)
fun viewProfile()
fun viewAnime()
fun viewManga()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,27 @@ import dev.datlag.aniflow.anilist.model.Medium
import dev.datlag.aniflow.anilist.type.MediaType
import dev.datlag.aniflow.common.onRender
import dev.datlag.aniflow.model.coroutines.Executor
import dev.datlag.aniflow.other.StateSaver
import dev.datlag.aniflow.settings.Settings
import dev.datlag.aniflow.ui.navigation.Component
import dev.datlag.aniflow.ui.navigation.ContentHolderComponent
import dev.datlag.aniflow.ui.navigation.screen.initial.favorites.FavoritesScreenComponent
import dev.datlag.aniflow.ui.navigation.screen.initial.home.HomeScreenComponent
import dev.datlag.aniflow.ui.navigation.screen.initial.settings.SettingsScreenComponent
import dev.datlag.aniflow.ui.navigation.screen.settings.SettingsScreenComponent
import kotlinx.coroutines.flow.map
import org.kodein.di.DI
import org.kodein.di.instance

class InitialScreenComponent(
componentContext: ComponentContext,
override val di: DI,
private val onMediumDetails: (Medium) -> Unit
private val onMediumDetails: (Medium) -> Unit,
private val onProfile: () -> Unit
) : InitialComponent, ComponentContext by componentContext {

private val appSettings by di.instance<Settings.PlatformAppSettings>()

override val pagerItems: List<InitialComponent.PagerItem> = listOf(
InitialComponent.PagerItem(
label = SharedRes.strings.profile,
icon = Icons.Filled.AccountCircle
),
InitialComponent.PagerItem(
label = SharedRes.strings.home,
icon = Icons.Default.Home
Expand All @@ -59,11 +57,10 @@ class InitialScreenComponent(
initialPages = {
Pages(
items = listOf(
View.Settings,
View.Home,
View.Favorites
),
selectedIndex = 1
selectedIndex = 0
)
},
childFactory = ::createChild
Expand Down Expand Up @@ -99,10 +96,6 @@ class InitialScreenComponent(
di = di,
onMediumDetails = onMediumDetails
)
is View.Settings -> SettingsScreenComponent(
componentContext = componentContext,
di = di
)
is View.Favorites -> FavoritesScreenComponent(
componentContext = componentContext,
di = di
Expand All @@ -119,7 +112,12 @@ class InitialScreenComponent(
}
}

override fun viewProfile() {
onProfile()
}

override fun viewAnime() {
StateSaver.Home.updateAllLoading()
launchIO {
viewTypeExecutor.enqueue {
appSettings.setViewManga(false)
Expand All @@ -128,6 +126,7 @@ class InitialScreenComponent(
}

override fun viewManga() {
StateSaver.Home.updateAllLoading()
launchIO {
viewTypeExecutor.enqueue {
appSettings.setViewManga(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ sealed class View {
@Serializable
data object Home : View()

@Serializable
data object Settings : View()

@Serializable
data object Favorites : View()
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ fun CompactScreen(component: InitialComponent) {
scrollBehavior = scrollBehavior,
viewTypeFlow = component.viewing,
onProfileClick = {

component.viewProfile()
},
onAnimeClick = {
component.viewAnime()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,44 @@ import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.dp
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import dev.datlag.aniflow.common.isScrollingUp
import dev.datlag.aniflow.ui.custom.ExpandedPages
import dev.datlag.aniflow.ui.navigation.screen.initial.InitialComponent
import dev.datlag.aniflow.ui.navigation.screen.initial.home.component.CollapsingToolbar
import dev.datlag.aniflow.ui.navigation.screen.initial.model.FABConfig
import dev.datlag.tooling.compose.EndCornerShape
import dev.icerock.moko.resources.compose.stringResource

@OptIn(ExperimentalDecomposeApi::class)
@OptIn(ExperimentalDecomposeApi::class, ExperimentalMaterial3Api::class)
@Composable
fun ExpandedScreen(component: InitialComponent) {
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
state = appBarState
)

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
CollapsingToolbar(
state = appBarState,
scrollBehavior = scrollBehavior,
viewTypeFlow = component.viewing,
onProfileClick = {
component.viewProfile()
},
onAnimeClick = {
component.viewAnime()
},
onMangaClick = {
component.viewManga()
}
)
},
floatingActionButton = {
val state by FABConfig.state

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,42 @@ import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import dev.datlag.aniflow.common.isScrollingUp
import dev.datlag.aniflow.ui.custom.ExpandedPages
import dev.datlag.aniflow.ui.navigation.screen.initial.InitialComponent
import dev.datlag.aniflow.ui.navigation.screen.initial.home.component.CollapsingToolbar
import dev.datlag.aniflow.ui.navigation.screen.initial.model.FABConfig
import dev.icerock.moko.resources.compose.stringResource

@OptIn(ExperimentalDecomposeApi::class)
@OptIn(ExperimentalDecomposeApi::class, ExperimentalMaterial3Api::class)
@Composable
fun MediumScreen(component: InitialComponent) {
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
state = appBarState
)

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
CollapsingToolbar(
state = appBarState,
scrollBehavior = scrollBehavior,
viewTypeFlow = component.viewing,
onProfileClick = {
component.viewProfile()
},
onAnimeClick = {
component.viewAnime()
},
onMangaClick = {
component.viewManga()
}
)
},
floatingActionButton = {
val state by FABConfig.state

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.datlag.aniflow.ui.navigation.screen.initial.settings
package dev.datlag.aniflow.ui.navigation.screen.settings

import dev.datlag.aniflow.anilist.model.User
import dev.datlag.aniflow.ui.navigation.Component
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.datlag.aniflow.ui.navigation.screen.initial.settings
package dev.datlag.aniflow.ui.navigation.screen.settings

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
Expand All @@ -23,7 +23,7 @@ import dev.datlag.aniflow.SharedRes
import dev.datlag.aniflow.common.plus
import dev.datlag.aniflow.other.Constants
import dev.datlag.aniflow.other.StateSaver
import dev.datlag.aniflow.ui.navigation.screen.initial.settings.component.*
import dev.datlag.aniflow.ui.navigation.screen.settings.component.*
import dev.datlag.tooling.compose.onClick
import dev.datlag.tooling.decompose.lifecycle.collectAsStateWithLifecycle
import dev.icerock.moko.resources.compose.painterResource
Expand All @@ -38,7 +38,7 @@ fun SettingsScreen(component: SettingsComponent) {

LazyColumn(
state = listState,
modifier = Modifier.fillMaxWidth().haze(state = LocalHaze.current),
modifier = Modifier.fillMaxWidth(),
contentPadding = LocalPaddingValues.current?.plus(padding) ?: padding,
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.datlag.aniflow.ui.navigation.screen.initial.settings
package dev.datlag.aniflow.ui.navigation.screen.settings

import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ComponentContext
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.datlag.aniflow.ui.navigation.screen.initial.settings.component
package dev.datlag.aniflow.ui.navigation.screen.settings.component

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
Expand Down
Loading

0 comments on commit 04a864a

Please sign in to comment.