diff --git a/build.gradle b/build.gradle index fceef9b6a..c8e04dda0 100644 --- a/build.gradle +++ b/build.gradle @@ -105,6 +105,12 @@ allprojects { excludeGroup("Kotlin/Native") } } + maven { + url 'https://oss.jfrog.org/artifactory/oss-snapshot-local' + content { + excludeGroup("Kotlin/Native") + } + } } tasks.matching { it instanceof Test }.all { testLogging { diff --git a/buildSrc/src/main/java/dependencies/Dep.kt b/buildSrc/src/main/java/dependencies/Dep.kt index d121828f8..05d6903f7 100644 --- a/buildSrc/src/main/java/dependencies/Dep.kt +++ b/buildSrc/src/main/java/dependencies/Dep.kt @@ -91,6 +91,14 @@ object Dep { val serializationIos = "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.10.0" } + object Arrow { + val version = "0.9.0-SNAPSHOT" + val typeclasses = "io.arrow-kt:arrow-typeclasses:$version" + val data = "io.arrow-kt:arrow-effects-data:$version" + val extensions = "io.arrow-kt:arrow-effects-extensions:$version" + val ioExtensions = "io.arrow-kt:arrow-effects-io-extensions:$version" + } + object Firebase { val core = "com.google.firebase:firebase-core:16.0.4" val fireStore = "com.google.firebase:firebase-firestore:17.1.3" diff --git a/feature/session/build.gradle b/feature/session/build.gradle index 65b230b53..cb7933e7e 100644 --- a/feature/session/build.gradle +++ b/feature/session/build.gradle @@ -27,6 +27,11 @@ dependencies { api Dep.Kotlin.coroutines implementation Dep.Kotlin.androidCoroutinesDispatcher + implementation Dep.Arrow.extensions + api Dep.Arrow.data + implementation Dep.Arrow.typeclasses + implementation Dep.Arrow.ioExtensions + implementation Dep.AndroidX.appCompat implementation Dep.AndroidX.fragment implementation Dep.AndroidX.constraint diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt index b95681513..5aa2d2b25 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt @@ -34,6 +34,8 @@ import io.github.droidkaigi.confsched2019.session.ui.widget.DaggerFragment import io.github.droidkaigi.confsched2019.user.store.UserStore import io.github.droidkaigi.confsched2019.util.ProgressTimeLatch import me.tatarka.injectedvmprovider.InjectedViewModelProviders +import timber.log.Timber +import timber.log.debug import javax.inject.Inject import javax.inject.Provider @@ -87,6 +89,7 @@ class SessionPagesFragment : DaggerFragment() { sessionPagesActionCreator.load(sessionContentsStore.sessions) } sessionContentsStore.loadingState.changed(viewLifecycleOwner) { loadingState -> + Timber.debug { "Fragment:$loadingState" } progressTimeLatch.loading = loadingState.isLoading } sessionPagesStore.sessionScrollAdjusted.observe(viewLifecycleOwner) { diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt index 57ed78745..6400b9eee 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt @@ -1,6 +1,15 @@ package io.github.droidkaigi.confsched2019.session.ui.actioncreator import androidx.lifecycle.Lifecycle +import arrow.Kind +import arrow.core.Either +import arrow.core.getOrHandle +import arrow.core.left +import arrow.effects.ForIO +import arrow.effects.IO +import arrow.effects.extensions.io.async.async +import arrow.effects.extensions.io.fx.fx +import arrow.effects.fix import io.github.droidkaigi.confsched2019.action.Action import io.github.droidkaigi.confsched2019.data.repository.SessionRepository import io.github.droidkaigi.confsched2019.di.PageScope @@ -13,6 +22,7 @@ import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.system.actioncreator.ErrorHandler import io.github.droidkaigi.confsched2019.util.SessionAlarm import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.launch import timber.log.Timber import timber.log.debug @@ -66,27 +76,48 @@ class SessionContentsActionCreator @Inject constructor( } fun toggleFavorite(session: Session) { - launch { - try { + fx { + !effect { dispatcher.dispatchLoadingState(LoadingState.LOADING) sessionRepository.toggleFavorite(session) sessionAlarm.toggleRegister(session) val sessionContents = sessionRepository.sessionContents() dispatcher.dispatch(Action.SessionContentsLoaded(sessionContents)) - dispatcher.dispatchLoadingState(LoadingState.LOADED) - } catch (e: Exception) { - dispatcher.dispatch( + LoadingState.LOADED + } + }.runAndHold { result -> + val state = result.getOrHandle { + dispatcher.launchAndDispatch( Action.ShowProcessingMessage( Message.of( R.string.session_favorite_connection_error ) ) ) + LoadingState.INITIALIZED } + dispatcher.launchAndDispatchLoadingState(state) + } + } + + @UseExperimental(InternalCoroutinesApi::class) + private fun Kind.runAndHold(result: (Either) -> Unit) { + IO.async().run { + defer(coroutineContext) { + this@runAndHold + } + }.fix().attempt().unsafeRunAsync { + result.invoke(it.getOrHandle { it.left() }) } } private suspend fun Dispatcher.dispatchLoadingState(loadingState: LoadingState) { + println("Fragment: Dispatch $loadingState") dispatch(Action.SessionLoadingStateChanged(loadingState)) } + + private fun Dispatcher.launchAndDispatchLoadingState(loadingState: LoadingState) { + println("Fragment: Dispatch $loadingState") + launchAndDispatch(Action.SessionLoadingStateChanged(loadingState)) + } }