Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import `in`.koreatech.koin.core.navigation.Navigator
import `in`.koreatech.koin.core.permission.checkNotificationPermission
import `in`.koreatech.koin.core.toast.ToastUtil
import `in`.koreatech.koin.core.util.SnackbarUtil
import `in`.koreatech.koin.domain.model.notification.SubscribesType
import `in`.koreatech.koin.feature.article.R
import `in`.koreatech.koin.feature.article.databinding.FragmentArticleKeywordBinding
import javax.inject.Inject
Expand All @@ -36,8 +37,6 @@ class ArticleKeywordFragment : Fragment() {
private val binding get() = _binding!!

private val viewModel by viewModels<ArticleKeywordViewModel>()
// FIXME
// private val notificationViewModel by viewModels<NotificationViewModel>()

@Inject
lateinit var navigator: Navigator
Expand Down Expand Up @@ -320,8 +319,7 @@ class ArticleKeywordFragment : Fragment() {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.user.collect { user ->
if (user.isAnonymous.not()) {
// FIXME
// notificationViewModel.getPermissionInfo()
viewModel.getPermissionInfo()
}
}
}
Expand All @@ -346,21 +344,20 @@ class ArticleKeywordFragment : Fragment() {
AnalyticsConstant.Label.KEYWORD_NOTIFICATION,
"on"
)
// notificationViewModel.updateSubscription(SubscribesType.ARTICLE_KEYWORD)
viewModel.updateSubscription(SubscribesType.ARTICLE_KEYWORD)
} else {
EventLogger.logClickEvent(
EventAction.CAMPUS,
AnalyticsConstant.Label.KEYWORD_NOTIFICATION,
"off"
)
// notificationViewModel.deleteSubscription(SubscribesType.ARTICLE_KEYWORD)
viewModel.deleteSubscription(SubscribesType.ARTICLE_KEYWORD)
}
}

viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
/* FIXME
notificationViewModel.notificationUiState.collect { uiState ->
viewModel.notificationUiState.collect { uiState ->
if (uiState is NotificationUiState.Success) {
uiState.notificationPermissionInfo.subscribes.forEach {
if (it.type == SubscribesType.ARTICLE_KEYWORD) {
Expand All @@ -374,7 +371,6 @@ class ArticleKeywordFragment : Fragment() {
}
}
}
*/
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,50 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import `in`.koreatech.koin.core.viewmodel.BaseViewModel
import `in`.koreatech.koin.domain.model.notification.NotificationPermissionInfo
import `in`.koreatech.koin.domain.model.notification.SubscribesType
import `in`.koreatech.koin.domain.model.user.User
import `in`.koreatech.koin.domain.repository.ArticleRepository
import `in`.koreatech.koin.domain.usecase.notification.DeleteNotificationSubscriptionUseCase
import `in`.koreatech.koin.domain.usecase.notification.GetNotificationPermissionInfoUseCase
import `in`.koreatech.koin.domain.usecase.notification.UpdateNotificationSubscriptionUseCase
import `in`.koreatech.koin.domain.usecase.user.GetUserStatusUseCase
import `in`.koreatech.koin.domain.util.onFailure
import `in`.koreatech.koin.domain.util.onSuccess
import javax.inject.Inject
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update

@HiltViewModel
class ArticleKeywordViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val articleRepository: ArticleRepository,
private val getNotificationPermissionInfoUseCase: GetNotificationPermissionInfoUseCase,
private val updateNotificationSubscriptionUseCase: UpdateNotificationSubscriptionUseCase,
private val deleteNotificationSubscriptionUseCase: DeleteNotificationSubscriptionUseCase,
getUserStatusUseCase: GetUserStatusUseCase
) : BaseViewModel() {
val user: StateFlow<User> =
getUserStatusUseCase()
.stateIn(viewModelScope, SharingStarted.Eagerly, User.Anonymous)

private val _notificationUiState =
MutableStateFlow<NotificationUiState>(NotificationUiState.Nothing)
val notificationUiState = _notificationUiState.asStateFlow()

val keywordInputUiState: StateFlow<KeywordInputUiState> =
savedStateHandle.getStateFlow(KEYWORD_INPUT, "").map {
if (it.isEmpty()) KeywordInputUiState.Empty else KeywordInputUiState.Valid(it)
Expand Down Expand Up @@ -103,6 +120,30 @@ class ArticleKeywordViewModel @Inject constructor(
}.launchIn(viewModelScope)
}

fun getPermissionInfo() {
viewModelScope.launchWithLoading {
getNotificationPermissionInfoUseCase().onSuccess { info ->
_notificationUiState.update {
NotificationUiState.Success(info)
}
}.onFailure {
_notificationUiState.update { NotificationUiState.Failed }
}
}
}

fun updateSubscription(type: SubscribesType) {
viewModelScope.launchWithLoading {
updateNotificationSubscriptionUseCase(type)
}
}

fun deleteSubscription(type: SubscribesType) {
viewModelScope.launchWithLoading {
deleteNotificationSubscriptionUseCase(type)
}
}

fun deleteKeyword(keyword: String) {
articleRepository.deleteKeyword(keyword).onEach {
_keywordAddUiState.emit(KeywordAddUiState.Success(keyword))
Expand Down Expand Up @@ -150,3 +191,13 @@ sealed interface KeywordInputUiState {

data class Valid(val keyword: String) : KeywordInputUiState
}

sealed class NotificationUiState {
data class Success(
val notificationPermissionInfo: NotificationPermissionInfo
) : NotificationUiState()

data object Failed : NotificationUiState()

data object Nothing : NotificationUiState()
}