Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] #117 : 탐색 화면의 검색 조건이 초기화되는 이슈 수정 #118

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.peonlee.core.ui.base

/**
* page 전환을 할 수 있는 Activity interface
*/
interface PageActivity {
fun moveToEvaluatePage()
}
Comment on lines +6 to +8
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거 navigator 이용하면 되지 않나욤?

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.peonlee.product
package com.peonlee.core.ui.viewmodel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import androidx.paging.PagingData
import androidx.paging.cachedIn
Expand Down Expand Up @@ -65,15 +66,39 @@ class ProductViewModel @Inject constructor(
}

// 정렬 타입 변경
fun setProductSortType(sortType: SortType) {
_productSearchCondition.value = _productSearchCondition.value.copy(sortedBy = sortType)
fun setProductSortType(sortType: SortType, isReset: Boolean = false) {
_productSearchCondition.value = if (isReset) _productSearchCondition.value.copy(
keyword = "",
sortedBy = sortType,
price = null,
stores = null,
events = null,
categories = null
) else _productSearchCondition.value.copy(sortedBy = sortType)
}

// 가격 필터 선택
fun setPriceFilter(priceFilter: PriceFilter?) {
_productSearchCondition.value = _productSearchCondition.value.copy(price = priceFilter)
}

// 편의점 변경
fun setStoreType(storeType: StoreType, isReset: Boolean = false) {
_productSearchCondition.value = if (isReset) _productSearchCondition.value.copy(
keyword = "",
sortedBy = SortType.RECENT,
price = null,
stores = listOf(storeType),
events = null,
categories = null
) else _productSearchCondition.value.copy(stores = listOf(storeType))
}

// 검색 키워드 변경
fun setKeyword(keyword: String) {
_productSearchCondition.value = _productSearchCondition.value.copy(keyword = keyword)
}

// 이벤트 선택
fun setEventFilter(stores: List<StoreType>, events: List<EventType>) {
_productSearchCondition.value = _productSearchCondition.value.copy(
Expand All @@ -100,4 +125,15 @@ class ProductViewModel @Inject constructor(
fun setProductSearchCondition(newProductSearchCondition: ProductSearchConditionUiModel) {
_productSearchCondition.value = newProductSearchCondition
}

class ProductViewModelFactory(
private val repository: ProductRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ProductViewModel::class.java)) {
return ProductViewModel(repository) as T
}
throw IllegalArgumentException("unKnown ViewModel class")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,25 @@ import androidx.activity.viewModels
import androidx.core.view.isVisible
import androidx.core.widget.addTextChangedListener
import com.peonlee.core.ui.base.BaseActivity
import com.peonlee.core.ui.base.ProductSearchableViewModel
import com.peonlee.core.ui.extensions.hideKeyboard
import com.peonlee.core.ui.extensions.trim
import com.peonlee.core.ui.viewmodel.ProductViewModel
import com.peonlee.data.product.ProductRepository
import com.peonlee.explore.databinding.ActivityExploreActivityBinding
import com.peonlee.product.ProductFragment
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class ExploreActivity : BaseActivity<ActivityExploreActivityBinding>() {
private val exploreViewModel: ProductSearchableViewModel by viewModels { ExploreViewModel.ExploreViewModelFactory() }
@Inject
lateinit var productRepository: ProductRepository
private val productViewModel: ProductViewModel by viewModels { ProductViewModel.ProductViewModelFactory(productRepository) }

override fun bindingFactory(): ActivityExploreActivityBinding = ActivityExploreActivityBinding.inflate(layoutInflater)

override fun initViews() {
println(exploreViewModel)
productViewModel
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이렇게 ViewModel 하나만 있어도 괜찮나요~?.?

attachProductFragment()
}

Expand All @@ -47,7 +52,7 @@ class ExploreActivity : BaseActivity<ActivityExploreActivityBinding>() {
private fun searchResult() {
binding.apply {
layoutSearchProduct.isVisible = true
(exploreViewModel as? ExploreViewModel)?.setKeyword(etExploreBar.trim())
productViewModel.setKeyword(etExploreBar.trim())
etExploreBar.clearFocus()
etExploreBar.hideKeyboard()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,15 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.tabs.TabLayout
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.decoration.ContentPaddingDecoration
import com.peonlee.core.ui.base.BaseBottomSheetFragment
import com.peonlee.core.ui.base.BaseFragment
import com.peonlee.core.ui.base.ProductSearchableViewModel
import com.peonlee.core.ui.viewmodel.ProductViewModel
import com.peonlee.model.product.ProductSearchConditionUiModel
import com.peonlee.model.type.SortType
import com.peonlee.model.type.toRangeString
Expand All @@ -34,16 +31,14 @@ import com.peonlee.product.ui.PriceFilterBottomSheetFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import javax.inject.Inject

@AndroidEntryPoint
class ProductFragment : BaseFragment<FragmentProductBinding>() {
@Inject
lateinit var navigator: Navigator

private val exploreViewModel: ProductSearchableViewModel by activityViewModels()
private val productViewModel: ProductViewModel by viewModels()
private val productViewModel: ProductViewModel by activityViewModels()

private var currentBottomSheet: BaseBottomSheetFragment? = null
private val priceFilter by lazy {
Expand All @@ -69,7 +64,7 @@ class ProductFragment : BaseFragment<FragmentProductBinding>() {
}

override fun initViews() = with(binding) {
observeKeyword()
// observeKeyword()

SortType.values().forEach {
tabProductSort.addTab(
Expand Down Expand Up @@ -177,16 +172,15 @@ class ProductFragment : BaseFragment<FragmentProductBinding>() {
?.show(childFragmentManager, "Filter")
}

private fun observeKeyword() {
println(exploreViewModel)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
exploreViewModel.productSearchCondition.collect {
productViewModel.setProductSearchCondition(it)
}
}
}
}
// private fun observeKeyword() {
// viewLifecycleOwner.lifecycleScope.launch {
// viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
// exploreViewModel.productSearchCondition.collect {
// productViewModel.setProductSearchCondition(it)
// }
// }
// }
// }
Comment on lines +175 to +183
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주석은 지워도 될 듯!


companion object {
fun getInstance(): ProductFragment = ProductFragment()
Expand Down
17 changes: 12 additions & 5 deletions feature/home/src/main/java/com/peonlee/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.base.BaseFragment
import com.peonlee.core.ui.base.ProductSearchableViewModel
import com.peonlee.core.ui.base.PageActivity
import com.peonlee.core.ui.viewmodel.ProductViewModel
import com.peonlee.home.adapter.HomeAdapter
import com.peonlee.home.databinding.FragmentHomeBinding
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -20,15 +21,20 @@ import javax.inject.Inject
class HomeFragment : BaseFragment<FragmentHomeBinding>() {
@Inject
lateinit var navigator: Navigator

private val productSearchableViewModel: ProductViewModel by activityViewModels()
private val homeViewModel: HomeViewModel by viewModels()
private val productSearchableViewModel: ProductSearchableViewModel by activityViewModels()

private val homeAdapter by lazy {
HomeAdapter(
navigator = navigator,
moveToConditionExplore = productSearchableViewModel::changeSortType,
moveToStoreExplore = productSearchableViewModel::changeStoreType
moveToConditionExplore = {
(requireActivity() as? PageActivity)?.moveToEvaluatePage()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as?로 체크할거면 activity 쓰는게 안전할 것 같아요~

productSearchableViewModel.setProductSortType(it, true)
},
moveToStoreExplore = {
(requireActivity() as? PageActivity)?.moveToEvaluatePage()
productSearchableViewModel.setStoreType(it, true)
}
)
}

Expand All @@ -38,6 +44,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {

override fun initViews() {
binding.rvHome.adapter = homeAdapter
// productSearchableViewModel
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요기도 주석 지워주세요~

binding.btnSearch.setOnClickListener {
navigator.navigateToSearch(requireContext())
}
Expand Down
2 changes: 2 additions & 0 deletions feature/main/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ dependencies {
implementation(project(":feature:evaluate"))
implementation(project(":core:model"))

implementation(project(":core:data"))

implementation(libs.google.material)
implementation(libs.bundles.fragment)
}
17 changes: 14 additions & 3 deletions feature/main/src/main/java/com/peonlee/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,24 @@ import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.peonlee.core.ui.base.BaseActivity
import com.peonlee.core.ui.base.ProductSearchableViewModel
import com.peonlee.core.ui.base.PageActivity
import com.peonlee.core.ui.viewmodel.ProductViewModel
import com.peonlee.data.product.ProductRepository
import com.peonlee.main.databinding.ActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>() {
private val mainViewModel: ProductSearchableViewModel by viewModels { MainViewModel.MainViewModelFactory() }
class MainActivity : BaseActivity<ActivityMainBinding>(), PageActivity {
@Inject
lateinit var productRepository: ProductRepository
private val productViewModel: ProductViewModel by viewModels { ProductViewModel.ProductViewModelFactory(productRepository) }
private val mainViewModel: MainViewModel by viewModels { MainViewModel.MainViewModelFactory() }
Comment on lines +22 to +23
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

궁금한게 있읍니다 ㅎㅎ by viewModels()로 하면 해당부분 ViewModelFactory 필요한 부분 일까요?.?


override fun initViews() {
productViewModel
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거는 어떤 코드일까요?

binding.bottomNav.setOnItemSelectedListener {
(mainViewModel as? MainViewModel)?.changeSelectedNav(it.itemId)
true
Expand Down Expand Up @@ -52,6 +59,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
super.onBackPressed()
}

override fun moveToEvaluatePage() {
mainViewModel.changeSelectedNav(R.id.navExplore)
}

companion object {
fun startActivity(context: Context) {
context.startActivity(
Expand Down
36 changes: 16 additions & 20 deletions feature/main/src/main/java/com/peonlee/main/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@ package com.peonlee.main

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.peonlee.core.ui.base.ProductSearchableViewModel
import com.peonlee.model.product.ProductSearchConditionUiModel
import com.peonlee.model.type.SortType
import com.peonlee.model.type.StoreType
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import javax.inject.Inject

@HiltViewModel
class MainViewModel @Inject constructor() : ProductSearchableViewModel() {
class MainViewModel @Inject constructor() : ViewModel() {
private val _selectedNav = MutableStateFlow<Int>(R.id.navHome)
val selectedNav: StateFlow<Int> = _selectedNav.asStateFlow()

Expand All @@ -24,21 +20,21 @@ class MainViewModel @Inject constructor() : ProductSearchableViewModel() {
_selectedNav.value = navId
}

/**
* 정렬 키워드 변경
*/
override fun changeSortType(sortType: SortType) {
_productSearchCondition.value = ProductSearchConditionUiModel(sortedBy = sortType)
_selectedNav.value = R.id.navExplore
}

/**
* 편의점의 행사 상품 변경
*/
override fun changeStoreType(storeType: StoreType) {
_productSearchCondition.value = ProductSearchConditionUiModel(stores = listOf(storeType))
_selectedNav.value = R.id.navExplore
}
// /**
// * 정렬 키워드 변경
// */
// override fun changeSortType(sortType: SortType) {
// _productSearchCondition.value = ProductSearchConditionUiModel(sortedBy = sortType)
// _selectedNav.value = R.id.navExplore
// }
//
// /**
// * 편의점의 행사 상품 변경
// */
// override fun changeStoreType(storeType: StoreType) {
// _productSearchCondition.value = ProductSearchConditionUiModel(stores = listOf(storeType))
// _selectedNav.value = R.id.navExplore
// }

class MainViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
Expand Down
Loading