diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt index b37f871d87..710ecb9efd 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt @@ -11,6 +11,7 @@ import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.bin.EmptyBin import com.anytypeio.anytype.domain.block.interactor.Move import com.anytypeio.anytype.domain.block.repo.BlockRepository +import com.anytypeio.anytype.domain.chats.ChatPreviewContainer import com.anytypeio.anytype.domain.config.ConfigStorage import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.debugging.Logger @@ -300,4 +301,5 @@ interface HomeScreenDependencies : ComponentDependencies { fun featureToggles(): FeatureToggles fun payloadDelegator(): PayloadDelegator fun fieldParser(): FieldParser + fun chatPreviews(): ChatPreviewContainer } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt b/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt index a79b4dc95e..89abdb5de1 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt @@ -229,7 +229,8 @@ object SubscriptionsModule { isSpaceDeleted: SpaceDeletedStatusWatcher, profileSubscriptionManager: ProfileSubscriptionManager, networkConnectionStatus: NetworkConnectionStatus, - deviceTokenStoringService: DeviceTokenStoringService + deviceTokenStoringService: DeviceTokenStoringService, + chatPreviewContainer: ChatPreviewContainer ): GlobalSubscriptionManager = GlobalSubscriptionManager.Default( types = types, relations = relations, @@ -237,7 +238,8 @@ object SubscriptionsModule { isSpaceDeleted = isSpaceDeleted, profile = profileSubscriptionManager, networkConnectionStatus = networkConnectionStatus, - deviceTokenStoringService = deviceTokenStoringService + deviceTokenStoringService = deviceTokenStoringService, + chatPreviewContainer = chatPreviewContainer ) @JvmStatic diff --git a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt index 6e288169c0..bc4261edd6 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt @@ -499,7 +499,9 @@ private fun WidgetList( is WidgetView.SpaceChat -> { SpaceChatWidgetCard( mode = mode, - onWidgetClicked = { onBundledWidgetHeaderClicked(item.id) } + unReadMentionCount = item.unreadMentionCount, + unReadMessageCount = item.unreadMessageCount, + onWidgetClicked = { onWidgetSourceClicked(item.id, item.source) } ) } is WidgetView.Action.EditWidgets -> { diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceChatWidget.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceChatWidget.kt index 636eab8e5f..93f4269d7e 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceChatWidget.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/SpaceChatWidget.kt @@ -6,9 +6,15 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -17,19 +23,24 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_ui.common.DefaultPreviews +import com.anytypeio.anytype.core_ui.views.Caption1Regular import com.anytypeio.anytype.core_ui.views.HeadlineSubheading import com.anytypeio.anytype.presentation.home.InteractionMode @Composable fun SpaceChatWidgetCard( mode: InteractionMode, - onWidgetClicked: () -> Unit = {} + onWidgetClicked: () -> Unit = {}, + unReadMessageCount: Int = 0, + unReadMentionCount: Int = 0 ) { - Box( + Row( modifier = Modifier .padding(start = 20.dp, end = 20.dp, top = 6.dp, bottom = 6.dp) .fillMaxWidth() @@ -47,45 +58,76 @@ fun SpaceChatWidgetCard( } else { Modifier } - ) + ), + verticalAlignment = Alignment.CenterVertically ) { Image( - painter = painterResource(id = R.drawable.ic_widget_all_content), + painter = painterResource(id = R.drawable.ic_widget_chat), contentDescription = "All content icon", modifier = Modifier - .align(Alignment.CenterStart) .padding(start = 16.dp) ) Text( - // Temporary hard-coded name for the widget - text = "Space chat", + text = stringResource(R.string.chat), maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier - .align(Alignment.CenterStart) - .padding(start = 44.dp, end = 16.dp), + .weight(1f) + .padding(start = 8.dp, end = 16.dp), style = HeadlineSubheading, color = colorResource(id = R.color.text_primary), ) + if (unReadMentionCount > 0) { + Box( + modifier = Modifier + .background( + color = colorResource(R.color.transparent_active), + shape = CircleShape + ) + .size(20.dp), + contentAlignment = Alignment.Center + ) { + Image( + painter = painterResource(R.drawable.ic_chat_widget_mention), + contentDescription = null + ) + } + } + + if (unReadMessageCount > 0) { + if (unReadMentionCount > 0) { + Spacer(modifier = Modifier.width(8.dp)) + } + Box( + modifier = Modifier + .height(20.dp) + .defaultMinSize(minWidth = 20.dp) + .background( + color = colorResource(R.color.transparent_active), + shape = CircleShape + ), + contentAlignment = Alignment.Center + ) { + Text( + text = unReadMentionCount.toString(), + style = Caption1Regular, + color = colorResource(id = R.color.text_white), + ) + } + Spacer(modifier = Modifier.width(16.dp)) + } } } -@Preview( - name = "Dark Mode", - showBackground = true, - uiMode = UI_MODE_NIGHT_YES -) -@Preview( - name = "Light Mode", - showBackground = true, - uiMode = UI_MODE_NIGHT_NO -) +@DefaultPreviews @Composable fun SpaceChatWidgetPreview() { SpaceChatWidgetCard( onWidgetClicked = {}, - mode = InteractionMode.Default + mode = InteractionMode.Default, + unReadMessageCount = 1, + unReadMentionCount = 1 ) } diff --git a/core-ui/src/main/res/drawable/ic_chat_widget_mention.xml b/core-ui/src/main/res/drawable/ic_chat_widget_mention.xml new file mode 100644 index 0000000000..1e572d3b9a --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_chat_widget_mention.xml @@ -0,0 +1,9 @@ + + + diff --git a/core-ui/src/main/res/drawable/ic_widget_chat.xml b/core-ui/src/main/res/drawable/ic_widget_chat.xml new file mode 100644 index 0000000000..e988996223 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_widget_chat.xml @@ -0,0 +1,9 @@ + + + diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatPreviewContainer.kt b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatPreviewContainer.kt index 14a0c643e7..3984595dde 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatPreviewContainer.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatPreviewContainer.kt @@ -13,6 +13,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.scan import kotlinx.coroutines.launch @@ -26,6 +28,7 @@ interface ChatPreviewContainer { suspend fun getAll(): List suspend fun getPreview(space: SpaceId): Chat.Preview? + fun observePreview(space: SpaceId) : Flow fun observePreviews() : Flow> class Default @Inject constructor( @@ -113,6 +116,12 @@ interface ChatPreviewContainer { return previews.value.firstOrNull { preview -> preview.space.id == space.id } } + override fun observePreview(space: SpaceId): Flow { + return previews.map { + it.firstOrNull { preview -> preview.space.id == space.id } + } + } + override fun observePreviews(): Flow> { return previews } diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/subscriptions/GlobalSubscriptionManager.kt b/domain/src/main/java/com/anytypeio/anytype/domain/subscriptions/GlobalSubscriptionManager.kt index a81871b08f..c5c15e7632 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/subscriptions/GlobalSubscriptionManager.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/subscriptions/GlobalSubscriptionManager.kt @@ -1,5 +1,6 @@ package com.anytypeio.anytype.domain.subscriptions +import com.anytypeio.anytype.domain.chats.ChatPreviewContainer import com.anytypeio.anytype.domain.device.DeviceTokenStoringService import com.anytypeio.anytype.domain.device.NetworkConnectionStatus import com.anytypeio.anytype.domain.multiplayer.UserPermissionProvider @@ -21,7 +22,8 @@ interface GlobalSubscriptionManager { private val isSpaceDeleted: SpaceDeletedStatusWatcher, private val profile: ProfileSubscriptionManager, private val networkConnectionStatus: NetworkConnectionStatus, - private val deviceTokenStoringService: DeviceTokenStoringService + private val deviceTokenStoringService: DeviceTokenStoringService, + private val chatPreviewContainer: ChatPreviewContainer ) : GlobalSubscriptionManager { override fun onStart() { @@ -32,6 +34,7 @@ interface GlobalSubscriptionManager { profile.onStart() networkConnectionStatus.start() deviceTokenStoringService.start() + chatPreviewContainer.start() } override fun onStop() { @@ -42,6 +45,7 @@ interface GlobalSubscriptionManager { profile.onStop() networkConnectionStatus.stop() deviceTokenStoringService.stop() + chatPreviewContainer.stop() } } diff --git a/domain/src/test/java/com/anytypeio/anytype/domain/chats/ChatContainerTest.kt b/domain/src/test/java/com/anytypeio/anytype/domain/chats/ChatContainerTest.kt index 0a818a7d85..a8e3e88202 100644 --- a/domain/src/test/java/com/anytypeio/anytype/domain/chats/ChatContainerTest.kt +++ b/domain/src/test/java/com/anytypeio/anytype/domain/chats/ChatContainerTest.kt @@ -157,7 +157,7 @@ class ChatContainerTest { listOf( Event.Command.Chats.Delete( context = givenChatID, - id = initialMsg.id, + message = initialMsg.id, ) ) ) diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt index 32fdfa8edb..84e53496df 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt @@ -71,7 +71,9 @@ fun ChatTopToolbar( .noRippleClickable { onSpaceNameClicked() } , text = when(header) { - is ChatViewModel.HeaderView.Default -> header.title + is ChatViewModel.HeaderView.Default -> header.title.ifEmpty { + stringResource(R.string.untitled) + } is ChatViewModel.HeaderView.Init -> "" }, color = colorResource(R.color.text_primary), diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt index 9d5511a6c7..24f21b3fc8 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt @@ -47,6 +47,7 @@ import com.anytypeio.anytype.domain.base.onSuccess import com.anytypeio.anytype.domain.bin.EmptyBin import com.anytypeio.anytype.domain.block.interactor.CreateBlock import com.anytypeio.anytype.domain.block.interactor.Move +import com.anytypeio.anytype.domain.chats.ChatPreviewContainer import com.anytypeio.anytype.domain.collections.AddObjectToCollection import com.anytypeio.anytype.domain.dashboard.interactor.SetObjectListIsFavorite import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject @@ -122,6 +123,7 @@ import com.anytypeio.anytype.presentation.widgets.DropDownMenuAction import com.anytypeio.anytype.presentation.widgets.LinkWidgetContainer import com.anytypeio.anytype.presentation.widgets.ListWidgetContainer import com.anytypeio.anytype.presentation.widgets.SpaceBinWidgetContainer +import com.anytypeio.anytype.presentation.widgets.SpaceChatWidgetContainer import com.anytypeio.anytype.presentation.widgets.SpaceWidgetContainer import com.anytypeio.anytype.presentation.widgets.TreePath import com.anytypeio.anytype.presentation.widgets.TreeWidgetBranchStateHolder @@ -233,7 +235,8 @@ class HomeScreenViewModel( private val getSpaceInviteLink: GetSpaceInviteLink, private val deleteSpace: DeleteSpace, private val spaceMembers: ActiveSpaceMemberSubscriptionContainer, - private val setAsFavourite: SetObjectListIsFavorite + private val setAsFavourite: SetObjectListIsFavorite, + private val chatPreviews: ChatPreviewContainer ) : NavigationViewModel(), Reducer, WidgetActiveViewStateHolder by widgetActiveViewStateHolder, @@ -507,6 +510,10 @@ class HomeScreenViewModel( widgets.forceChatPosition().filter { widget -> widget.hasValidLayout() }.map { widget -> when (widget) { + is Widget.Chat -> SpaceChatWidgetContainer( + widget = widget, + container = chatPreviews + ) is Widget.Link -> LinkWidgetContainer( widget = widget, fieldParser = fieldParser @@ -1192,7 +1199,7 @@ class HomeScreenViewModel( ) ) } - WidgetView.SpaceChat.id -> { + BundledWidgetSourceIds.CHAT -> { proceedWithSpaceChatWidgetHeaderClick() } else -> { @@ -1315,6 +1322,7 @@ class HomeScreenViewModel( } // All-objects widget has link appearance. is Widget.AllObjects -> Command.ChangeWidgetType.TYPE_LINK + is Widget.Chat -> Command.ChangeWidgetType.TYPE_LINK } // TODO move to a separate reducer inject into this VM's constructor @@ -2690,7 +2698,8 @@ class HomeScreenViewModel( private val getSpaceInviteLink: GetSpaceInviteLink, private val deleteSpace: DeleteSpace, private val activeSpaceMemberSubscriptionContainer: ActiveSpaceMemberSubscriptionContainer, - private val setObjectListIsFavorite: SetObjectListIsFavorite + private val setObjectListIsFavorite: SetObjectListIsFavorite, + private val chatPreviews: ChatPreviewContainer ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T = HomeScreenViewModel( @@ -2748,7 +2757,8 @@ class HomeScreenViewModel( getSpaceInviteLink = getSpaceInviteLink, deleteSpace = this@Factory.deleteSpace, spaceMembers = activeSpaceMemberSubscriptionContainer, - setAsFavourite = setObjectListIsFavorite + setAsFavourite = setObjectListIsFavorite, + chatPreviews = chatPreviews ) as T } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt index 32f30fdcd0..b545a80bd2 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt @@ -93,7 +93,7 @@ class DataViewListWidgetContainer( ) ) } - is Widget.Link, is Widget.Tree, is Widget.AllObjects -> { + is Widget.Link, is Widget.Tree, is Widget.AllObjects, is Widget.Chat -> { throw IllegalStateException("Incompatible widget type.") } } @@ -150,7 +150,7 @@ class DataViewListWidgetContainer( ) ) } - is Widget.Tree, is Widget.Link, is Widget.AllObjects -> { + is Widget.Tree, is Widget.Link, is Widget.AllObjects, is Widget.Chat -> { throw IllegalStateException("Incompatible widget type.") } } @@ -181,7 +181,7 @@ class DataViewListWidgetContainer( limit = when (widget) { is Widget.List -> widget.limit is Widget.View -> widget.limit - is Widget.Tree, is Widget.Link, is Widget.AllObjects -> { + is Widget.Tree, is Widget.Link, is Widget.AllObjects, is Widget.Chat -> { throw IllegalStateException("Incompatible widget type.") } } @@ -355,7 +355,7 @@ class DataViewListWidgetContainer( prettyPrintName = fieldParser.getObjectPluralName(widget.source.obj) ) ) - is Widget.Link, is Widget.Tree, is Widget.AllObjects -> { + is Widget.Link, is Widget.Tree, is Widget.AllObjects, is Widget.Chat -> { throw IllegalStateException("Incompatible widget type.") } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SpaceChatWidgetContainer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SpaceChatWidgetContainer.kt index 1cf70f87ed..abfcf34992 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SpaceChatWidgetContainer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SpaceChatWidgetContainer.kt @@ -1,10 +1,42 @@ package com.anytypeio.anytype.presentation.widgets +import com.anytypeio.anytype.core_models.primitives.SpaceId +import com.anytypeio.anytype.domain.chats.ChatPreviewContainer +import javax.inject.Inject import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map -class SpaceChatWidgetContainer : WidgetContainer { - override val view: Flow = flowOf( - WidgetView.SpaceChat - ) +class SpaceChatWidgetContainer @Inject constructor( + private val widget: Widget, + private val container: ChatPreviewContainer +) : WidgetContainer { + override val view: Flow = flow { + emitAll( + container + .observePreview(space = SpaceId(widget.config.space)) + .map { preview -> + (preview?.state?.unreadMessages?.counter ?: 0) to (preview?.state?.unreadMentions?.counter ?: 0) + } + .distinctUntilChanged() + .map { (unreadMessageCount, unreadMentionCount) -> + WidgetView.SpaceChat( + id = widget.id, + source = widget.source, + unreadMessageCount = unreadMessageCount, + unreadMentionCount = unreadMentionCount + ) + } + ) + }.catch { + emit( + WidgetView.SpaceChat( + id = widget.id, + source = widget.source + ) + ) + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt index c98f23ab71..e968cd23c2 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt @@ -72,6 +72,13 @@ sealed class Widget { override val isAutoCreated: Boolean = false, ) : Widget() + data class Chat( + override val id: Id, + override val source: Source.Bundled.Chat, + override val config: Config, + override val isAutoCreated: Boolean = false, + ) : Widget() + sealed class Source { abstract val id: Id @@ -172,77 +179,90 @@ fun List.parseWidgets( is Widget.Source.Default -> source.obj.isValid && source.obj.notDeletedNorArchived } if (hasValidSource && !WidgetConfig.excludedTypes.contains(source.type)) { - if (source is Widget.Source.Bundled.AllObjects) { - add( - Widget.AllObjects( - id = w.id, - source = source, - config = config, - isAutoCreated = widgetContent.isAutoAdded + when (source) { + is Widget.Source.Bundled.AllObjects -> { + add( + Widget.AllObjects( + id = w.id, + source = source, + config = config, + isAutoCreated = widgetContent.isAutoAdded + ) ) - ) - } else { - when (widgetContent.layout) { - Block.Content.Widget.Layout.TREE -> { - add( - Widget.Tree( - id = w.id, - source = source, - limit = widgetContent.limit, - config = config, - isAutoCreated = widgetContent.isAutoAdded - ) + } + is Widget.Source.Bundled.Chat -> { + add( + Widget.Chat( + id = w.id, + source = source, + config = config, + isAutoCreated = widgetContent.isAutoAdded ) - } - - Block.Content.Widget.Layout.LINK -> { - add( - Widget.Link( - id = w.id, - source = source, - config = config, - isAutoCreated = widgetContent.isAutoAdded + ) + } + else -> { + when (widgetContent.layout) { + Block.Content.Widget.Layout.TREE -> { + add( + Widget.Tree( + id = w.id, + source = source, + limit = widgetContent.limit, + config = config, + isAutoCreated = widgetContent.isAutoAdded + ) ) - ) - } + } - Block.Content.Widget.Layout.LIST -> { - add( - Widget.List( - id = w.id, - source = source, - limit = widgetContent.limit, - config = config, - isAutoCreated = widgetContent.isAutoAdded + Block.Content.Widget.Layout.LINK -> { + add( + Widget.Link( + id = w.id, + source = source, + config = config, + isAutoCreated = widgetContent.isAutoAdded + ) ) - ) - } + } - Block.Content.Widget.Layout.COMPACT_LIST -> { - add( - Widget.List( - id = w.id, - source = source, - isCompact = true, - limit = widgetContent.limit, - config = config, - isAutoCreated = widgetContent.isAutoAdded + Block.Content.Widget.Layout.LIST -> { + add( + Widget.List( + id = w.id, + source = source, + limit = widgetContent.limit, + config = config, + isAutoCreated = widgetContent.isAutoAdded + ) ) - ) - } + } - Block.Content.Widget.Layout.VIEW -> { - if (source is Widget.Source.Default) { + Block.Content.Widget.Layout.COMPACT_LIST -> { add( - Widget.View( + Widget.List( id = w.id, source = source, + isCompact = true, limit = widgetContent.limit, config = config, isAutoCreated = widgetContent.isAutoAdded ) ) } + + Block.Content.Widget.Layout.VIEW -> { + if (source is Widget.Source.Default) { + add( + Widget.View( + id = w.id, + source = source, + limit = widgetContent.limit, + config = config, + isAutoCreated = widgetContent.isAutoAdded + ) + ) + } + } } } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt index 576badecce..5d20adba0b 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt @@ -174,10 +174,13 @@ sealed class WidgetView { override val isLoading: Boolean = false } - data object SpaceChat : WidgetView() { - private const val SPACE_CHAT_WIDGET_ID = "bundled-widget.space-chat" + data class SpaceChat( + override val id: Id, + val source: Widget.Source, + val unreadMessageCount: Int = 0, + val unreadMentionCount: Int = 0 + ) : WidgetView() { override val isLoading: Boolean = false - override val id: Id = SPACE_CHAT_WIDGET_ID } sealed class SpaceWidget: WidgetView() { @@ -200,7 +203,7 @@ sealed class WidgetView { } } - object EmptyState : WidgetView() { + data object EmptyState : WidgetView() { override val id: Id get() = "id.widgets.empty.state" override val isLoading: Boolean = false }