Skip to content

[Fix] #542 - /poke/friend 404 에러 처리 #543

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Apr 10, 2025
11 changes: 10 additions & 1 deletion SOPT-iOS/Projects/Data/Sources/Repository/HomeRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,21 @@ public class HomeRepository {
private let calendarService: CalendarService
private let userService: UserService
private let stampService: StampService
private let pokeService: PokeService

private let cancelBag = CancelBag()

public init(homeService: HomeService,
calendarService: CalendarService,
userService: UserService,
stampService: StampService
stampService: StampService,
pokeService: PokeService
) {
self.homeService = homeService
self.calendarService = calendarService
self.userService = userService
self.stampService = stampService
self.pokeService = pokeService
}
}

Expand Down Expand Up @@ -118,4 +121,10 @@ extension HomeRepository: HomeRepositoryInterface {
.map { $0.toDomain() }
.eraseToAnyPublisher()
}

public func checkPokeNewUser() -> AnyPublisher<Bool, any Error> {
pokeService.isNewUser()
.map{ $0.isNew }
.eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ extension AppDelegate {
homeService: DefaultHomeService(),
calendarService: DefaultCalendarService(),
userService: DefaultUserService(),
stampService: DefaultStampService()
stampService: DefaultStampService(),
pokeService: DefaultPokeService()
)
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ public protocol HomeRepositoryInterface {
func getCalendarDetail() -> AnyPublisher<[HomeCalendarDetailModel], Error>
func getAnnouncementPosts() -> AnyPublisher<[HomeAnnouncementModel], Error>
func getReportUrl() -> AnyPublisher<SoptampReportUrlModel, Error>
func checkPokeNewUser() -> AnyPublisher<Bool, Error>
}
10 changes: 10 additions & 0 deletions SOPT-iOS/Projects/Domain/Sources/UseCase/HomeUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public protocol HomeUseCase {
func getCalendarDetail() -> AnyPublisher<[HomeCalendarDetailModel], Never>
func getAnnouncementPosts() -> AnyPublisher<[HomeAnnouncementModel], Never>
func getReportURL()
func checkPokeNewUser() -> AnyPublisher<Bool, Never>
}

public class DefaultHomeUseCase {
Expand Down Expand Up @@ -118,4 +119,13 @@ extension DefaultHomeUseCase: HomeUseCase {
UserDefaultKeyList.Soptamp.reportUrl = resultModel.reportUrl
}.store(in: cancelBag)
}

public func checkPokeNewUser() -> AnyPublisher<Bool, Never> {
repository.checkPokeNewUser()
.catch { error in
print("HomeUseCase checkPokeNewUser에서 문제가 발생했습니다. \(error)")
return Empty<Bool, Never>()
}
.eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public protocol HomeForMemberCoordinatable {
var onSettingButtonTapped: ((UserType) -> Void)? { get set }
var onNeedSignIn: (() -> Void)? { get set }
var onNetworkError: (() -> Void)? { get set }
var onPoke: ((_ isNewUser: Bool) -> Void)? { get set }
}
public typealias HomeForMemberViewModelType = ViewModelType & HomeForMemberCoordinatable
public typealias HomeForMemberPresentable = (vc: HomeForMemberViewControllable, vm: any HomeForMemberViewModelType)
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public enum HomeCoordinatorDestination {
case attendance
case soptlog
case calendar
case poke(isNewUser: Bool)

case webLink(url: String)
case deepLink(url: String)
Expand Down Expand Up @@ -103,6 +104,11 @@ public final class HomeCoordinator: DefaultHomeCoordinator {
homeForMember.vm.onNetworkError = {
AlertUtils.presentNetworkAlertVC()
}

homeForMember.vm.onPoke = { [weak self] isNewUser in
self?.requestCoordinating?(.poke(isNewUser: isNewUser))
}

rootViewController = homeForMember.vc.viewController

router.push(homeForMember.vc)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public class HomeForMemberViewModel: HomeForMemberViewModelType {
public var onSettingButtonTapped: ((UserType) -> Void)?
public var onNeedSignIn: (() -> Void)?
public var onNetworkError: (() -> Void)?
public var onPoke: ((Bool) -> Void)?


// MARK: - initialization

Expand Down Expand Up @@ -159,7 +161,14 @@ extension HomeForMemberViewModel {
owner.onMainProductCellTapped?(model.product.serviceDomainLink)
owner.trackAmplitude(event: model.product.toAmplitudeEventTypeNew)
case .appService(let model):
owner.onAppServiceCellTapped?(model.deepLink)
if model.serviceName == "콕찌르기" {
owner.useCase.checkPokeNewUser()
.sink { isPokeNewUser in
owner.onPoke?(isPokeNewUser)
}.store(in: cancelBag)
} else {
owner.onAppServiceCellTapped?(model.deepLink)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 함수로 분리해주시면 좋을 것 같아요~!!

글고 serviceName으로 기능을 필터링하는 게 별로 좋아보이지는 않는데... service type을 관리하는 enum 만드는 건 어떻게 생각하세요? 저희가 서비스 네임까지 전부 서버에서 내려주는 값에 의존하기로 한 건 클라에서의 분기를 최소화하기 위함이었는데, 어쩔 수 없이 이렇게 클라에서 분기해야 할 필요가 있다면 (문자열이 아닌) 의미 단위로 분기할 수 있도록 enum에 맵핑해주는 게 좋을 것 같아요

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맞아요. 원래 Core 모듈 내 AppServiceType을 활용하려고 했는데, 해당 enum을 HomeFeature에 맞게 변경하려면 홈 개편 전인 MainFeature 부분도 수정해야해서 사용 보류했습니다! #540 에서 MainFeature 코드 삭제 후에 기존 Enum 적용해서 수정하도록 할게요! 좋은 의견 감사합니다👍

default: break
}
}
Expand Down Expand Up @@ -190,6 +199,16 @@ extension HomeForMemberViewModel {

return output
}
}

// MARK: - Methods

extension HomeForMemberViewModel {
private func trackAmplitude(event: AmplitudeEventType?) {
if let event {
AmplitudeInstance.shared.trackWithUserType(event: event)
}
}

private func requestAuthorizationForNotification() {
guard self.userType != .visitor,
Expand All @@ -210,11 +229,3 @@ extension HomeForMemberViewModel {
}
}
}

extension HomeForMemberViewModel {
private func trackAmplitude(event: AmplitudeEventType?) {
if let event {
AmplitudeInstance.shared.trackWithUserType(event: event)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ extension PokeMainViewModel {
self?.useCase.getFriendRandomUser(randomType: .all, size: 2)
}.store(in: cancelBag)

// 콕찌르기 새 유저인지 판별, 새유저인 경우 PokeOnboardingVC로 전환한다.
// isRouteFromRoot == true일 때만 로직 실행, isRouteFromRoot는 딥링크를 통해 이동한 경우만 true (update.2025.04.08)
input.viewDidLoad
.map { [weak self] _ in
self?.isRouteFromRoot
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@ extension ApplicationCoordinator {
self?.handleWebLink(webLink: url)
case .calendar:
self?.showHomeCalendarDetail()
case .poke(let isNewUser):
_ = isNewUser ? self?.runPokeOnboardingFlow() : self?.runPokeFlow()
}
}
case .soptlog:
Expand Down Expand Up @@ -315,6 +317,8 @@ extension ApplicationCoordinator {
self?.handleWebLink(webLink: url)
case .calendar:
self?.showHomeCalendarDetail()
case .poke(let isNewUser):
isNewUser ? self?.runPokeOnboardingFlow() : self?.runPokeFlow()
}
}
addDependency(coordinator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ extension AppDelegate {
homeService: DefaultHomeService(),
calendarService: DefaultCalendarService(),
userService: DefaultUserService(),
stampService: DefaultStampService()
stampService: DefaultStampService(),
pokeService: DefaultPokeService()
)
}
)
Expand Down