Skip to content
Merged
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
4 changes: 4 additions & 0 deletions Projects/CommonUI/Sources/Component/LMTextField.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,8 @@ public class LMTextField: UITextField {
$0.height.equalTo(55)
}
}

public func currentText() -> String {
return self.text ?? ""
}
}
19 changes: 12 additions & 7 deletions Projects/CommonUI/Sources/View/Login/SignInView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ open class SignInView: UIView {
}

var textFieldStackView = UIStackView()
var idTextField = LMTextField()
var passwordTextField = LMTextField()
var loginButton = LMButton(textColor: CommonUIAssets.LMBlack,
public var idTextField = LMTextField()
public var passwordTextField = LMTextField()
var signInButton = LMButton(textColor: CommonUIAssets.LMBlack,
bgColor: CommonUIAssets.LMOrange1)
var signUpButton = UIButton()

public let signInTapped = PublishRelay<Void>()
public let signUpTapped = PublishRelay<Void>()
private let disposeBag = DisposeBag()

Expand All @@ -40,6 +41,10 @@ open class SignInView: UIView {
}

func bindEvents() {
signInButton.rx.tap
.bind(to: signInTapped)
.disposed(by: disposeBag)

signUpButton.rx.tap
.bind(to: signUpTapped)
.disposed(by: disposeBag)
Expand All @@ -63,7 +68,7 @@ open class SignInView: UIView {
$0.isSecureTextEntry = true
}

loginButton = loginButton.then {
signInButton = signInButton.then {
$0.setTitle("로그인", for: .normal)
}

Expand All @@ -84,7 +89,7 @@ open class SignInView: UIView {
}

func initUI() {
[logoView, textFieldStackView, loginButton, signUpButton]
[logoView, textFieldStackView, signInButton, signUpButton]
.forEach { addSubview($0) }

[idTextField, passwordTextField]
Expand All @@ -102,14 +107,14 @@ open class SignInView: UIView {
$0.height.equalTo(130)
}

loginButton.snp.makeConstraints {
signInButton.snp.makeConstraints {
$0.top.equalTo(textFieldStackView.snp.bottom).offset(33)
$0.centerX.equalToSuperview()
$0.horizontalEdges.equalToSuperview().inset(20)
}

signUpButton.snp.makeConstraints {
$0.top.equalTo(loginButton.snp.bottom).offset(35)
$0.top.equalTo(signInButton.snp.bottom).offset(35)
$0.centerX.equalToSuperview()
$0.height.equalTo(27)
}
Expand Down
19 changes: 19 additions & 0 deletions Projects/Data/Sources/DTO/LoginDTO.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,29 @@ import Foundation
import Domain

public struct LoginDTO: Decodable {
public let is_success: Bool
public let code: String
public let message: String
public let data: LoginDataDTO
}

public struct LoginDataDTO: Decodable {
public let accessToken: String
public let refreshToken: String
}

extension LoginDTO {
func getMessage() -> LoginVO {
return .init(accessToken: data.accessToken,
refreshToken: data.refreshToken)
}
}

public struct GoogleLoginDTO: Decodable {
public let accessToken: String
}

extension GoogleLoginDTO {
// func toDomain() -> CourseVO {
// return CourseVO(courseLv: 1,
// courseDescription: "courseDescription",
Expand Down
10 changes: 5 additions & 5 deletions Projects/Data/Sources/Repository/LoginRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@ import Foundation
public class DefaultLoginRepository: LoginRepository {
public init() {}

public func postGoogleLogin() -> Single<LoginVO> {
public func postGoogleLogin() -> Single<GoogleLoginVO> {
return request(
endpoint: "/oauth2/authorization/google",
responseType: LoginDTO.self
responseType: GoogleLoginDTO.self
)
.map { dto in
return LoginVO(accessToken: "")
return GoogleLoginVO(accessToken: "")
}
}

public func postAppleLogin(userName: String?, identityToken: String) -> Single<LoginVO> {
public func postAppleLogin(userName: String?, identityToken: String) -> Single<GoogleLoginVO> {
let params: Parameters = [
"userName": userName,
"identityToken": identityToken
Expand Down Expand Up @@ -52,7 +52,7 @@ public class DefaultLoginRepository: LoginRepository {
let components = URLComponents(string: location) {
let items = components.queryItems ?? []
let accessToken = items.first(where: { $0.name == "accessToken" })?.value
single(.success(LoginVO(accessToken: accessToken)))
single(.success(GoogleLoginVO(accessToken: accessToken)))
} else {
let error = NSError(domain: "DefaultLoginRepository",
code: -1,
Expand Down
18 changes: 16 additions & 2 deletions Projects/Data/Sources/Repository/SignRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@ public class DefaultSignRepository: SignRepository {

public init() { }

public func postSignIn(email: String, password: String) -> Single<LoginVO> {
let params = ["email": email,
"password": password]
return request(endpoint: "/api/auth/sign-in",
parameters: params,
responseType: LoginDTO.self)
.map { dto in
return dto.getMessage()
}
}

public func postEmail(email: String) -> Single<DefaultVO> {
let params = ["email": email]
return request(endpoint: "/api/auth/email",
Expand All @@ -24,7 +35,8 @@ public class DefaultSignRepository: SignRepository {
}

public func postConfirm(email: String, code: String) -> Single<DefaultVO> {
let params = ["email": email, "code": code]
let params = ["email": email,
"code": code]
return request(endpoint: "/api/auth/email/confirm",
parameters: params,
responseType: DefaultDTO.self)
Expand All @@ -34,7 +46,9 @@ public class DefaultSignRepository: SignRepository {
}

public func postSignUp(username: String, email: String, password: String) -> Single<DefaultVO> {
let params = ["username": username, "email": email, "password": password]
let params = ["username": username,
"email": email,
"password": password]
return request(endpoint: "/api/auth/sign-up",
parameters: params,
responseType: DefaultDTO.self)
Expand Down
23 changes: 19 additions & 4 deletions Projects/Data/Sources/Repository/TokenRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,38 @@ import Foundation

public class DefaultTokenRepository: TokenRepository {
private let userDefaults = UserDefaults.standard
private let accessTokenKey = "accessToken"
private let accessToken = "accessToken"
private let refreshToken = "refreshToken"

public init() {
// Initialization if needed
}

public func saveAccessToken(_ token: String) {
userDefaults.set(token, forKey: accessTokenKey)
userDefaults.set(token, forKey: accessToken)
print("✅ Access Token saved: \(token)")
}

public func getAccessToken() -> String? {
return userDefaults.string(forKey: accessTokenKey)
return userDefaults.string(forKey: accessToken)
}

public func clearAccessToken() {
userDefaults.removeObject(forKey: accessTokenKey)
userDefaults.removeObject(forKey: accessToken)
print("🗑️ Access Token cleared")
}

public func saveRefreshToken(token: String) {
userDefaults.set(token, forKey: refreshToken)
print("✅ Refresh Token saved: \(token)")
}

public func getRefreshToken() -> String? {
return userDefaults.string(forKey: refreshToken)
}

public func clearRefreshToken() {
userDefaults.removeObject(forKey: refreshToken)
print("🗑️ Refresh Token cleared")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
import RxSwift

public protocol LoginRepository {
func postGoogleLogin() -> Single<LoginVO>
func postAppleLogin(userName: String?, identityToken: String) -> Single<LoginVO>
func postGoogleLogin() -> Single<GoogleLoginVO>
func postAppleLogin(userName: String?, identityToken: String) -> Single<GoogleLoginVO>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import RxSwift

public protocol SignRepository {
func postSignIn(email: String, password: String) -> Single<LoginVO>
func postEmail(email: String) -> Single<DefaultVO>
func postConfirm(email: String, code: String) -> Single<DefaultVO>
func postSignUp(username: String, email: String, password: String) -> Single<DefaultVO>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
import RxSwift

public protocol TokenRepository {
func saveAccessToken(_ token: String)
func saveAccessToken(token: String)
func getAccessToken() -> String?
func clearAccessToken()
func saveRefreshToken(token: String)
func getRefreshToken() -> String?
func clearRefreshToken()
}
8 changes: 4 additions & 4 deletions Projects/Domain/Sources/UseCase/Login/LoginUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import RxSwift

public protocol LoginUseCase {
func postGoogleLogin() -> Single<LoginVO>
func postAppleLogin(userName: String?, identityToken: String) -> Single<LoginVO>
func postGoogleLogin() -> Single<GoogleLoginVO>
func postAppleLogin(userName: String?, identityToken: String) -> Single<GoogleLoginVO>
}

public final class DefaultLoginUseCase: LoginUseCase {
Expand All @@ -19,11 +19,11 @@ public final class DefaultLoginUseCase: LoginUseCase {
self.repository = repository
}

public func postGoogleLogin() -> Single<LoginVO> {
public func postGoogleLogin() -> Single<GoogleLoginVO> {
return repository.postGoogleLogin()
}

public func postAppleLogin(userName: String?, identityToken: String) -> Single<LoginVO> {
public func postAppleLogin(userName: String?, identityToken: String) -> Single<GoogleLoginVO> {
return repository.postAppleLogin(userName: userName, identityToken: identityToken)
}
}
5 changes: 5 additions & 0 deletions Projects/Domain/Sources/UseCase/Login/SignUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import RxSwift

public protocol SignUseCase {
func postSignIn(email: String, password: String) -> Single<LoginVO>
func postEmail(email: String) -> Single<DefaultVO>
func postConfirm(email: String, code: String) -> Single<DefaultVO>
func postSignUp(username: String, email: String, password: String) -> Single<DefaultVO>
Expand All @@ -20,6 +21,10 @@ public final class DefaultSignUseCase: SignUseCase {
self.repository = repository
}

public func postSignIn(email: String, password: String) -> Single<LoginVO> {
return repository.postSignIn(email: email, password: password)
}

public func postEmail(email: String) -> Single<DefaultVO> {
return repository.postEmail(email: email)
}
Expand Down
19 changes: 11 additions & 8 deletions Projects/Domain/Sources/VO/LoginVO.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@
// Created by 박지윤 on 7/16/25.
//

//public struct LoginVO {
// public let list: [CourseVO]
//
// public init(list: [CourseVO]) {
// self.list = list
// }
//}

public struct LoginVO {
public let accessToken: String?
public let refreshToken: String?

public init(accessToken: String?,
refreshToken: String?) {
self.accessToken = accessToken
self.refreshToken = refreshToken
}
}

public struct GoogleLoginVO {
public let accessToken: String?

public init(accessToken: String?) {
self.accessToken = accessToken
Expand Down
12 changes: 12 additions & 0 deletions Projects/LearnMate/Sources/Coordinator/AppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ protocol AppCoordinator: Coordinator {
func showTabbarFlow()
func setTabBarCoordinator()
func getChildCoordinator(_ type: CoordinatorType) -> Coordinator?
func showHomeAfterLogin()
}

final class DefaultAppCoordinator: AppCoordinator{
Expand Down Expand Up @@ -44,6 +45,10 @@ final class DefaultAppCoordinator: AppCoordinator{
let signUpViewController = self.dependency.injector.resolve(SignUpViewController.self)
self.navigationController.pushViewController(signUpViewController, animated: true)
}
signInViewController.onLoginSuccess = { [weak self] in
guard let self else { return }
self.showHomeAfterLogin()
}
self.navigationController.pushViewController(signInViewController, animated: true)
}
self.navigationController.pushViewController(loginViewController, animated: true)
Expand All @@ -59,6 +64,13 @@ final class DefaultAppCoordinator: AppCoordinator{
tabBarCoordinator.start()
}

/// 로그인 성공 후 홈으로 이동
func showHomeAfterLogin() {
// 로그인 관련 뷰컨트롤러들을 모두 제거하고 탭바로 이동
navigationController.viewControllers.removeAll()
showTabbarFlow()
}

/// 탭바 컨트롤러 세팅, 자식 코디네이터로 등록
func setTabBarCoordinator() {
let dependency = DefaultTabBarController.Dependency.init(
Expand Down
3 changes: 2 additions & 1 deletion Projects/LearnMate/Sources/DI/LoginAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public struct LoginAssembly: Assembly {
/// Sign DI 등록
container.register(SignViewModel.self) { resolver in
let useCase = resolver.resolve(SignUseCase.self)!
return SignViewModel(signUseCase: useCase)
let tokenRepository = resolver.resolve(TokenRepository.self)!
return SignViewModel(signUseCase: useCase, tokenRepository: tokenRepository)
}

container.register(SignInViewController.self) { resolver in
Expand Down
Loading
Loading