11package org.cru.godtools.ui.dashboard.tools
22
33import androidx.compose.runtime.Composable
4+ import androidx.compose.runtime.DisposableEffect
45import androidx.compose.runtime.collectAsState
56import androidx.compose.runtime.getValue
67import androidx.compose.runtime.key
@@ -11,6 +12,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
1112import androidx.compose.runtime.setValue
1213import com.google.firebase.remoteconfig.FirebaseRemoteConfig
1314import com.slack.circuit.codegen.annotations.CircuitInject
15+ import com.slack.circuit.runtime.CircuitContext
1416import com.slack.circuit.runtime.CircuitUiEvent
1517import com.slack.circuit.runtime.CircuitUiState
1618import com.slack.circuit.runtime.Navigator
@@ -19,19 +21,25 @@ import dagger.assisted.Assisted
1921import dagger.assisted.AssistedFactory
2022import dagger.assisted.AssistedInject
2123import dagger.hilt.components.SingletonComponent
24+ import java.util.Locale
25+ import kotlinx.coroutines.flow.first
2226import kotlinx.coroutines.flow.map
27+ import org.ccci.gto.android.common.sync.SyncTracker
2328import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent
2429import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_TOOL_DETAILS
2530import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_ALL_TOOLS
2631import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_SPOTLIGHT
2732import org.cru.godtools.base.CONFIG_UI_DASHBOARD_PERSONALIZATION_ENABLED
33+ import org.cru.godtools.base.Settings
2834import org.cru.godtools.base.ui.circuit.screen.dashboard.page.ToolsScreen
2935import org.cru.godtools.db.repository.ToolsRepository
3036import org.cru.godtools.model.Language
3137import org.cru.godtools.model.Tool
38+ import org.cru.godtools.sync.GodToolsSyncService
3239import org.cru.godtools.ui.banner.Banner
3340import org.cru.godtools.ui.banner.BannerPresenter
3441import org.cru.godtools.ui.banner.favoritetools.FavoriteToolsBannerPresenter
42+ import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
3543import org.cru.godtools.ui.dashboard.tools.ToolFiltersStateProducer.Filters
3644import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState
3745import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState.Mode
@@ -43,11 +51,14 @@ import org.greenrobot.eventbus.EventBus
4351class ToolsPresenter @AssistedInject internal constructor(
4452 private val eventBus : EventBus ,
4553 private val remoteConfig : FirebaseRemoteConfig ,
54+ private val settings : Settings ,
4655 private val toolCardPresenter : ToolCardPresenter ,
4756 private val toolsRepository : ToolsRepository ,
4857 private val favoriteToolsBannerPresenter : BannerPresenter <FavoriteToolsBannerPresenter .UiState >,
4958 private val filteredToolsFlowProducer : FilteredToolsFlowProducer ,
5059 private val toolFiltersStateProducer : ToolFiltersStateProducer ,
60+ private val syncService : GodToolsSyncService ,
61+ @Assisted private val circuitContext : CircuitContext ,
5162 @Assisted private val navigator : Navigator ,
5263) : Presenter<UiState> {
5364 // region UiState / UiEvent
@@ -83,6 +94,8 @@ class ToolsPresenter @AssistedInject internal constructor(
8394 val filters = toolFiltersStateProducer.produce(mode)
8495 val selectedLocale by rememberUpdatedState(filters.languageFilter.selectedItem?.code)
8596
97+ RegisterSyncTask (selectedLocale)
98+
8699 val eventSink: (UiEvent ) -> Unit = remember {
87100 {
88101 when (it) {
@@ -124,6 +137,16 @@ class ToolsPresenter @AssistedInject internal constructor(
124137 )
125138 }
126139
140+ @Composable
141+ private fun RegisterSyncTask (selectedLocale : Locale ? ) {
142+ val syncRegistry = circuitContext.syncTaskRegistry
143+ DisposableEffect (syncRegistry, selectedLocale) {
144+ if (syncRegistry == null ) return @DisposableEffect onDispose { }
145+ val id = syncRegistry.registerSyncTask { force -> syncData(selectedLocale ? : settings.appLanguage, force) }
146+ onDispose { syncRegistry.unregisterSyncTask(id) }
147+ }
148+ }
149+
127150 @Composable
128151 private fun rememberSpotlightTools (
129152 secondLanguage : Language ? ,
@@ -190,9 +213,14 @@ class ToolsPresenter @AssistedInject internal constructor(
190213 }
191214 }
192215
216+ private fun SyncTracker.syncData (locale : Locale , force : Boolean = false) = launchSync {
217+ val country = settings.getCountrySettingFlow().first()
218+ syncService.syncToolOrder(locale, country, force)
219+ }
220+
193221 @AssistedFactory
194222 @CircuitInject(ToolsScreen ::class , SingletonComponent ::class )
195223 interface Factory {
196- fun create (navigator : Navigator ): ToolsPresenter
224+ fun create (circuitContext : CircuitContext , navigator : Navigator ): ToolsPresenter
197225 }
198226}
0 commit comments