From c96f18e57bf1a8283ebb258e490af8a5559f9e3f Mon Sep 17 00:00:00 2001 From: edv-Shin Date: Tue, 26 Aug 2025 17:48:46 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=EB=A8=B8=20=EC=82=AD=EC=A0=9C=20#258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project200/data/impl/TimerRepositoryImpl.kt | 6 +++++- .../domain/usecase/DeleteCustomTimerUseCase.kt | 13 +++++++++++++ .../feature/timer/custom/CustomTimerFragment.kt | 12 +++++++++++- .../feature/timer/custom/CustomTimerViewModel.kt | 16 ++++++++++++++-- feature/timer/src/main/res/values/strings.xml | 2 ++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 domain/src/main/java/com/project200/domain/usecase/DeleteCustomTimerUseCase.kt diff --git a/data/src/main/java/com/project200/data/impl/TimerRepositoryImpl.kt b/data/src/main/java/com/project200/data/impl/TimerRepositoryImpl.kt index b5bb0510..ad0b13e7 100644 --- a/data/src/main/java/com/project200/data/impl/TimerRepositoryImpl.kt +++ b/data/src/main/java/com/project200/data/impl/TimerRepositoryImpl.kt @@ -91,7 +91,11 @@ class TimerRepositoryImpl @Inject constructor( // 커스텀 타이머 삭제 override suspend fun deleteCustomTimer(customTimerId: Long): BaseResult { - TODO("Not yet implemented") + return apiCallBuilder( + ioDispatcher = ioDispatcher, + apiCall = { apiService.deleteCustomTimer(customTimerId) }, + mapper = { Unit } + ) } // 커스텀 타이머 이름 수정 diff --git a/domain/src/main/java/com/project200/domain/usecase/DeleteCustomTimerUseCase.kt b/domain/src/main/java/com/project200/domain/usecase/DeleteCustomTimerUseCase.kt new file mode 100644 index 00000000..74f69909 --- /dev/null +++ b/domain/src/main/java/com/project200/domain/usecase/DeleteCustomTimerUseCase.kt @@ -0,0 +1,13 @@ +package com.project200.domain.usecase + +import com.project200.domain.model.BaseResult +import com.project200.domain.repository.TimerRepository +import javax.inject.Inject + +class DeleteCustomTimerUseCase @Inject constructor( + private val timerRepository: TimerRepository +) { + suspend operator fun invoke(customTimerId: Long): BaseResult { + return timerRepository.deleteCustomTimer(customTimerId) + } +} \ No newline at end of file diff --git a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerFragment.kt b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerFragment.kt index 5f8b0e19..a0dd21e6 100644 --- a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerFragment.kt +++ b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerFragment.kt @@ -16,6 +16,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager +import com.project200.domain.model.BaseResult import com.project200.feature.timer.TimerListFragment import com.project200.feature.timer.utils.TimerFormatter.toFormattedTimeAsLong import com.project200.presentation.base.BaseAlertDialog @@ -145,6 +146,15 @@ class CustomTimerFragment: BindingFragment(R.layout. binding.baseToolbar.setTitle(title) } + viewModel.deleteResult.observe(viewLifecycleOwner) { result -> + findNavController().navigateUp() + val messageRes = when(result) { + is BaseResult.Success -> R.string.custom_timer_delete_success + is BaseResult.Error -> R.string.custom_timer_error_delete_failed + } + Toast.makeText(requireContext(), getString(messageRes), Toast.LENGTH_SHORT).show() + } + // 에러 이벤트 처리 viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { @@ -243,7 +253,7 @@ class CustomTimerFragment: BindingFragment(R.layout. title = getString(R.string.custom_timer_delete_alert), desc = null, onConfirmClicked = { - // TODO: 커스텀 타이머 삭제 + viewModel.deleteTimer() } ).show(parentFragmentManager, BaseAlertDialog::class.java.simpleName) } diff --git a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt index 5ffc4325..8de4260e 100644 --- a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt +++ b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt @@ -9,6 +9,7 @@ import com.project200.domain.model.Step import com.project200.domain.manager.TimerManager import com.project200.domain.model.BaseResult import com.project200.domain.model.CustomTimer +import com.project200.domain.usecase.DeleteCustomTimerUseCase import com.project200.domain.usecase.GetCustomTimerUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow @@ -19,7 +20,8 @@ import javax.inject.Inject @HiltViewModel class CustomTimerViewModel @Inject constructor( private val timerManager: TimerManager, - private val getCustomTimerUseCase: GetCustomTimerUseCase + private val getCustomTimerUseCase: GetCustomTimerUseCase, + private val deleteCustomTimerUseCase: DeleteCustomTimerUseCase, ): ViewModel() { // 전체 타이머 시간 (밀리초 단위) var totalTime: Long = 0L @@ -29,7 +31,7 @@ class CustomTimerViewModel @Inject constructor( var totalStepTime: Long = 0L private set - var customTimerId: Long? = null + var customTimerId: Long = -1L private set private val _title = MutableLiveData() @@ -60,6 +62,9 @@ class CustomTimerViewModel @Inject constructor( private val _errorEvent = MutableSharedFlow() val errorEvent: SharedFlow = _errorEvent + private val _deleteResult = MutableLiveData>() + val deleteResult: LiveData> = _deleteResult + init { setupTimerManager() resetTimer() @@ -83,6 +88,13 @@ class CustomTimerViewModel @Inject constructor( } } + fun deleteTimer() { + viewModelScope.launch { + if (customTimerId == -1L) return@launch + _deleteResult.value = deleteCustomTimerUseCase(customTimerId) + } + } + // TimerManager의 콜백을 설정하는 초기화 함수 private fun setupTimerManager() { timerManager.setOnTickListener { millisUntilFinished -> diff --git a/feature/timer/src/main/res/values/strings.xml b/feature/timer/src/main/res/values/strings.xml index acc941db..4e95ffee 100644 --- a/feature/timer/src/main/res/values/strings.xml +++ b/feature/timer/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ 나만의 타이머 정말 타이머를 삭제할까요? + 타이머를 삭제했습니다. 나만의 타이머 이름 Step @@ -22,6 +23,7 @@ 타이머를 불러오는데 실패했습니다. 타이머를 생성하는데 실패했습니다. 타이머를 수정하는데 실패했습니다. + 타이머를 삭제하는데 실패했습니다. 알 수 없는 오류가 발생했습니다. 타이머 수정에 실패했습니다. From f655014ea4156b08ab27848c13bdd443a00346c2 Mon Sep 17 00:00:00 2001 From: edv-Shin Date: Wed, 27 Aug 2025 23:43:34 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20customTimerId=20private=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=20#258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project200/feature/timer/custom/CustomTimerViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt index 8de4260e..35bab039 100644 --- a/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt +++ b/feature/timer/src/main/java/com/project200/feature/timer/custom/CustomTimerViewModel.kt @@ -31,8 +31,7 @@ class CustomTimerViewModel @Inject constructor( var totalStepTime: Long = 0L private set - var customTimerId: Long = -1L - private set + private var customTimerId: Long = -1L private val _title = MutableLiveData() val title: LiveData = _title