From a7860f38f437a657e3d89d2c308dbb7865c89ced Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 13 Aug 2025 16:50:35 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[FEAT]:=20=EC=A7=80=EB=8F=84=20=EC=95=B1?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=8B=9C=20=EB=84=A4=EC=9D=B4=EB=B2=84=EC=A7=80=EB=8F=84?= =?UTF-8?q?=EC=9D=98=20=EA=B2=80=EC=83=89=20=EA=B2=B0=EA=B3=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/searchmenu/screen/SearchMenuScreen.kt | 38 +++++++++++++------ .../viewmodel/SearchMenuViewModel.kt | 20 ++++++++++ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index 9111aef..5a37410 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -1,6 +1,7 @@ package com.kuit.ourmenu.ui.searchmenu.screen import android.Manifest +import android.content.Intent import android.util.Log import androidx.activity.compose.BackHandler import androidx.compose.foundation.interaction.MutableInteractionSource @@ -32,6 +33,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kuit.ourmenu.R @@ -71,13 +73,16 @@ fun SearchMenuScreen( // 지도 중심 좌표 val currentCenter by viewModel.currentCenter.collectAsStateWithLifecycle() - + // 검색기록 val searchHistory by viewModel.searchHistory.collectAsStateWithLifecycle() - + // 핀 위치에 해당하는 메뉴들 val menusOnPin by viewModel.menusOnPin.collectAsStateWithLifecycle() + // 선택된 라벨 + val activeMapId by viewModel.activeMapId.collectAsStateWithLifecycle() + val density = LocalDensity.current val singleItemHeight = 300.dp // Fixed height for each item @@ -160,7 +165,7 @@ fun SearchMenuScreen( } ) }, - sheetPeekHeight = if(showBottomSheet) { + sheetPeekHeight = if (showBottomSheet) { val itemCount = menusOnPin?.size ?: 0 (singleItemHeight * itemCount) + dragHandleHeight } else 0.dp, @@ -210,24 +215,24 @@ fun SearchMenuScreen( // onSearch 함수 if (searchBarFocused) focusManager.clearFocus() searchActionDone = true - + // 검색 시 현재 지도 중심 좌표 사용 if (searchText.isNotEmpty()) { // 검색 직전에 현재 지도 중심 좌표 업데이트 viewModel.updateCurrentCenter() - + val center = viewModel.getCurrentCoordinates() if (center != null) { val (latitude, longitude) = center Log.d("SearchMenuScreen", "검색 위치: $latitude, $longitude") - + // 검색어와 현재 좌표로 스토어 정보 요청 viewModel.getMapSearchResult( query = searchText, long = longitude, lat = latitude ) - + showBottomSheet = true showSearchBackground = false } @@ -238,9 +243,20 @@ fun SearchMenuScreen( modifier = Modifier .align(Alignment.BottomEnd) .padding(bottom = 16.dp, end = 20.dp), - onClick = { - // TODO: 임시로 설정해놓은 카메라 이동, 실제로는 네이버 지도에 해당 가게 검색 결과로 이동 - viewModel.moveCamera(37.5416, 127.0793) + onClick = { + // 네이버 지도에 해당 가게 검색 결과로 이동 + if (activeMapId == null) { + Log.d("SearchMenuScreen", "활성화된 Map ID가 없습니다.") + } else { + scope.launch { + val searchQuery = viewModel.getWebSearchQuery(activeMapId!!) + if (searchQuery.isNotBlank()) { + Log.d("SearchMenuScreen", "intent query: $searchQuery") + val webIntent = Intent(Intent.ACTION_VIEW, searchQuery.toUri()) + context.startActivity(webIntent) + } + } + } }, ) } @@ -252,7 +268,7 @@ fun SearchMenuScreen( @Composable private fun SearchMenuScreenPreview() { SearchMenuScreen( - ){ + ) { } } \ No newline at end of file diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index e719bc5..8cea7ea 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -348,4 +348,24 @@ class SearchMenuViewModel @Inject constructor( // 첫 번째 검색 결과로 카메라 이동 TODO: 현재 위치랑 가까운 결과로 이동 myMenus.value?.get(0)?.let { moveCamera(it.mapY, it.mapX) } } + + // 네이버맵 이동을 위한 가게명 조회 + suspend fun getWebSearchQuery(mapId: Long): String { + val baseUrl = "https://map.naver.com/p/search/" + val response = mapRepository.getMapDetail(mapId) + return response.fold( + onSuccess = { menuList -> + if (menuList.isNullOrEmpty()) { + Log.d("SearchMenuViewModel", "메뉴 상세 조회 실패: 메뉴가 없습니다.") + "" + } else { + baseUrl + menuList.first().storeTitle + } + }, + onFailure = { + Log.d("SearchMenuViewModel", "메뉴 상세 조회 실패: ${it.message}") + "" + } + ) + } } \ No newline at end of file From 24786d459bd066f61d2876f833c4f31c2aabec5c Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 17:49:40 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[FEAT]:=20=EB=B9=88=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=84=EC=B2=B4=20=EB=A9=94=EB=89=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index 5a37410..f212ed9 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -236,6 +236,11 @@ fun SearchMenuScreen( showBottomSheet = true showSearchBackground = false } + }else{ + Log.d("SearchMenuScreen", "검색어가 비어있습니다.") + viewModel.getMyMenus() + showBottomSheet = false + showSearchBackground = false } } From 5dfc17af92b425501c028f00038efd126e1bfc62 Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 17:50:10 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[REFACTOR]:=20DTO=20=EC=86=8D=EC=84=B1=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 --- .../data/model/map/response/MapSearchHistoryResponse.kt | 2 ++ .../ourmenu/data/model/map/response/MapSearchResponse.kt | 4 ++++ .../ourmenu/ui/searchmenu/component/SearchHistory.kt | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchHistoryResponse.kt b/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchHistoryResponse.kt index 40346cb..8325ee9 100644 --- a/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchHistoryResponse.kt +++ b/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchHistoryResponse.kt @@ -5,6 +5,8 @@ import kotlinx.serialization.Serializable @Serializable data class MapSearchHistoryResponse( + @SerialName("mapId") + val mapId: Long, @SerialName("menuId") val menuId: Long, @SerialName("menuTitle") diff --git a/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchResponse.kt b/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchResponse.kt index e072a88..e9ce095 100644 --- a/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchResponse.kt +++ b/app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapSearchResponse.kt @@ -5,6 +5,10 @@ import kotlinx.serialization.Serializable @Serializable data class MapSearchResponse( + @SerialName("mapId") + val mapId: Long, + @SerialName("menuId") + val menuId: Long, @SerialName("menuTitle") val menuTitle: String, @SerialName("storeTitle") diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/component/SearchHistory.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/component/SearchHistory.kt index 85743c5..8b30884 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/component/SearchHistory.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/component/SearchHistory.kt @@ -162,21 +162,24 @@ private fun SearchHistoryPreview() { SearchHistoryList( historyList = listOf( MapSearchHistoryResponse( + mapId = 1, + menuId = 1, menuTitle = "피자", storeTitle = "피자헛", - menuId = 1, storeAddress = "서울특별시 강남구 역삼동 123-4" ), MapSearchHistoryResponse( + mapId = 2, + menuId = 2, menuTitle = "치킨", storeTitle = "굽네치킨", - menuId = 2, storeAddress = "서울특별시 강남구 역삼동 456-7" ), MapSearchHistoryResponse( + mapId = 3, + menuId = 3, menuTitle = "햄버거", storeTitle = "맥도날드", - menuId = 3, storeAddress = "서울특별시 강남구 역삼동 987-6" ) ), From f8818457448cb31bdfc4f5b6b45aefc8d90f9ffe Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 17:56:34 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[FEAT]:=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=A7=80=EB=8F=84=EC=97=90=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 8cea7ea..bba9615 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -268,9 +268,14 @@ class SearchMenuViewModel @Inject constructor( response.onSuccess { result -> if (result != null && result.isNotEmpty()) { - Log.d("SearchMenuViewModel", "등록 메뉴 정보 조회 성공: ${result.size}개") + Log.d("SearchMenuViewModel", "등록 메뉴 정보 조회 성공: $result") // 검색 결과 저장 _searchResult.value = result + // _myMenu의 아이템 중 검색 _searchResult의 menuTitle과 일치하는 것들만 지도에 표시 + _myMenus.value = _myMenus.value?.filter { menu -> + result.any { searchResult -> searchResult.mapId == menu.mapId} + } ?: emptyList() + showSearchResultOnMap() } }.onFailure { Log.d("SearchMenuViewModel", "등록 메뉴 정보 조회 실패: ${it.message}") From d902864e3fba4e0950506b8c40c0d0ae4bc4d553 Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 18:30:20 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[FEAT]:=20=EA=B2=80=EC=83=89=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=EC=9D=98=20=EC=95=84=EC=9D=B4=ED=85=9C=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=EC=8B=9C=20=EC=A7=80=EB=8F=84=EC=97=90=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/SearchMenuViewModel.kt | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index bba9615..1f3f5da 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -320,19 +320,26 @@ class SearchMenuViewModel @Inject constructor( fun getMapMenuDetail(menuId: Long) { viewModelScope.launch { + getMyMenus() val response = mapRepository.getMapMenuDetail(menuId) response.onSuccess { menuDetail -> Log.d("SearchMenuViewModel", "메뉴 상세 조회 성공: $menuDetail") - - // myMenus에서 해당 menuId를 가진 메뉴의 위치 정보 찾기 - myMenus.value?.find { it.mapId == menuId }?.let { menu -> - // 해당 위치로 카메라 이동 - moveCamera(menu.mapY, menu.mapX) - // 해당 핀을 활성화 상태로 변경 - _activeMapId.value = menuId - refreshMarkers() + // 검색 기록에서 해당 menuId를 가진 항목 찾기 + searchHistory.value?.find { it.menuId == menuId }?.let { historyItem -> + Log.d("SearchMenuViewModel", "검색 기록에서 찾은 mapId: ${historyItem.mapId}") + // _myMenus를 해당 mapId로 필터링 + _myMenus.value = _myMenus.value?.filter { menu -> + menu.mapId == historyItem.mapId + } ?: emptyList() + + // 해당 mapId를 활성화 상태로 설정 + _activeMapId.value = historyItem.mapId + + // 지도에 검색 결과 표시 + showSearchResultOnMap() + // 메뉴 상세 정보를 바텀시트에 표시하기 위해 설정 - getMapDetail(menuId) + getMapDetail(historyItem.mapId) } }.onFailure { Log.d("SearchMenuViewModel", "메뉴 상세 조회 실패: ${it.message}") @@ -343,7 +350,7 @@ class SearchMenuViewModel @Inject constructor( // 지도에 검색 결과 핀 추가 fun showSearchResultOnMap() { clearMarkers() - myMenus.value?.forEach { store -> + _myMenus.value?.forEach { store -> addMarker(store, store.mapId == _activeMapId.value) Log.d( "SearchMenuViewModel", @@ -351,7 +358,7 @@ class SearchMenuViewModel @Inject constructor( ) } // 첫 번째 검색 결과로 카메라 이동 TODO: 현재 위치랑 가까운 결과로 이동 - myMenus.value?.get(0)?.let { moveCamera(it.mapY, it.mapX) } + _myMenus.value?.get(0)?.let { moveCamera(it.mapY, it.mapX) } } // 네이버맵 이동을 위한 가게명 조회 From 938ec5317e53faa1a8b1b34ef46828c9ab43b198 Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 18:54:20 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[FIX]:=20=ED=95=80=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/SearchMenuViewModel.kt | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 1f3f5da..29c9f6a 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -320,29 +320,34 @@ class SearchMenuViewModel @Inject constructor( fun getMapMenuDetail(menuId: Long) { viewModelScope.launch { - getMyMenus() - val response = mapRepository.getMapMenuDetail(menuId) - response.onSuccess { menuDetail -> - Log.d("SearchMenuViewModel", "메뉴 상세 조회 성공: $menuDetail") - // 검색 기록에서 해당 menuId를 가진 항목 찾기 - searchHistory.value?.find { it.menuId == menuId }?.let { historyItem -> - Log.d("SearchMenuViewModel", "검색 기록에서 찾은 mapId: ${historyItem.mapId}") - // _myMenus를 해당 mapId로 필터링 - _myMenus.value = _myMenus.value?.filter { menu -> - menu.mapId == historyItem.mapId - } ?: emptyList() - - // 해당 mapId를 활성화 상태로 설정 - _activeMapId.value = historyItem.mapId - - // 지도에 검색 결과 표시 - showSearchResultOnMap() - - // 메뉴 상세 정보를 바텀시트에 표시하기 위해 설정 - getMapDetail(historyItem.mapId) + // 먼저 전체 메뉴를 가져옴 + val myMenusResponse = mapRepository.getMap() + myMenusResponse.onSuccess { menus -> + if (menus != null){ + val allMenus = menus + val menuDetailResponse = mapRepository.getMapMenuDetail(menuId) + menuDetailResponse.onSuccess { menuDetail -> + Log.d("SearchMenuViewModel", "메뉴 상세 조회 성공: $menuDetail") + // 검색 기록에서 해당 menuId를 가진 항목 찾기 + searchHistory.value?.find { it.menuId == menuId }?.let { historyItem -> + Log.d("SearchMenuViewModel", "검색 기록에서 찾은 mapId: ${historyItem.mapId}") + // 가져온 전체 메뉴에서 필터링 + _myMenus.value = allMenus.filter { menu -> + menu.mapId == historyItem.mapId + } + // 해당 mapId를 활성화 상태로 설정 + _activeMapId.value = historyItem.mapId + // 지도에 검색 결과 표시 + showSearchResultOnMap() + // 메뉴 상세 정보를 바텀시트에 표시하기 위해 설정 + getMapDetail(historyItem.mapId) + } + }.onFailure { + Log.d("SearchMenuViewModel", "메뉴 상세 조회 실패: ${it.message}") + } } }.onFailure { - Log.d("SearchMenuViewModel", "메뉴 상세 조회 실패: ${it.message}") + Log.d("SearchMenuViewModel", "내 메뉴 조회 실패: ${it.message}") } } } @@ -350,15 +355,21 @@ class SearchMenuViewModel @Inject constructor( // 지도에 검색 결과 핀 추가 fun showSearchResultOnMap() { clearMarkers() - _myMenus.value?.forEach { store -> - addMarker(store, store.mapId == _activeMapId.value) - Log.d( - "SearchMenuViewModel", - "mapId: ${store.mapId} lat: (${store.mapY}, long: ${store.mapX})" - ) + _myMenus.value?.let { menus -> + if (menus.isNotEmpty()) { + menus.forEach { store -> + addMarker(store, store.mapId == _activeMapId.value) + Log.d( + "SearchMenuViewModel", + "mapId: ${store.mapId} lat: (${store.mapY}, long: ${store.mapX})" + ) + } + // 첫 번째 검색 결과로 카메라 이동 TODO: 현재 위치랑 가까운 결과로 이동 + moveCamera(menus[0].mapY, menus[0].mapX) + } else { + Log.d("SearchMenuViewModel", "검색 결과가 없습니다.") + } } - // 첫 번째 검색 결과로 카메라 이동 TODO: 현재 위치랑 가까운 결과로 이동 - _myMenus.value?.get(0)?.let { moveCamera(it.mapY, it.mapX) } } // 네이버맵 이동을 위한 가게명 조회 From d33991049ca74de926231682935fd7bb567d0459 Mon Sep 17 00:00:00 2001 From: casperjr Date: Wed, 20 Aug 2025 18:54:40 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[FIX]:=20=EA=B2=80=EC=83=89=20=ED=9B=84?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=EC=B0=BD=20=ED=8F=AC=EC=BB=A4=EC=8A=A4=20?= =?UTF-8?q?=ED=95=B4=EC=A0=9C=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index f212ed9..83920aa 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -195,6 +195,7 @@ fun SearchMenuScreen( // 크롤링 기록 아이템 클릭시 동작 viewModel.getMapMenuDetail(menuId) Log.d("SearchMenuScreen", "검색 기록 아이템 클릭: $menuId") + focusManager.clearFocus() showSearchBackground = false showBottomSheet = true } From 4b94e592f62e17b72c5cc9841f51884d538bd644 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 11:25:13 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[REFACTOR]:=20BottomSheet=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=ED=81=AC=EA=B8=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/bottomsheet/MenuInfoBottomSheetContent.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/common/bottomsheet/MenuInfoBottomSheetContent.kt b/app/src/main/java/com/kuit/ourmenu/ui/common/bottomsheet/MenuInfoBottomSheetContent.kt index a72e025..ada7594 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/common/bottomsheet/MenuInfoBottomSheetContent.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/common/bottomsheet/MenuInfoBottomSheetContent.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -137,14 +136,17 @@ fun MenuInfoImage( ) { val imgUrls = menuInfoData.menuImgUrls - Row(modifier = modifier, horizontalArrangement = Arrangement.SpaceBetween) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { for (i in 0 until 3) { Image( painter = if (i < imgUrls.size && imgUrls[i].isNotEmpty()) { rememberAsyncImagePainter( model = ImageRequest.Builder(LocalPlatformContext.current) .data(imgUrls[i]) - .size(104, 80) + .size(108, 80) .build() ) } else { @@ -152,10 +154,10 @@ fun MenuInfoImage( }, contentDescription = null, modifier = Modifier - .size(104.dp, 80.dp) + .weight(1f) + .height(80.dp) .clip(shape = RoundedCornerShape(8.dp)) ) -// if (i != 2) Spacer(modifier = Modifier.padding(end = 4.dp)) } } } From ba63d9f534d6325905aae28d1da6eec242ec3c07 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 11:47:56 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[FEAT]:=20=EB=A9=94=EB=89=B4=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=8B=9C=20=EA=B2=80=EC=83=89=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=A4=91=20=EC=B2=AB=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A3=BC=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 29c9f6a..780487f 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -275,7 +275,13 @@ class SearchMenuViewModel @Inject constructor( _myMenus.value = _myMenus.value?.filter { menu -> result.any { searchResult -> searchResult.mapId == menu.mapId} } ?: emptyList() + // 검색 결과의 첫 번째 항목을 활성화 상태로 설정 + _activeMapId.value = result.firstOrNull()?.mapId showSearchResultOnMap() + // 첫 번째 검색 결과의 상세 정보를 가져와서 바텀시트에 표시 + _activeMapId.value?.let { mapId -> + getMapDetail(mapId) + } } }.onFailure { Log.d("SearchMenuViewModel", "등록 메뉴 정보 조회 실패: ${it.message}") From e55c7ce03a98652b8ca251937edd40566f34aa11 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 11:59:06 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[FIX]:=20=EB=A9=94=EB=89=B4=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EB=90=9C=20=EC=83=81=ED=83=9C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=EC=8B=9C=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EA=B0=80?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=9D=B4=20=EC=95=84=EB=8B=88=EB=9D=BC=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94=20?= =?UTF-8?q?=ED=95=9C=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EB=8F=8C=EC=95=84?= =?UTF-8?q?=EA=B0=80=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/searchmenu/screen/SearchMenuScreen.kt | 15 ++++++++++----- .../searchmenu/viewmodel/SearchMenuViewModel.kt | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index 83920aa..61fb568 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -135,11 +135,16 @@ fun SearchMenuScreen( } } - BackHandler(enabled = showSearchBackground) { - if (searchBarFocused) focusManager.clearFocus() - searchActionDone = false - showSearchBackground = false - searchText = "" + BackHandler(enabled = showSearchBackground || showBottomSheet) { + if (showSearchBackground) { + if (searchBarFocused) focusManager.clearFocus() + searchActionDone = false + showSearchBackground = false + searchText = "" + } else if (showBottomSheet) { + showBottomSheet = false + viewModel.clearActiveMapId() + } } BottomSheetScaffold( diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 780487f..7046b1e 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -378,6 +378,12 @@ class SearchMenuViewModel @Inject constructor( } } + // 활성화된 맵 ID를 초기화하고 마커를 다시 그림 + fun clearActiveMapId() { + _activeMapId.value = null + refreshMarkers() + } + // 네이버맵 이동을 위한 가게명 조회 suspend fun getWebSearchQuery(mapId: Long): String { val baseUrl = "https://map.naver.com/p/search/" From cfceb91ae0deedaa266e3c31699b553c20d92699 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 12:11:36 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[FIX]:=20=EA=B2=80=EC=83=89=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=A1=B0=ED=9A=8C=20=ED=9B=84=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=EC=8B=9C=20=ED=95=80=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=20=EC=95=88=EB=90=98=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/SearchMenuViewModel.kt | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 7046b1e..8395227 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -271,16 +271,25 @@ class SearchMenuViewModel @Inject constructor( Log.d("SearchMenuViewModel", "등록 메뉴 정보 조회 성공: $result") // 검색 결과 저장 _searchResult.value = result - // _myMenu의 아이템 중 검색 _searchResult의 menuTitle과 일치하는 것들만 지도에 표시 - _myMenus.value = _myMenus.value?.filter { menu -> - result.any { searchResult -> searchResult.mapId == menu.mapId} - } ?: emptyList() - // 검색 결과의 첫 번째 항목을 활성화 상태로 설정 - _activeMapId.value = result.firstOrNull()?.mapId - showSearchResultOnMap() - // 첫 번째 검색 결과의 상세 정보를 가져와서 바텀시트에 표시 - _activeMapId.value?.let { mapId -> - getMapDetail(mapId) + + // 전체 메뉴 목록을 다시 가져온 후 필터링 + val allMenusResponse = mapRepository.getMap() + allMenusResponse.onSuccess { allMenus -> + if (allMenus != null) { + // 전체 메뉴 중에서 검색 결과와 일치하는 것들만 필터링 + _myMenus.value = allMenus.filter { menu -> + result.any { searchResult -> searchResult.mapId == menu.mapId } + } + + // 검색 결과의 첫 번째 항목을 활성화 상태로 설정 + _activeMapId.value = result.firstOrNull()?.mapId + showSearchResultOnMap() + + // 첫 번째 검색 결과의 상세 정보를 가져와서 바텀시트에 표시 + _activeMapId.value?.let { mapId -> + getMapDetail(mapId) + } + } } } }.onFailure { From 9d4780c9bffe13dd01fd8f150b3ffc407ebdde7a Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 12:12:00 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[FEAT]:=20=EA=B2=80=EC=83=89=20=ED=9B=84?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=EC=96=B4=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index 61fb568..d783326 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -248,6 +248,7 @@ fun SearchMenuScreen( showBottomSheet = false showSearchBackground = false } + searchText = "" } GoToMapButton( From 82fac6bb4f749ef748ab5ecdc0c682a03730d7a5 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 13:13:31 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[FIX]:=20bottomsheet=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt index d783326..2f642eb 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt @@ -86,8 +86,9 @@ fun SearchMenuScreen( val density = LocalDensity.current val singleItemHeight = 300.dp // Fixed height for each item - LaunchedEffect(menusOnPin) { - if (menusOnPin != null && menusOnPin?.isNotEmpty() == true) { + // 메뉴핀이 선택되었을 때 바텀시트 상태 변경 + LaunchedEffect(menusOnPin, activeMapId) { + if (activeMapId != null && menusOnPin != null && menusOnPin?.isNotEmpty() == true) { showBottomSheet = true } } From 9f6b258bcf2aaaaa4387f183e60035c3775253c5 Mon Sep 17 00:00:00 2001 From: casperjr Date: Fri, 29 Aug 2025 15:29:34 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[FIX]:=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=98=EC=98=81=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/searchmenu/viewmodel/SearchMenuViewModel.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt index 8395227..75fe229 100644 --- a/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt +++ b/app/src/main/java/com/kuit/ourmenu/ui/searchmenu/viewmodel/SearchMenuViewModel.kt @@ -280,15 +280,19 @@ class SearchMenuViewModel @Inject constructor( _myMenus.value = allMenus.filter { menu -> result.any { searchResult -> searchResult.mapId == menu.mapId } } - // 검색 결과의 첫 번째 항목을 활성화 상태로 설정 _activeMapId.value = result.firstOrNull()?.mapId showSearchResultOnMap() - // 첫 번째 검색 결과의 상세 정보를 가져와서 바텀시트에 표시 _activeMapId.value?.let { mapId -> getMapDetail(mapId) } + // 검색 결과를 검색 기록에 반영 + if (result.firstOrNull()?.menuId != null){ + mapRepository.getMapMenuDetail(result.first().menuId) + Log.d("SearchMenuViewModel", "검색 기록에 반영: ${result.first().menuId}") + } + } } } @@ -340,6 +344,7 @@ class SearchMenuViewModel @Inject constructor( myMenusResponse.onSuccess { menus -> if (menus != null){ val allMenus = menus + Log.d("SearchMenuViewModel", "menuId로 메뉴 정보 요청: $menuId") val menuDetailResponse = mapRepository.getMapMenuDetail(menuId) menuDetailResponse.onSuccess { menuDetail -> Log.d("SearchMenuViewModel", "메뉴 상세 조회 성공: $menuDetail")