Skip to content
Open
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
15 changes: 15 additions & 0 deletions Enums/OnboardingStage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// OnboardingStage.swift
// onboard-iOS
//
// Created by 윤다예 on 12/2/23.
//

import Foundation

enum OnboardingStage: String {
case terms = "TERMS"
case updateTerms = "UPDATE_TERMS"
case nickname = "NICKNAME"
case joinGroup = "JOIN_GROUP"
}
66 changes: 44 additions & 22 deletions onboard-iOS.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion onboard-iOS/Coordinator/Coordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ final class AppCoordinator: Coordinator {
}

func start() {
self.showLoginViewController()
DispatchQueue.main.async {
self.showLoginViewController()
}
}

private func showLoginViewController() {
Expand Down
31 changes: 31 additions & 0 deletions onboard-iOS/Coordinator/GroupSearchCoordinator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// GroupSearchCoordinator.swift
// onboard-iOS
//
// Created by 윤다예 on 12/2/23.
//

import UIKit

final class GroupSearchCoordinator: Coordinator {

var childCoordinators: [Coordinator] = []

private var navigationController: UINavigationController?

init(navigationController: UINavigationController?) {
self.navigationController = navigationController
}

func start() {
DispatchQueue.main.async {
let repository = GroupRepositoryImpl()
let useCase = GroupSearchUseCaseImpl(groupRepository: repository)
let reactor = GroupSearchReactor(useCase: useCase)
let viewController = GroupSearchViewController(reactor: reactor)


self.navigationController?.pushViewController(viewController, animated: true)
}
}
}
67 changes: 47 additions & 20 deletions onboard-iOS/Coordinator/LoginCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import UIKit

protocol LoginCoordinatorNavigateDelegate: AnyObject {
func showTermsAgreementView()
func showNicknameSetting()
func showGroupSearch()
}

final class LoginCoordinator: Coordinator {
Expand All @@ -22,26 +24,37 @@ final class LoginCoordinator: Coordinator {
}

func start() {
let appleLoginManager = AppleLoginManagerImpl()
let authRepository = AuthRepositoryImpl()
let appleLoginUseCase = AppleLoginUseCaseImpl(
appleLoginManager: appleLoginManager,
authRepository: authRepository
)

let kakaoLoginManager = KakaoLoginManagerImpl()
let kakaoLoginUseCase = KakaoLoginUseCaseImpl(
kakaoLoginManager: kakaoLoginManager,
authRepository: authRepository
)
let reactor = LoginReactor(
appleUseCase: appleLoginUseCase,
kakaoUseCase: kakaoLoginUseCase,
coordinator: self
)
let viewController = LoginViewController(reactor: reactor)

self.navigationController?.pushViewController(viewController, animated: true)
DispatchQueue.main.async {
let appleLoginManager = AppleLoginManagerImpl()
let authRepository = AuthRepositoryImpl()
let keychainService = KeychainServiceImpl()
let appleLoginUseCase = AppleLoginUseCaseImpl(
appleLoginManager: appleLoginManager,
authRepository: authRepository,
keychainService: keychainService
)

let kakaoLoginManager = KakaoLoginManagerImpl()
let kakaoLoginUseCase = KakaoLoginUseCaseImpl(
kakaoLoginManager: kakaoLoginManager,
authRepository: authRepository
)

let googleLoginUseCase = GoogleLoginUseCaseImpl(
authRepository: authRepository,
keychainService: keychainService
)

let reactor = LoginReactor(
appleUseCase: appleLoginUseCase,
kakaoUseCase: kakaoLoginUseCase,
googleUseCase: googleLoginUseCase,
coordinator: self
)
let viewController = LoginViewController(reactor: reactor)

self.navigationController?.pushViewController(viewController, animated: true)
}
}
}

Expand All @@ -53,4 +66,18 @@ extension LoginCoordinator: LoginCoordinatorNavigateDelegate {
)
coordinator.start()
}

