-
Notifications
You must be signed in to change notification settings - Fork 0
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
[Feat/#34] 장소 상세 페이지 StoreInfo, StoreInfoItem 구현 #35
Changes from 11 commits
ff9fbf1
b08299f
9dd330b
9e4bb4a
6d6b8b6
f187f66
f8945cf
193dd10
a3317e5
1376aff
608683a
869c28b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package com.spoony.spoony.presentation.placeDetail.component | ||
|
||
import androidx.compose.foundation.layout.Row | ||
import androidx.compose.foundation.layout.Spacer | ||
import androidx.compose.foundation.layout.size | ||
import androidx.compose.foundation.layout.width | ||
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.text.TextStyle | ||
import androidx.compose.ui.text.style.TextOverflow | ||
import androidx.compose.ui.unit.Dp | ||
import androidx.compose.ui.unit.dp | ||
import com.spoony.spoony.core.designsystem.theme.SpoonyAndroidTheme | ||
|
||
@Composable | ||
fun PlaceDetailIconText( | ||
icon: ImageVector, | ||
iconSize: Dp, | ||
text: String, | ||
textStyle: TextStyle, | ||
modifier: Modifier = Modifier, | ||
textColor: Color = SpoonyAndroidTheme.colors.black, | ||
iconTint: Color = SpoonyAndroidTheme.colors.gray600 | ||
) { | ||
Row( | ||
modifier = modifier, | ||
verticalAlignment = Alignment.CenterVertically | ||
) { | ||
Icon( | ||
imageVector = icon, | ||
contentDescription = null, | ||
modifier = Modifier.size(iconSize), | ||
tint = iconTint | ||
) | ||
Spacer(modifier = Modifier.width(4.dp)) | ||
Text( | ||
text = text, | ||
color = textColor, | ||
style = textStyle, | ||
maxLines = 1, | ||
overflow = TextOverflow.Ellipsis | ||
) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
package com.spoony.spoony.presentation.placeDetail.component | ||
|
||
import androidx.compose.foundation.Canvas | ||
import androidx.compose.foundation.layout.Arrangement | ||
import androidx.compose.foundation.layout.Box | ||
import androidx.compose.foundation.layout.Column | ||
import androidx.compose.foundation.layout.PaddingValues | ||
import androidx.compose.foundation.layout.Spacer | ||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.foundation.layout.height | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.shape.RoundedCornerShape | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.runtime.key | ||
import androidx.compose.ui.Alignment | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.draw.blur | ||
import androidx.compose.ui.draw.clip | ||
import androidx.compose.ui.geometry.Offset | ||
import androidx.compose.ui.graphics.Color | ||
import androidx.compose.ui.graphics.PathEffect | ||
import androidx.compose.ui.graphics.vector.ImageVector | ||
import androidx.compose.ui.platform.LocalDensity | ||
import androidx.compose.ui.res.stringResource | ||
import androidx.compose.ui.res.vectorResource | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import com.spoony.spoony.R | ||
import com.spoony.spoony.core.designsystem.theme.SpoonyAndroidTheme | ||
import kotlinx.collections.immutable.ImmutableList | ||
import kotlinx.collections.immutable.immutableListOf | ||
|
||
@Composable | ||
fun StoreInfo( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. p1) 너무 외부까지 slot으로 뚫은 것 같아요. 현재 Preview를 보시면 컴포넌트를 사용하는데 최소 120줄을 사용하고 있어요. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 넵 수정했습니다! |
||
menuItems: ImmutableList<String>, | ||
locationSubTitle: String, | ||
location: String, | ||
isBlurred: Boolean, | ||
modifier: Modifier = Modifier | ||
) { | ||
Column( | ||
modifier = modifier | ||
.clip(RoundedCornerShape(8.dp)) | ||
.then( | ||
if (isBlurred) { | ||
Modifier.blur(16.dp) | ||
} else { | ||
Modifier | ||
} | ||
) | ||
) { | ||
StoreInfoItem( | ||
title = stringResource(id = R.string.PLACE_DETAIL_STORE_INFO_MENU_TITLE), | ||
padding = PaddingValues( | ||
top = 20.dp, | ||
bottom = 28.dp, | ||
start = 16.dp, | ||
end = 16.dp | ||
), | ||
shape = RoundedCornerShape( | ||
topStart = 8.dp, | ||
topEnd = 8.dp, | ||
bottomStart = 20.dp, | ||
bottomEnd = 20.dp | ||
) | ||
) { | ||
Column( | ||
verticalArrangement = Arrangement.spacedBy(12.dp) | ||
) { | ||
menuItems.forEach { menuItem -> | ||
key(menuItem) { | ||
PlaceDetailIconText( | ||
icon = ImageVector.vectorResource(R.drawable.ic_spoon_24), | ||
iconSize = 20.dp, | ||
text = menuItem, | ||
textStyle = SpoonyAndroidTheme.typography.body2m, | ||
modifier = Modifier.fillMaxWidth() | ||
) | ||
} | ||
} | ||
} | ||
} | ||
HorizontalDashedLine() | ||
StoreInfoItem( | ||
title = stringResource(id = R.string.PLACE_DETAIL_STORE_INFO_LOCATION_TITLE), | ||
padding = PaddingValues( | ||
vertical = 21.dp, | ||
horizontal = 16.dp | ||
), | ||
shape = RoundedCornerShape( | ||
topStart = 20.dp, | ||
topEnd = 20.dp, | ||
bottomStart = 8.dp, | ||
bottomEnd = 8.dp | ||
) | ||
) { | ||
Text( | ||
locationSubTitle, | ||
style = SpoonyAndroidTheme.typography.title2sb | ||
) | ||
Spacer(modifier = Modifier.height(11.dp)) | ||
PlaceDetailIconText( | ||
icon = ImageVector.vectorResource(R.drawable.ic_pin_24), | ||
iconSize = 20.dp, | ||
text = location, | ||
textStyle = SpoonyAndroidTheme.typography.body2m, | ||
modifier = Modifier.fillMaxWidth() | ||
) | ||
} | ||
} | ||
} | ||
|
||
@Composable | ||
private fun HorizontalDashedLine( | ||
modifier: Modifier = Modifier, | ||
color: Color = SpoonyAndroidTheme.colors.gray200, | ||
strokeWidth: Float = 2f, | ||
dashLengths: FloatArray = floatArrayOf(30f, 30f) | ||
) { | ||
val density = LocalDensity.current | ||
Box( | ||
modifier = modifier | ||
.fillMaxWidth() | ||
.height(with(density) { 1 / density.density }.dp) | ||
) { | ||
Canvas(modifier = Modifier.matchParentSize()) { | ||
val pathEffect = PathEffect.dashPathEffect( | ||
intervals = dashLengths, | ||
phase = 0f | ||
) | ||
val horizontalPadding = 25.dp.toPx() | ||
val yPos = size.height / 2 | ||
drawLine( | ||
color = color, | ||
start = Offset(x = horizontalPadding, y = yPos), | ||
end = Offset(x = size.width - horizontalPadding, y = yPos), | ||
strokeWidth = strokeWidth, | ||
pathEffect = pathEffect | ||
) | ||
} | ||
} | ||
} | ||
|
||
@Preview(showBackground = true) | ||
@Composable | ||
private fun StoreInfoPreview() { | ||
val menuItems = immutableListOf( | ||
"고등어봉초밥", | ||
"크렘브륄레", | ||
"사케" | ||
) | ||
SpoonyAndroidTheme { | ||
Column( | ||
horizontalAlignment = Alignment.CenterHorizontally, | ||
verticalArrangement = Arrangement.spacedBy(20.dp) | ||
) { | ||
StoreInfo( | ||
modifier = Modifier | ||
.padding(horizontal = 20.dp), | ||
isBlurred = true, | ||
menuItems = menuItems, | ||
locationSubTitle = "어키", | ||
location = "서울 마포구 연희로11가길 39" | ||
) | ||
StoreInfo( | ||
modifier = Modifier | ||
.padding(horizontal = 20.dp), | ||
isBlurred = false, | ||
menuItems = menuItems, | ||
locationSubTitle = "어키", | ||
location = "서울 마포구 연희로11가길 39" | ||
) | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
package com.spoony.spoony.presentation.placeDetail.component | ||
|
||
import androidx.compose.foundation.background | ||
import androidx.compose.foundation.layout.Arrangement | ||
import androidx.compose.foundation.layout.Column | ||
import androidx.compose.foundation.layout.PaddingValues | ||
import androidx.compose.foundation.layout.Spacer | ||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.foundation.layout.height | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.shape.RoundedCornerShape | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.runtime.key | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.graphics.Shape | ||
import androidx.compose.ui.graphics.vector.ImageVector | ||
import androidx.compose.ui.res.vectorResource | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import com.spoony.spoony.R | ||
import com.spoony.spoony.core.designsystem.theme.SpoonyAndroidTheme | ||
import kotlinx.collections.immutable.immutableListOf | ||
|
||
@Composable | ||
fun StoreInfoItem( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. p1) StoreInfoItem이라는 컴포넌트를 재활용 하기에 불편한 것 같습니다. Base를 하나 만들고 이를 활용한 두개의 컴포넌트를 만드는 방법도 있으니 고민해보시면 좋을 것 같습니다. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 구조 수정했습니다 확인 부탁드립니다! |
||
title: String, | ||
shape: Shape, | ||
padding: PaddingValues, | ||
modifier: Modifier = Modifier, | ||
content: @Composable () -> Unit | ||
) { | ||
Column( | ||
modifier = modifier | ||
.fillMaxWidth() | ||
.background( | ||
shape = shape, | ||
color = SpoonyAndroidTheme.colors.gray0 | ||
) | ||
.padding(padding) | ||
) { | ||
Text( | ||
title, | ||
style = SpoonyAndroidTheme.typography.body1b | ||
) | ||
Spacer(modifier = Modifier.height(12.dp)) | ||
content() | ||
} | ||
} | ||
|
||
@Preview | ||
@Composable | ||
private fun StoreInfoItemMenuPreview() { | ||
val menuItems = immutableListOf( | ||
"고등어봉초밥", | ||
"크렘브륄레", | ||
"사케" | ||
) | ||
SpoonyAndroidTheme { | ||
StoreInfoItem( | ||
title = "Menu", | ||
content = { | ||
Column( | ||
verticalArrangement = Arrangement.spacedBy(12.dp) | ||
) { | ||
menuItems.forEach { menuItem -> | ||
key(menuItem) { | ||
PlaceDetailIconText( | ||
icon = ImageVector.vectorResource(R.drawable.ic_spoon_24), | ||
iconSize = 20.dp, | ||
text = menuItem, | ||
textStyle = SpoonyAndroidTheme.typography.body2m, | ||
modifier = Modifier.fillMaxWidth() | ||
) | ||
} | ||
} | ||
} | ||
}, | ||
padding = PaddingValues( | ||
top = 20.dp, | ||
bottom = 28.dp, | ||
start = 16.dp, | ||
end = 16.dp | ||
), | ||
shape = RoundedCornerShape( | ||
topStart = 8.dp, | ||
topEnd = 8.dp, | ||
bottomStart = 20.dp, | ||
bottomEnd = 20.dp | ||
) | ||
) | ||
} | ||
} | ||
|
||
@Preview | ||
@Composable | ||
private fun StoreInfoItemLocationPreview() { | ||
SpoonyAndroidTheme { | ||
StoreInfoItem( | ||
title = "Location", | ||
content = { | ||
Text( | ||
"어키", | ||
style = SpoonyAndroidTheme.typography.title2sb | ||
) | ||
Spacer(modifier = Modifier.height(11.dp)) | ||
Column( | ||
verticalArrangement = Arrangement.spacedBy(12.dp) | ||
) { | ||
PlaceDetailIconText( | ||
icon = ImageVector.vectorResource(R.drawable.ic_pin_24), | ||
iconSize = 20.dp, | ||
text = "서울 마포구 연희로11가길 39", | ||
textStyle = SpoonyAndroidTheme.typography.body2m, | ||
modifier = Modifier.fillMaxWidth() | ||
) | ||
} | ||
}, | ||
padding = PaddingValues( | ||
vertical = 22.dp, | ||
horizontal = 16.dp | ||
), | ||
shape = RoundedCornerShape( | ||
topStart = 20.dp, | ||
topEnd = 20.dp, | ||
bottomStart = 8.dp, | ||
bottomEnd = 8.dp | ||
) | ||
) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,6 @@ | ||
<resources> | ||
<string name="app_name">Spoony-Android</string> | ||
<string name="COUNTER_TEXT">%1$s / %2$s</string> | ||
<string name="PLACE_DETAIL_STORE_INFO_MENU_TITLE">Menu</string> | ||
<string name="PLACE_DETAIL_STORE_INFO_LOCATION_TITLE">Location</string> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P1: string은 snake case로 네이밍합니다!! 이름만 수정해주세요~~!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 수정했습니다! |
||
</resources> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P1: 상호명이 빠졌어요!! 인자로 추가해주세요~~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
구조가 바뀌었습니다! 확인 부탁드려요!