Timeline: fix bad layouting

This commit is contained in:
ganfra 2022-11-23 20:07:24 +01:00
parent 72e0f07888
commit e2108fedf3

View file

@ -82,7 +82,7 @@ fun MessagesScreen(
val composerCanSendMessage by composerViewModel.collectAsState(MessageComposerViewState::isSendButtonVisible) val composerCanSendMessage by composerViewModel.collectAsState(MessageComposerViewState::isSendButtonVisible)
val composerText by composerViewModel.collectAsState(MessageComposerViewState::text) val composerText by composerViewModel.collectAsState(MessageComposerViewState::text)
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
MessagesContent( MessagesScreenContent(
roomTitle = roomTitle, roomTitle = roomTitle,
roomAvatar = roomAvatar, roomAvatar = roomAvatar,
timelineItems = timelineItems().orEmpty(), timelineItems = timelineItems().orEmpty(),
@ -126,7 +126,7 @@ fun MessagesScreen(
} }
@Composable @Composable
fun MessagesContent( fun MessagesScreenContent(
roomTitle: String?, roomTitle: String?,
roomAvatar: AvatarData?, roomAvatar: AvatarData?,
timelineItems: List<MessagesTimelineItemState>, timelineItems: List<MessagesTimelineItemState>,
@ -144,75 +144,118 @@ fun MessagesContent(
snackbarHostState: SnackbarHostState, snackbarHostState: SnackbarHostState,
) { ) {
LogCompositions(tag = "MessagesScreen", msg = "Content") LogCompositions(tag = "MessagesScreen", msg = "Content")
val lazyListState = rememberLazyListState()
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( MessagesTopAppBar(
navigationIcon = { roomTitle = roomTitle,
IconButton(onClick = onBackPressed) { roomAvatar = roomAvatar,
Icon( onBackPressed = onBackPressed
imageVector = Icons.Filled.ArrowBack,
contentDescription = "Back"
)
}
},
title = {
Row(verticalAlignment = Alignment.CenterVertically) {
if (roomAvatar != null) {
Avatar(roomAvatar)
Spacer(modifier = Modifier.width(8.dp))
}
Text(
fontSize = 16.sp,
fontWeight = FontWeight.SemiBold,
text = roomTitle ?: "Unknown room",
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
) )
}, },
content = { padding -> content = { padding ->
Column( MessagesContent(
modifier = Modifier modifier = Modifier.padding(padding),
.padding(padding) timelineItems = timelineItems,
.fillMaxSize() hasMoreToLoad = hasMoreToLoad,
) { onReachedLoadMore = onReachedLoadMore,
if (!composerFullScreen) { onSendMessage = onSendMessage,
TimelineItems( onClick = onClick,
lazyListState = lazyListState, onLongClick = onLongClick,
timelineItems = timelineItems, composerFullScreen = composerFullScreen,
hasMoreToLoad = hasMoreToLoad, onComposerFullScreenChange = onComposerFullScreenChange,
onReachedLoadMore = onReachedLoadMore, onComposerTextChange = onComposerTextChange,
modifier = Modifier.weight(1f), composerCanSendMessage = composerCanSendMessage,
onClick = onClick, composerText = composerText
onLongClick = onLongClick )
) },
} snackbarHost = { SnackbarHost(snackbarHostState) },
TextComposer( )
onSendMessage = onSendMessage, }
fullscreen = composerFullScreen,
onFullscreenToggle = onComposerFullScreenChange, @Composable
onComposerTextChange = onComposerTextChange, fun MessagesContent(
composerCanSendMessage = composerCanSendMessage, timelineItems: List<MessagesTimelineItemState>,
composerText = composerText?.charSequence?.toString(), hasMoreToLoad: Boolean,
modifier = Modifier onReachedLoadMore: () -> Unit,
.fillMaxWidth() onSendMessage: (String) -> Unit,
.imePadding() onClick: (MessagesTimelineItemState.MessageEvent) -> Unit,
.let { onLongClick: (MessagesTimelineItemState.MessageEvent) -> Unit,
if (composerFullScreen) { composerFullScreen: Boolean,
it.weight(1f) onComposerFullScreenChange: () -> Unit,
} else { onComposerTextChange: (CharSequence) -> Unit,
it.height(COMPOSER_HEIGHT) composerCanSendMessage: Boolean,
} composerText: StableCharSequence?,
}, modifier: Modifier = Modifier
) {
val lazyListState = rememberLazyListState()
Column(
modifier = modifier
.fillMaxSize()
) {
if (!composerFullScreen) {
TimelineItems(
lazyListState = lazyListState,
timelineItems = timelineItems,
hasMoreToLoad = hasMoreToLoad,
onReachedLoadMore = onReachedLoadMore,
modifier = Modifier.weight(1f),
onClick = onClick,
onLongClick = onLongClick
)
}
TextComposer(
onSendMessage = onSendMessage,
fullscreen = composerFullScreen,
onFullscreenToggle = onComposerFullScreenChange,
onComposerTextChange = onComposerTextChange,
composerCanSendMessage = composerCanSendMessage,
composerText = composerText?.charSequence?.toString(),
modifier = Modifier
.fillMaxWidth()
.imePadding()
.let {
if (composerFullScreen) {
it.weight(1f)
} else {
it.height(COMPOSER_HEIGHT)
}
},
)
}
}
@Composable
fun MessagesTopAppBar(
roomTitle: String?,
roomAvatar: AvatarData?,
onBackPressed: () -> Unit,
) {
TopAppBar(
navigationIcon = {
IconButton(onClick = onBackPressed) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = "Back"
) )
} }
}, },
snackbarHost = { SnackbarHost(snackbarHostState) }, title = {
Row(verticalAlignment = Alignment.CenterVertically) {
if (roomAvatar != null) {
Avatar(roomAvatar)
Spacer(modifier = Modifier.width(8.dp))
}
Text(
fontSize = 16.sp,
fontWeight = FontWeight.SemiBold,
text = roomTitle ?: "Unknown room",
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
) )
} }
@ -228,7 +271,7 @@ fun TimelineItems(
) { ) {
Box(modifier = modifier.fillMaxWidth()) { Box(modifier = modifier.fillMaxWidth()) {
LazyColumn( LazyColumn(
modifier = modifier.fillMaxWidth(), modifier = Modifier.fillMaxSize(),
state = lazyListState, state = lazyListState,
horizontalAlignment = Alignment.Start, horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.Bottom, verticalArrangement = Arrangement.Bottom,
@ -253,6 +296,7 @@ fun TimelineItems(
} }
MessagesScrollHelper(lazyListState = lazyListState, timelineItems = timelineItems) MessagesScrollHelper(lazyListState = lazyListState, timelineItems = timelineItems)
} }
} }
private fun MessagesTimelineItemState.key(): String { private fun MessagesTimelineItemState.key(): String {
@ -490,7 +534,9 @@ internal fun BoxScope.MessagesScrollHelper(
} }
}, },
shape = CircleShape, shape = CircleShape,
modifier = Modifier.align(Alignment.BottomCenter).size(40.dp), modifier = Modifier
.align(Alignment.BottomCenter)
.size(40.dp),
containerColor = MaterialTheme.colorScheme.surfaceVariant, containerColor = MaterialTheme.colorScheme.surfaceVariant,
contentColor = MaterialTheme.colorScheme.onSurfaceVariant contentColor = MaterialTheme.colorScheme.onSurfaceVariant
) { ) {