Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AND-294] PinnedMessageList stateless component factories. #5603

Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
- Create message composer stateless component factories. [#5579](https://github.com/GetStream/stream-chat-android/pull/5597)
- Create factories for the avatar stateless components. [#5596](https://github.com/GetStream/stream-chat-android/pull/5596)
- Create thread list component factories. [#5602](https://github.com/GetStream/stream-chat-android/pull/5602)
- Create pinned message list component factories. [#5603](https://github.com/GetStream/stream-chat-android/pull/5603)

### ✅ Added

Expand Down
16 changes: 16 additions & 0 deletions stream-chat-android-compose/api/stream-chat-android-compose.api
Original file line number Diff line number Diff line change
Expand Up @@ -2182,6 +2182,14 @@ public abstract interface class io/getstream/chat/android/compose/ui/theme/ChatC
public abstract fun MessageQuotedContent (Landroidx/compose/ui/Modifier;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public abstract fun MessageRegularContent (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
public abstract fun MessageTextContent (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListEmptyContent (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListItem (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListItemCenterContent (Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListItemDivider (Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListItemLeadingContent (Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListItemTrailingContent (Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListLoadingContent (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
public abstract fun PinnedMessageListLoadingMoreContent (Landroidx/compose/runtime/Composer;I)V
public abstract fun SearchInputLabel (Landroidx/compose/runtime/Composer;I)V
public abstract fun SearchInputLeadingIcon (Landroidx/compose/foundation/layout/RowScope;Landroidx/compose/runtime/Composer;I)V
public abstract fun ThreadListEmptyContent (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
Expand Down Expand Up @@ -2271,6 +2279,14 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatComponentFacto
public static fun MessageQuotedContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/ui/Modifier;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public static fun MessageRegularContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
public static fun MessageTextContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListEmptyContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListItem (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListItemCenterContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListItemDivider (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListItemLeadingContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListItemTrailingContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/layout/RowScope;Lio/getstream/chat/android/models/Message;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListLoadingContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
public static fun PinnedMessageListLoadingMoreContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/runtime/Composer;I)V
public static fun SearchInputLabel (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/runtime/Composer;I)V
public static fun SearchInputLeadingIcon (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/foundation/layout/RowScope;Landroidx/compose/runtime/Composer;I)V
public static fun ThreadListEmptyContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@ package io.getstream.chat.android.compose.ui.pinned
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemCenterContent
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemLeadingContent
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemTrailingContent
import io.getstream.chat.android.compose.ui.messages.preview.internal.MessagePreviewItem
import io.getstream.chat.android.compose.ui.theme.ChatTheme
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.User

Expand All @@ -46,13 +44,19 @@ public fun PinnedMessageItem(
onPinnedMessageClick: (Message) -> Unit,
modifier: Modifier = Modifier,
leadingContent: @Composable RowScope.(Message) -> Unit = {
DefaultMessagePreviewItemLeadingContent(it)
with(ChatTheme.componentFactory) {
PinnedMessageListItemLeadingContent(it)
}
},
centerContent: @Composable RowScope.(Message) -> Unit = {
DefaultMessagePreviewItemCenterContent(it, currentUser)
with(ChatTheme.componentFactory) {
PinnedMessageListItemCenterContent(it, currentUser)
}
},
trailingContent: @Composable RowScope.(Message) -> Unit = {
DefaultMessagePreviewItemTrailingContent(it)
with(ChatTheme.componentFactory) {
PinnedMessageListItemTrailingContent(it)
}
},
) {
MessagePreviewItem(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,19 +90,19 @@ public fun PinnedMessageList(
currentUser: User? = ChatClient.instance().getCurrentUser(),
onPinnedMessageClick: (Message) -> Unit = {},
itemContent: @Composable (Message) -> Unit = {
DefaultPinnedMessageItem(it, currentUser, onPinnedMessageClick)
ChatTheme.componentFactory.PinnedMessageListItem(it, currentUser, onPinnedMessageClick)
},
itemDivider: @Composable (Int) -> Unit = {
DefaultPinnedMessageItemDivider()
ChatTheme.componentFactory.PinnedMessageListItemDivider()
},
emptyContent: @Composable () -> Unit = {
DefaultPinnedMessageListEmptyContent(modifier)
ChatTheme.componentFactory.PinnedMessageListEmptyContent(modifier)
},
loadingContent: @Composable () -> Unit = {
DefaultPinnedMessageListLoadingContent(modifier)
ChatTheme.componentFactory.PinnedMessageListLoadingContent(modifier)
},
loadingMoreContent: @Composable () -> Unit = {
DefaultPinnedMessageListLoadingMoreContent()
ChatTheme.componentFactory.PinnedMessageListLoadingMoreContent()
},
) {
val state by viewModel.state.collectAsState()
Expand Down Expand Up @@ -160,19 +160,19 @@ internal fun PinnedMessageList(
onPinnedMessageClick: (Message) -> Unit,
onLoadMore: () -> Unit,
itemContent: @Composable (Message) -> Unit = {
DefaultPinnedMessageItem(it, currentUser, onPinnedMessageClick)
ChatTheme.componentFactory.PinnedMessageListItem(it, currentUser, onPinnedMessageClick)
},
itemDivider: @Composable (Int) -> Unit = {
DefaultPinnedMessageItemDivider()
ChatTheme.componentFactory.PinnedMessageListItemDivider()
},
emptyContent: @Composable () -> Unit = {
DefaultPinnedMessageListEmptyContent(modifier)
ChatTheme.componentFactory.PinnedMessageListEmptyContent(modifier)
},
loadingContent: @Composable () -> Unit = {
DefaultPinnedMessageListLoadingContent(modifier)
ChatTheme.componentFactory.PinnedMessageListLoadingContent(modifier)
},
loadingMoreContent: @Composable () -> Unit = {
DefaultPinnedMessageListLoadingMoreContent()
ChatTheme.componentFactory.PinnedMessageListLoadingMoreContent()
},
) {
when {
Expand Down Expand Up @@ -245,31 +245,11 @@ private fun PinnedMessages(
}
}

/**
* The default item rendering a pinned message.
*
* @param message The [Message] to render.
* @param currentUser The currently logged in [User].
* @param onPinnedMessageClick The action invoked when the user clicks on the item.
*/
@Composable
internal fun DefaultPinnedMessageItem(
message: Message,
currentUser: User?,
onPinnedMessageClick: (Message) -> Unit,
) {
PinnedMessageItem(
message = message,
currentUser = currentUser,
onPinnedMessageClick = onPinnedMessageClick,
)
}

/**
* The default divider appended after each pinned message.
*/
@Composable
internal fun DefaultPinnedMessageItemDivider() {
internal fun DefaultPinnedMessageListItemDivider() {
Spacer(
modifier = Modifier
.fillMaxWidth()
Expand Down Expand Up @@ -356,10 +336,10 @@ private const val LoadMoreThreshold = 10

@Composable
@Preview
private fun DefaultPinnedMessageContentPreview() {
private fun PinnedMessageItemPreview() {
ChatTheme {
Surface {
DefaultPinnedMessageItem(
PinnedMessageItem(
message = PreviewPinnedMessageData.pinnedMessage1,
currentUser = null,
onPinnedMessageClick = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,14 @@ import io.getstream.chat.android.compose.ui.messages.list.DefaultMessagesHelperC
import io.getstream.chat.android.compose.ui.messages.list.DefaultMessagesLoadingMoreIndicator
import io.getstream.chat.android.compose.ui.messages.list.DefaultSystemMessageContent
import io.getstream.chat.android.compose.ui.messages.list.MessagesLazyListState
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemCenterContent
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemLeadingContent
import io.getstream.chat.android.compose.ui.messages.preview.internal.DefaultMessagePreviewItemTrailingContent
import io.getstream.chat.android.compose.ui.pinned.DefaultPinnedMessageListEmptyContent
import io.getstream.chat.android.compose.ui.pinned.DefaultPinnedMessageListItemDivider
import io.getstream.chat.android.compose.ui.pinned.DefaultPinnedMessageListLoadingContent
import io.getstream.chat.android.compose.ui.pinned.DefaultPinnedMessageListLoadingMoreContent
import io.getstream.chat.android.compose.ui.pinned.PinnedMessageItem
import io.getstream.chat.android.compose.ui.threads.DefaultThreadListEmptyContent
import io.getstream.chat.android.compose.ui.threads.DefaultThreadListLoadingContent
import io.getstream.chat.android.compose.ui.threads.DefaultThreadListLoadingMoreContent
Expand Down Expand Up @@ -1573,4 +1581,96 @@ public interface ChatComponentFactory {
public fun ThreadListLoadingMoreContent() {
DefaultThreadListLoadingMoreContent()
}

/**
* The default content of the pinned message list item.
*
* @param message The pinned message to display.
* @param currentUser The current user.
* @param onClick Action invoked when the user clicks on the pinned message.
*/
@Composable
public fun PinnedMessageListItem(
message: Message,
currentUser: User?,
onClick: (Message) -> Unit,
) {
PinnedMessageItem(message, currentUser, onClick)
}

/**
* The default loading content of the pinned message list. Shows an avatar of the user who sent the pinned message.
*
* Used in the [PinnedMessageListItem].
*
* @param message The pinned message to display.
*/
@Composable
public fun RowScope.PinnedMessageListItemLeadingContent(message: Message) {
DefaultMessagePreviewItemLeadingContent(message)
}

/**
* The default loading content of the pinned message list. Shows the message sender name and the message content.
*
* Used in the [PinnedMessageListItem].
*
* @param message The pinned message to display.
* @param currentUser The current user.
*/
@Composable
public fun RowScope.PinnedMessageListItemCenterContent(
message: Message,
currentUser: User?,
) {
DefaultMessagePreviewItemCenterContent(message, currentUser)
}

/**
* The default loading content of the pinned message list. Shows the message timestamp.
*
* Used in the [PinnedMessageListItem].
*
* @param message The pinned message to display.
*/
@Composable
public fun RowScope.PinnedMessageListItemTrailingContent(message: Message) {
DefaultMessagePreviewItemTrailingContent(message)
}

/**
* The default divider appended after each pinned message.
*/
@Composable
public fun PinnedMessageListItemDivider() {
DefaultPinnedMessageListItemDivider()
}

/**
* The default empty placeholder that is displayed when there are no pinned messages.
*
* @param modifier Modifier for styling.
*/
@Composable
public fun PinnedMessageListEmptyContent(modifier: Modifier) {
DefaultPinnedMessageListEmptyContent(modifier)
}

/**
* The default loading content that is displayed during the initial loading of the pinned messages.
*
* @param modifier Modifier for styling.
*/
@Composable
public fun PinnedMessageListLoadingContent(modifier: Modifier) {
DefaultPinnedMessageListLoadingContent(modifier)
}

/**
* The default content shown on the bottom of the list during the loading of more pinned messages.
*/
@Composable
public fun PinnedMessageListLoadingMoreContent() {
DefaultPinnedMessageListLoadingMoreContent()
}
}
Loading