Enforce no default value in state.

This commit is contained in:
Benoit Marty 2023-02-10 15:22:16 +01:00 committed by Benoit Marty
parent 2a0f636250
commit 23c4b9041a
17 changed files with 97 additions and 44 deletions

View file

@ -19,9 +19,15 @@ package io.element.android.features.login.changeserver
import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Async
data class ChangeServerState( data class ChangeServerState(
val homeserver: String = "", val homeserver: String,
val changeServerAction: Async<Unit> = Async.Uninitialized, val changeServerAction: Async<Unit>,
val eventSink: (ChangeServerEvents) -> Unit = {}, val eventSink: (ChangeServerEvents) -> Unit,
) { ) {
val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Async.Loading val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Async.Loading
} }
fun aChangeServerState() = ChangeServerState(
homeserver = "",
changeServerAction = Async.Uninitialized,
eventSink = {}
)

View file

@ -188,6 +188,6 @@ fun ChangeServerViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
ChangeServerView( ChangeServerView(
state = ChangeServerState(homeserver = "matrix.org"), state = aChangeServerState().copy(homeserver = "matrix.org"),
) )
} }

View file

@ -230,7 +230,7 @@ fun LoginRootScreenDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
LoginRootScreen( LoginRootScreen(
state = LoginRootState( state = aLoginRootState().copy(
homeserver = "matrix.org", homeserver = "matrix.org",
), ),
) )

View file

@ -21,10 +21,10 @@ import io.element.android.libraries.matrix.core.SessionId
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
data class LoginRootState( data class LoginRootState(
val homeserver: String = "", val homeserver: String,
val loggedInState: LoggedInState = LoggedInState.NotLoggedIn, val loggedInState: LoggedInState,
val formState: LoginFormState = LoginFormState.Default, val formState: LoginFormState,
val eventSink: (LoginRootEvents) -> Unit = {} val eventSink: (LoginRootEvents) -> Unit
) { ) {
val submitEnabled = val submitEnabled =
formState.login.isNotEmpty() && formState.password.isNotEmpty() && loggedInState != LoggedInState.LoggingIn formState.login.isNotEmpty() && formState.password.isNotEmpty() && loggedInState != LoggedInState.LoggingIn
@ -47,3 +47,10 @@ data class LoginFormState(
val Default = LoginFormState("", "") val Default = LoginFormState("", "")
} }
} }
fun aLoginRootState() = LoginRootState(
homeserver = "",
loggedInState = LoggedInState.NotLoggedIn,
formState = LoginFormState.Default,
eventSink = {}
)

View file

@ -100,5 +100,5 @@ fun LogoutPreferenceViewDarkPreview() = ElementPreviewDark { ContentToPreview()
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
LogoutPreferenceView(LogoutPreferenceState()) LogoutPreferenceView(aLogoutPreferenceState())
} }

View file

@ -19,6 +19,11 @@ package io.element.android.features.logout
import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Async
data class LogoutPreferenceState( data class LogoutPreferenceState(
val logoutAction: Async<Unit> = Async.Uninitialized, val logoutAction: Async<Unit>,
val eventSink: (LogoutPreferenceEvents) -> Unit = {}, val eventSink: (LogoutPreferenceEvents) -> Unit,
)
fun aLogoutPreferenceState() = LogoutPreferenceState(
logoutAction = Async.Uninitialized,
eventSink = {}
) )

View file

@ -17,7 +17,9 @@
package io.element.android.features.preferences.root package io.element.android.features.preferences.root
import io.element.android.features.logout.LogoutPreferenceState import io.element.android.features.logout.LogoutPreferenceState
import io.element.android.features.logout.aLogoutPreferenceState
import io.element.android.features.rageshake.preferences.RageshakePreferencesState import io.element.android.features.rageshake.preferences.RageshakePreferencesState
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Async
import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.matrix.ui.model.MatrixUser
@ -26,3 +28,9 @@ data class PreferencesRootState(
val rageshakeState: RageshakePreferencesState, val rageshakeState: RageshakePreferencesState,
val myUser: Async<MatrixUser>, val myUser: Async<MatrixUser>,
) )
fun aPreferencesRootState() = PreferencesRootState(
logoutState = aLogoutPreferenceState(),
rageshakeState = aRageshakePreferencesState(),
myUser = Async.Uninitialized
)

View file

@ -20,12 +20,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import io.element.android.features.logout.LogoutPreferenceState
import io.element.android.features.logout.LogoutPreferenceView import io.element.android.features.logout.LogoutPreferenceView
import io.element.android.features.preferences.user.UserPreferences import io.element.android.features.preferences.user.UserPreferences
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
import io.element.android.features.rageshake.preferences.RageshakePreferencesView import io.element.android.features.rageshake.preferences.RageshakePreferencesView
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.designsystem.components.preferences.PreferenceView import io.element.android.libraries.designsystem.components.preferences.PreferenceView
import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.ElementPreviewLight
@ -66,10 +63,5 @@ fun PreferencesRootViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
val state = PreferencesRootState( PreferencesRootView(aPreferencesRootState())
logoutState = LogoutPreferenceState(),
rageshakeState = RageshakePreferencesState(),
myUser = Async.Uninitialized
)
PreferencesRootView(state)
} }

View file

