Skip to content

Commit 603deb7

Browse files
committed
knock requests : refine and clean banner
1 parent 350a9c0 commit 603deb7

File tree

10 files changed

+205
-157
lines changed

10 files changed

+205
-157
lines changed

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,13 @@ import javax.inject.Inject
1717
@ContributesBinding(RoomScope::class)
1818
class DefaultKnockRequestsBannerRenderer @Inject constructor(
1919
private val presenter: KnockRequestsBannerPresenter,
20-
): KnockRequestsBannerRenderer {
21-
20+
) : KnockRequestsBannerRenderer {
2221
@Composable
2322
override fun View(modifier: Modifier, onViewRequestsClick: () -> Unit) {
2423
val state = presenter.present()
2524
KnockRequestsBannerView(
2625
state = state,
27-
onDismissClick = {},
2826
onViewRequestsClick = onViewRequestsClick,
2927
)
3028
}
31-
3229
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.features.knockrequests.impl.banner
9+
10+
import io.element.android.features.knockrequests.impl.KnockRequest
11+
12+
sealed interface KnockRequestsBannerEvents {
13+
data class Accept(val knockRequest: KnockRequest) : KnockRequestsBannerEvents
14+
data object Dismiss : KnockRequestsBannerEvents
15+
}

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,35 @@
88
package io.element.android.features.knockrequests.impl.banner
99

1010
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.getValue
12+
import androidx.compose.runtime.mutableStateOf
13+
import androidx.compose.runtime.remember
14+
import androidx.compose.runtime.setValue
15+
import io.element.android.libraries.architecture.AsyncAction
1116
import io.element.android.libraries.architecture.Presenter
17+
import kotlinx.collections.immutable.persistentListOf
1218
import javax.inject.Inject
1319

14-
class KnockRequestsBannerPresenter @Inject constructor(): Presenter<KnockRequestsBannerState> {
20+
class KnockRequestsBannerPresenter @Inject constructor() : Presenter<KnockRequestsBannerState> {
1521
@Composable
1622
override fun present(): KnockRequestsBannerState {
17-
return KnockRequestsBannerState.Hidden
23+
var shouldShowBanner by remember { mutableStateOf(false) }
24+
25+
fun handleEvents(event: KnockRequestsBannerEvents) {
26+
when (event) {
27+
is KnockRequestsBannerEvents.Accept -> Unit
28+
is KnockRequestsBannerEvents.Dismiss -> {
29+
shouldShowBanner = false
30+
}
31+
}
32+
}
33+
34+
return KnockRequestsBannerState(
35+
knockRequests = persistentListOf(),
36+
acceptAction = AsyncAction.Uninitialized,
37+
canAccept = false,
38+
isVisible = shouldShowBanner,
39+
eventSink = ::handleEvents,
40+
)
1841
}
1942
}

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerState.kt

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package io.element.android.features.knockrequests.impl.banner
99

1010
import androidx.compose.runtime.Composable
11-
import androidx.compose.runtime.Immutable
1211
import androidx.compose.ui.res.pluralStringResource
1312
import androidx.compose.ui.res.stringResource
1413
import io.element.android.features.knockrequests.impl.KnockRequest
@@ -18,42 +17,39 @@ import io.element.android.libraries.ui.strings.CommonPlurals
1817
import io.element.android.libraries.ui.strings.CommonStrings
1918
import kotlinx.collections.immutable.ImmutableList
2019

21-
@Immutable
22-
sealed interface KnockRequestsBannerState {
23-
data object Hidden : KnockRequestsBannerState
24-
data class Visible(
25-
val knockRequests: ImmutableList<KnockRequest>,
26-
val acceptAction: AsyncAction<Unit>,
27-
val canAccept: Boolean,
28-
) : KnockRequestsBannerState {
29-
30-
val subtitle = if (knockRequests.size == 1) {
31-
knockRequests.first().userId.value
32-
} else {
33-
null
34-
}
20+
data class KnockRequestsBannerState(
21+
val isVisible: Boolean,
22+
val knockRequests: ImmutableList<KnockRequest>,
23+
val acceptAction: AsyncAction<Unit>,
24+
val canAccept: Boolean,
25+
val eventSink: (KnockRequestsBannerEvents) -> Unit,
26+
) {
27+
val subtitle = if (knockRequests.size == 1) {
28+
knockRequests.first().userId.value
29+
} else {
30+
null
31+
}
3532

36-
val reason = if (knockRequests.size == 1) {
37-
knockRequests.first().reason
38-
} else {
39-
null
40-
}
33+
val reason = if (knockRequests.size == 1) {
34+
knockRequests.first().reason
35+
} else {
36+
null
37+
}
4138

42-
@Composable
43-
fun formattedTitle(): String {
44-
return when (knockRequests.size) {
45-
0 -> ""
46-
1 -> stringResource(CommonStrings.screen_room_single_knock_request_title, knockRequests.first().getBestName())
47-
else -> {
48-
val firstRequest = knockRequests.first()
49-
val otherRequestsCount = knockRequests.size - 1
50-
pluralStringResource(
51-
id = CommonPlurals.screen_room_multiple_knock_requests_title,
52-
count = otherRequestsCount,
53-
firstRequest.getBestName(),
54-
otherRequestsCount
55-
)
56-
}
39+
@Composable
40+
fun formattedTitle(): String {
41+
return when (knockRequests.size) {
42+
0 -> ""
43+
1 -> stringResource(CommonStrings.screen_room_single_knock_request_title, knockRequests.first().getBestName())
44+
else -> {
45+
val firstRequest = knockRequests.first()
46+
val otherRequestsCount = knockRequests.size - 1
47+
pluralStringResource(
48+
id = CommonPlurals.screen_room_multiple_knock_requests_title,
49+
count = otherRequestsCount,
50+
firstRequest.getBestName(),
51+
otherRequestsCount
52+
)
5753
}
5854
}
5955
}

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerStateProvider.kt

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,52 @@ import kotlinx.collections.immutable.toImmutableList
1616
class KnockRequestsBannerStateProvider : PreviewParameterProvider<KnockRequestsBannerState> {
1717
override val values: Sequence<KnockRequestsBannerState>
1818
get() = sequenceOf(
19-
KnockRequestsBannerState.Hidden,
20-
aVisibleKnockRequestsBannerState(),
21-
aVisibleKnockRequestsBannerState(
19+
aKnockRequestsBannerState(),
20+
aKnockRequestsBannerState(
21+
knockRequests = listOf(
22+
aKnockRequest(
23+
reason = "A very long reason that should probably be truncated, " +
24+
"but could be also expanded so you can see it over the lines, wow," +
25+
"very amazing reason, I know, right, I'm so good at writing reasons."
26+
)
27+
)
28+
),
29+
aKnockRequestsBannerState(
2230
knockRequests = listOf(
2331
aKnockRequest(),
2432
aKnockRequest(displayName = "Alice")
2533
)
2634
),
27-
aVisibleKnockRequestsBannerState(
35+
aKnockRequestsBannerState(
2836
knockRequests = listOf(
2937
aKnockRequest(),
3038
aKnockRequest(displayName = "Alice"),
3139
aKnockRequest(displayName = "Bob"),
3240
aKnockRequest(displayName = "Charlie")
3341
)
3442
),
35-
aVisibleKnockRequestsBannerState(
43+
aKnockRequestsBannerState(
3644
canAccept = false
3745
),
38-
aVisibleKnockRequestsBannerState(
46+
aKnockRequestsBannerState(
3947
acceptAction = AsyncAction.Loading
4048
),
41-
aVisibleKnockRequestsBannerState(
42-
acceptAction = AsyncAction.Failure(Throwable())
49+
aKnockRequestsBannerState(
50+
acceptAction = AsyncAction.Failure(Throwable("Failed to accept knock"))
4351
),
4452
)
4553
}
4654

47-
fun aVisibleKnockRequestsBannerState(
55+
fun aKnockRequestsBannerState(
4856
knockRequests: List<KnockRequest> = listOf(aKnockRequest()),
4957
acceptAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
5058
canAccept: Boolean = true,
51-
) = KnockRequestsBannerState.Visible(
59+
isVisible: Boolean = true,
60+
eventSink: (KnockRequestsBannerEvents) -> Unit = {}
61+
) = KnockRequestsBannerState(
5262
knockRequests = knockRequests.toImmutableList(),
5363
acceptAction = acceptAction,
54-
canAccept = canAccept
64+
canAccept = canAccept,
65+
isVisible = isVisible,
66+
eventSink = eventSink,
5567
)

0 commit comments

Comments
 (0)