Skip to content

Commit 90c9600

Browse files
Merge pull request #10732 from woocommerce/issue/10721-blaze-payment-summary
[Blaze] Payment summary screen
2 parents e31d0dc + 37d215f commit 90c9600

21 files changed

+664
-8
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ object AppUrls {
114114
const val STORE_ONBOARDING_WCPAY_SETUP_GUIDE = "https://woo.com/document/woopayments/startup-guide/"
115115
const val STORE_ONBOARDING_PAYMENTS_SETUP_GUIDE =
116116
"https://woo.com/documentation/woocommerce/getting-started/sell-products/core-payment-options/"
117+
const val ADVERTISING_POLICY = "https://automattic.com/advertising-policy/"
118+
const val BLAZE_SUPPORT = "https://wordpress.com/support/promote-a-post/"
117119

118120
fun getScreenshotUrl(themeDemoUrl: String) =
119121
"https://s0.wp.com/mshots/v1/$themeDemoUrl?demo=true/?w=1200&h=2400&vpw=400&vph=800"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.woocommerce.android.model
2+
3+
import androidx.annotation.DrawableRes
4+
import com.woocommerce.android.R
5+
6+
enum class CreditCardType {
7+
VISA,
8+
MASTERCARD,
9+
UNIONPAY,
10+
JCB,
11+
DISCOVER,
12+
DINERS,
13+
AMEX,
14+
UNKNOWN;
15+
16+
val icon: Int
17+
@DrawableRes
18+
get() = when (this) {
19+
VISA -> R.drawable.credit_card_visa
20+
MASTERCARD -> R.drawable.credit_card_mastercard
21+
UNIONPAY -> R.drawable.credit_card_unionpay
22+
JCB -> R.drawable.credit_card_jcb
23+
DISCOVER -> R.drawable.credit_card_discover
24+
DINERS -> R.drawable.credit_card_diners
25+
AMEX -> R.drawable.credit_card_amex
26+
UNKNOWN -> R.drawable.credit_card_placeholder
27+
}
28+
29+
companion object {
30+
fun fromString(string: String): CreditCardType {
31+
return when (string.lowercase()) {
32+
"visa" -> VISA
33+
"mastercard" -> MASTERCARD
34+
"unionpay" -> UNIONPAY
35+
"jcb" -> JCB
36+
"discover" -> DISCOVER
37+
"diners" -> DINERS
38+
"amex" -> AMEX
39+
else -> UNKNOWN
40+
}
41+
}
42+
}
43+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package com.woocommerce.android.ui.blaze
22

33
import android.os.Parcelable
44
import com.woocommerce.android.OnChangedException
5+
import com.woocommerce.android.model.CreditCardType
56
import com.woocommerce.android.tools.SelectedSite
67
import com.woocommerce.android.ui.products.ProductDetailRepository
78
import com.woocommerce.android.util.TimezoneProvider
89
import com.woocommerce.android.util.WooLog
910
import kotlinx.coroutines.flow.map
1011
import kotlinx.parcelize.Parcelize
1112
import org.wordpress.android.fluxc.model.blaze.BlazeAdSuggestion
13+
import org.wordpress.android.fluxc.model.blaze.BlazePaymentMethod.PaymentMethodInfo
1214
import org.wordpress.android.fluxc.store.blaze.BlazeCampaignsStore
1315
import java.util.Date
1416
import javax.inject.Inject
@@ -39,6 +41,7 @@ class BlazeRepository @Inject constructor(
3941
WooLog.w(WooLog.T.BLAZE, "Failed to fetch languages: ${result.error}")
4042
Result.failure(OnChangedException(result.error))
4143
}
44+
4245
else -> Result.success(Unit)
4346
}
4447
}
@@ -54,6 +57,7 @@ class BlazeRepository @Inject constructor(
5457
WooLog.w(WooLog.T.BLAZE, "Failed to fetch devices: ${result.error}")
5558
Result.failure(OnChangedException(result.error))
5659
}
60+
5761
else -> Result.success(Unit)
5862
}
5963
}
@@ -69,6 +73,7 @@ class BlazeRepository @Inject constructor(
6973
WooLog.w(WooLog.T.BLAZE, "Failed to fetch interests: ${result.error}")
7074
Result.failure(OnChangedException(result.error))
7175
}
76+
7277
else -> Result.success(Unit)
7378
}
7479
}
@@ -84,6 +89,7 @@ class BlazeRepository @Inject constructor(
8489
WooLog.w(WooLog.T.BLAZE, "Failed to fetch locations: ${result.error}")
8590
Result.failure(OnChangedException(result.error))
8691
}
92+
8793
else -> Result.success(
8894
result.model?.map { location ->
8995
Location(location.id, location.name, location.parent?.name, location.type)
@@ -106,6 +112,7 @@ class BlazeRepository @Inject constructor(
106112
WooLog.w(WooLog.T.BLAZE, "Failed to fetch ad suggestions: ${result.error}")
107113
Result.failure(OnChangedException(result.error))
108114
}
115+
109116
else -> Result.success(result.model?.mapToUiModel() ?: emptyList())
110117
}
111118
}
@@ -123,6 +130,48 @@ class BlazeRepository @Inject constructor(
123130
)
124131
}
125132

