diff --git a/data/src/main/java/com/d83t/bpm/data/repositoryImpl/SearchStudioRepositoryImpl.kt b/data/src/main/java/com/d83t/bpm/data/repositoryImpl/SearchStudioRepositoryImpl.kt index 28c00d6..21836d6 100644 --- a/data/src/main/java/com/d83t/bpm/data/repositoryImpl/SearchStudioRepositoryImpl.kt +++ b/data/src/main/java/com/d83t/bpm/data/repositoryImpl/SearchStudioRepositoryImpl.kt @@ -1,5 +1,6 @@ package com.d83t.bpm.data.repositoryImpl +import com.d83t.bpm.data.model.response.StudioListResponse.Companion.toDataModel import com.d83t.bpm.data.model.response.StudioResponse.Companion.toDataModel import com.d83t.bpm.data.network.BPMResponse import com.d83t.bpm.data.network.BPMResponseHandler @@ -7,6 +8,7 @@ import com.d83t.bpm.data.network.ErrorResponse.Companion.toDataModel import com.d83t.bpm.data.network.MainApi import com.d83t.bpm.domain.model.ResponseState import com.d83t.bpm.domain.model.Studio +import com.d83t.bpm.domain.model.StudioList import com.d83t.bpm.domain.repository.SearchStudioRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect @@ -19,13 +21,13 @@ class SearchStudioRepositoryImpl @Inject constructor( ) : SearchStudioRepository { override suspend fun fetchSearchStudioResult( query: String - ): Flow>> { + ): Flow> { return flow { BPMResponseHandler().handle { mainApi.searchStudio(query = query) }.onEach { result -> when (result) { - is BPMResponse.Success -> emit(ResponseState.Success(result.data.studios.map { it.toDataModel() })) + is BPMResponse.Success -> emit(ResponseState.Success(result.data.toDataModel())) is BPMResponse.Error -> emit(ResponseState.Error(result.error.toDataModel())) } }.collect() diff --git a/domain/src/main/java/com/d83t/bpm/domain/repository/SearchStudioRepository.kt b/domain/src/main/java/com/d83t/bpm/domain/repository/SearchStudioRepository.kt index ee8f9a5..23d43ee 100644 --- a/domain/src/main/java/com/d83t/bpm/domain/repository/SearchStudioRepository.kt +++ b/domain/src/main/java/com/d83t/bpm/domain/repository/SearchStudioRepository.kt @@ -2,10 +2,11 @@ package com.d83t.bpm.domain.repository import com.d83t.bpm.domain.model.ResponseState import com.d83t.bpm.domain.model.Studio +import com.d83t.bpm.domain.model.StudioList import kotlinx.coroutines.flow.Flow interface SearchStudioRepository { suspend fun fetchSearchStudioResult( query: String - ) : Flow>> + ) : Flow> } \ No newline at end of file diff --git a/domain/src/main/java/com/d83t/bpm/domain/usecase/search_studio/SearchStudioUseCase.kt b/domain/src/main/java/com/d83t/bpm/domain/usecase/search_studio/SearchStudioUseCase.kt index 87df3f0..c104e89 100644 --- a/domain/src/main/java/com/d83t/bpm/domain/usecase/search_studio/SearchStudioUseCase.kt +++ b/domain/src/main/java/com/d83t/bpm/domain/usecase/search_studio/SearchStudioUseCase.kt @@ -2,6 +2,7 @@ package com.d83t.bpm.domain.usecase.search_studio import com.d83t.bpm.domain.model.ResponseState import com.d83t.bpm.domain.model.Studio +import com.d83t.bpm.domain.model.StudioList import com.d83t.bpm.domain.repository.SearchStudioRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject @@ -11,7 +12,7 @@ class SearchStudioUseCase @Inject constructor( ) { suspend operator fun invoke( query: String - ): Flow>> { + ): Flow> { return searchStudioRepository.fetchSearchStudioResult(query = query) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/MainActivity.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/MainActivity.kt index 5cc5d9d..6dda59d 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/MainActivity.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/MainActivity.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.commitNow import com.d83t.bpm.presentation.R import com.d83t.bpm.presentation.base.BaseActivity import com.d83t.bpm.presentation.databinding.ActivityMainBinding +import com.d83t.bpm.presentation.ui.main.add.MainAddBottomSheet import com.d83t.bpm.presentation.ui.main.community.CommunityFragment import com.d83t.bpm.presentation.ui.main.home.HomeFragment import com.d83t.bpm.presentation.ui.main.mypage.MyPageFragment @@ -55,7 +56,7 @@ class MainActivity : BaseActivity(ActivityMainBinding::infl viewModel.event.collect { event -> when (event) { MainViewEvent.Add -> { - showToast("Add Clicked") + showAddBottomSheet() } } } @@ -76,6 +77,10 @@ class MainActivity : BaseActivity(ActivityMainBinding::infl } } + private fun showAddBottomSheet(){ + MainAddBottomSheet().show(supportFragmentManager, MainAddBottomSheet::class.simpleName) + } + private fun changeFragment(fragmentId: Int? = null) { val fragment = when (fragmentId) { R.id.nav_noti -> { diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddBottomSheet.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddBottomSheet.kt new file mode 100644 index 0000000..0aebb96 --- /dev/null +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddBottomSheet.kt @@ -0,0 +1,44 @@ +package com.d83t.bpm.presentation.ui.main.add + +import androidx.fragment.app.viewModels +import com.d83t.bpm.presentation.R +import com.d83t.bpm.presentation.base.BaseBottomSheetFragment +import com.d83t.bpm.presentation.databinding.BottomsheetMainAddBinding +import com.d83t.bpm.presentation.util.repeatCallDefaultOnStarted +import com.d83t.bpm.presentation.util.showToast +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainAddBottomSheet : + BaseBottomSheetFragment(BottomsheetMainAddBinding::inflate) { + + override fun getTheme(): Int = R.style.DdoreumBottomSheetDialog + + override val viewModel: MainAddViewModel by viewModels() + + override fun initLayout() { + bind { + vm = viewModel + lifecycleOwner = viewLifecycleOwner + } + } + + override fun setupCollect() { + repeatCallDefaultOnStarted { + viewModel.event.collect { event -> + when (event) { + MainAddViewEvent.Click -> { + requireContext().showToast("오픈 예정입니다!") + } + } + } + } + } + + companion object { + + fun newInstance(): MainAddBottomSheet { + return MainAddBottomSheet() + } + } +} \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewEvent.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewEvent.kt new file mode 100644 index 0000000..67c46f7 --- /dev/null +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewEvent.kt @@ -0,0 +1,5 @@ +package com.d83t.bpm.presentation.ui.main.add + +sealed interface MainAddViewEvent { + object Click : MainAddViewEvent +} \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewModel.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewModel.kt new file mode 100644 index 0000000..5d8a5b4 --- /dev/null +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/add/MainAddViewModel.kt @@ -0,0 +1,24 @@ +package com.d83t.bpm.presentation.ui.main.add + +import androidx.lifecycle.viewModelScope +import com.d83t.bpm.presentation.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch + +@HiltViewModel +class MainAddViewModel @Inject constructor() : BaseViewModel() { + + private val _event = MutableSharedFlow() + val event: SharedFlow + get() = _event + + fun clickDisable() { + viewModelScope.launch { + _event.emit(MainAddViewEvent.Click) + } + } + +} \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendImageItemDecoration.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendImageItemDecoration.kt index 008962a..5087d32 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendImageItemDecoration.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendImageItemDecoration.kt @@ -14,9 +14,6 @@ class HomeRecommendImageItemDecoration : ItemDecoration() { state: RecyclerView.State ) { super.getItemOffsets(outRect, view, parent, state) - - outRect.bottom = 4.dp - outRect.top = 4.dp outRect.left = 4.dp outRect.right = 4.dp } diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendViewHolder.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendViewHolder.kt index 7be978b..78ffc77 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendViewHolder.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/home/recommend/list/HomeRecommendViewHolder.kt @@ -15,13 +15,11 @@ class HomeRecommendViewHolder( this.item = item list.adapter = HomeRecommendImageAdapter() - list.addItemDecoration(HomeRecommendImageItemDecoration()) root.setOnClickListener { listener.invoke(item.id) } } - } companion object { diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageFragment.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageFragment.kt index 20e18ef..bb25f68 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageFragment.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageFragment.kt @@ -2,8 +2,9 @@ package com.d83t.bpm.presentation.ui.main.mypage import androidx.fragment.app.viewModels import com.d83t.bpm.presentation.base.BaseFragment -import com.d83t.bpm.presentation.databinding.FragmentHomeBinding import com.d83t.bpm.presentation.databinding.FragmentMypageBinding +import com.d83t.bpm.presentation.util.repeatCallDefaultOnStarted +import com.d83t.bpm.presentation.util.showToast import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -11,7 +12,24 @@ class MyPageFragment : BaseFragment(FragmentMypageBinding override val viewModel: MyPageViewModel by viewModels() - override fun initLayout() = Unit + override fun initLayout() { + bind { + vm = viewModel + lifecycleOwner = viewLifecycleOwner + } + } + + override fun setupCollect() { + repeatCallDefaultOnStarted { + viewModel.event.collect { event -> + when (event) { + MyPageViewEvent.Click -> { + requireContext().showToast("오픈 예정입니다!") + } + } + } + } + } companion object { diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewEvent.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewEvent.kt new file mode 100644 index 0000000..561302b --- /dev/null +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewEvent.kt @@ -0,0 +1,5 @@ +package com.d83t.bpm.presentation.ui.main.mypage + +sealed interface MyPageViewEvent { + object Click : MyPageViewEvent +} \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewModel.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewModel.kt index 70cf840..b222463 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewModel.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/main/mypage/MyPageViewModel.kt @@ -1,10 +1,23 @@ package com.d83t.bpm.presentation.ui.main.mypage +import androidx.lifecycle.viewModelScope import com.d83t.bpm.presentation.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch @HiltViewModel class MyPageViewModel @Inject constructor() : BaseViewModel() { + private val _event = MutableSharedFlow() + val event: SharedFlow + get() = _event + + fun clickDisable() { + viewModelScope.launch { + _event.emit(MyPageViewEvent.Click) + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/ui/schedule/select_studio/SelectStudioViewModel.kt b/presentation/src/main/java/com/d83t/bpm/presentation/ui/schedule/select_studio/SelectStudioViewModel.kt index 7755695..4f2cb20 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/ui/schedule/select_studio/SelectStudioViewModel.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/ui/schedule/select_studio/SelectStudioViewModel.kt @@ -51,7 +51,7 @@ class SelectStudioViewModel @Inject constructor( query = query ).onEach { state -> when(state) { - is ResponseState.Success -> _state.emit(SelectStudioState.Success(state.data)) + is ResponseState.Success -> _state.emit(SelectStudioState.Success(state.data.studios ?: emptyList())) is ResponseState.Error -> _state.emit(SelectStudioState.Error) } }.launchIn(viewModelScope) diff --git a/presentation/src/main/java/com/d83t/bpm/presentation/util/BindingAdapters.kt b/presentation/src/main/java/com/d83t/bpm/presentation/util/BindingAdapters.kt index b02eb9f..ff7c184 100644 --- a/presentation/src/main/java/com/d83t/bpm/presentation/util/BindingAdapters.kt +++ b/presentation/src/main/java/com/d83t/bpm/presentation/util/BindingAdapters.kt @@ -33,7 +33,6 @@ fun View.bindVisibleOrGone(text: String?) { } } - @BindingAdapter("bind:list_item") fun RecyclerView.bindListItems(list: List?) { if (adapter != null) { @@ -44,6 +43,7 @@ fun RecyclerView.bindListItems(list: List?) { @BindingAdapter("bind:review_chips") fun ChipGroup.bindChips(reviewList: List?) { if (reviewList.isNullOrEmpty()) return else { + isClickable = false reviewList.forEach { addView( Chip(context).apply { diff --git a/presentation/src/main/res/drawable/bg_bottomsheet.xml b/presentation/src/main/res/drawable/bg_bottomsheet.xml new file mode 100644 index 0000000..cf7df4b --- /dev/null +++ b/presentation/src/main/res/drawable/bg_bottomsheet.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/bottomsheet_main_add.xml b/presentation/src/main/res/layout/bottomsheet_main_add.xml new file mode 100644 index 0000000..6630811 --- /dev/null +++ b/presentation/src/main/res/layout/bottomsheet_main_add.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_home.xml b/presentation/src/main/res/layout/fragment_home.xml index b8782bd..02763e9 100644 --- a/presentation/src/main/res/layout/fragment_home.xml +++ b/presentation/src/main/res/layout/fragment_home.xml @@ -260,6 +260,7 @@ style="@style/Widget.Design.TabLayout" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="16dp" android:layout_marginEnd="100dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -283,8 +284,8 @@ + android:paddingTop="18dp"> + + 리뷰 맛집 이번 달 오픈 + 오늘의 눈바디 남기기 + 내 바디프로필 공유하기 + 운동in에 질문하기 + 게시물 스크랩 오픈 예정 diff --git a/presentation/src/main/res/values/themes.xml b/presentation/src/main/res/values/themes.xml index 3939edb..f27aa35 100644 --- a/presentation/src/main/res/values/themes.xml +++ b/presentation/src/main/res/values/themes.xml @@ -24,6 +24,17 @@ 28dp + + + +