diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9bd0f17..3074494 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -58,6 +58,7 @@ dependencies { implementation(libs.activity.compose) implementation(platform(libs.compose.bom)) implementation(libs.ui) + implementation(libs.ui.navigation) implementation(libs.ui.graphics) implementation(libs.ui.tooling.preview) implementation(libs.material3) diff --git a/app/src/main/java/org/care/packie/MainActivity.kt b/app/src/main/java/org/care/packie/MainActivity.kt index d9635e3..fc520bc 100644 --- a/app/src/main/java/org/care/packie/MainActivity.kt +++ b/app/src/main/java/org/care/packie/MainActivity.kt @@ -3,10 +3,9 @@ package org.care.packie import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.viewModels +import androidx.compose.runtime.Composable import dagger.hilt.android.AndroidEntryPoint -import org.care.packie.feature.category.CategoryScreen -import org.care.packie.feature.category.CategoryViewModel +import org.care.packie.feature.stuffs.StuffsScreenRoot import org.care.packie.ui.theme.PackieTheme @AndroidEntryPoint @@ -15,7 +14,14 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - CategoryScreen() + PackieApp() } } } + +@Composable +fun PackieApp() { + PackieTheme { + StuffsScreenRoot() + } +} diff --git a/app/src/main/java/org/care/packie/data/repository/LocalStuffsRepository.kt b/app/src/main/java/org/care/packie/data/repository/LocalStuffsRepository.kt index 38a80d5..d46f133 100644 --- a/app/src/main/java/org/care/packie/data/repository/LocalStuffsRepository.kt +++ b/app/src/main/java/org/care/packie/data/repository/LocalStuffsRepository.kt @@ -9,15 +9,16 @@ import javax.inject.Inject class LocalStuffsRepository @Inject constructor( private val stuffsDataSource: StuffsDataSource, private val json: Json -): StuffsRepository { - override fun getRecommendedStuffsOf(category: String): List { - return stuffsDataSource.getRecommendedStuffsOf(category)?.let { - json.decodeFromString>(it) - } ?: emptyList() +) : StuffsRepository { + override suspend fun getRecommendedStuffsOf(category: String): List { + return stuffsDataSource.getRecommendedStuffsOf(category) + ?.let { + json.decodeFromString>(it) + } ?: emptyList() } - override fun setRecommendedStuffsOf(category: String, stuffs: List) { - val stuffsJson = json.encodeToString(stuffs) + override suspend fun setRecommendedStuffsOf(category: String, stuffs: List) { + val stuffsJson = json.encodeToString(stuffs) stuffsDataSource.saveRecommendedStuffsOf(category, stuffsJson) } } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/data/source/LocalStuffsDataSource.kt b/app/src/main/java/org/care/packie/data/source/LocalStuffsDataSource.kt index 1237d06..10bd0a0 100644 --- a/app/src/main/java/org/care/packie/data/source/LocalStuffsDataSource.kt +++ b/app/src/main/java/org/care/packie/data/source/LocalStuffsDataSource.kt @@ -2,18 +2,33 @@ package org.care.packie.data.source import android.content.SharedPreferences import androidx.core.content.edit +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import javax.inject.Inject class LocalStuffsDataSource @Inject constructor( private val prefs: SharedPreferences -): StuffsDataSource { - override fun getRecommendedStuffsOf(category: String): String? { - return prefs.getString(category, null) +) : StuffsDataSource { + override suspend fun getRecommendedStuffsOf( + category: String + ): String? = withContext(Dispatchers.IO) { + return@withContext prefs.getString(category, null) } - override fun saveRecommendedStuffsOf(category: String, stuffsJson: String) { + override suspend fun saveRecommendedStuffsOf( + category: String, + stuffsJson: String + ) = withContext(Dispatchers.IO) { prefs.edit { putString(category, stuffsJson) } } + + override suspend fun clear( + category: String + ) = withContext(Dispatchers.IO) { + prefs.edit { + remove(category) + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/data/source/StuffsDataSource.kt b/app/src/main/java/org/care/packie/data/source/StuffsDataSource.kt index 56135e0..f6f9d3d 100644 --- a/app/src/main/java/org/care/packie/data/source/StuffsDataSource.kt +++ b/app/src/main/java/org/care/packie/data/source/StuffsDataSource.kt @@ -1,6 +1,7 @@ package org.care.packie.data.source interface StuffsDataSource { - fun getRecommendedStuffsOf(category: String): String? - fun saveRecommendedStuffsOf(category: String, stuffsJson: String) + suspend fun getRecommendedStuffsOf(category: String): String? + suspend fun saveRecommendedStuffsOf(category: String, stuffsJson: String) + suspend fun clear(category: String) } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/di/RepositoryModule.kt b/app/src/main/java/org/care/packie/di/RepositoryModule.kt index 0e0faf5..92c5597 100644 --- a/app/src/main/java/org/care/packie/di/RepositoryModule.kt +++ b/app/src/main/java/org/care/packie/di/RepositoryModule.kt @@ -22,6 +22,6 @@ internal abstract class RepositoryModule { @Binds @Singleton abstract fun bindStuffsRepository( - localStuffsRepository: CategoryRepositoryImpl + localStuffsRepository: LocalStuffsRepository ): StuffsRepository } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/domain/Stuff.kt b/app/src/main/java/org/care/packie/domain/Stuff.kt new file mode 100644 index 0000000..7b36c0d --- /dev/null +++ b/app/src/main/java/org/care/packie/domain/Stuff.kt @@ -0,0 +1,9 @@ +package org.care.packie.domain + +import kotlinx.serialization.Serializable + +@Serializable +data class Stuff( + val name: String, + var isChecked: Boolean +) diff --git a/app/src/main/java/org/care/packie/domain/StuffsRepository.kt b/app/src/main/java/org/care/packie/domain/StuffsRepository.kt index 1aa2c5d..082fae9 100644 --- a/app/src/main/java/org/care/packie/domain/StuffsRepository.kt +++ b/app/src/main/java/org/care/packie/domain/StuffsRepository.kt @@ -1,6 +1,6 @@ package org.care.packie.domain interface StuffsRepository { - fun getRecommendedStuffsOf(category: String): List - fun setRecommendedStuffsOf(category: String, stuffs: List) + suspend fun getRecommendedStuffsOf(category: String): List + suspend fun setRecommendedStuffsOf(category: String, stuffs: List) } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsContent.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsContent.kt index 8ffe90e..69b2ec2 100644 --- a/app/src/main/java/org/care/packie/feature/stuffs/StuffsContent.kt +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsContent.kt @@ -2,14 +2,18 @@ package org.care.packie.feature.stuffs import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import org.care.packie.ui.component.stuff.MutableStuffsGrid import org.care.packie.ui.component.stuff.StuffsGrid +import org.care.packie.ui.theme.PackieDesignSystem import org.care.packie.ui.theme.PackieTheme import org.care.packie.utils.ui.CrossfadeToggle @@ -21,7 +25,7 @@ fun StuffsContent( stuffs: Map, onAdd: () -> Unit = {}, onRemove: (String) -> Unit = {}, - onToggle: (Boolean) -> Unit = {}, + onToggle: (String) -> Unit = {}, ) { Box( modifier = modifier @@ -37,15 +41,26 @@ fun StuffsContent( ) }, disableComposable = { - StuffsGrid( - state = state, - stuffs = stuffs, - onToggle = onToggle - ) + if (stuffs.isEmpty()) { + Text( + modifier = modifier + .fillMaxWidth() + .align(Alignment.Center), + text = "수정하기를 눌러 준비물을 추가해주세요!", + style = PackieDesignSystem.typography.subTitle, + color = PackieDesignSystem.colors.white, + textAlign = TextAlign.Center + ) + } else { + StuffsGrid( + state = state, + stuffs = stuffs, + onToggle = onToggle + ) + } } ) } - } @Preview @@ -60,10 +75,11 @@ fun StuffsContentPreview() { StuffsContent( modifier = Modifier.weight(1f), isEditMode = false, - stuffs = (1..100).associate { "item${it}" to false } + //stuffs = (1..100).associate { "item${it}" to false } + stuffs = emptyMap() ) StuffsStickyBottom(isEditMode = false) } } - + } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreen.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreen.kt index c43b66a..cc6b9a5 100644 --- a/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreen.kt +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreen.kt @@ -1,7 +1,5 @@ package org.care.packie.feature.stuffs -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.fadeIn import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.rememberLazyGridState @@ -9,45 +7,30 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateMapOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import kotlinx.coroutines.launch -import org.care.packie.StuffsPreviewProvider -import org.care.packie.ui.AddDialogType -import org.care.packie.ui.component.dialog.AddDialog -import org.care.packie.ui.component.stuff.rememberEditModeState import org.care.packie.ui.theme.PackieTheme import org.care.packie.utils.ui.scroll.PackieTopBarScrollBehavior import org.care.packie.utils.ui.scroll.rememberPackieTopBarState -private const val MIN_SPACER_SIZE = 4 -private const val MAX_SPACER_SIZE = 110 - @Composable fun StuffsScreen( category: String, + snackBarHostState: SnackbarHostState = remember { SnackbarHostState() }, + isEditMode: Boolean = false, currentStuffs: Map, - onClickToggle: (Boolean) -> Unit = {}, + onClickToggle: (String) -> Unit = {}, onClickRemove: (String) -> Unit = {}, onClickAdd: () -> Unit = {}, - onClickUpdate: (Map) -> Unit = {}, + onClickUpdate: (String) -> Unit = {}, + enableEditMode: () -> Unit = {}, + disableEditMode: () -> Unit = {}, + onCategoryClick: () -> Unit = {}, ) { - val editableStuffs = - remember { mutableStateMapOf().apply { putAll(currentStuffs) } } - val editMode = rememberEditModeState() - val scope = rememberCoroutineScope() - val snackBarHostState = remember { SnackbarHostState() } - var isDialogOpen by remember { mutableStateOf(false) } - val topBarScrollState = rememberPackieTopBarState( maxHeight = StuffsTopBarSpacerToken.maxHeight, minHeight = StuffsTopBarSpacerToken.minHeight @@ -69,57 +52,33 @@ fun StuffsScreen( topBar = { StuffsScreenTopBar( category = category, - isEditMode = editMode.isEditMode, - onCategoryClick = {}, - onBackClick = {}, + isEditMode = isEditMode, + onCategoryClick = onCategoryClick, + onBackClick = { disableEditMode() }, state = topBarScrollState ) }, bottomBar = { StuffsStickyBottom( - isEditMode = editMode.isEditMode, - onClickEdit = { - editMode.enableEditMode() - }, + isEditMode = isEditMode, + onClickEdit = enableEditMode, onClickUpdate = { - editMode.disableEditMode() - onClickUpdate(editableStuffs) + onClickUpdate(category) }, ) } ) { StuffsContent( - modifier = Modifier.padding(it), - isEditMode = editMode.isEditMode, - stuffs = if (editMode.isEditMode) editableStuffs else currentStuffs, - onAdd = { - isDialogOpen = true - }, - onRemove = {stuffName -> - editableStuffs.remove(stuffName) - }, + modifier = Modifier.padding(it) + .fillMaxSize(), + isEditMode = isEditMode, + stuffs = currentStuffs, + onAdd = onClickAdd, + onRemove = onClickRemove, onToggle = onClickToggle, state = lazyGridState ) } - - AnimatedVisibility( - visible = isDialogOpen, - enter = fadeIn() - ) { - AddDialog( - type = AddDialogType.STUFF, - onConfirmation = { - if (editableStuffs.put(it, false) != null) { - scope.launch { - snackBarHostState.showSnackbar("${it}은 이미 추가된 물건이에요") - } - } - isDialogOpen = false - }, - onDismiss = { isDialogOpen = false } - ) - } } @Preview @@ -128,7 +87,8 @@ fun StuffScreenPreview() { PackieTheme { StuffsScreen( category = "출근", - currentStuffs = StuffsPreviewProvider.mockStuffs + //currentStuffs = StuffsPreviewProvider.mockStuffs + currentStuffs = emptyMap() ) } } diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenRoot.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenRoot.kt new file mode 100644 index 0000000..b3fb1e7 --- /dev/null +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenRoot.kt @@ -0,0 +1,165 @@ +package org.care.packie.feature.stuffs + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import kotlinx.coroutines.launch +import org.care.packie.ui.DoneDialogType +import org.care.packie.ui.TextFieldDialogType +import org.care.packie.ui.component.dialog.DoneDialog +import org.care.packie.ui.component.dialog.TextFieldDialog +import org.care.packie.ui.component.stuff.rememberEditModeState +import org.care.packie.ui.theme.PackieTheme +import org.care.packie.utils.ui.LoadingScreen + +private val ALREADY_ADDED = "이미 추가된 물건이에요" +private val ALREADY_REMOVED = "이미 삭제된 물건이에요" + +@Composable +fun StuffsScreenRoot( + viewModel: StuffsViewModel = hiltViewModel() +) { + val category = "출근" + val state by viewModel.uiState.collectAsState() + val scope = rememberCoroutineScope() + var isAddStuffTextFieldDialogOpen by remember { + mutableStateOf(false) + } + var isDoneDialogOpen by remember { + mutableStateOf(false) + } + var isLoading by remember { + mutableStateOf(false) + } + val editMode = rememberEditModeState() + var stuffs by remember { + mutableStateOf(emptyMap()) + } + val snackBarHostState = remember { SnackbarHostState() } + when (state) { + is StuffsUiState.Loading -> { + isLoading = true + viewModel.getStuffs(category) + } + + is StuffsUiState.Success -> { + isLoading = false + editMode.disableEditMode() + stuffs = (state as StuffsUiState.Success).stuffs + } + + is StuffsUiState.SuccessEditMode -> { + isLoading = false + editMode.enableEditMode() + stuffs = (state as StuffsUiState.SuccessEditMode).stuffs + } + + is StuffsUiState.Complete -> { + isLoading = false + isDoneDialogOpen = true + } + } + StuffsScreen( + category = category, + snackBarHostState = snackBarHostState, + isEditMode = editMode.isEditMode, + currentStuffs = stuffs, + onClickToggle = viewModel::checkStuffs, + onClickAdd = { isAddStuffTextFieldDialogOpen = true }, + onClickRemove = { + viewModel.removeStuff(it).onFailure { + scope.launch { + snackBarHostState.showSnackbar(ALREADY_REMOVED) + } + } + }, + onClickUpdate = viewModel::saveStuffs, + enableEditMode = viewModel::enableEditMode, + disableEditMode = viewModel::disableEditMode, + onCategoryClick = {} + ) + ShowAddStuffTextFieldDialog( + visible = isAddStuffTextFieldDialogOpen, + onConfirmation = { + viewModel.addStuff(it) + .onSuccess { + isAddStuffTextFieldDialogOpen = false + } + .onFailure { + scope.launch { + snackBarHostState.showSnackbar(ALREADY_ADDED) + } + } + }, + onDismiss = { isAddStuffTextFieldDialogOpen = false } + ) + ShowDoneDialog( + visible = isDoneDialogOpen, + onConfirmation = { + scope.launch { + snackBarHostState.showSnackbar("이동만 하면 될듯") + } + }, + onDismiss = { isDoneDialogOpen = false } + ) + LoadingScreen( + visible = isLoading, + onDismissRequest = { isLoading = false } + ) +} + +@Composable +fun ShowAddStuffTextFieldDialog( + visible: Boolean = false, + onConfirmation: (String) -> Unit = {}, + onDismiss: () -> Unit = {} +) { + AnimatedVisibility( + visible = visible, + enter = fadeIn(), + exit = fadeOut() + ) { + TextFieldDialog( + type = TextFieldDialogType.ADD_STUFF, + onConfirmation = onConfirmation, + onDismiss = onDismiss + ) + } +} + +@Composable +fun ShowDoneDialog( + visible: Boolean = false, + onConfirmation: () -> Unit = {}, + onDismiss: () -> Unit = {} +) { + AnimatedVisibility( + visible = visible, + enter = fadeIn(), + exit = fadeOut() + ) { + DoneDialog( + type = DoneDialogType.COMPLETE, + onConfirm = onConfirmation, + onDismiss = onDismiss + ) + } +} + +@Preview +@Composable +fun StuffsScreenRootPreview() { + PackieTheme { + StuffsScreenRoot() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenTopBar.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenTopBar.kt index a69fb08..86da495 100644 --- a/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenTopBar.kt +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsScreenTopBar.kt @@ -9,7 +9,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsUiState.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsUiState.kt new file mode 100644 index 0000000..6279d36 --- /dev/null +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsUiState.kt @@ -0,0 +1,12 @@ +package org.care.packie.feature.stuffs + +sealed interface StuffsUiState { + object Loading: StuffsUiState + data class Success( + val stuffs: Map + ): StuffsUiState + data class SuccessEditMode( + val stuffs: Map + ): StuffsUiState + object Complete: StuffsUiState +} \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/feature/stuffs/StuffsViewModel.kt b/app/src/main/java/org/care/packie/feature/stuffs/StuffsViewModel.kt index 3f6ef55..39b9c48 100644 --- a/app/src/main/java/org/care/packie/feature/stuffs/StuffsViewModel.kt +++ b/app/src/main/java/org/care/packie/feature/stuffs/StuffsViewModel.kt @@ -1,12 +1,113 @@ package org.care.packie.feature.stuffs +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import org.care.packie.domain.StuffsRepository import javax.inject.Inject @HiltViewModel class StuffsViewModel @Inject constructor( private val stuffsRepository: StuffsRepository -) { +) : ViewModel() { + private val _uiState = MutableStateFlow(StuffsUiState.Loading) + val uiState: StateFlow = _uiState + + private val savedStuffs = mutableMapOf() + private val mutableStuffs = mutableMapOf() + + fun getStuffs(category: String) = viewModelScope.launch { + _uiState.value = StuffsUiState.Loading + val stuffs = stuffsRepository.getRecommendedStuffsOf(category) + emitStuffs(stuffs) + + } + + private suspend fun emitStuffs(stuffs: List) { + stuffs.associateWith { false }.let { + savedStuffs.clear() + savedStuffs.putAll(it) + _uiState.emit( + StuffsUiState.Success( + stuffs = savedStuffs.toMap() + ) + ) + } + } + + fun enableEditMode() { + mutableStuffs.clear() + mutableStuffs.putAll(savedStuffs) + _uiState.value = StuffsUiState.SuccessEditMode( + stuffs = mutableStuffs.toMap() + ) + + } + + fun disableEditMode() { + _uiState.value = StuffsUiState.Success( + stuffs = savedStuffs.toMap() + ) + + } + + fun checkStuffs(stuff: String) { + savedStuffs[stuff]?.let { + savedStuffs[stuff] = it.not() + updateSavedStuffsOnCheck() + } + if (!savedStuffs.containsValue(false)) { + _uiState.value = StuffsUiState.Complete + } + } + + private fun updateSavedStuffsOnCheck() { + _uiState.update { prevState -> + check(prevState is StuffsUiState.Success) + prevState.copy( + stuffs = savedStuffs.toMap() + ) + } + } + + fun addStuff(stuff: String): Result { + if (mutableStuffs.containsKey(stuff)) { + return Result.failure(IllegalStateException()) + } + mutableStuffs[stuff] = false + updateMutableStuffs() + return Result.success(Unit) + + } + + fun removeStuff(stuff: String): Result { + if (!mutableStuffs.containsKey(stuff)) { + return Result.failure(IllegalStateException()) + } + mutableStuffs.remove(stuff) + updateMutableStuffs() + return Result.success(Unit) + } + + private fun updateMutableStuffs() { + _uiState.update { prevState -> + check(prevState is StuffsUiState.SuccessEditMode) + prevState.copy( + stuffs = mutableStuffs.toMap() + ) + } + } + + fun saveStuffs(category: String) = viewModelScope.launch { + stuffsRepository.setRecommendedStuffsOf( + category = category, + stuffs = mutableStuffs.keys.toList() + ) + getStuffs(category) + } } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/ui/component/stuff/StuffsGrid.kt b/app/src/main/java/org/care/packie/ui/component/stuff/StuffsGrid.kt index fe1cfe8..62396e7 100644 --- a/app/src/main/java/org/care/packie/ui/component/stuff/StuffsGrid.kt +++ b/app/src/main/java/org/care/packie/ui/component/stuff/StuffsGrid.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import org.care.packie.StuffsPreviewProvider import org.care.packie.ui.theme.PackieTheme @@ -19,7 +18,7 @@ fun StuffsGrid( modifier: Modifier = Modifier, state: LazyGridState = rememberLazyGridState(), stuffs: Map, - onToggle: (Boolean) -> Unit = {} + onToggle: (String) -> Unit = {} ) { LazyVerticalGrid( modifier = modifier, diff --git a/app/src/main/java/org/care/packie/ui/component/stuff/ToggleableStuff.kt b/app/src/main/java/org/care/packie/ui/component/stuff/ToggleableStuff.kt index b91504c..03f8ff9 100644 --- a/app/src/main/java/org/care/packie/ui/component/stuff/ToggleableStuff.kt +++ b/app/src/main/java/org/care/packie/ui/component/stuff/ToggleableStuff.kt @@ -1,11 +1,8 @@ package org.care.packie.ui.component.stuff -import android.util.Log import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape @@ -29,7 +26,7 @@ import org.care.packie.utils.ui.bounceClickable fun ToggleableStuff( modifier: Modifier = Modifier, isChecked: Boolean = false, - onToggle: (Boolean)-> Unit = {}, + onToggle: (String)-> Unit = {}, itemName: String ) { var isCheck by remember { mutableStateOf(isChecked) } @@ -38,8 +35,7 @@ fun ToggleableStuff( modifier = modifier .bounceClickable { isCheck = !isCheck - onToggle(isCheck) - Log.d("toggle", isCheck.toString()) + onToggle(itemName) } .clip(RoundedCornerShape(8.dp)) .background( diff --git a/app/src/main/java/org/care/packie/utils/ui/LoadingScreen.kt b/app/src/main/java/org/care/packie/utils/ui/LoadingScreen.kt new file mode 100644 index 0000000..c8206c4 --- /dev/null +++ b/app/src/main/java/org/care/packie/utils/ui/LoadingScreen.kt @@ -0,0 +1,45 @@ +package org.care.packie.utils.ui + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import org.care.packie.ui.theme.PackieDesignSystem +import org.care.packie.ui.theme.PackieTheme + +@Composable +fun LoadingScreen( + visible: Boolean = false, + onDismissRequest: () -> Unit +) { + AnimatedVisibility( + visible = visible, + enter = fadeIn(), + exit = fadeOut() + ) { + Dialog( + onDismissRequest = onDismissRequest, + properties = DialogProperties( + dismissOnBackPress = false, + dismissOnClickOutside = false + ) + ) { + CircularProgressIndicator( + color = PackieDesignSystem.colors.purple + ) + } + } + +} + +@Preview +@Composable +fun LoadingScreenPreview() { + PackieTheme { + LoadingScreen(onDismissRequest = {}) + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2bb05a8..5bab63f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ espresso-core = "3.5.1" lifecycle-runtime-ktx = "2.6.2" activity-compose = "1.8.2" compose-bom = "2023.10.01" +compose-navigation = "2.5.3" collapsing-toolbar = "2.3.5" security = "1.1.0-alpha06" dagger-hilt = "2.48.1" @@ -23,6 +24,7 @@ lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtim activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" } compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } ui = { group = "androidx.compose.ui", name = "ui" } +ui-navigation = { module ="androidx.navigation:navigation-compose", version.ref ="compose-navigation"} ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }