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

[Feat/#34] 장소 상세 페이지 StoreInfo, StoreInfoItem 구현 #35

Merged
merged 12 commits into from
Jan 16, 2025
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(
Copy link
Collaborator

Choose a reason for hiding this comment

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

P1: 상호명이 빠졌어요!! 인자로 추가해주세요~~

Copy link
Member Author

Choose a reason for hiding this comment

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

구조가 바뀌었습니다! 확인 부탁드려요!

Copy link
Member

Choose a reason for hiding this comment

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

p1) 너무 외부까지 slot으로 뚫은 것 같아요.
내부에서 일부 선언해서 컴포넌트로 사용할 수 있게 해주세요

현재 Preview를 보시면 컴포넌트를 사용하는데 최소 120줄을 사용하고 있어요.
이것은 컴포넌트라고 볼 수 없을 것 같아요

Copy link
Member Author

Choose a reason for hiding this comment

The 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(
Copy link
Member

Choose a reason for hiding this comment

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

p1) StoreInfoItem이라는 컴포넌트를 재활용 하기에 불편한 것 같습니다.
isMenu라는 변수로 두가지 상태를 제어한다는 것이 추후 재사용에 상당히 불리한 것 같습니다.

Base를 하나 만들고 이를 활용한 두개의 컴포넌트를 만드는 방법도 있으니 고민해보시면 좋을 것 같습니다.

Copy link
Member Author

Choose a reason for hiding this comment

The 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
)
)
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
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>
</resources>
Loading