mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-2619 Widgets | Tech | Widget cache proposal (#1351)
This commit is contained in:
parent
faa9621703
commit
0414940519
4 changed files with 67 additions and 45 deletions
|
@ -392,6 +392,7 @@ class HomeScreenViewModel(
|
|||
private fun proceedWithWidgetContainerPipeline() {
|
||||
viewModelScope.launch {
|
||||
widgets.filterNotNull().map { widgets ->
|
||||
val currentlyDisplayedViews = views.value
|
||||
widgets.map { widget ->
|
||||
when (widget) {
|
||||
is Widget.Link -> LinkWidgetContainer(
|
||||
|
@ -405,7 +406,14 @@ class HomeScreenViewModel(
|
|||
isSessionActive = isSessionActive,
|
||||
urlBuilder = urlBuilder,
|
||||
objectWatcher = objectWatcher,
|
||||
getSpaceView = getSpaceView
|
||||
getSpaceView = getSpaceView,
|
||||
onRequestCache = {
|
||||
currentlyDisplayedViews.find { view ->
|
||||
view.id == widget.id
|
||||
&& view is WidgetView.Tree
|
||||
&& view.source == widget.source
|
||||
} as? WidgetView.Tree
|
||||
}
|
||||
)
|
||||
is Widget.List -> if (BundledWidgetSourceIds.ids.contains(widget.source.id)) {
|
||||
ListWidgetContainer(
|
||||
|
@ -414,10 +422,16 @@ class HomeScreenViewModel(
|
|||
storage = storelessSubscriptionContainer,
|
||||
isWidgetCollapsed = isCollapsed(widget.id),
|
||||
urlBuilder = urlBuilder,
|
||||
spaceGradientProvider = spaceGradientProvider,
|
||||
isSessionActive = isSessionActive,
|
||||
objectWatcher = objectWatcher,
|
||||
getSpaceView = getSpaceView
|
||||
getSpaceView = getSpaceView,
|
||||
onRequestCache = {
|
||||
currentlyDisplayedViews.find { view ->
|
||||
view.id == widget.id
|
||||
&& view is WidgetView.ListOfObjects
|
||||
&& view.source == widget.source
|
||||
} as? WidgetView.ListOfObjects
|
||||
}
|
||||
)
|
||||
} else {
|
||||
DataViewListWidgetContainer(
|
||||
|
@ -428,6 +442,13 @@ class HomeScreenViewModel(
|
|||
isWidgetCollapsed = isCollapsed(widget.id),
|
||||
isSessionActive = isSessionActive,
|
||||
urlBuilder = urlBuilder,
|
||||
onRequestCache = {
|
||||
currentlyDisplayedViews.find { view ->
|
||||
view.id == widget.id
|
||||
&& view is WidgetView.SetOfObjects
|
||||
&& view.source == widget.source
|
||||
} as? WidgetView.SetOfObjects
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.anytypeio.anytype.presentation.widgets
|
||||
|
||||
import com.anytypeio.anytype.core_models.Config
|
||||
import com.anytypeio.anytype.core_models.DV
|
||||
import com.anytypeio.anytype.core_models.DVFilter
|
||||
import com.anytypeio.anytype.core_models.DVFilterCondition
|
||||
|
@ -16,7 +15,6 @@ import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer
|
|||
import com.anytypeio.anytype.domain.misc.UrlBuilder
|
||||
import com.anytypeio.anytype.domain.`object`.GetObject
|
||||
import com.anytypeio.anytype.presentation.search.ObjectSearchConstants
|
||||
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.combine
|
||||
|
@ -35,24 +33,28 @@ class DataViewListWidgetContainer(
|
|||
private val urlBuilder: UrlBuilder,
|
||||
private val activeView: Flow<Id?>,
|
||||
private val isWidgetCollapsed: Flow<Boolean>,
|
||||
isSessionActive: Flow<Boolean>
|
||||
isSessionActive: Flow<Boolean>,
|
||||
onRequestCache: () -> WidgetView.SetOfObjects? = { null }
|
||||
) : WidgetContainer {
|
||||
|
||||
override val view = isSessionActive.flatMapLatest { isActive ->
|
||||
if (isActive)
|
||||
buildViewFlow().onStart {
|
||||
isWidgetCollapsed.take(1).collect { isCollapsed ->
|
||||
emit(
|
||||
WidgetView.SetOfObjects(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
tabs = emptyList(),
|
||||
elements = emptyList(),
|
||||
isExpanded = !isCollapsed,
|
||||
isCompact = widget.isCompact,
|
||||
isLoading = true
|
||||
)
|
||||
val loadingStateView = WidgetView.SetOfObjects(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
tabs = emptyList(),
|
||||
elements = emptyList(),
|
||||
isExpanded = !isCollapsed,
|
||||
isCompact = widget.isCompact,
|
||||
isLoading = true
|
||||
)
|
||||
if (isCollapsed) {
|
||||
emit(loadingStateView)
|
||||
} else {
|
||||
emit(onRequestCache() ?: loadingStateView)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.anytypeio.anytype.presentation.widgets
|
||||
|
||||
import com.anytypeio.anytype.core_models.Block
|
||||
import com.anytypeio.anytype.core_models.Config
|
||||
import com.anytypeio.anytype.core_models.DVSort
|
||||
import com.anytypeio.anytype.core_models.DVSortType
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
|
@ -18,45 +17,45 @@ import com.anytypeio.anytype.domain.spaces.GetSpaceView
|
|||
import com.anytypeio.anytype.presentation.search.ObjectSearchConstants
|
||||
import com.anytypeio.anytype.presentation.search.ObjectSearchConstants.collectionsSorts
|
||||
import com.anytypeio.anytype.presentation.search.Subscriptions
|
||||
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.onStart
|
||||
import kotlinx.coroutines.flow.take
|
||||
import timber.log.Timber
|
||||
|
||||
class ListWidgetContainer(
|
||||
private val widget: Widget.List,
|
||||
private val subscription: Id,
|
||||
private val storage: StorelessSubscriptionContainer,
|
||||
private val urlBuilder: UrlBuilder,
|
||||
private val spaceGradientProvider: SpaceGradientProvider,
|
||||
private val isWidgetCollapsed: Flow<Boolean>,
|
||||
private val objectWatcher: ObjectWatcher,
|
||||
private val getSpaceView: GetSpaceView,
|
||||
isSessionActive: Flow<Boolean>
|
||||
isSessionActive: Flow<Boolean>,
|
||||
onRequestCache: () -> WidgetView.ListOfObjects? = { null }
|
||||
) : WidgetContainer {
|
||||
|
||||
override val view: Flow<WidgetView> = isSessionActive.flatMapLatest { isActive ->
|
||||
if (isActive)
|
||||
buildViewFlow().onStart {
|
||||
isWidgetCollapsed.take(1).collect { isCollapsed ->
|
||||
emit(
|
||||
WidgetView.ListOfObjects(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
type = resolveType(),
|
||||
elements = emptyList(),
|
||||
isExpanded = !isCollapsed,
|
||||
isCompact = widget.isCompact,
|
||||
isLoading = true
|
||||
)
|
||||
val loadingStateView = WidgetView.ListOfObjects(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
type = resolveType(),
|
||||
elements = emptyList(),
|
||||
isExpanded = !isCollapsed,
|
||||
isCompact = widget.isCompact,
|
||||
isLoading = true
|
||||
)
|
||||
if (isCollapsed) {
|
||||
emit(loadingStateView)
|
||||
} else {
|
||||
emit(onRequestCache() ?: loadingStateView)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.anytypeio.anytype.presentation.widgets
|
||||
|
||||
import com.anytypeio.anytype.core_models.Config
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.ObjectTypeIds
|
||||
import com.anytypeio.anytype.core_models.ObjectWrapper
|
||||
|
@ -11,7 +10,6 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
|
|||
import com.anytypeio.anytype.domain.objects.ObjectWatcher
|
||||
import com.anytypeio.anytype.domain.spaces.GetSpaceView
|
||||
import com.anytypeio.anytype.presentation.search.ObjectSearchConstants
|
||||
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
|
||||
import com.anytypeio.anytype.presentation.widgets.WidgetConfig.isValidObject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.catch
|
||||
|
@ -19,12 +17,10 @@ import kotlinx.coroutines.flow.combine
|
|||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.onStart
|
||||
import kotlinx.coroutines.flow.take
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import timber.log.Timber
|
||||
|
||||
|
||||
class TreeWidgetContainer(
|
||||
|
@ -35,7 +31,8 @@ class TreeWidgetContainer(
|
|||
private val isWidgetCollapsed: Flow<Boolean>,
|
||||
private val objectWatcher: ObjectWatcher,
|
||||
private val getSpaceView: GetSpaceView,
|
||||
isSessionActive: Flow<Boolean>
|
||||
isSessionActive: Flow<Boolean>,
|
||||
onRequestCache: () -> WidgetView.Tree? = { null }
|
||||
) : WidgetContainer {
|
||||
|
||||
private val mutex = Mutex()
|
||||
|
@ -48,15 +45,18 @@ class TreeWidgetContainer(
|
|||
if (isActive)
|
||||
buildViewFlow().onStart {
|
||||
isWidgetCollapsed.take(1).collect { isCollapsed ->
|
||||
emit(
|
||||
WidgetView.Tree(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
isExpanded = !isCollapsed,
|
||||
elements = emptyList(),
|
||||
isLoading = true
|
||||
)
|
||||
val loadingStateView = WidgetView.Tree(
|
||||
id = widget.id,
|
||||
source = widget.source,
|
||||
isExpanded = !isCollapsed,
|
||||
elements = emptyList(),
|
||||
isLoading = true
|
||||
)
|
||||
if (isCollapsed) {
|
||||
emit(loadingStateView)
|
||||
} else {
|
||||
emit(onRequestCache() ?: loadingStateView)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue