diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index af348c36..5ba490a5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ + Unit = {} ) { Card( @@ -161,19 +162,21 @@ fun CardItemRoom( } } } - endDate?.let { - Spacer(modifier = Modifier.height(5.dp)) + if (!isExpired) { + endDate?.let { + Spacer(modifier = Modifier.height(5.dp)) - Text( - text = endDate - + if (isRecruiting) stringResource( - R.string.card_item_end - ) else stringResource(R.string.card_item_finish), + Text( + text = endDate + + if (isRecruiting) stringResource( + R.string.card_item_end + ) else stringResource(R.string.card_item_finish), - color = if (isRecruiting) colors.Red else colors.Grey01, - style = typography.menu_sb600_s12_h20, - maxLines = 1 - ) + color = if (isRecruiting) colors.Red else colors.Grey01, + style = typography.menu_sb600_s12_h20, + maxLines = 1 + ) + } } } } diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt index 14fcd678..821d534e 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt @@ -24,7 +24,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun LogoTopAppBar( modifier: Modifier = Modifier, - leftIcon: Painter, + leftIcon: Painter? = null, hasNotification: Boolean, onLeftClick: () -> Unit = {}, onRightClick: () -> Unit = {} @@ -56,12 +56,14 @@ fun LogoTopAppBar( horizontalArrangement = Arrangement.spacedBy(20.dp), verticalAlignment = Alignment.CenterVertically ) { - Icon( - painter = leftIcon, - contentDescription = "Left Icon", - tint = Color.Unspecified, - modifier = Modifier.clickable { onLeftClick() } - ) + leftIcon?.let { + Icon( + painter = it, + contentDescription = "Left Icon", + tint = Color.Unspecified, + modifier = Modifier.clickable { onLeftClick() } + ) + } Icon( painter = rightIcon, contentDescription = "Right Icon", diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt index eeb3a7f5..4607be3a 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt @@ -36,6 +36,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun FeedSubscribeBarlist( modifier: Modifier = Modifier, + followerNum: Int = 0, followerProfileImageUrls: List, onClick: () -> Unit ) { @@ -59,7 +60,8 @@ fun FeedSubscribeBarlist( color = colors.White ) ) { - append(stringResource(R.string.thip_num, followerProfileImageUrls.size)) } + append(stringResource(R.string.thip_num, followerNum)) + } withStyle( style = SpanStyle( color = colors.Grey diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt index eda45f2f..ce0a2a1e 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt @@ -121,8 +121,8 @@ fun FeedMyContent( Spacer(modifier = Modifier.height(16.dp)) FeedSubscribeBarlist( modifier = Modifier.padding(horizontal = 20.dp), - followerProfileImageUrls = userInfo.latestFollowerProfileImageUrls - ?: emptyList(), + followerNum = userInfo.followerCount, + followerProfileImageUrls = userInfo.latestFollowerProfileImageUrls, onClick = { onNavigateToSubscriptionList(userInfo.creatorId) } ) Spacer(modifier = Modifier.height(40.dp)) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt index 3de4b5e0..0ae8ae32 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt @@ -133,6 +133,7 @@ fun FeedOthersContent( Spacer(modifier = Modifier.height(16.dp)) FeedSubscribeBarlist( modifier = Modifier.padding(horizontal = 20.dp), + followerNum = userInfo.followerCount, followerProfileImageUrls = userInfo.latestFollowerProfileImageUrls, onClick = { onNavigateToSubscriptionList(userInfo.creatorId) } ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt b/app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt deleted file mode 100644 index c42f61be..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.texthip.thip.ui.group.done.mock - -import com.texthip.thip.ui.group.myroom.mock.RoomType - -data class MyRoomCardData( - val roomId: Int, - val bookImageUrl: String?, - val roomName: String, - val recruitCount: Int, - val memberCount: Int, - val endDate: String, - val type: String -) - -data class MyRoomsPaginationResult( - val data: List, - val nextCursor: String?, - val isLast: Boolean -) - -// 타입 기반 모집 상태 확인 함수 -fun MyRoomCardData.isRecruitingByType(): Boolean { - return when (type) { - RoomType.RECRUITING.value -> true - RoomType.PLAYING_AND_RECRUITING.value -> false - RoomType.PLAYING.value -> false - RoomType.EXPIRED.value -> false - else -> false - } -} - -fun MyRoomCardData.getEndDateInDays(): Int { - return when { - endDate.contains("일 뒤") -> { - endDate.replace("일 뒤", "").trim().toIntOrNull() ?: 0 - } - else -> 0 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt deleted file mode 100644 index 6fb081c4..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt +++ /dev/null @@ -1,199 +0,0 @@ -package com.texthip.thip.ui.group.done.screen - -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.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Text -import androidx.compose.material3.pulltorefresh.PullToRefreshBox -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -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 com.texthip.thip.R -import com.texthip.thip.data.model.rooms.response.MyRoomResponse -import com.texthip.thip.ui.common.cards.CardItemRoom -import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.group.done.viewmodel.GroupDoneUiState -import com.texthip.thip.ui.group.done.viewmodel.GroupDoneViewModel -import com.texthip.thip.ui.theme.ThipTheme -import com.texthip.thip.ui.theme.ThipTheme.colors -import com.texthip.thip.ui.theme.ThipTheme.typography -import com.texthip.thip.utils.rooms.RoomUtils - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun GroupDoneScreen( - onRoomClick: (Int) -> Unit = {}, - onNavigateBack: () -> Unit = {}, - viewModel: GroupDoneViewModel = hiltViewModel() -) { - val uiState by viewModel.uiState.collectAsState() - - GroupDoneContent( - uiState = uiState, - onRoomClick = onRoomClick, - onNavigateBack = onNavigateBack, - onRefresh = { viewModel.refreshData() }, - onLoadMore = { viewModel.loadMoreExpiredRooms() } - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun GroupDoneContent( - uiState: GroupDoneUiState, - onRoomClick: (Int) -> Unit = {}, - onNavigateBack: () -> Unit = {}, - onRefresh: () -> Unit = {}, - onLoadMore: () -> Unit = {} -) { - val listState = rememberLazyListState() - - // 무한 스크롤을 위한 로직 - val shouldLoadMore by remember(uiState.canLoadMore, uiState.isLoadingMore) { - derivedStateOf { - val lastVisibleIndex = listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0 - val totalItems = listState.layoutInfo.totalItemsCount - uiState.canLoadMore && !uiState.isLoadingMore && totalItems > 0 && lastVisibleIndex >= totalItems - 3 - } - } - - LaunchedEffect(shouldLoadMore) { - if (shouldLoadMore) { - onLoadMore() - } - } - - Column( - Modifier.fillMaxSize() - ) { - DefaultTopAppBar( - title = stringResource(R.string.group_done_title), - onLeftClick = onNavigateBack, - ) - - PullToRefreshBox( - isRefreshing = uiState.isLoading, - onRefresh = onRefresh, - modifier = Modifier.fillMaxSize() - ) { - Column( - Modifier - .background(colors.Black) - .fillMaxSize() - .padding(horizontal = 20.dp) - ) { - LazyColumn( - state = listState, - verticalArrangement = Arrangement.spacedBy(20.dp), - contentPadding = PaddingValues(bottom = 20.dp), - modifier = Modifier - .fillMaxSize() - .padding(top = 16.dp) - ) { - item { - Text( - text = stringResource(R.string.group_done_user_comment, uiState.userName), - color = colors.White, - style = typography.menu_r400_s14_h24 - ) - } - - items(uiState.expiredRooms) { room -> - CardItemRoom( - title = room.roomName, - imageUrl = room.bookImageUrl, - participants = room.memberCount, - maxParticipants = room.recruitCount, // 모집 인원 수 사용 - isRecruiting = RoomUtils.isRecruitingByType(room.type), - isSecret = !room.isPublic, - onClick = { onRoomClick(room.roomId) } - ) - } - } - } - } - } -} - - -@Preview -@Composable -fun GroupDoneScreenPreview() { - ThipTheme { - GroupDoneContent( - uiState = GroupDoneUiState( - userName = "김독서", - expiredRooms = listOf( - MyRoomResponse( - roomId = 1, - roomName = "🌙 미드나이트 라이브러리 함께읽기", - bookImageUrl = "https://picsum.photos/300/400?1", - memberCount = 18, - recruitCount = 20, - endDate = "2025-01-31", - type = "EXPIRED", - isPublic = true - ), - MyRoomResponse( - roomId = 2, - roomName = "📚 현대문학 깊이읽기 모임", - bookImageUrl = "https://picsum.photos/300/400?2", - memberCount = 12, - recruitCount = 15, - endDate = "2024-12-28", - type = "EXPIRED", - isPublic = false - ), - MyRoomResponse( - roomId = 3, - roomName = "🔬 과학책으로 세상보기", - bookImageUrl = "https://picsum.photos/300/400?3", - memberCount = 25, - recruitCount = 30, - endDate = "2024-12-15", - type = "EXPIRED", - isPublic = true - ), - MyRoomResponse( - roomId = 4, - roomName = "✨ 철학 고전 탐구하기", - bookImageUrl = "https://picsum.photos/300/400?4", - memberCount = 10, - recruitCount = 12, - endDate = "2024-11-20", - type = "EXPIRED", - isPublic = true - ), - MyRoomResponse( - roomId = 5, - roomName = "🎨 예술과 문학의 만남", - bookImageUrl = "https://picsum.photos/300/400?5", - memberCount = 16, - recruitCount = 20, - endDate = "2024-10-31", - type = "EXPIRED", - isPublic = false - ) - ), - isLoading = false, - hasMore = true - ) - ) - } -} - diff --git a/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt b/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt deleted file mode 100644 index df299ec1..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.texthip.thip.ui.group.done.viewmodel - -import com.texthip.thip.data.model.rooms.response.MyRoomResponse - -data class GroupDoneUiState( - val expiredRooms: List = emptyList(), - val isLoading: Boolean = false, - val isLoadingMore: Boolean = false, - val hasMore: Boolean = true, - val userName: String = "", - val error: String? = null -) { - val hasContent: Boolean get() = expiredRooms.isNotEmpty() - val canLoadMore: Boolean get() = !isLoading && !isLoadingMore && hasMore -} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt deleted file mode 100644 index f6cc44ac..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.texthip.thip.ui.group.done.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.texthip.thip.data.repository.RoomsRepository -import com.texthip.thip.ui.group.myroom.mock.RoomType -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -class GroupDoneViewModel @Inject constructor( - private val repository: RoomsRepository -) : ViewModel() { - - private val _uiState = MutableStateFlow(GroupDoneUiState()) - val uiState: StateFlow = _uiState.asStateFlow() - - private var nextCursor: String? = null - private var isLastPage = false - private var isLoadingMore = false - private var isInitialLoading = false - - private fun updateState(update: (GroupDoneUiState) -> GroupDoneUiState) { - _uiState.value = update(_uiState.value) - } - - init { - loadInitialData() - } - - private fun loadInitialData() { - loadUserName() - loadExpiredRooms(reset = true) - } - - private fun loadUserName() { - viewModelScope.launch { - repository.getUserName() - .onSuccess { name -> - updateState { it.copy(userName = name) } - } - } - } - - fun loadExpiredRooms(reset: Boolean = false) { - // 중복 호출 방지 - if (reset) { - if (isInitialLoading) return - isInitialLoading = true - } else { - if (isLoadingMore || isLastPage) return - isLoadingMore = true - } - - viewModelScope.launch { - try { - if (reset) { - updateState { it.copy(isLoading = true, expiredRooms = emptyList(), hasMore = true) } - nextCursor = null - isLastPage = false - } - - repository.getMyRoomsByType(RoomType.EXPIRED.value, nextCursor) - .onSuccess { myRoomListResponse -> - myRoomListResponse?.let { response -> - val currentList = if (reset) emptyList() else uiState.value.expiredRooms - updateState { - it.copy( - expiredRooms = currentList + response.roomList, - error = null, - isLoadingMore = false, - hasMore = !response.isLast - ) - } - nextCursor = response.nextCursor - isLastPage = response.isLast - } ?: run { - // null 응답 시 더 이상 로드할 수 없음을 명시 - updateState { it.copy(hasMore = false, isLoadingMore = false) } - isLastPage = true - } - } - .onFailure { exception -> - updateState { it.copy(error = exception.message) } - } - } finally { - if (reset) { - updateState { it.copy(isLoading = false) } - isInitialLoading = false - } else { - updateState { it.copy(isLoadingMore = false) } - isLoadingMore = false - } - } - } - } - - fun loadMoreExpiredRooms() { - loadExpiredRooms(reset = false) - } - - fun refreshData() { - loadExpiredRooms(reset = true) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt index 33166c67..a114b43f 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt @@ -34,6 +34,12 @@ fun GroupMyRoomFilterRow( isSelected = selectedStates[1], onClick = { onToggle(1) } ) + OptionChipButton( + text = stringResource(R.string.finish), + isFilled = true, + isSelected = selectedStates[2], + onClick = { onToggle(2) } + ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt index fe71e4f1..06188785 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt @@ -1,7 +1,7 @@ package com.texthip.thip.ui.group.myroom.mock enum class RoomType(val value: String) { - PLAYING_AND_RECRUITING("playingAndRecruiting"), + ALL("playingAndRecruiting"), RECRUITING("recruiting"), PLAYING("playing"), EXPIRED("expired") diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index 26022136..01298d87 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -92,9 +92,10 @@ fun GroupMyContent( // Filter 상태를 val selectedStates = remember(uiState.currentRoomType) { when (uiState.currentRoomType) { - RoomType.PLAYING -> booleanArrayOf(true, false) - RoomType.RECRUITING -> booleanArrayOf(false, true) - else -> booleanArrayOf(false, false) // playingAndRecruiting + RoomType.PLAYING -> booleanArrayOf(true, false, false) // 진행중 + RoomType.RECRUITING -> booleanArrayOf(false, true, false) // 모집중 + RoomType.EXPIRED -> booleanArrayOf(false, false, true) // 완료 + else -> booleanArrayOf(false, false, false) // 전체(아무것도 선택 안함) } } @@ -123,27 +124,34 @@ fun GroupMyContent( GroupMyRoomFilterRow( selectedStates = selectedStates, onToggle = { idx -> - val newRoomType = when { + val newRoomType = when(idx) { // 진행중 버튼을 눌렀을 때 - idx == 0 -> { + 0 -> { if (selectedStates[0]) { // 이미 선택된 상태면 전체로 변경 - RoomType.PLAYING_AND_RECRUITING + RoomType.ALL } else { // 선택되지 않은 상태면 진행중만 RoomType.PLAYING } } // 모집중 버튼을 눌렀을 때 - idx == 1 -> { + 1 -> { if (selectedStates[1]) { - RoomType.PLAYING_AND_RECRUITING + RoomType.ALL } else { RoomType.RECRUITING } } - - else -> RoomType.PLAYING_AND_RECRUITING + // 완료 버튼을 눌렀을 때 + 2 -> { + if (selectedStates[2]) { + RoomType.ALL + } else { + RoomType.EXPIRED + } + } + else -> RoomType.ALL } onChangeRoomType(newRoomType) } @@ -167,6 +175,7 @@ fun GroupMyContent( endDate = room.endDate, imageUrl = room.bookImageUrl, isSecret = !room.isPublic, + isExpired = (room.type == RoomType.EXPIRED.value), onClick = { onCardClick(room) } ) } @@ -265,7 +274,7 @@ fun GroupMyScreenPreview() { isPublic = false ) ), - currentRoomType = RoomType.PLAYING_AND_RECRUITING, + currentRoomType = RoomType.ALL, isLoading = false, hasMore = true ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt index d48e308f..3228da72 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt @@ -5,7 +5,7 @@ import com.texthip.thip.ui.group.myroom.mock.RoomType data class GroupMyUiState( val myRooms: List = emptyList(), - val currentRoomType: RoomType = RoomType.PLAYING_AND_RECRUITING, + val currentRoomType: RoomType = RoomType.ALL, val isLoading: Boolean = false, val isLoadingMore: Boolean = false, val hasMore: Boolean = true, diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt index add51661..57272c38 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.group.note.screen +import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing @@ -43,7 +44,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.texthip.thip.R -import com.texthip.thip.ui.feed.viewmodel.FeedViewModel import com.texthip.thip.data.model.rooms.response.PostList import com.texthip.thip.data.model.rooms.response.RoomsRecordsPinResponse import com.texthip.thip.ui.common.bottomsheet.MenuBottomSheet @@ -54,6 +54,7 @@ import com.texthip.thip.ui.common.header.HeaderMenuBarTab import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.modal.ToastWithDate import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.feed.viewmodel.FeedViewModel import com.texthip.thip.ui.group.note.component.CommentBottomSheet import com.texthip.thip.ui.group.note.component.FilterHeaderSection import com.texthip.thip.ui.group.note.component.TextCommentCard @@ -226,6 +227,22 @@ fun GroupNoteContent( val commentsViewModel: CommentsViewModel = hiltViewModel() val commentsUiState by commentsViewModel.uiState.collectAsStateWithLifecycle() + BackHandler(enabled = isOverlayVisible) { + if (isCommentBottomSheetVisible) { + isCommentBottomSheetVisible = false + selectedPostForComment = null + onEvent(GroupNoteEvent.RefreshPosts) + } else if (selectedPostForMenu != null) { + selectedPostForMenu = null + } else if (showDeleteDialog) { + showDeleteDialog = false + postToDelete = null + } else if (isPinDialogVisible) { + isPinDialogVisible = false + postToPin = null + } + } + LaunchedEffect(showToast) { if (showToast) { delay(3000) diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt index 9f9e3aba..fc0661f5 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt @@ -32,9 +32,9 @@ import com.texthip.thip.R import com.texthip.thip.data.model.rooms.response.JoinedRoomResponse import com.texthip.thip.data.model.rooms.response.RoomMainList import com.texthip.thip.data.model.rooms.response.RoomMainResponse +import com.texthip.thip.ui.common.alarmpage.viewmodel.AlarmViewModel import com.texthip.thip.ui.common.buttons.FloatingButton import com.texthip.thip.ui.common.modal.ToastWithDate -import com.texthip.thip.ui.common.alarmpage.viewmodel.AlarmViewModel import com.texthip.thip.ui.common.topappbar.LogoTopAppBar import com.texthip.thip.ui.feed.component.EmptyMySubscriptionBar import com.texthip.thip.ui.group.myroom.component.GroupMySectionHeader @@ -51,7 +51,6 @@ import kotlinx.coroutines.delay @Composable fun GroupScreen( onNavigateToMakeRoom: () -> Unit = {}, - onNavigateToGroupDone: () -> Unit = {}, // 완료된 화면으로 이동 onNavigateToAlarm: () -> Unit = {}, // 알림 화면으로 이동 onNavigateToGroupSearch: () -> Unit = {}, // 검색 화면으로 이동 onNavigateToGroupMy: () -> Unit = {}, // 내 모임방 화면으로 이동 @@ -73,7 +72,6 @@ fun GroupScreen( uiState = uiState, hasUnreadNotifications = alarmUiState.hasUnreadNotifications, onNavigateToMakeRoom = onNavigateToMakeRoom, - onNavigateToGroupDone = onNavigateToGroupDone, onNavigateToAlarm = onNavigateToAlarm, onNavigateToGroupSearch = onNavigateToGroupSearch, onNavigateToGroupMy = onNavigateToGroupMy, @@ -96,7 +94,6 @@ fun GroupContent( uiState: GroupUiState, hasUnreadNotifications: Boolean = false, onNavigateToMakeRoom: () -> Unit = {}, - onNavigateToGroupDone: () -> Unit = {}, onNavigateToAlarm: () -> Unit = {}, onNavigateToGroupSearch: () -> Unit = {}, onNavigateToGroupMy: () -> Unit = {}, @@ -131,7 +128,7 @@ fun GroupContent( // 검색창 GroupSearchTextField( - modifier = Modifier.padding(top = 72.dp, bottom = 32.dp), + modifier = Modifier.padding(top = 75.dp, bottom = 32.dp), onClick = onNavigateToGroupSearch ) @@ -189,9 +186,7 @@ fun GroupContent( // 상단바 LogoTopAppBar( - leftIcon = painterResource(R.drawable.ic_done), hasNotification = hasUnreadNotifications, - onLeftClick = onNavigateToGroupDone, onRightClick = onNavigateToAlarm ) diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt index b06889ac..9b0acdbb 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt @@ -1,5 +1,7 @@ package com.texthip.thip.ui.navigator +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost @@ -19,7 +21,11 @@ fun MainNavHost( ) { NavHost( navController = navController, - startDestination = MainTabRoutes.Feed + startDestination = MainTabRoutes.Feed, + enterTransition = { EnterTransition.None }, + exitTransition = { ExitTransition.None }, + popEnterTransition = { EnterTransition.None }, + popExitTransition = { ExitTransition.None } ) { feedNavigation( navController = navController, diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt index 85a5ccec..ac301186 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt @@ -33,11 +33,6 @@ fun NavHostController.navigateToGroupMakeRoomWithBook( ) } -// 완료된 모임방 목록으로 이동 -fun NavHostController.navigateToGroupDone() { - navigate(GroupRoutes.Done) -} - // 모임방 검색 화면으로 이동 fun NavHostController.navigateToGroupSearch(viewAll: Boolean = false) { navigate(GroupRoutes.Search(viewAll = viewAll)) diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt index 2f73ad51..03a8ca83 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt @@ -10,7 +10,6 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.toRoute import com.texthip.thip.ui.feed.viewmodel.FeedViewModel -import com.texthip.thip.ui.group.done.screen.GroupDoneScreen import com.texthip.thip.ui.group.makeroom.screen.GroupMakeRoomScreen import com.texthip.thip.ui.group.makeroom.viewmodel.GroupMakeRoomViewModel import com.texthip.thip.ui.group.myroom.mock.RoomType @@ -33,7 +32,6 @@ import com.texthip.thip.ui.group.viewmodel.GroupViewModel import com.texthip.thip.ui.navigator.extensions.navigateToAlarm import com.texthip.thip.ui.navigator.extensions.navigateToBookDetail import com.texthip.thip.ui.navigator.extensions.navigateToFeedWrite -import com.texthip.thip.ui.navigator.extensions.navigateToGroupDone import com.texthip.thip.ui.navigator.extensions.navigateToGroupMakeRoom import com.texthip.thip.ui.navigator.extensions.navigateToGroupMy import com.texthip.thip.ui.navigator.extensions.navigateToGroupNote @@ -76,9 +74,6 @@ fun NavGraphBuilder.groupNavigation( onNavigateToMakeRoom = { navController.navigateToGroupMakeRoom() }, - onNavigateToGroupDone = { - navController.navigateToGroupDone() - }, onNavigateToAlarm = { navController.navigateToAlarm() }, @@ -145,18 +140,6 @@ fun NavGraphBuilder.groupNavigation( ) } - // Group Done 화면 - composable { - GroupDoneScreen( - onRoomClick = { roomId -> - navController.navigateToGroupRoom(roomId, isExpired = true) - }, - onNavigateBack = { - navigateBack() - } - ) - } - // Group My 화면 composable { val groupMyViewModel: GroupMyViewModel = hiltViewModel() @@ -165,10 +148,12 @@ fun NavGraphBuilder.groupNavigation( viewModel = groupMyViewModel, onCardClick = { room -> val isRecruiting = room.type == RoomType.RECRUITING.value + val isExpired = (room.type == RoomType.EXPIRED.value) + if (isRecruiting) { navController.navigateToGroupRecruit(room.roomId) } else { - navController.navigateToGroupRoom(room.roomId, isExpired = false) + navController.navigateToGroupRoom(room.roomId, isExpired = isExpired) } }, onNavigateBack = { diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt index ddc9eb09..d67312eb 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt @@ -15,9 +15,6 @@ sealed class GroupRoutes : Routes() { val author: String ) : GroupRoutes() - @Serializable - data object Done : GroupRoutes() - @Serializable data class Search(val viewAll: Boolean = false) : GroupRoutes() diff --git a/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt index 36e83c4a..8a5a2876 100644 --- a/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt @@ -23,9 +23,6 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import com.texthip.thip.R import com.texthip.thip.ui.common.forms.SearchBookTextField import com.texthip.thip.ui.common.topappbar.LeftNameTopAppBar @@ -36,6 +33,9 @@ import com.texthip.thip.ui.search.component.SearchRecentBook import com.texthip.thip.ui.search.mock.BookData import com.texthip.thip.ui.search.viewmodel.SearchBookViewModel import com.texthip.thip.ui.theme.ThipTheme +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale @Composable fun SearchBookScreen( @@ -149,7 +149,7 @@ private fun SearchBookScreenContent( modifier = Modifier.fillMaxSize() ) { LeftNameTopAppBar( - title = stringResource(R.string.book_search_topappbar) + title = stringResource(R.string.nav_search) ) Column( modifier = Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt b/app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt index 52cb3f18..19f74f84 100644 --- a/app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt @@ -53,6 +53,7 @@ fun SignupGenreScreen( onNextClick = viewModel::signup ) } + @Composable fun SignupGenreContent( uiState: SignupUiState, @@ -81,6 +82,7 @@ fun SignupGenreContent( modifier = Modifier .padding(horizontal = 20.dp) .fillMaxWidth() + .weight(1f) ) { Text( text = stringResource(R.string.select_genre), @@ -107,7 +109,14 @@ fun SignupGenreContent( userScrollEnabled = false, ) { itemsIndexed(uiState.roleCards) { index, roleItem -> + val modifier = if (index == uiState.roleCards.lastIndex) { + Modifier.padding(bottom = 40.dp) + } else { + Modifier + } + RoleCard( + modifier = modifier, genre = roleItem.genre, role = roleItem.role, imageUrl = roleItem.imageUrl, diff --git a/app/src/main/res/drawable/ic_plusfriend.xml b/app/src/main/res/drawable/ic_plusfriend.xml index 6464c2ce..0d2d3279 100644 --- a/app/src/main/res/drawable/ic_plusfriend.xml +++ b/app/src/main/res/drawable/ic_plusfriend.xml @@ -1,30 +1,30 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 27ba25e0..e23ee58a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -237,7 +237,7 @@ 전체페이지를 초과할 수 없어요. 지금 읽은 그 부분, 어땠나요? ...한 생각이 들었어요.🤔 - 투표 내용을 20자 이내로 입력하세요. + 투표 제목을 20자 이내로 입력하세요. 항목을 20자 이내로 입력 항목 추가 독서 진행도 80% 이상부터 총평을 볼 수 있어요. @@ -387,7 +387,6 @@ 가장 많이 검색된 책 - 검색 책 제목, 작가명을 검색해보세요. 현재 등록된 책이 없어요. 원하는 책을 신청해주세요!