Facebook
From Wet Pelican, 1 Year ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 45
  1. package com.app.features.checkout
  2.  
  3. import com.app.core.enums.DeliveryTime
  4. import com.app.core.enums.ShippingType
  5. import com.app.core.errors.AppError
  6. import com.app.core.models.*
  7. import com.app.core.states.BaseEvent
  8. import com.app.core.states.BaseSideEffect
  9. import com.app.core.states.BaseState
  10. import com.app.features.checkout.models.AppTempAddress
  11. import com.app.features.checkout.models.UIDeliveryAddress
  12. import com.payfort.sdk.android.dependancies.models.FortRequest
  13. import com.robustastudio.checkout_feat.CartPriceDetails
  14. import com.robustastudio.checkout_feat.PaymentKey
  15. import com.tinder.StateMachine
  16.  
  17. sealed class CheckoutState : BaseState() {
  18.  
  19.     object UnInitialized : CheckoutState()
  20.  
  21.     //LOADING DELIVERY DAYS, INTERVALS, USER ADDRESSES, PAYMENT METHODS, PRICE DETAILS
  22.     object LoadingCheckoutData : CheckoutState()
  23.  
  24.     class FailedToLoadCheckoutData(val error: AppError) : CheckoutState()
  25.  
  26.    data class CheckoutDataLoaded(
  27.         val availableDeliveryDays: List<AppDeliveryDay>?,
  28.         val availableAddresses: List<UIDeliveryAddress>?,
  29.         val isGuest: Boolean,
  30.         val selectedShippingType: ShippingType,
  31.         val hasNonGroceryItems: Boolean,
  32.         val hasGroceryItems: Boolean,
  33.         val selectedDeliveryAddress: UIDeliveryAddress,
  34.         val selectedStore: AppShippingLocation? = null,
  35.         val availableStores: List<AppShippingLocation>? = null,
  36.         val availableCities: List<AppRegion>? = null,
  37.         val guestTempAddress: AppTempAddress? = null,
  38.         val cartPriceDetails: CartPriceDetails,
  39.         val isPaymentSectionLoading: Boolean = false,
  40.         val selectedDeliveryTime: DeliveryTime = DeliveryTime.ASAP,
  41.         val selectedDeliveryDay: AppDeliveryDay,
  42.         val selectedDeliveryInterval: AppDeliveryInterval,
  43.         val availablePaymentMethods: List<AppAvailablePaymentMethod>?,
  44.         val selectedPaymentMethod: AppAvailablePaymentMethod,
  45.         val isCartLoading: Boolean = false,
  46.         val isDeliveryExpanded: Boolean = true,
  47.         val isPaymentExpanded: Boolean = true,
  48.         val user: AppUser,
  49.         val points: List<Pair<Double, Double>>
  50.     ) : CheckoutState()
  51.  
  52.     class Submitting(
  53.         val availableDeliveryDays: List<AppDeliveryDay>?,
  54.         val availableAddresses: List<UIDeliveryAddress>?,
  55.         val isGuest: Boolean,
  56.         val selectedShippingType: ShippingType,
  57.         val hasNonGroceryItems: Boolean,
  58.         val hasGroceryItems: Boolean,
  59.         val selectedDeliveryAddress: UIDeliveryAddress,
  60.         val selectedStore: AppShippingLocation? = null,
  61.         val availableStores: List<AppShippingLocation>? = null,
  62.         val availableCities: List<AppRegion>? = null,
  63.         val guestTempAddress: AppTempAddress? = null,
  64.         val cartPriceDetails: CartPriceDetails,
  65.         val selectedDeliveryTime: DeliveryTime = DeliveryTime.ASAP,
  66.         val selectedDeliveryDay: AppDeliveryDay,
  67.         val selectedDeliveryInterval: AppDeliveryInterval,
  68.         val availablePaymentMethods: List<AppAvailablePaymentMethod>?,
  69.         val selectedPaymentMethod: AppAvailablePaymentMethod,
  70.         val user: AppUser,
  71.         val points: List<Pair<Double, Double>>
  72.     ) : CheckoutState()
  73.  
  74.     class OrderCreated(
  75.         val orderNumbers: List<String>,
  76.     ) : CheckoutState()
  77. }
  78.  
  79. sealed class CheckoutEvent : BaseEvent() {
  80.  
  81.     object StartLoadingCheckoutData : CheckoutEvent()
  82.  
  83.     class OnFailedToLoadCheckoutData(val error: AppError) : CheckoutEvent()
  84.  
  85.     object OnPlaceOrderClicked : CheckoutEvent()
  86.     object OnProceedToPayment : CheckoutEvent()
  87.     object OnCouponStateChange : CheckoutEvent()
  88.     object GoBackToShipping : CheckoutEvent()
  89.     class PlaceOrderWithCC(
  90.         val paymentKey: PaymentKey
  91.     ) : CheckoutEvent()
  92.  
  93.     class OnPlaceOrderFailed(val error: AppError) : CheckoutEvent()
  94.  
  95.     class OnOrderPlacedSuccessfully(val orderNumbers: List<String>) : CheckoutEvent()
  96.     class OnShippingDataLoaded(
  97.         val availableDeliveryDays: List<AppDeliveryDay>?,
  98.         val availableAddresses: List<UIDeliveryAddress>?,
  99.         val isGuest: Boolean,
  100.         val selectedShippingType: ShippingType,
  101.         val hasNonGroceryItems: Boolean,
  102.         val hasGroceryItems: Boolean,
  103.         val selectedDeliveryAddress: UIDeliveryAddress,
  104.         val selectedStore: AppShippingLocation? = null,
  105.         val availableStores: List<AppShippingLocation>? = null,
  106.         val cities: List<AppRegion>? = null,
  107.         val guestTempAddress: AppTempAddress? = null,
  108.         val cartPriceDetails: CartPriceDetails,
  109.         val availablePaymentMethods: List<AppAvailablePaymentMethod>,
  110.         val selectedPaymentMethod: AppAvailablePaymentMethod,
  111.         val selectedDeliveryDay: AppDeliveryDay,
  112.         val selectedDeliveryInterval: AppDeliveryInterval,
  113.         val user: AppUser,
  114.         val pointsRate: List<Pair<Double, Double>>
  115.     ) : CheckoutEvent()
  116.  
  117.     class OnPaymentMethodSelected(
  118.         val paymentMethod: AppAvailablePaymentMethod
  119.     ) : CheckoutEvent()
  120.  
  121.     class OnCartPricesUpdated(
  122.         val cartPriceDetails: CartPriceDetails
  123.     ) : CheckoutEvent()
  124.  
  125.     class OnDeliveryTimeSelected(
  126.         val deliveryTime: DeliveryTime,
  127.         val selectedDeliveryInterval: AppDeliveryInterval,
  128.         val selectedDeliveryDay: AppDeliveryDay,
  129.         val blockPlaceOrder: Boolean
  130.     ) : CheckoutEvent()
  131.  
  132.     class OnAddressSelected(val shippingAddress: UIDeliveryAddress) : CheckoutEvent()
  133.     class OnDeliveryDaysUpdated(
  134.         val days: List<AppDeliveryDay>,
  135.         val selectedDeliveryInterval: AppDeliveryInterval,
  136.         val selectedDeliveryDay: AppDeliveryDay
  137.     ) : CheckoutEvent()
  138.  
  139.     class OnToggleDeliveryExpanded(val expanded: Boolean) : CheckoutEvent()
  140.     class OnTogglePaymentExpanded(val expanded: Boolean) : CheckoutEvent()
  141.  
  142.     object OnPendingGateway : CheckoutEvent()
  143.     object OnApplyLoyaltyPoints : CheckoutEvent()
  144.  
  145.     class OnApplyLoyaltyPointsSuccessfully(
  146.         val cartPriceDetails: CartPriceDetails,
  147.         val user: AppUser,
  148.     ) : CheckoutEvent()
  149.  
  150.     class OnApplyLoyaltyPointsFailed(val error: AppError) : CheckoutEvent()
  151. }
  152.  
  153. sealed class CheckoutSideEffect : BaseSideEffect() {
  154.     class ShowError(val error: AppError) : CheckoutSideEffect()
  155.     class ShowMinimumOrderAmountError(val minimumOrderAmount: Int) : CheckoutSideEffect()
  156. }
  157.  
  158. fun getCheckoutStateMachine() =
  159.     StateMachine.create<CheckoutState, CheckoutEvent, CheckoutSideEffect> {
  160.  
  161.         initialState(CheckoutState.UnInitialized)
  162.  
  163.         state<CheckoutState.UnInitialized> {
  164.             on<CheckoutEvent.StartLoadingCheckoutData> {
  165.                 transitionTo(state = CheckoutState.LoadingCheckoutData)
  166.             }
  167.         }
  168.  
  169.         state<CheckoutState.LoadingCheckoutData> {
  170.             on<CheckoutEvent.OnShippingDataLoaded> {
  171.                 transitionTo(
  172.                     state = CheckoutState.CheckoutDataLoaded(
  173.                         availableAddresses = it.availableAddresses,
  174.                         isGuest = it.isGuest,
  175.                         selectedShippingType = it.selectedShippingType,
  176.                         selectedDeliveryAddress = it.selectedDeliveryAddress,
  177.                         selectedStore = it.selectedStore,
  178.                         availableStores = it.availableStores,
  179.                         availableCities = it.cities,
  180.                         guestTempAddress = it.guestTempAddress,
  181.                         cartPriceDetails = it.cartPriceDetails,
  182.                         availableDeliveryDays = it.availableDeliveryDays,
  183.                         availablePaymentMethods = it.availablePaymentMethods,
  184.                         selectedPaymentMethod = it.selectedPaymentMethod,
  185.                         hasNonGroceryItems = it.hasNonGroceryItems,
  186.                         hasGroceryItems = it.hasGroceryItems,
  187.                         selectedDeliveryInterval = it.selectedDeliveryInterval,
  188.                         selectedDeliveryDay = it.selectedDeliveryDay,
  189.                         user = it.user,
  190.                         points = it.pointsRate
  191.                     )
  192.                 )
  193.             }
  194.             on<CheckoutEvent.OnFailedToLoadCheckoutData> { event ->
  195.                 transitionTo(state = CheckoutState.FailedToLoadCheckoutData(event.error))
  196.             }
  197.         }
  198.         state<CheckoutState.FailedToLoadCheckoutData> {
  199.             on<CheckoutEvent.StartLoadingCheckoutData> {
  200.                 transitionTo(state = CheckoutState.LoadingCheckoutData)
  201.             }
  202.         }
  203.  
  204.         state<CheckoutState.CheckoutDataLoaded> {
  205.             on<CheckoutEvent.StartLoadingCheckoutData> {
  206.                 transitionTo(state = CheckoutState.LoadingCheckoutData)
  207.             }
  208.  
  209.             on<CheckoutEvent.OnToggleDeliveryExpanded> {
  210.                 transitionTo(
  211.                     state = CheckoutState.CheckoutDataLoaded(
  212.                         this.availableDeliveryDays,
  213.                         this.availableAddresses,
  214.                         this.isGuest,
  215.                         this.selectedShippingType,
  216.                         hasNonGroceryItems = this.hasNonGroceryItems,
  217.                         hasGroceryItems = this.hasGroceryItems,
  218.                         this.selectedDeliveryAddress,
  219.                         this.selectedStore,
  220.                         this.availableStores,
  221.                         this.availableCities,
  222.                         this.guestTempAddress,
  223.                         cartPriceDetails = this.cartPriceDetails,
  224.                         isPaymentSectionLoading = this.isPaymentSectionLoading,
  225.                         availablePaymentMethods = this.availablePaymentMethods,
  226.                         selectedPaymentMethod = this.selectedPaymentMethod,
  227.                         isDeliveryExpanded = it.expanded,
  228.                         isPaymentExpanded = this.isPaymentExpanded,
  229.                         selectedDeliveryTime = this.selectedDeliveryTime,
  230.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  231.                         selectedDeliveryDay = this.selectedDeliveryDay,
  232.                         user = this.user,
  233.                         points = this.points
  234.                     )
  235.                 )
  236.             }
  237.             on<CheckoutEvent.OnTogglePaymentExpanded> {
  238.                 transitionTo(
  239.                     state = CheckoutState.CheckoutDataLoaded(
  240.                         this.availableDeliveryDays,
  241.                         this.availableAddresses,
  242.                         this.isGuest,
  243.                         this.selectedShippingType,
  244.                         hasNonGroceryItems = this.hasNonGroceryItems,
  245.                         hasGroceryItems = this.hasGroceryItems,
  246.                         this.selectedDeliveryAddress,
  247.                         this.selectedStore,
  248.                         this.availableStores,
  249.                         this.availableCities,
  250.                         this.guestTempAddress,
  251.                         cartPriceDetails = this.cartPriceDetails,
  252.                         isPaymentSectionLoading = this.isPaymentSectionLoading,
  253.                         availablePaymentMethods = this.availablePaymentMethods,
  254.                         selectedPaymentMethod = this.selectedPaymentMethod,
  255.                         isDeliveryExpanded = this.isDeliveryExpanded,
  256.                         isPaymentExpanded = it.expanded,
  257.                         selectedDeliveryTime = this.selectedDeliveryTime,
  258.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  259.                         selectedDeliveryDay = this.selectedDeliveryDay,
  260.                         user = this.user,
  261.                         points = this.points
  262.                     )
  263.                 )
  264.             }
  265.  
  266.             on<CheckoutEvent.OnDeliveryTimeSelected> {
  267.                 transitionTo(
  268.                     state = CheckoutState.CheckoutDataLoaded(
  269.                         this.availableDeliveryDays,
  270.                         this.availableAddresses,
  271.                         this.isGuest,
  272.                         this.selectedShippingType,
  273.                         hasNonGroceryItems = this.hasNonGroceryItems,
  274.                         hasGroceryItems = this.hasGroceryItems,
  275.                         this.selectedDeliveryAddress,
  276.                         this.selectedStore,
  277.                         this.availableStores,
  278.                         this.availableCities,
  279.                         this.guestTempAddress,
  280.                         cartPriceDetails = this.cartPriceDetails,
  281.                         isPaymentSectionLoading = this.isPaymentSectionLoading,
  282.                         selectedDeliveryTime = it.deliveryTime,
  283.                         availablePaymentMethods = this.availablePaymentMethods,
  284.                         selectedPaymentMethod = this.selectedPaymentMethod,
  285.                         selectedDeliveryDay = it.selectedDeliveryDay,
  286.                         selectedDeliveryInterval = it.selectedDeliveryInterval,
  287.                         isCartLoading = it.blockPlaceOrder,
  288.                         isDeliveryExpanded = this.isDeliveryExpanded,
  289.                         isPaymentExpanded = this.isPaymentExpanded,
  290.                         user = this.user,
  291.                         points = this.points
  292.                     )
  293.                 )
  294.             }
  295.             on<CheckoutEvent.OnAddressSelected> {
  296.                 transitionTo(
  297.                     state = CheckoutState.CheckoutDataLoaded(
  298.                         this.availableDeliveryDays,
  299.                         this.availableAddresses,
  300.                         this.isGuest,
  301.                         this.selectedShippingType,
  302.                         hasNonGroceryItems = this.hasNonGroceryItems,
  303.                         hasGroceryItems = this.hasGroceryItems,
  304.                         it.shippingAddress,
  305.                         this.selectedStore,
  306.                         this.availableStores,
  307.                         this.availableCities,
  308.                         this.guestTempAddress,
  309.                         cartPriceDetails = this.cartPriceDetails,
  310.                         isPaymentSectionLoading = true,
  311.                         selectedDeliveryTime = this.selectedDeliveryTime,
  312.                         availablePaymentMethods = this.availablePaymentMethods,
  313.                         selectedPaymentMethod = this.selectedPaymentMethod,
  314.                         selectedDeliveryDay = this.selectedDeliveryDay,
  315.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  316.                         isDeliveryExpanded = this.isDeliveryExpanded,
  317.                         isPaymentExpanded = this.isPaymentExpanded,
  318.                         user = this.user,
  319.                         points = this.points
  320.                     )
  321.                 )
  322.             }
  323.             on<CheckoutEvent.OnDeliveryDaysUpdated> {
  324.                 transitionTo(
  325.                     state = CheckoutState.CheckoutDataLoaded(
  326.                         it.days,
  327.                         this.availableAddresses,
  328.                         this.isGuest,
  329.                         this.selectedShippingType,
  330.                         hasNonGroceryItems = this.hasNonGroceryItems,
  331.                         hasGroceryItems = this.hasGroceryItems,
  332.                         this.selectedDeliveryAddress,
  333.                         this.selectedStore,
  334.                         this.availableStores,
  335.                         this.availableCities,
  336.                         this.guestTempAddress,
  337.                         cartPriceDetails = this.cartPriceDetails,
  338.                         selectedDeliveryTime = DeliveryTime.ASAP,
  339.                         availablePaymentMethods = this.availablePaymentMethods,
  340.                         selectedPaymentMethod = this.selectedPaymentMethod,
  341.                         selectedDeliveryInterval = it.selectedDeliveryInterval,
  342.                         selectedDeliveryDay = it.selectedDeliveryDay,
  343.                         isCartLoading = false,
  344.                         isDeliveryExpanded = this.isDeliveryExpanded,
  345.                         isPaymentExpanded = this.isPaymentExpanded,
  346.                         user = this.user,
  347.                         points = this.points
  348.                     )
  349.                 )
  350.             }
  351.             on<CheckoutEvent.OnPaymentMethodSelected> {
  352.                 transitionTo(
  353.                     state = CheckoutState.CheckoutDataLoaded(
  354.                         this.availableDeliveryDays,
  355.                         this.availableAddresses,
  356.                         this.isGuest,
  357.                         this.selectedShippingType,
  358.                         hasNonGroceryItems = this.hasNonGroceryItems,
  359.                         hasGroceryItems = this.hasGroceryItems,
  360.                         this.selectedDeliveryAddress,
  361.                         this.selectedStore,
  362.                         this.availableStores,
  363.                         this.availableCities,
  364.                         this.guestTempAddress,
  365.                         cartPriceDetails = this.cartPriceDetails,
  366.                         isPaymentSectionLoading = true,
  367.                         selectedDeliveryTime = this.selectedDeliveryTime,
  368.                         availablePaymentMethods = this.availablePaymentMethods,
  369.                         selectedPaymentMethod = it.paymentMethod,
  370.                         isCartLoading = true,
  371.                         selectedDeliveryDay = this.selectedDeliveryDay,
  372.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  373.                         isDeliveryExpanded = this.isDeliveryExpanded,
  374.                         isPaymentExpanded = this.isPaymentExpanded,
  375.                         user = this.user,
  376.                         points = this.points
  377.                     )
  378.                 )
  379.             }
  380.             on<CheckoutEvent.OnCartPricesUpdated> {
  381.                 transitionTo(
  382.                     state = CheckoutState.CheckoutDataLoaded(
  383.                         this.availableDeliveryDays,
  384.                         this.availableAddresses,
  385.                         this.isGuest,
  386.                         this.selectedShippingType,
  387.                         hasNonGroceryItems = this.hasNonGroceryItems,
  388.                         hasGroceryItems = this.hasGroceryItems,
  389.                         this.selectedDeliveryAddress,
  390.                         this.selectedStore,
  391.                         this.availableStores,
  392.                         this.availableCities,
  393.                         this.guestTempAddress,
  394.                         cartPriceDetails = it.cartPriceDetails,
  395.                         isPaymentSectionLoading = false,
  396.                         selectedDeliveryTime = this.selectedDeliveryTime,
  397.                         availablePaymentMethods = this.availablePaymentMethods,
  398.                         selectedPaymentMethod = this.selectedPaymentMethod,
  399.                         isCartLoading = false,
  400.                         selectedDeliveryDay = this.selectedDeliveryDay,
  401.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  402.                         isDeliveryExpanded = this.isDeliveryExpanded,
  403.                         isPaymentExpanded = this.isPaymentExpanded,
  404.                         user = this.user,
  405.                         points = this.points
  406.                     )
  407.                 )
  408.             }
  409.             on<CheckoutEvent.OnCouponStateChange> {
  410.                 transitionTo(
  411.                     state = CheckoutState.CheckoutDataLoaded(
  412.                         availableDeliveryDays = availableDeliveryDays,
  413.                         availableAddresses = availableAddresses,
  414.                         isGuest = this.isGuest,
  415.                         selectedShippingType = this.selectedShippingType,
  416.                         hasNonGroceryItems = this.hasNonGroceryItems,
  417.                         hasGroceryItems = this.hasGroceryItems,
  418.                         selectedDeliveryAddress = this.selectedDeliveryAddress,
  419.                         selectedStore = this.selectedStore,
  420.                         availableStores = this.availableStores,
  421.                         availableCities = this.availableCities,
  422.                         guestTempAddress = this.guestTempAddress,
  423.                         cartPriceDetails = this.cartPriceDetails,
  424.                         isPaymentSectionLoading = true,
  425.                         selectedDeliveryTime = this.selectedDeliveryTime,
  426.                         availablePaymentMethods = this.availablePaymentMethods,
  427.                         selectedPaymentMethod = this.selectedPaymentMethod,
  428.                         isCartLoading = true,
  429.                         selectedDeliveryDay = this.selectedDeliveryDay,
  430.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  431.                         isDeliveryExpanded = this.isDeliveryExpanded,
  432.                         isPaymentExpanded = this.isPaymentExpanded,
  433.                         user = this.user,
  434.                         points = this.points
  435.                     )
  436.                 )
  437.             }
  438.             on<CheckoutEvent.OnPlaceOrderClicked> {
  439.                 transitionTo(
  440.                     state = CheckoutState.Submitting(
  441.                         this.availableDeliveryDays,
  442.                         this.availableAddresses,
  443.                         this.isGuest,
  444.                         this.selectedShippingType,
  445.                         hasNonGroceryItems = this.hasNonGroceryItems,
  446.                         hasGroceryItems = this.hasGroceryItems,
  447.                         this.selectedDeliveryAddress,
  448.                         this.selectedStore,
  449.                         this.availableStores,
  450.                         this.availableCities,
  451.                         this.guestTempAddress,
  452.                         cartPriceDetails = this.cartPriceDetails,
  453.                         selectedDeliveryTime = this.selectedDeliveryTime,
  454.                         availablePaymentMethods = this.availablePaymentMethods,
  455.                         selectedPaymentMethod = this.selectedPaymentMethod,
  456.                         selectedDeliveryDay = this.selectedDeliveryDay,
  457.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  458.                         user = this.user,
  459.                         points = this.points
  460.                     )
  461.                 )
  462.             }
  463.             on<CheckoutEvent.OnApplyLoyaltyPoints> {
  464.                 transitionTo(
  465.                     state = CheckoutState.CheckoutDataLoaded(
  466.                         this.availableDeliveryDays,
  467.                         this.availableAddresses,
  468.                         this.isGuest,
  469.                         this.selectedShippingType,
  470.                         hasNonGroceryItems = this.hasNonGroceryItems,
  471.                         hasGroceryItems = this.hasGroceryItems,
  472.                         this.selectedDeliveryAddress,
  473.                         this.selectedStore,
  474.                         this.availableStores,
  475.                         this.availableCities,
  476.                         this.guestTempAddress,
  477.                         cartPriceDetails = this.cartPriceDetails,
  478.                         selectedDeliveryTime = this.selectedDeliveryTime,
  479.                         availablePaymentMethods = this.availablePaymentMethods,
  480.                         selectedPaymentMethod = this.selectedPaymentMethod,
  481.                         selectedDeliveryDay = this.selectedDeliveryDay,
  482.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  483.                         user = this.user,
  484.                         points = this.points,
  485.                         isCartLoading = true
  486.                     )
  487.                 )
  488.             }
  489.             on<CheckoutEvent.StartLoadingCheckoutData> {
  490.                 transitionTo(state = CheckoutState.LoadingCheckoutData)
  491.             }
  492.             on<CheckoutEvent.OnApplyLoyaltyPointsSuccessfully> { event ->
  493.                 transitionTo(
  494.                     state = CheckoutState.CheckoutDataLoaded(
  495.                         this.availableDeliveryDays,
  496.                         this.availableAddresses,
  497.                         this.isGuest,
  498.                         this.selectedShippingType,
  499.                         hasNonGroceryItems = this.hasNonGroceryItems,
  500.                         hasGroceryItems = this.hasGroceryItems,
  501.                         this.selectedDeliveryAddress,
  502.                         this.selectedStore,
  503.                         this.availableStores,
  504.                         this.availableCities,
  505.                         this.guestTempAddress,
  506.                         cartPriceDetails = event.cartPriceDetails,
  507.                         isPaymentSectionLoading = false,
  508.                         selectedDeliveryTime = this.selectedDeliveryTime,
  509.                         availablePaymentMethods = this.availablePaymentMethods,
  510.                         selectedPaymentMethod = this.selectedPaymentMethod,
  511.                         isCartLoading = false,
  512.                         selectedDeliveryDay = this.selectedDeliveryDay,
  513.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  514.                         user = event.user,
  515.                         points = this.points
  516.                     )
  517.                 )
  518.             }
  519.             on<CheckoutEvent.OnApplyLoyaltyPointsFailed> { event ->
  520.                 transitionTo(
  521.                     state = CheckoutState.CheckoutDataLoaded(
  522.                         this.availableDeliveryDays,
  523.                         this.availableAddresses,
  524.                         this.isGuest,
  525.                         this.selectedShippingType,
  526.                         hasNonGroceryItems = this.hasNonGroceryItems,
  527.                         hasGroceryItems = this.hasGroceryItems,
  528.                         this.selectedDeliveryAddress,
  529.                         this.selectedStore,
  530.                         this.availableStores,
  531.                         this.availableCities,
  532.                         this.guestTempAddress,
  533.                         cartPriceDetails = this.cartPriceDetails,
  534.                         isPaymentSectionLoading = false,
  535.                         selectedDeliveryTime = this.selectedDeliveryTime,
  536.                         availablePaymentMethods = this.availablePaymentMethods,
  537.                         selectedPaymentMethod = this.selectedPaymentMethod,
  538.                         isCartLoading = false,
  539.                         selectedDeliveryDay = this.selectedDeliveryDay,
  540.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  541.                         user = this.user,
  542.                         points = this.points
  543.                     ),
  544.                     CheckoutSideEffect.ShowError(event.error)
  545.                 )
  546.             }
  547.         }
  548.  
  549.         state<CheckoutState.Submitting> {
  550.             on<CheckoutEvent.OnPendingGateway> {
  551.                 transitionTo(
  552.                     state = CheckoutState.CheckoutDataLoaded(
  553.                         this.availableDeliveryDays,
  554.                         this.availableAddresses,
  555.                         this.isGuest,
  556.                         this.selectedShippingType,
  557.                         hasNonGroceryItems = this.hasNonGroceryItems,
  558.                         hasGroceryItems = this.hasGroceryItems,
  559.                         this.selectedDeliveryAddress,
  560.                         this.selectedStore,
  561.                         this.availableStores,
  562.                         this.availableCities,
  563.                         this.guestTempAddress,
  564.                         cartPriceDetails = this.cartPriceDetails,
  565.                         isPaymentSectionLoading = true,
  566.                         selectedDeliveryTime = this.selectedDeliveryTime,
  567.                         availablePaymentMethods = this.availablePaymentMethods,
  568.                         selectedPaymentMethod = this.selectedPaymentMethod,
  569.                         isCartLoading = false,
  570.                         selectedDeliveryDay = this.selectedDeliveryDay,
  571.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  572.                         user = this.user,
  573.                         points = this.points
  574.                     )
  575.                 )
  576.             }
  577.             on<CheckoutEvent.OnPlaceOrderFailed> { event ->
  578.                 transitionTo(
  579.                     state = CheckoutState.CheckoutDataLoaded(
  580.                         this.availableDeliveryDays,
  581.                         this.availableAddresses,
  582.                         this.isGuest,
  583.                         this.selectedShippingType,
  584.                         hasNonGroceryItems = this.hasNonGroceryItems,
  585.                         hasGroceryItems = this.hasGroceryItems,
  586.                         this.selectedDeliveryAddress,
  587.                         this.selectedStore,
  588.                         this.availableStores,
  589.                         this.availableCities,
  590.                         this.guestTempAddress,
  591.                         cartPriceDetails = this.cartPriceDetails,
  592.                         isPaymentSectionLoading = true,
  593.                         selectedDeliveryTime = this.selectedDeliveryTime,
  594.                         availablePaymentMethods = this.availablePaymentMethods,
  595.                         selectedPaymentMethod = this.selectedPaymentMethod,
  596.                         isCartLoading = false,
  597.                         selectedDeliveryDay = this.selectedDeliveryDay,
  598.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  599.                         user = this.user,
  600.                         points = this.points
  601.                     ),
  602.                     CheckoutSideEffect.ShowError(event.error)
  603.                 )
  604.             }
  605.             on<CheckoutEvent.PlaceOrderWithCC> { event ->
  606.                 transitionTo(
  607.                     state = CheckoutState.Submitting(
  608.                         this.availableDeliveryDays,
  609.                         this.availableAddresses,
  610.                         this.isGuest,
  611.                         this.selectedShippingType,
  612.                         hasNonGroceryItems = this.hasNonGroceryItems,
  613.                         hasGroceryItems = this.hasGroceryItems,
  614.                         this.selectedDeliveryAddress,
  615.                         this.selectedStore,
  616.                         this.availableStores,
  617.                         this.availableCities,
  618.                         this.guestTempAddress,
  619.                         cartPriceDetails = this.cartPriceDetails,
  620.                         selectedDeliveryTime = this.selectedDeliveryTime,
  621.                         availablePaymentMethods = this.availablePaymentMethods,
  622.                         selectedPaymentMethod = this.selectedPaymentMethod,
  623.                         selectedDeliveryDay = this.selectedDeliveryDay,
  624.                         selectedDeliveryInterval = this.selectedDeliveryInterval,
  625.                         user = this.user,
  626.                         points = this.points
  627.                     )
  628.                 )
  629.             }
  630.             on<CheckoutEvent.OnOrderPlacedSuccessfully> { event ->
  631.                 transitionTo(
  632.                     state = CheckoutState.OrderCreated(
  633.                         event.orderNumbers
  634.                     )
  635.                 )
  636.             }
  637.         }
  638.  
  639.         state<CheckoutState.OrderCreated> {
  640.  
  641.         }
  642.     }
  643.  
  644. sealed class CheckoutClickActions {
  645.  
  646.     class ProceedWithPayFortPayment(
  647.         val fortRequest: FortRequest
  648.     ) : CheckoutClickActions()
  649.  
  650.     class ProceedWithPaymobPayment(
  651.         val iFrameUrl: String? = null,
  652.         val referenceNumber: String? = null
  653.     )
  654.  
  655.     class VerifyAddress(val address: AppShippingAddress) : CheckoutClickActions()
  656. }