Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b60ad85
[feat] 자격증 관리 헤더 컴포넌트 구현
jyvnee Dec 21, 2025
16ee52e
[feat] 자격증 상태 칩 컴포넌트 구현
jyvnee Dec 21, 2025
3987217
[feat] 자격증 컴포넌트 구현
jyvnee Dec 22, 2025
e5ecb47
[feat] 즐겨찾기 자격증 컴포넌트 구현
jyvnee Dec 22, 2025
d0ad4a8
[feat] 자격증 편집 컴포넌트 구현
jyvnee Dec 22, 2025
6c30b82
[feat] 자격증 관리 뷰 구현
jyvnee Dec 22, 2025
3031cb8
[feat] 자격증 관리 뷰 구현
jyvnee Dec 22, 2025
6048d41
[add] 아이콘 추가
jyvnee Dec 23, 2025
33c20d0
Merge branch 'develop' into feat/IPLC-15-자격증-관리-뷰-UI-작업
jyvnee Dec 23, 2025
0a953c5
[feat] 자격증 네비게이션 연결
jyvnee Dec 23, 2025
e9b0a0e
[chore] 탭 라벨 변경
jyvnee Dec 23, 2025
ccd0830
[chore] 자격증 관리 페이지 헤더 수정
jyvnee Dec 23, 2025
bfd9345
[chore] 자격증 관리 페이지 뷰모델 연결
jyvnee Dec 23, 2025
6668bc6
[feat] 자격증 편집 뷰 구현
jyvnee Dec 23, 2025
1700b6d
[feat] 자격증 편집 뷰 구현
jyvnee Dec 23, 2025
975c9a7
[feat] 삭제 다이얼로그 연결
jyvnee Dec 23, 2025
110196e
[feat] 에러 처리 수정
jyvnee Dec 23, 2025
737541d
[feat] 공통 컴포넌트 수정
jyvnee Dec 23, 2025
e3fadd8
[chore] 공통 컴포넌트 이름 수정
jyvnee Dec 23, 2025
ca66163
[chore] 파일 삭제
jyvnee Dec 23, 2025
105a69b
[chore] 컴포넌트 분리
jyvnee Dec 23, 2025
d2260a8
[feat] 자격증 상세 페이지 연결
jyvnee Dec 23, 2025
cc16f87
[feat] 즐겨찾기 자격증 상세 페이지 연결
jyvnee Dec 23, 2025
527ed1f
[chore] 간격 조정
jyvnee Dec 27, 2025
c4ac45e
[chore] 패딩 수정
jyvnee Dec 27, 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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[3]: 기존에 있던거 확장하는거 넘넘 조음 역시 리드

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.sopt.certi.core.component.chip

import androidx.annotation.StringRes
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
Expand All @@ -19,13 +20,17 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.sopt.certi.R
import org.sopt.certi.core.util.heightForScreenPercentage
import org.sopt.certi.core.util.pressedClickable
import org.sopt.certi.core.util.screenHeightDp
import org.sopt.certi.core.util.screenWidthDp
import org.sopt.certi.core.util.widthForScreenPercentage
import org.sopt.certi.ui.theme.CertiTheme

