mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-04 01:19:33 +00:00
Address PR review comments
This commit is contained in:
-4
@@ -22,7 +22,6 @@ import androidx.compose.foundation.text.input.TextFieldState
|
|||||||
import androidx.compose.foundation.text.input.clearText
|
import androidx.compose.foundation.text.input.clearText
|
||||||
import androidx.compose.foundation.text.input.maxLength
|
import androidx.compose.foundation.text.input.maxLength
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.minimumInteractiveComponentSize
|
|
||||||
import androidx.compose.material3.rememberModalBottomSheetState
|
import androidx.compose.material3.rememberModalBottomSheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
@@ -121,9 +120,6 @@ private fun EmptyStatusRow(
|
|||||||
modifier = Modifier.padding(vertical = 16.dp),
|
modifier = Modifier.padding(vertical = 16.dp),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
trailingContent = ListItemContent.Custom({
|
|
||||||
Box(modifier = Modifier.minimumInteractiveComponentSize())
|
|
||||||
}),
|
|
||||||
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())),
|
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())),
|
||||||
modifier = modifier.clickable(onClick = onClick),
|
modifier = modifier.clickable(onClick = onClick),
|
||||||
)
|
)
|
||||||
|
|||||||
+10
-30
@@ -7,13 +7,11 @@
|
|||||||
|
|
||||||
package io.element.android.features.preferences.impl.userstatus
|
package io.element.android.features.preferences.impl.userstatus
|
||||||
|
|
||||||
import app.cash.molecule.RecompositionMode
|
|
||||||
import app.cash.molecule.moleculeFlow
|
|
||||||
import app.cash.turbine.test
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.libraries.matrix.api.user.DisplayedStatus
|
import io.element.android.libraries.matrix.api.user.DisplayedStatus
|
||||||
import io.element.android.libraries.matrix.api.user.UserStatus
|
import io.element.android.libraries.matrix.api.user.UserStatus
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
|
import io.element.android.tests.testutils.test
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
@@ -23,9 +21,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `initial state - no status set`() = runTest {
|
fun `initial state - no status set`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
assertThat(state.displayedStatus).isNull()
|
assertThat(state.displayedStatus).isNull()
|
||||||
assertThat(state.pickerState).isEqualTo(UserStatusPickerState.Hidden)
|
assertThat(state.pickerState).isEqualTo(UserStatusPickerState.Hidden)
|
||||||
@@ -34,9 +30,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Open event transitions to ShowingPicker`() = runTest {
|
fun `Open event transitions to ShowingPicker`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
state.eventSink(UserStatusEvent.OpenPicker)
|
state.eventSink(UserStatusEvent.OpenPicker)
|
||||||
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.ShowingPicker)
|
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.ShowingPicker)
|
||||||
@@ -45,9 +39,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Dismiss event from ShowingPicker goes back to Hidden`() = runTest {
|
fun `Dismiss event from ShowingPicker goes back to Hidden`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
state.eventSink(UserStatusEvent.OpenPicker)
|
state.eventSink(UserStatusEvent.OpenPicker)
|
||||||
awaitItem() // ShowingPicker
|
awaitItem() // ShowingPicker
|
||||||
@@ -59,9 +51,7 @@ class UserStatusPresenterTest {
|
|||||||
@Test
|
@Test
|
||||||
fun `Set event calls setUserStatus and transitions to Hidden with updated status`() = runTest {
|
fun `Set event calls setUserStatus and transitions to Hidden with updated status`() = runTest {
|
||||||
val client = FakeMatrixClient()
|
val client = FakeMatrixClient()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter(client).test {
|
||||||
createPresenter(client).present()
|
|
||||||
}.test {
|
|
||||||
val status = UserStatus(emoji = "💬", text = "In a meeting")
|
val status = UserStatus(emoji = "💬", text = "In a meeting")
|
||||||
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
||||||
val newState = awaitItem()
|
val newState = awaitItem()
|
||||||
@@ -73,9 +63,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `OpenCustomInput with no existing status uses defaults`() = runTest {
|
fun `OpenCustomInput with no existing status uses defaults`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
val pickerState = state.pickerState as UserStatusPickerState.CustomInput
|
val pickerState = state.pickerState as UserStatusPickerState.CustomInput
|
||||||
@@ -87,9 +75,7 @@ class UserStatusPresenterTest {
|
|||||||
@Test
|
@Test
|
||||||
fun `OpenCustomInput with existing rawStatus pre-fills values`() = runTest {
|
fun `OpenCustomInput with existing rawStatus pre-fills values`() = runTest {
|
||||||
val client = FakeMatrixClient()
|
val client = FakeMatrixClient()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter(client).test {
|
||||||
createPresenter(client).present()
|
|
||||||
}.test {
|
|
||||||
val status = UserStatus(emoji = "🌴", text = "Away")
|
val status = UserStatus(emoji = "🌴", text = "Away")
|
||||||
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
||||||
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
|
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
|
||||||
@@ -103,9 +89,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `UpdateCustomEmoji updates emoji in CustomInput state`() = runTest {
|
fun `UpdateCustomEmoji updates emoji in CustomInput state`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
||||||
awaitItem().eventSink(UserStatusEvent.UpdateCustomEmoji("🚀"))
|
awaitItem().eventSink(UserStatusEvent.UpdateCustomEmoji("🚀"))
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
@@ -115,9 +99,7 @@ class UserStatusPresenterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `CancelCustomInput goes back to Hidden`() = runTest {
|
fun `CancelCustomInput goes back to Hidden`() = runTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter().test {
|
||||||
createPresenter().present()
|
|
||||||
}.test {
|
|
||||||
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
|
||||||
awaitItem().eventSink(UserStatusEvent.CancelCustomInput) // CustomInput state, fire Cancel
|
awaitItem().eventSink(UserStatusEvent.CancelCustomInput) // CustomInput state, fire Cancel
|
||||||
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.Hidden)
|
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.Hidden)
|
||||||
@@ -127,9 +109,7 @@ class UserStatusPresenterTest {
|
|||||||
@Test
|
@Test
|
||||||
fun `Clear event calls clearUserStatus and clears displayed status`() = runTest {
|
fun `Clear event calls clearUserStatus and clears displayed status`() = runTest {
|
||||||
val client = FakeMatrixClient()
|
val client = FakeMatrixClient()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
createPresenter(client).test {
|
||||||
createPresenter(client).present()
|
|
||||||
}.test {
|
|
||||||
val status = UserStatus(emoji = "☕", text = "Be right back")
|
val status = UserStatus(emoji = "☕", text = "Be right back")
|
||||||
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
awaitItem().eventSink(UserStatusEvent.SetStatus(status))
|
||||||
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
|
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
|
||||||
|
|||||||
+1
@@ -456,6 +456,7 @@ class RustMatrixClient(
|
|||||||
displayedStatus = localUserStatus?.let { DisplayedStatus.UserSet(it) },
|
displayedStatus = localUserStatus?.let { DisplayedStatus.UserSet(it) },
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
// Also update our session storage
|
||||||
sessionStore.updateUserProfile(
|
sessionStore.updateUserProfile(
|
||||||
sessionId = sessionId.value,
|
sessionId = sessionId.value,
|
||||||
displayName = matrixUser.displayName,
|
displayName = matrixUser.displayName,
|
||||||
|
|||||||
Reference in New Issue
Block a user