From f65f8c11d8c46d6c50923a36e79a3c365ea39c5c Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Thu, 17 Apr 2025 09:01:18 +0200 Subject: [PATCH] DROID-3355 Chats | Tech | Add switcher allowing creating space-level chat in debug mode + Counters API (#2333) --- .../anytype/ui/spaces/CreateSpaceScreen.kt | 51 +++++++++++++++++-- .../anytypeio/anytype/core_models/Command.kt | 10 +++- .../anytypeio/anytype/core_models/Event.kt | 18 +++++++ .../anytype/core_models/chats/Chat.kt | 18 +++++++ .../auth/repo/block/BlockDataRepository.kt | 2 +- .../data/auth/repo/block/BlockRemote.kt | 2 +- .../domain/block/repo/BlockRepository.kt | 2 +- .../anytype/domain/chats/ChatContainer.kt | 10 ++++ .../anytype/domain/chats/GetChatMessages.kt | 8 +-- .../anytype/domain/spaces/CreateSpace.kt | 2 +- .../middleware/block/BlockMiddleware.kt | 2 +- .../middleware/interactor/Middleware.kt | 10 ++-- .../interactor/MiddlewareEventChannel.kt | 3 ++ .../interactor/MiddlewareEventMapper.kt | 26 ++++++++++ .../anytype/middleware/mappers/Alias.kt | 1 + .../middleware/mappers/ToCoreModelMappers.kt | 21 +++++++- .../middleware/service/MiddlewareService.kt | 1 + .../MiddlewareServiceImplementation.kt | 13 +++++ .../spaces/CreateSpaceViewModel.kt | 18 +++---- 19 files changed, 187 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/spaces/CreateSpaceScreen.kt b/app/src/main/java/com/anytypeio/anytype/ui/spaces/CreateSpaceScreen.kt index 84ba5b98ce..2ee66f5939 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/spaces/CreateSpaceScreen.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/spaces/CreateSpaceScreen.kt @@ -4,11 +4,13 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.BasicTextField @@ -17,6 +19,8 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Text import androidx.compose.material.TextFieldDefaults +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState @@ -35,6 +39,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import com.anytypeio.anytype.BuildConfig import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Name import com.anytypeio.anytype.core_models.PRIVATE_SPACE_TYPE @@ -53,10 +58,13 @@ import com.anytypeio.anytype.ui_settings.space.TypeOfSpace @Composable fun CreateSpaceScreen( spaceIconView: SpaceIconView.Placeholder, - onCreate: (Name) -> Unit, + onCreate: (Name, IsSpaceLevelChatSwitchChecked) -> Unit, onSpaceIconClicked: () -> Unit, isLoading: State ) { + + var isSpaceLevelChatSwitchChecked = remember { mutableStateOf(false) } + val input = remember { mutableStateOf("") } @@ -91,19 +99,22 @@ fun CreateSpaceScreen( input = input, onActionDone = { focusManager.clearFocus() - onCreate(input.value) + onCreate(input.value, isSpaceLevelChatSwitchChecked.value) } ) Divider() Section(title = stringResource(id = R.string.type)) TypeOfSpace(spaceType = PRIVATE_SPACE_TYPE) Divider() + if (BuildConfig.DEBUG) { + DebugCreateSpaceLevelChatToggle(isSpaceLevelChatSwitchChecked) + } Spacer(modifier = Modifier.height(78.dp)) } CreateSpaceButton( onCreate = { name -> focusManager.clearFocus() - onCreate(name) + onCreate(name, isSpaceLevelChatSwitchChecked.value) }, input = input, modifier = Modifier.align(Alignment.BottomCenter), @@ -112,6 +123,36 @@ fun CreateSpaceScreen( } } +@Composable +private fun DebugCreateSpaceLevelChatToggle(isChatToggleChecked: MutableState) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .height(52.dp) + ) { + Switch( + checked = isChatToggleChecked.value, + onCheckedChange = { + isChatToggleChecked.value = it + }, + colors = SwitchDefaults.colors().copy( + checkedBorderColor = Color.Transparent, + uncheckedBorderColor = Color.Transparent, + checkedTrackColor = colorResource(R.color.palette_system_amber_50), + uncheckedTrackColor = colorResource(R.color.shape_secondary) + ) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = "Enable space-level chat (dev mode)", + color = colorResource(id = com.anytypeio.anytype.ui_settings.R.color.text_primary), + style = BodyRegular + ) + } +} + @Composable private fun CreateSpaceButton( modifier: Modifier, @@ -287,4 +328,6 @@ fun UseCase() { style = BodyRegular ) } -} \ No newline at end of file +} + +typealias IsSpaceLevelChatSwitchChecked = Boolean \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt index 77a041e151..9d51d28de7 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt @@ -626,7 +626,12 @@ sealed class Command { val chat: Id, val beforeMessageId: Id, val limit: Int - ) : ChatCommand() + ) : ChatCommand() { + data class Response( + val messages: List, + val state: Chat.State? = null + ) + } data class GetMessagesByIds( val chat: Id, @@ -639,7 +644,8 @@ sealed class Command { ) : ChatCommand() { data class Response( val messages: List, - val messageCountBefore: Int + val messageCountBefore: Int, + val chatState: Chat.State? = null ) } diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt index 88a0381f3f..d664539e65 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt @@ -344,6 +344,24 @@ sealed class Event { val id: Id, val reactions: Map> ) : Chats() + + // TODO check whether nullable state makes sense here. + data class UpdateState( + override val context: Id, + val state: Chat.State? + ) : Chats() + + data class UpdateMessageReadStatus( + override val context: Id, + val messages: List, + val isRead: Boolean + ) : Chats() + + data class UpdateMentionReadStatus( + override val context: Id, + val messages: List, + val isRead: Boolean + ) : Chats() } } } \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/chats/Chat.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/chats/Chat.kt index 4e28968cb2..3f8ef304a0 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/chats/Chat.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/chats/Chat.kt @@ -7,6 +7,8 @@ sealed class Chat { /** * @property [id] message id + * @property [read] whether this message is read + * @property [mentionRead] whether mention contained in this message read */ data class Message( val id: Id, @@ -18,6 +20,8 @@ sealed class Chat { val attachments: List = emptyList(), val reactions: Map>, val replyToMessageId: Id? = null, + val read: Boolean = false, + val mentionRead: Boolean = false ) { data class Content( val text: String, @@ -85,4 +89,18 @@ sealed class Chat { ) } } + + data class State( + val unreadMessages: UnreadState?, + val unreadMentions: UnreadState?, + val lastStateId: Id, + ) { + /** + * @property olderOrderId oldest(in the lex sorting) unread message order id. Client should ALWAYS scroll through unread messages from the oldest to the newest + */ + data class UnreadState( + val olderOrderId: Id, + val counter: Int + ) + } } \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt index 673e38ca4f..1308d4330a 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt @@ -1065,7 +1065,7 @@ class BlockDataRepository( remote.deleteChatMessage(command) } - override suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): List { + override suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): Command.ChatCommand.GetMessages.Response { return remote.getChatMessages(command) } diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt index 5a88a24e90..ecd8ecccf3 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt @@ -455,7 +455,7 @@ interface BlockRemote { suspend fun addChatMessage(command: Command.ChatCommand.AddMessage): Pair> suspend fun editChatMessage(command: Command.ChatCommand.EditMessage) suspend fun deleteChatMessage(command: Command.ChatCommand.DeleteMessage) - suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): List + suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): Command.ChatCommand.GetMessages.Response suspend fun getChatMessagesByIds(command: Command.ChatCommand.GetMessagesByIds): List suspend fun subscribeLastChatMessages(command: Command.ChatCommand.SubscribeLastMessages): Command.ChatCommand.SubscribeLastMessages.Response suspend fun toggleChatMessageReaction(command: Command.ChatCommand.ToggleMessageReaction) diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt index 9d1b1aa336..8daa4d0ab2 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt @@ -496,7 +496,7 @@ interface BlockRepository { suspend fun addChatMessage(command: Command.ChatCommand.AddMessage): Pair> suspend fun editChatMessage(command: Command.ChatCommand.EditMessage) suspend fun deleteChatMessage(command: Command.ChatCommand.DeleteMessage) - suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): List + suspend fun getChatMessages(command: Command.ChatCommand.GetMessages): Command.ChatCommand.GetMessages.Response suspend fun getChatMessagesByIds(command: Command.ChatCommand.GetMessagesByIds): List suspend fun subscribeLastChatMessages(command: Command.ChatCommand.SubscribeLastMessages): Command.ChatCommand.SubscribeLastMessages.Response suspend fun toggleChatMessageReaction(command: Command.ChatCommand.ToggleMessageReaction) diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt index 03a35da054..f2cb1cbaff 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt @@ -166,6 +166,16 @@ class ChatContainer @Inject constructor( msg } } + + is Event.Command.Chats.UpdateMentionReadStatus -> { + // TODO handle event + } + is Event.Command.Chats.UpdateMessageReadStatus -> { + // TODO handle event + } + is Event.Command.Chats.UpdateState -> { + // TODO handle event + } } } return result diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/chats/GetChatMessages.kt b/domain/src/main/java/com/anytypeio/anytype/domain/chats/GetChatMessages.kt index f0eeb13fc3..adf061aca4 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/chats/GetChatMessages.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/chats/GetChatMessages.kt @@ -10,10 +10,10 @@ import javax.inject.Inject class GetChatMessages @Inject constructor( private val repo: BlockRepository, dispatchers: AppCoroutineDispatchers -): ResultInteractor>(dispatchers.io) { - override suspend fun doWork( - params: Command.ChatCommand.GetMessages - ): List { +): ResultInteractor(dispatchers.io) { + + + override suspend fun doWork(params: Command.ChatCommand.GetMessages): Command.ChatCommand.GetMessages.Response { return repo.getChatMessages(params) } } \ No newline at end of file diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/spaces/CreateSpace.kt b/domain/src/main/java/com/anytypeio/anytype/domain/spaces/CreateSpace.kt index f90e92d079..6f8ddb5491 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/spaces/CreateSpace.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/spaces/CreateSpace.kt @@ -18,7 +18,7 @@ class CreateSpace @Inject constructor( details = params.details, withChat = params.withChat, shouldApplyEmptyUseCase = params.shouldApplyEmptyUseCase - ), + ) ) data class Params( diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt index 28592a5707..e7115684fd 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt @@ -1029,7 +1029,7 @@ class BlockMiddleware( override suspend fun getChatMessages( command: Command.ChatCommand.GetMessages - ): List { + ): Command.ChatCommand.GetMessages.Response { return middleware.chatGetMessages(command) } diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt index daa4c2e387..412308d400 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt @@ -2775,14 +2775,17 @@ class Middleware @Inject constructor( } @Throws - fun chatGetMessages(command: Command.ChatCommand.GetMessages) : List { + fun chatGetMessages(command: Command.ChatCommand.GetMessages) : Command.ChatCommand.GetMessages.Response { val request = Rpc.Chat.GetMessages.Request( chatObjectId = command.chat ) logRequestIfDebug(request) val (response, time) = measureTimedValue { service.chatGetMessages(request) } logResponseIfDebug(response, time) - return response.messages.map { it.core() } + return Command.ChatCommand.GetMessages.Response( + messages = response.messages.map { it.core() }, + state = response.chatState?.core() + ) } @Throws @@ -2821,7 +2824,8 @@ class Middleware @Inject constructor( logResponseIfDebug(response, time) return Command.ChatCommand.SubscribeLastMessages.Response( messages = response.messages.map { it.core() }, - messageCountBefore = response.numMessagesBefore + messageCountBefore = response.numMessagesBefore, + chatState = response.chatState?.core() ) } diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventChannel.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventChannel.kt index e03c591e93..498082eda2 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventChannel.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventChannel.kt @@ -57,6 +57,9 @@ class MiddlewareEventChannel( blockDataviewIsCollectionSet != null -> true blockSetWidget != null -> true spaceAutoWidgetAdded != null -> true + chatStateUpdate != null -> true + chatUpdateMentionReadStatus != null -> true + chatUpdateMessageReadStatus != null -> true else -> false.also { if (featureToggles.isLogMiddlewareInteraction) Timber.w("Ignored event: $this") diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventMapper.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventMapper.kt index 137edd2989..8f72d51be6 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventMapper.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareEventMapper.kt @@ -322,6 +322,32 @@ fun anytype.Event.Message.toCoreModels( } ) } + chatStateUpdate != null -> { + val event = chatStateUpdate + checkNotNull(event) + Event.Command.Chats.UpdateState( + context = context, + state = event.state?.core() + ) + } + chatUpdateMessageReadStatus != null -> { + val event = chatUpdateMessageReadStatus + checkNotNull(event) + Event.Command.Chats.UpdateMessageReadStatus( + context = context, + messages = event.ids, + isRead = event.isRead + ) + } + chatUpdateMentionReadStatus != null -> { + val event = chatUpdateMentionReadStatus + checkNotNull(event) + Event.Command.Chats.UpdateMentionReadStatus( + context = context, + messages = event.ids, + isRead = event.isRead + ) + } spaceAutoWidgetAdded != null -> { val event = spaceAutoWidgetAdded checkNotNull(event) diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt index 92f7a14ac7..0c538b91ec 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt @@ -39,6 +39,7 @@ typealias MBSplitMode = anytype.Rpc.Block.Split.Request.Mode typealias MBTableOfContents = anytype.model.Block.Content.TableOfContents typealias MChatMessage = anytype.model.ChatMessage +typealias MChatState = anytype.model.ChatState typealias MChatMessageContent = anytype.model.ChatMessage.MessageContent typealias MChatMessageAttachment = anytype.model.ChatMessage.Attachment typealias MChatMessageAttachmentType = anytype.model.ChatMessage.Attachment.AttachmentType diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt index 46916fd39f..4cb218c14a 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.middleware.mappers import anytype.ResponseEvent import anytype.Rpc import anytype.model.Account +import anytype.model.ChatState import anytype.model.NameserviceNameType import anytype.model.ParticipantPermissions import anytype.model.Restrictions @@ -1146,7 +1147,9 @@ fun MChatMessage.core(): Chat.Message = Chat.Message( order = orderId, reactions = reactions?.reactions?.mapValues { (unicode, identities) -> identities.ids - } ?: emptyMap() + } ?: emptyMap(), + read = read, + mentionRead = mentionRead ) fun MChatMessageContent.core(): Chat.Message.Content = Chat.Message.Content( @@ -1155,6 +1158,22 @@ fun MChatMessageContent.core(): Chat.Message.Content = Chat.Message.Content( marks = marks.map { it.toCoreModels() } ) +fun MChatState.core(): Chat.State = Chat.State( + unreadMessages = messages?.let { unread -> + Chat.State.UnreadState( + counter = unread.counter, + olderOrderId = unread.oldestOrderId + ) + }, + unreadMentions = mentions?.let { unread -> + Chat.State.UnreadState( + counter = unread.counter, + olderOrderId = unread.oldestOrderId + ) + }, + lastStateId = lastStateId +) + fun Rpc.History.Version.toCoreModel(): Version { return Version( id = id, diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt index 27aa0a1d37..0997c16bd5 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt @@ -607,6 +607,7 @@ interface MiddlewareService { fun chatGetMessages(request: Rpc.Chat.GetMessages.Request): Rpc.Chat.GetMessages.Response fun chatGetMessagesByIds(request: Rpc.Chat.GetMessagesByIds.Request): Rpc.Chat.GetMessagesByIds.Response fun chatDeleteMessage(request: Rpc.Chat.DeleteMessage.Request): Rpc.Chat.DeleteMessage.Response + fun chatReadMessages(request: Rpc.Chat.ReadMessages.Request): Rpc.Chat.ReadMessages.Response fun chatSubscribeLastMessages(request: Rpc.Chat.SubscribeLastMessages.Request): Rpc.Chat.SubscribeLastMessages.Response fun chatToggleMessageReaction(request: Rpc.Chat.ToggleMessageReaction.Request): Rpc.Chat.ToggleMessageReaction.Response fun chatUnsubscribe(request: Rpc.Chat.Unsubscribe.Request): Rpc.Chat.Unsubscribe.Response diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt index 3a4d80fcbf..4e87beda07 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt @@ -2390,6 +2390,19 @@ class MiddlewareServiceImplementation @Inject constructor( } } + override fun chatReadMessages(request: Rpc.Chat.ReadMessages.Request): Rpc.Chat.ReadMessages.Response { + val encoded = Service.chatReadMessages( + Rpc.Chat.ReadMessages.Request.ADAPTER.encode(request) + ) + val response = Rpc.Chat.ReadMessages.Response.ADAPTER.decode(encoded) + val error = response.error + if (error != null && error.code != Rpc.Chat.ReadMessages.Response.Error.Code.NULL) { + throw Exception(error.description) + } else { + return response + } + } + override fun chatGetMessages(request: Rpc.Chat.GetMessages.Request): Rpc.Chat.GetMessages.Response { val encoded = Service.chatGetMessages( Rpc.Chat.GetMessages.Request.ADAPTER.encode(request) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/CreateSpaceViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/CreateSpaceViewModel.kt index abb1ae907e..977150ce66 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/CreateSpaceViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/CreateSpaceViewModel.kt @@ -17,6 +17,7 @@ import com.anytypeio.anytype.domain.base.fold import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer import com.anytypeio.anytype.domain.spaces.CreateSpace import com.anytypeio.anytype.domain.workspace.SpaceManager +import com.anytypeio.anytype.presentation.BuildConfig import com.anytypeio.anytype.presentation.common.BaseViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableSharedFlow @@ -49,7 +50,8 @@ class CreateSpaceViewModel( val isDismissed = MutableStateFlow(false) - fun onCreateSpace(name: String) { + fun onCreateSpace(name: String, isSpaceLevelChatSwitchChecked: Boolean) { + Timber.d("onCreateSpace, isSpaceLevelChatSwitchChecked: $isSpaceLevelChatSwitchChecked") if (isDismissed.value) { return } @@ -57,7 +59,6 @@ class CreateSpaceViewModel( sendToast("Please wait...") return } - val isSingleSpace = spaceViewContainer.get().size == 1 val numberOfActiveSpaces = spaceViewContainer.get().filter { it.isActive }.size viewModelScope.launch { createSpace.stream( @@ -67,7 +68,7 @@ class CreateSpaceViewModel( Relations.ICON_OPTION to spaceIconView.value.color.index.toDouble() ), shouldApplyEmptyUseCase = numberOfActiveSpaces >= MAX_SPACE_COUNT_WITH_GET_STARTED_USE_CASE, - withChat = false + withChat = BuildConfig.DEBUG && isSpaceLevelChatSwitchChecked ) ).collect { result -> result.fold( @@ -82,12 +83,7 @@ class CreateSpaceViewModel( setNewSpaceAsCurrentSpace(space) Timber.d("Successfully created space: $space").also { isInProgress.value = false - commands.emit( - Command.SwitchSpace( - space = Space(space), - showMultiplayerTooltip = isSingleSpace - ) - ) + commands.emit(Command.SwitchSpace(space = Space(space))) } }, onFailure = { @@ -134,9 +130,7 @@ class CreateSpaceViewModel( sealed class Command { data class SwitchSpace( - val space: Space, - @Deprecated("Tooltip is outdated. Should be skipped for now.") - val showMultiplayerTooltip: Boolean + val space: Space ): Command() }