enum class CertiEditChipType {
MODIFY, DELETE
enum class CertiEditChipType(
@StringRes val label: Int
) {
MODIFY(R.string.my_certification_modify),
DELETE(R.string.my_certification_delete)
}

@Composable
Expand All @@ -38,17 +43,16 @@ fun CertiEditChip(

Box(
modifier = modifier
.heightForScreenPercentage(26.dp)
.background(
color = if (isPressed) {
CertiTheme.colors.white
} else {
CertiTheme.colors.gray100
} else {
CertiTheme.colors.white
},
shape = RoundedCornerShape(100.dp)
)
.border(width = 1.dp, color = CertiTheme.colors.gray300, shape = RoundedCornerShape(100.dp))
.padding(vertical = 4.dp, horizontal = 12.dp)
.padding(vertical = screenHeightDp(4.dp), horizontal = screenWidthDp(12.dp))
.pressedClickable(
changePressed = {
isPressed = it
Expand All @@ -60,7 +64,7 @@ fun CertiEditChip(
contentAlignment = Alignment.Center
) {
Text(
text = if (type == CertiEditChipType.MODIFY) stringResource(R.string.my_certification_modify) else stringResource(R.string.my_certification_delete),
text = stringResource(type.label),
style = CertiTheme.typography.caption.regular_12,
color = CertiTheme.colors.gray600
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import org.sopt.certi.R
import org.sopt.certi.core.util.pressedClickable
import org.sopt.certi.core.util.screenHeightDp
import org.sopt.certi.core.util.screenWidthDp
import org.sopt.certi.ui.theme.CERTITheme
import org.sopt.certi.ui.theme.CertiTheme

Expand All @@ -45,21 +45,21 @@ fun CertiDeleteDialog(
color = CertiTheme.colors.white
) {
Column(
modifier = Modifier.padding(top = screenHeightDp(32.dp)),
modifier = Modifier.padding(top = screenWidthDp(32.dp)),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = title,
style = CertiTheme.typography.body.semibold_18,
color = CertiTheme.colors.gray600
)
Spacer(modifier = Modifier.height(screenHeightDp(16.dp)))
Spacer(modifier = Modifier.height(screenWidthDp(16.dp)))
Text(
text = description,
style = CertiTheme.typography.caption.regular_14,
color = CertiTheme.colors.gray600
)
Spacer(modifier = Modifier.height(screenHeightDp(24.dp)))
Spacer(modifier = Modifier.height(screenWidthDp(24.dp)))
HorizontalDivider(
thickness = 1.dp,
color = CertiTheme.colors.gray100
Expand Down Expand Up @@ -113,7 +113,7 @@ fun DialogButton(
text = text,
style = CertiTheme.typography.body.semibold_18,
color = textColor,
modifier = Modifier.padding(vertical = screenHeightDp(20.dp))
modifier = Modifier.padding(vertical = screenWidthDp(20.dp))
)
}
}
Expand Down
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[3]: ㅋㅋㅋㅋ 병렬작업하느라 이전 pr에 잇는거 여기도 잇음 헐랭띠

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.sopt.certi.core.component.header

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.sopt.certi.R
import org.sopt.certi.core.util.noRippleClickable
import org.sopt.certi.core.util.screenHeightDp
import org.sopt.certi.core.util.screenWidthDp
import org.sopt.certi.ui.theme.CERTITheme
import org.sopt.certi.ui.theme.CertiTheme

@Composable
fun MyPageHeader(
modifier: Modifier = Modifier,
headerTitle: String? = null,
isSaveEnable: Boolean = false,
onSaveClick: (() -> Unit)? = null
) {
Box(
modifier = modifier.fillMaxWidth()
) {
headerTitle?.let {
Text(
text = headerTitle,
style = CertiTheme.typography.subtitle.semibold_20,
color = CertiTheme.colors.gray600,
modifier = Modifier.align(Alignment.Center)
)
}

onSaveClick?.let {
Text(
text = stringResource(R.string.personal_save),
style = CertiTheme.typography.body.semibold_18,
color = if (isSaveEnable) CertiTheme.colors.mainBlue else CertiTheme.colors.gray400,
modifier = Modifier
.align(Alignment.CenterEnd)
.noRippleClickable {
if (isSaveEnable) {
onSaveClick()
}
}
)
}
}
}

@Preview
@Composable
private fun EditPersonalInfoHeaderPreview() {
CERTITheme {
MyPageHeader(
headerTitle = "헤더",
isSaveEnable = false,
onSaveClick = {},
modifier = Modifier.padding(vertical = screenHeightDp(22.dp), horizontal = screenWidthDp(20.dp))
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.sopt.certi.core.component.section

import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Icon
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.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import org.sopt.certi.core.util.screenWidthDp
import org.sopt.certi.ui.theme.CertiTheme

@Composable
fun CertInfoSection(
@DrawableRes iconRes: Int,
testInfo: String,
modifier: Modifier = Modifier,
iconColor: Color = CertiTheme.colors.gray300
) {
Row(
modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(screenWidthDp(4.dp)),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = ImageVector.vectorResource(iconRes),
contentDescription = null,
tint = iconColor
)
Text(
text = testInfo,
style = CertiTheme.typography.caption.regular_14,
color = CertiTheme.colors.black
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.sopt.certi.core.component.section

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.material3.Icon
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.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import org.sopt.certi.R
import org.sopt.certi.core.util.noRippleClickable
import org.sopt.certi.core.util.screenWidthDp
import org.sopt.certi.ui.theme.CertiTheme

@Composable
fun CertItemTitleSection(
certName: String,
certType: String,
modifier: Modifier = Modifier,
onFavoriteClick: (() -> Unit)? = null,
isFavorite: Boolean = false
) {
Row(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(screenWidthDp(8.dp))
) {
Text(
text = certName,
style = CertiTheme.typography.subtitle.semibold_20,
color = CertiTheme.colors.black
)
Text(
text = certType,
style = CertiTheme.typography.caption.regular_12,
color = CertiTheme.colors.black
)

Spacer(modifier = Modifier.weight(1f))

onFavoriteClick?.let {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_star_24),
contentDescription = null,
tint = if (isFavorite) CertiTheme.colors.subYellow else CertiTheme.colors.gray100,
modifier = Modifier.noRippleClickable(onFavoriteClick)
)
}
}
}
Loading