Skip to content

Commit

Permalink
Provide integration ready fiserv composable (#202)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmaier authored Aug 14, 2024
1 parent 5a0eae5 commit 6beebb9
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 36 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ All notable changes to this project will be documented in this file.
### Removed
### Fixed

## [0.75.4]
### Added
* Provide integration ready Fiserv composable

## [0.75.3]
### Added
* Add empty implementation for the ShoppingCartListener #201

## [0.75.2]
### Fixed
* ui: crash due to missing project id when adding a credit card
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ object PaymentInputViewHelper {
usePayone -> Payone.registerCard(activity, project, paymentMethod, Snabble.formPrefillData)
useFiserv -> {
args.putString(FiservInputView.ARG_PROJECT_ID, projectId)
args.putSerializable(FiservInputView.ARG_PAYMENT_TYPE, paymentMethod)
args.putSerializable(FiservInputView.ARG_PAYMENT_TYPE, paymentMethod.name)
SnabbleUI.executeAction(context, SnabbleUI.Event.SHOW_FISERV_INPUT, args)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import io.snabble.sdk.PaymentMethod
import io.snabble.sdk.ui.payment.PaymentMethodMetaDataHelper
import io.snabble.sdk.ui.payment.creditcard.shared.CustomerInfoInputScreen
Expand All @@ -18,57 +20,70 @@ import io.snabble.sdk.ui.utils.serializableExtra

open class FiservInputFragment : Fragment() {

private val viewModel: FiservViewModel by viewModels { FiservViewModelFactory(requireContext()) }

private lateinit var paymentMethod: PaymentMethod
private lateinit var paymentMethod: String
private lateinit var projectId: String

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

paymentMethod =
arguments?.serializableExtra<PaymentMethod>(FiservInputView.ARG_PAYMENT_TYPE)
arguments?.serializableExtra<String>(FiservInputView.ARG_PAYMENT_TYPE)
?: kotlin.run { activity?.onBackPressed(); return }

projectId = arguments?.serializableExtra<String>(FiservInputView.ARG_PROJECT_ID)
?: kotlin.run { activity?.onBackPressed(); return }

(requireActivity() as? AppCompatActivity)?.supportActionBar?.title =
PaymentMethodMetaDataHelper(requireContext()).labelFor(paymentMethod)
PaymentMethodMetaDataHelper(requireContext()).labelFor(PaymentMethod.valueOf(paymentMethod))
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
ComposeView(inflater.context).apply {
setContent {
val uiState: UiState = viewModel.uiState.collectAsStateWithLifecycle().value
FiservScreen(
projectId = projectId,
paymentMethod = PaymentMethod.valueOf(paymentMethod),
onBackNavigationClick = { activity?.onBackPressed() }
)
}
}
}

when {
uiState.formUrl == null ->
ThemeWrapper {
CustomerInfoInputScreen(
onErrorProcessed = { viewModel.errorHandled() },
isLoading = uiState.isLoading,
onSendAction = { viewModel.sendUserData(it) },
showError = uiState.showError,
countryItems = uiState.countryItems,
onBackNavigationClick = { activity?.onBackPressed() }
)
}
@Composable
fun FiservScreen(
projectId: String,
paymentMethod: PaymentMethod,
onBackNavigationClick: () -> Unit,
) {
val context = LocalContext.current
val viewModel: FiservViewModel = viewModel(factory = FiservViewModelFactory(context))
val uiState: UiState = viewModel.uiState.collectAsStateWithLifecycle().value

else -> AndroidView(
factory = { context ->
FiservInputView(context)
.apply {
load(
projectId,
paymentMethod,
uiState.formUrl,
uiState.deletePreAuthUrl
)
}
}
)
}
when {
uiState.formUrl == null ->
ThemeWrapper {
CustomerInfoInputScreen(
onErrorProcessed = { viewModel.errorHandled() },
isLoading = uiState.isLoading,
onSendAction = { viewModel.sendUserData(it) },
showError = uiState.showError,
countryItems = uiState.countryItems,
onBackNavigationClick = onBackNavigationClick
)
}
}

else -> AndroidView(
factory = { ctx ->
FiservInputView(ctx)
.apply {
load(
projectId,
paymentMethod,
uiState.formUrl,
uiState.deletePreAuthUrl
)
}
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ internal class FiservViewModel(
val uiState: StateFlow<UiState> = _uiState.asStateFlow()

private val paymentMethod =
savedStateHandle.get<PaymentMethod>(FiservInputView.ARG_PAYMENT_TYPE)
savedStateHandle.get<String>(FiservInputView.ARG_PAYMENT_TYPE)?.let { PaymentMethod.valueOf(it) }
private val projectId = savedStateHandle.get<String>(FiservInputView.ARG_PROJECT_ID)

fun sendUserData(customerInfo: CustomerInfo) {
Expand Down

0 comments on commit 6beebb9

Please sign in to comment.