@@ -87,6 +87,7 @@ import io.element.android.libraries.designsystem.components.ExpandableBottomShee
87
87
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayoutState
88
88
import io.element.android.libraries.designsystem.components.avatar.Avatar
89
89
import io.element.android.libraries.designsystem.components.avatar.AvatarData
90
+ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
90
91
import io.element.android.libraries.designsystem.components.avatar.AvatarType
91
92
import io.element.android.libraries.designsystem.components.button.BackButton
92
93
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
@@ -95,6 +96,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
95
96
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
96
97
import io.element.android.libraries.designsystem.text.toAnnotatedString
97
98
import io.element.android.libraries.designsystem.theme.components.BottomSheetDragHandle
99
+ import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
98
100
import io.element.android.libraries.designsystem.theme.components.Icon
99
101
import io.element.android.libraries.designsystem.theme.components.Scaffold
100
102
import io.element.android.libraries.designsystem.theme.components.Text
@@ -111,10 +113,14 @@ import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
111
113
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
112
114
import io.element.android.libraries.matrix.api.timeline.Timeline
113
115
import io.element.android.libraries.matrix.api.user.MatrixUser
116
+ import io.element.android.libraries.matrix.ui.components.aMatrixUserList
117
+ import io.element.android.libraries.matrix.ui.model.getAvatarData
114
118
import io.element.android.libraries.textcomposer.model.TextEditorState
115
119
import io.element.android.libraries.ui.strings.CommonStrings
116
120
import io.element.android.wysiwyg.link.Link
117
121
import kotlinx.collections.immutable.ImmutableList
122
+ import kotlinx.collections.immutable.persistentListOf
123
+ import kotlinx.collections.immutable.toImmutableList
118
124
import timber.log.Timber
119
125
import kotlin.time.Duration.Companion.milliseconds
120
126
@@ -202,7 +208,13 @@ fun MessagesView(
202
208
Column {
203
209
ConnectivityIndicatorView (isOnline = state.hasNetworkConnection)
204
210
if (state.timelineState.timelineMode is Timeline .Mode .Thread ) {
205
- ThreadTopBar (onBackClick = onBackClick)
211
+ ThreadTopBar (
212
+ roomName = state.roomName,
213
+ roomAvatarData = state.roomAvatar,
214
+ heroes = state.heroes,
215
+ isTombstoned = state.isTombstoned,
216
+ onBackClick = onBackClick,
217
+ )
206
218
} else {
207
219
MessagesViewTopBar (
208
220
roomName = state.roomName,
@@ -573,14 +585,48 @@ private fun MessagesViewTopBar(
573
585
@OptIn(ExperimentalMaterial3Api ::class )
574
586
@Composable
575
587
private fun ThreadTopBar (
588
+ roomName : String? ,
589
+ roomAvatarData : AvatarData ,
590
+ heroes : ImmutableList <AvatarData >,
591
+ isTombstoned : Boolean ,
576
592
onBackClick : () -> Unit ,
593
+ modifier : Modifier = Modifier ,
577
594
) {
578
595
TopAppBar (
596
+ modifier = modifier,
579
597
navigationIcon = {
580
598
BackButton (onClick = onBackClick)
581
599
},
582
600
title = {
583
- Text (stringResource(CommonStrings .common_thread))
601
+ Row (verticalAlignment = Alignment .CenterVertically ) {
602
+ Avatar (
603
+ avatarData = roomAvatarData,
604
+ avatarType = AvatarType .Room (
605
+ heroes = heroes,
606
+ isTombstoned = isTombstoned,
607
+ ),
608
+ )
609
+ Column (
610
+ modifier = Modifier .fillMaxWidth()
611
+ .padding(horizontal = 8 .dp)
612
+ .semantics {
613
+ heading()
614
+ },
615
+ ) {
616
+ Text (
617
+ text = stringResource(CommonStrings .common_thread),
618
+ style = ElementTheme .typography.fontBodyLgMedium,
619
+ )
620
+ Text (
621
+ text = roomName ? : stringResource(CommonStrings .common_no_room_name),
622
+ style = ElementTheme .typography.fontBodySmRegular,
623
+ fontStyle = FontStyle .Italic .takeIf { roomName == null },
624
+ color = ElementTheme .colors.textSecondary,
625
+ maxLines = 1 ,
626
+ overflow = TextOverflow .Ellipsis
627
+ )
628
+ }
629
+ }
584
630
}
585
631
)
586
632
}
@@ -673,3 +719,58 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class)
673
719
knockRequestsBannerView = {},
674
720
)
675
721
}
722
+
723
+ @PreviewsDayNight
724
+ @Composable
725
+ internal fun ThreadTopBarPreview () {
726
+ ElementPreview {
727
+ val name = " Room name"
728
+ val initialsAvatarData = AvatarData (
729
+ id = " id" ,
730
+ name = name,
731
+ url = null ,
732
+ size = AvatarSize .TimelineRoom ,
733
+ )
734
+ Column {
735
+ ThreadTopBar (
736
+ roomName = name,
737
+ roomAvatarData = initialsAvatarData,
738
+ heroes = persistentListOf(),
739
+ isTombstoned = false ,
740
+ onBackClick = {},
741
+ )
742
+ HorizontalDivider ()
743
+ ThreadTopBar (
744
+ roomName = name,
745
+ roomAvatarData = initialsAvatarData,
746
+ heroes = aMatrixUserList().map { it.getAvatarData(AvatarSize .TimelineRoom ) }.toImmutableList(),
747
+ isTombstoned = false ,
748
+ onBackClick = {},
749
+ )
750
+ HorizontalDivider ()
751
+ ThreadTopBar (
752
+ roomName = null ,
753
+ roomAvatarData = initialsAvatarData,
754
+ heroes = persistentListOf(),
755
+ isTombstoned = false ,
756
+ onBackClick = {},
757
+ )
758
+ HorizontalDivider ()
759
+ ThreadTopBar (
760
+ roomName = name,
761
+ roomAvatarData = initialsAvatarData.copy(url = " https://some-avatar.jpg" ),
762
+ heroes = persistentListOf(),
763
+ isTombstoned = false ,
764
+ onBackClick = {},
765
+ )
766
+ HorizontalDivider ()
767
+ ThreadTopBar (
768
+ roomName = name,
769
+ roomAvatarData = initialsAvatarData,
770
+ heroes = persistentListOf(),
771
+ isTombstoned = true ,
772
+ onBackClick = {},
773
+ )
774
+ }
775
+ }
776
+ }
0 commit comments