Skip to content

Commit

Permalink
elo
Browse files Browse the repository at this point in the history
  • Loading branch information
Tiebe committed May 24, 2023
1 parent 4c51db4 commit 7c0b512
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.arkivanov.decompose.router.stack.childStack
import com.arkivanov.decompose.router.stack.push
import com.arkivanov.decompose.value.MutableValue
import com.arkivanov.decompose.value.Value
import com.arkivanov.essenty.backhandler.BackCallback
import com.arkivanov.essenty.parcelable.Parcelable
import com.arkivanov.essenty.parcelable.Parcelize
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -40,6 +41,12 @@ interface AssignmentsChildComponent : ELOChildComponent {
@Parcelize
data class Assignment(val assignmentLink: String) : Config()
}


val onBack: MutableValue<() -> Unit>

fun registerBackHandler()
fun unregisterBackHandler()
}

class DefaultAssignmentsChildComponent(componentContext: ComponentContext) : AssignmentsChildComponent, ComponentContext by componentContext {
Expand Down Expand Up @@ -76,6 +83,33 @@ class DefaultAssignmentsChildComponent(componentContext: ComponentContext) : Ass
componentContext = componentContext,
assignmentLink = assignmentLink,
)

private val registered = MutableValue(false)
private val backCallback = BackCallback { onBack.value() }
override val onBack: MutableValue<() -> Unit> = MutableValue {}

override fun registerBackHandler() {
if (registered.value) return
backHandler.register(backCallback)
registered.value = true
}

override fun unregisterBackHandler() {
if (!registered.value) return
backHandler.unregister(backCallback)
registered.value = false
}


init {
childStack.subscribe { childStack ->
if (childStack.backStack.isEmpty()) {
unregisterBackHandler()
} else {
registerBackHandler()
}
}
}
}

interface AssignmentChildScreen
Original file line number Diff line number Diff line change
@@ -1,23 +1,71 @@
package nl.tiebe.otarium.ui.home.elo.children.assignments

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.DismissDirection
import androidx.compose.material.DismissValue
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.SwipeToDismiss
import androidx.compose.material.rememberDismissState
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState
import com.arkivanov.decompose.router.stack.pop
import kotlinx.coroutines.launch
import nl.tiebe.otarium.ui.home.elo.children.assignments.assignment.AssignmentScreen
import nl.tiebe.otarium.ui.home.elo.children.assignments.listscreen.AssignmentListScreen

