Skip to content

Commit 4e29b1e

Browse files
authored
Merge pull request #73 from casper-jr/feat/mapsearch
[FEAT] 지도 메뉴에서의 등록된 메뉴 조회 기능 구현
2 parents f6be374 + 21b2707 commit 4e29b1e

9 files changed

Lines changed: 236 additions & 76 deletions

File tree

app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapDetailResponse.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ data class MapDetailResponse(
1111
val menuTitle: String,
1212
@SerialName("menuPrice")
1313
val menuPrice: Int,
14-
@SerialName("menuPin")
15-
val menuPin: String,
16-
@SerialName("menuTags")
17-
val menuTags: List<String>,
14+
@SerialName("menuPinImgUrl")
15+
val menuPinImgUrl: String,
16+
@SerialName("menuTagImgUrls")
17+
val menuTagImgUrls: List<String>,
1818
@SerialName("menuImgUrls")
1919
val menuImgUrls: List<String>,
2020
@SerialName("menuFolderInfo")
@@ -31,8 +31,8 @@ data class MapDetailResponse(
3131
data class MenuFolderInfo(
3232
@SerialName("menuFolderTitle")
3333
val menuFolderTitle: String,
34-
@SerialName("menuFolderIcon")
35-
val menuFolderIcon: String,
34+
@SerialName("menuFolderIconImgUrl")
35+
val menuFolderIconImgUrl: String,
3636
@SerialName("menuFolderCount")
3737
val menuFolderCount: Int
3838
)

app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapMenuDetailResponse.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ data class MapMenuDetailResponse(
1111
val menuTitle: String,
1212
@SerialName("menuPrice")
1313
val menuPrice: Int,
14-
@SerialName("menuPin")
15-
val menuPin: String,
16-
@SerialName("menuTags")
17-
val menuTags: List<String>,
14+
@SerialName("menuPinImgUrl")
15+
val menuPinImgUrl: String,
16+
@SerialName("menuTagImgUrls")
17+
val menuTagImgUrls: List<String>,
1818
@SerialName("menuImgUrls")
1919
val menuImgUrls: List<String>,
2020
@SerialName("menuFolderInfo")

app/src/main/java/com/kuit/ourmenu/data/model/map/response/MapResponse.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import kotlinx.serialization.Serializable
77
data class MapResponse(
88
@SerialName("mapId")
99
val mapId: Long,
10-
@SerialName("menuPins")
11-
val menuPins: List<String>,
10+
@SerialName("menuPinImgUrl")
11+
val menuPinImgUrl: String,
12+
@SerialName("menuPinDisableImgUrl")
13+
val menuPinDisableImgUrl: String,
1214
@SerialName("mapX")
1315
val mapX: Double,
1416
@SerialName("mapY")

app/src/main/java/com/kuit/ourmenu/data/service/MapService.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ interface MapService {
1818
@GET("api/users/menus/{mapId}/maps")
1919
suspend fun getMapDetail(
2020
@Path("mapId") mapId: Long
21-
): BaseResponse<List<MapDetailResponse>>
21+
): BaseResponse<List<MapDetailResponse>> // TODO: 리팩토링
2222

2323
@GET("api/users/menus/maps")
24-
suspend fun getMap(): BaseResponse<List<MapResponse>>
24+
suspend fun getMap(): BaseResponse<List<MapResponse>> // TODO: 리팩토링
2525

2626
@GET("api/users/menus/maps/{menuId}/search")
2727
suspend fun getMapMenuDetail(
2828
@Path("menuId") menuId: Long
29-
): BaseResponse<MapMenuDetailResponse>
29+
): BaseResponse<MapMenuDetailResponse> // TODO: 리팩토링
3030

3131
@GET("api/users/menus/maps/search")
3232
suspend fun getMapSearch(

app/src/main/java/com/kuit/ourmenu/ui/common/bottomsheet/MenuInfoBottomSheetContent.kt

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Column
77
import androidx.compose.foundation.layout.ExperimentalLayoutApi
88
import androidx.compose.foundation.layout.FlowRow
99
import androidx.compose.foundation.layout.Row
10-
import androidx.compose.foundation.layout.Spacer
1110
import androidx.compose.foundation.layout.fillMaxWidth
1211
import androidx.compose.foundation.layout.height
1312
import androidx.compose.foundation.layout.padding
@@ -18,6 +17,7 @@ import androidx.compose.runtime.Composable
1817
import androidx.compose.ui.Alignment
1918
import androidx.compose.ui.Modifier
2019
import androidx.compose.ui.draw.clip
20+
import androidx.compose.ui.layout.ContentScale
2121
import androidx.compose.ui.res.painterResource
2222
import androidx.compose.ui.tooling.preview.Preview
2323
import androidx.compose.ui.unit.dp
@@ -29,7 +29,6 @@ import com.kuit.ourmenu.R
2929
import com.kuit.ourmenu.data.model.map.response.MapDetailResponse
3030
import com.kuit.ourmenu.data.model.map.response.MenuFolderInfo
3131
import com.kuit.ourmenu.ui.common.chip.MenuFolderChip
32-
import com.kuit.ourmenu.ui.common.chip.TagChip
3332
import com.kuit.ourmenu.ui.theme.Neutral500
3433
import com.kuit.ourmenu.ui.theme.Neutral700
3534
import com.kuit.ourmenu.ui.theme.Neutral900
@@ -64,7 +63,7 @@ fun MenuInfoBottomSheetContent(
6463
MenuInfoTagContent(
6564
modifier = Modifier
6665
.fillMaxWidth(),
67-
menuTags = menuInfoData.menuTags
66+
menuTags = menuInfoData.menuTagImgUrls
6867
)
6968
}
7069
}
@@ -87,7 +86,9 @@ fun MenuInfoContent(
8786
.align(Alignment.CenterStart)
8887
) {
8988
Text(
90-
text = menuInfoData.menuTitle,
89+
text = with(menuInfoData.menuTitle) {
90+
if (length > 10) take(10) + "..." else this
91+
},
9192
style = ourMenuTypography().pretendard_700_20.copy(
9293
lineHeight = 32.sp,
9394
color = Neutral900,
@@ -108,11 +109,12 @@ fun MenuInfoContent(
108109
MenuFolderChip(
109110
modifier = Modifier
110111
.align(Alignment.CenterEnd),
112+
menuFolderIconImgUrl = menuInfoData.menuFolderInfo.menuFolderIconImgUrl,
111113
menuFolderTitle = menuFolderTitle
112114
)
113115
}
114116
Text(
115-
text = menuInfoData.menuFolderInfo.menuFolderTitle,
117+
text = "응답에 가게명 누락", // TODO: 가게명 처리
116118
style = ourMenuTypography().pretendard_600_14.copy(
117119
lineHeight = 12.sp,
118120
color = Neutral500
@@ -159,17 +161,21 @@ fun MenuInfoTagContent(
159161
) {
160162
FlowRow(modifier = modifier) {
161163
menuTags.forEach { tag ->
162-
TagChip(
163-
modifier = Modifier.padding(
164-
top = 4.dp,
165-
),
166-
tagIcon = R.drawable.ic_tag_rice, // TODO: Get appropriate icon based on tag
167-
tagName = tag,
168-
enabled = false,
169-
selected = true,
170-
onClick = { }
164+
val painter = rememberAsyncImagePainter(
165+
model = ImageRequest.Builder(LocalPlatformContext.current)
166+
.data(tag)
167+
.size(96, 32)
168+
.build()
169+
)
170+
171+
Image(
172+
painter = painter,
173+
contentDescription = null,
174+
modifier = Modifier
175+
.height(32.dp)
176+
.padding(top = 4.dp, end = 4.dp),
177+
contentScale = ContentScale.FillHeight
171178
)
172-
Spacer(modifier = Modifier.padding(end = 4.dp))
173179
}
174180
}
175181
}
@@ -182,12 +188,12 @@ private fun MenuInfoBottomSheetContentPreview() {
182188
menuId = 1,
183189
menuTitle = "Test Menu",
184190
menuPrice = 10000,
185-
menuPin = "pin",
186-
menuTags = listOf("한식", ""),
191+
menuPinImgUrl = "pin",
192+
menuTagImgUrls = listOf("한식", ""),
187193
menuImgUrls = listOf(),
188194
menuFolderInfo = MenuFolderInfo(
189195
menuFolderTitle = "Test Store",
190-
menuFolderIcon = "icon",
196+
menuFolderIconImgUrl = "icon",
191197
menuFolderCount = 1
192198
),
193199
mapId = 1,

app/src/main/java/com/kuit/ourmenu/ui/menuinfo/screen/MenuInfoMapScreen.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ fun MenuInfoMapScreen(navController: NavController) {
6565
menuId = 1,
6666
menuTitle = "Test Menu",
6767
menuPrice = 10000,
68-
menuPin = "pin",
69-
menuTags = listOf("한식", ""),
68+
menuPinImgUrl = "pin",
69+
menuTagImgUrls = listOf("한식", ""),
7070
menuImgUrls = listOf(),
7171
menuFolderInfo = MenuFolderInfo(
7272
menuFolderTitle = "Test Store",
73-
menuFolderIcon = "icon",
73+
menuFolderIconImgUrl = "icon",
7474
menuFolderCount = 1
7575
),
7676
mapId = 1,

app/src/main/java/com/kuit/ourmenu/ui/searchmenu/component/SearchBottomSheetContent.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ private fun SearchBottomSheetContentPreview() {
4040
menuId = 1,
4141
menuTitle = "Test Menu",
4242
menuPrice = 10000,
43-
menuPin = "pin",
44-
menuTags = listOf("한식", ""),
43+
menuPinImgUrl = "pin",
44+
menuTagImgUrls = listOf("한식", ""),
4545
menuImgUrls = listOf(),
4646
menuFolderInfo = MenuFolderInfo(
4747
menuFolderTitle = "Test Store",
48-
menuFolderIcon = "icon",
48+
menuFolderIconImgUrl = "icon",
4949
menuFolderCount = 1
5050
),
5151
mapId = 1,

app/src/main/java/com/kuit/ourmenu/ui/searchmenu/screen/SearchMenuScreen.kt

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.kuit.ourmenu.ui.searchmenu.screen
22

3+
import android.Manifest
34
import android.util.Log
45
import androidx.activity.compose.BackHandler
56
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -25,12 +26,14 @@ import androidx.compose.runtime.setValue
2526
import androidx.compose.ui.Alignment
2627
import androidx.compose.ui.Modifier
2728
import androidx.compose.ui.layout.onGloballyPositioned
29+
import androidx.compose.ui.platform.LocalContext
2830
import androidx.compose.ui.platform.LocalDensity
2931
import androidx.compose.ui.platform.LocalFocusManager
3032
import androidx.compose.ui.tooling.preview.Preview
3133
import androidx.compose.ui.unit.dp
3234
import androidx.compose.ui.viewinterop.AndroidView
3335
import androidx.hilt.navigation.compose.hiltViewModel
36+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3437
import com.kuit.ourmenu.R
3538
import com.kuit.ourmenu.ui.common.GoToMapButton
3639
import com.kuit.ourmenu.ui.common.SearchTextField
@@ -42,6 +45,7 @@ import com.kuit.ourmenu.ui.searchmenu.component.SearchHistoryList
4245
import com.kuit.ourmenu.ui.searchmenu.model.SearchHistoryData
4346
import com.kuit.ourmenu.ui.searchmenu.viewmodel.SearchMenuViewModel
4447
import com.kuit.ourmenu.ui.theme.NeutralWhite
48+
import com.kuit.ourmenu.utils.PermissionHandler
4549
import kotlinx.coroutines.launch
4650

4751
@OptIn(ExperimentalMaterial3Api::class)
@@ -61,7 +65,9 @@ fun SearchMenuScreen(
6165
val interactionSource = remember { MutableInteractionSource() }
6266
val searchBarFocused by interactionSource.collectIsFocusedAsState()
6367
val focusManager = LocalFocusManager.current
64-
68+
val context = LocalContext.current
69+
val locationPermissionGranted by viewModel.locationPermissionGranted.collectAsStateWithLifecycle()
70+
6571
// 지도 중심 좌표
6672
val currentCenter by viewModel.currentCenter.collectAsState()
6773

@@ -80,11 +86,34 @@ fun SearchMenuScreen(
8086
}
8187
}
8288

89+
// 권한 허용이 안된 경우 권한 요청
90+
if (!locationPermissionGranted) {
91+
PermissionHandler(
92+
permission = Manifest.permission.ACCESS_FINE_LOCATION,
93+
rationaleMessage = "Location permission is required to show your current location on the map",
94+
onPermissionGranted = {
95+
viewModel.updateLocationPermission(true)
96+
},
97+
onPermissionDenied = {
98+
viewModel.updateLocationPermission(false)
99+
}
100+
)
101+
}
102+
83103
val mapView = mapViewWithLifecycle(
84104
mapController = viewModel.mapController
85105
) { kakaoMap ->
86106
// viewModel에서 kakaoMap을 초기화
87-
viewModel.initializeMap(kakaoMap)
107+
viewModel.initializeMap(kakaoMap, context)
108+
}
109+
110+
// permission 여부 변한 경우에 발생
111+
LaunchedEffect(locationPermissionGranted) {
112+
if (locationPermissionGranted) {
113+
viewModel.mapController.kakaoMap.value?.let { kakaoMap ->
114+
viewModel.initializeMap(kakaoMap, context)
115+
}
116+
}
88117
}
89118

90119
LaunchedEffect(searchBarFocused) {

0 commit comments

Comments
 (0)