Skip to content

Commit

Permalink
Merge pull request #20069 from wordpress-mobile/refactor-date-selecto…
Browse files Browse the repository at this point in the history
…r-usage-in-statsviewallviewmodel

Refactor the usage of the date selector in the Stats screens
  • Loading branch information
ravishanker authored Jan 31, 2024
2 parents b419c53 + 40a0457 commit 7320dcf
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -191,17 +191,17 @@ class StatsViewAllFragment : Fragment(R.layout.stats_view_all_fragment) {
}

private fun StatsViewAllFragmentBinding.setupObservers(activity: FragmentActivity) {
viewModel.isRefreshing.observe(viewLifecycleOwner, {
viewModel.isRefreshing.observe(viewLifecycleOwner) {
it?.let { isRefreshing ->
swipeToRefreshHelper.isRefreshing = isRefreshing
}
})
}

viewModel.showSnackbarMessage.observeEvent(viewLifecycleOwner, { holder ->
viewModel.showSnackbarMessage.observeEvent(viewLifecycleOwner) { holder ->
showSnackbar(activity, holder)
})
}

viewModel.data.observe(viewLifecycleOwner, {
viewModel.data.observe(viewLifecycleOwner) {
if (it != null) {
with(statsListFragment) {
recyclerView.visibility = if (it is Success) View.VISIBLE else View.GONE
Expand All @@ -214,41 +214,44 @@ class StatsViewAllFragment : Fragment(R.layout.stats_view_all_fragment) {
is Success -> {
loadData(recyclerView, prepareLayout(it.data, it.type))
}

is Loading -> {
loadData(loadingRecyclerView, prepareLayout(it.data, it.type))
}

is Error -> {
errorView.statsErrorView.button.setOnClickListener {
viewModel.onRetryClick()
}
}

is EmptyBlock -> {
}
}
}
}
})
viewModel.navigationTarget.observeEvent(viewLifecycleOwner, { target ->
}
viewModel.navigationTarget.observeEvent(viewLifecycleOwner) { target ->
navigator.navigate(activity, target)
})
}

viewModel.dateSelectorData.observe(viewLifecycleOwner, { dateSelectorUiModel ->
viewModel.dateSelectorData.observe(viewLifecycleOwner) { dateSelectorUiModel ->
statsListFragment.drawDateSelector(dateSelectorUiModel)
})
}

viewModel.navigationTarget.observeEvent(viewLifecycleOwner, { target ->
viewModel.navigationTarget.observeEvent(viewLifecycleOwner) { target ->
navigator.navigate(activity, target)
})
}

viewModel.selectedDate.observe(viewLifecycleOwner, { event ->
viewModel.selectedDate?.observe(viewLifecycleOwner) { event ->
if (event != null) {
viewModel.onDateChanged()
}
})
}

viewModel.toolbarHasShadow.observe(viewLifecycleOwner, { hasShadow ->
viewModel.toolbarHasShadow.observe(viewLifecycleOwner) { hasShadow ->
appBarLayout.showShadow(hasShadow == true)
})
}
}

