package com.tamarasdk.ui import android.app.Activity import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import com.tamarasdk.PaymentResult import com.tamarasdk.R import com.tamarasdk.TamaraPayment import com.tamarasdk.TamaraPaymentActivity import com.tamarasdk.const.PaymentStatus import com.tamarasdk.databinding.TamaraFragmentPaymentBinding import com.tamarasdk.error.PaymentError import com.tamarasdk.log.Logging import com.tamarasdk.model.MerchantUrl import com.tamarasdk.model.Order import com.tamarasdk.model.response.CheckoutSession import com.tamarasdk.vo.Status internal class TamaraPaymentFragment : Fragment() { private var _binding: TamaraFragmentPaymentBinding? = null private val binding get() = _binding!! companion object { const val ARG_ORDER = "order" const val ARG_PAYMENT_STATUS = "payment_status" const val ARG_CHECKOUT_SESSION = "checkout_session" } private var order: Order? = null private var checkoutSession: CheckoutSession? = null private lateinit var viewModel: TamaraPaymentViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = TamaraFragmentPaymentBinding.inflate(inflater, container, false) return binding.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) arguments?.let { val status = it.getString(ARG_PAYMENT_STATUS) it.remove(ARG_PAYMENT_STATUS) status?.let { status -> when (PaymentStatus.valueOf(status)) { PaymentStatus.STATUS_SUCCESS -> { checkoutSession = it.getParcelable(WebViewFragment.ARG_CHECK_OUT_SESSION) TamaraPayment.endSession() val intent = PaymentResult.successIntent(TamaraPaymentActivity.EXTRA_RESULT) intent.putExtra( TamaraPaymentActivity.EXTRA_CHECKOUT_SESSION, checkoutSession ) activity?.setResult( Activity.RESULT_OK, intent ) activity?.finish() } PaymentStatus.STATUS_CANCEL -> { activity?.setResult( Activity.RESULT_OK, PaymentResult.cancelIntent(TamaraPaymentActivity.EXTRA_RESULT) ) activity?.finish() } PaymentStatus.STATUS_ERROR -> { activity?.setResult( Activity.RESULT_OK, PaymentResult.failIntent( TamaraPaymentActivity.EXTRA_RESULT, PaymentError("Something went wrong!") ) ) activity?.finish() } PaymentStatus.STATUS_INITIALIZE -> { order = it.getParcelable(ARG_ORDER) checkoutSession = it.getParcelable(ARG_CHECKOUT_SESSION) order?.let { order -> viewModel = ViewModelProvider(requireActivity()).get(TamaraPaymentViewModel::class.java) if (savedInstanceState == null) { viewModel.updateOrder(order) } viewModel.orderInfoLiveData.observe(viewLifecycleOwner, Observer { when (it.status) { Status.LOADING -> { showLoading() } Status.SUCCESS -> { hideLoading() checkoutSession = it.data checkoutSession?.let { Logging.d( "API", "checkout session: " + checkoutSession?.checkout_url + " " + checkoutSession?.order_id ) processCheckout() } // val intent = PaymentResult.successIntent(TamaraPaymentActivity.EXTRA_RESULT) // intent.putExtra("CHECK_OUT_SESSION", it.data) // activity?.setResult( // Activity.RESULT_OK, intent) // activity?.finish() } Status.ERROR -> { hideLoading() activity?.setResult( Activity.RESULT_OK, PaymentResult.failIntent( TamaraPaymentActivity.EXTRA_RESULT, PaymentError(it.message.toString()) ) ) activity?.finish() Logging.d("API", it.message.toString()) } } }) } ?: run { checkoutSession?.let { processCheckout() } } } else -> { } } } } } private fun processCheckout() { checkoutSession?.let { var bundle = Bundle() bundle.putParcelable(WebViewFragment.ARG_CHECK_OUT_SESSION, checkoutSession) order?.merchantUrl?.let { bundle.putParcelable(WebViewFragment.ARG_MERCHANT_URL, order?.merchantUrl) } ?: run { bundle.putParcelable( WebViewFragment.ARG_MERCHANT_URL, MerchantUrl( TamaraPayment.getInstance().pushUrl, TamaraPayment.getInstance().cancelUrl, TamaraPayment.getInstance().failureUrl, TamaraPayment.getInstance().successUrl ) ) } findNavController().navigate(R.id.action_tamaraPaymentFragment_to_webViewFragment, bundle) } } private fun showLoading() { binding.progressBar.visibility = View.VISIBLE } private fun hideLoading() { binding.progressBar.visibility = View.GONE } }