Skip to content

Commit

Permalink
Merge pull request DroidKaigi#741 from Corvus400/feature/introduce-er…
Browse files Browse the repository at this point in the history
…ror-handring-to-contributors

♻️ Update Introduce error handring to contributors
  • Loading branch information
takahirom authored Sep 26, 2022
2 parents d024cea + 4fe77ca commit 339defa
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,30 @@ package io.github.droidkaigi.confsched2022.data.contributors
import io.github.droidkaigi.confsched2022.model.Contributor
import io.github.droidkaigi.confsched2022.model.ContributorsRepository
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.callbackFlow

// TODO: Move to core-testing, once contributors server is created
public class DataContributorsRepository(
private val contributorsApi: ContributorsApi,
) : ContributorsRepository {
private val contributorsStateFlow =
MutableStateFlow<PersistentList<Contributor>>(persistentListOf())

override fun contributors(): Flow<PersistentList<Contributor>> {
return callbackFlow {
send(
contributorsApi
.contributors()
.toPersistentList()
)
awaitClose { }
contributorsStateFlow.collect {
send(it)
}
}
}

override suspend fun refresh() {
TODO("Not yet implemented")
contributorsStateFlow.value = contributorsApi
.contributors()
.toPersistentList()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,5 @@ public class FakeContributorsRepository : ContributorsRepository {
}

override suspend fun refresh() {
TODO("Not yet implemented")
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.droidkaigi.confsched2022.feature.announcement
package io.github.droidkaigi.confsched2022.feature.common

import androidx.compose.material3.SnackbarDuration.Long
import androidx.compose.material3.SnackbarHostState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import io.github.droidkaigi.confsched2022.designsystem.components.KaigiScaffold
import io.github.droidkaigi.confsched2022.designsystem.components.KaigiTopAppBar
import io.github.droidkaigi.confsched2022.designsystem.theme.KaigiColors
import io.github.droidkaigi.confsched2022.designsystem.theme.KaigiTheme
import io.github.droidkaigi.confsched2022.feature.common.AppErrorSnackbarEffect
import io.github.droidkaigi.confsched2022.model.AnnouncementsByDate
import io.github.droidkaigi.confsched2022.model.fakes
import io.github.droidkaigi.confsched2022.strings.Strings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
Expand All @@ -19,6 +21,7 @@ import io.github.droidkaigi.confsched2022.designsystem.components.KaigiScaffold
import io.github.droidkaigi.confsched2022.designsystem.components.KaigiTopAppBar
import io.github.droidkaigi.confsched2022.designsystem.components.UsernameRow
import io.github.droidkaigi.confsched2022.designsystem.theme.KaigiTheme
import io.github.droidkaigi.confsched2022.feature.common.AppErrorSnackbarEffect
import io.github.droidkaigi.confsched2022.model.Contributor
import io.github.droidkaigi.confsched2022.model.fakes
import io.github.droidkaigi.confsched2022.strings.Strings
Expand All @@ -38,6 +41,8 @@ fun ContributorsScreenRoot(
uiModel = uiModel,
showNavigationIcon = showNavigationIcon,
onNavigationIconClick = onNavigationIconClick,
onRetryButtonClick = { viewModel.onRetryButtonClick() },
onAppErrorNotified = { viewModel.onAppErrorNotified() },
onLinkClick = onLinkClick
)
}
Expand All @@ -47,10 +52,15 @@ fun Contributors(
uiModel: ContributorsUiModel,
showNavigationIcon: Boolean,
onNavigationIconClick: () -> Unit,
onRetryButtonClick: () -> Unit,
onAppErrorNotified: () -> Unit,
onLinkClick: (url: String, packageName: String?) -> Unit,
modifier: Modifier = Modifier,
) {
val snackbarHostState = remember { SnackbarHostState() }

KaigiScaffold(
snackbarHostState = snackbarHostState,
modifier = modifier,
topBar = {
KaigiTopAppBar(
Expand All @@ -64,9 +74,17 @@ fun Contributors(
)
}
) { innerPadding ->
AppErrorSnackbarEffect(
appError = uiModel.appError,
snackBarHostState = snackbarHostState,
onAppErrorNotified = onAppErrorNotified,
onRetryButtonClick = onRetryButtonClick
)
Box {
when (uiModel.state) {
is Error -> TODO()
is Error -> {
// Do nothing
}
Loading -> Box(
modifier = Modifier.padding(innerPadding).fillMaxSize(),
contentAlignment = Alignment.Center,
Expand Down Expand Up @@ -103,10 +121,13 @@ fun ContributorsPreview() {
uiModel = ContributorsUiModel(
state = Success(
Contributor.fakes()
)
),
appError = null,
),
showNavigationIcon = true,
onNavigationIconClick = {},
onRetryButtonClick = {},
onAppErrorNotified = {},
onLinkClick = { _, _ -> },
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package io.github.droidkaigi.confsched2022.feature.contributors

import io.github.droidkaigi.confsched2022.model.AppError
import io.github.droidkaigi.confsched2022.model.Contributor
import io.github.droidkaigi.confsched2022.ui.UiLoadState
import kotlinx.collections.immutable.PersistentList

data class ContributorsUiModel(val state: UiLoadState<PersistentList<Contributor>>)
data class ContributorsUiModel(
val state: UiLoadState<PersistentList<Contributor>>,
val appError: AppError?
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,64 @@ package io.github.droidkaigi.confsched2022.feature.contributors
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.cash.molecule.AndroidUiDispatcher
import app.cash.molecule.RecompositionClock.ContextClock
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.droidkaigi.confsched2022.model.AppError
import io.github.droidkaigi.confsched2022.model.ContributorsRepository
import io.github.droidkaigi.confsched2022.ui.UiLoadState
import io.github.droidkaigi.confsched2022.ui.asLoadState
import io.github.droidkaigi.confsched2022.ui.moleculeComposeState
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class ContributorsViewModel @Inject constructor(
contributorsRepository: ContributorsRepository,
private val contributorsRepository: ContributorsRepository,
) : ViewModel() {
private val moleculeScope =
CoroutineScope(viewModelScope.coroutineContext + AndroidUiDispatcher.Main)

val uiModel: State<ContributorsUiModel>
private val contributorsFlow = contributorsRepository
.contributors()
.asLoadState()

private var appError by mutableStateOf<AppError?>(null)

val uiModel: State<ContributorsUiModel> = moleculeScope.moleculeComposeState(
clock = ContextClock
) {
val contributorLoadState by contributorsFlow.collectAsState(initial = UiLoadState.Loading)
ContributorsUiModel(
state = contributorLoadState,
appError = appError
)
}

init {
val dataFlow = contributorsRepository.contributors().asLoadState()
refresh()
}

uiModel = moleculeScope.moleculeComposeState(clock = ContextClock) {
val data by dataFlow.collectAsState(initial = UiLoadState.Loading)
ContributorsUiModel(data)
fun onRetryButtonClick() {
refresh()
}

private fun refresh() {
viewModelScope.launch {
try {
contributorsRepository.refresh()
} catch (e: AppError) {
appError = e
}
}
}

fun onAppErrorNotified() {
appError = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ import dev.icerock.moko.resources.compose.stringResource
import io.github.droidkaigi.confsched2022.designsystem.components.KaigiScaffold
import io.github.droidkaigi.confsched2022.designsystem.components.KaigiTopAppBar
import io.github.droidkaigi.confsched2022.designsystem.theme.KaigiTheme
import io.github.droidkaigi.confsched2022.feature.announcement.AppErrorSnackbarEffect
import io.github.droidkaigi.confsched2022.feature.common.AppErrorSnackbarEffect
import io.github.droidkaigi.confsched2022.model.DroidKaigi2022Day
import io.github.droidkaigi.confsched2022.model.DroidKaigiSchedule
import io.github.droidkaigi.confsched2022.model.TimetableItemId
Expand Down

0 comments on commit 339defa

Please sign in to comment.