Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -55,24 +54,26 @@ 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
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()
Expand Down Expand Up @@ -110,7 +111,7 @@ fun HomeDayoPickScreen(
.align(Alignment.CenterVertically)
)
}
CategoryButton(selectedCategoryName, coroutineScope, bottomSheetState)
CategoryButton(selectedCategoryName, onCategoryClick)
}
}

Expand Down Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -45,23 +44,26 @@ 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
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()
Expand Down Expand Up @@ -99,7 +101,7 @@ fun HomeNewScreen(
.align(Alignment.CenterVertically)
)
}
CategoryButton(selectedCategoryName, coroutineScope, bottomSheetState)
CategoryButton(selectedCategoryName, onCategoryClick)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -124,30 +126,26 @@ fun HomeScreen(
selectedCategory.first,
onPostClick,
onProfileClick,
coroutineScope,
bottomSheetState,
onCategoryClick,
homeViewModel
)
homeViewModel.loadDayoPickPosts()
}

HOME_NEW_PAGE_TAB_ID -> {
HomeNewScreen(
selectedCategory.first,
onPostClick,
onProfileClick,
coroutineScope,
bottomSheetState,
onCategoryClick,
homeViewModel
)
homeViewModel.loadNewPosts()
}
}
}
}

bottomSheetContent {
CategoryBottomSheetDialog(onClickCategory, selectedCategory, coroutineScope, bottomSheetState)
CategoryBottomSheetDialog(onCategorySelect, selectedCategory, coroutineScope, bottomSheetState)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 ->
Expand All @@ -92,7 +89,7 @@ internal fun MainScreen(
onSearchClick = { navigator.navigateSearch() },
coroutineScope = coroutineScope,
bottomSheetState = bottomSheetState,
bottomSheetContent = bottomSheetContent,
bottomSheetContent = { content -> bottomSheetContent = content },
)
feedNavGraph(
snackBarHostState = snackBarHostState,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -32,12 +31,10 @@ class HomeViewModel @Inject constructor(
private val requestUnlikePostUseCase: RequestUnlikePostUseCase
) : ViewModel() {
private val _isRefreshing = MutableStateFlow(false)
val isRefreshing: StateFlow<Boolean>
get() = _isRefreshing.asStateFlow()
val isRefreshing = _isRefreshing.asStateFlow()

private val _currentCategory = MutableStateFlow(Category.ALL)
val currentCategory: StateFlow<Category>
get() = _currentCategory.asStateFlow()
val currentCategory = _currentCategory.asStateFlow()

private val _dayoPickPostList = MutableLiveData<Resource<List<Post>>>()
val dayoPickPostList: LiveData<Resource<List<Post>>> get() = _dayoPickPostList
Expand Down Expand Up @@ -67,15 +64,15 @@ class HomeViewModel @Inject constructor(
}
}

fun requestDayoPickPostList() = viewModelScope.launch {
private fun requestDayoPickPostList() = viewModelScope.launch {
_dayoPickPostList.postValue(Resource.loading(null))
when (currentCategory.value) {
Category.ALL -> requestHomeDayoPickPostList()
else -> requestHomeDayoPickPostListCategory(currentCategory.value)
}
}

fun requestNewPostList() = viewModelScope.launch {
private fun requestNewPostList() = viewModelScope.launch {
_newPostList.postValue(Resource.loading(null))
when (currentCategory.value) {
Category.ALL -> requestHomeNewPostList()
Expand All @@ -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))
Expand Down