Skip to content

Commit

Permalink
DROID-3217 DROID-2876 Space-level chat | Fix | Add (you) in mention m…
Browse files Browse the repository at this point in the history
…enu and in bubble-reactions cards near current user space member card (#2091)
  • Loading branch information
uburoiubu authored Feb 13, 2025
1 parent 2a114b6 commit 1e67042
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -50,6 +51,7 @@ object ChatReactionModule {
interface ChatReactionDependencies : ComponentDependencies {
fun dispatchers(): AppCoroutineDispatchers
fun repo(): BlockRepository
fun auth(): AuthRepository
fun urlBuilder(): UrlBuilder
fun members(): ActiveSpaceMemberSubscriptionContainer
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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() {
Expand All @@ -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(
Expand All @@ -53,7 +64,7 @@ class ChatReactionViewModel @Inject constructor(
urlBuilder = urlBuilder
),
name = member.name.orEmpty(),
isUser = false
isUser = account?.id == member.identity
)
} else {
null
Expand Down Expand Up @@ -86,13 +97,15 @@ 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 {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = ChatReactionViewModel(
vmParams = vmParams,
getChatMessagesByIds = getChatMessagesByIds,
getAccount = getAccount,
members = members,
urlBuilder = urlBuilder
) as T
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class ChatViewModel @Inject constructor(
private val dateFormatter = SimpleDateFormat("d MMMM YYYY")
private val data = MutableStateFlow<List<Chat.Message>>(emptyList())

private var account: Id = ""

init {
viewModelScope.launch {
spaceViews
Expand All @@ -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
)
}
Expand Down Expand Up @@ -303,7 +312,8 @@ class ChatViewModel @Inject constructor(
icon = SpaceMemberIconView.icon(
obj = member,
urlBuilder = urlBuilder
)
),
isUser = member.identity == account
)
}.filter { m ->
if (query != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@ 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
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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -100,7 +105,8 @@ fun ChatReactionScreen(
fun ChatMemberItem(
modifier: Modifier = Modifier,
name: String,
icon: SpaceMemberIconView
icon: SpaceMemberIconView,
isUser: Boolean = false
) {
Box(
modifier = modifier
Expand All @@ -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,
Expand Down Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ fun ChatScreen(
ChatMemberItem(
name = member.name,
icon = member.icon,
isUser = member.isUser,
modifier = Modifier
.fillMaxWidth()
.noRippleClickable {
Expand Down
2 changes: 1 addition & 1 deletion localization/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1439,7 +1439,7 @@
<item quantity="other">%1$d requests</item>
</plurals>

<string name="multiplayer_you_as_member">you</string>
<string name="multiplayer_you_as_member">You</string>

<string name="multiplayer_spaces">Spaces</string>

Expand Down

0 comments on commit 1e67042

Please sign in to comment.