Skip to content

Commit

Permalink
[fix]: mission unlocked alert and description(#540)
Browse files Browse the repository at this point in the history
  • Loading branch information
akrudal committed Jun 3, 2024
1 parent ce00a41 commit b2cf1cf
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ extension MainViewDIContainer {
fetchMainUseCase: makeFetchMainUseCase(),
fetchMainNightUseCase: makeFetchMainNightUseCase(),
pickUseCase: makePickUseCase(),
checkMissionAlertShowUseCase: makeCheckMissionAlertShowUseCase(),
provider: globalState
)
}
Expand All @@ -48,11 +49,19 @@ extension MainViewDIContainer {
return MainRepository()
}

private func makeMissionUserDefaultsRepository() -> MissionUserDefaultsRepository {
return MissionUserDefaultsRepository()
}

private func makeFetchMainUseCase() -> FetchMainUseCaseProtocol {
return FetchMainUseCase(mainRepository: makeMainRepository())
}

private func makeFetchMainNightUseCase() -> FetchMainNightUseCaseProtocol {
return FetchMainNightUseCase(mainRepository: makeMainRepository())
}

private func makeCheckMissionAlertShowUseCase() -> CheckMissionAlertShowUseCaseProtocol {
return CheckMissionAlertShowUseCase(missionUserDefaultsRepository: makeMissionUserDefaultsRepository())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ final class MainViewReactor: Reactor {
case cameraViewController(UploadLocation)
case survivalAlert
case pickAlert(String, String)
case missionUnlockedAlert
case weeklycalendarViewController(String)
case familyManagementViewController
case monthlyCalendarViewController
Expand All @@ -38,6 +39,7 @@ final class MainViewReactor: Reactor {
case fetchMainUseCase
case fetchMainNightUseCase

case checkMissionAlert(Bool, Bool)
case openNextViewController(TapAction)
case didTapSegmentControl(PostType)
case pickConfirmButtonTapped(String, String)
Expand Down Expand Up @@ -91,18 +93,20 @@ final class MainViewReactor: Reactor {
private let fetchMainUseCase: FetchMainUseCaseProtocol
private let fetchMainNightUseCase: FetchMainNightUseCaseProtocol
private let pickUseCase: PickUseCaseProtocol
private let checkMissionAlertShowUseCase: CheckMissionAlertShowUseCaseProtocol
private let provider: GlobalStateProviderProtocol

init(
fetchMainUseCase: FetchMainUseCaseProtocol,
fetchMainNightUseCase: FetchMainNightUseCaseProtocol,
pickUseCase: PickUseCaseProtocol,
provider: GlobalStateProviderProtocol) {
self.fetchMainUseCase = fetchMainUseCase
self.fetchMainNightUseCase = fetchMainNightUseCase
self.pickUseCase = pickUseCase
self.provider = provider
}
init(fetchMainUseCase: FetchMainUseCaseProtocol,
fetchMainNightUseCase: FetchMainNightUseCaseProtocol,
pickUseCase: PickUseCaseProtocol,
checkMissionAlertShowUseCase: CheckMissionAlertShowUseCaseProtocol,
provider: GlobalStateProviderProtocol) {
self.fetchMainUseCase = fetchMainUseCase
self.fetchMainNightUseCase = fetchMainNightUseCase
self.pickUseCase = pickUseCase
self.checkMissionAlertShowUseCase = checkMissionAlertShowUseCase
self.provider = provider
}
}

extension MainViewReactor {
Expand Down Expand Up @@ -144,7 +148,8 @@ extension MainViewReactor {
return Observable.concat(
Observable.just(.updateMainData(data)),
Observable.just(.setBalloonText),
Observable.just(.setCamerEnabled)
Observable.just(.setCamerEnabled),
self.mutate(action: .checkMissionAlert(data.isMissionUnlocked, data.isMeSurvivalUploadedToday))
)
}
case .fetchMainNightUseCase:
Expand All @@ -163,7 +168,8 @@ extension MainViewReactor {
.flatMap {_ in
return Observable.concat([
Observable.just(Mutation.setInTime(false)),
self.mutate(action: .fetchMainNightUseCase)
self.mutate(action: .fetchMainNightUseCase),
Observable.just(Mutation.setDescriptionText)
])
}
} else {
Expand Down Expand Up @@ -233,6 +239,19 @@ extension MainViewReactor {
case .contributorNextButtonTap:
return Observable<Mutation>.just(.showNextView(.weeklycalendarViewController(currentState.contributor.recentPostDate)))
}
case .checkMissionAlert(let isUnlocked, let isMeSurvivalUploadedToday):
if isUnlocked && isMeSurvivalUploadedToday {
return checkMissionAlertShowUseCase.execute()
.flatMap { isAlreadyShown in
if !isAlreadyShown {
return Observable<Mutation>.just(.showNextView(.missionUnlockedAlert))
} else {
return Observable<Mutation>.empty()
}
}
} else {
return Observable<Mutation>.empty()
}
}
}

Expand Down Expand Up @@ -298,7 +317,7 @@ extension MainViewReactor {
if currentState.pageIndex == 0 {
newState.cameraEnabled = !currentState.isMeSurvivalUploadedToday
} else {
if (!currentState.isMeMissionUploadedToday) && currentState.isMissionUnlocked {
if (!currentState.isMeMissionUploadedToday) && currentState.isMissionUnlocked {
newState.cameraEnabled = true
} else {
newState.cameraEnabled = false
Expand Down Expand Up @@ -343,6 +362,12 @@ extension MainViewReactor {
private func setDescriptionText(_ state: State) -> State {
var newState = state

guard let inTime = currentState.isInTime,
inTime else {
newState.description = .survivalNone
return newState
}

if currentState.pageIndex == 0 {
if currentState.isFamilySurvivalUploadedToday {
newState.description = .survivalFull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,14 @@ extension MainViewController {
guard let self else { return }
self.alertConfirmRelay.accept((name, id)) }
.present()
case .missionUnlockedAlert:
BibbiAlertBuilder(self)
.alertStyle(.missionKey)
.setConfirmAction { [weak self] in
guard let self else { return }
self.navigationController?.pushViewController(CameraDIContainer(cameraType: .mission).makeViewController(), animated: true)
}
.present()
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// MissionUserDefaultsRepository.swift
// Data
//
// Created by 마경미 on 03.06.24.
//

import Foundation

import Domain

import RxSwift

public final class MissionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol {

private let lastMissionUploadDateId = "lastMissionUploadDateId"

public init() { }

public func isAlreadyShowMissionAlert() -> Observable<Bool> {
guard let lastDate = UserDefaults.standard.string(forKey: lastMissionUploadDateId) else {
saveMissionUploadDate()
return .just(false)
}

if lastDate == Date().toFormatString(with: "yyyy-MM-dd") {
return .just(true)
} else {
saveMissionUploadDate()
return .just(false)
}
}

private func saveMissionUploadDate() {
let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let extractedDate = dateFormatter.string(from: Date())
UserDefaults.standard.set(extractedDate, forKey: lastMissionUploadDateId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// MissionAlertUseCaseProtocol.swift
// Domain
//
// Created by 마경미 on 03.06.24.
//

import Foundation

import RxSwift

public protocol CheckMissionAlertShowUseCaseProtocol {
func execute() -> Observable<Bool>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// MissionUserdefaultsRepositoryProtocol.swift
// Domain
//
// Created by 마경미 on 03.06.24.
//

import Foundation

import RxSwift

public protocol MissionUserdefaultsRepositoryProtocol {
func isAlreadyShowMissionAlert() -> Observable<Bool>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// CheckMissionUseCase.swift
// Domain
//
// Created by 마경미 on 03.06.24.
//

import Foundation

import RxSwift

public class CheckMissionAlertShowUseCase: CheckMissionAlertShowUseCaseProtocol {
private let missionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol

public init(missionUserDefaultsRepository: MissionUserdefaultsRepositoryProtocol) {
self.missionUserDefaultsRepository = missionUserDefaultsRepository
}

public func execute() -> Observable<Bool> {
return missionUserDefaultsRepository.isAlreadyShowMissionAlert().asObservable()
}
}

0 comments on commit b2cf1cf

Please sign in to comment.