Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/#25] 마이페이지 UI 구현 #27

Merged
merged 25 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
43398ce
#25 [FEAT] DialogType 구현
Eonji-sw Jan 15, 2025
8a52eba
#25 [UI] dimen 값 추가
Eonji-sw Jan 15, 2025
1bb3128
#25 [UI] string export
Eonji-sw Jan 15, 2025
3348be8
#25 [UI] icon add
Eonji-sw Jan 15, 2025
bddb6fe
#25 [FEAT] GroupCreate Dialog 적용
Eonji-sw Jan 15, 2025
39850ea
#25 [MOD] GroupCreate SideEffect Dialog 추가
Eonji-sw Jan 15, 2025
53a3d63
#25 [FEAT] GroupCreate ViewModel Dialog 구현
Eonji-sw Jan 15, 2025
d78c149
#25 [MOD] 필요없는 코드 제거
Eonji-sw Jan 15, 2025
e3f5495
#25 [UI] MyPage Item UI 구현
Eonji-sw Jan 15, 2025
b11e626
#25 [MOD] 필요없는 코드 제거
Eonji-sw Jan 15, 2025
3016715
#25 [UI] MyPage ProfileEditButton UI 구현
Eonji-sw Jan 15, 2025
bb34539
#25 [FEAT] MyPage UI 구현 및 Dialog 적용
Eonji-sw Jan 15, 2025
c379dec
#25 [MOD] MyPage SideEffect 구현
Eonji-sw Jan 15, 2025
4853ba6
#25 [MOD] MyPage ViewModel Dialog 구현
Eonji-sw Jan 15, 2025
442a430
#25 [UI] NoostakDialog UI 구현
Eonji-sw Jan 15, 2025
0aa096f
#25 [UI] NoostakTextField 변경된 GUI 적용
Eonji-sw Jan 15, 2025
b186765
#25 [MOD] typo 변경
Eonji-sw Jan 15, 2025
4ee572f
#25 [UI] padding 분기처리 추가
Eonji-sw Jan 16, 2025
8c583f5
#25 [MOD] c2sb -> c3sb typo 네이밍 변경
Eonji-sw Jan 16, 2025
13e7aa0
#25 [UI] image 변경
Eonji-sw Jan 17, 2025
02efa1a
#25 [UI] GroupCreateSuccess 페이지 icon 추가
Eonji-sw Jan 17, 2025
46008d0
#25 [MOD] NoostakDialog type 추가 및 리팩토링
Eonji-sw Jan 17, 2025
7a20f37
#25 [MOD] 리팩토링
Eonji-sw Jan 17, 2025
0c76e46
#25 [UI] string export
Eonji-sw Jan 17, 2025
c579be3
Merge remote-tracking branch 'origin/develop' into feature/#25-mypage-ui
Eonji-sw Jan 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ fun NoostakCategoryChip(

NoostakChip(
text = text,
textStyle = NoostakTheme.typography.c2SemiBold,
textStyle = NoostakTheme.typography.c3SemiBold,
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
textColor = NoostakTheme.colors.white,
backgroundColor = resolvedBackgroundColor,
borderColor = Color.Transparent,
Expand Down
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package com.sopt.core.designsystem.component.dialog

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import com.sopt.core.R
import com.sopt.core.designsystem.theme.NoostakAndroidTheme
import com.sopt.core.designsystem.theme.NoostakTheme
import com.sopt.core.type.DialogType

@Composable
fun NoostakDialog(
dialogType: DialogType,
onClick: () -> Unit = {},
onDismissRequest: () -> Unit = {}
) {
Dialog(
onDismissRequest = { onDismissRequest() },
properties = DialogProperties(
dismissOnBackPress = true,
dismissOnClickOutside = true
)
) {
Card(
shape = RoundedCornerShape(dimensionResource(id = R.dimen.dialog_radius))
) {
Column(
modifier = Modifier
.width(274.dp)
.wrapContentHeight()
.background(
color = NoostakTheme.colors.white
),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(
modifier = Modifier.height(
when (dialogType) {
DialogType.GROUP -> 24.dp
DialogType.LOGOUT -> 41.dp
DialogType.WITHDRAWAL -> 30.dp
}
)
)
Text(
text = stringResource(dialogType.content),
textAlign = TextAlign.Center,
style = if (dialogType == DialogType.GROUP) NoostakTheme.typography.c3Regular else NoostakTheme.typography.b4Regular
)
Spacer(
modifier = Modifier.height(
when (dialogType) {
DialogType.GROUP -> 20.dp
DialogType.LOGOUT -> 36.dp
DialogType.WITHDRAWAL -> 26.dp
}
)
)
Box(
modifier = Modifier
.fillMaxWidth()
.height(1.dp)
.background(color = NoostakTheme.colors.gray200)
)
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
Row(
modifier = Modifier
.fillMaxWidth()
.height(IntrinsicSize.Min) // Row의 높이를 내부 컴포넌트에 맞춤
) {
Button(
onClick = { onDismissRequest() },
shape = RectangleShape,
modifier = Modifier
.weight(1f)
.fillMaxHeight(),
colors = ButtonDefaults.buttonColors(
containerColor = NoostakTheme.colors.white,
contentColor = NoostakTheme.colors.gray900,
disabledContainerColor = NoostakTheme.colors.white,
disabledContentColor = NoostakTheme.colors.gray900
)
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved

) {
Text(
text = stringResource(dialogType.dismissText),
textAlign = TextAlign.Center,
style = NoostakTheme.typography.c3SemiBold
)
}

Box(
modifier = Modifier
.fillMaxHeight()
.width(1.dp)
.background(color = NoostakTheme.colors.gray200)
)
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved

Button(
onClick = { onClick() },
shape = RectangleShape,
modifier = Modifier
.weight(1f)
.fillMaxHeight(),
colors = ButtonDefaults.buttonColors(
containerColor = NoostakTheme.colors.white,
contentColor = NoostakTheme.colors.gray900,
disabledContainerColor = NoostakTheme.colors.white,
disabledContentColor = NoostakTheme.colors.gray900
)
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
) {
Text(
text = stringResource(dialogType.confirmText),
textAlign = TextAlign.Center,
style = NoostakTheme.typography.c3SemiBold,
color = NoostakTheme.colors.blue
)
}
}
}
}
}
}

@Preview(showBackground = true)
@Composable
fun NoostakDialogPreview() {
NoostakAndroidTheme {
NoostakDialog(dialogType = DialogType.GROUP, onClick = {}, onDismissRequest = {})
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.sopt.core.designsystem.component.textfield

import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
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.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
Expand Down Expand Up @@ -44,9 +44,10 @@ fun NoostakTextField(
onValueChange: (String) -> Unit = { _ -> },
placeholderColor: Color = NoostakTheme.colors.gray600,
textStyle: TextStyle = NoostakTheme.typography.b5Regular,
lengthTextStyle: TextStyle = NoostakTheme.typography.b5Regular,
shape: Shape = RoundedCornerShape(6.dp),
cursorColor: Color = NoostakTheme.colors.gray600,
focusedBorderColor: Color = NoostakTheme.colors.gray900,
focusedBorderColor: Color = NoostakTheme.colors.blue600,
unfocusedWithInputBorderColor: Color = NoostakTheme.colors.gray700,
unfocusedBorderColor: Color = NoostakTheme.colors.gray500,
maxLength: Int = 30,
Expand All @@ -56,6 +57,9 @@ fun NoostakTextField(
keyboardActions: KeyboardActions = KeyboardActions.Default
) {
var isFocused by remember { mutableStateOf(false) }
var hasInvalidInput by remember { mutableStateOf(false) }

val validInputRegex = "^[a-zA-Z0-9가-힣]*$".toRegex()

Column {
Box(
Expand All @@ -64,6 +68,7 @@ fun NoostakTextField(
.border(
width = 1.dp,
color = when {
hasInvalidInput -> NoostakTheme.colors.red02
isFocused -> focusedBorderColor // 포커스된 경우
value.isNotEmpty() -> unfocusedWithInputBorderColor // 텍스트가 입력되고 포커스 안된 경우
else -> unfocusedBorderColor // 포커스되지 않은 경우
Expand All @@ -78,10 +83,16 @@ fun NoostakTextField(
value = value,
textStyle = textStyle,
onValueChange = { newValue ->
if (newValue.replace(" ", "").length <= maxLength) {
onValueChange(
newValue
)
if (textFieldType != TextFieldType.SIGNUP) {
if (newValue.replace(" ", "").length <= maxLength) {
onValueChange(newValue)
}
} else {
hasInvalidInput = !validInputRegex.matches(newValue)

if (newValue.length <= maxLength) {
onValueChange(newValue)
}
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
}
},
placeholder = {
Expand Down Expand Up @@ -131,25 +142,27 @@ fun NoostakTextField(
}

Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
modifier = Modifier.fillMaxWidth()
) {
Text(
text = if (textFieldType == TextFieldType.SIGNUP) stringResource(R.string.text_noostak_text_field_sign_up_example) else "",
color = NoostakTheme.colors.gray800,
style = NoostakTheme.typography.b5Regular,
modifier = modifier.padding(top = 6.dp),
maxLines = 1
)
if (textFieldType == TextFieldType.SIGNUP && hasInvalidInput) {
Text(
text = stringResource(R.string.text_noostak_text_field_sign_up_condition),
color = NoostakTheme.colors.red02,
style = NoostakTheme.typography.c3SemiBold,
modifier = modifier.padding(top = 6.dp),
maxLines = 1
)
}

Spacer(modifier = Modifier.weight(1f))
Text(
text = stringResource(
R.string.text_noostak_text_field_count,
value.length,
maxLength
),
color = NoostakTheme.colors.gray800,
style = NoostakTheme.typography.b5Regular,
style = lengthTextStyle,
modifier = modifier.padding(top = 6.dp),
maxLines = 1
)
Expand All @@ -161,8 +174,6 @@ fun NoostakTextField(
@Composable
fun NoostakTextFieldPreview() {
NoostakAndroidTheme {
Column {
NoostakTextField(textFieldType = TextFieldType.GROUP, value = "누스탁")
}
NoostakTextField(textFieldType = TextFieldType.SIGNUP, value = "누스탁")
}
}
12 changes: 6 additions & 6 deletions core/src/main/java/com/sopt/core/designsystem/theme/Type.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class NoostakTypography internal constructor(
b4Regular: TextStyle,
b5Regular: TextStyle,
c1Bold: TextStyle,
c2SemiBold: TextStyle,
c3SemiBold: TextStyle,
c3Regular: TextStyle,
c4Regular: TextStyle
) {
Expand Down Expand Up @@ -86,7 +86,7 @@ class NoostakTypography internal constructor(
private set
var c1Bold: TextStyle by mutableStateOf(c1Bold)
private set
var c2SemiBold: TextStyle by mutableStateOf(c2SemiBold)
var c3SemiBold: TextStyle by mutableStateOf(c3SemiBold)
private set
var c3Regular: TextStyle by mutableStateOf(c3Regular)
private set
Expand All @@ -113,7 +113,7 @@ class NoostakTypography internal constructor(
b4Regular: TextStyle = this.b4Regular,
b5Regular: TextStyle = this.b5Regular,
c1Bold: TextStyle = this.c1Bold,
c2SemiBold: TextStyle = this.c2SemiBold,
c3SemiBold: TextStyle = this.c3SemiBold,
c3Regular: TextStyle = this.c3Regular,
c4Regular: TextStyle = this.c4Regular
): NoostakTypography = NoostakTypography(
Expand All @@ -136,7 +136,7 @@ class NoostakTypography internal constructor(
b4Regular = b4Regular,
b5Regular = b5Regular,
c1Bold = c1Bold,
c2SemiBold = c2SemiBold,
c3SemiBold = c3SemiBold,
c3Regular = c3Regular,
c4Regular = c4Regular
)
Expand All @@ -161,7 +161,7 @@ class NoostakTypography internal constructor(
b4Regular = other.b4Regular
b5Regular = other.b5Regular
c1Bold = other.c1Bold
c2SemiBold = other.c2SemiBold
c3SemiBold = other.c3SemiBold
c3Regular = other.c3Regular
c4Regular = other.c4Regular
}
Expand Down Expand Up @@ -304,7 +304,7 @@ fun noostakTypography(): NoostakTypography {
fontSize = 13.sp,
lineHeight = 18.sp
),
c2SemiBold = noostakTextStyle(
c3SemiBold = noostakTextStyle(
fontFamily = PretendardSemiBold,
fontWeight = FontWeight.SemiBold,
fontSize = 13.sp,
Expand Down
26 changes: 26 additions & 0 deletions core/src/main/java/com/sopt/core/type/DialogType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.sopt.core.type

import androidx.annotation.StringRes
import com.sopt.core.R

enum class DialogType(
@StringRes val content: Int,
@StringRes val dismissText: Int,
@StringRes val confirmText: Int
) {
GROUP(
content = R.string.text_dialog_type_group_content,
dismissText = R.string.text_dialog_type_dismiss_cancel,
confirmText = R.string.text_dialog_type_confirm_retry
),
LOGOUT(
content = R.string.text_dialog_type_logout_content,
dismissText = R.string.text_dialog_type_dismiss_cancel,
confirmText = R.string.text_dialog_type_confirm_logout
),
WITHDRAWAL(
content = R.string.text_dialog_type_withdrawal_content,
dismissText = R.string.text_dialog_type_dismiss_cancel,
confirmText = R.string.text_dialog_type_confirm_withdrawal
)
Eonji-sw marked this conversation as resolved.
Show resolved Hide resolved
}
2 changes: 2 additions & 0 deletions core/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@
<dimen name="appbar_height">48dp</dimen>
<dimen name="appbar_start_padding">8dp</dimen>

<dimen name="dialog_radius">20dp</dimen>

</resources>
11 changes: 10 additions & 1 deletion core/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<string name="tf_calendar_info_placeholder">이름을 입력해주세요</string>

<!-- Noostak Text Field -->
<string name="text_noostak_text_field_sign_up_example">예) 홍길동</string>
<string name="text_noostak_text_field_sign_up_condition">띄어쓰기 없이 한글, 영문, 숫자만 가능해요.</string>
<string name="text_noostak_text_field_count">%1$s/%2$s</string>
<string name="icon_noostak_text_field_descrition">Delete Profile Name</string>

Expand All @@ -30,4 +30,13 @@
<string name="category_chip_hobby">취미</string>
<string name="category_chip_etc">기타</string>

<!-- Dialog Type -->
<string name="text_dialog_type_group_content">네트워크 문제로\n그룹 만들기에 실패했습니다.\n다시 시도하시겠습니까?</string>
<string name="text_dialog_type_dismiss_cancel">취소</string>
<string name="text_dialog_type_confirm_retry">재시도</string>
<string name="text_dialog_type_logout_content">로그아웃하시겠습니까?</string>
<string name="text_dialog_type_confirm_logout">로그아웃</string>
<string name="text_dialog_type_withdrawal_content">회원 탈퇴 시 복구가 불가해요.\n정말 탈퇴하시겠어요?</string>
<string name="text_dialog_type_confirm_withdrawal">탈퇴하기</string>

</resources>
Loading
Loading