11package com.project200.presentation.compose.components.display
22
3+ import androidx.annotation.DrawableRes
4+ import androidx.compose.foundation.Image
35import androidx.compose.foundation.background
46import androidx.compose.foundation.border
57import androidx.compose.foundation.layout.Box
68import androidx.compose.foundation.layout.size
79import androidx.compose.foundation.shape.CircleShape
8- import androidx.compose.material.icons.Icons
9- import androidx.compose.material.icons.filled.Person
10- import androidx.compose.material3.Icon
1110import androidx.compose.runtime.Composable
1211import androidx.compose.ui.Alignment
1312import androidx.compose.ui.Modifier
1413import androidx.compose.ui.draw.clip
1514import androidx.compose.ui.graphics.Color
1615import androidx.compose.ui.layout.ContentScale
16+ import androidx.compose.ui.res.painterResource
1717import androidx.compose.ui.unit.Dp
1818import androidx.compose.ui.unit.dp
1919import coil.compose.AsyncImage
20- import com.project200.presentation.compose.theme.ColorGray200
2120import com.project200.presentation.compose.theme.ColorGray300
2221import com.project200.presentation.compose.theme.ColorMain
22+ import com.project200.undabang.presentation.R
2323
2424/* *
2525 * 원형 프로필 아바타
26- * imageUrl이 null/blank면 Person 아이콘 placeholder를 표시합니다
26+ * imageUrl이 null/blank거나 로딩 실패 시 placeholderRes drawable을 표시합니다
2727 */
2828@Composable
2929fun UndabangAvatar (
@@ -34,6 +34,7 @@ fun UndabangAvatar(
3434 borderWidth : Dp = 2.dp,
3535 placeholderBackground : Color = ColorGray300 ,
3636 contentDescription : String = "프로필 이미지",
37+ @DrawableRes placeholderRes : Int = R .drawable.ic_profile_default,
3738) {
3839 Box (
3940 modifier =
@@ -48,22 +49,27 @@ fun UndabangAvatar(
4849 ),
4950 contentAlignment = Alignment .Center ,
5051 ) {
52+ val innerModifier =
53+ Modifier
54+ .size(size - borderWidth * 2 )
55+ .clip(CircleShape )
56+
5157 if (imageUrl.isNullOrBlank()) {
52- Icon (
53- imageVector = Icons . Default . Person ,
58+ Image (
59+ painter = painterResource(placeholderRes) ,
5460 contentDescription = contentDescription,
55- modifier = Modifier .size(size * 0.5f ) ,
56- tint = ColorGray200 ,
61+ contentScale = ContentScale . Crop ,
62+ modifier = innerModifier ,
5763 )
5864 } else {
5965 AsyncImage (
6066 model = imageUrl,
6167 contentDescription = contentDescription,
62- modifier =
63- Modifier
64- .size(size - borderWidth * 2 )
65- .clip(CircleShape ),
68+ placeholder = painterResource(placeholderRes),
69+ error = painterResource(placeholderRes),
70+ fallback = painterResource(placeholderRes),
6671 contentScale = ContentScale .Crop ,
72+ modifier = innerModifier,
6773 )
6874 }
6975 }
0 commit comments