diff --git a/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt b/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt index c71dda3f..04f62ef6 100644 --- a/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt @@ -1,10 +1,11 @@ package com.sopt.clody.data.datastore import android.content.SharedPreferences +import com.sopt.clody.di.qualifier.TokenPrefs import javax.inject.Inject class TokenDataStoreImpl @Inject constructor( - private val sharedPreferences: SharedPreferences, + @TokenPrefs private val sharedPreferences: SharedPreferences, ) : TokenDataStore { override var accessToken: String get() = sharedPreferences.getString(ACCESS_TOKEN, "") ?: "" diff --git a/app/src/main/java/com/sopt/clody/data/local/datasource/FirstDraftLocalDataSource.kt b/app/src/main/java/com/sopt/clody/data/local/datasource/FirstDraftLocalDataSource.kt new file mode 100644 index 00000000..07ca4f3b --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/local/datasource/FirstDraftLocalDataSource.kt @@ -0,0 +1,11 @@ +package com.sopt.clody.data.local.datasource + +/** + * 임시 저장 최초 사용 여부 판단을 위한 SharedPreferences + * @property isDraftUsed 임시 저장 사용 여부 + * @property isFirstUse 임시 저장 최초 사용 여부 + */ +interface FirstDraftLocalDataSource { + var isDraftUsed: Boolean + var isFirstUse: Boolean +} diff --git a/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/FirstDraftLocalDataSourceImpl.kt b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/FirstDraftLocalDataSourceImpl.kt new file mode 100644 index 00000000..2ada28ae --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/FirstDraftLocalDataSourceImpl.kt @@ -0,0 +1,24 @@ +package com.sopt.clody.data.local.datasourceimpl + +import android.content.SharedPreferences +import androidx.core.content.edit +import com.sopt.clody.data.local.datasource.FirstDraftLocalDataSource +import com.sopt.clody.di.qualifier.FirstDraftPrefs +import javax.inject.Inject + +class FirstDraftLocalDataSourceImpl @Inject constructor( + @FirstDraftPrefs private val sharedPreferences: SharedPreferences, +) : FirstDraftLocalDataSource { + override var isDraftUsed: Boolean + get() = sharedPreferences.getBoolean(IS_DRAFT_USED, false) + set(value) = sharedPreferences.edit { putBoolean(IS_DRAFT_USED, value) } + + override var isFirstUse: Boolean + get() = sharedPreferences.getBoolean(IS_FIRST_USE, false) + set(value) = sharedPreferences.edit { putBoolean(IS_FIRST_USE, value) } + + companion object { + private const val IS_DRAFT_USED = "IS_DRAFT_USED" + private const val IS_FIRST_USE = "IS_FIRST_USE" + } +} diff --git a/app/src/main/java/com/sopt/clody/data/repositoryimpl/DraftRepositoryImpl.kt b/app/src/main/java/com/sopt/clody/data/repositoryimpl/DraftRepositoryImpl.kt new file mode 100644 index 00000000..2f0872f1 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/repositoryimpl/DraftRepositoryImpl.kt @@ -0,0 +1,21 @@ +package com.sopt.clody.data.repositoryimpl + +import com.sopt.clody.data.local.datasource.FirstDraftLocalDataSource +import com.sopt.clody.domain.repository.DraftRepository +import javax.inject.Inject + +class DraftRepositoryImpl @Inject constructor( + private val firstDraftLocalDataSource: FirstDraftLocalDataSource, +) : DraftRepository { + override fun getIsDraftUsed(): Boolean = firstDraftLocalDataSource.isDraftUsed + + override fun setIsDraftUsed(state: Boolean) { + firstDraftLocalDataSource.isDraftUsed = state + } + + override fun getIsFirstUse(): Boolean = firstDraftLocalDataSource.isFirstUse + + override fun setIsFirstUse(state: Boolean) { + firstDraftLocalDataSource.isFirstUse = state + } +} diff --git a/app/src/main/java/com/sopt/clody/di/LocalDataSourceModule.kt b/app/src/main/java/com/sopt/clody/di/LocalDataSourceModule.kt new file mode 100644 index 00000000..1f28e407 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/di/LocalDataSourceModule.kt @@ -0,0 +1,29 @@ +package com.sopt.clody.di + +import android.content.SharedPreferences +import com.sopt.clody.data.datastore.TokenDataStore +import com.sopt.clody.data.datastore.TokenDataStoreImpl +import com.sopt.clody.data.local.datasource.FirstDraftLocalDataSource +import com.sopt.clody.data.local.datasourceimpl.FirstDraftLocalDataSourceImpl +import com.sopt.clody.di.qualifier.FirstDraftPrefs +import com.sopt.clody.di.qualifier.TokenPrefs +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object LocalDataSourceModule { + + @Provides + @Singleton + fun provideTokenDataStore(@TokenPrefs sharedPreferences: SharedPreferences): TokenDataStore = + TokenDataStoreImpl(sharedPreferences) + + @Provides + @Singleton + fun provideFirstDraftLocalDataSource(@FirstDraftPrefs sharedPreferences: SharedPreferences): FirstDraftLocalDataSource = + FirstDraftLocalDataSourceImpl(sharedPreferences) +} diff --git a/app/src/main/java/com/sopt/clody/di/DataSourceModule.kt b/app/src/main/java/com/sopt/clody/di/RemoteDataSourceModule.kt similarity index 97% rename from app/src/main/java/com/sopt/clody/di/DataSourceModule.kt rename to app/src/main/java/com/sopt/clody/di/RemoteDataSourceModule.kt index 4d570e72..fa6da505 100644 --- a/app/src/main/java/com/sopt/clody/di/DataSourceModule.kt +++ b/app/src/main/java/com/sopt/clody/di/RemoteDataSourceModule.kt @@ -18,7 +18,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -abstract class DataSourceModule { +abstract class RemoteDataSourceModule { @Binds @Singleton abstract fun bindAuthDataSource( diff --git a/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt b/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt index 006a0064..b1615eb0 100644 --- a/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt +++ b/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt @@ -4,6 +4,7 @@ import com.sopt.clody.data.repositoryimpl.AccountManagementRepositoryImpl import com.sopt.clody.data.repositoryimpl.AdRepositoryImpl import com.sopt.clody.data.repositoryimpl.AuthRepositoryImpl import com.sopt.clody.data.repositoryimpl.DiaryRepositoryImpl +import com.sopt.clody.data.repositoryimpl.DraftRepositoryImpl import com.sopt.clody.data.repositoryimpl.NotificationRepositoryImpl import com.sopt.clody.data.repositoryimpl.TokenReissueRepositoryImpl import com.sopt.clody.data.repositoryimpl.TokenRepositoryImpl @@ -11,6 +12,7 @@ import com.sopt.clody.domain.repository.AccountManagementRepository import com.sopt.clody.domain.repository.AdRepository import com.sopt.clody.domain.repository.AuthRepository import com.sopt.clody.domain.repository.DiaryRepository +import com.sopt.clody.domain.repository.DraftRepository import com.sopt.clody.domain.repository.NotificationRepository import com.sopt.clody.domain.repository.TokenReissueRepository import com.sopt.clody.domain.repository.TokenRepository @@ -64,4 +66,10 @@ abstract class RepositoryModule { abstract fun bindAdRepository( adRepositoryImpl: AdRepositoryImpl, ): AdRepository + + @Binds + @Singleton + abstract fun bindDraftRepository( + draftRepositoryImpl: DraftRepositoryImpl, + ): DraftRepository } diff --git a/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt b/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt index 4ea8c970..0fda0f82 100644 --- a/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt +++ b/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt @@ -2,6 +2,8 @@ package com.sopt.clody.di import android.content.Context import android.content.SharedPreferences +import com.sopt.clody.di.qualifier.FirstDraftPrefs +import com.sopt.clody.di.qualifier.TokenPrefs import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -12,9 +14,18 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object SharedPreferencesModule { + + @TokenPrefs @Provides @Singleton - fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + fun provideTokenSharedPreferences(@ApplicationContext context: Context): SharedPreferences { return context.getSharedPreferences("token_prefs", Context.MODE_PRIVATE) } + + @FirstDraftPrefs + @Provides + @Singleton + fun provideFirstDraftSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + return context.getSharedPreferences("first_draft_prefs", Context.MODE_PRIVATE) + } } diff --git a/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt b/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt deleted file mode 100644 index 3f1462ad..00000000 --- a/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.sopt.clody.di - -import android.content.SharedPreferences -import com.sopt.clody.data.datastore.TokenDataStore -import com.sopt.clody.data.datastore.TokenDataStoreImpl -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -object TokenDataStoreModule { - @Provides - @Singleton - fun provideTokenDataStore(sharedPreferences: SharedPreferences): TokenDataStore { - return TokenDataStoreImpl(sharedPreferences) - } -} diff --git a/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt b/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt new file mode 100644 index 00000000..dc14802f --- /dev/null +++ b/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt @@ -0,0 +1,11 @@ +package com.sopt.clody.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class TokenPrefs + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class FirstDraftPrefs diff --git a/app/src/main/java/com/sopt/clody/domain/repository/DraftRepository.kt b/app/src/main/java/com/sopt/clody/domain/repository/DraftRepository.kt new file mode 100644 index 00000000..7e193136 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/domain/repository/DraftRepository.kt @@ -0,0 +1,8 @@ +package com.sopt.clody.domain.repository + +interface DraftRepository { + fun getIsDraftUsed(): Boolean + fun setIsDraftUsed(state: Boolean) + fun getIsFirstUse(): Boolean + fun setIsFirstUse(state: Boolean) +} diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderViewModel.kt index ee63c6de..c8e45835 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderViewModel.kt @@ -45,7 +45,7 @@ class TimeReminderViewModel @Inject constructor( val requestDto = SendNotificationRequestDto( isDiaryAlarm = isPermissionGranted, - isDraftAlarm = isPermissionGranted, + isDraftAlarm = false, isReplyAlarm = isPermissionGranted, time = selectedTime, fcmToken = fcmToken, diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 20a77086..97d7615c 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -3,30 +3,38 @@ package com.sopt.clody.presentation.ui.home.screen import android.app.Activity import androidx.activity.compose.BackHandler import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sopt.clody.R import com.sopt.clody.domain.model.ReplyStatus import com.sopt.clody.presentation.ui.component.FailureScreen import com.sopt.clody.presentation.ui.component.LoadingScreen import com.sopt.clody.presentation.ui.component.bottomsheet.DiaryDeleteSheet +import com.sopt.clody.presentation.ui.component.button.ClodyButton import com.sopt.clody.presentation.ui.component.dialog.ClodyDialog import com.sopt.clody.presentation.ui.component.popup.ClodyPopupBottomSheet import com.sopt.clody.presentation.ui.component.timepicker.YearMonthPicker +import com.sopt.clody.presentation.ui.component.toast.ClodyToastMessage import com.sopt.clody.presentation.ui.home.calendar.model.DiaryDateData import com.sopt.clody.presentation.ui.home.component.DiaryStateButton import com.sopt.clody.presentation.ui.home.component.HomeTopAppBar @@ -56,6 +64,9 @@ fun HomeRoute( val calendarState by homeViewModel.calendarState.collectAsStateWithLifecycle() val dailyDiariesState by homeViewModel.dailyDiariesState.collectAsStateWithLifecycle() val replyStatus by homeViewModel.replyStatus.collectAsStateWithLifecycle() + val showFirstDraftPopup by homeViewModel.showFirstDraftPopup.collectAsStateWithLifecycle() + val draftAlarmEnableToast by homeViewModel.draftAlarmEnableToast.collectAsStateWithLifecycle() + val context = LocalContext.current val isError = calendarState is CalendarState.Error || dailyDiariesState is DailyDiariesState.Error val errorMessage = when { @@ -112,6 +123,72 @@ fun HomeRoute( selectedYear = selectedYear, selectedMonth = selectedMonth, ) + + if (showFirstDraftPopup) { + ClodyPopupBottomSheet( + onDismissRequest = { homeViewModel.updateFirstDraftUse(false) }, + content = { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(top = 20.dp) + .padding(horizontal = 16.dp), + ) { + Text( + text = "기한이 지나면\n로디의 답장을 받을 수 없어요!", + color = ClodyTheme.colors.gray01, + textAlign = TextAlign.Center, + style = ClodyTheme.typography.head3, + ) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = "답장 마감 전에 일기를 이어쓸 수 있도록\n알려드리기 위해서는 알림 설정이 필요해요.", + color = ClodyTheme.colors.gray04, + textAlign = TextAlign.Center, + style = ClodyTheme.typography.body3Regular, + ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = "[설정 > 애플리케이션 > 클로디 > 알림 > 알림표시]", + color = ClodyTheme.colors.gray04, + textAlign = TextAlign.Center, + style = ClodyTheme.typography.body3Regular, + ) + Spacer(modifier = Modifier.height(28.dp)) + ClodyButton( + text = "알림 받기", + onClick = { + homeViewModel.enableDraftAlarm(context) + homeViewModel.updateFirstDraftUse(false) + }, + enabled = true, + modifier = Modifier.fillMaxWidth(), + ) + Text( + text = "다음에 하기", + modifier = Modifier + .clickable(onClick = { homeViewModel.updateFirstDraftUse(false) }) + .padding(12.dp), + color = ClodyTheme.colors.gray05, + style = ClodyTheme.typography.body4Medium, + ) + Spacer(modifier = Modifier.height(4.dp)) + } + }, + ) + } + + if (draftAlarmEnableToast) { + ClodyToastMessage( + message = "이어쓰기 알림 설정을 완료했어요.", + iconResId = R.drawable.ic_toast_check_on_18, + backgroundColor = ClodyTheme.colors.gray04, + contentColor = ClodyTheme.colors.white, + durationMillis = 3000, + onDismiss = { homeViewModel.resetDraftAlarmEnableToast() }, + ) + } } } @@ -183,7 +260,7 @@ fun HomeScreen( containerColor = ClodyTheme.colors.white, content = { innerPadding -> when (val state = calendarState) { - is CalendarState.Idle -> { } + is CalendarState.Idle -> {} is CalendarState.Loading -> { LoadingScreen() @@ -211,7 +288,7 @@ fun HomeScreen( } when (deleteDiaryState) { - is DeleteDiaryState.Idle -> { } + is DeleteDiaryState.Idle -> {} is DeleteDiaryState.Loading -> { LoadingScreen() diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt index 86c97b0f..c90b579d 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt @@ -1,12 +1,19 @@ package com.sopt.clody.presentation.ui.home.screen +import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.sopt.clody.core.fcm.FcmTokenProvider +import com.sopt.clody.data.remote.dto.request.SendNotificationRequestDto import com.sopt.clody.data.remote.dto.response.DailyDiariesResponseDto import com.sopt.clody.data.remote.dto.response.MonthlyCalendarResponseDto +import com.sopt.clody.data.remote.dto.response.NotificationInfoResponseDto import com.sopt.clody.data.remote.util.NetworkUtil import com.sopt.clody.domain.repository.DiaryRepository +import com.sopt.clody.domain.repository.DraftRepository +import com.sopt.clody.domain.repository.NotificationRepository import com.sopt.clody.presentation.ui.home.calendar.model.DiaryDateData +import com.sopt.clody.presentation.ui.setting.notificationsetting.screen.NotificationChangeState import com.sopt.clody.presentation.utils.network.ErrorMessages import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -18,7 +25,10 @@ import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( private val diaryRepository: DiaryRepository, + private val notificationRepository: NotificationRepository, private val networkUtil: NetworkUtil, + private val draftRepository: DraftRepository, + private val fcmTokenProvider: FcmTokenProvider, ) : ViewModel() { private val _calendarState = MutableStateFlow>(CalendarState.Idle) @@ -62,6 +72,15 @@ class HomeViewModel @Inject constructor( private val _showDiaryDeleteDialog = MutableStateFlow(false) val showDiaryDeleteDialog: StateFlow get() = _showDiaryDeleteDialog + private val _showFirstDraftPopup = MutableStateFlow(draftRepository.getIsFirstUse()) + val showFirstDraftPopup: StateFlow = _showFirstDraftPopup + + private val _draftAlarmChangeState = MutableStateFlow(NotificationChangeState.Idle) + val draftAlarmChangeState: StateFlow = _draftAlarmChangeState + + private val _draftAlarmEnableToast = MutableStateFlow(false) + val draftAlarmEnableToast: StateFlow = _draftAlarmEnableToast + private val _errorState = MutableStateFlow>(false to "") val errorState: StateFlow> = _errorState @@ -179,4 +198,57 @@ class HomeViewModel @Inject constructor( fun setShowDiaryDeleteDialog(state: Boolean) { _showDiaryDeleteDialog.value = state } + + fun updateFirstDraftUse(newState: Boolean) { + draftRepository.setIsFirstUse(false) + _showFirstDraftPopup.value = newState + } + + fun enableDraftAlarm(context: Context) { + viewModelScope.launch { + if (!networkUtil.isNetworkAvailable()) { + setErrorState(true, ErrorMessages.FAILURE_NETWORK_MESSAGE) + return@launch + } + + val fcmToken = fcmTokenProvider.getToken().orEmpty() + val notificationInfo = getNotificationInfo() ?: return@launch + val request = buildDraftAlarmRequest(notificationInfo, fcmToken) + sendDraftAlarmRequest(request) + } + } + + private suspend fun getNotificationInfo(): NotificationInfoResponseDto? { + return notificationRepository.getNotificationInfo().getOrElse { + _draftAlarmChangeState.value = NotificationChangeState.Failure("알림 정보를 가져오는데 실패했습니다.") + null + } + } + + private fun buildDraftAlarmRequest( + info: NotificationInfoResponseDto, + fcmToken: String, + ): SendNotificationRequestDto = SendNotificationRequestDto( + isDiaryAlarm = info.isDiaryAlarm, + isDraftAlarm = true, + isReplyAlarm = info.isReplyAlarm, + time = info.time.ifEmpty { "21:30" }, + fcmToken = fcmToken, + ) + + private suspend fun sendDraftAlarmRequest(request: SendNotificationRequestDto) { + notificationRepository.sendNotification(request).fold( + onSuccess = { + _draftAlarmEnableToast.value = true + _draftAlarmChangeState.value = NotificationChangeState.Success(it) + }, + onFailure = { + _draftAlarmChangeState.value = NotificationChangeState.Failure("이어쓰기 알림 설정에 실패했습니다.") + }, + ) + } + + fun resetDraftAlarmEnableToast() { + _draftAlarmEnableToast.value = false + } } diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt index ba1ff28c..da7ec6bd 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt @@ -138,7 +138,11 @@ fun WriteDiaryRoute( onDismissLimitMessage = { viewModel.updateShowLimitMessage(false) }, onDismissEmptyFieldsMessage = { viewModel.updateShowEmptyFieldsMessage(false) }, onDismissFailureDialog = { viewModel.resetFailureDialog() }, - onDismissExitDialog = { viewModel.updateShowExitDialog(false) }, + onDismissExitDialog = { + viewModel.updateDraftUsage() + viewModel.updateShowExitDialog(false) + navigateToHome(year, month) + }, onConfirmExitDialog = { viewModel.updateShowExitDialog(false) navigateToPrevious() diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryViewModel.kt index e8e5001e..c1818f07 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.clody.data.remote.util.NetworkUtil import com.sopt.clody.domain.repository.DiaryRepository +import com.sopt.clody.domain.repository.DraftRepository import com.sopt.clody.presentation.utils.network.ErrorMessages.FAILURE_NETWORK_MESSAGE import com.sopt.clody.presentation.utils.network.ErrorMessages.FAILURE_TEMPORARY_MESSAGE import com.sopt.clody.presentation.utils.network.ErrorMessages.UNKNOWN_ERROR @@ -22,6 +23,7 @@ import javax.inject.Inject class WriteDiaryViewModel @Inject constructor( private val diaryRepository: DiaryRepository, private val networkUtil: NetworkUtil, + private val draftRepository: DraftRepository, ) : ViewModel() { private val _writeDiaryState = MutableStateFlow(WriteDiaryState.Idle) @@ -169,6 +171,13 @@ class WriteDiaryViewModel @Inject constructor( showExitDialog = show } + fun updateDraftUsage() { + if (!draftRepository.getIsDraftUsed()) { + draftRepository.setIsDraftUsed(true) + draftRepository.setIsFirstUse(true) + } + } + companion object { const val MAX_ENTRIES = 5 const val ENTRY_REGEX = "^[a-zA-Z가-힣0-9ㄱ-ㅎㅏ-ㅣ가-힣\\W]{2,50}$"