Skip to content

Commit

Permalink
feat: 물건 목록 기능 밀린거 다 구현...
Browse files Browse the repository at this point in the history
죄송합니다...통으로 커밋해버렸어요..
  • Loading branch information
jinsu4755 committed Jan 19, 2024
1 parent 32fa630 commit f996383
Show file tree
Hide file tree
Showing 18 changed files with 429 additions and 101 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 10 additions & 4 deletions app/src/main/java/org/care/packie/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,7 +14,14 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CategoryScreen()
PackieApp()
}
}
}

@Composable
fun PackieApp() {
PackieTheme {
StuffsScreenRoot()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> {
return stuffsDataSource.getRecommendedStuffsOf(category)?.let {
json.decodeFromString<List<String>>(it)
} ?: emptyList()
) : StuffsRepository {
override suspend fun getRecommendedStuffsOf(category: String): List<String> {
return stuffsDataSource.getRecommendedStuffsOf(category)
?.let {
json.decodeFromString<List<String>>(it)
} ?: emptyList()
}

override fun setRecommendedStuffsOf(category: String, stuffs: List<String>) {
val stuffsJson = json.encodeToString(stuffs)
override suspend fun setRecommendedStuffsOf(category: String, stuffs: List<String>) {
val stuffsJson = json.encodeToString(stuffs)
stuffsDataSource.saveRecommendedStuffsOf(category, stuffsJson)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
2 changes: 1 addition & 1 deletion app/src/main/java/org/care/packie/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ internal abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindStuffsRepository(
localStuffsRepository: CategoryRepositoryImpl
localStuffsRepository: LocalStuffsRepository
): StuffsRepository
}
9 changes: 9 additions & 0 deletions app/src/main/java/org/care/packie/domain/Stuff.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.care.packie.domain

import kotlinx.serialization.Serializable

@Serializable
data class Stuff(
val name: String,
var isChecked: Boolean
)
4 changes: 2 additions & 2 deletions app/src/main/java/org/care/packie/domain/StuffsRepository.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.care.packie.domain

interface StuffsRepository {
fun getRecommendedStuffsOf(category: String): List<String>
fun setRecommendedStuffsOf(category: String, stuffs: List<String>)
suspend fun getRecommendedStuffsOf(category: String): List<String>
suspend fun setRecommendedStuffsOf(category: String, stuffs: List<String>)
}
36 changes: 26 additions & 10 deletions app/src/main/java/org/care/packie/feature/stuffs/StuffsContent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -21,7 +25,7 @@ fun StuffsContent(
stuffs: Map<String, Boolean>,
onAdd: () -> Unit = {},
onRemove: (String) -> Unit = {},
onToggle: (Boolean) -> Unit = {},
onToggle: (String) -> Unit = {},
) {
Box(
modifier = modifier
Expand All @@ -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
Expand All @@ -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)
}
}

}
82 changes: 21 additions & 61 deletions app/src/main/java/org/care/packie/feature/stuffs/StuffsScreen.kt
Original file line number Diff line number Diff line change
@@ -1,53 +1,36 @@
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
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<String, Boolean>,
onClickToggle: (Boolean) -> Unit = {},
onClickToggle: (String) -> Unit = {},
onClickRemove: (String) -> Unit = {},
onClickAdd: () -> Unit = {},
onClickUpdate: (Map<String, Boolean>) -> Unit = {},
onClickUpdate: (String) -> Unit = {},
enableEditMode: () -> Unit = {},
disableEditMode: () -> Unit = {},
onCategoryClick: () -> Unit = {},
) {
val editableStuffs =
remember { mutableStateMapOf<String, Boolean>().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
Expand All @@ -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
Expand All @@ -128,7 +87,8 @@ fun StuffScreenPreview() {
PackieTheme {
StuffsScreen(
category = "출근",
currentStuffs = StuffsPreviewProvider.mockStuffs
//currentStuffs = StuffsPreviewProvider.mockStuffs
currentStuffs = emptyMap()
)
}
}
Loading

0 comments on commit f996383

Please sign in to comment.