Skip to content

Commit

Permalink
feat(POM-386): Extend native APM events (#209)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitalii-vanziak-cko authored Jul 12, 2024
1 parent f544e88 commit 0e67134
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.processout.sdk.api.model.event

import com.processout.sdk.api.model.response.PONativeAlternativePaymentMethodParameter
import com.processout.sdk.core.ProcessOutResult

/**
Expand All @@ -20,14 +21,26 @@ sealed class PONativeAlternativePaymentMethodEvent {

/**
* Event is sent when user changes any editable value.
*
* @param[parameter] Parameter definition.
* @param[value] Parameter plain value. __Warning:__ may contain sensitive information.
*/
data object ParametersChanged : PONativeAlternativePaymentMethodEvent()
data class ParametersChanged(
val parameter: PONativeAlternativePaymentMethodParameter,
val value: String
) : PONativeAlternativePaymentMethodEvent()

/**
* Event is sent just before submitting user input.
* This is usually a result of a user action, e.g. button press.
*
* @param[parameters] Parameter definitions.
* @param[values] Parameter plain values. __Warning:__ may contain sensitive information.
*/
data object WillSubmitParameters : PONativeAlternativePaymentMethodEvent()
data class WillSubmitParameters(
val parameters: List<PONativeAlternativePaymentMethodParameter>,
val values: Map<String, String>
) : PONativeAlternativePaymentMethodEvent()

/**
* Event is sent when parameters were submitted successfully.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,14 @@ internal class NativeAlternativePaymentMethodViewModel private constructor(
inputParameters = updatedInputParameters
)
)
dispatch(ParametersChanged)
updatedInputParameters.find { it.parameter.key == key }?.let {
dispatch(
ParametersChanged(
parameter = it.parameter,
value = it.plainValue()
)
)
}
POLogger.debug("Payment parameters updated: %s", updatedInputParameters)
}
}
Expand All @@ -303,7 +310,12 @@ internal class NativeAlternativePaymentMethodViewModel private constructor(
fun submitPayment() {
_uiState.value.doWhenUserInput { uiModel ->
POLogger.info("Will submit payment parameters.")
dispatch(WillSubmitParameters)
dispatch(
WillSubmitParameters(
parameters = uiModel.inputParameters.map { it.parameter },
values = uiModel.inputParameters.values()
)
)

val invalidFields = uiModel.inputParameters.mapNotNull { it.validate() }
if (invalidFields.isNotEmpty()) {
Expand All @@ -322,6 +334,14 @@ internal class NativeAlternativePaymentMethodViewModel private constructor(
}
}

private fun List<InputParameter>.values(): Map<String, String> {
val values = mutableMapOf<String, String>()
forEach {
values[it.parameter.key] = it.plainValue()
}
return values
}

private fun InputParameter.validate(): POFailure.InvalidField? {
val value = plainValue()
if (parameter.required && value.isBlank())
Expand Down Expand Up @@ -358,12 +378,10 @@ internal class NativeAlternativePaymentMethodViewModel private constructor(

private fun initiatePayment(uiModel: NativeAlternativePaymentMethodUiModel) {
viewModelScope.launch {
val data = mutableMapOf<String, String>()
uiModel.inputParameters.forEach {
data[it.parameter.key] = it.plainValue()
}
val request = PONativeAlternativePaymentMethodRequest(
invoiceId, gatewayConfigurationId, data
invoiceId = invoiceId,
gatewayConfigurationId = gatewayConfigurationId,
parameters = uiModel.inputParameters.values()
)
when (val result = invoicesService.initiatePayment(request)) {
is ProcessOutResult.Success -> with(result.value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.processout.sdk.api.model.request.PONativeAlternativePaymentMethodRequ
import com.processout.sdk.api.model.response.*
import com.processout.sdk.api.model.response.PONativeAlternativePaymentMethodParameter.ParameterType
import com.processout.sdk.api.model.response.PONativeAlternativePaymentMethodParameter.ParameterType.*
import com.processout.sdk.api.model.response.PONativeAlternativePaymentMethodParameter.ParameterValue
import com.processout.sdk.api.model.response.PONativeAlternativePaymentMethodState.*
import com.processout.sdk.api.service.POInvoicesService
import com.processout.sdk.core.POFailure.Code.*
Expand Down Expand Up @@ -270,6 +271,7 @@ internal class NativeAlternativePaymentInteractor(
text = it.displayName
)
},
rawType = rawType,
type = type(),
length = length,
displayName = displayName,
Expand All @@ -280,6 +282,21 @@ internal class NativeAlternativePaymentInteractor(
}
}

private fun Field.toParameter() = PONativeAlternativePaymentMethodParameter(
key = id,
length = length,
required = required,
rawType = rawType,
displayName = displayName,
availableValues = availableValues?.map {
ParameterValue(
value = it.value,
displayName = it.text,
default = null
)
}
)

private fun startUserInput(stateValue: UserInputStateValue) {
_state.update { UserInput(stateValue) }
enableUserInputSecondaryAction()
Expand Down Expand Up @@ -390,7 +407,14 @@ internal class NativeAlternativePaymentInteractor(
_state.update { UserInput(updatedStateValue) }
if (isTextChanged) {
POLogger.debug("Field is edited by the user: %s", id)
dispatch(ParametersChanged)
updatedStateValue.fields.find { it.id == id }?.let {
dispatch(
ParametersChanged(
parameter = it.toParameter(),
value = it.value.text
)
)
}
if (updatedStateValue.areAllFieldsValid()) {
_state.update { UserInput(updatedStateValue.copy(submitAllowed = true)) }
}
Expand Down Expand Up @@ -431,7 +455,12 @@ internal class NativeAlternativePaymentInteractor(
private fun submit() {
_state.whenUserInput { stateValue ->
POLogger.info("Will submit payment parameters.")
dispatch(WillSubmitParameters)
dispatch(
WillSubmitParameters(
parameters = stateValue.fields.map { it.toParameter() },
values = stateValue.fields.values()
)
)
val invalidFields = stateValue.fields.mapNotNull { it.validate() }
if (invalidFields.isNotEmpty()) {
val failure = ProcessOutResult.Failure(
Expand All @@ -457,6 +486,14 @@ internal class NativeAlternativePaymentInteractor(
}
}

private fun List<Field>.values(): Map<String, String> {
val values = mutableMapOf<String, String>()
forEach {
values[it.id] = it.value.text
}
return values
}

private fun Field.validate(): InvalidField? {
val value = value.text
if (required && value.isBlank()) {
Expand Down Expand Up @@ -496,14 +533,10 @@ internal class NativeAlternativePaymentInteractor(
private fun initiatePayment() {
_state.whenUserInput { stateValue ->
interactorScope.launch {
val parameters = mutableMapOf<String, String>()
stateValue.fields.forEach {
parameters[it.id] = it.value.text
}
val request = PONativeAlternativePaymentMethodRequest(
invoiceId = invoiceId,
gatewayConfigurationId = gatewayConfigurationId,
parameters = parameters
parameters = stateValue.fields.values()
)
invoicesService.initiatePayment(request)
.onSuccess { payment ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ internal sealed interface NativeAlternativePaymentInteractorState {
val id: String,
val value: TextFieldValue,
val availableValues: List<POAvailableValue>?,
val rawType: String,
val type: ParameterType,
val length: Int?,
val displayName: String,
Expand Down

0 comments on commit 0e67134

Please sign in to comment.