Skip to content

Commit

Permalink
refactor : [페이먼츠] 상태 캡슐화
Browse files Browse the repository at this point in the history
  • Loading branch information
HamBP committed Jun 24, 2024
1 parent 9e953b7 commit a6a9962
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 36 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.nexters.boolti.tosspayments

import androidx.lifecycle.SavedStateHandle

internal sealed class TossPaymentState(
open val showId: String,
open val salesTicketTypeId: String,
open val ticketCount: Int,
) {
data class Ticketing(
override val showId: String,
override val salesTicketTypeId: String,
override val ticketCount: Int,
val reservationName: String,
val reservationPhoneNumber: String,
val depositorName: String,
val depositorPhoneNumber: String,
) : TossPaymentState(showId, salesTicketTypeId, ticketCount)

data class Gift(
override val showId: String,
override val salesTicketTypeId: String,
override val ticketCount: Int,
val senderName: String,
val senderContact: String,
val receiverName: String,
val receiverContact: String,
val giftMessage: String,
val giftImageId: String,
) : TossPaymentState(showId, salesTicketTypeId, ticketCount)

companion object {
fun from(savedStateHandle: SavedStateHandle): TossPaymentState {
val orderType: OrderType = savedStateHandle[EXTRA_KEY_ORDER_TYPE] ?: OrderType.TICKETING
val showId: String = savedStateHandle[EXTRA_KEY_SHOW_ID] ?: ""
val salesTicketTypeId: String = savedStateHandle[EXTRA_KEY_SALES_TICKET_ID] ?: ""
val ticketCount: Int = savedStateHandle[EXTRA_KEY_TICKET_COUNT] ?: 1

return if (orderType == OrderType.TICKETING) {
val reservationName: String = savedStateHandle[EXTRA_KEY_RESERVATION_NAME] ?: ""
val reservationPhoneNumber: String =
savedStateHandle[EXTRA_KEY_RESERVATION_PHONE_NUMBER] ?: ""
val depositorName: String = savedStateHandle[EXTRA_KEY_DEPOSITOR_NAME] ?: ""
val depositorPhoneNumber: String =
savedStateHandle[EXTRA_KEY_DEPOSITOR_PHONE_NUMBER] ?: ""
Ticketing(
showId,
salesTicketTypeId,
ticketCount,
reservationName,
reservationPhoneNumber,
depositorName,
depositorPhoneNumber
)
} else {
val senderName: String = savedStateHandle[EXTRA_KEY_SENDER_NAME] ?: ""
val senderContact: String = savedStateHandle[EXTRA_KEY_SENDER_PHONE_NUMBER] ?: ""
val receiverName: String = savedStateHandle[EXTRA_KEY_RECEIVER_NAME] ?: ""
val receiverContact: String =
savedStateHandle[EXTRA_KEY_RECEIVER_PHONE_NUMBER] ?: ""
val giftMessage: String = savedStateHandle[EXTRA_KEY_MESSAGE] ?: ""
val giftImageId: String = savedStateHandle[EXTRA_KEY_IMAGE_ID] ?: ""
Gift(
showId,
salesTicketTypeId,
ticketCount,
senderName,
senderContact,
receiverName,
receiverContact,
giftMessage,
giftImageId
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,7 @@ class TossPaymentsWidgetViewModel @Inject constructor(
private val ticketingRepository: TicketingRepository,
private val giftRepository: GiftRepository,
) : ViewModel() {
private val orderType: Int = savedStateHandle[EXTRA_KEY_ORDER_TYPE] ?: 0
private val showId: String = savedStateHandle[EXTRA_KEY_SHOW_ID] ?: ""
private val salesTicketTypeId: String = savedStateHandle[EXTRA_KEY_SALES_TICKET_ID] ?: ""
private val ticketCount: Int = savedStateHandle[EXTRA_KEY_TICKET_COUNT] ?: 1
private val reservationName: String = savedStateHandle[EXTRA_KEY_RESERVATION_NAME] ?: ""
private val reservationPhoneNumber: String = savedStateHandle[EXTRA_KEY_RESERVATION_PHONE_NUMBER] ?: ""
private val depositorName: String = savedStateHandle[EXTRA_KEY_DEPOSITOR_NAME] ?: ""
private val depositorPhoneNumber: String = savedStateHandle[EXTRA_KEY_DEPOSITOR_PHONE_NUMBER] ?: ""

// TODO : 별도 데이터 클래스로 정의하여 깔끔하게 초기화하기
private val senderName: String = savedStateHandle[EXTRA_KEY_SENDER_NAME] ?: ""
private val senderContact: String = savedStateHandle[EXTRA_KEY_SENDER_PHONE_NUMBER] ?: ""
private val receiverName: String = savedStateHandle[EXTRA_KEY_RECEIVER_NAME] ?: ""
private val receiverContact: String = savedStateHandle[EXTRA_KEY_RECEIVER_PHONE_NUMBER] ?: ""
private val giftMessage: String = savedStateHandle[EXTRA_KEY_MESSAGE] ?: ""
private val giftImageId: String = savedStateHandle[EXTRA_KEY_IMAGE_ID] ?: ""
private val paymentState = TossPaymentState.from(savedStateHandle)

private var widgetLoadSuccess: Boolean = false
private var agreementLoadSuccess: Boolean = false
Expand All @@ -54,15 +39,26 @@ class TossPaymentsWidgetViewModel @Inject constructor(
totalPrice: Int,
) {
viewModelScope.launch {
if (orderType == 0) {
approveTicketingPayment(orderId, paymentKey, totalPrice)
} else {
approveGiftPayment(orderId, paymentKey, totalPrice)
when (paymentState) {
is TossPaymentState.Ticketing -> approveTicketingPayment(
paymentState,
orderId,
paymentKey,
totalPrice
)

is TossPaymentState.Gift -> approveGiftPayment(
paymentState,
orderId,
paymentKey,
totalPrice
)
}
}
}

private suspend fun approveTicketingPayment(
state: TossPaymentState.Ticketing,
orderId: String,
paymentKey: String,
totalPrice: Int,
Expand All @@ -72,13 +68,13 @@ class TossPaymentsWidgetViewModel @Inject constructor(
orderId = orderId,
amount = totalPrice,
paymentKey = paymentKey,
showId = showId,
salesTicketTypeId = salesTicketTypeId,
ticketCount = ticketCount,
reservationName = reservationName,
reservationPhoneNumber = reservationPhoneNumber,
depositorName = depositorName,
depositorPhoneNumber = depositorPhoneNumber,
showId = state.showId,
salesTicketTypeId = state.salesTicketTypeId,
ticketCount = state.ticketCount,
reservationName = state.reservationName,
reservationPhoneNumber = state.reservationPhoneNumber,
depositorName = state.depositorName,
depositorPhoneNumber = state.depositorPhoneNumber,
)
).catch { e ->
if (e !is TicketingException) throw e
Expand All @@ -97,6 +93,7 @@ class TossPaymentsWidgetViewModel @Inject constructor(
}

private suspend fun approveGiftPayment(
state: TossPaymentState.Gift,
orderId: String,
paymentKey: String,
totalPrice: Int,
Expand All @@ -106,15 +103,15 @@ class TossPaymentsWidgetViewModel @Inject constructor(
orderId = orderId,
amount = totalPrice,
paymentKey = paymentKey,
showId = showId,
salesTicketTypeId = salesTicketTypeId,
ticketCount = ticketCount,
giftImageId = giftImageId,
message = giftMessage,
senderName = senderName,
senderPhoneNumber = senderContact,
recipientName = receiverName,
recipientPhoneNumber = receiverContact,
showId = state.showId,
salesTicketTypeId = state.salesTicketTypeId,
ticketCount = state.ticketCount,
giftImageId = state.giftImageId,
message = state.giftMessage,
senderName = state.senderName,
senderPhoneNumber = state.senderContact,
recipientName = state.receiverName,
recipientPhoneNumber = state.receiverContact,
)
).catch { e ->
if (e !is TicketingException) throw e
Expand Down

0 comments on commit a6a9962

Please sign in to comment.