From 1d4fb275ec6dea4a330f8ade5398776e1e2db2f7 Mon Sep 17 00:00:00 2001 From: kwonseokki Date: Tue, 5 May 2026 21:50:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[Feat]=20#867=20-=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EB=B0=A9=EB=AC=B8=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9D=84=20=EC=9C=84=ED=95=9C=20getIsNewUser?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Sources/Repository/PokeMainRepository.swift | 6 ++++++ .../RepositoryInterface/PokeMainRepositoryInterface.swift | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) 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 } From 3bae31edd27f0935bc1905cb04d15ba2fb9f4a73 Mon Sep 17 00:00:00 2001 From: kwonseokki Date: Tue, 5 May 2026 21:52:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[Fix]=20#867=20-=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=ED=99=95=EC=9D=B8=20=EC=8B=9C=20isVisited?= =?UTF-8?q?PokeMainView=20=EA=B2=B0=EA=B3=BC=EC=97=90=20=EB=94=B0=EB=9D=BC?= =?UTF-8?q?=20getIsNewUser=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=ED=98=B8=EC=B6=9C=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/UseCase/PokeMainUseCase.swift | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift b/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift index 4d916875c..5583615ef 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 getIsNewUser() } 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 getIsNewUser() { + #warning("TODO: 온보딩 노출조건 변경으로 기존 유저들을 위해서 임시로 추가 추후 getIsNewUser 체크 로직 제거 필요") + Just(UserDefaultKeyList.User.isVisitedPokeMainView ?? false) + .flatMap { [weak self] isVisited in + guard let self = self else { return Just(false).eraseToAnyPublisher() } + + if isVisited { + return Just(false) + .eraseToAnyPublisher() + } else { + return repository.getIsNewUser() + .replaceError(with: false) + .eraseToAnyPublisher() + } + } + .sink { [weak self] isNewUser in + self?.isNewUser.send(isNewUser) + }.store(in: self.cancelBag) + } } From 167474816f5f7e8f17698c3a3aec069da397db17 Mon Sep 17 00:00:00 2001 From: kwonseokki Date: Tue, 5 May 2026 21:53:43 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[Fix]=20#867=20-=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EB=A5=BC=20=EC=B2=B4=ED=81=AC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=BD=95=EC=B0=8C=EB=A5=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=98=A8=EB=B3=B4=EB=94=A9=20=EB=85=B8=EC=B6=9C=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PokeMainScene/ViewModel/PokeMainViewModel.swift | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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..a3ff9153c 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.getIsNewUser() 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) } From de080100361fc7dcbbafdecc38f7b487980581c1 Mon Sep 17 00:00:00 2001 From: kwonseokki Date: Wed, 13 May 2026 10:05:22 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[Fix]=20#867=20-=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Sources/UseCase/PokeMainUseCase.swift | 16 ++++++++-------- .../ViewModel/PokeMainViewModel.swift | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift b/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift index 5583615ef..6d34f1245 100644 --- a/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift +++ b/SOPT-iOS/Projects/Domain/Sources/UseCase/PokeMainUseCase.swift @@ -23,7 +23,7 @@ public protocol PokeMainUseCase { func getFriend() func getFriendRandomUser(randomType: PokeRandomUserType, size: Int) func poke(userId: Int, message: PokeMessageModel, isAnonymous: Bool, willBeNewFriend: Bool) - func getIsNewUser() + func checkPokeOnboardingNeeded() } public class DefaultPokeMainUseCase { @@ -93,23 +93,23 @@ extension DefaultPokeMainUseCase: PokeMainUseCase { }.store(in: self.cancelBag) } - public func getIsNewUser() { + public func checkPokeOnboardingNeeded() { #warning("TODO: 온보딩 노출조건 변경으로 기존 유저들을 위해서 임시로 추가 추후 getIsNewUser 체크 로직 제거 필요") Just(UserDefaultKeyList.User.isVisitedPokeMainView ?? false) - .flatMap { [weak self] isVisited in - guard let self = self else { return Just(false).eraseToAnyPublisher() } - + .withUnretained(self) + .flatMap { [weak self] owner, isVisited in if isVisited { return Just(false) .eraseToAnyPublisher() } else { - return repository.getIsNewUser() + return owner.repository.getIsNewUser() .replaceError(with: false) .eraseToAnyPublisher() } } - .sink { [weak self] isNewUser in - self?.isNewUser.send(isNewUser) + .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 a3ff9153c..abaaad398 100644 --- a/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift +++ b/SOPT-iOS/Projects/Features/PokeFeature/Sources/PokeMainScene/ViewModel/PokeMainViewModel.swift @@ -88,7 +88,7 @@ extension PokeMainViewModel { input.viewDidLoad .sink { [weak self] _ in - self?.useCase.getIsNewUser() + self?.useCase.checkPokeOnboardingNeeded() self?.eventTracker.trackViewEvent(with: .viewPokeMain) }.store(in: cancelBag)