Change type of NotificationSettingsState.currentPushDistributor from AsyncAction to AsyncData
This commit is contained in:
parent
144895d5b4
commit
306b779ca5
5 changed files with 20 additions and 16 deletions
|
|
@ -27,6 +27,7 @@ import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncAction
|
||||||
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.architecture.runCatchingUpdatingState
|
import io.element.android.libraries.architecture.runCatchingUpdatingState
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
|
|
@ -90,16 +91,16 @@ class NotificationSettingsPresenter @Inject constructor(
|
||||||
distributors.map { it.second.name }.toImmutableList()
|
distributors.map { it.second.name }.toImmutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentDistributorName by remember { mutableStateOf<AsyncAction<String>>(AsyncAction.Uninitialized) }
|
var currentDistributorName by remember { mutableStateOf<AsyncData<String>>(AsyncData.Uninitialized) }
|
||||||
var refreshPushProvider by remember { mutableIntStateOf(0) }
|
var refreshPushProvider by remember { mutableIntStateOf(0) }
|
||||||
|
|
||||||
LaunchedEffect(refreshPushProvider) {
|
LaunchedEffect(refreshPushProvider) {
|
||||||
val p = pushService.getCurrentPushProvider()
|
val p = pushService.getCurrentPushProvider()
|
||||||
val name = p?.getCurrentDistributor(matrixClient)?.name
|
val name = p?.getCurrentDistributor(matrixClient)?.name
|
||||||
currentDistributorName = if (name != null) {
|
currentDistributorName = if (name != null) {
|
||||||
AsyncAction.Success(name)
|
AsyncData.Success(name)
|
||||||
} else {
|
} else {
|
||||||
AsyncAction.Failure(Exception("Failed to get current push provider"))
|
AsyncData.Failure(Exception("Failed to get current push provider"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -112,7 +113,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
||||||
data ?: return@launch
|
data ?: return@launch
|
||||||
// No op if the value is the same.
|
// No op if the value is the same.
|
||||||
if (data.second.name == currentDistributorName.dataOrNull()) return@launch
|
if (data.second.name == currentDistributorName.dataOrNull()) return@launch
|
||||||
currentDistributorName = AsyncAction.Loading
|
currentDistributorName = AsyncData.Loading(currentDistributorName.dataOrNull())
|
||||||
data.let { (pushProvider, distributor) ->
|
data.let { (pushProvider, distributor) ->
|
||||||
pushService.registerWith(
|
pushService.registerWith(
|
||||||
matrixClient = matrixClient,
|
matrixClient = matrixClient,
|
||||||
|
|
@ -124,7 +125,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
||||||
refreshPushProvider++
|
refreshPushProvider++
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
currentDistributorName = AsyncAction.Failure(it)
|
currentDistributorName = AsyncData.Failure(it)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.notifications
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncAction
|
||||||
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
|
|
@ -26,7 +27,7 @@ data class NotificationSettingsState(
|
||||||
val matrixSettings: MatrixSettings,
|
val matrixSettings: MatrixSettings,
|
||||||
val appSettings: AppSettings,
|
val appSettings: AppSettings,
|
||||||
val changeNotificationSettingAction: AsyncAction<Unit>,
|
val changeNotificationSettingAction: AsyncAction<Unit>,
|
||||||
val currentPushDistributor: AsyncAction<String>,
|
val currentPushDistributor: AsyncData<String>,
|
||||||
val availablePushDistributors: ImmutableList<String>,
|
val availablePushDistributors: ImmutableList<String>,
|
||||||
val showChangePushProviderDialog: Boolean,
|
val showChangePushProviderDialog: Boolean,
|
||||||
val eventSink: (NotificationSettingsEvents) -> Unit,
|
val eventSink: (NotificationSettingsEvents) -> Unit,
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.notifications
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncAction
|
||||||
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
@ -35,8 +36,8 @@ open class NotificationSettingsStateProvider : PreviewParameterProvider<Notifica
|
||||||
),
|
),
|
||||||
aValidNotificationSettingsState(availablePushDistributors = listOf("Firebase")),
|
aValidNotificationSettingsState(availablePushDistributors = listOf("Firebase")),
|
||||||
aValidNotificationSettingsState(showChangePushProviderDialog = true),
|
aValidNotificationSettingsState(showChangePushProviderDialog = true),
|
||||||
aValidNotificationSettingsState(currentPushDistributor = AsyncAction.Loading),
|
aValidNotificationSettingsState(currentPushDistributor = AsyncData.Loading()),
|
||||||
aValidNotificationSettingsState(currentPushDistributor = AsyncAction.Failure(Exception("Failed to change distributor"))),
|
aValidNotificationSettingsState(currentPushDistributor = AsyncData.Failure(Exception("Failed to change distributor"))),
|
||||||
aInvalidNotificationSettingsState(),
|
aInvalidNotificationSettingsState(),
|
||||||
aInvalidNotificationSettingsState(fixFailed = true),
|
aInvalidNotificationSettingsState(fixFailed = true),
|
||||||
)
|
)
|
||||||
|
|
@ -49,7 +50,7 @@ fun aValidNotificationSettingsState(
|
||||||
inviteForMeNotificationsEnabled: Boolean = true,
|
inviteForMeNotificationsEnabled: Boolean = true,
|
||||||
systemNotificationsEnabled: Boolean = true,
|
systemNotificationsEnabled: Boolean = true,
|
||||||
appNotificationEnabled: Boolean = true,
|
appNotificationEnabled: Boolean = true,
|
||||||
currentPushDistributor: AsyncAction<String> = AsyncAction.Success("Firebase"),
|
currentPushDistributor: AsyncData<String> = AsyncData.Success("Firebase"),
|
||||||
availablePushDistributors: List<String> = listOf("Firebase", "ntfy"),
|
availablePushDistributors: List<String> = listOf("Firebase", "ntfy"),
|
||||||
showChangePushProviderDialog: Boolean = false,
|
showChangePushProviderDialog: Boolean = false,
|
||||||
eventSink: (NotificationSettingsEvents) -> Unit = {},
|
eventSink: (NotificationSettingsEvents) -> Unit = {},
|
||||||
|
|
@ -84,7 +85,7 @@ fun aInvalidNotificationSettingsState(
|
||||||
appNotificationsEnabled = true,
|
appNotificationsEnabled = true,
|
||||||
),
|
),
|
||||||
changeNotificationSettingAction = AsyncAction.Uninitialized,
|
changeNotificationSettingAction = AsyncAction.Uninitialized,
|
||||||
currentPushDistributor = AsyncAction.Uninitialized,
|
currentPushDistributor = AsyncData.Uninitialized,
|
||||||
availablePushDistributors = persistentListOf(),
|
availablePushDistributors = persistentListOf(),
|
||||||
showChangePushProviderDialog = false,
|
showChangePushProviderDialog = false,
|
||||||
eventSink = eventSink,
|
eventSink = eventSink,
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import androidx.lifecycle.Lifecycle
|
||||||
import io.element.android.compound.tokens.generated.CompoundIcons
|
import io.element.android.compound.tokens.generated.CompoundIcons
|
||||||
import io.element.android.features.preferences.impl.R
|
import io.element.android.features.preferences.impl.R
|
||||||
import io.element.android.libraries.androidutils.system.startNotificationSettingsIntent
|
import io.element.android.libraries.androidutils.system.startNotificationSettingsIntent
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.designsystem.atomic.molecules.DialogLikeBannerMolecule
|
import io.element.android.libraries.designsystem.atomic.molecules.DialogLikeBannerMolecule
|
||||||
import io.element.android.libraries.designsystem.components.async.AsyncActionView
|
import io.element.android.libraries.designsystem.components.async.AsyncActionView
|
||||||
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
|
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
|
||||||
|
|
@ -188,9 +188,8 @@ private fun NotificationSettingsContentView(
|
||||||
Text(text = stringResource(id = R.string.screen_advanced_settings_push_provider_android))
|
Text(text = stringResource(id = R.string.screen_advanced_settings_push_provider_android))
|
||||||
},
|
},
|
||||||
trailingContent = when (state.currentPushDistributor) {
|
trailingContent = when (state.currentPushDistributor) {
|
||||||
AsyncAction.Uninitialized,
|
AsyncData.Uninitialized,
|
||||||
AsyncAction.Confirming,
|
is AsyncData.Loading -> ListItemContent.Custom {
|
||||||
AsyncAction.Loading -> ListItemContent.Custom {
|
|
||||||
CircularProgressIndicator(
|
CircularProgressIndicator(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.progressSemantics()
|
.progressSemantics()
|
||||||
|
|
@ -198,10 +197,10 @@ private fun NotificationSettingsContentView(
|
||||||
strokeWidth = 2.dp
|
strokeWidth = 2.dp
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is AsyncAction.Failure -> ListItemContent.Text(
|
is AsyncData.Failure -> ListItemContent.Text(
|
||||||
stringResource(id = CommonStrings.common_error)
|
stringResource(id = CommonStrings.common_error)
|
||||||
)
|
)
|
||||||
is AsyncAction.Success -> ListItemContent.Text(
|
is AsyncData.Success -> ListItemContent.Text(
|
||||||
state.currentPushDistributor.dataOrNull() ?: ""
|
state.currentPushDistributor.dataOrNull() ?: ""
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ sealed interface AsyncData<out T> {
|
||||||
fun isSuccess(): Boolean = this is Success<T>
|
fun isSuccess(): Boolean = this is Success<T>
|
||||||
|
|
||||||
fun isUninitialized(): Boolean = this == Uninitialized
|
fun isUninitialized(): Boolean = this == Uninitialized
|
||||||
|
|
||||||
|
fun isReady() = isSuccess() || isFailure()
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend inline fun <T> MutableState<AsyncData<T>>.runCatchingUpdatingState(
|
suspend inline fun <T> MutableState<AsyncData<T>>.runCatchingUpdatingState(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue