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
}