133+
suspend fun fetchPaymentMethods(): Result<PaymentMethodsData> {
134+
val result = blazeCampaignsStore.fetchBlazePaymentMethods(selectedSite.get())
135+
136+
return when {
137+
result.isError -> {
138+
WooLog.w(WooLog.T.BLAZE, "Failed to fetch payment methods: ${result.error}")
139+
Result.failure(OnChangedException(result.error))
140+
}
141+
142+
else -> result.model?.let { paymentMethods ->
143+
Result.success(
144+
PaymentMethodsData(
145+
savedPaymentMethods = paymentMethods.savedPaymentMethods.map { paymentMethod ->
146+
PaymentMethod(
147+
id = paymentMethod.id,
148+
name = paymentMethod.name,
149+
info = when (paymentMethod.info) {
150+
is PaymentMethodInfo.CreditCardInfo ->
151+
(paymentMethod.info as PaymentMethodInfo.CreditCardInfo).let {
152+
PaymentMethod.PaymentMethodInfo.CreditCard(
153+
creditCardType = CreditCardType.fromString(it.type),
154+
cardHolderName = it.cardHolderName
155+
)
156+
}
157+
158+
PaymentMethodInfo.Unknown -> {
159+
PaymentMethod.PaymentMethodInfo.Unknown
160+
}
161+
}
162+
)
163+
},
164+
addPaymentMethodUrls = PaymentMethodUrls(
165+
formUrl = paymentMethods.addPaymentMethodUrls.formUrl,
166+
successUrl = paymentMethods.addPaymentMethodUrls.successUrl,
167+
idUrlParameter = paymentMethods.addPaymentMethodUrls.idUrlParameter
168+
)
169+
)
170+
)
171+
} ?: Result.failure(NullPointerException("API response is null"))
172+
}
173+
}
174+
126175
@Parcelize
127176
data class CampaignPreview(
128177
val productId: Long,
@@ -146,6 +195,37 @@ class BlazeRepository @Inject constructor(
146195
val durationInDays: Int,
147196
val startDate: Date,
148197
) : Parcelable
198+
199+
@Parcelize
200+
data class PaymentMethodsData(
201+
val savedPaymentMethods: List<PaymentMethod>,
202+
val addPaymentMethodUrls: PaymentMethodUrls
203+
) : Parcelable
204+
205+
@Parcelize
206+
data class PaymentMethod(
207+
val id: String,
208+
val name: String,
209+
val info: PaymentMethodInfo
210+
) : Parcelable {
211+
sealed interface PaymentMethodInfo : Parcelable {
212+
@Parcelize
213+
data class CreditCard(
214+
val creditCardType: CreditCardType,
215+
val cardHolderName: String
216+
) : PaymentMethodInfo
217+
218+
@Parcelize
219+
data object Unknown : PaymentMethodInfo
220+
}
221+
}
222+
223+
@Parcelize
224+
data class PaymentMethodUrls(
225+
val formUrl: String,
226+
val successUrl: String,
227+
val idUrlParameter: String
228+
) : Parcelable
149229
}
150230

151231
@Parcelize
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.woocommerce.android.ui.blaze.creation.payment
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.fragment.app.viewModels
8+
import androidx.navigation.fragment.findNavController
9+
import com.woocommerce.android.ui.base.BaseFragment
10+
import com.woocommerce.android.ui.compose.composeView
11+
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
12+
import com.woocommerce.android.ui.main.AppBarStatus
13+
import com.woocommerce.android.viewmodel.MultiLiveEvent
14+
import dagger.hilt.android.AndroidEntryPoint
15+
16+
@AndroidEntryPoint
17+
class BlazeCampaignPaymentSummaryFragment : BaseFragment() {
18+
override val activityAppBarStatus: AppBarStatus
19+
get() = AppBarStatus.Hidden
20+
21+
private val viewModel: BlazeCampaignPaymentSummaryViewModel by viewModels()
22+
23+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
24+
return composeView {
25+
WooThemeWithBackground {
26+
BlazeCampaignPaymentSummaryScreen(viewModel)
27+
}
28+
}
29+
}
30+
31+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
32+
handleEvents()
33+
}
34+
35+
private fun handleEvents() {
36+
viewModel.event.observe(viewLifecycleOwner) { event ->
37+
when (event) {
38+
MultiLiveEvent.Event.Exit -> findNavController().navigateUp()
39+
}
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)