Skip to content

Commit a529b0f

Browse files
committed
feat/#78: homeregionsetting UI , navigaiton 수정
1 parent 767caf4 commit a529b0f

File tree

5 files changed

+102
-29
lines changed

5 files changed

+102
-29
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.paw.key.domain.model.entity.home
2+
3+
data class HomeRegionDataEntity(
4+
val success: Boolean = true
5+
)

app/src/main/java/com/paw/key/presentation/ui/home/HomeLocationSettingScreen.kt

Lines changed: 60 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.paw.key.presentation.ui.home
22

3+
import android.util.Log
34
import androidx.compose.foundation.layout.Box
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.PaddingValues
@@ -31,6 +32,8 @@ import com.paw.key.core.util.noRippleClickable
3132
import com.paw.key.presentation.ui.home.viewmodel.HomeViewModel
3233
import com.paw.key.presentation.ui.signup.component.FormField
3334
import com.paw.key.presentation.ui.signup.component.LocationButton
35+
import com.paw.key.presentation.ui.signup.component.LocationItem
36+
import com.paw.key.presentation.ui.signup.component.LocationItemList
3437
import com.paw.key.presentation.ui.signup.component.LocationList
3538
import com.paw.key.presentation.ui.signup.component.SignUpHeader
3639
import com.paw.key.presentation.ui.signup.viewmodel.SignUpViewModel
@@ -52,7 +55,7 @@ private fun PreviewHomeLocationSettingScreen() {
5255
fun HomeLocationSettingRoute(
5356
paddingValues: PaddingValues,
5457
navigateUp: () -> Unit,
55-
navigateNext: () -> Unit,
58+
navigateNext: (Int) -> Unit,
5659
navigateHomeLocationSetting: () -> Unit,
5760
modifier: Modifier = Modifier,
5861
) {
@@ -70,31 +73,47 @@ fun HomeLocationSettingRoute(
7073
fun HomeLocationSettingScreen(
7174
paddingValues: PaddingValues,
7275
navigateUp: () -> Unit,
73-
navigateNext: () -> Unit,
76+
navigateNext: (Int) -> Unit,
7477
navigateHomeLocationSetting: () -> Unit,
7578
modifier: Modifier = Modifier,
7679
viewModel: HomeViewModel = hiltViewModel(),
7780
) {
7881
val state by viewModel.state.collectAsStateWithLifecycle()
82+
val regionList by viewModel.regionList.collectAsStateWithLifecycle()
83+
84+
val selectedGu = state.selectedGu
85+
val selectedDong = state.selectedDong
86+
87+
// 구 옵션들 (서버에서 받아온 구 리스트)
88+
val guOptions = regionList.map { it.gu.name }
89+
90+
// 선택된 구에 해당하는 동 옵션들
91+
val dongOptions = if (selectedGu.isNotEmpty()) {
92+
regionList.find { it.gu.name == selectedGu }?.dongs?.map {
93+
LocationItem(id = it.id, name = it.name)
94+
} ?: emptyList()
95+
} else {
96+
emptyList()
97+
}
7998

8099
Column(
81100
modifier = modifier
82101
.fillMaxSize()
102+
.padding(paddingValues)
83103
.padding(horizontal = 16.dp)
84104
) {
105+
// 헤더
85106
Row(
86107
modifier = Modifier
87108
.fillMaxWidth()
88109
.height(60.dp)
89110
.padding(vertical = 16.dp),
90111
verticalAlignment = Alignment.CenterVertically
91-
)
92-
{
112+
) {
93113
Icon(
94114
imageVector = ImageVector.vectorResource(R.drawable.ic_arrow_left_black),
95115
contentDescription = "뒤로가기",
96-
modifier = Modifier
97-
.noRippleClickable { navigateUp() }
116+
modifier = Modifier.noRippleClickable { navigateUp() }
98117
)
99118
Box(
100119
modifier = Modifier.weight(1f),
@@ -110,49 +129,65 @@ fun HomeLocationSettingScreen(
110129

111130
Spacer(modifier = Modifier.height(27.dp))
112131

132+
// 지역구 섹션 - 처음부터 모든 구 칩들을 보여줌
113133
FormField(
114134
label = stringResource(id = R.string.ic_onboarding_signup_main_location),
115135
content = {
116-
LocationButton(
117-
isEnable = state.isLocationMenuVisible,
118-
location = "강남구",
119-
onClick = { viewModel.toggleLocationMenu() }
136+
LocationList(
137+
selected = selectedGu,
138+
locations = guOptions,
139+
onLocationSelected = { guName ->
140+
val selectedGuItem = regionList.find { it.gu.name == guName }
141+
selectedGuItem?.let {
142+
viewModel.onGuSelected(it.gu.name, it.gu.id)
143+
}
144+
}
120145
)
121146
}
122147
)
123148

124149
Spacer(modifier = Modifier.height(46.dp))
125150

126-
FormField(
127-
label = stringResource(id = R.string.ic_onboarding_signup_sub_location),
128-
content = {
129-
if (state.isLocationMenuVisible) {
130-
LocationList(
131-
selected = state.selectedLocation,
132-
locations = listOf("개포동", "논현동", "뭔동", "동동동", "스꾸삐", "4글자유"),
133-
onLocationSelected = { location ->
134-
viewModel.selectLocation(location)
151+
// 동 선택 섹션 (구가 선택되었을 때만 표시)
152+
if (selectedGu.isNotEmpty()) {
153+
FormField(
154+
label = stringResource(id = R.string.ic_onboarding_signup_sub_location),
155+
content = {
156+
LocationItemList(
157+
selected = selectedDong,
158+
locations = dongOptions,
159+
onLocationSelected = { locationItem ->
160+
viewModel.onDongSelected(locationItem.name, locationItem.id)
135161
}
136162
)
137163
}
138-
}
139-
)
164+
)
165+
}
140166

141167
Spacer(modifier = Modifier.weight(1f))
142168

143-
val isFormValid = state.selectedLocation.isNotEmpty()
169+
// 완료 버튼
170+
val isFormValid = selectedGu.isNotEmpty() && selectedDong.isNotEmpty()
144171

145172
PawkeyButton(
146173
text = stringResource(id = R.string.ic_onboarding_signup_button),
147174
enabled = isFormValid,
148175
onClick = {
149176
if (isFormValid) {
150-
navigateNext()
177+
viewModel.patchRegion(
178+
userId = 2,
179+
onSuccess = {
180+
val selectedDongId = state.selectedDongId
181+
navigateNext(selectedDongId)
182+
},
183+
onFailure = { message ->
184+
Log.e("HomeScreen", "지역 설정 실패: $message")
185+
}
186+
)
151187
}
152188
}
153189
)
154190

155191
Spacer(modifier = Modifier.height(46.dp))
156192
}
157-
}
158-
193+
}

app/src/main/java/com/paw/key/presentation/ui/home/navigation/HomeLocationSettingNavigation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fun NavController.navigateHomeLocationSetting(
2020
fun NavGraphBuilder.homeLocationSettingNavGraph(
2121
paddingValues: PaddingValues,
2222
navigateUp: () -> Unit,
23-
navigateNext: () -> Unit,
23+
navigateNext: (Int) -> Unit,
2424
navigateHomeLocationSetting: () -> Unit,
2525
modifier: Modifier = Modifier
2626
) {

app/src/main/java/com/paw/key/presentation/ui/signup/component/LocationList.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import androidx.compose.ui.tooling.preview.Preview
1010
import androidx.compose.ui.unit.dp
1111
import com.paw.key.core.designsystem.theme.PawKeyTheme
1212

13+
// LocationItem 데이터 클래스 추가
14+
data class LocationItem(
15+
val id: Int,
16+
val name: String
17+
)
18+
1319
@Preview(showBackground = true)
1420
@Composable
1521
private fun PreviewLocationList() {
@@ -22,6 +28,7 @@ private fun PreviewLocationList() {
2228
}
2329
}
2430

31+
// 기존 String 버전 (구 선택용)
2532
@OptIn(ExperimentalLayoutApi::class)
2633
@Composable
2734
fun LocationList(
@@ -48,3 +55,29 @@ fun LocationList(
4855
}
4956
}
5057

58+
// LocationItem 버전 (동 선택용)
59+
@OptIn(ExperimentalLayoutApi::class)
60+
@Composable
61+
fun LocationItemList(
62+
locations: List<LocationItem>,
63+
selected: String,
64+
onLocationSelected: (LocationItem) -> Unit,
65+
modifier: Modifier = Modifier,
66+
) {
67+
FlowRow(
68+
modifier = modifier.fillMaxWidth(),
69+
horizontalArrangement = Arrangement.spacedBy(8.dp),
70+
verticalArrangement = Arrangement.spacedBy(12.dp),
71+
maxItemsInEachRow = 3
72+
) {
73+
locations.forEach { locationItem ->
74+
LocationButton(
75+
location = locationItem.name,
76+
isEnable = locationItem.name == selected,
77+
onClick = {
78+
onLocationSelected(locationItem)
79+
}
80+
)
81+
}
82+
}
83+
}

app/src/main/java/com/paw/key/presentation/ui/signup/viewmodel/SignUpViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import com.google.gson.Gson
1010
import com.paw.key.data.dto.request.onboarding.OnboardingInfoRequest
1111
import com.paw.key.data.dto.request.onboarding.PetInfoDto
1212
import com.paw.key.data.dto.request.onboarding.PetTraitDto
13-
import com.paw.key.domain.repository.OnboardingInfoRepository
14-
import com.paw.key.domain.repository.OnboardingRegionRepository
15-
import com.paw.key.domain.repository.OnboardingRepository
13+
import com.paw.key.domain.repository.onboarding.OnboardingInfoRepository
14+
import com.paw.key.domain.repository.onboarding.OnboardingRegionRepository
15+
import com.paw.key.domain.repository.onboarding.OnboardingRepository
1616
import com.paw.key.presentation.ui.signup.state.SignUpContract
1717
import dagger.hilt.android.lifecycle.HiltViewModel
1818
import kotlinx.coroutines.flow.MutableSharedFlow

0 commit comments

Comments
 (0)