11package com.daedan.festabook.presentation.placeMap.placeDetailPreview
22
33import android.os.Bundle
4+ import android.view.LayoutInflater
45import android.view.View
6+ import android.view.ViewGroup
57import androidx.activity.OnBackPressedCallback
8+ import androidx.compose.foundation.layout.Box
9+ import androidx.compose.foundation.layout.fillMaxSize
10+ import androidx.compose.foundation.layout.padding
11+ import androidx.compose.runtime.LaunchedEffect
12+ import androidx.compose.runtime.getValue
13+ import androidx.compose.ui.Alignment
14+ import androidx.compose.ui.Modifier
15+ import androidx.compose.ui.platform.ComposeView
16+ import androidx.compose.ui.platform.ViewCompositionStrategy
617import androidx.fragment.app.Fragment
718import androidx.fragment.app.viewModels
819import androidx.lifecycle.ViewModelProvider
9- import coil3.load
20+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
1021import com.daedan.festabook.R
1122import com.daedan.festabook.databinding.FragmentPlaceDetailPreviewSecondaryBinding
23+ import com.daedan.festabook.di.appGraph
1224import com.daedan.festabook.di.fragment.FragmentKey
13- import com.daedan.festabook.logging.logger
1425import com.daedan.festabook.presentation.common.BaseFragment
1526import com.daedan.festabook.presentation.common.OnMenuItemReClickListener
16- import com.daedan.festabook.presentation.common.showBottomAnimation
1727import com.daedan.festabook.presentation.common.showErrorSnackBar
18- import com.daedan.festabook.presentation.placeDetail.model.PlaceDetailUiModel
1928import com.daedan.festabook.presentation.placeMap.PlaceMapViewModel
2029import com.daedan.festabook.presentation.placeMap.logging.PlacePreviewClick
2130import com.daedan.festabook.presentation.placeMap.model.SelectedPlaceUiState
22- import com.daedan.festabook.presentation.placeMap.model.getIconId
23- import com.daedan.festabook.presentation.placeMap.model.getTextId
31+ import com.daedan.festabook.presentation.placeMap.placeDetailPreview.component.PlaceDetailPreviewSecondaryScreen
32+ import com.daedan.festabook.presentation.theme.FestabookTheme
33+ import com.daedan.festabook.presentation.theme.festabookSpacing
2434import dev.zacsweers.metro.AppScope
2535import dev.zacsweers.metro.ContributesIntoMap
2636import dev.zacsweers.metro.Inject
@@ -43,56 +53,62 @@ class PlaceDetailPreviewSecondaryFragment(
4353 }
4454 }
4555
46- override fun onViewCreated (
47- view : View ,
56+ override fun onCreateView (
57+ inflater : LayoutInflater ,
58+ container : ViewGroup ? ,
4859 savedInstanceState : Bundle ? ,
49- ) {
50- super .onViewCreated(view, savedInstanceState)
51- setUpObserver()
52- setUpBackPressedCallback()
53- }
54-
55- override fun onMenuItemReClick () {
56- viewModel.unselectPlace()
57- }
60+ ): View {
61+ return ComposeView (requireContext()).apply {
62+ setViewCompositionStrategy(ViewCompositionStrategy .DisposeOnViewTreeLifecycleDestroyed )
63+ setContent {
64+ val placeDetailUiState by viewModel.selectedPlaceFlow.collectAsStateWithLifecycle()
65+ val visible = placeDetailUiState is SelectedPlaceUiState .Success
5866
59- private fun setUpBackPressedCallback () {
60- requireActivity().onBackPressedDispatcher.addCallback(
61- viewLifecycleOwner,
62- backPressedCallback,
63- )
64- }
65-
66- private fun setUpObserver () {
67- viewModel.selectedPlace.observe(viewLifecycleOwner) { selectedPlace ->
68- backPressedCallback.isEnabled = true
69- when (selectedPlace) {
70- is SelectedPlaceUiState .Success -> {
71- binding.layoutSelectedPlace.visibility = View .VISIBLE
72- binding.layoutSelectedPlace.showBottomAnimation()
73- updateSelectedPlaceUi(selectedPlace.value)
74- binding.logger.log(
75- PlacePreviewClick (
76- baseLogData = binding.logger.getBaseLogData(),
77- placeName = selectedPlace.value.place.title ? : " undefined" ,
78- timeTag = viewModel.selectedTimeTag.value?.name ? : " undefined" ,
79- category = selectedPlace.value.place.category.name,
80- ),
81- )
67+ LaunchedEffect (placeDetailUiState) {
68+ backPressedCallback.isEnabled = true
8269 }
8370
84- is SelectedPlaceUiState .Error -> showErrorSnackBar(selectedPlace.throwable)
85- is SelectedPlaceUiState .Loading -> Unit
86- is SelectedPlaceUiState .Empty -> backPressedCallback.isEnabled = false
71+ FestabookTheme {
72+ Box (
73+ modifier = Modifier .fillMaxSize(),
74+ contentAlignment = Alignment .BottomCenter ,
75+ ) {
76+ PlaceDetailPreviewSecondaryScreen (
77+ visible = visible,
78+ placeUiState = placeDetailUiState,
79+ modifier =
80+ Modifier
81+ .padding(
82+ vertical = festabookSpacing.paddingBody4,
83+ horizontal = festabookSpacing.paddingScreenGutter,
84+ ),
85+ onError = {
86+ showErrorSnackBar(it.throwable)
87+ },
88+ onEmpty = {
89+ backPressedCallback.isEnabled = false
90+ },
91+ onClick = {
92+ if (it !is SelectedPlaceUiState .Success ) return @PlaceDetailPreviewSecondaryScreen
93+ appGraph.defaultFirebaseLogger.log(
94+ PlacePreviewClick (
95+ baseLogData = appGraph.defaultFirebaseLogger.getBaseLogData(),
96+ placeName = it.value.place.title ? : " undefined" ,
97+ timeTag =
98+ viewModel.selectedTimeTag.value?.name
99+ ? : " undefined" ,
100+ category = it.value.place.category.name,
101+ ),
102+ )
103+ },
104+ )
105+ }
106+ }
87107 }
88108 }
89109 }
90110
91- private fun updateSelectedPlaceUi (selectedPlace : PlaceDetailUiModel ) {
92- with (binding) {
93- ivSecondaryCategoryItem.load(selectedPlace.place.category.getIconId())
94- tvSelectedPlaceTitle.text =
95- selectedPlace.place.title ? : getString(selectedPlace.place.category.getTextId())
96- }
111+ override fun onMenuItemReClick () {
112+ viewModel.unselectPlace()
97113 }
98114}
0 commit comments