Skip to content

Commit

Permalink
introduce extended state, or context.
Browse files Browse the repository at this point in the history
no more dataTransitions. we now use context like XState
  • Loading branch information
cpetzel committed Jan 12, 2024
1 parent ca61bc3 commit 79f6052
Show file tree
Hide file tree
Showing 5 changed files with 201 additions and 167 deletions.
25 changes: 16 additions & 9 deletions core/src/main/java/app/cash/paykit/core/impl/CashAppPayImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import app.cash.paykit.core.NetworkManager
import app.cash.paykit.core.analytics.PayKitAnalyticsEventDispatcher
import app.cash.paykit.core.android.ApplicationContextHolder
import app.cash.paykit.core.exceptions.CashAppPayIntegrationException
import app.cash.paykit.core.exceptions.CashAppPayNetworkException
import app.cash.paykit.core.models.response.CustomerResponseData
import app.cash.paykit.core.models.sdk.CashAppPayPaymentAction
import app.cash.paykit.core.state.ClientEventPayload.CreatingCustomerRequestData
Expand All @@ -52,6 +51,7 @@ import app.cash.paykit.core.state.PayKitMachineStates.StartingWithExistingReques
import app.cash.paykit.core.state.RealPayKitWorker
import app.cash.paykit.core.utils.orElse
import ru.nsk.kstatemachine.DefaultDataState
import ru.nsk.kstatemachine.Stay
import ru.nsk.kstatemachine.activeStates
import ru.nsk.kstatemachine.onStateEntry
import ru.nsk.kstatemachine.onStateExit
Expand Down Expand Up @@ -105,23 +105,27 @@ internal class CashAppPayImpl(
)
}
onTransitionComplete { transitionParams, activeStates ->
if (transitionParams.direction is Stay) {
return@onTransitionComplete
}
Log.d(
name,
"Transition complete from ${transitionParams.transition.sourceState}, active states: $activeStates"
)

val state = activeStates.last() as PayKitMachineStates // return the "deepest" child state
val state =
activeStates.last() as PayKitMachineStates // return the "deepest" child state
val customerState = when (state) {
PayKitMachineStates.NotStarted -> NotStarted
PayKitMachineStates.CreatingCustomerRequest -> CreatingCustomerRequest
is PayKitMachineStates.ReadyToAuthorize -> ReadyToAuthorize(state.data)
is DeepLinking -> Authorizing
is PayKitMachineStates.ReadyToAuthorize -> ReadyToAuthorize(payKitMachine.context.customerResponseData!!)
is DeepLinking -> Authorizing// TODO maybe not send this state update to client?
is Polling -> PollingTransactionStatus
is DecidedState.Approved -> Approved(state.data)
is DecidedState.Approved -> Approved(payKitMachine.context.customerResponseData!!)
DecidedState.Declined -> Declined
is ExceptionState -> CashAppPayExceptionState(state.data)
is ExceptionState -> CashAppPayExceptionState(payKitMachine.context.error!!)
PayKitMachineStates.UpdatingCustomerRequest -> UpdatingCustomerRequest
StartingWithExistingRequest -> RetrievingExistingCustomerRequest
is PayKitMachineStates.Authorizing -> TODO()
}

// TODO handle exception cases
Expand Down Expand Up @@ -150,7 +154,10 @@ internal class CashAppPayImpl(
}

@Throws(IllegalStateException::class)
override fun createCustomerRequest(paymentAction: CashAppPayPaymentAction, redirectUri: String?) {
override fun createCustomerRequest(
paymentAction: CashAppPayPaymentAction,
redirectUri: String?
) {
createCustomerRequest(listOf(paymentAction), redirectUri)
}

Expand Down Expand Up @@ -180,7 +187,7 @@ internal class CashAppPayImpl(
}

payKitMachine.stateMachine.processEventBlocking(
PayKitEvents.CreateCustomerRequest(
event = PayKitEvents.CreateCustomerRequestEvent.CreateCustomerRequest(
CreatingCustomerRequestData(
paymentActions,
redirectUri
Expand Down
21 changes: 13 additions & 8 deletions core/src/main/java/app/cash/paykit/core/state/PayKitEvents.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package app.cash.paykit.core.state

import app.cash.paykit.core.exceptions.CashAppPayIntegrationException
import app.cash.paykit.core.models.request.CustomerRequestData
import app.cash.paykit.core.models.response.CustomerResponseData
import app.cash.paykit.core.models.sdk.CashAppPayPaymentAction
import app.cash.paykit.core.state.ClientEventPayload.CreatingCustomerRequestData
Expand All @@ -42,20 +43,24 @@ sealed interface ClientEventPayload {
}

sealed interface PayKitEvents {
data class CreateCustomerRequest(
override val data: CreatingCustomerRequestData,
) : DataEvent<CreatingCustomerRequestData> {
data class Success(override val data: CustomerResponseData) :
DataEvent<CustomerResponseData>
sealed interface CreateCustomerRequestEvent {
data class CreateCustomerRequest(override val data: CreatingCustomerRequestData) :
DataEvent<CreatingCustomerRequestData>, CreateCustomerRequestEvent

data class Error(override val data: Exception) : DataEvent<Exception>
data class Success(override val data: CustomerResponseData) : DataEvent<CustomerResponseData>,
CreateCustomerRequestEvent

data class Error(override val data: Exception) : DataEvent<Exception>,
CreateCustomerRequestEvent
}

sealed interface GetCustomerRequestEvent {
data class Success(override val data: CustomerResponseData) : DataEvent<CustomerResponseData>,
data class Success(override val data: CustomerResponseData) :
DataEvent<CustomerResponseData>,
GetCustomerRequestEvent

data class Error(override val data: Exception) : DataEvent<Exception>, GetCustomerRequestEvent
data class Error(override val data: Exception) : DataEvent<Exception>,
GetCustomerRequestEvent
}

sealed interface StartWithExistingCustomerRequestEvent {
Expand Down
Loading

0 comments on commit 79f6052

Please sign in to comment.