@@ -12,7 +12,9 @@ import org.wordpress.android.analytics.AnalyticsTracker.Stat.DOMAINS_DASHBOARD_V
12
12
import org.wordpress.android.analytics.AnalyticsTracker.Stat.DOMAIN_CREDIT_REDEMPTION_TAPPED
13
13
import org.wordpress.android.fluxc.model.PlanModel
14
14
import org.wordpress.android.fluxc.model.SiteModel
15
+ import org.wordpress.android.fluxc.network.rest.wpcom.site.AllDomainsDomain
15
16
import org.wordpress.android.fluxc.network.rest.wpcom.site.Domain
17
+ import org.wordpress.android.fluxc.network.rest.wpcom.site.StatusType
16
18
import org.wordpress.android.fluxc.store.SiteStore
17
19
import org.wordpress.android.modules.BG_THREAD
18
20
import org.wordpress.android.ui.domains.DomainsDashboardItem.AddDomain
@@ -23,6 +25,10 @@ import org.wordpress.android.ui.domains.DomainsDashboardItem.SiteDomainsHeader
23
25
import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.ClaimDomain
24
26
import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.GetDomain
25
27
import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.GetPlan
28
+ import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.OpenDomainManagement
29
+ import org.wordpress.android.ui.domains.management.getDomainDetailsUrl
30
+ import org.wordpress.android.ui.domains.usecases.AllDomains
31
+ import org.wordpress.android.ui.domains.usecases.FetchAllDomainsUseCase
26
32
import org.wordpress.android.ui.domains.usecases.FetchPlansUseCase
27
33
import org.wordpress.android.ui.plans.isDomainCreditAvailable
28
34
import org.wordpress.android.ui.utils.HtmlMessageUtils
@@ -46,6 +52,7 @@ class DomainsDashboardViewModel @Inject constructor(
46
52
private val analyticsTrackerWrapper : AnalyticsTrackerWrapper ,
47
53
private val htmlMessageUtils : HtmlMessageUtils ,
48
54
private val fetchPlansUseCase : FetchPlansUseCase ,
55
+ private val fetchAllDomainsUseCase : FetchAllDomainsUseCase ,
49
56
@Named(BG_THREAD ) private val bgDispatcher : CoroutineDispatcher
50
57
) : ScopedViewModel(bgDispatcher) {
51
58
lateinit var site: SiteModel
@@ -80,9 +87,11 @@ class DomainsDashboardViewModel @Inject constructor(
80
87
81
88
val deferredPlansResult = async { fetchPlansUseCase.execute(site) }
82
89
val deferredDomainsResult = async { siteStore.fetchSiteDomains(site) }
90
+ val deferredAllDomainsResult = async { fetchAllDomainsUseCase.execute() }
83
91
84
92
val plansResult = deferredPlansResult.await()
85
93
val domainsResult = deferredDomainsResult.await()
94
+ val allDomainsResult = deferredAllDomainsResult.await()
86
95
87
96
if (plansResult.isError) {
88
97
AppLog .e(DOMAIN_REGISTRATION , " An error occurred while fetching plans: ${plansResult.error.message} " )
@@ -92,10 +101,17 @@ class DomainsDashboardViewModel @Inject constructor(
92
101
AppLog .e(DOMAIN_REGISTRATION , " An error occurred while fetching domains: ${domainsResult.error.message} " )
93
102
}
94
103
95
- buildDashboardItems(site, plansResult.plans.orEmpty(), domainsResult.domains.orEmpty())
104
+ val allDomains = if (allDomainsResult is AllDomains .Success ) allDomainsResult.domains else emptyList()
105
+
106
+ buildDashboardItems(site, plansResult.plans.orEmpty(), domainsResult.domains.orEmpty(), allDomains)
96
107
}
97
108
98
- private fun buildDashboardItems (site : SiteModel , plans : List <PlanModel >, domains : List <Domain >) {
109
+ private fun buildDashboardItems (
110
+ site : SiteModel ,
111
+ plans : List <PlanModel >,
112
+ domains : List <Domain >,
113
+ allDomains : List <AllDomainsDomain >
114
+ ) {
99
115
val listItems = mutableListOf<DomainsDashboardItem >()
100
116
101
117
listItems + = SiteDomainsHeader (UiStringRes (R .string.domains_free_domain))
@@ -106,8 +122,10 @@ class DomainsDashboardViewModel @Inject constructor(
106
122
107
123
listItems + = SiteDomains (
108
124
UiStringText (freeDomainUrl),
109
- UiStringRes (R .string.domains_site_domain_never_expires),
110
- freeDomainIsPrimary
125
+ freeDomainIsPrimary,
126
+ UiStringRes (R .string.active),
127
+ getStatusColor(StatusType .SUCCESS ),
128
+ UiStringRes (R .string.domains_site_domain_never_expires)
111
129
)
112
130
113
131
val customDomains = domains.filter { ! it.wpcomDomain }
@@ -116,7 +134,7 @@ class DomainsDashboardViewModel @Inject constructor(
116
134
val hasPaidPlan = ! SiteUtils .onFreePlan(site)
117
135
118
136
if (hasCustomDomains) {
119
- listItems + = buildCustomDomainItems(site, customDomains)
137
+ listItems + = buildCustomDomainItems(site, customDomains, allDomains )
120
138
}
121
139
122
140
listItems + = buildCtaItems(hasCustomDomains, hasDomainCredit, hasPaidPlan)
@@ -125,6 +143,13 @@ class DomainsDashboardViewModel @Inject constructor(
125
143
_uiModel .postValue(listItems)
126
144
}
127
145
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
150
+ else -> R .color.red_50
151
+ }
152
+
128
153
private fun buildCtaItems (
129
154
hasCustomDomains : Boolean ,
130
155
hasDomainCredit : Boolean ,
@@ -161,7 +186,11 @@ class DomainsDashboardViewModel @Inject constructor(
161
186
return listItems
162
187
}
163
188
164
- private fun buildCustomDomainItems (site : SiteModel , customDomains : List <Domain >): List <DomainsDashboardItem > {
189
+ private fun buildCustomDomainItems (
190
+ site : SiteModel ,
191
+ customDomains : List <Domain >,
192
+ allDomains : List <AllDomainsDomain >
193
+ ): List <DomainsDashboardItem > {
165
194
val listItems = mutableListOf<DomainsDashboardItem >()
166
195
listItems + = SiteDomainsHeader (
167
196
UiStringResWithParams (
@@ -170,9 +199,18 @@ class DomainsDashboardViewModel @Inject constructor(
170
199
)
171
200
)
172
201
listItems + = customDomains.map {
202
+ val allDomainsDomain = allDomains.find { allDomainsItem -> it.domain == allDomainsItem.domain }
203
+
173
204
SiteDomains (
174
205
UiStringText (it.domain.orEmpty()),
175
- if (it.expirySoon) {
206
+ it.primaryDomain,
207
+ allDomainsDomain?.domainStatus?.status?.let { status ->
208
+ UiStringText (status)
209
+ } ? : UiStringRes (R .string.error),
210
+ getStatusColor(allDomainsDomain?.domainStatus?.statusType),
211
+ if (! it.hasRegistration) {
212
+ null
213
+ } else if (it.expirySoon) {
176
214
UiStringText (
177
215
htmlMessageUtils.getHtmlMessageFromStringFormatResId(
178
216
R .string.domains_site_domain_expires_soon,
@@ -185,14 +223,23 @@ class DomainsDashboardViewModel @Inject constructor(
185
223
listOf (UiStringText (it.expiry.orEmpty()))
186
224
)
187
225
},
188
- it.primaryDomain
226
+ allDomainsDomain?. let { ListItemInteraction .create(allDomainsDomain, this ::onDomainClick) }
189
227
)
190
228
}
191
229
return listItems
192
230
}
193
231
194
232
private fun getCleanUrl (url : String? ) = StringUtils .removeTrailingSlash(UrlUtils .removeScheme(url))
195
233
234
+ private fun onDomainClick (allDomainsDomain : AllDomainsDomain ) {
235
+ _onNavigation .value = Event (
236
+ OpenDomainManagement (
237
+ allDomainsDomain.domain ? : return ,
238
+ allDomainsDomain.getDomainDetailsUrl() ? : return
239
+ )
240
+ )
241
+ }
242
+
196
243
private fun onGetDomainClick () {
197
244
analyticsTrackerWrapper.track(DOMAINS_DASHBOARD_GET_DOMAIN_TAPPED , site)
198
245
_onNavigation .value = Event (GetDomain (site))
0 commit comments