fun ChannelScreen(navController: NavController?, channelUrl: String, modifier: Modifier = Modifier, onTopBarNavigationIconClick: () -> Unit = { navController?.popBackStack() }, onTopBarActionClick: () -> Unit = { navController?.navigateToChannelSettings(channelUrl) }, onMessageItemClick: (Context, UikitBaseMessage, ImageViewerState) -> Unit = { context, message, state ->
when (message) {
is UikitFileMessage -> {
if (message.isImage) {
state.showImage(message)
} else if (message.isFile or message.isVideo) {
val type = message.type.lowercase()
val uri = Uri.parse(message.url)
val intent = uri.getViewerIntent(type)
context.startActivity(intent)
} else {
Logger.d("unknown file type: ${message.type}")
}
}
else -> {}
}
}, onMessageItemLongClick: (UikitBaseMessage, ChannelDialogState) -> Unit = { message, state ->
state.showMessageMenuDialog(message)
}, onChannelRemoved: (String) -> Unit = { navController?.popBackStack() }, messageInputState: MessageInputState = rememberMessageInputState(), dialogState: ChannelDialogState = rememberChannelDialogState(), imageViewerState: ImageViewerState = rememberImageViewerState(), snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, viewModelContract: ChannelViewModelContract = viewModel<ChannelViewModel>(
factory = ChannelViewModel.factory(
ChannelViewModelParams(
channelUrl = channelUrl
)
)
), topBar: @Composable (state: ChannelTopBarState) -> Unit = {
ChannelTopBar(
channelCoverModels = it.coverModels,
channelTitle = it.title,
channelDescription = it.channelDescription,
onNavigationIconClick = it.onNavigationIconClick,
onActionClick = it.onActionClick
)
}, loading: @Composable () -> Unit = {}, failure: @Composable (e: Throwable) -> Unit = { e ->
FailurePlaceholder(
onRetryClick = { viewModelContract.prepare() }
)
}, empty: @Composable () -> Unit = {
ScreenPlaceholder(
icon = painterResource(id = R.drawable.icon_message),
text = stringResource(id = R.string.sb_text_channel_message_empty)
)
}, messageMenuDialog: @Composable (UikitBaseMessage, MessageMenuDialogContract) -> Unit = { message, contract ->
MessageMenuDialog(
message = message,
messageMenuDialogContract = contract,
onItemClick = {
it.onClick()
},
onDismissRequest = { dialogState.dismissMessageMenuDialog() }
)
}, messageInputBottomSheet: @Composable (MessageInputBottomSheetContract) -> Unit = { contract ->
MessageInputBottomSheet(
messageInputBottomSheetContract = contract,
onItemClick = {
// TODO(nathan) : show toast when something went wrong(it was in previous version)
it.onClick()
},
onDismissRequest = {
messageInputState.clear()
}
)
}, messageItem: @Composable (prevMessage: UikitBaseMessage?, message: UikitBaseMessage, nextMessage: UikitBaseMessage?, onMessageClick: (UikitBaseMessage) -> Unit, onMessageLongClick: (UikitBaseMessage) -> Unit) -> Unit = { prevMessage, message, nextMessage, onMessageClick, onMessageLongClick ->
MessageItemFactory(
prevMessage,
message,
nextMessage,
onMessageClick = onMessageClick,
onMessageLongClick = onMessageLongClick
)
}, messageInput: @Composable (messageInputState: MessageInputState) -> Unit = { state ->
ChannelMessageInput(
state = state,
viewModelContract = viewModelContract
)
}) Represents the screen for showing a messages in a UikitGroupChannel.
Since
1.0.0
Parameters
The modifier to be applied to the view.
onTopBarNavigationIconClick
The handler for when the navigation icon is clicked.
The handler for when the action is clicked.
The handler for when a message is clicked. For a UikitFileMessage, the default action is to show the image in an ImageViewer or launch a video/file.
The handler for when a message is long clicked. Defaults to showing a MessageMenuDialog.
The handler for when the channel is removed.
The state for the message input.
The state for the dialog for a message.
The loading screen to be displayed.
The message input to be displayed. Defaults to MessageInput.
See also