func showNicknameSetting() {
let coordinator = NicknameCoordinator(
navigationController: self.navigationController
)
coordinator.start()
}

func showGroupSearch() {
let coordinator = GroupSearchCoordinator(
navigationController: self.navigationController
)
coordinator.start()
}
}
22 changes: 19 additions & 3 deletions onboard-iOS/Coordinator/NicknameCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@

import UIKit

protocol NicknameCoordinatorNavigateDelegate: AnyObject {
func showGroupSearch()
}

final class NicknameCoordinator: Coordinator {

var childCoordinators: [Coordinator] = []
Expand All @@ -18,9 +22,21 @@ final class NicknameCoordinator: Coordinator {
}

func start() {
let reactor = NicknameReactor(coordinator: self)
let viewController = NicknameViewController(reactor: reactor)
DispatchQueue.main.async {
let reactor = NicknameReactor(coordinator: self)
let viewController = NicknameViewController(reactor: reactor)

self.navigationController?.pushViewController(viewController, animated: true)
}
}
}

extension NicknameCoordinator: NicknameCoordinatorNavigateDelegate {
func showGroupSearch() {
let coordinator = GroupSearchCoordinator(
navigationController: self.navigationController
)

self.navigationController?.pushViewController(viewController, animated: true)
coordinator.start()
}
}
21 changes: 11 additions & 10 deletions onboard-iOS/Coordinator/TermsAgreementCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,17 @@ final class TermsAgreementCoordinator: Coordinator {
}

func start() {
let repository = TermsAgreementRepositoryImpl()
let useCase = TermsAgreementUseCaseImpl(repository: repository)
let reactor = TermsAgreementReactor(coordinator: self, useCase: useCase)
let viewController = UINavigationController(
rootViewController: TermsAgreementViewController(reactor: reactor)
)
viewController.modalPresentationStyle = .overFullScreen

self.navigationController?.present(viewController, animated: false)
self.navigationController = viewController
DispatchQueue.main.async {
let repository = TermsAgreementRepositoryImpl()
let useCase = TermsAgreementUseCaseImpl(repository: repository)
let reactor = TermsAgreementReactor(coordinator: self, useCase: useCase)
let viewController = UINavigationController(
rootViewController: TermsAgreementViewController(reactor: reactor)
)
viewController.modalPresentationStyle = .overFullScreen
self.navigationController?.present(viewController, animated: false)
self.navigationController = viewController
}
}

