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 @@
가장 많이 검색된 책
- 검색
책 제목, 작가명을 검색해보세요.
현재 등록된 책이 없어요.
원하는 책을 신청해주세요!