diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/chats/ChatReactionDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/chats/ChatReactionDI.kt index 5bb8654b8f..fee6b9ad75 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/chats/ChatReactionDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/chats/ChatReactionDI.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.di.feature.chats import androidx.lifecycle.ViewModelProvider import com.anytypeio.anytype.core_utils.di.scope.PerScreen import com.anytypeio.anytype.di.common.ComponentDependencies +import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.misc.UrlBuilder @@ -50,6 +51,7 @@ object ChatReactionModule { interface ChatReactionDependencies : ComponentDependencies { fun dispatchers(): AppCoroutineDispatchers fun repo(): BlockRepository + fun auth(): AuthRepository fun urlBuilder(): UrlBuilder fun members(): ActiveSpaceMemberSubscriptionContainer } \ No newline at end of file diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatReactionViewModel.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatReactionViewModel.kt index 0a743d617f..8fe3e3afd5 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatReactionViewModel.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatReactionViewModel.kt @@ -5,7 +5,9 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.anytypeio.anytype.core_models.Command import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.domain.auth.interactor.GetAccount import com.anytypeio.anytype.domain.base.getOrDefault +import com.anytypeio.anytype.domain.base.onFailure import com.anytypeio.anytype.domain.chats.GetChatMessagesByIds import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.multiplayer.ActiveSpaceMemberSubscriptionContainer @@ -15,10 +17,12 @@ import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import timber.log.Timber class ChatReactionViewModel @Inject constructor( private val vmParams: Params, private val getChatMessagesByIds: GetChatMessagesByIds, + private val getAccount: GetAccount, private val members: ActiveSpaceMemberSubscriptionContainer, private val urlBuilder: UrlBuilder ) : BaseViewModel() { @@ -27,6 +31,13 @@ class ChatReactionViewModel @Inject constructor( init { viewModelScope.launch { + val account = getAccount + .async(Unit) + .onFailure { + Timber.e(it, "Failed to get account for chat reaction screen") + } + .getOrNull() + val result = getChatMessagesByIds .async( Command.ChatCommand.GetMessagesByIds( @@ -53,7 +64,7 @@ class ChatReactionViewModel @Inject constructor( urlBuilder = urlBuilder ), name = member.name.orEmpty(), - isUser = false + isUser = account?.id == member.identity ) } else { null @@ -86,6 +97,7 @@ class ChatReactionViewModel @Inject constructor( class Factory @Inject constructor( private val vmParams: Params, private val getChatMessagesByIds: GetChatMessagesByIds, + private val getAccount: GetAccount, private val members: ActiveSpaceMemberSubscriptionContainer, private val urlBuilder: UrlBuilder ) : ViewModelProvider.Factory { @@ -93,6 +105,7 @@ class ChatReactionViewModel @Inject constructor( override fun create(modelClass: Class): T = ChatReactionViewModel( vmParams = vmParams, getChatMessagesByIds = getChatMessagesByIds, + getAccount = getAccount, members = members, urlBuilder = urlBuilder ) as T diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt index b60909e8be..0be7d07737 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt @@ -80,6 +80,8 @@ class ChatViewModel @Inject constructor( private val dateFormatter = SimpleDateFormat("d MMMM YYYY") private val data = MutableStateFlow>(emptyList()) + private var account: Id = "" + init { viewModelScope.launch { spaceViews @@ -98,9 +100,16 @@ class ChatViewModel @Inject constructor( } } viewModelScope.launch { - val account = requireNotNull(getAccount.async(Unit).getOrNull()) + getAccount + .async(Unit) + .onSuccess { acc -> + account = acc.id + } + .onFailure { + Timber.e("Failed to find account for space-level chat") + } proceedWithObservingChatMessages( - account = account.id, + account = account, chat = vmParams.ctx ) } @@ -303,7 +312,8 @@ class ChatViewModel @Inject constructor( icon = SpaceMemberIconView.icon( obj = member, urlBuilder = urlBuilder - ) + ), + isUser = member.identity == account ) }.filter { m -> if (query != null) { diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatReactionScreen.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatReactionScreen.kt index 4542766784..9c38b398dc 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatReactionScreen.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatReactionScreen.kt @@ -16,7 +16,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.anytypeio.anytype.core_ui.common.DefaultPreviews import com.anytypeio.anytype.core_ui.features.multiplayer.SpaceMemberIcon @@ -24,6 +26,8 @@ import com.anytypeio.anytype.core_ui.foundation.Divider import com.anytypeio.anytype.core_ui.foundation.Dragger import com.anytypeio.anytype.core_ui.views.BodyCallout import com.anytypeio.anytype.core_ui.views.BodyRegular +import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium +import com.anytypeio.anytype.core_ui.views.PreviewTitle2Regular import com.anytypeio.anytype.core_ui.views.Relations3 import com.anytypeio.anytype.feature_chats.R import com.anytypeio.anytype.feature_chats.presentation.ChatReactionViewModel.ViewState @@ -67,7 +71,8 @@ fun ChatReactionScreen( val member = viewState.members[idx] ChatMemberItem( name = member.name, - icon = member.icon + icon = member.icon, + isUser = member.isUser ) if (idx != viewState.members.lastIndex) { Divider() @@ -100,7 +105,8 @@ fun ChatReactionScreen( fun ChatMemberItem( modifier: Modifier = Modifier, name: String, - icon: SpaceMemberIconView + icon: SpaceMemberIconView, + isUser: Boolean = false ) { Box( modifier = modifier @@ -121,12 +127,25 @@ fun ChatMemberItem( .align(Alignment.CenterStart) .padding(start = 60.dp) ) { - Text( - text = name.ifEmpty { - stringResource(R.string.untitled) - }, - color = colorResource(R.color.text_primary) - ) + Row { + Text( + text = name.ifEmpty { stringResource(R.string.untitled) }, + color = colorResource(R.color.text_primary), + style = PreviewTitle2Regular, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, fill = false) + ) + if (isUser) { + Spacer(modifier = Modifier.width(4.dp)) + val youAsMemberText = stringResource(id = R.string.multiplayer_you_as_member) + Text( + text = "($youAsMemberText)", + style = PreviewTitle2Regular, + color = colorResource(id = R.color.text_secondary), + ) + } + } Text( text = stringResource(R.string.object_types_human), style = Relations3, @@ -207,6 +226,30 @@ private fun MemberPreview() { ) } +@DefaultPreviews +@Composable +private fun MemberUserPreview() { + ChatMemberItem( + name = "Walter Benjamin Walter Walter Walter Walter", + icon = SpaceMemberIconView.Placeholder( + name = "Walter" + ), + isUser = true + ) +} + +@DefaultPreviews +@Composable +private fun MemberOverflowPreview() { + ChatMemberItem( + name = "Walter Benjamin Walter Walter Walter Walter", + icon = SpaceMemberIconView.Placeholder( + name = "Walter" + ), + isUser = true + ) +} + @DefaultPreviews @Composable private fun EmojiToolbarPreview() { diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt index aa3e7c0a7b..6cf27cc3ee 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt @@ -352,6 +352,7 @@ fun ChatScreen( ChatMemberItem( name = member.name, icon = member.icon, + isUser = member.isUser, modifier = Modifier .fillMaxWidth() .noRippleClickable { diff --git a/localization/src/main/res/values/strings.xml b/localization/src/main/res/values/strings.xml index 7c6761eec4..dfa192f112 100644 --- a/localization/src/main/res/values/strings.xml +++ b/localization/src/main/res/values/strings.xml @@ -1439,7 +1439,7 @@ %1$d requests - you + You Spaces