Skip to content

Commit 24b2c46

Browse files
authored
Merge pull request #69 from Nexters/fix/join-gathering-screen
모임 참여 화면에 변경된 디자인을 적용하고 비로그인시 로그인 화면으로 이동합니다.
2 parents 7043354 + 058684d commit 24b2c46

File tree

11 files changed

+110
-98
lines changed

11 files changed

+110
-98
lines changed
3.48 KB
Loading
352 KB
Loading

core/network/src/main/java/com/plottwist/core/network/interceptor/TokenInterceptor.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,25 @@ class TokenInterceptor @Inject constructor(
4444
HttpURLConnection.HTTP_UNAUTHORIZED -> {
4545
val retryRequest = chain.request().newBuilder().apply {
4646
runBlocking {
47-
tokenProvider.getRefreshToken()?.let {
48-
val newToken = authApiService.refreshToken(TokenRequest(it))
49-
if (newToken.success) {
50-
newToken.data.let { token ->
51-
addHeader("Authorization", "Bearer ${token.accessToken}")
52-
CoroutineScope(Dispatchers.IO).launch {
53-
tokenProvider.setAccessToken(token.accessToken)
54-
tokenProvider.setRefreshToken(token.refreshToken)
47+
val accessToken = tokenProvider.getAccessToken()
48+
val refreshToken = tokenProvider.getRefreshToken()
49+
if(accessToken.isNullOrEmpty() && refreshToken.isNullOrEmpty()){
50+
return@runBlocking
51+
}
52+
refreshToken?.let {
53+
try {
54+
val newToken = authApiService.refreshToken(TokenRequest(it))
55+
if (newToken.success) {
56+
newToken.data.let { token ->
57+
addHeader("Authorization", "Bearer ${token.accessToken}")
58+
CoroutineScope(Dispatchers.IO).launch {
59+
tokenProvider.setAccessToken(token.accessToken)
60+
tokenProvider.setRefreshToken(token.refreshToken)
61+
}
5562
}
5663
}
64+
} catch (e: Exception) {
65+
return@let
5766
}
5867
}
5968
}

feature/join_gathering/src/main/java/com/plottwist/join_gathering/JoinGatheringContract.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ sealed class JoinGatheringAction {
1212
sealed class JoinGatheringSideEffect {
1313
data class NavigateToGatheringDetail(val gatheringId: Long) : JoinGatheringSideEffect()
1414
data class ShowSnackbar(val message: String) : JoinGatheringSideEffect()
15+
data object NavigateToLoginScreen :JoinGatheringSideEffect()
1516
}
Lines changed: 75 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package com.plottwist.join_gathering
22

3-
import androidx.compose.foundation.layout.Arrangement
3+
import android.annotation.SuppressLint
44
import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.Column
66
import androidx.compose.foundation.layout.PaddingValues
7-
import androidx.compose.foundation.layout.Row
8-
import androidx.compose.foundation.layout.Spacer
97
import androidx.compose.foundation.layout.aspectRatio
108
import androidx.compose.foundation.layout.fillMaxSize
119
import androidx.compose.foundation.layout.fillMaxWidth
1210
import androidx.compose.foundation.layout.height
11+
import androidx.compose.foundation.layout.imePadding
1312
import androidx.compose.foundation.layout.padding
13+
import androidx.compose.foundation.layout.requiredWidth
1414
import androidx.compose.foundation.shape.RoundedCornerShape
1515
import androidx.compose.material3.Button
1616
import androidx.compose.material3.ButtonDefaults
1717
import androidx.compose.material3.IconButton
1818
import androidx.compose.material3.MaterialTheme
19+
import androidx.compose.material3.Scaffold
1920
import androidx.compose.material3.SnackbarDuration
2021
import androidx.compose.material3.SnackbarHost
2122
import androidx.compose.material3.SnackbarHostState
@@ -27,35 +28,38 @@ import androidx.compose.runtime.remember
2728
import androidx.compose.runtime.rememberCoroutineScope
2829
import androidx.compose.ui.Alignment
2930
import androidx.compose.ui.Modifier
31+
import androidx.compose.ui.draw.BlurredEdgeTreatment
32+
import androidx.compose.ui.draw.blur
33+
import androidx.compose.ui.draw.drawWithContent
3034
import androidx.compose.ui.graphics.Color
35+
import androidx.compose.ui.graphics.drawscope.clipRect
3136
import androidx.compose.ui.layout.ContentScale
32-
import androidx.compose.ui.text.TextStyle
33-
import androidx.compose.ui.text.font.FontWeight
37+
import androidx.compose.ui.platform.LocalConfiguration
3438
import androidx.compose.ui.text.style.TextAlign
3539
import androidx.compose.ui.tooling.preview.Preview
3640
import androidx.compose.ui.unit.dp
37-
import androidx.compose.ui.unit.sp
3841
import androidx.hilt.navigation.compose.hiltViewModel
3942
import androidx.lifecycle.compose.collectAsStateWithLifecycle
43+
import com.plottwist.core.designsystem.R
4044
import com.plottwist.core.designsystem.component.TukTopAppBar
41-
import com.plottwist.core.designsystem.foundation.TukColorTokens.Gray300
42-
import com.plottwist.core.designsystem.foundation.TukColorTokens.Gray500
43-
import com.plottwist.core.designsystem.foundation.TukColorTokens.Gray700
4445
import com.plottwist.core.designsystem.foundation.TukPrimitivesColor
4546
import com.plottwist.core.designsystem.foundation.type.TukSerifTypography
4647
import com.plottwist.core.ui.component.StableImage
47-
import com.plottwist.core.ui.component.TukScaffold
48+
import com.plottwist.core.ui.component.TukScaffoldTitle
4849
import kotlinx.coroutines.launch
4950

51+
@SuppressLint("ConfigurationScreenWidthHeight")
5052
@Composable
5153
fun JoinGatheringScreen(
5254
onCloseClicked: () -> Unit = {},
5355
onNavigateToGatheringDetail: (Long) -> Unit,
56+
onNavigateToLoginScreen: () -> Unit,
5457
viewModel: JoinGatheringViewModel = hiltViewModel()
5558
) {
5659
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
5760
val snackbarHostState = remember { SnackbarHostState() }
5861
val coroutineScope = rememberCoroutineScope()
62+
val localConfiguration = LocalConfiguration.current
5963

6064
LaunchedEffect(Unit) {
6165
viewModel.container.sideEffectFlow.collect { sideEffect ->
@@ -71,6 +75,10 @@ fun JoinGatheringScreen(
7175
)
7276
}
7377
}
78+
79+
JoinGatheringSideEffect.NavigateToLoginScreen -> {
80+
onNavigateToLoginScreen()
81+
}
7482
}
7583

7684
}
@@ -79,113 +87,89 @@ fun JoinGatheringScreen(
7987
Box(
8088
modifier = Modifier
8189
) {
90+
8291
StableImage(
8392
modifier = Modifier
84-
.fillMaxWidth()
85-
.align(Alignment.BottomEnd),
86-
drawableResId = R.drawable.image_join_gathering_gradient,
93+
.fillMaxWidth() .requiredWidth(
94+
localConfiguration.screenWidthDp.dp * GRADIENT_BACKGROUND_IMAGE_SCALE
95+
),
96+
drawableResId = R.drawable.image_home_gradient,
8797
contentScale = ContentScale.FillWidth
8898
)
8999

90-
TukScaffold (
91-
containerColor = Color.Transparent,
92-
snackbarHost = {
93-
SnackbarHost(
94-
hostState = snackbarHostState
95-
)
96-
},
100+
Scaffold(
101+
modifier = Modifier
102+
.fillMaxSize()
103+
.imePadding(),
97104
topBar = {
98105
JoinGatheringAppBar(
99106
onCloseClicked = onCloseClicked
100107
)
101108
},
102-
title = "모임에\n참여하시겠어요?",
103109
bottomBar = {
104110
JoinGatheringButton(
105111
onClick = {
106112
viewModel.handleAction(JoinGatheringAction.ClickJoin)
107113
}
108114
)
109-
}
110-
) {
111-
item {
115+
},
116+
snackbarHost = {
117+
SnackbarHost(
118+
hostState = snackbarHostState
119+
)
120+
},
121+
containerColor = Color.Transparent
122+
) { innerPadding ->
123+
Column (
124+
modifier = Modifier
125+
.fillMaxSize()
126+
.padding(innerPadding)
127+
) {
128+
TukScaffoldTitle(
129+
title = "모임에\n참여하시겠어요?",
130+
modifier = Modifier.padding(horizontal = 20.dp)
131+
)
112132
JoinGatheringContent(
113133
modifier = Modifier
114-
.fillMaxWidth()
115-
.padding(vertical = 60.dp),
116-
gatheringName = state.gatheringName
134+
.fillMaxWidth(),
135+
gatheringName = state.gatheringName,
136+
screenWidth = localConfiguration.screenWidthDp.toFloat(),
137+
screenHeight = localConfiguration.screenHeightDp.toFloat()
117138
)
118139
}
119140
}
120-
121141
}
122142
}
123143

124144
@Composable
125145
fun JoinGatheringContent(
126146
gatheringName: String,
147+
screenWidth : Float,
148+
screenHeight: Float,
127149
modifier: Modifier
128150
) {
129151
Box(
130-
modifier = Modifier
131-
.fillMaxWidth()
132-
.aspectRatio(288f / 349f),
152+
modifier = Modifier.fillMaxSize(),
153+
contentAlignment = Alignment.Center
133154
) {
134-
StableImage(
135-
modifier = Modifier
136-
.fillMaxSize()
137-
.padding(horizontal = 10.dp),
138-
drawableResId = R.drawable.image_join_gathering_card
139-
)
140-
141155
Box(
142-
modifier = Modifier
156+
Modifier
143157
.fillMaxWidth()
144-
.padding(24.dp)
145158
) {
146159
StableImage(
147-
modifier = Modifier.fillMaxSize(),
148-
drawableResId = R.drawable.image_join_gathering_card,
149-
contentScale = ContentScale.FillBounds
150-
)
151-
152-
Column(
153160
modifier = Modifier
154-
.fillMaxSize()
155-
.padding(horizontal = 24.dp, vertical = 36.dp),
156-
verticalArrangement = Arrangement.SpaceBetween
157-
) {
158-
Box(
159-
modifier = Modifier
160-
.fillMaxWidth()
161-
.padding(top = 63.dp),
162-
contentAlignment = Alignment.Center
163-
) {
164-
Text(
165-
text = gatheringName,
166-
textAlign = TextAlign.Center,
167-
style = TukSerifTypography.title22M
168-
)
169-
}
161+
.fillMaxWidth()
162+
.aspectRatio(260f/364f),
163+
drawableResId = R.drawable.img_join_card,
164+
contentScale = ContentScale.FillWidth
165+
)
170166

171-
Row(
172-
modifier = Modifier
173-
.fillMaxWidth()
174-
.padding(start = 38.dp, end = 38.dp, bottom = 33.dp),
175-
horizontalArrangement = Arrangement.SpaceBetween
176-
) {
177-
Text(
178-
text = "연락이",
179-
style = TukSerifTypography.body14R,
180-
color = Gray700
181-
)
182-
Text(
183-
text = "뜸해진 우리",
184-
style = TukSerifTypography.body14R,
185-
color = Gray700
186-
)
187-
}
188-
}
167+
Text(
168+
modifier = Modifier.align(Alignment.Center),
169+
text = "$gatheringName\n친구들에게",
170+
style = TukSerifTypography.title18M,
171+
textAlign = TextAlign.Center
172+
)
189173
}
190174
}
191175
}
@@ -244,3 +228,14 @@ fun TopAppBarCloseButton(
244228
)
245229
}
246230
}
231+
232+
private const val GRADIENT_BACKGROUND_IMAGE_SCALE = 3
233+
234+
@Preview
235+
@Composable
236+
private fun JoinGatheringScreenPreview() {
237+
JoinGatheringScreen(
238+
onNavigateToGatheringDetail = {},
239+
onNavigateToLoginScreen = {}
240+
)
241+
}

feature/join_gathering/src/main/java/com/plottwist/join_gathering/JoinGatheringViewModel.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.plottwist.join_gathering
22

3-
import android.net.http.HttpException
4-
import android.util.Log
53
import androidx.lifecycle.SavedStateHandle
64
import androidx.lifecycle.ViewModel
75
import androidx.navigation.toRoute
@@ -55,7 +53,11 @@ class JoinGatheringViewModel @Inject constructor(
5553
postSideEffect(JoinGatheringSideEffect.NavigateToGatheringDetail(state.gatheringId))
5654
},
5755
onFailure = {
58-
postSideEffect(JoinGatheringSideEffect.ShowSnackbar("모임에 입장할 수 없습니다."))
56+
if(it.message?.contains("401") == true){
57+
postSideEffect(JoinGatheringSideEffect.NavigateToLoginScreen)
58+
}else {
59+
postSideEffect(JoinGatheringSideEffect.ShowSnackbar("모임에 입장할 수 없습니다."))
60+
}
5961
}
6062
)
6163
}

feature/join_gathering/src/main/java/com/plottwist/join_gathering/navigation/JoinGatheringNavigation.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fun NavController.navigateToJoinGathering(
2424
fun NavGraphBuilder.createJoinGatheringNavGraph(
2525
onBack: () -> Unit,
2626
onNavigateToGatheringDetail : (Long) -> Unit,
27+
onNavigateToLoginScreen: () -> Unit
2728
) {
2829
composable<Route.JoinGathering> (
2930
deepLinks = listOf(
@@ -41,7 +42,8 @@ fun NavGraphBuilder.createJoinGatheringNavGraph(
4142
) {
4243
JoinGatheringScreen(
4344
onCloseClicked = onBack,
44-
onNavigateToGatheringDetail = onNavigateToGatheringDetail
45+
onNavigateToGatheringDetail = onNavigateToGatheringDetail,
46+
onNavigateToLoginScreen = onNavigateToLoginScreen
4547
)
4648
}
4749
}

feature/main/src/main/java/com/plottwist/feature/main/ui/component/TukNavHost.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ fun TukNavHost(
108108
navController.popBackStack()
109109
},
110110
navigateToOnboarding = {
111+
navController.popBackStack()
111112
navController.navigateToOnboardingName()
112113
}
113114
)
@@ -198,7 +199,7 @@ fun TukNavHost(
198199
)
199200
onboardingNameNavGraph(
200201
onBack = {
201-
202+
navController.popBackStack()
202203
},
203204
navigateToHomeScreen = {
204205
navController.popBackStack(Route.Home, inclusive = false)
@@ -246,6 +247,9 @@ fun TukNavHost(
246247
}
247248
}
248249
)
250+
},
251+
onNavigateToLoginScreen = {
252+
navController.navigateToLogin()
249253
}
250254
)
251255
completeProposalNavGraph(

feature/onboarding/src/main/java/com/plottwist/feature/onboarding/OnboardingNameContract.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ sealed class OnboardingNameAction {
1212
}
1313

1414
sealed class OnboardingNameSideEffect {
15-
data object NavigateToHomeScreen : OnboardingNameSideEffect()
15+
data object NavigateToBack : OnboardingNameSideEffect()
1616
}

feature/onboarding/src/main/java/com/plottwist/feature/onboarding/OnboardingNameScreen.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import com.plottwist.core.designsystem.component.TukSolidButton
2020
import com.plottwist.core.designsystem.component.TukSolidButtonType
2121
import com.plottwist.core.designsystem.component.TukTextField
2222
import com.plottwist.core.designsystem.component.TukTopAppBar
23-
import com.plottwist.core.ui.component.TopAppBarCloseButton
2423
import com.plottwist.core.ui.component.TukScaffold
2524
import org.orbitmvi.orbit.compose.collectAsState
2625
import org.orbitmvi.orbit.compose.collectSideEffect
@@ -38,9 +37,9 @@ fun OnboardingNameScreen(
3837

3938
viewModel.collectSideEffect { sideEffect ->
4039
when (sideEffect) {
41-
OnboardingNameSideEffect.NavigateToHomeScreen -> {
40+
OnboardingNameSideEffect.NavigateToBack -> {
4241
keyboardController?.hide()
43-
navigateToHomeScreen()
42+
onBack()
4443
}
4544
}
4645

0 commit comments

Comments
 (0)