Skip to content

Commit 19f6445

Browse files
authored
[MERGE] #147 -> develop
[ADD/#147] 거래 경고 알러트 UI 추가
2 parents b1f2b0b + c8b0603 commit 19f6445

File tree

13 files changed

+404
-60
lines changed

13 files changed

+404
-60
lines changed

buildSrc/src/main/kotlin/Constants.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ object Constants {
33
const val compileSdk = 34
44
const val minSdk = 28
55
const val targetSdk = 34
6-
const val versionCode = 11
7-
const val versionName = "1.1.4"
6+
const val versionCode = 12
7+
const val versionName = "1.1.5"
88
}
365 Bytes
Loading

core/src/main/res/values/strings.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@
206206
<string name="sell_info_msg_ordered">입금 완료</string>
207207
<string name="sell_info_btn_fix">판매 확정하기</string>
208208
<string name="sell_info_btn_shipping">배송 중인 상품입니다.</string>
209+
210+
<string name="sell_delete_btn_delete">판매 취소하기</string>
211+
<string name="sell_delete_tv_title">판매 취소</string>
212+
<string name="sell_delete_tv_subtitle">정말 판매 취소를 하시겠습니까?</string>
213+
<string name="sell_delete_btn_sell_delete">확인</string>
209214
<string name="sell_delete_success_toast">상품 판매가 취소되었습니다.</string>
210215

211216
<string name="sell_confirm_tv_title">판매 확정</string>
@@ -217,6 +222,11 @@
217222
<string name="sell_confirm_btn_copy">복사</string>
218223
<string name="sell_order_fix_msg">판매 확정을 완료했습니다.</string>
219224

225+
<string name="sell_confirm_dialog_tv_title">판매 확정하시겠습니까?</string>
226+
<string name="sell_confirm_dialog_tv_subtitle">카카오톡 선물하기에 모든 정보를\n정확히 입력하셨나요?</string>
227+
<string name="sell_confirm_dialog_btn_confirm">네, 입력했습니다</string>
228+
<string name="sell_confirm_dialog_btn_return">다시 확인하기</string>
229+
220230
<string name="sign_up_tv_title">본인 인증을\n진행해주세요</string>
221231
<string name="sign_up_tv_subtitle">본인 명의의 휴대폰 번호로 인증을 진행해주세요</string>
222232
<string name="sign_up_tv_name">이름</string>

feature/sell/src/main/java/co/orange/sell/confirm/SellConfirmActivity.kt

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,27 @@ import androidx.core.view.isVisible
1111
import androidx.lifecycle.flowWithLifecycle
1212
import androidx.lifecycle.lifecycleScope
1313
import co.orange.core.R
14-
import co.orange.core.amplitude.AmplitudeManager
1514
import co.orange.core.base.BaseActivity
1615
import co.orange.core.extension.setOnSingleClickListener
1716
import co.orange.core.extension.stringOf
1817
import co.orange.core.extension.toast
19-
import co.orange.core.navigation.NavigationManager
2018
import co.orange.core.state.UiState
2119
import co.orange.domain.entity.response.SellBuyerInfoModel
2220
import co.orange.sell.databinding.ActivitySellConfirmBinding
2321
import dagger.hilt.android.AndroidEntryPoint
2422
import kotlinx.coroutines.flow.distinctUntilChanged
2523
import kotlinx.coroutines.flow.launchIn
2624
import kotlinx.coroutines.flow.onEach
27-
import javax.inject.Inject
2825
import co.orange.sell.R as featureR
2926

3027
@AndroidEntryPoint
3128
class SellConfirmActivity :
3229
BaseActivity<ActivitySellConfirmBinding>(featureR.layout.activity_sell_confirm) {
33-
@Inject
34-
lateinit var navigationManager: NavigationManager
3530

3631
private val viewModel by viewModels<SellConfirmViewModel>()
3732

33+
private var sellConfirmDialog: SellConfirmDialog? = null
34+
3835
override fun onCreate(savedInstanceState: Bundle?) {
3936
super.onCreate(savedInstanceState)
4037

@@ -43,7 +40,6 @@ class SellConfirmActivity :
4340
initConfirmBtnListener()
4441
getIntentInfo()
4542
observeGetBuyerInfoState()
46-
observePatchOrderConfirmState()
4743
}
4844

4945
private fun initBackBtnListener() {
@@ -60,7 +56,8 @@ class SellConfirmActivity :
6056

6157
private fun initConfirmBtnListener() {
6258
binding.btnConfirm.setOnSingleClickListener {
63-
viewModel.patchOrderConfirmToServer()
59+
sellConfirmDialog = SellConfirmDialog()
60+
sellConfirmDialog?.show(supportFragmentManager, DIALOG_CONFIRM)
6461
}
6562
}
6663

@@ -117,30 +114,17 @@ class SellConfirmActivity :
117114
clipboardManager.setPrimaryClip(ClipData.newPlainText(CLIP_LABEL, text))
118115
}
119116

120-
private fun observePatchOrderConfirmState() {
121-
viewModel.patchOrderConfirmState.flowWithLifecycle(lifecycle).distinctUntilChanged()
122-
.onEach { state ->
123-
when (state) {
124-
is UiState.Success -> {
125-
AmplitudeManager.apply {
126-
plusIntProperty("user_selling_count", 1)
127-
plusIntProperty("user_selling_total", viewModel.totalPrice)
128-
}
129-
toast(stringOf(R.string.sell_order_fix_msg))
130-
navigationManager.toMainViewWIthClearing(this)
131-
}
132-
133-
is UiState.Failure -> toast(stringOf(R.string.error_msg))
134-
else -> return@onEach
135-
}
136-
}.launchIn(lifecycleScope)
117+
override fun onDestroy() {
118+
super.onDestroy()
119+
sellConfirmDialog = null
137120
}
138121

139122
companion object {
140123
private const val EXTRA_ORDER_ID = "EXTRA_ORDER_ID"
141124
private const val EXTRA_TOTAL_PRICE = "EXTRA_TOTAL_PRICE"
142125

143126
private const val CLIP_LABEL = "BUYER_INFO"
127+
private const val DIALOG_CONFIRM = "DIALOG_CONFIRM"
144128

145129
const val WEB_TERM_SELL =
146130
"https://brawny-guan-098.notion.site/6d77260d027148ceb0f806f0911c284a?pvs=4"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package co.orange.sell.confirm
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import android.view.WindowManager
6+
import androidx.fragment.app.activityViewModels
7+
import androidx.lifecycle.flowWithLifecycle
8+
import androidx.lifecycle.lifecycleScope
9+
import co.orange.core.R
10+
import co.orange.core.amplitude.AmplitudeManager
11+
import co.orange.core.base.BaseDialog
12+
import co.orange.core.extension.setOnSingleClickListener
13+
import co.orange.core.extension.stringOf
14+
import co.orange.core.extension.toast
15+
import co.orange.core.navigation.NavigationManager
16+
import co.orange.core.state.UiState
17+
import co.orange.sell.databinding.DialogSellConfirmBinding
18+
import kotlinx.coroutines.flow.distinctUntilChanged
19+
import kotlinx.coroutines.flow.launchIn
20+
import kotlinx.coroutines.flow.onEach
21+
import javax.inject.Inject
22+
import co.orange.sell.R as featureR
23+
24+
class SellConfirmDialog :
25+
BaseDialog<DialogSellConfirmBinding>(featureR.layout.dialog_sell_confirm) {
26+
@Inject
27+
lateinit var navigationManager: NavigationManager
28+
29+
private val viewModel by activityViewModels<SellConfirmViewModel>()
30+
31+
override fun onStart() {
32+
super.onStart()
33+
dialog?.window?.apply {
34+
setLayout(
35+
WindowManager.LayoutParams.WRAP_CONTENT,
36+
WindowManager.LayoutParams.WRAP_CONTENT,
37+
)
38+
setBackgroundDrawableResource(R.color.transparent)
39+
}
40+
}
41+
42+
override fun onViewCreated(
43+
view: View,
44+
savedInstanceState: Bundle?,
45+
) {
46+
super.onViewCreated(view, savedInstanceState)
47+
48+
initReturnBtnListener()
49+
initConfirmBtnListener()
50+
observePatchOrderConfirmState()
51+
}
52+
53+
private fun initReturnBtnListener() {
54+
binding.btnReturn.setOnSingleClickListener { dismiss() }
55+
}
56+
57+
private fun initConfirmBtnListener() {
58+
binding.btnConfirm.setOnSingleClickListener {
59+
viewModel.patchOrderConfirmToServer()
60+
}
61+
}
62+
63+
private fun observePatchOrderConfirmState() {
64+
viewModel.patchOrderConfirmState.flowWithLifecycle(lifecycle).distinctUntilChanged()
65+
.onEach { state ->
66+
when (state) {
67+
is UiState.Success -> {
68+
AmplitudeManager.apply {
69+
plusIntProperty("user_selling_count", 1)
70+
plusIntProperty("user_selling_total", viewModel.totalPrice)
71+
}
72+
toast(stringOf(R.string.sell_order_fix_msg))
73+
navigationManager.toMainViewWIthClearing(requireContext())
74+
}
75+
76+
is UiState.Failure -> toast(stringOf(R.string.error_msg))
77+
else -> return@onEach
78+
}
79+
}.launchIn(lifecycleScope)
80+
}
81+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package co.orange.sell.info
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import android.view.WindowManager
6+
import androidx.activity.viewModels
7+
import androidx.fragment.app.activityViewModels
8+
import androidx.lifecycle.flowWithLifecycle
9+
import androidx.lifecycle.lifecycleScope
10+
import co.orange.core.base.BaseDialog
11+
import co.orange.core.extension.setOnSingleClickListener
12+
import co.orange.core.extension.stringOf
13+
import co.orange.core.extension.toast
14+
import co.orange.core.navigation.NavigationManager
15+
import co.orange.core.state.UiState
16+
import co.orange.sell.R
17+
import co.orange.sell.databinding.DialogBankBinding
18+
import co.orange.sell.databinding.DialogSellDeleteBinding
19+
import co.orange.sell.progress.SellProgressViewModel
20+
import dagger.hilt.android.AndroidEntryPoint
21+
import kotlinx.coroutines.flow.distinctUntilChanged
22+
import kotlinx.coroutines.flow.launchIn
23+
import kotlinx.coroutines.flow.onEach
24+
import javax.inject.Inject
25+
26+
@AndroidEntryPoint
27+
class SellDeleteDialog :
28+
BaseDialog<DialogSellDeleteBinding>(R.layout.dialog_sell_delete) {
29+
30+
private val viewModel by activityViewModels<SellInfoViewModel>()
31+
32+
override fun onStart() {
33+
super.onStart()
34+
dialog?.window?.apply {
35+
setLayout(
36+
WindowManager.LayoutParams.WRAP_CONTENT,
37+
WindowManager.LayoutParams.WRAP_CONTENT,
38+
)
39+
setBackgroundDrawableResource(co.orange.core.R.color.transparent)
40+
}
41+
}
42+
43+
override fun onViewCreated(
44+
view: View,
45+
savedInstanceState: Bundle?,
46+
) {
47+
super.onViewCreated(view, savedInstanceState)
48+
49+
initDeleteBtnListener()
50+
observeDeleteItemState()
51+
}
52+
53+
private fun initDeleteBtnListener() {
54+
binding.btnSellDelete.setOnSingleClickListener {
55+
viewModel.deleteSellingItemFromServer()
56+
}
57+
}
58+
59+
private fun observeDeleteItemState() {
60+
viewModel.deleteItemState
61+
.flowWithLifecycle(lifecycle)
62+
.distinctUntilChanged()
63+
.onEach { state ->
64+
when (state) {
65+
is UiState.Success -> {
66+
toast(stringOf(co.orange.core.R.string.sell_delete_success_toast))
67+
requireActivity().finish()
68+
dismiss()
69+
}
70+
71+
is UiState.Failure -> toast(stringOf(co.orange.core.R.string.error_msg))
72+
else -> return@onEach
73+
}
74+
}.launchIn(lifecycleScope)
75+
}
76+
}

feature/sell/src/main/java/co/orange/sell/info/SellInfoActivity.kt

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,16 @@ import co.orange.sell.R as featureR
3131
class SellInfoActivity : BaseActivity<ActivitySellInfoBinding>(featureR.layout.activity_sell_info) {
3232
private val viewModel by viewModels<SellInfoViewModel>()
3333

34+
private var sellMenuBottomSheet: SellMenuBottomSheet? = null
35+
3436
override fun onCreate(savedInstanceState: Bundle?) {
3537
super.onCreate(savedInstanceState)
3638

3739
initExitBtnListener()
3840
initSellConfirmBtnListener()
41+
initMenuBtnListener()
3942
getIntentInfo()
4043
observeGetSellInfoState()
41-
observeDeleteItemState()
4244
}
4345

4446
private fun initExitBtnListener() {
@@ -47,17 +49,16 @@ class SellInfoActivity : BaseActivity<ActivitySellInfoBinding>(featureR.layout.a
4749

4850
private fun initSellConfirmBtnListener() {
4951
binding.btnSellConfirm.setOnSingleClickListener {
50-
if (viewModel.isOnSale) {
51-
viewModel.deleteSellingItemFromServer()
52-
} else {
53-
startActivity(
54-
SellConfirmActivity.createIntent(
55-
this,
56-
viewModel.orderId,
57-
viewModel.totalPrice,
58-
),
59-
)
60-
}
52+
startActivity(
53+
SellConfirmActivity.createIntent(this, viewModel.orderId, viewModel.totalPrice),
54+
)
55+
}
56+
}
57+
58+
private fun initMenuBtnListener() {
59+
binding.btnMenu.setOnSingleClickListener {
60+
sellMenuBottomSheet = SellMenuBottomSheet()
61+
sellMenuBottomSheet?.show(supportFragmentManager, sellMenuBottomSheet?.tag)
6162
}
6263
}
6364

@@ -106,11 +107,10 @@ class SellInfoActivity : BaseActivity<ActivitySellInfoBinding>(featureR.layout.a
106107
}
107108

108109
private fun setItemStatus(status: String) {
109-
viewModel.isOnSale = status == ItemStatus.ON_SALE.name
110110
val (infoMsgResId, btnTextResId, isButtonEnabled) =
111111
when (status) {
112112
ItemStatus.ON_SALE.name -> {
113-
Triple(R.string.sell_info_msg_on_sale, R.string.sell_info_msg_cancel, true)
113+
Triple(R.string.sell_info_msg_on_sale, R.string.sell_info_btn_fix, false)
114114
}
115115

116116
ItemStatus.ORDER_PLACE.name -> {
@@ -156,23 +156,6 @@ class SellInfoActivity : BaseActivity<ActivitySellInfoBinding>(featureR.layout.a
156156
}
157157
}
158158

159-
private fun observeDeleteItemState() {
160-
viewModel.deleteItemState
161-
.flowWithLifecycle(lifecycle)
162-
.distinctUntilChanged()
163-
.onEach { state ->
164-
when (state) {
165-
is UiState.Success -> {
166-
toast(stringOf(R.string.sell_delete_success_toast))
167-
finish()
168-
}
169-
170-
is UiState.Failure -> toast(stringOf(R.string.error_msg))
171-
else -> return@onEach
172-
}
173-
}.launchIn(lifecycleScope)
174-
}
175-
176159
companion object {
177160
private const val EXTRA_ITEM_ID = "EXTRA_ITEM_ID"
178161

feature/sell/src/main/java/co/orange/sell/info/SellInfoViewModel.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ class SellInfoViewModel
2121
var orderId = ""
2222
var totalPrice = 0
2323

24-
var isOnSale = true
25-
2624
private val _getSellInfoState = MutableStateFlow<UiState<SellInfoModel>>(UiState.Empty)
2725
val getSellInfoState: StateFlow<UiState<SellInfoModel>> = _getSellInfoState
2826

0 commit comments

Comments
 (0)