@ -21,12 +21,12 @@ import io.element.android.libraries.architecture.Async
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
data class BugReportState( data class BugReportState(
val formState: BugReportFormState = BugReportFormState.Default, val formState: BugReportFormState,
val hasCrashLogs: Boolean = false, val hasCrashLogs: Boolean,
val screenshotUri: String? = null, val screenshotUri: String?,
val sendingProgress: Float = 0F, val sendingProgress: Float,
val sending: Async<Unit> = Async.Uninitialized, val sending: Async<Unit>,
val eventSink: (BugReportEvents) -> Unit = {} val eventSink: (BugReportEvents) -> Unit
) { ) {
val submitEnabled = val submitEnabled =
formState.description.length > 10 && sending !is Async.Loading formState.description.length > 10 && sending !is Async.Loading
@ -50,3 +50,12 @@ data class BugReportFormState(
) )
} }
} }
fun aBugReportState() = BugReportState(
formState = BugReportFormState.Default,
hasCrashLogs = false,
screenshotUri = null,
sendingProgress = 0F,
sending = Async.Uninitialized,
eventSink = {}
)

View file

@ -218,6 +218,6 @@ fun BugReportViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
BugReportView( BugReportView(
state = BugReportState(), state = aBugReportState(),
) )
} }

View file

@ -78,6 +78,6 @@ fun CrashDetectionContentDarkPreview() = ElementPreviewDark { ContentToPreview()
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
CrashDetectionContent( CrashDetectionContent(
state = CrashDetectionState() state = aCrashDetectionState()
) )
} }

View file

@ -17,6 +17,11 @@
package io.element.android.features.rageshake.crash.ui package io.element.android.features.rageshake.crash.ui
data class CrashDetectionState( data class CrashDetectionState(
val crashDetected: Boolean = false, val crashDetected: Boolean,
val eventSink: (CrashDetectionEvents) -> Unit = {} val eventSink: (CrashDetectionEvents) -> Unit
)
fun aCrashDetectionState() = CrashDetectionState(
crashDetected = false,
eventSink = {}
) )

View file

@ -18,12 +18,21 @@ package io.element.android.features.rageshake.detection
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import io.element.android.features.rageshake.preferences.RageshakePreferencesState import io.element.android.features.rageshake.preferences.RageshakePreferencesState
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
@Stable @Stable
data class RageshakeDetectionState( data class RageshakeDetectionState(
val takeScreenshot: Boolean = false, val takeScreenshot: Boolean,
val showDialog: Boolean = false, val showDialog: Boolean,
val isStarted: Boolean = false, val isStarted: Boolean,
val preferenceState: RageshakePreferencesState = RageshakePreferencesState(), val preferenceState: RageshakePreferencesState,
val eventSink: (RageshakeDetectionEvents) -> Unit = {} val eventSink: (RageshakeDetectionEvents) -> Unit
)
fun aRageshakeDetectionState() = RageshakeDetectionState(
takeScreenshot = false,
showDialog = false,
isStarted = false,
preferenceState = aRageshakePreferencesState(),
eventSink = {}
) )

View file

@ -17,8 +17,15 @@
package io.element.android.features.rageshake.preferences package io.element.android.features.rageshake.preferences
data class RageshakePreferencesState( data class RageshakePreferencesState(
val isEnabled: Boolean = false, val isEnabled: Boolean,
val isSupported: Boolean = true, val isSupported: Boolean,
val sensitivity: Float = 0.3f, val sensitivity: Float,
val eventSink: (RageshakePreferencesEvents) -> Unit = {}, val eventSink: (RageshakePreferencesEvents) -> Unit,
)
fun aRageshakePreferencesState() = RageshakePreferencesState(
isEnabled = false,
isSupported = true,
sensitivity = 0.3f,
eventSink = {}
) )

View file

@ -85,7 +85,7 @@ fun RageshakePreferencesViewDarkPreview() = ElementPreviewDark { ContentToPrevie
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
RageshakePreferencesView(RageshakePreferencesState(isEnabled = true, isSupported = true, sensitivity = 0.5f)) RageshakePreferencesView(aRageshakePreferencesState().copy(isEnabled = true, isSupported = true, sensitivity = 0.5f))
} }
@Preview @Preview
@ -98,5 +98,5 @@ fun RageshakePreferencesViewNotSupportedDarkPreview() = ElementPreviewDark { Con
@Composable @Composable
private fun ContentNotSupportedToPreview() { private fun ContentNotSupportedToPreview() {
RageshakePreferencesView(RageshakePreferencesState(isEnabled = true, isSupported = false, sensitivity = 0.5f)) RageshakePreferencesView(aRageshakePreferencesState().copy(isEnabled = true, isSupported = false, sensitivity = 0.5f))
} }

View file

@ -17,6 +17,11 @@
package io.element.android.features.template package io.element.android.features.template
// TODO add your ui models. Remove the eventSink if you don't have events. // TODO add your ui models. Remove the eventSink if you don't have events.
// Do not use default value, so no member get forgotten in the presenters.
data class TemplateState( data class TemplateState(
val eventSink: (TemplateEvents) -> Unit = {} val eventSink: (TemplateEvents) -> Unit
)
fun aTemplateState() = TemplateState(
eventSink = {}
) )

View file

@ -50,6 +50,6 @@ fun TemplateViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
TemplateView( TemplateView(
state = TemplateState(), state = aTemplateState(),
) )
} }