Skip to content

Commit

Permalink
Merge pull request #224 from wespot-bff/feature/jaino/#223
Browse files Browse the repository at this point in the history
#223 : 하단 버튼이 붙어 있는 페이지 리팩토링해요
  • Loading branch information
jeongjaino authored Jan 21, 2025
2 parents f00b0f2 + 42a7d65 commit bf97353
Show file tree
Hide file tree
Showing 14 changed files with 493 additions and 509 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.bff.wespot.ui.component
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.BoxWithConstraintsScope
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.text.InternalFoundationTextApi
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
Expand Down Expand Up @@ -128,7 +127,6 @@ fun AutoSizeText(
}
}

@OptIn(InternalFoundationTextApi::class)
@Composable
private fun BoxWithConstraintsScope.shouldShrink(
text: AnnotatedString,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.bff.wespot.ui.component

import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.SubcomposeLayout

@Composable
fun BottomButtonLayout(
modifier: Modifier = Modifier,
showGradient: Boolean = false,
button: @Composable () -> Unit,
content: @Composable () -> Unit,
) {
SubcomposeLayout(modifier) { constraints ->
val gradientPlaceable = subcompose("gradient") {
ListBottomGradient(124)
}.first().measure(constraints)

val buttonPlaceable = subcompose("button") {
button()
}.first().measure(constraints)

val contentMaxHeight = constraints.maxHeight - buttonPlaceable.height
val contentPlaceable = subcompose("content") {
content()
}.first().measure(constraints.copy(maxHeight = contentMaxHeight))

layout(constraints.maxWidth, constraints.maxHeight) {
contentPlaceable.placeRelative(0, 0)

if (showGradient) {
gradientPlaceable.placeRelative(0, constraints.maxHeight - gradientPlaceable.height)
}

buttonPlaceable.placeRelative(0, contentMaxHeight)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.bff.wespot.ui.component

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
Expand All @@ -17,7 +16,6 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun DotIndicators(
pagerState: PagerState,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.bff.wespot.ui.component

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
Expand All @@ -22,7 +21,6 @@ import com.bff.wespot.designsystem.theme.WeSpotTheme
import com.bff.wespot.designsystem.util.OrientationPreviews
import com.bff.wespot.ui.util.carouselTransition

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun WSCarousel(
pageCount: Int = 10,
Expand All @@ -47,7 +45,6 @@ fun WSCarousel(
}
}

@OptIn(ExperimentalFoundationApi::class)
@OrientationPreviews
@Composable
private fun PreviewWSCarousel() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.bff.wespot.ui.util

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
Expand All @@ -14,7 +13,6 @@ import androidx.compose.ui.semantics.Role
import androidx.compose.ui.util.lerp
import kotlin.math.absoluteValue

@OptIn(ExperimentalFoundationApi::class)
fun Modifier.carouselTransition(pagerState: PagerState, page: Int) =
graphicsLayer {
val pageOffset =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
Expand Down Expand Up @@ -65,8 +64,8 @@ import com.bff.wespot.entire.state.edit.ProfileEditAction
import com.bff.wespot.entire.state.edit.ProfileEditSideEffect
import com.bff.wespot.entire.viewmodel.ProfileEditViewModel
import com.bff.wespot.navigation.Navigator
import com.bff.wespot.ui.component.BottomButtonLayout
import com.bff.wespot.ui.component.LetterCountIndicator
import com.bff.wespot.ui.component.ListBottomGradient
import com.bff.wespot.ui.component.LoadingAnimation
import com.bff.wespot.ui.component.TopToast
import com.bff.wespot.ui.component.WSBottomSheet
Expand Down Expand Up @@ -138,115 +137,112 @@ fun ProfileEditScreen(
)
},
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(it)
.padding(horizontal = 20.dp)
.verticalScroll(scrollState),
horizontalAlignment = Alignment.CenterHorizontally,
BottomButtonLayout(
modifier = Modifier.padding(it),
button = {
val isEdited = state.profile.introduction != state.introductionInput ||
state.profilePath != state.profile.profileCharacter.iconUrl
WSButton(
onClick = {
action(ProfileEditAction.OnProfileEditDoneButtonClicked)
},
enabled =
isEdited &&
state.hasProfanity.not() &&
state.introductionInput.length in 0..20,
text = stringResource(id = R.string.edit_done),
content = { it() },
)
},
) {
Box(
Column(
modifier = Modifier
.padding(top = 16.dp)
.clickableSingle {
if (state.profilePath.isNullOrEmpty()) {
action(ProfileEditAction.OpenPicker)
} else {
action(ProfileEditAction.ChangeBottomSheetState(true))
}
},
.padding(horizontal = 20.dp)
.verticalScroll(scrollState),
horizontalAlignment = Alignment.CenterHorizontally,
) {
AsyncImage(
modifier = Modifier
.size(90.dp)
.clip(CircleShape),
model = ImageRequest.Builder(LocalContext.current)
.data(state.profilePath)
.error(com.bff.wespot.designsystem.R.drawable.default_image)
.fallback(com.bff.wespot.designsystem.R.drawable.default_image)
.placeholder(com.bff.wespot.designsystem.R.drawable.default_image)
.crossfade(true)
.build(),
contentDescription = stringResource(
com.bff.wespot.ui.R.string.user_character_image,
),
)

Box(
modifier = Modifier
.size(24.dp)
.align(Alignment.BottomEnd)
.clip(WeSpotThemeManager.shapes.small)
.background(WeSpotThemeManager.colors.secondaryBtnColor)
.zIndex(1f),
.padding(top = 16.dp)
.clickableSingle {
if (state.profilePath.isNullOrEmpty()) {
action(ProfileEditAction.OpenPicker)
} else {
action(ProfileEditAction.ChangeBottomSheetState(true))
}
},
) {
Image(
AsyncImage(
modifier = Modifier
.align(Alignment.Center)
.size(14.dp),
painter = painterResource(id = R.drawable.album),
contentDescription = stringResource(R.string.edit_icon),
.size(90.dp)
.clip(CircleShape),
model = ImageRequest.Builder(LocalContext.current)
.data(state.profilePath)
.error(com.bff.wespot.designsystem.R.drawable.default_image)
.fallback(com.bff.wespot.designsystem.R.drawable.default_image)
.placeholder(com.bff.wespot.designsystem.R.drawable.default_image)
.crossfade(true)
.build(),
contentDescription = stringResource(
com.bff.wespot.ui.R.string.user_character_image,
),
)
}
}

ProfileEditLockedItem(
title = stringResource(R.string.name),
content = state.profile.name,
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)

ProfileEditLockedItem(
title = stringResource(R.string.gender),
content = state.profile.toGenderKorean(),
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)
Box(
modifier = Modifier
.size(24.dp)
.align(Alignment.BottomEnd)
.clip(WeSpotThemeManager.shapes.small)
.background(WeSpotThemeManager.colors.secondaryBtnColor)
.zIndex(1f),
) {
Image(
modifier = Modifier
.align(Alignment.Center)
.size(14.dp),
painter = painterResource(id = R.drawable.album),
contentDescription = stringResource(R.string.edit_icon),
)
}
}

ProfileEditLockedItem(
title = stringResource(R.string.school_info),
content = state.profile.toSchoolInfo(),
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)
ProfileEditLockedItem(
title = stringResource(R.string.name),
content = state.profile.name,
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)

ProfileIntroductionItem(
title = stringResource(com.bff.wespot.ui.R.string.introduction),
content = state.introductionInput,
hasProfanity = state.hasProfanity,
onValueChange = { value -> action(ProfileEditAction.OnIntroductionChanged(value)) },
onFocusChanged = { focusState ->
action(ProfileEditAction.OnProfileEditTextFieldFocused(focusState.isFocused))
},
)
ProfileEditLockedItem(
title = stringResource(R.string.gender),
content = state.profile.toGenderKorean(),
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)

Spacer(modifier = Modifier.height(72.dp))
}
ProfileEditLockedItem(
title = stringResource(R.string.school_info),
content = state.profile.toSchoolInfo(),
onClick = {
focusManager.clearFocus()
action(ProfileEditAction.OnRequestDialogShown)
},
)

Box(
modifier = Modifier
.fillMaxSize()
.padding(top = 10.dp),
contentAlignment = Alignment.BottomCenter,
) {
ListBottomGradient(height = 124)

WSButton(
onClick = {
action(ProfileEditAction.OnProfileEditDoneButtonClicked)
},
enabled = state.isEditedProfile() && state.isValidIntroduce() && state.isLoading.not(),
text = stringResource(id = R.string.edit_done),
content = { it() },
)
ProfileIntroductionItem(
title = stringResource(com.bff.wespot.ui.R.string.introduction),
content = state.introductionInput,
hasProfanity = state.hasProfanity,
onValueChange = { value -> action(ProfileEditAction.OnIntroductionChanged(value)) },
onFocusChanged = { focusState ->
action(ProfileEditAction.OnProfileEditTextFieldFocused(focusState.isFocused))
},
)
}
}
}

Expand Down
Loading

0 comments on commit bf97353

Please sign in to comment.