Skip to content

[UI/#37] 상세페이지 화면 구현 #43

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

Merged
merged 47 commits into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
254a6ff
[ADD/#37] String 추가
jangsjw Jan 17, 2025
4726d6f
[MOD/#37] ItemChatScreen Composable
jangsjw Jan 17, 2025
62718f2
[ADD/#37] 아이콘 SVG 추가
jangsjw Jan 17, 2025
2387536
[FEAT/#37] DetailPage Navi
jangsjw Jan 17, 2025
3568ab7
[ADD/#37] DetailPageScreen
jangsjw Jan 17, 2025
6b25248
[ADD/#37] DetailPageUiState
jangsjw Jan 17, 2025
14e0ead
[ADD/#37] DetailPageViewModel
jangsjw Jan 17, 2025
2d42af1
[ADD/#37] ProductChipType
jangsjw Jan 17, 2025
8fd9f82
[ADD/#37] ProductConditionType
jangsjw Jan 17, 2025
e23f24f
[ADD/#37] ProductInfoSection
jangsjw Jan 17, 2025
a914d3c
[ADD/#37] ProductChipType 수정
jangsjw Jan 17, 2025
08a8528
[ADD/#37] SnackBar 공통 컴포넌트
jangsjw Jan 17, 2025
319fae9
[MOD/#37] SnackBar 작은 수정
jangsjw Jan 17, 2025
d32d2ea
[MOD/#37] DetailPageScreen TODO 추가
jangsjw Jan 17, 2025
dbf6845
[MOD/#37] DetailPageScreen 수정
jangsjw Jan 17, 2025
53eb168
[MERGE/#37] pulled develop
jangsjw Jan 17, 2025
ad06af7
[CHORE/#37] 수정자 오류 수정
jangsjw Jan 17, 2025
bf05759
[RENAME/#37] 채팅 루트 이름 수정
jangsjw Jan 17, 2025
81f0099
[REFACTOR/#37] 채팅 화면 수정
jangsjw Jan 17, 2025
44ff9b5
[REFACTOR/#37] 거래 타입 수정
jangsjw Jan 17, 2025
349c0f7
[ADD/#37] 이미지 추가
jangsjw Jan 17, 2025
f6a47f4
[CHORE/#37] 이미지 코드 수정
jangsjw Jan 17, 2025
826e44c
[FEAT/#37] 뒤로가기 구현
jangsjw Jan 17, 2025
01930c2
[FEAT/#37] padding 추가
jangsjw Jan 17, 2025
d16d745
[MOD/#37] Screen에 ViewModel 추가
jangsjw Jan 19, 2025
77eb57b
[MOD/#37] onNavigateUp 수정
jangsjw Jan 19, 2025
caa4bee
[ADD/#37] 트레일링 콤마 추가
jangsjw Jan 19, 2025
cd9a58d
[DEL/#37] 주석 삭제
jangsjw Jan 19, 2025
768db84
[MOD/#37] likes 변수명 수정
jangsjw Jan 19, 2025
08004e4
[MOD/#37] 개행 수정
jangsjw Jan 19, 2025
5cdb74d
[MOD/#37] string import 추출
jangsjw Jan 19, 2025
9a516de
[MOD/#37] 개행 수정
jangsjw Jan 19, 2025
db26824
[MOD/#37] chipType 네이밍 변경
jangsjw Jan 19, 2025
43a361f
[MOD/#37] spacer 제거 및 horizontalArrangement 추가
jangsjw Jan 19, 2025
ca387d0
[ADD/#37] 트레일링 콤마 추가
jangsjw Jan 19, 2025
e7dc7cd
[ADD/#37] 상세페이지 설명 왼쪽 정렬
jangsjw Jan 19, 2025
cc29ab0
[ADD/#37] String 삭제 및 label 수정
jangsjw Jan 19, 2025
fc73f4f
[ADD/#37] 트레일링 콤마
jangsjw Jan 19, 2025
1275869
[ADD/#37] CommonSnackBarWithoutIcon 추가
jangsjw Jan 19, 2025
467bd5f
[MOD/#37] immutable 적용
jangsjw Jan 19, 2025
15d017b
[MOD/#37] 개행
jangsjw Jan 19, 2025
fa1bfd9
[MOD/#37] ProductConditionType 아주 좋은 상태
jangsjw Jan 19, 2025
173c0cc
[MOD/#37] String 수정
jangsjw Jan 19, 2025
5e34b13
[MOD/#37] 공통 type으로 이동
jangsjw Jan 19, 2025
0934cbb
[MOD/#37] 상품설명 uiState 연결
jangsjw Jan 19, 2025
5624741
[MOD/#37] CommonSnackBar 수정
jangsjw Jan 19, 2025
30442a2
[MERGE/#37] pulled develop
jangsjw Jan 19, 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
@@ -0,0 +1,113 @@
package com.napzak.market.core.designsystem.component.snackbar

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
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.Shape
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.napzak.market.R
import com.napzak.market.core.designsystem.theme.NapzakMarketTheme

/**
* 공통 SnackBar 컴포넌트.
*
* 메시지와 아이콘을 포함한 스낵바 메시지를 표시합니다.
* 사용자 지정 배경색, 텍스트 색상, 텍스트 스타일, 모양 등을 지원하며, 모든 인자는 명시적으로 전달해야 합니다.
*
* @param message 표시할 메시지
* @param icon 아이콘 리소스, null이면 아이콘이 안보임
* @param modifier Modifier
* @param backgroundColor 배경색
* @param textColor 텍스트 색상
* @param textStyle 텍스트 스타일
* @param shape 모양
*/
@Composable
fun CommonSnackBar(
message: String,
backgroundColor: Color,
textColor: Color,
textStyle: TextStyle,
modifier: Modifier = Modifier,
icon: ImageVector? = null,
shape: Shape = RoundedCornerShape(12.dp),
) {
Box(
modifier = modifier
.background(
color = backgroundColor,
shape = shape,
)
.padding(
horizontal = 20.dp,
vertical = 12.dp,
),
) {
Row(verticalAlignment = Alignment.CenterVertically) {
if(icon != null) {
Icon(
imageVector = icon,
contentDescription = null,
tint = Color.Unspecified,
modifier = Modifier.size(18.dp),
)
Spacer(modifier = Modifier.width(8.dp))
}
Text(
text = message,
style = textStyle,
color = textColor,
)
}
}
}

@Preview(showBackground = true)
@Composable
fun CommonSnackBarPreview() {
NapzakMarketTheme {
CommonSnackBar(
message = "상품을 찜했어요!",
icon = ImageVector.vectorResource(id = R.drawable.ic_heart_toast_18),
backgroundColor = NapzakMarketTheme.colors.black70,
textColor = NapzakMarketTheme.colors.white,
textStyle = NapzakMarketTheme.typography.bodyMedium14,
shape = RoundedCornerShape(12.dp),
modifier = Modifier
.padding(16.dp)
.width(320.dp)
)
}
}

@Preview(showBackground = true)
@Composable
fun CommonSnackBarWithoutIconPreview() {
NapzakMarketTheme {
CommonSnackBar(
message = "버튼을 한번 더 누르시면 종료 돼요.",
backgroundColor = NapzakMarketTheme.colors.black70,
textColor = NapzakMarketTheme.colors.white,
textStyle = NapzakMarketTheme.typography.bodyMedium14,
shape = RoundedCornerShape(12.dp),
modifier = Modifier
.padding(16.dp)
.width(320.dp)
)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package com.napzak.market.core.type

enum class ProductConditionType(
val condition: String,
) {
UNUSED(condition = "미개봉"),
GOOD(condition = "아주 좋은 상태"),
SOSO(condition = "약간의 사용감"),
USED(condition = "사용감"),
}
enum class ProductConditionType(val label: String) {
GOOD("아주 좋은 상태"),
UNUSED("미개봉"),
SOSO("약간의 사용감"),
USED("사용감 있음");

companion object {
fun fromCondition(condition: String?): ProductConditionType {
return when (condition) {
GOOD.label -> GOOD
UNUSED.label -> UNUSED
SOSO.label -> SOSO
USED.label -> USED
else -> UNUSED
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.napzak.market.presentation.chat.navigation

import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import com.napzak.market.core.common.navigation.Route
import com.napzak.market.presentation.chat.screen.ItemChatRoute
import kotlinx.serialization.Serializable

fun NavController.navigateToItemChat(navOptions: NavOptions? = null) {
navigate(ItemChat, navOptions)
}

fun NavGraphBuilder.itemChatGraph(
onNavigateUp: () -> Unit,
modifier: Modifier = Modifier,
) {
composable<ItemChat> {
ItemChatRoute(
modifier = modifier,
onNavigateUp = onNavigateUp,
)
}
}

@Serializable
data object ItemChat : Route
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package com.napzak.market.presentation.chat.screen

import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
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.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.napzak.market.R
import com.napzak.market.core.designsystem.theme.NapzakMarketTheme
import androidx.compose.material3.Text
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource

/**
* 채팅 화면 하단 바를 표시하는 컴포넌트.
Expand All @@ -30,9 +33,9 @@ fun ChatScreen() {
verticalArrangement = Arrangement.Center,
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.img_chat_ready),
painter = painterResource(R.drawable.img_chat_ready),
contentDescription = stringResource(R.string.loading_ready_image_description),
tint = Color.Unspecified
tint = Color.Unspecified,
)

Spacer(modifier = Modifier.height(20.dp))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ 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.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
Expand All @@ -36,36 +37,41 @@ import com.napzak.market.core.designsystem.theme.NapzakMarketTheme
import com.napzak.market.presentation.chat.component.ChatInfoSection
import com.napzak.market.presentation.chat.type.ChatType

/**
* 채팅 화면 컴포넌트.
*
* 구매 또는 판매 채팅 유형에 따라 제목, 설명, 가격 정보를 표시합니다.
* 필요에 따라 가격 레이블을 추가로 표시할 수 있습니다.
*
* @param chatType 채팅의 유형 (구매 또는 판매)
* @param title 채팅 화면 상단에 표시될 제목 텍스트
* @param description 채팅 화면 상단에 표시될 설명 텍스트
* @param price 채팅 화면 상단에 표시될 가격 정보 텍스트
* @param showPriceLabel 가격 앞에 레이블을 표시할지 여부 (true: 레이블 표시, false: 레이블 숨김)
*/
@Composable
fun ItemChatRoute(
Copy link
Contributor

Choose a reason for hiding this comment

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

p3: 채팅관련 코드가 상세페이지 피알에 왜 같이 있는걸까요?

Copy link
Member Author

Choose a reason for hiding this comment

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

저번에 리드분이랑 만든 코드 다 같이 보면서 수정하느라 커밋에 들어갔습니다ㅠ

modifier: Modifier = Modifier,
onNavigateUp: () -> Unit = {},
) {
ItemChatScreen(
chatType = ChatType.BUY,
title = stringResource(id = R.string.chat_screen_title_buy),
description = stringResource(id = R.string.chat_screen_description_buy),
price = stringResource(id = R.string.chat_screen_price_buy),
showPriceLabel = true,
onBackClick = onNavigateUp,
modifier = modifier,
)
}

@Composable
fun ItemChatScreen(
chatType: ChatType,
title: String,
description: String,
price: String,
showPriceLabel: Boolean
showPriceLabel: Boolean,
onBackClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(modifier = Modifier
.fillMaxSize()
.background(NapzakMarketTheme.colors.white)) {
Box(
modifier = modifier
.fillMaxSize()
.background(NapzakMarketTheme.colors.white),
) {
Column(modifier = Modifier.fillMaxSize()) {
BackTopBar(
title = title,
onBackClick = {
// TODO: 뒤로가기 액션 구현 필요
},
onBackClick = onBackClick,
modifier = Modifier.fillMaxWidth(),
textStyle = NapzakMarketTheme.typography.titleSemi18,
backgroundColor = NapzakMarketTheme.colors.white,
Expand All @@ -92,7 +98,7 @@ fun ItemChatScreen(
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Image(
imageVector = ImageVector.vectorResource(id = R.drawable.img_chat_background),
painter = painterResource(id = R.drawable.img_chat_background),
contentDescription = stringResource(id = R.string.chat_background_image_description),
)
}
Expand Down Expand Up @@ -135,7 +141,7 @@ fun ItemChatScreen(
onValueChange = {},
placeholder = {
Text(
text = "메시지를 입력하세요.",
text = stringResource(id = R.string.chat_message_placeholder),
color = NapzakMarketTheme.colors.gray400,
style = NapzakMarketTheme.typography.bodyMedium14,
)
Expand Down Expand Up @@ -170,7 +176,8 @@ fun ChatScreenBuyPreview() {
title = "납작한 외계인",
description = "양스타 토모에 히요리 이츠누이 함께",
price = "100,000원대",
showPriceLabel = true
showPriceLabel = true,
onBackClick = {}
)
}

Expand All @@ -182,6 +189,7 @@ fun ChatScreenSellPreview() {
title = "납작한 외계인",
description = "딸기 마이멜로디 마스코트 인형",
price = "35,000원",
showPriceLabel = false
showPriceLabel = false,
onBackClick = {}
)
}
Loading
Loading