From cf096aaa89f90913c791734f081eba43f8484330 Mon Sep 17 00:00:00 2001 From: l2zh Date: Mon, 4 Dec 2023 05:50:22 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20#25=20ToDo=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=ED=86=B5=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/ToDoDataSource.kt | 4 ++++ .../data/model/request/RequestAddToDoDto.kt | 16 +++++++++++++ .../data/repository/ToDoRepositoryImpl.kt | 4 ++++ .../howdroid/data/service/ToDoService.kt | 8 +++++++ .../domain/repository/ToDoRepository.kt | 4 ++++ .../howdroid/presentation/AddToDoActivity.kt | 23 +++++++++++++++++- .../howdroid/presentation/AddToDoViewModel.kt | 24 ++++++++++++++++++- .../presentation/home/HomeFragment.kt | 20 ++++++++++------ .../presentation/home/HomeTodoOuterAdapter.kt | 4 ++-- .../presentation/type/PriorityType.kt | 14 +++++++++-- app/src/main/res/values/strings.xml | 3 +++ 11 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/example/howdroid/data/model/request/RequestAddToDoDto.kt diff --git a/app/src/main/java/com/example/howdroid/data/datasource/remote/ToDoDataSource.kt b/app/src/main/java/com/example/howdroid/data/datasource/remote/ToDoDataSource.kt index 758e3fe..469552d 100644 --- a/app/src/main/java/com/example/howdroid/data/datasource/remote/ToDoDataSource.kt +++ b/app/src/main/java/com/example/howdroid/data/datasource/remote/ToDoDataSource.kt @@ -1,5 +1,6 @@ package com.example.howdroid.data.datasource.remote +import com.example.howdroid.data.model.request.RequestAddToDoDto import com.example.howdroid.data.service.ToDoService import javax.inject.Inject @@ -8,4 +9,7 @@ class ToDoDataSource @Inject constructor( ) { suspend fun checkToDo(toDoId: Long) = toDoService.checkToDo(toDoId) + + suspend fun addToDo(requestAddToDoDto: RequestAddToDoDto) = + toDoService.addToDo(requestAddToDoDto) } diff --git a/app/src/main/java/com/example/howdroid/data/model/request/RequestAddToDoDto.kt b/app/src/main/java/com/example/howdroid/data/model/request/RequestAddToDoDto.kt new file mode 100644 index 0000000..a0f0d6f --- /dev/null +++ b/app/src/main/java/com/example/howdroid/data/model/request/RequestAddToDoDto.kt @@ -0,0 +1,16 @@ +package com.example.howdroid.data.model.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class RequestAddToDoDto( + @SerialName("priority") + val priority: String, + @SerialName("selectedDate") + val selectedDate: String, + @SerialName("todo") + val todo: String, + @SerialName("todoCategoryId") + val todoCategoryId: Int, +) diff --git a/app/src/main/java/com/example/howdroid/data/repository/ToDoRepositoryImpl.kt b/app/src/main/java/com/example/howdroid/data/repository/ToDoRepositoryImpl.kt index 3b5bd97..33ba380 100644 --- a/app/src/main/java/com/example/howdroid/data/repository/ToDoRepositoryImpl.kt +++ b/app/src/main/java/com/example/howdroid/data/repository/ToDoRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.example.howdroid.data.repository import com.example.howdroid.data.datasource.remote.ToDoDataSource +import com.example.howdroid.data.model.request.RequestAddToDoDto import com.example.howdroid.domain.repository.ToDoRepository import javax.inject.Inject @@ -9,4 +10,7 @@ class ToDoRepositoryImpl @Inject constructor( ) : ToDoRepository { override suspend fun checkToDo(toDoId: Long): Result = runCatching { toDoDataSource.checkToDo(toDoId) } + + override suspend fun addToDo(requestAddToDoDto: RequestAddToDoDto): Result = + runCatching { toDoDataSource.addToDo(requestAddToDoDto) } } diff --git a/app/src/main/java/com/example/howdroid/data/service/ToDoService.kt b/app/src/main/java/com/example/howdroid/data/service/ToDoService.kt index 5d4a20a..72a9606 100644 --- a/app/src/main/java/com/example/howdroid/data/service/ToDoService.kt +++ b/app/src/main/java/com/example/howdroid/data/service/ToDoService.kt @@ -1,6 +1,9 @@ package com.example.howdroid.data.service +import com.example.howdroid.data.model.request.RequestAddToDoDto +import retrofit2.http.Body import retrofit2.http.PATCH +import retrofit2.http.POST import retrofit2.http.Path interface ToDoService { @@ -8,4 +11,9 @@ interface ToDoService { suspend fun checkToDo( @Path("todoId") todoId: Long, ) + + @POST("todo/assign") + suspend fun addToDo( + @Body requestAddToDoDto: RequestAddToDoDto, + ) } diff --git a/app/src/main/java/com/example/howdroid/domain/repository/ToDoRepository.kt b/app/src/main/java/com/example/howdroid/domain/repository/ToDoRepository.kt index b2d56dd..4154c68 100644 --- a/app/src/main/java/com/example/howdroid/domain/repository/ToDoRepository.kt +++ b/app/src/main/java/com/example/howdroid/domain/repository/ToDoRepository.kt @@ -1,6 +1,10 @@ package com.example.howdroid.domain.repository +import com.example.howdroid.data.model.request.RequestAddToDoDto + interface ToDoRepository { suspend fun checkToDo(toDoId: Long): Result + + suspend fun addToDo(requestAddToDoDto: RequestAddToDoDto): Result } diff --git a/app/src/main/java/com/example/howdroid/presentation/AddToDoActivity.kt b/app/src/main/java/com/example/howdroid/presentation/AddToDoActivity.kt index 99cf567..85933a6 100644 --- a/app/src/main/java/com/example/howdroid/presentation/AddToDoActivity.kt +++ b/app/src/main/java/com/example/howdroid/presentation/AddToDoActivity.kt @@ -9,18 +9,25 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.example.howdroid.R import com.example.howdroid.databinding.ActivityAddTodoBinding +import com.example.howdroid.presentation.home.HomeFragment.Companion.CATEGORY_ID +import com.example.howdroid.presentation.home.HomeFragment.Companion.SELECTED_DATE import com.example.howdroid.presentation.type.PriorityType import com.example.howdroid.util.UiState import com.example.howdroid.util.binding.BindingActivity +import com.example.howdroid.util.extension.setOnSingleClickListener import com.example.howdroid.util.extension.setVisible +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlin.properties.Delegates +@AndroidEntryPoint class AddToDoActivity : BindingActivity(R.layout.activity_add_todo) { private val addToDoViewModel: AddToDoViewModel by viewModels() - private val errorMessageTextView by lazy { binding.tvAddTodoErrorMessage } + lateinit var selectedDate: String + var categoryId by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -29,6 +36,20 @@ class AddToDoActivity : BindingActivity(R.layout.activit setTextChangeListeners() setPriorityType() observePriorityType() + postAddToDo() + } + + private fun postAddToDo() { + selectedDate = intent.extras?.getString(SELECTED_DATE).toString() + categoryId = intent.extras?.getInt(CATEGORY_ID) ?: 0 + + binding.btnAddTodoDone.setOnSingleClickListener { + addToDoViewModel.addTodo( + selectedDate, + binding.etAddTodo.text.toString(), + categoryId, + ) + } } private fun observePriorityType() { diff --git a/app/src/main/java/com/example/howdroid/presentation/AddToDoViewModel.kt b/app/src/main/java/com/example/howdroid/presentation/AddToDoViewModel.kt index bdfa31a..c7bea0a 100644 --- a/app/src/main/java/com/example/howdroid/presentation/AddToDoViewModel.kt +++ b/app/src/main/java/com/example/howdroid/presentation/AddToDoViewModel.kt @@ -3,13 +3,22 @@ package com.example.howdroid.presentation import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.howdroid.data.model.request.RequestAddToDoDto +import com.example.howdroid.domain.repository.ToDoRepository import com.example.howdroid.presentation.signup.SignUpViewModel import com.example.howdroid.presentation.type.PriorityType import com.example.howdroid.util.UiState +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject -class AddToDoViewModel : ViewModel() { +@HiltViewModel +class AddToDoViewModel @Inject constructor( + private val toDoRepository: ToDoRepository, +) : ViewModel() { private val _priorityType = MutableStateFlow(null) val priorityType get() = _priorityType.asStateFlow() @@ -19,6 +28,19 @@ class AddToDoViewModel : ViewModel() { private val _isButtonEnabled = MutableLiveData() val isButtonEnabled: LiveData = _isButtonEnabled + fun addTodo(selectedDate: String, todo: String, todoCategoryId: Int) { + viewModelScope.launch { + toDoRepository.addToDo( + RequestAddToDoDto( + _priorityType.value?.typeString.toString(), + selectedDate, + todo, + todoCategoryId, + ), + ) + } + } + fun setSelectedPriorityType(priorityType: PriorityType) { _priorityType.value = priorityType checkButtonEnabled() diff --git a/app/src/main/java/com/example/howdroid/presentation/home/HomeFragment.kt b/app/src/main/java/com/example/howdroid/presentation/home/HomeFragment.kt index 59b01a1..4b414ea 100644 --- a/app/src/main/java/com/example/howdroid/presentation/home/HomeFragment.kt +++ b/app/src/main/java/com/example/howdroid/presentation/home/HomeFragment.kt @@ -33,8 +33,10 @@ class HomeFragment : private val homeViewModel by viewModels() private val outerAdapter by lazy { HomeTodoOuterAdapter( - moveToAddToDo = { - findNavController().navigate(R.id.navigation_addToDo) + moveToAddToDo = { categoryId -> + val bundle = putDataToBundle() + bundle.putInt(CATEGORY_ID, categoryId) + findNavController().navigate(R.id.navigation_addToDo, bundle) }, onInnerItemClick = this, onInnerToDoCheck = this, @@ -91,15 +93,18 @@ class HomeFragment : private fun showPutFailTagBottomFragment() { val bottomSheetFragment = PutFailTagBottomSheetFragment() - .apply { - val bundle = Bundle() - bundle.putString(SELECTED_DATE, homeViewModel.selectedDate.value) - arguments = bundle - } + .apply { putDataToBundle() } bottomSheetFragment.show(childFragmentManager, bottomSheetFragment.tag) binding.clHomeAddCategory.setVisible(GONE) } + private fun putDataToBundle(): Bundle { + val bundle = Bundle() + bundle.putString(SELECTED_DATE, homeViewModel.selectedDate.value) + arguments = bundle + return bundle + } + private fun showAddCategory() { with(binding) { tvHomeAddCategoty.setOnSingleClickListener { @@ -176,5 +181,6 @@ class HomeFragment : companion object { const val TAG = "homeBottomSheetFragmentTag" const val SELECTED_DATE = "selectedDate" + const val CATEGORY_ID = "categoryId" } } diff --git a/app/src/main/java/com/example/howdroid/presentation/home/HomeTodoOuterAdapter.kt b/app/src/main/java/com/example/howdroid/presentation/home/HomeTodoOuterAdapter.kt index da9b1d1..6bb5b36 100644 --- a/app/src/main/java/com/example/howdroid/presentation/home/HomeTodoOuterAdapter.kt +++ b/app/src/main/java/com/example/howdroid/presentation/home/HomeTodoOuterAdapter.kt @@ -12,7 +12,7 @@ import com.example.howdroid.util.extension.setOnSingleClickListener class HomeTodoOuterAdapter( private val onInnerItemClick: TodoOptionClickListener, private val onInnerToDoCheck: TodoCheckClickListener, - private val moveToAddToDo: (Unit) -> Unit, + private val moveToAddToDo: (Int) -> Unit, ) : ListAdapter( ItemDiffCallback( @@ -51,7 +51,7 @@ class HomeTodoOuterAdapter( home.todoData, ) binding.tvHomeCategoryAdd.setOnSingleClickListener { - moveToAddToDo(Unit) + moveToAddToDo(home.todoCategoryId) } } } diff --git a/app/src/main/java/com/example/howdroid/presentation/type/PriorityType.kt b/app/src/main/java/com/example/howdroid/presentation/type/PriorityType.kt index c501bdd..3f57107 100644 --- a/app/src/main/java/com/example/howdroid/presentation/type/PriorityType.kt +++ b/app/src/main/java/com/example/howdroid/presentation/type/PriorityType.kt @@ -1,5 +1,15 @@ package com.example.howdroid.presentation.type -enum class PriorityType { - MOST_IMPORTANT, IMPORTANT, NOT_IMPORTANT +enum class PriorityType( + val typeString: String, +) { + MOST_IMPORTANT( + "매우중요", + ), + IMPORTANT( + "중요", + ), + NOT_IMPORTANT( + "중요하지 않음", + ), } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7494579..1fe9f83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,6 +53,9 @@ 15자 이하로 입력해 주세요 우선 순위를 정해볼까요? 완료 + 매우중요 + 중요 + 중요하지 않음 통계