diff --git a/SOPT-iOS/Projects/Data/Sources/Repository/PokeMainRepository.swift b/SOPT-iOS/Projects/Data/Sources/Repository/PokeMainRepository.swift index d73c98d82..58848661a 100644 --- a/SOPT-iOS/Projects/Data/Sources/Repository/PokeMainRepository.swift +++ b/SOPT-iOS/Projects/Data/Sources/Repository/PokeMainRepository.swift @@ -48,4 +48,10 @@ extension PokeMainRepository: PokeMainRepositoryInterface { .map { $0.toDomain() } .eraseToAnyPublisher() } + + public func getIsNewUser() -> AnyPublisher { + pokeService.isNewUser() + .map { $0.isNew } + .eraseToAnyPublisher() + } } diff --git a/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/PokeMainRepositoryInterface.swift b/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/PokeMainRepositoryInterface.swift index 88fb7543b..b2e0cfb96 100644 --- a/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/PokeMainRepositoryInterface.swift +++ b/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/PokeMainRepositoryInterface.swift @@ -11,5 +11,6 @@ import Combine public protocol PokeMainRepositoryInterface: PokeRepositoryInterface { func getWhoPokeToMe() -> AnyPublisher func getFriend() -> AnyPublisher<[PokeUserModel], Error> - func getFriendRandomUser(randomType: String, size: Int) -> AnyPublisher + func getFriendRandomUser(randomType: String, size: Int) -> AnyPublisher + func getIsNewUser() -> AnyPublisher } diff --git a/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift b/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift index 4d916875c..6d34f1245 100644 --- a/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift +++ b/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift @@ -17,11 +17,13 @@ public protocol PokeMainUseCase { var pokedResponse: PassthroughSubject { get } var madeNewFriend: PassthroughSubject { get } var errorMessage: PassthroughSubject { get } + var isNewUser: PassthroughSubject { get } func getWhoPokedToMe() func getFriend() func getFriendRandomUser(randomType: PokeRandomUserType, size: Int) - func poke(userId: Int, message: PokeMessageModel, isAnonymous: Bool, willBeNewFriend: Bool) + func poke(userId: Int, message: PokeMessageModel, isAnonymous: Bool, willBeNewFriend: Bool) + func checkPokeOnboardingNeeded() } public class DefaultPokeMainUseCase { @@ -34,6 +36,7 @@ public class DefaultPokeMainUseCase { public let pokedResponse = PassthroughSubject() public let madeNewFriend = PassthroughSubject() public let errorMessage = PassthroughSubject() + public let isNewUser = PassthroughSubject() public init(repository: PokeMainRepositoryInterface) { self.repository = repository @@ -89,4 +92,24 @@ extension DefaultPokeMainUseCase: PokeMainUseCase { } }.store(in: self.cancelBag) } + + public func checkPokeOnboardingNeeded() { + #warning("TODO: 온보딩 노출조건 변경으로 기존 유저들을 위해서 임시로 추가 추후 getIsNewUser 체크 로직 제거 필요") + Just(UserDefaultKeyList.User.isVisitedPokeMainView ?? false) + .withUnretained(self) + .flatMap { [weak self] owner, isVisited in + if isVisited { + return Just(false) + .eraseToAnyPublisher() + } else { + return owner.repository.getIsNewUser() + .replaceError(with: false) + .eraseToAnyPublisher() + } + } + .withUnretained(self) + .sink { [weak self] owner, isNewUser in + owner.isNewUser.send(isNewUser) + }.store(in: self.cancelBag) + } } diff --git a/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift b/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift index c4f4344f1..abaaad398 100644 --- a/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift +++ b/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift @@ -86,16 +86,9 @@ extension PokeMainViewModel { self?.useCase.getFriendRandomUser(randomType: .all, size: 2) }.store(in: cancelBag) - input.viewDidLoad - .map { _ in UserDefaultKeyList.User.isVisitedPokeMainView ?? false } - .withUnretained(self) - .sink { owner, isVisitedPokeMainView in - owner.onPokeOnboardingNeeded?(!isVisitedPokeMainView) - } - .store(in: cancelBag) - input.viewDidLoad .sink { [weak self] _ in + self?.useCase.checkPokeOnboardingNeeded() self?.eventTracker.trackViewEvent(with: .viewPokeMain) }.store(in: cancelBag) @@ -168,6 +161,10 @@ extension PokeMainViewModel { private func bindOutput(output: Output, cancelBag: CancelBag) { + useCase.isNewUser + .sink { [weak self] isNewUser in self?.onPokeOnboardingNeeded?(isNewUser) } + .store(in: cancelBag) + useCase.pokedToMeUser .compactMap { $0 } .sink { output.pokedToMeUser.send($0) }