diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt index 3bb2baaa..3e60073b 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt @@ -36,9 +36,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource 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 androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.paging.PagingData +import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey import coil.compose.AsyncImage @@ -51,25 +54,41 @@ import daily.dayo.presentation.theme.Dark import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.theme.Gray2_767B83 import daily.dayo.presentation.theme.Primary_23C882 -import daily.dayo.presentation.theme.White_FFFFFF import daily.dayo.presentation.view.DayoOutlinedButton import daily.dayo.presentation.view.FilledButton import daily.dayo.presentation.view.TopNavigation import daily.dayo.presentation.view.TopNavigationAlign import daily.dayo.presentation.viewmodel.FollowViewModel import daily.dayo.presentation.viewmodel.PostViewModel +import daily.dayo.presentation.viewmodel.ProfileViewModel +import kotlinx.coroutines.flow.flowOf import java.text.DecimalFormat @Composable fun PostLikeUsersScreen( postId: Long, - onBackClick: () -> Unit, onProfileClick: (String) -> Unit, + onBackClick: () -> Unit, postViewModel: PostViewModel = hiltViewModel(), + profileViewModel: ProfileViewModel = hiltViewModel(), followViewModel: FollowViewModel = hiltViewModel() ) { + val currentMemberId = profileViewModel.currentMemberId val likeCount = postViewModel.postLikeCountUiState.collectAsStateWithLifecycle() val likeUserList = postViewModel.postLikeUsers.collectAsLazyPagingItems() + val onFollowClick: (LikeUser) -> Unit = { user -> + if (!user.follow) { + followViewModel.requestFollow( + followerId = user.memberId, + isFollower = false + ) + } else { + followViewModel.requestUnfollow( + followerId = user.memberId, + isFollower = true + ) + } + } val followSuccess by followViewModel.followingFollowSuccess.observeAsState() val unFollowSuccess by followViewModel.followerUnfollowSuccess.observeAsState() @@ -79,6 +98,29 @@ fun PostLikeUsersScreen( postViewModel.requestPostLikeUsers(postId = postId) } + if (currentMemberId != null) { + PostLikeUsersScreen( + currentMemberId = currentMemberId, + likeCount = likeCount.value, + likeUsers = likeUserList, + onProfileClick = onProfileClick, + onFollowClick = onFollowClick, + onBackClick = onBackClick + ) + } else { + // TODO 에러 처리 + } +} + +@Composable +private fun PostLikeUsersScreen( + currentMemberId: String, + likeCount: Int, + likeUsers: LazyPagingItems, + onProfileClick: (String) -> Unit, + onFollowClick: (LikeUser) -> Unit, + onBackClick: () -> Unit +) { Scaffold( topBar = { TopNavigation( @@ -117,7 +159,7 @@ fun PostLikeUsersScreen( ) { val dec = DecimalFormat("#,###") Text( - text = " ${dec.format(likeCount.value)} ", + text = " ${dec.format(likeCount)} ", style = DayoTheme.typography.caption1.copy(Primary_23C882), modifier = Modifier.padding(vertical = 12.dp) ) @@ -131,26 +173,15 @@ fun PostLikeUsersScreen( // users items( - count = likeUserList.itemCount, - key = likeUserList.itemKey() + count = likeUsers.itemCount, + key = likeUsers.itemKey() ) { index -> - likeUserList[index]?.let { user -> + likeUsers[index]?.let { user -> LikeUserItem( likeUser = user, + isMine = user.memberId == currentMemberId, onProfileClick = onProfileClick, - onFollowClick = { - if (!user.follow) { - followViewModel.requestFollow( - followerId = user.memberId, - isFollower = false - ) - } else { - followViewModel.requestUnfollow( - followerId = user.memberId, - isFollower = true - ) - } - } + onFollowClick = { onFollowClick(user) } ) } } @@ -158,9 +189,11 @@ fun PostLikeUsersScreen( } } + @Composable private fun LikeUserItem( likeUser: LikeUser, + isMine: Boolean, onProfileClick: (String) -> Unit, onFollowClick: (LikeUser) -> Unit ) { @@ -194,7 +227,8 @@ private fun LikeUserItem( ) // nickname - Text(text = likeUser.nickname, + Text( + text = likeUser.nickname, style = DayoTheme.typography.b6.copy(Dark), modifier = Modifier.clickableSingle( indication = null, @@ -205,21 +239,37 @@ private fun LikeUserItem( Spacer(modifier = Modifier.weight(1f)) - if (!likeUser.follow) { - FilledButton( - onClick = { onFollowClick(likeUser) }, - modifier = Modifier.height(36.dp), - label = stringResource(id = R.string.follow_yet), - icon = { Icon(Icons.Filled.Add, stringResource(id = R.string.follow_yet)) }, - isTonal = true - ) - } else { - DayoOutlinedButton( - onClick = { onFollowClick(likeUser) }, - modifier = Modifier.height(36.dp), - label = stringResource(id = R.string.follow_already), - icon = { Icon(Icons.Filled.Check, stringResource(id = R.string.follow_already)) }) + if (!isMine) { + if (!likeUser.follow) { + FilledButton( + onClick = { onFollowClick(likeUser) }, + modifier = Modifier.height(36.dp), + label = stringResource(id = R.string.follow_yet), + icon = { Icon(Icons.Filled.Add, stringResource(id = R.string.follow_yet)) }, + isTonal = true + ) + } else { + DayoOutlinedButton( + onClick = { onFollowClick(likeUser) }, + modifier = Modifier.height(36.dp), + label = stringResource(id = R.string.follow_already), + icon = { Icon(Icons.Filled.Check, stringResource(id = R.string.follow_already)) }) + } } } } +} + +@Preview +@Composable +private fun PreviewPostLikeUsersScreen() { + val likeUsers = flowOf(PagingData.empty()).collectAsLazyPagingItems() + PostLikeUsersScreen( + currentMemberId = "", + likeCount = 1, + likeUsers = likeUsers, + onProfileClick = { }, + onFollowClick = { }, + onBackClick = { } + ) } \ No newline at end of file