@OptIn(ExperimentalMaterialApi::class)
@Composable
internal fun AssignmentsChildScreen(component: AssignmentsChildComponent) {
val child = component.childStack.subscribeAsState().value
val screen = component.childStack.subscribeAsState()
val scope = rememberCoroutineScope()

Box(modifier = Modifier.padding(start = 5.dp, end = 5.dp)) {
when (val screen = child.active.instance) {
is AssignmentsChildComponent.Child.Assignment -> AssignmentScreen(screen.component)
is AssignmentsChildComponent.Child.AssignmentList -> AssignmentListScreen(screen.component)
when (val child = screen.value.items[0].instance) {
is AssignmentsChildComponent.Child.Assignment -> AssignmentScreen(child.component)
is AssignmentsChildComponent.Child.AssignmentList -> AssignmentListScreen(child.component)
}


for (item in screen.value.items.subList(1, screen.value.items.size)) {
val state = rememberDismissState()

component.onBack.value = {
scope.launch {
state.animateTo(DismissValue.DismissedToEnd)
}
}

//pop on finish
if (state.isDismissed(DismissDirection.StartToEnd)) {
component.navigation.pop()
}

SwipeToDismiss(
state = state,
background = {
},
directions = setOf(DismissDirection.StartToEnd)
) {
Surface(Modifier.fillMaxSize()) {
when (val child = item.instance) {
is AssignmentsChildComponent.Child.Assignment -> AssignmentScreen(child.component)
is AssignmentsChildComponent.Child.AssignmentList -> AssignmentListScreen(child.component)
}
}
}
}
}



Box(modifier = Modifier.padding(start = 5.dp, end = 5.dp)) {

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.arkivanov.decompose.router.stack.childStack
import com.arkivanov.decompose.router.stack.push
import com.arkivanov.decompose.value.MutableValue
import com.arkivanov.decompose.value.Value
import com.arkivanov.essenty.backhandler.BackCallback
import com.arkivanov.essenty.parcelable.Parcelable
import com.arkivanov.essenty.parcelable.Parcelize
import dev.tiebe.magisterapi.response.studyguide.StudyGuide
Expand Down Expand Up @@ -44,6 +45,12 @@ interface StudyGuidesChildComponent : ELOChildComponent {
data class StudyGuide(val studyGuideLink: String) : Config()
}


val onBack: MutableValue<() -> Unit>

fun registerBackHandler()
fun unregisterBackHandler()

}

class DefaultStudyGuidesChildComponent(componentContext: ComponentContext) : StudyGuidesChildComponent, ComponentContext by componentContext {
Expand Down Expand Up @@ -81,6 +88,33 @@ class DefaultStudyGuidesChildComponent(componentContext: ComponentContext) : Stu
componentContext = componentContext,
studyGuideLink = studyGuideLink,
)

private val registered = MutableValue(false)
private val backCallback = BackCallback { onBack.value() }
override val onBack: MutableValue<() -> Unit> = MutableValue {}

override fun registerBackHandler() {
if (registered.value) return
backHandler.register(backCallback)
registered.value = true
}

override fun unregisterBackHandler() {
if (!registered.value) return
backHandler.unregister(backCallback)
registered.value = false
}


init {
childStack.subscribe { childStack ->
if (childStack.backStack.isEmpty()) {
unregisterBackHandler()
} else {
registerBackHandler()
}
}
}
}

interface StudyGuideChildScreen
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,58 @@ package nl.tiebe.otarium.ui.home.elo.children.studyguides

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material.DismissDirection
import androidx.compose.material.DismissValue
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.SwipeToDismiss
import androidx.compose.material.rememberDismissState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState
import com.arkivanov.decompose.router.stack.pop
import kotlinx.coroutines.launch
import nl.tiebe.otarium.ui.home.elo.children.studyguides.folder.StudyGuideFolderScreen
import nl.tiebe.otarium.ui.home.elo.children.studyguides.listscreen.StudyGuideListScreen

@OptIn(ExperimentalMaterialApi::class)
@Composable
internal fun StudyGuidesChildScreen(component: StudyGuidesChildComponent) {
val child = component.childStack.subscribeAsState().value
val screen = component.childStack.subscribeAsState()
val scope = rememberCoroutineScope()

Box(modifier = Modifier.padding(start = 5.dp, end = 5.dp)) {
when (val screen = child.active.instance) {
is StudyGuidesChildComponent.Child.StudyGuideListChild -> StudyGuideListScreen(screen.component)
is StudyGuidesChildComponent.Child.FolderChild -> StudyGuideFolderScreen(screen.component)
when (val child = screen.value.items[0].instance) {
is StudyGuidesChildComponent.Child.StudyGuideListChild -> StudyGuideListScreen(child.component)
is StudyGuidesChildComponent.Child.FolderChild -> StudyGuideFolderScreen(child.component)
}

for (item in screen.value.items.subList(1, screen.value.items.size)) {
val state = rememberDismissState()

component.onBack.value = {
scope.launch {
state.animateTo(DismissValue.DismissedToEnd)
}
}

//pop on finish
if (state.isDismissed(DismissDirection.StartToEnd)) {
component.navigation.pop()
}

SwipeToDismiss(
state = state,
background = {
},
directions = setOf(DismissDirection.StartToEnd)
) {
when (val child = item.instance) {
is StudyGuidesChildComponent.Child.StudyGuideListChild -> StudyGuideListScreen(child.component)
is StudyGuidesChildComponent.Child.FolderChild -> StudyGuideFolderScreen(child.component)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ interface SettingsComponent: MenuItemComponent {

val navigateRootComponent: (RootComponent.ChildScreen) -> Unit

val onBack: MutableValue<() -> Unit>

fun navigate(child: Config) {
navigation.push(child)
Expand Down Expand Up @@ -73,6 +72,8 @@ interface SettingsComponent: MenuItemComponent {
object Colors : Config(getLocalizedString(MR.strings.color_settings))
}

val onBack: MutableValue<() -> Unit>

fun registerBackHandler()
fun unregisterBackHandler()
}
Expand Down

0 comments on commit 7c0b512

Please sign in to comment.