diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt index 9c768b3b..85dd45d6 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt @@ -19,7 +19,6 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.pullrefresh.PullRefreshIndicator @@ -29,6 +28,7 @@ import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -41,7 +41,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import daily.dayo.presentation.R import daily.dayo.presentation.common.Status @@ -55,8 +54,6 @@ import daily.dayo.presentation.view.EmojiView import daily.dayo.presentation.view.FilledButton import daily.dayo.presentation.view.HomePostView import daily.dayo.presentation.viewmodel.HomeViewModel -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @Composable @@ -64,15 +61,19 @@ fun HomeDayoPickScreen( selectedCategoryName: String, onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, - coroutineScope: CoroutineScope, - bottomSheetState: ModalBottomSheetState, - homeViewModel: HomeViewModel = hiltViewModel() + onCategoryClick: () -> Unit, + homeViewModel: HomeViewModel ) { val dayoPickPostList = homeViewModel.dayoPickPostList.observeAsState() + val currentCategory = homeViewModel.currentCategory.collectAsStateWithLifecycle() val refreshing by homeViewModel.isRefreshing.collectAsStateWithLifecycle() val pullRefreshState = rememberPullRefreshState(refreshing, { homeViewModel.loadDayoPickPosts() }) var isEmpty by rememberSaveable { mutableStateOf(false) } + LaunchedEffect(currentCategory.value) { + homeViewModel.loadDayoPickPosts() + } + Box( modifier = Modifier .fillMaxSize() @@ -110,7 +111,7 @@ fun HomeDayoPickScreen( .align(Alignment.CenterVertically) ) } - CategoryButton(selectedCategoryName, coroutineScope, bottomSheetState) + CategoryButton(selectedCategoryName, onCategoryClick) } } @@ -180,20 +181,17 @@ private fun HomeDayoPickEmptyView() { } } -@OptIn(ExperimentalMaterialApi::class) @Composable fun CategoryButton( selectedCategory: String, - coroutineScope: CoroutineScope, - bottomSheetState: ModalBottomSheetState + onCategoryClick: () -> Unit ) { Button( - onClick = { coroutineScope.launch { bottomSheetState.show() } }, + onClick = onCategoryClick, shape = RoundedCornerShape(8.dp), contentPadding = PaddingValues(top = 6.dp, bottom = 6.dp, start = 12.dp, end = 4.dp), colors = androidx.compose.material3.ButtonDefaults.buttonColors(containerColor = White_FFFFFF, contentColor = Gray2_767B83), - modifier = Modifier - .border(1.dp, Gray6_F0F1F3, shape = RoundedCornerShape(8.dp)) + modifier = Modifier.border(1.dp, Gray6_F0F1F3, shape = RoundedCornerShape(8.dp)) ) { Text(text = selectedCategory, style = DayoTheme.typography.caption3) Spacer(modifier = Modifier.width(8.dp)) diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt index 9273c691..259b04c8 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt @@ -16,12 +16,12 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.pullrefresh.PullRefreshIndicator import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -34,7 +34,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import daily.dayo.presentation.R import daily.dayo.presentation.common.Status @@ -45,7 +44,6 @@ import daily.dayo.presentation.view.EmojiView import daily.dayo.presentation.view.FilledButton import daily.dayo.presentation.view.HomePostView import daily.dayo.presentation.viewmodel.HomeViewModel -import kotlinx.coroutines.CoroutineScope @OptIn(ExperimentalMaterialApi::class) @Composable @@ -53,15 +51,19 @@ fun HomeNewScreen( selectedCategoryName: String, onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, - coroutineScope: CoroutineScope, - bottomSheetState: ModalBottomSheetState, - homeViewModel: HomeViewModel = hiltViewModel() + onCategoryClick: () -> Unit, + homeViewModel: HomeViewModel ) { val newPostList = homeViewModel.newPostList.observeAsState() + val currentCategory = homeViewModel.currentCategory.collectAsStateWithLifecycle() val refreshing by homeViewModel.isRefreshing.collectAsStateWithLifecycle() val pullRefreshState = rememberPullRefreshState(refreshing, { homeViewModel.loadNewPosts() }) var isEmpty by rememberSaveable { mutableStateOf(false) } + LaunchedEffect(currentCategory.value) { + homeViewModel.loadNewPosts() + } + Box( modifier = Modifier .fillMaxSize() @@ -99,7 +101,7 @@ fun HomeNewScreen( .align(Alignment.CenterVertically) ) } - CategoryButton(selectedCategoryName, coroutineScope, bottomSheetState) + CategoryButton(selectedCategoryName, onCategoryClick) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt index 6b167f95..05f952f6 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt @@ -58,16 +58,18 @@ fun HomeScreen( ) { var homeTabState by rememberSaveable { mutableIntStateOf(HOME_DAYOPICK_PAGE_TAB_ID) } var selectedCategory by rememberSaveable { mutableStateOf(Pair(CategoryMenu.All.name, 0)) } // name, index - val onClickCategory: (CategoryMenu, Int) -> Unit = { categoryMenu, index -> + val onCategoryClick: () -> Unit = { + coroutineScope.launch { bottomSheetState.show() } + } + + val onCategorySelect: (CategoryMenu, Int) -> Unit = { categoryMenu, index -> selectedCategory = Pair(categoryMenu.name, index) homeViewModel.setCategory(categoryMenu.category) coroutineScope.launch { bottomSheetState.hide() } } BackHandler(enabled = bottomSheetState.isVisible) { - coroutineScope.launch { - bottomSheetState.hide() - } + coroutineScope.launch { bottomSheetState.hide() } } Scaffold( @@ -124,11 +126,9 @@ fun HomeScreen( selectedCategory.first, onPostClick, onProfileClick, - coroutineScope, - bottomSheetState, + onCategoryClick, homeViewModel ) - homeViewModel.loadDayoPickPosts() } HOME_NEW_PAGE_TAB_ID -> { @@ -136,18 +136,16 @@ fun HomeScreen( selectedCategory.first, onPostClick, onProfileClick, - coroutineScope, - bottomSheetState, + onCategoryClick, homeViewModel ) - homeViewModel.loadNewPosts() } } } } bottomSheetContent { - CategoryBottomSheetDialog(onClickCategory, selectedCategory, coroutineScope, bottomSheetState) + CategoryBottomSheetDialog(onCategorySelect, selectedCategory, coroutineScope, bottomSheetState) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt index c52917f6..5270e083 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt @@ -41,7 +41,6 @@ import daily.dayo.presentation.screen.home.HomeRoute import daily.dayo.presentation.screen.home.homeNavGraph import daily.dayo.presentation.screen.mypage.MyPageRoute import daily.dayo.presentation.screen.mypage.myPageNavGraph -import daily.dayo.presentation.screen.mypage.navigateBackToFolder import daily.dayo.presentation.screen.notification.NotificationRoute import daily.dayo.presentation.screen.notification.notificationNavGraph import daily.dayo.presentation.screen.post.postNavGraph @@ -67,17 +66,15 @@ internal fun MainScreen( val currentMemberId = profileViewModel.currentMemberId val coroutineScope = rememberCoroutineScope() val snackBarHostState = remember { SnackbarHostState() } + val bottomSheetState = getBottomSheetDialogState() - var bottomSheet: (@Composable () -> Unit)? by remember { mutableStateOf(null) } - val bottomSheetContent: (@Composable () -> Unit) -> Unit = { - bottomSheet = it - } + var bottomSheetContent by remember { mutableStateOf<(@Composable () -> Unit)?>(null) } Scaffold( snackbarHost = { SnackbarHost(hostState = snackBarHostState) } ) { Scaffold( - bottomBar = { bottomSheet?.let { it() } } + bottomBar = { bottomSheetContent?.invoke() } ) { Scaffold( content = { innerPadding -> @@ -92,7 +89,7 @@ internal fun MainScreen( onSearchClick = { navigator.navigateSearch() }, coroutineScope = coroutineScope, bottomSheetState = bottomSheetState, - bottomSheetContent = bottomSheetContent, + bottomSheetContent = { content -> bottomSheetContent = content }, ) feedNavGraph( snackBarHostState = snackBarHostState, @@ -102,7 +99,7 @@ internal fun MainScreen( onPostLikeUsersClick = { navigator.navigatePostLikeUsers(it) }, onPostHashtagClick = { navigator.navigateSearchPostHashtag(it) }, bottomSheetState = bottomSheetState, - bottomSheetContent = bottomSheetContent + bottomSheetContent = { content -> bottomSheetContent = content } ) postNavGraph( snackBarHostState = snackBarHostState, @@ -124,8 +121,8 @@ internal fun MainScreen( onTagClick = { navigator.navigateWriteTag() }, onWriteFolderClick = { navigator.navigateWriteFolder() }, onWriteFolderNewClick = { navigator.navigateWriteFolderNew() }, - bottomSheetState, - bottomSheetContent, + bottomSheetState = bottomSheetState, + bottomSheetContent = { content -> bottomSheetContent = content }, ) myPageNavGraph( navController = navigator.navController, diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt index dd0ab3e9..ef25d0fc 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt @@ -17,7 +17,6 @@ import daily.dayo.domain.usecase.post.RequestNewPostListUseCase import daily.dayo.presentation.common.Resource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -32,12 +31,10 @@ class HomeViewModel @Inject constructor( private val requestUnlikePostUseCase: RequestUnlikePostUseCase ) : ViewModel() { private val _isRefreshing = MutableStateFlow(false) - val isRefreshing: StateFlow - get() = _isRefreshing.asStateFlow() + val isRefreshing = _isRefreshing.asStateFlow() private val _currentCategory = MutableStateFlow(Category.ALL) - val currentCategory: StateFlow - get() = _currentCategory.asStateFlow() + val currentCategory = _currentCategory.asStateFlow() private val _dayoPickPostList = MutableLiveData>>() val dayoPickPostList: LiveData>> get() = _dayoPickPostList @@ -67,7 +64,7 @@ class HomeViewModel @Inject constructor( } } - fun requestDayoPickPostList() = viewModelScope.launch { + private fun requestDayoPickPostList() = viewModelScope.launch { _dayoPickPostList.postValue(Resource.loading(null)) when (currentCategory.value) { Category.ALL -> requestHomeDayoPickPostList() @@ -75,7 +72,7 @@ class HomeViewModel @Inject constructor( } } - fun requestNewPostList() = viewModelScope.launch { + private fun requestNewPostList() = viewModelScope.launch { _newPostList.postValue(Resource.loading(null)) when (currentCategory.value) { Category.ALL -> requestHomeNewPostList() @@ -84,7 +81,7 @@ class HomeViewModel @Inject constructor( } private fun requestHomeNewPostList() = viewModelScope.launch { - requestNewPostListUseCase()?.let { ApiResponse -> + requestNewPostListUseCase().let { ApiResponse -> when (ApiResponse) { is NetworkResponse.Success -> { _newPostList.postValue(Resource.success(ApiResponse.body?.data))