func showTerms(url: String) {
Expand Down
4 changes: 4 additions & 0 deletions onboard-iOS/DesignSystem/Values/BaseButton.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,14 @@ class BaseButton: UIButton {
self.bgColor = Colors.Orange_10
self.textColor = Colors.Gray_2
self.typo = Font.Typography.label3_B
self.isEnabled = true

case .disabled:
self.bgColor = Colors.Gray_4
self.textColor = Colors.Gray_7
self.typo = Font.Typography.label3_M
self.isEnabled = false

case .pressed:
self.bgColor = Colors.Gray_15
self.textColor = Colors.Gray_1
Expand Down
13 changes: 13 additions & 0 deletions onboard-iOS/Domain/Entity/OnboardingEntity.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// OnboardingEntity.swift
// onboard-iOS
//
// Created by 윤다예 on 12/2/23.
//

import Foundation

struct OnboardingEntity {
let stages: [String]
let groupId: Int?
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
//
// TermsAgreementEntity.swift
// TermsEntity.swift
// onboard-iOS
//
// Created by 윤다예 on 11/28/23.
//

import Foundation

struct TermsAgreementEntity {
struct TermsEntity {
let terms: [Term]

struct Term {
Expand All @@ -17,3 +17,10 @@ struct TermsAgreementEntity {
let isReuired: Bool
}
}

enum TermsAgreementEntity {
struct Req {
let agreeList: [String]
let disagreeList: [String]
}
}
35 changes: 21 additions & 14 deletions onboard-iOS/Domain/Login/AppleLoginUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
import RxSwift

protocol AppleLoginUseCase {
var result: Observable<Bool> { get }
var result: Observable<OnboardingEntity> { get }
func signIn() async
}

Expand All @@ -22,28 +22,38 @@ protocol AppleLoginDelegate: AnyObject {
protocol AuthRepository {
// api 호출 및 토큰 가져오기
func signIn(req: AuthEntity.Req) async throws -> AuthEntity.Res
func onboarding() async throws -> OnboardingEntity
}

final class AppleLoginUseCaseImpl: AppleLoginUseCase {

private let appleLoginManager: AppleLoginManager
private let authRepository: AuthRepository
private let keychainService: KeychainService

var result: Observable<Bool>
private let _result: PublishSubject<Bool> = .init()
var result: Observable<OnboardingEntity>
private let _result: PublishSubject<OnboardingEntity> = .init()

init(
appleLoginManager: AppleLoginManager,
authRepository: AuthRepository
authRepository: AuthRepository,
keychainService: KeychainService
) {
self.appleLoginManager = appleLoginManager
self.authRepository = authRepository
self.keychainService = keychainService
self.result = self._result
}

func signIn() async {
self.removeKeychainData()
self.appleLoginManager.excute(delegate: self)
}

private func removeKeychainData() {
self.keychainService.remove(forKey: .accessToken)
self.keychainService.remove(forKey: .refreshToken)
}
}

// MARK: - Apple login delegate
Expand All @@ -52,18 +62,15 @@ extension AppleLoginUseCaseImpl: AppleLoginDelegate {

func success(token: String) {
Task {
let result = try await self.authRepository.signIn(
let authResult = try await self.authRepository.signIn(
req: AuthEntity.Req(type: .apple, token: token)
)

// TODO: 온보딩 진행정보 받아오기 호출 구현
// 임시로 false 처리
let isExisted = false
print(result.accessToken)
print("-=-----==========")
print(result.refreshToken)

self._result.onNext(isExisted)
self.keychainService.set(authResult.accessToken, forKey: .accessToken)
self.keychainService.set(authResult.refreshToken, forKey: .refreshToken)

let onboardingResult = try await self.authRepository.onboarding()

self._result.onNext(onboardingResult)
}
}
}
57 changes: 57 additions & 0 deletions onboard-iOS/Domain/Login/GoogleLoginUseCase.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//
// GoogleLoginUseCase.swift
// onboard-iOS
//
// Created by 윤다예 on 12/3/23.
//

import Foundation

import RxSwift

protocol GoogleLoginUseCase {
var result: Observable<OnboardingEntity> { get }
func signIn(token: String) async throws
}

protocol GoogleLoginDelegate: AnyObject {
// 구글로그인 토큰 전달
func success(token: String)
}

final class GoogleLoginUseCaseImpl: GoogleLoginUseCase {

private let authRepository: AuthRepository
private let keychainService: KeychainService

var result: Observable<OnboardingEntity>
private let _result: PublishSubject<OnboardingEntity> = .init()

init(
authRepository: AuthRepository,
keychainService: KeychainService
) {
self.authRepository = authRepository
self.keychainService = keychainService
self.result = self._result
}

func signIn(token: String) async throws {
self.removeKeychainData()

let authResult = try await self.authRepository.signIn(
req: AuthEntity.Req(type: .google, token: token)
)
self.keychainService.set(authResult.accessToken, forKey: .accessToken)
self.keychainService.set(authResult.refreshToken, forKey: .refreshToken)

let onboardingResult = try await self.authRepository.onboarding()

self._result.onNext(onboardingResult)
}

private func removeKeychainData() {
self.keychainService.remove(forKey: .accessToken)
self.keychainService.remove(forKey: .refreshToken)
}
}
Loading