Skip to content

Commit 2a85d61

Browse files
committed
Migrate FetchAllDomainsUseCase and domain management UI from FluxC to wordpress-rs
Replace FluxC's `SiteStore.fetchAllDomains()` with direct wordpress-rs API call via `WpComApiClient.domains().allDomains()`. - `FetchAllDomainsUseCase` now uses wordpress-rs instead of `SiteStore` - `DomainManagementViewModel` uses `AllDomainItem` instead of `AllDomainsDomain` - `DomainsDashboardViewModel` updated for the shared `FetchAllDomainsUseCase` change - `DomainLocalSearchEngine` and `GetDomainDetailsUrl` adapted for `AllDomainItem` - Status color mapping uses `DomainListItemStatusType` instead of `StatusType` - Compose previews updated for wordpress-rs types - Bump wordpress-rs to include `Alert`/`Neutral`/`Premium` status type variants
1 parent c45547a commit 2a85d61

13 files changed

Lines changed: 501 additions & 293 deletions

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardViewModel.kt

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import org.wordpress.android.analytics.AnalyticsTracker.Stat.DOMAINS_DASHBOARD_V
1212
import org.wordpress.android.analytics.AnalyticsTracker.Stat.DOMAIN_CREDIT_REDEMPTION_TAPPED
1313
import org.wordpress.android.fluxc.model.PlanModel
1414
import org.wordpress.android.fluxc.model.SiteModel
15-
import org.wordpress.android.fluxc.network.rest.wpcom.site.AllDomainsDomain
1615
import org.wordpress.android.fluxc.network.rest.wpcom.site.Domain
17-
import org.wordpress.android.fluxc.network.rest.wpcom.site.StatusType
16+
import uniffi.wp_api.AllDomainItem
17+
import uniffi.wp_api.DomainListItemStatusType
1818
import org.wordpress.android.fluxc.store.SiteStore
1919
import org.wordpress.android.modules.BG_THREAD
2020
import org.wordpress.android.ui.domains.DomainsDashboardItem.AddDomain
@@ -110,7 +110,7 @@ class DomainsDashboardViewModel @Inject constructor(
110110
site: SiteModel,
111111
plans: List<PlanModel>,
112112
domains: List<Domain>,
113-
allDomains: List<AllDomainsDomain>
113+
allDomains: List<AllDomainItem>
114114
) {
115115
val listItems = mutableListOf<DomainsDashboardItem>()
116116

@@ -124,7 +124,7 @@ class DomainsDashboardViewModel @Inject constructor(
124124
UiStringText(freeDomainUrl),
125125
freeDomainIsPrimary,
126126
UiStringRes(R.string.active),
127-
getStatusColor(StatusType.SUCCESS),
127+
getStatusColor(DomainListItemStatusType.Success),
128128
UiStringRes(R.string.domains_site_domain_never_expires)
129129
)
130130

@@ -143,10 +143,13 @@ class DomainsDashboardViewModel @Inject constructor(
143143
_uiModel.postValue(listItems)
144144
}
145145

146-
private fun getStatusColor(statusType: StatusType?) = when (statusType) {
147-
StatusType.SUCCESS -> R.color.jetpack_green_50
148-
StatusType.NEUTRAL -> R.color.gray_50
149-
StatusType.WARNING -> R.color.orange_50
146+
private fun getStatusColor(
147+
statusType: DomainListItemStatusType?
148+
) = when (statusType) {
149+
is DomainListItemStatusType.Success,
150+
is DomainListItemStatusType.Premium -> R.color.jetpack_green_50
151+
is DomainListItemStatusType.Neutral -> R.color.gray_50
152+
is DomainListItemStatusType.Warning -> R.color.orange_50
150153
else -> R.color.red_50
151154
}
152155

@@ -189,7 +192,7 @@ class DomainsDashboardViewModel @Inject constructor(
189192
private fun buildCustomDomainItems(
190193
site: SiteModel,
191194
customDomains: List<Domain>,
192-
allDomains: List<AllDomainsDomain>
195+
allDomains: List<AllDomainItem>
193196
): List<DomainsDashboardItem> {
194197
val listItems = mutableListOf<DomainsDashboardItem>()
195198
listItems += SiteDomainsHeader(
@@ -199,15 +202,17 @@ class DomainsDashboardViewModel @Inject constructor(
199202
)
200203
)
201204
listItems += customDomains.map {
202-
val allDomainsDomain = allDomains.find { allDomainsItem -> it.domain == allDomainsItem.domain }
205+
val allDomainItem = allDomains.find { item ->
206+
it.domain == item.domain
207+
}
203208

204209
SiteDomains(
205210
UiStringText(it.domain.orEmpty()),
206211
it.primaryDomain,
207-
allDomainsDomain?.domainStatus?.status?.let { status ->
208-
UiStringText(status)
212+
allDomainItem?.domainStatus?.label?.let { label ->
213+
UiStringText(label)
209214
} ?: UiStringRes(R.string.error),
210-
getStatusColor(allDomainsDomain?.domainStatus?.statusType),
215+
getStatusColor(allDomainItem?.domainStatus?.statusType),
211216
if (!it.hasRegistration) {
212217
null
213218
} else if (it.expirySoon) {
@@ -223,19 +228,22 @@ class DomainsDashboardViewModel @Inject constructor(
223228
listOf(UiStringText(it.expiry.orEmpty()))
224229
)
225230
},
226-
allDomainsDomain?.let { ListItemInteraction.create(allDomainsDomain, this::onDomainClick) }
231+
allDomainItem?.let {
232+
ListItemInteraction.create(allDomainItem, this::onDomainClick)
233+
}
227234
)
228235
}
229236
return listItems
230237
}
231238

232-
private fun getCleanUrl(url: String?) = StringUtils.removeTrailingSlash(UrlUtils.removeScheme(url))
239+
private fun getCleanUrl(url: String?) =
240+
StringUtils.removeTrailingSlash(UrlUtils.removeScheme(url))
233241

234-
private fun onDomainClick(allDomainsDomain: AllDomainsDomain) {
242+
private fun onDomainClick(allDomainItem: AllDomainItem) {
235243
_onNavigation.value = Event(
236244
OpenDomainManagement(
237-
allDomainsDomain.domain ?: return,
238-
allDomainsDomain.getDomainDetailsUrl() ?: return
245+
allDomainItem.domain.ifEmpty { return },
246+
allDomainItem.getDomainDetailsUrl() ?: return
239247
)
240248
)
241249
}

WordPress/src/main/java/org/wordpress/android/ui/domains/management/DomainManagementViewModel.kt

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ import kotlinx.coroutines.flow.launchIn
1616
import kotlinx.coroutines.flow.onEach
1717
import org.wordpress.android.R
1818
import org.wordpress.android.analytics.AnalyticsTracker.Stat
19-
import org.wordpress.android.fluxc.network.rest.wpcom.site.AllDomainsDomain
20-
import org.wordpress.android.fluxc.network.rest.wpcom.site.DomainStatus
21-
import org.wordpress.android.fluxc.network.rest.wpcom.site.StatusType
2219
import org.wordpress.android.modules.UI_THREAD
2320
import org.wordpress.android.ui.domains.management.util.DomainLocalSearchEngine
2421
import org.wordpress.android.ui.domains.usecases.AllDomains
@@ -28,6 +25,9 @@ import org.wordpress.android.ui.compose.theme.success
2825
import org.wordpress.android.ui.compose.theme.warning
2926
import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper
3027
import org.wordpress.android.viewmodel.ScopedViewModel
28+
import uniffi.wp_api.AllDomainItem
29+
import uniffi.wp_api.DomainListItemStatus
30+
import uniffi.wp_api.DomainListItemStatusType
3131
import java.time.LocalDate
3232
import java.time.ZoneId
3333
import java.util.Date
@@ -44,7 +44,8 @@ class DomainManagementViewModel @Inject constructor(
4444
private val _actionEvents = MutableSharedFlow<ActionEvent>()
4545
val actionEvents: Flow<ActionEvent> = _actionEvents
4646

47-
private val _uiStateFlow: MutableStateFlow<UiState> = MutableStateFlow(UiState.PopulatedList.Initial)
47+
private val _uiStateFlow: MutableStateFlow<UiState> =
48+
MutableStateFlow(UiState.PopulatedList.Initial)
4849
val uiStateFlow = _uiStateFlow.asStateFlow()
4950

5051
private val searchQuery = MutableStateFlow("")
@@ -66,7 +67,8 @@ class DomainManagementViewModel @Inject constructor(
6667
_uiStateFlow.value = when (it) {
6768
AllDomains.Empty -> UiState.Empty
6869
AllDomains.Error -> UiState.Error
69-
is AllDomains.Success -> UiState.PopulatedList.Loaded.Complete(it.domains)
70+
is AllDomains.Success ->
71+
UiState.PopulatedList.Loaded.Complete(it.domains)
7072
}
7173
}
7274
}
@@ -119,102 +121,107 @@ class DomainManagementViewModel @Inject constructor(
119121
}
120122

121123
sealed class ActionEvent {
122-
data class DomainTapped(val domain: String, val detailUrl: String): ActionEvent()
123-
object AddDomainTapped: ActionEvent()
124-
object NavigateBackTapped: ActionEvent()
124+
data class DomainTapped(
125+
val domain: String,
126+
val detailUrl: String
127+
) : ActionEvent()
128+
object AddDomainTapped : ActionEvent()
129+
object NavigateBackTapped : ActionEvent()
125130
}
126131

127132
sealed class UiState {
128-
sealed class PopulatedList: UiState() {
129-
object Initial: PopulatedList()
133+
sealed class PopulatedList : UiState() {
134+
object Initial : PopulatedList()
130135
sealed class Loaded : PopulatedList() {
131-
abstract val allDomains: List<AllDomainsDomain>
136+
abstract val allDomains: List<AllDomainItem>
132137
data class Complete(
133-
override val allDomains: List<AllDomainsDomain>
134-
): Loaded()
138+
override val allDomains: List<AllDomainItem>
139+
) : Loaded()
135140
data class Filtered(
136-
override val allDomains: List<AllDomainsDomain>,
137-
val filtered: List<AllDomainsDomain>
141+
override val allDomains: List<AllDomainItem>,
142+
val filtered: List<AllDomainItem>
138143
) : Loaded()
139144
}
140145
}
141-
object Empty: UiState()
142-
object Error: UiState()
146+
object Empty : UiState()
147+
object Error : UiState()
143148
}
144149
}
145150

146151
sealed class DomainCardUiState {
147-
object Initial: DomainCardUiState()
152+
object Initial : DomainCardUiState()
148153
data class Loaded(
149-
val domain: String?,
150-
val title: String?,
154+
val domain: String,
155+
val title: String,
151156
val detailUrl: String?,
152157
val statusUiState: StatusRowUiState,
153-
): DomainCardUiState()
158+
) : DomainCardUiState()
154159

155160
companion object {
156161
@Composable
157-
fun fromDomain(domain: AllDomainsDomain?) = (domain ?: AllDomainsDomain()).let {
158-
val domainStatus = it.domainStatus ?: DomainStatus()
159-
Loaded(
160-
domain = it.domain,
161-
title = it.blogName,
162-
detailUrl = it.getDomainDetailsUrl(),
163-
statusUiState = StatusRowUiState.Loaded(
164-
indicatorColor = domainStatus.indicatorColor,
165-
statusText = domainStatus.statusText,
166-
textColor = domainStatus.textColor,
167-
isBold = domainStatus.isBold,
168-
expiry = it.expiry?.toLocalDate(),
169-
)
162+
fun fromDomain(domain: AllDomainItem) = Loaded(
163+
domain = domain.domain,
164+
title = domain.blogName,
165+
detailUrl = domain.getDomainDetailsUrl(),
166+
statusUiState = StatusRowUiState.Loaded(
167+
indicatorColor = domain.domainStatus.indicatorColor,
168+
statusText = domain.domainStatus.statusText,
169+
textColor = domain.domainStatus.textColor,
170+
isBold = domain.domainStatus.isBold,
171+
expiry = domain.expiry?.toLocalDate(),
170172
)
171-
}
173+
)
172174
}
173175
}
174176

175177
sealed class StatusRowUiState {
176-
object Initial: StatusRowUiState()
178+
object Initial : StatusRowUiState()
177179
data class Loaded(
178180
val indicatorColor: Color,
179181
val statusText: String,
180182
val textColor: Color,
181183
val isBold: Boolean = false,
182184
val expiry: LocalDate?,
183-
): StatusRowUiState()
185+
) : StatusRowUiState()
184186
}
185187

186188
private fun Date.toLocalDate(zoneId: ZoneId = ZoneId.systemDefault()) =
187189
toInstant().atZone(zoneId).toLocalDate()
188-
val DomainStatus.indicatorColor
190+
191+
val DomainListItemStatus.indicatorColor
189192
@Composable
190193
get() = when (statusType) {
191-
StatusType.SUCCESS -> MaterialTheme.colorScheme.success
192-
StatusType.NEUTRAL -> MaterialTheme.colorScheme.neutral
193-
StatusType.ALERT -> MaterialTheme.colorScheme.error
194-
StatusType.WARNING -> MaterialTheme.colorScheme.warning
195-
StatusType.ERROR -> MaterialTheme.colorScheme.error
196-
StatusType.UNKNOWN -> MaterialTheme.colorScheme.error
197-
null -> MaterialTheme.colorScheme.error
194+
is DomainListItemStatusType.Success,
195+
is DomainListItemStatusType.Premium ->
196+
MaterialTheme.colorScheme.success
197+
is DomainListItemStatusType.Neutral ->
198+
MaterialTheme.colorScheme.neutral
199+
is DomainListItemStatusType.Alert ->
200+
MaterialTheme.colorScheme.error
201+
is DomainListItemStatusType.Warning ->
202+
MaterialTheme.colorScheme.warning
203+
is DomainListItemStatusType.Error,
204+
is DomainListItemStatusType.Other ->
205+
MaterialTheme.colorScheme.error
198206
}
199207

200-
val DomainStatus.statusText
208+
val DomainListItemStatus.statusText
201209
@Composable
202-
get() = status ?: stringResource(id = R.string.error)
210+
get() = label.ifEmpty { stringResource(id = R.string.error) }
203211

204-
val DomainStatus.textColor
212+
val DomainListItemStatus.textColor
205213
@Composable
206214
get() = when (statusType) {
207-
StatusType.ERROR,
208-
StatusType.UNKNOWN,
209-
null -> MaterialTheme.colorScheme.error
215+
is DomainListItemStatusType.Error,
216+
is DomainListItemStatusType.Other ->
217+
MaterialTheme.colorScheme.error
210218
else -> LocalTextStyle.current.color
211219
}
212220

213-
val DomainStatus.isBold
221+
val DomainListItemStatus.isBold
214222
@Composable
215223
get() = when (statusType) {
216-
StatusType.ERROR,
217-
StatusType.UNKNOWN,
218-
null -> true
224+
is DomainListItemStatusType.Error,
225+
is DomainListItemStatusType.Other -> true
219226
else -> false
220227
}

0 commit comments

Comments
 (0)