Skip to content

Commit bc9f7a0

Browse files
authored
Merge pull request #41 from YAPP-Github/feature/#39-mypage_setting
[Feature/#39] 마이페이지/설정 화면 구현
2 parents 3dfc856 + cdaab58 commit bc9f7a0

File tree

14 files changed

+716
-0
lines changed

14 files changed

+716
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package com.threegap.bitnagil.presentation.mypage
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.clickable
6+
import androidx.compose.foundation.layout.Box
7+
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.Spacer
10+
import androidx.compose.foundation.layout.fillMaxSize
11+
import androidx.compose.foundation.layout.fillMaxWidth
12+
import androidx.compose.foundation.layout.height
13+
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.layout.size
15+
import androidx.compose.foundation.shape.CircleShape
16+
import androidx.compose.material3.HorizontalDivider
17+
import androidx.compose.material3.Text
18+
import androidx.compose.runtime.Composable
19+
import androidx.compose.runtime.collectAsState
20+
import androidx.compose.runtime.getValue
21+
import androidx.compose.ui.Alignment
22+
import androidx.compose.ui.Modifier
23+
import androidx.compose.ui.draw.clip
24+
import androidx.compose.ui.graphics.painter.ColorPainter
25+
import androidx.compose.ui.tooling.preview.Preview
26+
import androidx.compose.ui.unit.dp
27+
import androidx.hilt.navigation.compose.hiltViewModel
28+
import com.threegap.bitnagil.designsystem.BitnagilTheme
29+
import com.threegap.bitnagil.presentation.mypage.model.MyPageState
30+
31+
@Composable
32+
fun MyPageScreenContainer(
33+
myPageViewModel: MyPageViewModel = hiltViewModel(),
34+
navigateToSetting: () -> Unit,
35+
navigateToNotice: () -> Unit,
36+
navigateToQnA: () -> Unit,
37+
navigateToOnBoarding: () -> Unit,
38+
) {
39+
val state by myPageViewModel.stateFlow.collectAsState()
40+
41+
MyPageScreen(
42+
state = state,
43+
onClickSetting = navigateToSetting,
44+
onClickNotice = navigateToNotice,
45+
onClickResetOnBoarding = navigateToOnBoarding,
46+
onClickQnA = navigateToQnA,
47+
)
48+
}
49+
50+
@Composable
51+
private fun MyPageScreen(
52+
state: MyPageState,
53+
onClickSetting: () -> Unit,
54+
onClickNotice: () -> Unit,
55+
onClickResetOnBoarding: () -> Unit,
56+
onClickQnA: () -> Unit,
57+
) {
58+
Column(
59+
modifier = Modifier
60+
.fillMaxSize()
61+
.background(color = BitnagilTheme.colors.white),
62+
horizontalAlignment = Alignment.CenterHorizontally,
63+
) {
64+
Box(
65+
modifier = Modifier
66+
.height(54.dp)
67+
.fillMaxWidth(),
68+
) {
69+
Text(
70+
"마이페이지",
71+
modifier = Modifier.align(Alignment.Center),
72+
style = BitnagilTheme.typography.title3SemiBold,
73+
)
74+
75+
Box(
76+
modifier = Modifier
77+
.padding(end = 10.dp)
78+
.size(36.dp)
79+
.background(BitnagilTheme.colors.black)
80+
.align(Alignment.CenterEnd)
81+
.clickable(onClick = onClickSetting),
82+
)
83+
}
84+
85+
Spacer(modifier = Modifier.height(32.dp))
86+
87+
Image(
88+
painter = ColorPainter(BitnagilTheme.colors.coolGray98),
89+
contentDescription = null,
90+
modifier = Modifier
91+
.size(80.dp)
92+
.clip(shape = CircleShape),
93+
)
94+
95+
Text(
96+
state.name,
97+
style = BitnagilTheme.typography.title3SemiBold,
98+
modifier = Modifier.padding(top = 12.dp),
99+
)
100+
101+
Spacer(modifier = Modifier.height(28.dp))
102+
103+
HorizontalDivider(modifier = Modifier.height(6.dp), thickness = 6.dp, color = BitnagilTheme.colors.coolGray98)
104+
105+
Spacer(modifier = Modifier.height(16.dp))
106+
107+
Row(
108+
modifier = Modifier
109+
.height(48.dp)
110+
.clickable(onClick = onClickResetOnBoarding)
111+
.padding(start = 16.dp, end = 4.dp),
112+
verticalAlignment = Alignment.CenterVertically,
113+
) {
114+
Text(
115+
"내 목표 재설정",
116+
style = BitnagilTheme.typography.body1Regular,
117+
modifier = Modifier.weight(1f),
118+
)
119+
120+
Box(
121+
modifier = Modifier
122+
.padding(end = 10.dp)
123+
.size(36.dp)
124+
.background(BitnagilTheme.colors.black),
125+
)
126+
}
127+
128+
Row(
129+
modifier = Modifier
130+
.height(48.dp)
131+
.clickable(onClick = onClickNotice)
132+
.padding(start = 16.dp, end = 4.dp),
133+
verticalAlignment = Alignment.CenterVertically,
134+
) {
135+
Text(
136+
"공지사항",
137+
style = BitnagilTheme.typography.body1Regular,
138+
modifier = Modifier.weight(1f),
139+
)
140+
141+
Box(
142+
modifier = Modifier
143+
.padding(end = 10.dp)
144+
.size(36.dp)
145+
.background(BitnagilTheme.colors.black),
146+
)
147+
}
148+
149+
Row(
150+
modifier = Modifier
151+
.height(48.dp)
152+
.clickable(onClick = onClickQnA)
153+
.padding(start = 16.dp, end = 4.dp),
154+
verticalAlignment = Alignment.CenterVertically,
155+
) {
156+
Text(
157+
"자주 묻는 질문",
158+
style = BitnagilTheme.typography.body1Regular,
159+
modifier = Modifier.weight(1f),
160+
)
161+
162+
Box(
163+
modifier = Modifier
164+
.padding(end = 10.dp)
165+
.size(36.dp)
166+
.background(BitnagilTheme.colors.black),
167+
)
168+
}
169+
}
170+
}
171+
172+
@Preview
173+
@Composable
174+
fun MyPageScreenPreview() {
175+
BitnagilTheme {
176+
MyPageScreen(
177+
state = MyPageState(name = "이름", profileUrl = ""),
178+
onClickSetting = { },
179+
onClickNotice = { },
180+
onClickResetOnBoarding = { },
181+
onClickQnA = { },
182+
)
183+
}
184+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.threegap.bitnagil.presentation.mypage
2+
3+
import androidx.lifecycle.SavedStateHandle
4+
import androidx.lifecycle.viewModelScope
5+
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviViewModel
6+
import com.threegap.bitnagil.presentation.mypage.model.MyPageIntent
7+
import com.threegap.bitnagil.presentation.mypage.model.MyPageSideEffect
8+
import com.threegap.bitnagil.presentation.mypage.model.MyPageState
9+
import dagger.hilt.android.lifecycle.HiltViewModel
10+
import kotlinx.coroutines.launch
11+
import org.orbitmvi.orbit.syntax.simple.SimpleSyntax
12+
import javax.inject.Inject
13+
14+
@HiltViewModel
15+
class MyPageViewModel @Inject constructor(
16+
savedStateHandle: SavedStateHandle,
17+
) : MviViewModel<MyPageState, MyPageSideEffect, MyPageIntent>(
18+
MyPageState.Init,
19+
savedStateHandle,
20+
) {
21+
init {
22+
loadMyPageInfo()
23+
}
24+
25+
private fun loadMyPageInfo() {
26+
viewModelScope.launch {
27+
sendIntent(MyPageIntent.LoadMyPageSuccess(name = "이름", profileUrl = "profileUrl"))
28+
}
29+
}
30+
31+
override suspend fun SimpleSyntax<MyPageState, MyPageSideEffect>.reduceState(
32+
intent: MyPageIntent,
33+
state: MyPageState,
34+
): MyPageState {
35+
when (intent) {
36+
is MyPageIntent.LoadMyPageSuccess -> {
37+
return state.copy(
38+
name = intent.name,
39+
profileUrl = intent.profileUrl,
40+
)
41+
}
42+
}
43+
}
44+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.threegap.bitnagil.presentation.mypage.model
2+
3+
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviIntent
4+
5+
sealed class MyPageIntent : MviIntent {
6+
data class LoadMyPageSuccess(val name: String, val profileUrl: String) : MyPageIntent()
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.threegap.bitnagil.presentation.mypage.model
2+
3+
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect
4+
5+
sealed class MyPageSideEffect : MviSideEffect
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.threegap.bitnagil.presentation.mypage.model
2+
3+
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviState
4+
import kotlinx.parcelize.Parcelize
5+
6+
@Parcelize
7+
data class MyPageState(
8+
val name: String,
9+
val profileUrl: String,
10+
) : MviState {
11+
companion object {
12+
val Init = MyPageState(name = "", profileUrl = "")
13+
}
14+
}

0 commit comments

Comments
 (0)