From 6ff95c0439682fd673c650e419b17b3f4c5ea35e Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Thu, 20 Nov 2025 01:29:52 +0900 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=EC=A0=9C=ED=9C=B4=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=ED=95=99=EA=B3=BC/=EC=A0=84=EC=B2=B4=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=EB=94=94=ED=8F=B4=ED=8A=B8=EA=B0=92=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=ED=86=A0=EA=B8=80=20UI=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatssu/android/presentation/map/MapFragmentView.kt | 2 +- .../map/component/PartnershipToggleItem.kt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 52dc9032a..81b2623a4 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -100,7 +100,7 @@ fun MapFragmentComposeView( val activity = remember(context) { context.findActivityOrNull() } ?: throw IllegalStateException("FusedLocationSource는 Activity에서만 사용할 수 있습니다.") val scope = rememberCoroutineScope() - var selectedFilter by remember { mutableStateOf(FilterType.All) } + var selectedFilter by remember { mutableStateOf(FilterType.Mine) } val departmentId = viewModel.departmentId val collegeId = viewModel.collegeId diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 6c67bf35a..3585a043d 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -44,16 +44,16 @@ fun PartnershipFilterToggle( .padding(6.dp), verticalAlignment = Alignment.CenterVertically, ) { + PartnershipToggleItem( + text = if (departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, + isSelected = selected == FilterType.Mine, + onClick = { onSelectedChange(FilterType.Mine) }, + ) PartnershipToggleItem( text = "전체", isSelected = selected == FilterType.All, onClick = { onSelectedChange(FilterType.All) } ) - PartnershipToggleItem( - text = if(departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, - isSelected = selected == FilterType.Mine, - onClick = { onSelectedChange(FilterType.Mine) }, - ) } } From f1d7e6f915a275144c0ab4009292ae83be0cadc1 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Thu, 20 Nov 2025 02:02:14 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat:=20PartnershipFilterToggle=EC=97=90?= =?UTF-8?q?=EC=84=9C=20toggleItem=20=EC=83=9D=EC=84=B1=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20UI=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 3 - .../android/presentation/map/MapViewModel.kt | 1 - .../map/component/PartnershipToggleItem.kt | 59 +++++++++++-------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 81b2623a4..90569985e 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -186,17 +186,14 @@ fun MapFragmentComposeView( } FilterType.Mine -> { viewModel.loadUserCollegePartnerships() - EventLogger.clickMapMine(collegeId, departmentId) } } } - // Screen View 기록 TrackScreenViewEvent(ScreenId.MAP_MAIN) - val lifecycleOwner = LocalLifecycleOwner.current // onResume 시마다 학과 정보 반영 diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index 6e2933166..c8e2ae6df 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -26,7 +26,6 @@ data class MapState( val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), - var partnershipToggleText: String = "내 제휴", val currentCollegeName: String = "", val currentDepartmentName: String = "", ) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 3585a043d..47cecfb2d 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -25,7 +24,14 @@ import com.eatssu.design_system.theme.White import timber.log.Timber enum class FilterType { - All, Mine + Mine, All; // 해당 부분에 쓰는 enum 순서대로 UI 토글 순서에 반영됩니다 + + fun label(departmentName: String): String { + return when (this) { + Mine -> if (departmentName.isBlank() || departmentName == "학과") "내 제휴" else departmentName + All -> "전체" + } + } } @Composable @@ -36,50 +42,51 @@ fun PartnershipFilterToggle( departmentName: String, ) { Timber.d("departmentName = $departmentName") + val items = FilterType.entries.map { + it to it.label(departmentName) + } Row( modifier = modifier - .border(1.dp, Gray300, shape = CircleShape) + .border(1.dp, Gray300, CircleShape) .clip(CircleShape) .background(White) - .padding(6.dp), - verticalAlignment = Alignment.CenterVertically, + .padding(4.dp), + verticalAlignment = Alignment.CenterVertically ) { - PartnershipToggleItem( - text = if (departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, - isSelected = selected == FilterType.Mine, - onClick = { onSelectedChange(FilterType.Mine) }, - ) - PartnershipToggleItem( - text = "전체", - isSelected = selected == FilterType.All, - onClick = { onSelectedChange(FilterType.All) } - ) + items.forEach { (type, label) -> + ToggleChip( + label = label, + selected = selected == type, + onClick = { onSelectedChange(type) } + ) + } } } @Composable -fun PartnershipToggleItem( - text: String, - isSelected: Boolean, - onClick: () -> Unit +fun ToggleChip( + label: String, + selected: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier, ) { - val backgroundColor = if (isSelected) Primary else Color.Transparent - val textColor = if (isSelected) Color.White else Gray600 + val backgroundColor = if (selected) Primary else Color.Transparent + val textColor = if (selected) White else Gray600 Box( - modifier = Modifier - .wrapContentWidth() + modifier = modifier .clip(CircleShape) .background(backgroundColor) .padding(horizontal = 20.dp, vertical = 6.dp) .clickable( interactionSource = remember { MutableInteractionSource() }, - indication = null - ) { onClick() }, + indication = null, + onClick = onClick + ), contentAlignment = Alignment.Center ) { Text( - text = text, + text = label, color = textColor, style = EatssuTheme.typography.body2 ) From a8b14fba5ef9079ea63cab7cdead3697743ec42d Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 09:12:30 +0900 Subject: [PATCH 03/23] =?UTF-8?q?delete:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9C=84=EC=B9=98=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatssu/android/presentation/map/MapFragmentView.kt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 90569985e..7c68385e6 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -171,12 +171,6 @@ fun MapFragmentComposeView( } } - var hasLocationPermission by remember { - mutableStateOf( - ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED - ) - } - // 제휴 정보 토글 event LaunchedEffect(selectedFilter) { when (selectedFilter) { @@ -281,10 +275,6 @@ fun MapFragmentComposeView( properties = MapProperties( locationTrackingMode = LocationTrackingMode.Follow, ), - onLocationChange = { location -> - // 위치가 업데이트되면 위치 권한 있다고 간주 - hasLocationPermission = true - }, ) { mapState.partnerships.forEach { partnership -> val markerState = rememberMarkerState(position = LatLng(partnership.latitude, partnership.longitude)) From b54287c38b10208aff260f026b4bf8c770c03ecb Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 10:24:19 +0900 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20compose=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EB=B2=84=EC=A0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18f572da3..f6c864775 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,6 @@ androidx-appcompat = "1.6.1" hiltAndroidCompiler = "2.42" lifecycleRuntimeCompose = "2.8.7" animation = "1.7.8" -composeBomVersion = "2025.03.00" composeThemeAdapter = "1.2.1" lifecycleRuntimeKtx = "2.5.2" lifecycleViewmodelCompose = "2.8.7" @@ -31,10 +30,10 @@ activity = "1.8.2" fragment = "1.6.2" uiTestJunit4 = "1.7.8" uiTooling = "1.7.8" -compose-material3 = "1.3.1" +compose-material3 = "1.4.0" workRuntimeKtx = "2.10.0" datastore = "1.0.0" -composeBom = "2024.04.01" +composeBom = "2025.11.01" lifecycle = "2.7.0" retrofit = "2.9.0" converter-gson = "2.9.0" From 30eaefc3ad10db0c09107446439c481c17fcc669 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 10:24:37 +0900 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20compose=20router-screen=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 79 +++++++++++++++---- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 7c68385e6..bc2cf8488 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalNaverMapApi::class) + package com.eatssu.android.presentation.map import android.Manifest @@ -17,6 +19,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberModalBottomSheetState @@ -61,6 +64,7 @@ import com.eatssu.design_system.theme.EatssuTheme import com.naver.maps.geometry.LatLng import com.naver.maps.map.CameraPosition import com.naver.maps.map.compose.Align +import com.naver.maps.map.compose.CameraPositionState import com.naver.maps.map.compose.ExperimentalNaverMapApi import com.naver.maps.map.compose.LocationTrackingMode import com.naver.maps.map.compose.MapProperties @@ -80,7 +84,6 @@ private const val DEFAULT_LONGITUDE = 126.95661313346206 private const val DEFAULT_ZOOM = 17.5 private const val PERMISSION_REQUEST_CODE = 1001 -@OptIn(ExperimentalNaverMapApi::class, ExperimentalMaterial3Api::class) @Composable fun MapFragmentComposeView( viewModel: MapViewModel = viewModel(), @@ -205,6 +208,50 @@ fun MapFragmentComposeView( } } + MapScreen( + mapState = mapState, + viewModel = viewModel, + cameraPositionState = cameraPositionState, + locationSource = locationSource, + sheetState = sheetState, + showToast = { message -> + scope.launch { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + }, + navigateToUserInfo = { + val intent = Intent(context, UserInfoActivity::class.java) + context.startActivity(intent) + }, + onShowSheet = { + scope.launch { sheetState.show() } + }, + onSelectedFilterChange = { + selectedFilter = it + }, + departmentId = departmentId, + collegeId = collegeId, + departmentName = departmentName, + selectedFilter = selectedFilter + ) +} + +@Composable +private fun MapScreen( + mapState: MapState, + viewModel: MapViewModel, + cameraPositionState: CameraPositionState, + locationSource: FusedLocationSource, + sheetState: SheetState, + showToast: (String) -> Unit, + navigateToUserInfo: () -> Unit, + onShowSheet: () -> Unit, + onSelectedFilterChange: (FilterType) -> Unit, + departmentId: Long, + collegeId: Long, + departmentName: String?, + selectedFilter: FilterType, +) { Scaffold( topBar = { CenterAlignedTopAppBar( @@ -230,8 +277,7 @@ fun MapFragmentComposeView( onDismiss = { viewModel.toggleDepartmentBottomSheet() }, onInputClick = { viewModel.toggleDepartmentBottomSheet() - val intent = Intent(context, UserInfoActivity::class.java) - context.startActivity(intent) + navigateToUserInfo() }, sheetState = sheetState ) @@ -252,7 +298,6 @@ fun MapFragmentComposeView( RestaurantType.CAFE -> PlaceType.CAFE RestaurantType.RESTAURANT -> PlaceType.RESTAURANT RestaurantType.PUB -> PlaceType.PUB - else -> PlaceType.RESTAURANT }, mapRestaurantList = mapState.restaurantInfoList, onDismiss = { viewModel.togglePartnershipBottomSheet() } @@ -269,7 +314,10 @@ fun MapFragmentComposeView( NaverMap( modifier = Modifier.fillMaxSize(), cameraPositionState = cameraPositionState, - uiSettings = MapUiSettings(isZoomControlEnabled = false, isLocationButtonEnabled = true), + uiSettings = MapUiSettings( + isZoomControlEnabled = false, + isLocationButtonEnabled = true + ), locationSource = locationSource, contentPadding = PaddingValues(bottom = dimensionResource(R.dimen.bottom_nav_height)), properties = MapProperties( @@ -277,7 +325,12 @@ fun MapFragmentComposeView( ), ) { mapState.partnerships.forEach { partnership -> - val markerState = rememberMarkerState(position = LatLng(partnership.latitude, partnership.longitude)) + val markerState = rememberMarkerState( + position = LatLng( + partnership.latitude, + partnership.longitude + ) + ) Marker( icon = OverlayImage.fromResource( @@ -296,8 +349,7 @@ fun MapFragmentComposeView( captionTextSize = 10.sp, onClick = { if (partnership.partnershipInfos.isEmpty()) { - // 제휴 정보가 없을 때는 토스트만 띄우고 바텀시트는 안 띄움 - Toast.makeText(context, "제휴 정보가 없습니다.", Toast.LENGTH_SHORT).show() + showToast("제휴 정보가 없습니다.") true } else { // 제휴 정보가 있을 때만 바텀시트 띄움 @@ -317,20 +369,17 @@ fun MapFragmentComposeView( onSelectedChange = { next -> if (mapState.showPartnershipBottomSheet) return@PartnershipFilterToggle - val hasDepartment = !departmentName.equals("학과") + val emptyDepartment = departmentName.isNullOrBlank() && departmentName == "학과" - if (next == FilterType.Mine && !hasDepartment) { + if (next == FilterType.Mine && emptyDepartment) { // 전환 막기: selectedFilter는 그대로 (All 유지) // 학과 입력 바텀시트 띄우기 - scope.launch { - // suspend 함수이므로 코루틴 내에서 실행 - sheetState.show() - } + onShowSheet() return@PartnershipFilterToggle } // 학과 정보가 있거나 All 선택은 정상 전환 - selectedFilter = next + onSelectedFilterChange(next) }, modifier = Modifier.padding(top = 12.dp), departmentName = departmentName.toString() From f57a713ae471da6ff3aba5930faba55db1da59b8 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Mon, 24 Nov 2025 23:26:10 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=ED=95=99=EA=B3=BC=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EC=9D=84=20=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0,=20default=20=ED=86=A0=EA=B8=80=EC=9D=B4=20"?= =?UTF-8?q?=EC=A0=84=EC=B2=B4"=EB=A1=9C=20=EC=88=98=EC=A0=95.=20=ED=95=99?= =?UTF-8?q?=EA=B3=BC=20=ED=86=A0=EA=B8=80=20=EC=84=A0=ED=83=9D=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/presentation/map/MapFragmentView.kt | 11 ++++++++++- .../android/presentation/map/MapViewModel.kt | 15 ++++++++++----- .../map/component/PartnershipToggleItem.kt | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index bc2cf8488..82f73f54b 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -174,6 +174,15 @@ fun MapFragmentComposeView( } } + // 초기 필터 설정 + LaunchedEffect(Unit) { + if (departmentId == -1L) { + selectedFilter = FilterType.All + } else { + selectedFilter = FilterType.Mine + } + } + // 제휴 정보 토글 event LaunchedEffect(selectedFilter) { when (selectedFilter) { @@ -369,7 +378,7 @@ private fun MapScreen( onSelectedChange = { next -> if (mapState.showPartnershipBottomSheet) return@PartnershipFilterToggle - val emptyDepartment = departmentName.isNullOrBlank() && departmentName == "학과" + val emptyDepartment = departmentId == -1L if (next == FilterType.Mine && emptyDepartment) { // 전환 막기: selectedFilter는 그대로 (All 유지) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index c8e2ae6df..dbb1506fb 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -26,8 +26,6 @@ data class MapState( val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), - val currentCollegeName: String = "", - val currentDepartmentName: String = "", ) @HiltViewModel @@ -119,9 +117,16 @@ class MapViewModel @Inject constructor( val current = uiState.value if (current is UiState.Success) { current.data.let { data -> - _uiState.value = UiState.Success( - data.copy(showDepartmentBottomSheet = !data.showDepartmentBottomSheet) - ) + if (departmentId == -1L) { + // 학과 정보가 없는 경우 학과 입력 바텀시트 무조건 보여주기 + _uiState.value = UiState.Success( + data.copy(showDepartmentBottomSheet = true) + ) + } else { + _uiState.value = UiState.Success( + data.copy(showDepartmentBottomSheet = !data.showDepartmentBottomSheet) + ) + } } } } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 47cecfb2d..e18067fc0 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -38,8 +38,8 @@ enum class FilterType { fun PartnershipFilterToggle( selected: FilterType, onSelectedChange: (FilterType) -> Unit, - modifier: Modifier = Modifier, departmentName: String, + modifier: Modifier = Modifier, ) { Timber.d("departmentName = $departmentName") val items = FilterType.entries.map { From 346e0ed24db5fa60a27a4266b6e4671fd2e36001 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Thu, 20 Nov 2025 01:29:52 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20=EC=A0=9C=ED=9C=B4=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=ED=95=99=EA=B3=BC/=EC=A0=84=EC=B2=B4=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=EB=94=94=ED=8F=B4=ED=8A=B8=EA=B0=92=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=ED=86=A0=EA=B8=80=20UI=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatssu/android/presentation/map/MapFragmentView.kt | 2 +- .../map/component/PartnershipToggleItem.kt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index c9bf86c38..c8a548b51 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -100,7 +100,7 @@ fun MapFragmentComposeView( val activity = remember(context) { context.findActivityOrNull() } ?: throw IllegalStateException("FusedLocationSource는 Activity에서만 사용할 수 있습니다.") val scope = rememberCoroutineScope() - var selectedFilter by remember { mutableStateOf(FilterType.All) } + var selectedFilter by remember { mutableStateOf(FilterType.Mine) } val departmentId = viewModel.departmentId val collegeId = viewModel.collegeId diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 6c67bf35a..3585a043d 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -44,16 +44,16 @@ fun PartnershipFilterToggle( .padding(6.dp), verticalAlignment = Alignment.CenterVertically, ) { + PartnershipToggleItem( + text = if (departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, + isSelected = selected == FilterType.Mine, + onClick = { onSelectedChange(FilterType.Mine) }, + ) PartnershipToggleItem( text = "전체", isSelected = selected == FilterType.All, onClick = { onSelectedChange(FilterType.All) } ) - PartnershipToggleItem( - text = if(departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, - isSelected = selected == FilterType.Mine, - onClick = { onSelectedChange(FilterType.Mine) }, - ) } } From 8c5adb9802ff05f0b34f30facbbebfeac752dfe9 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Thu, 20 Nov 2025 02:02:14 +0900 Subject: [PATCH 08/23] =?UTF-8?q?feat:=20PartnershipFilterToggle=EC=97=90?= =?UTF-8?q?=EC=84=9C=20toggleItem=20=EC=83=9D=EC=84=B1=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20UI=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 3 - .../android/presentation/map/MapViewModel.kt | 1 - .../map/component/PartnershipToggleItem.kt | 59 +++++++++++-------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index c8a548b51..49ea39b28 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -186,17 +186,14 @@ fun MapFragmentComposeView( } FilterType.Mine -> { viewModel.loadUserCollegePartnerships() - EventLogger.clickMapMine(collegeId, departmentId) } } } - // Screen View 기록 TrackScreenViewEvent(ScreenId.MAP_MAIN) - val lifecycleOwner = LocalLifecycleOwner.current // onResume 시마다 학과 정보 반영 diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index dfee98092..b6b616d4c 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -26,7 +26,6 @@ data class MapState( val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), - var partnershipToggleText: String = "내 제휴", val currentCollegeName: String = "", val currentDepartmentName: String = "", ) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 3585a043d..47cecfb2d 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -25,7 +24,14 @@ import com.eatssu.design_system.theme.White import timber.log.Timber enum class FilterType { - All, Mine + Mine, All; // 해당 부분에 쓰는 enum 순서대로 UI 토글 순서에 반영됩니다 + + fun label(departmentName: String): String { + return when (this) { + Mine -> if (departmentName.isBlank() || departmentName == "학과") "내 제휴" else departmentName + All -> "전체" + } + } } @Composable @@ -36,50 +42,51 @@ fun PartnershipFilterToggle( departmentName: String, ) { Timber.d("departmentName = $departmentName") + val items = FilterType.entries.map { + it to it.label(departmentName) + } Row( modifier = modifier - .border(1.dp, Gray300, shape = CircleShape) + .border(1.dp, Gray300, CircleShape) .clip(CircleShape) .background(White) - .padding(6.dp), - verticalAlignment = Alignment.CenterVertically, + .padding(4.dp), + verticalAlignment = Alignment.CenterVertically ) { - PartnershipToggleItem( - text = if (departmentName == "학과" || departmentName.isEmpty()) "내 제휴" else departmentName, - isSelected = selected == FilterType.Mine, - onClick = { onSelectedChange(FilterType.Mine) }, - ) - PartnershipToggleItem( - text = "전체", - isSelected = selected == FilterType.All, - onClick = { onSelectedChange(FilterType.All) } - ) + items.forEach { (type, label) -> + ToggleChip( + label = label, + selected = selected == type, + onClick = { onSelectedChange(type) } + ) + } } } @Composable -fun PartnershipToggleItem( - text: String, - isSelected: Boolean, - onClick: () -> Unit +fun ToggleChip( + label: String, + selected: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier, ) { - val backgroundColor = if (isSelected) Primary else Color.Transparent - val textColor = if (isSelected) Color.White else Gray600 + val backgroundColor = if (selected) Primary else Color.Transparent + val textColor = if (selected) White else Gray600 Box( - modifier = Modifier - .wrapContentWidth() + modifier = modifier .clip(CircleShape) .background(backgroundColor) .padding(horizontal = 20.dp, vertical = 6.dp) .clickable( interactionSource = remember { MutableInteractionSource() }, - indication = null - ) { onClick() }, + indication = null, + onClick = onClick + ), contentAlignment = Alignment.Center ) { Text( - text = text, + text = label, color = textColor, style = EatssuTheme.typography.body2 ) From 40d912c3a40e9c9a10d1cbb847cd91d404d44262 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 09:12:30 +0900 Subject: [PATCH 09/23] =?UTF-8?q?delete:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9C=84=EC=B9=98=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatssu/android/presentation/map/MapFragmentView.kt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 49ea39b28..9a46e1489 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -171,12 +171,6 @@ fun MapFragmentComposeView( } } - var hasLocationPermission by remember { - mutableStateOf( - ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED - ) - } - // 제휴 정보 토글 event LaunchedEffect(selectedFilter) { when (selectedFilter) { @@ -281,10 +275,6 @@ fun MapFragmentComposeView( properties = MapProperties( locationTrackingMode = LocationTrackingMode.Follow, ), - onLocationChange = { location -> - // 위치가 업데이트되면 위치 권한 있다고 간주 - hasLocationPermission = true - }, ) { mapState.partnerships.forEach { partnership -> val markerState = rememberMarkerState(position = LatLng(partnership.latitude, partnership.longitude)) From 23bfca2cd2612d985ef65e883d3e201b192b61ad Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 10:24:19 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20compose=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EB=B2=84=EC=A0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8770324cb..58faa413a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,6 @@ hiltAndroidCompiler = "2.42" lifecycleRuntimeCompose = "2.8.7" animation = "1.7.8" coilCompose = "2.5.0" -composeBomVersion = "2025.03.00" composeThemeAdapter = "1.2.1" lifecycleRuntimeKtx = "2.5.2" lifecycleViewmodelCompose = "2.8.7" @@ -32,10 +31,10 @@ activity = "1.8.2" fragment = "1.6.2" uiTestJunit4 = "1.7.8" uiTooling = "1.7.8" -compose-material3 = "1.3.1" +compose-material3 = "1.4.0" workRuntimeKtx = "2.10.0" datastore = "1.0.0" -composeBom = "2024.04.01" +composeBom = "2025.11.01" lifecycle = "2.7.0" retrofit = "2.9.0" converter-gson = "2.9.0" From c3884e0ad795429ba2208aed8c9e7ca30e4ae75b Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Fri, 21 Nov 2025 10:24:37 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20compose=20router-screen=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 79 +++++++++++++++---- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 9a46e1489..5d5e3ff6f 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalNaverMapApi::class) + package com.eatssu.android.presentation.map import android.Manifest @@ -17,6 +19,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberModalBottomSheetState @@ -61,6 +64,7 @@ import com.eatssu.design_system.theme.EatssuTheme import com.naver.maps.geometry.LatLng import com.naver.maps.map.CameraPosition import com.naver.maps.map.compose.Align +import com.naver.maps.map.compose.CameraPositionState import com.naver.maps.map.compose.ExperimentalNaverMapApi import com.naver.maps.map.compose.LocationTrackingMode import com.naver.maps.map.compose.MapProperties @@ -80,7 +84,6 @@ private const val DEFAULT_LONGITUDE = 126.95661313346206 private const val DEFAULT_ZOOM = 17.5 private const val PERMISSION_REQUEST_CODE = 1001 -@OptIn(ExperimentalNaverMapApi::class, ExperimentalMaterial3Api::class) @Composable fun MapFragmentComposeView( viewModel: MapViewModel = viewModel(), @@ -205,6 +208,50 @@ fun MapFragmentComposeView( } } + MapScreen( + mapState = mapState, + viewModel = viewModel, + cameraPositionState = cameraPositionState, + locationSource = locationSource, + sheetState = sheetState, + showToast = { message -> + scope.launch { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + }, + navigateToUserInfo = { + val intent = Intent(context, UserInfoActivity::class.java) + context.startActivity(intent) + }, + onShowSheet = { + scope.launch { sheetState.show() } + }, + onSelectedFilterChange = { + selectedFilter = it + }, + departmentId = departmentId, + collegeId = collegeId, + departmentName = departmentName, + selectedFilter = selectedFilter + ) +} + +@Composable +private fun MapScreen( + mapState: MapState, + viewModel: MapViewModel, + cameraPositionState: CameraPositionState, + locationSource: FusedLocationSource, + sheetState: SheetState, + showToast: (String) -> Unit, + navigateToUserInfo: () -> Unit, + onShowSheet: () -> Unit, + onSelectedFilterChange: (FilterType) -> Unit, + departmentId: Long, + collegeId: Long, + departmentName: String?, + selectedFilter: FilterType, +) { Scaffold( topBar = { CenterAlignedTopAppBar( @@ -230,8 +277,7 @@ fun MapFragmentComposeView( onDismiss = { viewModel.toggleDepartmentBottomSheet() }, onInputClick = { viewModel.toggleDepartmentBottomSheet() - val intent = Intent(context, UserInfoActivity::class.java) - context.startActivity(intent) + navigateToUserInfo() }, sheetState = sheetState ) @@ -252,7 +298,6 @@ fun MapFragmentComposeView( RestaurantType.CAFE -> PlaceType.CAFE RestaurantType.RESTAURANT -> PlaceType.RESTAURANT RestaurantType.PUB -> PlaceType.PUB - else -> PlaceType.RESTAURANT }, mapRestaurantList = mapState.restaurantInfoList, onDismiss = { viewModel.togglePartnershipBottomSheet() } @@ -269,7 +314,10 @@ fun MapFragmentComposeView( NaverMap( modifier = Modifier.fillMaxSize(), cameraPositionState = cameraPositionState, - uiSettings = MapUiSettings(isZoomControlEnabled = false, isLocationButtonEnabled = true), + uiSettings = MapUiSettings( + isZoomControlEnabled = false, + isLocationButtonEnabled = true + ), locationSource = locationSource, contentPadding = PaddingValues(bottom = dimensionResource(R.dimen.bottom_nav_height)), properties = MapProperties( @@ -277,7 +325,12 @@ fun MapFragmentComposeView( ), ) { mapState.partnerships.forEach { partnership -> - val markerState = rememberMarkerState(position = LatLng(partnership.latitude, partnership.longitude)) + val markerState = rememberMarkerState( + position = LatLng( + partnership.latitude, + partnership.longitude + ) + ) Marker( icon = OverlayImage.fromResource( @@ -296,8 +349,7 @@ fun MapFragmentComposeView( captionTextSize = 10.sp, onClick = { if (partnership.partnershipInfos.isEmpty()) { - // 제휴 정보가 없을 때는 토스트만 띄우고 바텀시트는 안 띄움 - Toast.makeText(context, "제휴 정보가 없습니다.", Toast.LENGTH_SHORT).show() + showToast("제휴 정보가 없습니다.") true } else { // 제휴 정보가 있을 때만 바텀시트 띄움 @@ -317,20 +369,17 @@ fun MapFragmentComposeView( onSelectedChange = { next -> if (mapState.showPartnershipBottomSheet) return@PartnershipFilterToggle - val hasDepartment = !departmentName.equals("학과") + val emptyDepartment = departmentName.isNullOrBlank() && departmentName == "학과" - if (next == FilterType.Mine && !hasDepartment) { + if (next == FilterType.Mine && emptyDepartment) { // 전환 막기: selectedFilter는 그대로 (All 유지) // 학과 입력 바텀시트 띄우기 - scope.launch { - // suspend 함수이므로 코루틴 내에서 실행 - sheetState.show() - } + onShowSheet() return@PartnershipFilterToggle } // 학과 정보가 있거나 All 선택은 정상 전환 - selectedFilter = next + onSelectedFilterChange(next) }, modifier = Modifier.padding(top = 12.dp), departmentName = departmentName.toString() From 037cef45fcf5fe8ca9e1ae21f6045d8668fad229 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Mon, 24 Nov 2025 23:26:10 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=ED=95=99=EA=B3=BC=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EC=9D=84=20=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0,=20default=20=ED=86=A0=EA=B8=80=EC=9D=B4=20"?= =?UTF-8?q?=EC=A0=84=EC=B2=B4"=EB=A1=9C=20=EC=88=98=EC=A0=95.=20=ED=95=99?= =?UTF-8?q?=EA=B3=BC=20=ED=86=A0=EA=B8=80=20=EC=84=A0=ED=83=9D=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/presentation/map/MapFragmentView.kt | 11 ++++++++++- .../android/presentation/map/MapViewModel.kt | 15 ++++++++++----- .../map/component/PartnershipToggleItem.kt | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 5d5e3ff6f..b1a4d8739 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -174,6 +174,15 @@ fun MapFragmentComposeView( } } + // 초기 필터 설정 + LaunchedEffect(Unit) { + if (departmentId == -1L) { + selectedFilter = FilterType.All + } else { + selectedFilter = FilterType.Mine + } + } + // 제휴 정보 토글 event LaunchedEffect(selectedFilter) { when (selectedFilter) { @@ -369,7 +378,7 @@ private fun MapScreen( onSelectedChange = { next -> if (mapState.showPartnershipBottomSheet) return@PartnershipFilterToggle - val emptyDepartment = departmentName.isNullOrBlank() && departmentName == "학과" + val emptyDepartment = departmentId == -1L if (next == FilterType.Mine && emptyDepartment) { // 전환 막기: selectedFilter는 그대로 (All 유지) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index b6b616d4c..fbdad086f 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -26,8 +26,6 @@ data class MapState( val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), - val currentCollegeName: String = "", - val currentDepartmentName: String = "", ) @HiltViewModel @@ -119,9 +117,16 @@ class MapViewModel @Inject constructor( val current = uiState.value if (current is UiState.Success) { current.data.let { data -> - _uiState.value = UiState.Success( - data.copy(showDepartmentBottomSheet = !data.showDepartmentBottomSheet) - ) + if (departmentId == -1L) { + // 학과 정보가 없는 경우 학과 입력 바텀시트 무조건 보여주기 + _uiState.value = UiState.Success( + data.copy(showDepartmentBottomSheet = true) + ) + } else { + _uiState.value = UiState.Success( + data.copy(showDepartmentBottomSheet = !data.showDepartmentBottomSheet) + ) + } } } } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index 47cecfb2d..e18067fc0 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -38,8 +38,8 @@ enum class FilterType { fun PartnershipFilterToggle( selected: FilterType, onSelectedChange: (FilterType) -> Unit, - modifier: Modifier = Modifier, departmentName: String, + modifier: Modifier = Modifier, ) { Timber.d("departmentName = $departmentName") val items = FilterType.entries.map { From 6ae0eacdcf80b768eea47290c79dd40805f0fcaa Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Mon, 24 Nov 2025 23:40:19 +0900 Subject: [PATCH 13/23] =?UTF-8?q?feat:=20compose=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 58faa413a..41ed554a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,10 +31,10 @@ activity = "1.8.2" fragment = "1.6.2" uiTestJunit4 = "1.7.8" uiTooling = "1.7.8" -compose-material3 = "1.4.0" +compose-material3 = "1.3.1" workRuntimeKtx = "2.10.0" datastore = "1.0.0" -composeBom = "2025.11.01" +composeBom = "2024.04.01" lifecycle = "2.7.0" retrofit = "2.9.0" converter-gson = "2.9.0" @@ -163,4 +163,4 @@ android-library = { id = "com.android.library", version.ref = "android" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-android" } google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } -hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } \ No newline at end of file From d8e2c780012093dda4dad70d8f4713157ba55c86 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 25 Nov 2025 09:27:20 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=ED=95=99=EA=B3=BC=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EA=B0=80=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= =?UTF-8?q?=EB=90=A0=20=EB=95=8C=EB=A7=88=EB=8B=A4=20=ED=86=A0=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=97=86=EB=8D=B0=EC=9D=B4=ED=8A=B8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20key=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eatssu/android/presentation/map/MapFragmentView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index b1a4d8739..670be29ca 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -174,8 +174,8 @@ fun MapFragmentComposeView( } } - // 초기 필터 설정 - LaunchedEffect(Unit) { + // 초기 필터 설정 (departmentId가 변경될 때마다 재설정) + LaunchedEffect(departmentId) { if (departmentId == -1L) { selectedFilter = FilterType.All } else { From 77487ef0a04ae6242255fe561e1dc9b10eac2dce Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 25 Nov 2025 09:27:48 +0900 Subject: [PATCH 15/23] =?UTF-8?q?feat:=20init=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=84=EC=B2=B4=20=EC=A0=9C=ED=9C=B4?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20load=ED=95=98=EB=8A=94=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0(compose=20LaunchedEffect?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/eatssu/android/presentation/map/MapViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index fbdad086f..41524898e 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -48,7 +48,6 @@ class MapViewModel @Inject constructor( init { fetchUserCollegeDepartment() - loadPartnerships() } private fun fetchUserCollegeDepartment() { From c2006c48a9a16b934946cdc5ffeac343b6c72ae0 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 25 Nov 2025 09:42:15 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20BottomSheet=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=EB=8A=94=20View=EC=9D=98=20SheetState=EB=A1=9C=EB=A7=8C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20(ViewModel=EC=9D=80=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=A7=8C=20=EC=A0=9C=EA=B3=B5),=20=EC=A0=9C=ED=9C=B4?= =?UTF-8?q?=EC=A0=95=EB=B3=B4,=20=ED=95=99=EA=B3=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 52 +++++++++++++------ .../android/presentation/map/MapViewModel.kt | 34 ------------ 2 files changed, 35 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 670be29ca..cb785050f 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -75,6 +75,7 @@ import com.naver.maps.map.compose.rememberCameraPositionState import com.naver.maps.map.compose.rememberMarkerState import com.naver.maps.map.overlay.OverlayImage import com.naver.maps.map.util.FusedLocationSource +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import timber.log.Timber @@ -98,7 +99,8 @@ fun MapFragmentComposeView( } val mainUiState by mainViewModel.uiState.collectAsStateWithLifecycle() - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val departmentSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val partnershipSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val context = LocalContext.current val activity = remember(context) { context.findActivityOrNull() } ?: throw IllegalStateException("FusedLocationSource는 Activity에서만 사용할 수 있습니다.") @@ -168,9 +170,9 @@ fun MapFragmentComposeView( // 상태 변화 감지해서 show/hide -> Scrim 잔존 문제 해결 LaunchedEffect(showUserDepartmentBottomSheet) { if (showUserDepartmentBottomSheet) { - sheetState.show() + departmentSheetState.show() } else { - sheetState.hide() + departmentSheetState.hide() } } @@ -197,6 +199,13 @@ fun MapFragmentComposeView( } } + // 제휴 정보가 선택되면 BottomSheet 표시 + LaunchedEffect(mapState.restaurantPartnershipInfo) { + if (mapState.restaurantPartnershipInfo != null) { + partnershipSheetState.show() + } + } + // Screen View 기록 TrackScreenViewEvent(ScreenId.MAP_MAIN) @@ -222,7 +231,8 @@ fun MapFragmentComposeView( viewModel = viewModel, cameraPositionState = cameraPositionState, locationSource = locationSource, - sheetState = sheetState, + departmentSheetState = departmentSheetState, + partnershipSheetState = partnershipSheetState, showToast = { message -> scope.launch { Toast.makeText(context, message, Toast.LENGTH_SHORT).show() @@ -232,8 +242,8 @@ fun MapFragmentComposeView( val intent = Intent(context, UserInfoActivity::class.java) context.startActivity(intent) }, - onShowSheet = { - scope.launch { sheetState.show() } + onShowDepartmentSheet = { + scope.launch { departmentSheetState.show() } }, onSelectedFilterChange = { selectedFilter = it @@ -241,7 +251,8 @@ fun MapFragmentComposeView( departmentId = departmentId, collegeId = collegeId, departmentName = departmentName, - selectedFilter = selectedFilter + selectedFilter = selectedFilter, + scope = scope ) } @@ -251,15 +262,17 @@ private fun MapScreen( viewModel: MapViewModel, cameraPositionState: CameraPositionState, locationSource: FusedLocationSource, - sheetState: SheetState, + departmentSheetState: SheetState, + partnershipSheetState: SheetState, showToast: (String) -> Unit, navigateToUserInfo: () -> Unit, - onShowSheet: () -> Unit, + onShowDepartmentSheet: () -> Unit, onSelectedFilterChange: (FilterType) -> Unit, departmentId: Long, collegeId: Long, departmentName: String?, selectedFilter: FilterType, + scope: CoroutineScope, ) { Scaffold( topBar = { @@ -279,21 +292,23 @@ private fun MapScreen( ) { innerPadding -> // 학과 정보가 없을 때 보여줄 BottomSheet - if (sheetState.isVisible) { + if (departmentSheetState.isVisible) { Timber.d("학과 정보가 없습니다. BottomSheet를 표시합니다.") DepartmentBottomSheet( - onDismiss = { viewModel.toggleDepartmentBottomSheet() }, + onDismiss = { + scope.launch { departmentSheetState.hide() } + }, onInputClick = { - viewModel.toggleDepartmentBottomSheet() + scope.launch { departmentSheetState.hide() } navigateToUserInfo() }, - sheetState = sheetState + sheetState = departmentSheetState ) } // 특정 식당에 대한 제휴 정보 BottomSheet - if (mapState.showPartnershipBottomSheet) { + if (partnershipSheetState.isVisible && mapState.restaurantPartnershipInfo != null) { mapState.restaurantPartnershipInfo?.let { info -> EventLogger.clickPartnerRestaurant( college = collegeId, @@ -309,7 +324,9 @@ private fun MapScreen( RestaurantType.PUB -> PlaceType.PUB }, mapRestaurantList = mapState.restaurantInfoList, - onDismiss = { viewModel.togglePartnershipBottomSheet() } + onDismiss = { + scope.launch { partnershipSheetState.hide() } + } ) } } @@ -362,6 +379,7 @@ private fun MapScreen( true } else { // 제휴 정보가 있을 때만 바텀시트 띄움 + // LaunchedEffect에서 자동으로 표시됨 viewModel.selectPartnershipByStoreName(partnership.storeName) true } @@ -376,14 +394,14 @@ private fun MapScreen( PartnershipFilterToggle( selected = selectedFilter, onSelectedChange = { next -> - if (mapState.showPartnershipBottomSheet) return@PartnershipFilterToggle + if (partnershipSheetState.isVisible) return@PartnershipFilterToggle val emptyDepartment = departmentId == -1L if (next == FilterType.Mine && emptyDepartment) { // 전환 막기: selectedFilter는 그대로 (All 유지) // 학과 입력 바텀시트 띄우기 - onShowSheet() + onShowDepartmentSheet() return@PartnershipFilterToggle } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index 41524898e..8b43ae29a 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -21,8 +21,6 @@ import timber.log.Timber import javax.inject.Inject data class MapState( - val showDepartmentBottomSheet: Boolean = false, - val showPartnershipBottomSheet: Boolean = false, val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), @@ -104,41 +102,9 @@ class MapViewModel @Inject constructor( _uiState.value = UiState.Success( data.copy( - showPartnershipBottomSheet = true, restaurantPartnershipInfo = representative, restaurantInfoList = restaurantInfoList ) ) } - - // 학과 정보 입력 bottomSheet 보여주기 toggle - fun toggleDepartmentBottomSheet() { - val current = uiState.value - if (current is UiState.Success) { - current.data.let { data -> - if (departmentId == -1L) { - // 학과 정보가 없는 경우 학과 입력 바텀시트 무조건 보여주기 - _uiState.value = UiState.Success( - data.copy(showDepartmentBottomSheet = true) - ) - } else { - _uiState.value = UiState.Success( - data.copy(showDepartmentBottomSheet = !data.showDepartmentBottomSheet) - ) - } - } - } - } - - // 식당별 제휴 정보 bottomSheet 보여주기 toggle - fun togglePartnershipBottomSheet() { - val current = uiState.value - if (current is UiState.Success) { - current.data.let { data -> - _uiState.value = UiState.Success( - data.copy(showPartnershipBottomSheet = !data.showPartnershipBottomSheet) - ) - } - } - } } From be080a7048813548b57c28e273395fc645e03730 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 25 Nov 2025 09:46:37 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20Domain=20=EB=AA=A8=EB=8D=B8(Resta?= =?UTF-8?q?urantType)=EC=9D=84=20UI=20=EB=AA=A8=EB=8D=B8(PlaceType)?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=ED=99=98=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EB=B7=B0=EB=AA=A8=EB=8D=B8=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 23 ++++++++----------- .../android/presentation/map/MapViewModel.kt | 13 ++++++++++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index cb785050f..615a7af58 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -52,7 +52,6 @@ import com.eatssu.android.presentation.map.component.DepartmentBottomSheet import com.eatssu.android.presentation.map.component.FilterType import com.eatssu.android.presentation.map.component.MapRestaurantBottomSheet import com.eatssu.android.presentation.map.component.PartnershipFilterToggle -import com.eatssu.android.presentation.map.model.PlaceType import com.eatssu.android.presentation.mypage.userinfo.UserInfoActivity import com.eatssu.android.presentation.util.TrackScreenViewEvent import com.eatssu.common.EventLogger @@ -316,18 +315,16 @@ private fun MapScreen( partnerRestaurantId = info.id.toLong() ) - MapRestaurantBottomSheet( - storeName = info.storeName, - placeType = when (info.restaurantType) { - RestaurantType.CAFE -> PlaceType.CAFE - RestaurantType.RESTAURANT -> PlaceType.RESTAURANT - RestaurantType.PUB -> PlaceType.PUB - }, - mapRestaurantList = mapState.restaurantInfoList, - onDismiss = { - scope.launch { partnershipSheetState.hide() } - } - ) + mapState.placeType?.let { placeType -> + MapRestaurantBottomSheet( + storeName = info.storeName, + placeType = placeType, + mapRestaurantList = mapState.restaurantInfoList, + onDismiss = { + scope.launch { partnershipSheetState.hide() } + } + ) + } } } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index 8b43ae29a..70fec7d1b 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.domain.model.Partnership import com.eatssu.android.domain.model.PartnershipRestaurant +import com.eatssu.android.domain.model.RestaurantType import com.eatssu.android.domain.repository.PartnershipRepository import com.eatssu.android.domain.usecase.user.GetPartnershipDetailUseCase import com.eatssu.android.domain.usecase.user.GetUserCollegeDepartmentUseCase +import com.eatssu.android.presentation.map.model.PlaceType import com.eatssu.android.presentation.map.model.RestaurantInfo import com.eatssu.common.UiEvent import com.eatssu.common.UiState @@ -24,6 +26,7 @@ data class MapState( val partnerships: List = emptyList(), val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), + val placeType: PlaceType? = null, ) @HiltViewModel @@ -100,10 +103,18 @@ class MapViewModel @Inject constructor( ) } + // Domain 모델(RestaurantType)을 UI 모델(PlaceType)로 변환 + val placeType = when (representative.restaurantType) { + RestaurantType.CAFE -> PlaceType.CAFE + RestaurantType.RESTAURANT -> PlaceType.RESTAURANT + RestaurantType.PUB -> PlaceType.PUB + } + _uiState.value = UiState.Success( data.copy( restaurantPartnershipInfo = representative, - restaurantInfoList = restaurantInfoList + restaurantInfoList = restaurantInfoList, + placeType = placeType ) ) } From 7bf29b2515451df7b1cdd5a3a14d6ce5750bf796 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 25 Nov 2025 10:50:31 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=ED=86=A0=EA=B8=80=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=20=EC=83=81=ED=83=9C,=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=A1=9C=EA=B1=B0=EB=A5=BC=20ViewModel=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99.=20departmentId,=20collegeId=20flow=20=EB=B0=A9?= =?UTF-8?q?=EC=B6=9C=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/map/MapFragmentView.kt | 50 ++------- .../android/presentation/map/MapViewModel.kt | 104 ++++++++++++++++-- 2 files changed, 103 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 615a7af58..a89de2130 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -27,10 +27,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -104,10 +102,9 @@ fun MapFragmentComposeView( val activity = remember(context) { context.findActivityOrNull() } ?: throw IllegalStateException("FusedLocationSource는 Activity에서만 사용할 수 있습니다.") val scope = rememberCoroutineScope() - var selectedFilter by remember { mutableStateOf(FilterType.Mine) } - val departmentId = viewModel.departmentId - val collegeId = viewModel.collegeId + val departmentId by viewModel.departmentId.collectAsStateWithLifecycle() + val collegeId by viewModel.collegeId.collectAsStateWithLifecycle() val cameraPositionState = rememberCameraPositionState { position = CameraPosition( @@ -175,26 +172,10 @@ fun MapFragmentComposeView( } } - // 초기 필터 설정 (departmentId가 변경될 때마다 재설정) - LaunchedEffect(departmentId) { - if (departmentId == -1L) { - selectedFilter = FilterType.All - } else { - selectedFilter = FilterType.Mine - } - } - - // 제휴 정보 토글 event - LaunchedEffect(selectedFilter) { - when (selectedFilter) { - FilterType.All -> { - viewModel.loadPartnerships() - EventLogger.clickMap() - } - FilterType.Mine -> { - viewModel.loadUserCollegePartnerships() - EventLogger.clickMapMine(collegeId, departmentId) - } + // 필터 변경 결과에 따라 학과 입력 BottomSheet 표시 + LaunchedEffect(mapState.filterChangeResult) { + if (mapState.filterChangeResult is MapState.FilterChangeResult.RequiresDepartment) { + departmentSheetState.show() } } @@ -244,13 +225,13 @@ fun MapFragmentComposeView( onShowDepartmentSheet = { scope.launch { departmentSheetState.show() } }, - onSelectedFilterChange = { - selectedFilter = it + onSelectedFilterChange = { filter -> + viewModel.setFilter(filter) }, departmentId = departmentId, collegeId = collegeId, departmentName = departmentName, - selectedFilter = selectedFilter, + selectedFilter = mapState.selectedFilter, scope = scope ) } @@ -308,7 +289,7 @@ private fun MapScreen( // 특정 식당에 대한 제휴 정보 BottomSheet if (partnershipSheetState.isVisible && mapState.restaurantPartnershipInfo != null) { - mapState.restaurantPartnershipInfo?.let { info -> + mapState.restaurantPartnershipInfo.let { info -> EventLogger.clickPartnerRestaurant( college = collegeId, major = departmentId, @@ -392,17 +373,6 @@ private fun MapScreen( selected = selectedFilter, onSelectedChange = { next -> if (partnershipSheetState.isVisible) return@PartnershipFilterToggle - - val emptyDepartment = departmentId == -1L - - if (next == FilterType.Mine && emptyDepartment) { - // 전환 막기: selectedFilter는 그대로 (All 유지) - // 학과 입력 바텀시트 띄우기 - onShowDepartmentSheet() - return@PartnershipFilterToggle - } - - // 학과 정보가 있거나 All 선택은 정상 전환 onSelectedFilterChange(next) }, modifier = Modifier.padding(top = 12.dp), diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index 70fec7d1b..b24674522 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -8,8 +8,10 @@ import com.eatssu.android.domain.model.RestaurantType import com.eatssu.android.domain.repository.PartnershipRepository import com.eatssu.android.domain.usecase.user.GetPartnershipDetailUseCase import com.eatssu.android.domain.usecase.user.GetUserCollegeDepartmentUseCase +import com.eatssu.android.presentation.map.component.FilterType import com.eatssu.android.presentation.map.model.PlaceType import com.eatssu.android.presentation.map.model.RestaurantInfo +import com.eatssu.common.EventLogger import com.eatssu.common.UiEvent import com.eatssu.common.UiState import dagger.hilt.android.lifecycle.HiltViewModel @@ -27,7 +29,14 @@ data class MapState( val restaurantPartnershipInfo: PartnershipRestaurant? = null, val restaurantInfoList: List = emptyList(), val placeType: PlaceType? = null, -) + val selectedFilter: FilterType = FilterType.Mine, + val filterChangeResult: FilterChangeResult? = null, +) { + sealed class FilterChangeResult { + object Success : FilterChangeResult() + object RequiresDepartment : FilterChangeResult() + } +} @HiltViewModel class MapViewModel @Inject constructor( @@ -42,10 +51,11 @@ class MapViewModel @Inject constructor( private val _uiEvent = MutableSharedFlow() val uiEvent: SharedFlow = _uiEvent - var departmentId: Long = -1 - private set - var collegeId: Long = -1 - private set + private val _departmentId = MutableStateFlow(-1) + val departmentId: StateFlow = _departmentId.asStateFlow() + + private val _collegeId = MutableStateFlow(-1) + val collegeId: StateFlow = _collegeId.asStateFlow() init { fetchUserCollegeDepartment() @@ -54,29 +64,101 @@ class MapViewModel @Inject constructor( private fun fetchUserCollegeDepartment() { viewModelScope.launch { val userCollegeDepartment = getUserCollegeDepartmentUseCase() - departmentId = userCollegeDepartment.userDepartment.departmentId.toLong() - collegeId = userCollegeDepartment.userCollege.collegeId.toLong() + val newDepartmentId = userCollegeDepartment.userDepartment.departmentId.toLong() + val newCollegeId = userCollegeDepartment.userCollege.collegeId.toLong() + + _departmentId.value = newDepartmentId + _collegeId.value = newCollegeId + + // departmentId가 변경되면 필터 자동 설정 + val current = uiState.value + val currentData = if (current is UiState.Success) current.data else MapState() + val initialFilter = if (newDepartmentId == -1L) FilterType.All else FilterType.Mine + + _uiState.value = UiState.Success( + currentData.copy(selectedFilter = initialFilter) + ) + + // 초기 필터에 따라 데이터 로드 + when (initialFilter) { + FilterType.All -> loadPartnerships() + FilterType.Mine -> loadUserCollegePartnerships() + } + Timber.d("학과 정보 : ${userCollegeDepartment.userDepartment.departmentName}") } } + // 필터 변경 (검증 로직 포함) + fun setFilter(filter: FilterType) { + val current = uiState.value + val currentData = if (current is UiState.Success) current.data else MapState() + + // 학과 정보가 없는데 Mine 필터를 선택하려는 경우 + if (filter == FilterType.Mine && _departmentId.value == -1L) { + // 학과 입력이 필요한 경우 결과를 MapState에 반영 + if (current is UiState.Success) { + _uiState.value = UiState.Success( + currentData.copy(filterChangeResult = MapState.FilterChangeResult.RequiresDepartment) + ) + } + return + } + + // 필터 변경 성공 + val updatedData = currentData.copy( + selectedFilter = filter, + filterChangeResult = null + ) + _uiState.value = UiState.Success(updatedData) + + // 필터에 따라 데이터 로드 + when (filter) { + FilterType.All -> { + loadPartnerships() + EventLogger.clickMap() + } + + FilterType.Mine -> { + loadUserCollegePartnerships() + EventLogger.clickMapMine(_collegeId.value, _departmentId.value) + } + } + } + // 제휴 정보 로딩 - fun loadPartnerships() { + private fun loadPartnerships() { viewModelScope.launch { + val current = uiState.value + val currentData = if (current is UiState.Success) current.data else MapState() + _uiState.value = UiState.Loading val partnerships = partnershipRepository.getAllPartnerships() - _uiState.value = UiState.Success(MapState(partnerships = partnerships)) + _uiState.value = UiState.Success( + currentData.copy( + partnerships = partnerships, + filterChangeResult = null + ) + ) } } // 사용자 단과대 제휴 정보 로딩 - fun loadUserCollegePartnerships() { + private fun loadUserCollegePartnerships() { viewModelScope.launch { + val current = uiState.value + val currentData = if (current is UiState.Success) current.data else MapState() + _uiState.value = UiState.Loading val partnerships = partnershipRepository.getUserCollegePartnerships() - _uiState.value = UiState.Success(MapState(partnerships = partnerships)) + _uiState.value = UiState.Success( + currentData.copy( + partnerships = partnerships, + filterChangeResult = null + ) + ) } } From 84bbc3d8bc65887e5c6dac3680ebacdf9164a47c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A0=9C=ED=9B=88?= Date: Tue, 25 Nov 2025 13:02:38 +0900 Subject: [PATCH 19/23] =?UTF-8?q?[Hotfix]=20Release=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=ED=95=98=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20=EB=B0=8F=203.1.8=20=EB=A6=B4=EB=A6=AC?= =?UTF-8?q?=EC=A6=88=20(#418)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: DTO 파일 이동에 따른 Proguard Rule 수정 * fix: Generics 관련 정보가 유실되는 TypeToken 대신 Java Class 사용 * release: 3.1.8(46) * refactor: unused import 삭제 * fix: 제미니 대응 --- app/build.gradle.kts | 4 ++-- app/proguard-rules.pro | 5 +---- .../remote/repository/FirebaseRemoteConfigRepositoryImpl.kt | 4 +--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b5005ed02..746767884 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,8 +30,8 @@ android { applicationId = "com.eatssu.android" minSdk = 28 targetSdk = 35 - versionCode = 45 - versionName = "3.1.7" + versionCode = 46 + versionName = "3.1.8" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c84617612..a14e469ad 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -27,10 +27,7 @@ # https://firebase.google.com/docs/database/android/start?hl=ko -keepattributes Signature --keep class com.eatssu.android.data.dto.** { - *; -} --keep class com.eatssu.android.data.enums.** { +-keep class com.eatssu.android.data.remote.dto.** { *; } -keep class com.eatssu.android.data.model.** { diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/FirebaseRemoteConfigRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/FirebaseRemoteConfigRepositoryImpl.kt index b546c9949..2aad4884f 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/FirebaseRemoteConfigRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/FirebaseRemoteConfigRepositoryImpl.kt @@ -7,7 +7,6 @@ import com.eatssu.common.enums.Restaurant import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings import com.google.gson.Gson -import com.google.gson.reflect.TypeToken import kotlinx.coroutines.tasks.await import timber.log.Timber import javax.inject.Inject @@ -60,8 +59,7 @@ class FirebaseRemoteConfigRepositoryImpl @Inject constructor( private fun parseCafeteriaJson(json: String): List { return try { val gson = Gson() - val listType = object : TypeToken>() {}.type - val dtoList: List = gson.fromJson(json, listType) + val dtoList = gson.fromJson(json, Array::class.java) ?: emptyArray() dtoList.map { dto -> RestaurantInfo( From 10036e9c7adf4cd7ba55f42e53d124724ac43b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=84?= Date: Tue, 25 Nov 2025 16:40:44 +0900 Subject: [PATCH 20/23] =?UTF-8?q?chore:=20material=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=A0=9C=EA=B1=B0=20(#423)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 - core/common/build.gradle.kts | 1 - core/design-system/build.gradle.kts | 1 - .../eatssu/design_system/component/EatSsuTopBar.kt | 4 +--- .../src/main/res/drawable/ic_close.xml | 13 +++++++++++++ gradle/libs.versions.toml | 2 -- 6 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 core/design-system/src/main/res/drawable/ic_close.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 746767884..1337bab20 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -122,7 +122,6 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) - implementation(libs.material) implementation(libs.androidx.constraintlayout) implementation(libs.threetenabp) implementation(libs.material.calendarview) diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 645e1e40f..537fef772 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) - implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/core/design-system/build.gradle.kts b/core/design-system/build.gradle.kts index 02f4a11bb..8749d23ed 100644 --- a/core/design-system/build.gradle.kts +++ b/core/design-system/build.gradle.kts @@ -46,7 +46,6 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) - implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/core/design-system/src/main/java/com/eatssu/design_system/component/EatSsuTopBar.kt b/core/design-system/src/main/java/com/eatssu/design_system/component/EatSsuTopBar.kt index de747d00a..b37f1e66b 100644 --- a/core/design-system/src/main/java/com/eatssu/design_system/component/EatSsuTopBar.kt +++ b/core/design-system/src/main/java/com/eatssu/design_system/component/EatSsuTopBar.kt @@ -3,8 +3,6 @@ package com.eatssu.design_system.component import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -69,7 +67,7 @@ fun CloseTopBar( actions = { IconButton(onClick = onClose) { Icon( - imageVector = Icons.Filled.Close, + painter = painterResource(id = R.drawable.ic_close), contentDescription = "닫기", tint = Gray500 ) diff --git a/core/design-system/src/main/res/drawable/ic_close.xml b/core/design-system/src/main/res/drawable/ic_close.xml new file mode 100644 index 000000000..4c9a93d95 --- /dev/null +++ b/core/design-system/src/main/res/drawable/ic_close.xml @@ -0,0 +1,13 @@ + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41ed554a8..867868e7e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,6 @@ composeThemeAdapter = "1.2.1" lifecycleRuntimeKtx = "2.5.2" lifecycleViewmodelCompose = "2.8.7" mapSdk = "3.21.0" -material = "1.8.0" constraintlayout = "2.1.4" naverMapCompose = "1.8.2" naverMapLocation = "21.0.2" @@ -142,7 +141,6 @@ play-services-base = { group = "com.google.android.gms", name = "play-services-b # etc accompanist-appcompat-theme = { group = "com.google.accompanist", name = "accompanist-appcompat-theme", version.ref = "accompanistAppcompatTheme" } compose-theme-adapter = { group = "com.google.android.material", name = "compose-theme-adapter", version.ref = "composeThemeAdapter" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } threetenabp = { group = "com.jakewharton.threetenabp", name = "threetenabp", version.ref = "threetenabp" } material-calendarview = { group = "com.prolificinteractive", name = "material-calendarview", version.ref = "material-calendarview" } transport-runtime = { group = "com.google.android.datatransport", name = "transport-runtime", version.ref = "transport-runtime" } From 8a974e2d1b49cc4c72b5aa18edb483c258bcd9a2 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Wed, 26 Nov 2025 17:02:52 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81=20(=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20scope=20=EC=A0=84=EB=8B=AC?= =?UTF-8?q?=20->=20=EB=9E=8C=EB=8B=A4=20=EC=A0=84=EB=8B=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=B5=9C=EC=B4=88=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20load=20=EC=8B=9C=20state=20copy=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20mapState=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=B0=8F=20=EC=B4=88=EA=B8=B0=ED=99=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/presentation/map/MapFragment.kt | 4 +- .../presentation/map/MapFragmentView.kt | 40 ++++++++++--------- .../android/presentation/map/MapViewModel.kt | 2 +- .../map/component/PartnershipToggleItem.kt | 4 +- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragment.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragment.kt index 2d4edcd2b..a87d4c8e3 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragment.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragment.kt @@ -1,11 +1,11 @@ package com.eatssu.android.presentation.map import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment import com.eatssu.design_system.theme.EatssuTheme import dagger.hilt.android.AndroidEntryPoint @@ -25,7 +25,7 @@ class MapFragment : Fragment() { return ComposeView(requireContext()).apply { setContent { EatssuTheme { - MapFragmentComposeView() + MapRoute() } } } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index a89de2130..11bc98cc6 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -72,7 +72,6 @@ import com.naver.maps.map.compose.rememberCameraPositionState import com.naver.maps.map.compose.rememberMarkerState import com.naver.maps.map.overlay.OverlayImage import com.naver.maps.map.util.FusedLocationSource -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import timber.log.Timber @@ -83,7 +82,7 @@ private const val DEFAULT_ZOOM = 17.5 private const val PERMISSION_REQUEST_CODE = 1001 @Composable -fun MapFragmentComposeView( +fun MapRoute( viewModel: MapViewModel = viewModel(), mainViewModel: MainViewModel = viewModel() ) { @@ -184,6 +183,7 @@ fun MapFragmentComposeView( if (mapState.restaurantPartnershipInfo != null) { partnershipSheetState.show() } + Timber.d("선택된 식당 제휴 정보: ${mapState.restaurantPartnershipInfo}") } // Screen View 기록 @@ -222,8 +222,11 @@ fun MapFragmentComposeView( val intent = Intent(context, UserInfoActivity::class.java) context.startActivity(intent) }, - onShowDepartmentSheet = { - scope.launch { departmentSheetState.show() } + onHideDepartmentSheet = { + scope.launch { departmentSheetState.hide() } + }, + onHidePartnershipSheet = { + scope.launch { partnershipSheetState.hide() } }, onSelectedFilterChange = { filter -> viewModel.setFilter(filter) @@ -232,7 +235,6 @@ fun MapFragmentComposeView( collegeId = collegeId, departmentName = departmentName, selectedFilter = mapState.selectedFilter, - scope = scope ) } @@ -246,13 +248,13 @@ private fun MapScreen( partnershipSheetState: SheetState, showToast: (String) -> Unit, navigateToUserInfo: () -> Unit, - onShowDepartmentSheet: () -> Unit, + onHideDepartmentSheet: () -> Unit = {}, + onHidePartnershipSheet: () -> Unit = {}, onSelectedFilterChange: (FilterType) -> Unit, departmentId: Long, collegeId: Long, departmentName: String?, selectedFilter: FilterType, - scope: CoroutineScope, ) { Scaffold( topBar = { @@ -277,10 +279,10 @@ private fun MapScreen( DepartmentBottomSheet( onDismiss = { - scope.launch { departmentSheetState.hide() } + onHideDepartmentSheet() }, onInputClick = { - scope.launch { departmentSheetState.hide() } + onHideDepartmentSheet() navigateToUserInfo() }, sheetState = departmentSheetState @@ -288,21 +290,23 @@ private fun MapScreen( } // 특정 식당에 대한 제휴 정보 BottomSheet - if (partnershipSheetState.isVisible && mapState.restaurantPartnershipInfo != null) { - mapState.restaurantPartnershipInfo.let { info -> - EventLogger.clickPartnerRestaurant( - college = collegeId, - major = departmentId, - partnerRestaurantId = info.id.toLong() - ) + if (partnershipSheetState.isVisible) { + mapState.restaurantPartnershipInfo?.let { info -> mapState.placeType?.let { placeType -> + + EventLogger.clickPartnerRestaurant( + college = collegeId, + major = departmentId, + partnerRestaurantId = info.id.toLong() + ) + MapRestaurantBottomSheet( storeName = info.storeName, placeType = placeType, mapRestaurantList = mapState.restaurantInfoList, onDismiss = { - scope.launch { partnershipSheetState.hide() } + onHidePartnershipSheet() } ) } @@ -412,6 +416,6 @@ fun Context.findActivityOrNull(): Activity? = when (this) { @Composable fun MapFragmentComposeViewPreview() { EatssuTheme { - MapFragmentComposeView() + MapRoute() } } diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index b24674522..58e57fc0f 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -76,7 +76,7 @@ class MapViewModel @Inject constructor( val initialFilter = if (newDepartmentId == -1L) FilterType.All else FilterType.Mine _uiState.value = UiState.Success( - currentData.copy(selectedFilter = initialFilter) + MapState(selectedFilter = initialFilter) ) // 초기 필터에 따라 데이터 로드 diff --git a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt index e18067fc0..9f11363b5 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/component/PartnershipToggleItem.kt @@ -54,7 +54,7 @@ fun PartnershipFilterToggle( verticalAlignment = Alignment.CenterVertically ) { items.forEach { (type, label) -> - ToggleChip( + PartnershipToggleItem( label = label, selected = selected == type, onClick = { onSelectedChange(type) } @@ -64,7 +64,7 @@ fun PartnershipFilterToggle( } @Composable -fun ToggleChip( +fun PartnershipToggleItem( label: String, selected: Boolean, onClick: () -> Unit, From 052b826d042ae49d31d2fe8b866a4cb564c6f55d Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Wed, 26 Nov 2025 17:07:41 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat:=20=EC=A0=9C=ED=9C=B4=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=86=A0=EA=B8=80=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=ED=96=88=EB=8D=98=20=EC=8B=9D=EB=8B=B9?= =?UTF-8?q?=EC=9D=98=20=EC=A0=9C=ED=9C=B4=EC=A0=95=EB=B3=B4=20state=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/eatssu/android/presentation/map/MapViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt index 58e57fc0f..1ad6ede3b 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapViewModel.kt @@ -107,8 +107,9 @@ class MapViewModel @Inject constructor( // 필터 변경 성공 val updatedData = currentData.copy( + restaurantPartnershipInfo = null, selectedFilter = filter, - filterChangeResult = null + filterChangeResult = null, ) _uiState.value = UiState.Success(updatedData) From 7d7731cb9672537b42fa5c23b92e690d357831ab Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Wed, 26 Nov 2025 17:11:46 +0900 Subject: [PATCH 23/23] =?UTF-8?q?feat:=20MapScreen=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=20private=20->=20internal=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/eatssu/android/presentation/map/MapFragmentView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt index 11bc98cc6..0d0dbf053 100644 --- a/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt +++ b/app/src/main/java/com/eatssu/android/presentation/map/MapFragmentView.kt @@ -239,7 +239,7 @@ fun MapRoute( } @Composable -private fun MapScreen( +internal fun MapScreen( mapState: MapState, viewModel: MapViewModel, cameraPositionState: CameraPositionState,