11package com.plottwist.join_gathering
22
3- import androidx.compose.foundation.layout.Arrangement
3+ import android.annotation.SuppressLint
44import androidx.compose.foundation.layout.Box
55import androidx.compose.foundation.layout.Column
66import androidx.compose.foundation.layout.PaddingValues
7- import androidx.compose.foundation.layout.Row
8- import androidx.compose.foundation.layout.Spacer
97import androidx.compose.foundation.layout.aspectRatio
108import androidx.compose.foundation.layout.fillMaxSize
119import androidx.compose.foundation.layout.fillMaxWidth
1210import androidx.compose.foundation.layout.height
11+ import androidx.compose.foundation.layout.imePadding
1312import androidx.compose.foundation.layout.padding
13+ import androidx.compose.foundation.layout.requiredWidth
1414import androidx.compose.foundation.shape.RoundedCornerShape
1515import androidx.compose.material3.Button
1616import androidx.compose.material3.ButtonDefaults
1717import androidx.compose.material3.IconButton
1818import androidx.compose.material3.MaterialTheme
19+ import androidx.compose.material3.Scaffold
1920import androidx.compose.material3.SnackbarDuration
2021import androidx.compose.material3.SnackbarHost
2122import androidx.compose.material3.SnackbarHostState
@@ -27,35 +28,38 @@ import androidx.compose.runtime.remember
2728import androidx.compose.runtime.rememberCoroutineScope
2829import androidx.compose.ui.Alignment
2930import 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
3034import androidx.compose.ui.graphics.Color
35+ import androidx.compose.ui.graphics.drawscope.clipRect
3136import 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
3438import androidx.compose.ui.text.style.TextAlign
3539import androidx.compose.ui.tooling.preview.Preview
3640import androidx.compose.ui.unit.dp
37- import androidx.compose.ui.unit.sp
3841import androidx.hilt.navigation.compose.hiltViewModel
3942import androidx.lifecycle.compose.collectAsStateWithLifecycle
43+ import com.plottwist.core.designsystem.R
4044import 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
4445import com.plottwist.core.designsystem.foundation.TukPrimitivesColor
4546import com.plottwist.core.designsystem.foundation.type.TukSerifTypography
4647import com.plottwist.core.ui.component.StableImage
47- import com.plottwist.core.ui.component.TukScaffold
48+ import com.plottwist.core.ui.component.TukScaffoldTitle
4849import kotlinx.coroutines.launch
4950
51+ @SuppressLint(" ConfigurationScreenWidthHeight" )
5052@Composable
5153fun 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
125145fun 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+ }
0 commit comments