Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,23 @@ package com.daedan.festabook.presentation.placeMap
import android.content.Context
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.unit.dp
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.daedan.festabook.R
import com.daedan.festabook.databinding.FragmentPlaceMapBinding
import com.daedan.festabook.di.fragment.FragmentKey
import com.daedan.festabook.di.mapManager.MapManagerGraph
import com.daedan.festabook.domain.model.TimeTag
import com.daedan.festabook.logging.logger
import com.daedan.festabook.presentation.common.BaseFragment
import com.daedan.festabook.presentation.common.OnMenuItemReClickListener
Expand All @@ -31,7 +36,9 @@ import com.daedan.festabook.presentation.placeMap.placeCategory.PlaceCategoryFra
import com.daedan.festabook.presentation.placeMap.placeDetailPreview.PlaceDetailPreviewFragment
import com.daedan.festabook.presentation.placeMap.placeDetailPreview.PlaceDetailPreviewSecondaryFragment
import com.daedan.festabook.presentation.placeMap.placeList.PlaceListFragment
import com.daedan.festabook.presentation.placeMap.timeTagSpinner.adapter.TimeTagSpinnerAdapter
import com.daedan.festabook.presentation.placeMap.timeTagSpinner.component.TimeTagMenu
import com.daedan.festabook.presentation.theme.FestabookColor
import com.daedan.festabook.presentation.theme.FestabookTheme
import com.naver.maps.map.MapFragment
import com.naver.maps.map.NaverMap
import com.naver.maps.map.OnMapReadyCallback
Expand All @@ -57,8 +64,7 @@ class PlaceMapFragment(
placeDetailPreviewSecondaryFragment: PlaceDetailPreviewSecondaryFragment,
mapFragment: MapFragment,
) : BaseFragment<FragmentPlaceMapBinding>(),
OnMenuItemReClickListener,
OnTimeTagSelectedListener {
OnMenuItemReClickListener {
override val layoutId: Int = R.layout.fragment_place_map

@Inject
Expand Down Expand Up @@ -88,23 +94,6 @@ class PlaceMapFragment(
savedInstanceState: Bundle?,
) {
super.onViewCreated(view, savedInstanceState)
binding.spinnerSelectTimeTag.onItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>,
view: View?,
position: Int,
id: Long,
) {
val item = parent.getItemAtPosition(position) as TimeTag

onTimeTagSelected(item)
}

override fun onNothingSelected(parent: AdapterView<*>) {
onNothingSelected()
}
}
if (savedInstanceState == null) {
childFragmentManager.commit {
addWithSimpleTag(R.id.fcv_map_container, mapFragment)
Expand All @@ -118,6 +107,7 @@ class PlaceMapFragment(
}
lifecycleScope.launch {
setUpMapManager()
setupComposeView()
setUpObserver()
}
binding.logger.log(
Expand All @@ -140,19 +130,6 @@ class PlaceMapFragment(
mapManager?.moveToPosition()
}

override fun onTimeTagSelected(item: TimeTag) {
viewModel.unselectPlace()
viewModel.onDaySelected(item)
binding.logger.log(
PlaceTimeTagSelected(
baseLogData = binding.logger.getBaseLogData(),
timeTagName = item.name,
),
)
}

override fun onNothingSelected() = Unit

private suspend fun setUpMapManager() {
naverMap = mapFragment.getMap()
naverMap.addOnLocationChangeListener {
Expand All @@ -169,22 +146,39 @@ class PlaceMapFragment(
}
}

private fun setUpObserver() {
viewModel.timeTags.observe(viewLifecycleOwner) { timeTags ->
// 타임태그가 없는 경우 메뉴 GONE
binding.layoutMapMenu.visibility =
if (timeTags.isNullOrEmpty()) View.GONE else View.VISIBLE

if (binding.spinnerSelectTimeTag.adapter == null) {
val adapter = TimeTagSpinnerAdapter(requireContext(), timeTags.toMutableList())
binding.spinnerSelectTimeTag.adapter = adapter
} else {
val adapter = binding.spinnerSelectTimeTag.adapter as TimeTagSpinnerAdapter
adapter.updateItems(timeTags)
adapter.notifyDataSetChanged()
private fun setupComposeView() {
binding.cvPlaceMap.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
FestabookTheme {
val timeTags by viewModel.timeTags.collectAsStateWithLifecycle()
val title by viewModel.selectedTimeTagFlow.collectAsStateWithLifecycle()
if (timeTags.isNotEmpty()) {
TimeTagMenu(
title = title.name,
timeTags = timeTags,
onTimeTagClick = { timeTag ->
viewModel.onDaySelected(timeTag)
binding.logger.log(
PlaceTimeTagSelected(
baseLogData = binding.logger.getBaseLogData(),
timeTagName = timeTag.name,
),
)
},
modifier =
Modifier
.background(
FestabookColor.white,
).padding(horizontal = 24.dp),
)
}
}
}
}
}

private fun setUpObserver() {
viewModel.placeGeographies.observe(viewLifecycleOwner) { placeGeographies ->
when (placeGeographies) {
is PlaceListUiState.Loading -> Unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.daedan.festabook.presentation.placeMap
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asFlow
import androidx.lifecycle.viewModelScope
import com.daedan.festabook.di.viewmodel.ViewModelKey
import com.daedan.festabook.domain.model.TimeTag
Expand All @@ -21,6 +22,11 @@ import com.daedan.festabook.presentation.placeMap.model.toUiModel
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesIntoMap
import dev.zacsweers.metro.Inject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch

@ContributesIntoMap(AppScope::class)
Expand All @@ -38,12 +44,19 @@ class PlaceMapViewModel @Inject constructor(
val placeGeographies: LiveData<PlaceListUiState<List<PlaceCoordinateUiModel>>>
get() = _placeGeographies

private val _timeTags = MutableLiveData<List<TimeTag>>()
val timeTags: LiveData<List<TimeTag>> = _timeTags
private val _timeTags = MutableStateFlow<List<TimeTag>>(emptyList())
val timeTags: StateFlow<List<TimeTag>> = _timeTags.asStateFlow()
Copy link
Contributor

Choose a reason for hiding this comment

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

👍


private val _selectedTimeTag = MutableLiveData<TimeTag>()
val selectedTimeTag: LiveData<TimeTag> = _selectedTimeTag

// 임시 StateFlow
val selectedTimeTagFlow: StateFlow<TimeTag> =
_selectedTimeTag.asFlow().stateIn(
scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = TimeTag.EMPTY,
)
private val _selectedPlace: MutableLiveData<SelectedPlaceUiState> = MutableLiveData()
val selectedPlace: LiveData<SelectedPlaceUiState> = _selectedPlace

Expand Down Expand Up @@ -77,16 +90,17 @@ class PlaceMapViewModel @Inject constructor(
_timeTags.value = emptyList()
}

// 기본 선택값
if (!timeTags.value.isNullOrEmpty()) {
_selectedTimeTag.value = _timeTags.value?.first()
// 기본 선택값
if (!timeTags.value.isEmpty()) {
_selectedTimeTag.value = _timeTags.value.first()
} else {
_selectedTimeTag.value = TimeTag.Companion.EMPTY
_selectedTimeTag.value = TimeTag.EMPTY
}
}
}

fun onDaySelected(item: TimeTag) {
unselectPlace()
_selectedTimeTag.value = item
}

Expand Down

This file was deleted.

Loading
Loading