private fun showSnackbar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.granular.SelectedDa
import org.wordpress.android.ui.stats.refresh.utils.StatsDateSelector
import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
import org.wordpress.android.ui.utils.UiString.UiStringRes
import org.wordpress.android.util.mapSafe
import org.wordpress.android.util.mapNullable
import org.wordpress.android.util.mapSafe
import org.wordpress.android.util.throttle
import org.wordpress.android.viewmodel.Event
import org.wordpress.android.viewmodel.ScopedViewModel
Expand All @@ -31,14 +31,14 @@ class StatsViewAllViewModel(
val bgDispatcher: CoroutineDispatcher,
val useCase: BaseStatsUseCase<*, *>,
private val statsSiteProvider: StatsSiteProvider,
private val dateSelector: StatsDateSelector,
private val dateSelector: StatsDateSelector?,
@StringRes val title: Int
) : ScopedViewModel(mainDispatcher) {
val selectedDate = dateSelector.selectedDate
val selectedDate = dateSelector?.selectedDate

val dateSelectorData: LiveData<DateSelectorUiModel> = dateSelector.dateSelectorData.mapNullable {
val dateSelectorData: LiveData<DateSelectorUiModel> = dateSelector?.dateSelectorData?.mapNullable {
it ?: DateSelectorUiModel(false)
}
} ?: MutableLiveData(DateSelectorUiModel(false))

val navigationTarget: LiveData<Event<NavigationTarget>> = useCase.navigationTarget

Expand All @@ -62,12 +62,12 @@ class StatsViewAllViewModel(
fun start(startDate: SelectedDate?) {
launch {
startDate?.let {
dateSelector.start(startDate)
dateSelector?.start(startDate)
}
loadData(refresh = false, forced = false)
dateSelector.updateDateSelector()
dateSelector?.updateDateSelector()
}
dateSelector.updateDateSelector()
dateSelector?.updateDateSelector()
}

@SuppressLint("NullSafeMutableLiveData")
Expand Down Expand Up @@ -109,13 +109,13 @@ class StatsViewAllViewModel(

fun onNextDateSelected() {
launch(mainDispatcher) {
dateSelector.onNextDateSelected()
dateSelector?.onNextDateSelected()
}
}

fun onPreviousDateSelected() {
launch(mainDispatcher) {
dateSelector.onPreviousDateSelected()
dateSelector?.onPreviousDateSelected()
}
}

Expand All @@ -131,7 +131,7 @@ class StatsViewAllViewModel(
}
}

fun getSelectedDate(): SelectedDate {
return dateSelector.getSelectedDate()
fun getSelectedDate(): SelectedDate? {
return dateSelector?.getSelectedDate()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import org.wordpress.android.ui.stats.StatsViewType.TAGS_AND_CATEGORIES
import org.wordpress.android.ui.stats.StatsViewType.TOP_POSTS_AND_PAGES
import org.wordpress.android.ui.stats.StatsViewType.VIDEO_PLAYS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.INSIGHTS
import org.wordpress.android.ui.stats.refresh.lists.detail.PostAverageViewsPerDayUseCase
import org.wordpress.android.ui.stats.refresh.lists.detail.PostMonthsAndYearsUseCase
import org.wordpress.android.ui.stats.refresh.lists.detail.PostRecentWeeksUseCase
Expand Down Expand Up @@ -66,7 +65,7 @@ class StatsViewAllViewModelFactory(
private val bgDispatcher: CoroutineDispatcher,
private val useCase: BaseStatsUseCase<*, *>,
private val statsSiteProvider: StatsSiteProvider,
private val dateSelector: StatsDateSelector,
private val dateSelector: StatsDateSelector?,
@StringRes private val titleResource: Int
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
Expand All @@ -92,34 +91,29 @@ class StatsViewAllViewModelFactory(
private val statsSiteProvider: StatsSiteProvider,
private val dateSelectorFactory: StatsDateSelector.Factory
) {
fun build(type: StatsViewType, granularity: StatsGranularity?): StatsViewAllViewModelFactory {
return when {
type == ANNUAL_STATS -> buildAnnualStatsFactory()
granularity == null -> buildFactory(type)
else -> buildFactory(type, granularity)
}
}

private fun buildFactory(type: StatsViewType, granularity: StatsGranularity): StatsViewAllViewModelFactory {
val (useCase, title) = getGranularUseCase(type, granularity, granularFactories)
return StatsViewAllViewModelFactory(
mainDispatcher,
bgDispatcher,
useCase,
statsSiteProvider,
dateSelectorFactory.build(granularity.toStatsSection()),
title
)
fun build(type: StatsViewType, granularity: StatsGranularity?) = if (type == ANNUAL_STATS) {
buildAnnualStatsFactory()
} else {
buildFactory(type, granularity)
}

private fun buildFactory(type: StatsViewType): StatsViewAllViewModelFactory {
val (useCase, title) = getInsightsUseCase(type, insightsUseCases)
private fun buildFactory(type: StatsViewType, granularity: StatsGranularity?): StatsViewAllViewModelFactory {
val (useCase, title) = if (granularity == null) {
getInsightsUseCase(type, insightsUseCases)
} else {
getGranularUseCase(type, granularity, granularFactories)
}
val dateSelector = if (granularity == null) {
null
} else {
dateSelectorFactory.build(granularity.toStatsSection())
}
return StatsViewAllViewModelFactory(
mainDispatcher,
bgDispatcher,
useCase,
statsSiteProvider,
dateSelectorFactory.build(INSIGHTS),
dateSelector,
title
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {
navigator.navigate(activity, target)
}

viewModel.selectedDate.observe(viewLifecycleOwner) { event ->
viewModel.selectedDate?.observe(viewLifecycleOwner) { event ->
if (event != null) {
viewModel.onDateChanged(event.selectedSection)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ abstract class StatsListViewModel(
defaultDispatcher: CoroutineDispatcher,
private val statsUseCase: BaseListUseCase,
private val analyticsTracker: AnalyticsTrackerWrapper,
protected val dateSelector: StatsDateSelector,
protected val dateSelector: StatsDateSelector?,
popupMenuHandler: ItemPopupMenuHandler? = null,
private val newsCardHandler: NewsCardHandler? = null,
actionCardHandler: ActionCardHandler? = null
Expand All @@ -72,7 +72,7 @@ abstract class StatsListViewModel(
ANNUAL_STATS(R.string.stats_insights_annual_site_stats);
}

val selectedDate = dateSelector.selectedDate
val selectedDate = dateSelector?.selectedDate

private val mutableNavigationTarget = MutableLiveData<Event<NavigationTarget>>()
val navigationTarget: LiveData<Event<NavigationTarget>> = mergeNotNull(
Expand All @@ -85,9 +85,9 @@ abstract class StatsListViewModel(
statsUseCase.data.throttle(viewModelScope, distinct = true)
}

val dateSelectorData: LiveData<DateSelectorUiModel> = dateSelector.dateSelectorData.mapNullable {
val dateSelectorData: LiveData<DateSelectorUiModel> = dateSelector?.dateSelectorData?.mapNullable {
it ?: DateSelectorUiModel(false)
}
} ?: MutableLiveData(DateSelectorUiModel(false))

val typesChanged = merge(
popupMenuHandler?.typeMoved,
Expand Down Expand Up @@ -115,13 +115,13 @@ abstract class StatsListViewModel(

fun onNextDateSelected() {
launch(Dispatchers.Default) {
dateSelector.onNextDateSelected()
dateSelector?.onNextDateSelected()
}
}

fun onPreviousDateSelected() {
launch(Dispatchers.Default) {
dateSelector.onPreviousDateSelected()
dateSelector?.onPreviousDateSelected()
}
}

Expand All @@ -138,7 +138,7 @@ abstract class StatsListViewModel(
}

fun onListSelected() {
dateSelector.updateDateSelector()
dateSelector?.updateDateSelector()
}

fun onEmptyInsightsButtonClicked() {
Expand All @@ -156,10 +156,10 @@ abstract class StatsListViewModel(
isInitialized = true
launch {
statsUseCase.loadData()
dateSelector.updateDateSelector()
dateSelector?.updateDateSelector()
}
}
dateSelector.updateDateSelector()
dateSelector?.updateDateSelector()
}

sealed class UiModel {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ class DetailListViewModel
) : StatsListViewModel(mainDispatcher, detailUseCase, analyticsTracker, dateSelectorFactory.build(DETAIL)) {
override fun onCleared() {
super.onCleared()
dateSelector.clear()
dateSelector?.clear()
}
}

0 comments on commit 7320dcf

Please sign in to comment.