Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ class NewStatsActivity : BaseAppCompatActivity() {
appPrefsWrapper
.setNewStatsIntroShown(true)
},
onReferrerChildClick = { url ->
onStatsUrlClick = { url ->
activityNavigator.openInCustomTab(this, url)
},
onPostItemClick = ::openPostDetailStats
Expand Down Expand Up @@ -292,7 +292,7 @@ private fun NewStatsScreen(
onSwitchToOldStats: () -> Unit = {},
showIntroBottomSheet: Boolean = false,
onIntroDismissed: () -> Unit = {},
onReferrerChildClick: (String) -> Unit = {},
onStatsUrlClick: (String) -> Unit = {},
onPostItemClick: (MostViewedItem) -> Unit = {}
) {
val viewsStatsViewModel: ViewsStatsViewModel = viewModel()
Expand Down Expand Up @@ -434,7 +434,7 @@ private fun NewStatsScreen(
StatsTabContent(
tab = tabs[page],
viewsStatsViewModel = viewsStatsViewModel,
onReferrerChildClick = onReferrerChildClick,
onStatsUrlClick = onStatsUrlClick,
onPostItemClick = onPostItemClick
)
}
Expand All @@ -446,16 +446,18 @@ private fun NewStatsScreen(
private fun StatsTabContent(
tab: StatsTab,
viewsStatsViewModel: ViewsStatsViewModel,
onReferrerChildClick: (String) -> Unit = {},
onStatsUrlClick: (String) -> Unit = {},
onPostItemClick: (MostViewedItem) -> Unit = {}
) {
when (tab) {
StatsTab.TRAFFIC -> TrafficTabContent(
viewsStatsViewModel = viewsStatsViewModel,
onReferrerChildClick = onReferrerChildClick,
onStatsUrlClick = onStatsUrlClick,
onPostItemClick = onPostItemClick
)
StatsTab.INSIGHTS -> InsightsTabContent()
StatsTab.INSIGHTS -> InsightsTabContent(
onStatsUrlClick = onStatsUrlClick
)
StatsTab.SUBSCRIBERS -> SubscribersTabContent()
}
}
Expand All @@ -476,7 +478,7 @@ private fun TrafficTabContent(
devicesViewModel: DevicesViewModel = viewModel(),
utmViewModel: UtmViewModel = viewModel(),
newStatsViewModel: NewStatsViewModel = viewModel(),
onReferrerChildClick: (String) -> Unit = {},
onStatsUrlClick: (String) -> Unit = {},
onPostItemClick: (MostViewedItem) -> Unit = {}
) {
val context = LocalContext.current
Expand Down Expand Up @@ -767,7 +769,7 @@ private fun TrafficTabContent(
onMoveToTop = { newStatsViewModel.moveCardToTop(cardType) },
onMoveDown = { newStatsViewModel.moveCardDown(cardType) },
onMoveToBottom = { newStatsViewModel.moveCardToBottom(cardType) },
onChildClick = onReferrerChildClick
onUrlClick = onStatsUrlClick
)
StatsCardType.LOCATIONS -> LocationsCard(
uiState = locationsUiState,
Expand Down Expand Up @@ -923,7 +925,8 @@ private fun TrafficTabContent(
?.isAuthError == true,
getAdminUrl = clicksViewModel::getAdminUrl,
context = context
)
),
onUrlClick = onStatsUrlClick
)
StatsCardType.SEARCH_TERMS -> MostViewedCard(
uiState = searchTermsUiState,
Expand Down Expand Up @@ -1105,7 +1108,8 @@ private fun InsightsTabContent(
mostPopularDayViewModel: MostPopularDayViewModel = viewModel(),
mostPopularTimeViewModel: MostPopularTimeViewModel = viewModel(),
tagsAndCategoriesViewModel: TagsAndCategoriesViewModel = viewModel(),
insightsViewModel: InsightsViewModel = viewModel()
insightsViewModel: InsightsViewModel = viewModel(),
onStatsUrlClick: (String) -> Unit = {}
) {
val context = LocalContext.current
val yearInReviewUiState by yearInReviewViewModel.uiState.collectAsState()
Expand Down Expand Up @@ -1292,7 +1296,8 @@ private fun InsightsTabContent(
onMoveUp = { insightsViewModel.moveCardUp(cardType) },
onMoveToTop = { insightsViewModel.moveCardToTop(cardType) },
onMoveDown = { insightsViewModel.moveCardDown(cardType) },
onMoveToBottom = { insightsViewModel.moveCardToBottom(cardType) }
onMoveToBottom = { insightsViewModel.moveCardToBottom(cardType) },
onUrlClick = onStatsUrlClick
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.ui.newstats.StatsPeriod
import org.wordpress.android.ui.newstats.mostviewed.BaseStatsCardViewModel
import org.wordpress.android.ui.newstats.mostviewed.MostViewedChange
import org.wordpress.android.ui.newstats.mostviewed.MostViewedDetailItem
import org.wordpress.android.ui.newstats.mostviewed.StatsCardFetchResult
import org.wordpress.android.ui.newstats.repository.ClickItemData
import org.wordpress.android.ui.newstats.mostviewed.toDetailItem
import org.wordpress.android.ui.newstats.repository.ClicksResult
import org.wordpress.android.ui.newstats.repository.StatsRepository
import org.wordpress.android.viewmodel.ResourceProvider
Expand Down Expand Up @@ -55,15 +53,4 @@ class ClicksViewModel @Inject constructor(
}
}
}

private fun ClickItemData.toDetailItem(
id: Long
) = MostViewedDetailItem(
id = id,
title = name,
views = clicks,
change = MostViewedChange.fromChange(
clicksChange, clicksChangePercent
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.OpenInNew
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
Expand Down Expand Up @@ -236,6 +237,19 @@ fun StatsListHeader(
}
}

/**
* "Opens a link" affordance shown on a stats row that navigates to a URL when tapped.
*/
@Composable
fun StatsOpenLinkIcon() {
Icon(
imageVector = Icons.AutoMirrored.Filled.OpenInNew,
contentDescription = stringResource(R.string.stats_open_referrer_link),
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant
)
}

/**
* Common row container with background percentage bar.
* Used for country rows, author rows, and similar list items.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,10 +435,12 @@ sealed class ReferrersDataResult {
}

/**
* A single referrer item from the API.
* A single referrer item from the API. [url] is null for a group with no link of its own
* (e.g. "Search Engines"), whose links live on its [children].
*/
data class ReferrerDataItem(
val name: String,
val url: String?,
val views: Long,
val children: List<ReferrerChildDataItem> = emptyList()
)
Expand Down Expand Up @@ -573,10 +575,19 @@ sealed class ClicksDataResult {
}

/**
* A single click item from the API.
* A single click item from the API. [url] is null for a grouped source with no link of its own,
* whose links live on its [children].
*/
data class ClickDataItem(
val name: String,
val url: String?,
val clicks: Long,
val children: List<ClickChildDataItem> = emptyList()
)

data class ClickChildDataItem(
val name: String,
val url: String?,
val clicks: Long
)

Expand Down Expand Up @@ -744,11 +755,13 @@ data class TagGroupData(
)

/**
* A single tag or category item.
* A single tag or category item. [link] is the tag's archive page, opened when the row is tapped,
* and is null when the tag has none.
*/
data class TagData(
val tagType: String,
val name: String
val name: String,
val link: String? = null
)

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import rs.wordpress.api.kotlin.WpComApiClient
import rs.wordpress.api.kotlin.WpRequestResult
import uniffi.wp_api.StatsCityViewsParams
import uniffi.wp_api.StatsCityViewsPeriod
import uniffi.wp_api.StatsClicksChild
import uniffi.wp_api.StatsClicksParams
import uniffi.wp_api.StatsClicksPeriod
import uniffi.wp_api.StatsCountryViewsParams
Expand Down Expand Up @@ -259,6 +260,7 @@ class StatsDataSourceImpl @Inject constructor(
groups.map { group ->
ReferrerDataItem(
name = group.name.orEmpty(),
url = group.url,
views = group.total?.toLong() ?: 0L,
children = group.results.toChildren()
)
Expand Down Expand Up @@ -632,8 +634,10 @@ class StatsDataSourceImpl @Inject constructor(
clicks.map { entry ->
ClickDataItem(
name = entry.name.orEmpty(),
url = entry.url,
clicks = entry.views?.toLong()
?: 0L
?: 0L,
children = entry.children.toClickChildren()
)
}
)
Expand All @@ -646,6 +650,15 @@ class StatsDataSourceImpl @Inject constructor(
}
}

private fun List<StatsClicksChild>?.toClickChildren(): List<ClickChildDataItem> =
orEmpty().map { child ->
ClickChildDataItem(
name = child.name.orEmpty(),
url = child.url,
clicks = child.views?.toLong() ?: 0L
)
}

override suspend fun fetchDevicesScreensize(
siteId: Long,
dateRange: StatsDateRange,
Expand Down Expand Up @@ -1177,7 +1190,8 @@ class StatsDataSourceImpl @Inject constructor(
tags = group.tags.map { tag ->
TagData(
tagType = tag.tagType,
name = tag.name
name = tag.name,
link = tag.link
)
},
views = group.views.toLong()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,9 @@ abstract class BaseStatsCardViewModel(
id = id,
title = title,
views = views,
change = change
change = change,
children = children,
url = url
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ fun MostViewedCard(
onMoveDown: (() -> Unit)? = null,
onMoveToBottom: (() -> Unit)? = null,
onOpenWpAdmin: (() -> Unit)? = null,
onChildClick: (String) -> Unit = {},
onUrlClick: (String) -> Unit = {},
onItemClick: ((MostViewedItem) -> Unit)? = null
) {
val borderColor = MaterialTheme.colorScheme.outlineVariant
Expand All @@ -78,7 +78,7 @@ fun MostViewedCard(
is MostViewedCardUiState.Loaded -> LoadedContent(
uiState, cardType, onShowAllClick, onRemoveCard,
cardPosition, onMoveUp, onMoveToTop, onMoveDown, onMoveToBottom,
onChildClick, onItemClick
onUrlClick, onItemClick
)
is MostViewedCardUiState.Error -> ErrorContent(
uiState, cardType, onRetry, onRemoveCard,
Expand Down Expand Up @@ -172,7 +172,7 @@ private fun LoadedContent(
onMoveToTop: (() -> Unit)?,
onMoveDown: (() -> Unit)?,
onMoveToBottom: (() -> Unit)?,
onChildClick: (String) -> Unit,
onUrlClick: (String) -> Unit,
onItemClick: ((MostViewedItem) -> Unit)?
) {
Column(
Expand Down Expand Up @@ -210,7 +210,8 @@ private fun LoadedContent(
change = item.change,
children = item.children,
percentage = percentage,
onChildClick = onChildClick,
onUrlClick = onUrlClick,
url = item.url,
onItemClick = onItemClick?.let { { it(item) } }
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ sealed class MostViewedCardUiState {
* @param title The title/name of the item (post title or referrer name)
* @param views The number of views
* @param change The percentage change compared to previous period
* @param url The item's URL (posts only, null for referrers)
* @param url The item's URL. Posts open it as detail stats; referrers and clicks open it in a
* Custom Tab. Null when the item has no link of its own.
* @param postType The API post type, e.g. "post"/"page" (posts only)
*/
data class MostViewedItem(
Expand Down
Loading
Loading