Skip to content

Instantly share code, notes, and snippets.

@MaedehJJ
Created November 11, 2023 09:33
Show Gist options
  • Save MaedehJJ/b088dcf792f8a7b02c3e53f2a6c03ef7 to your computer and use it in GitHub Desktop.
Save MaedehJJ/b088dcf792f8a7b02c3e53f2a6c03ef7 to your computer and use it in GitHub Desktop.
Amity Support
class ChannelDetailViewModel : BaseViewModel() {
private var _messagesUiState = MutableStateFlow<ChatsUiState>(ChatsUiState.Loading)
var messagesUiState: StateFlow<ChatsUiState> = _messagesUiState
fun getChannelMessages(subChannelId: String) {
messagesUiState =
AmityChatClient.newMessageRepository().getMessages(subChannelId).includeDeleted(false)
.build().query()
.asFlow().cachedIn(viewModelScope)
.map { ChatsUiState.Success(data = flowOf(it)) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), ChatsUiState.Loading)
}
}
sealed interface ChatsUiState {
object Loading : ChatsUiState
data class Success(val data: Flow<PagingData<AmityMessage>>) : ChatsUiState
}
@Composable
fun StatefulMessagesParent(
viewModel: ChannelDetailViewModel,
subChannelId: String,
modifier: Modifier
) {
LaunchedEffect(key1 = subChannelId) {
viewModel.getChannelMessages(subChannelId)
}
val lifecycle = LocalLifecycleOwner.current.lifecycle
val uiState by produceState<ChatsUiState>(
initialValue = ChatsUiState.Loading,
key1 = lifecycle,
key2 = viewModel
) {
lifecycle.repeatOnLifecycle(state = Lifecycle.State.STARTED) {
viewModel.messagesUiState.collect {
value = it
}
}
}
if (uiState is ChatsUiState.Success) {
val messages: LazyPagingItems<AmityMessage> =
(uiState as ChatsUiState.Success).data.collectAsLazyPagingItems()
MessagesParent(
messages = messages,
modifier = modifier
)
}
}
@Composable
fun MessagesParent(
messages: LazyPagingItems<AmityMessage>,
state: LazyListState = rememberLazyListState(),
modifier: Modifier
) {
LazyColumn(state = state, modifier = modifier, reverseLayout = true) {
items(
messages.itemCount,
key = messages.itemKey { it.getMessageId() },
contentType = messages.itemContentType { it.getDataType() }
) { index ->
messages[index]?.let { message ->
MessageCard(message)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment