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
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
private let messaging = Messaging.messaging()
private var user: User? { Auth.auth().currentUser }
private let providerID = AuthProviderID.gitHub
private let provider = TopViewControllerProvider()
private let logger = Logger(category: "GithubAuthService")

func signIn() async throws -> AuthenticationDataResponse {
Expand Down Expand Up @@ -143,6 +144,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
}
}

@MainActor
func requestAuthorizationCode() async throws -> String {
guard let clientID = Bundle.main.object(forInfoDictionaryKey: "GITHUB_CLIENT_ID") as? String,
let redirectURL = Bundle.main.object(forInfoDictionaryKey: "APP_REDIRECT_URL") as? String,
Expand Down Expand Up @@ -248,12 +250,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {

extension GithubAuthenticationService: ASWebAuthenticationPresentationContextProviding {
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
guard let window = UIApplication.shared.connectedScenes
.flatMap({ ($0 as? UIWindowScene)?.windows ?? [] })
.first(where: { $0.isKeyWindow }) else {
return ASPresentationAnchor()
}
return window
return provider.keyWindow() ?? ASPresentationAnchor()
}

struct GitHubUser: Codable {
Expand Down
32 changes: 0 additions & 32 deletions DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -126,35 +126,3 @@ final class GoogleAuthenticationService: AuthenticationService {
}

}

final class TopViewControllerProvider {
@MainActor
func topViewController() -> UIViewController? {
let keyWindow = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap { $0.windows }
.first { $0.isKeyWindow }

let rootController = keyWindow?.rootViewController

return topViewController(controller: rootController)
}

@MainActor
private func topViewController(controller: UIViewController?) -> UIViewController? {
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}

if let tabController = controller as? UITabBarController,
let selectedController = tabController.selectedViewController {
return topViewController(controller: selectedController)
}

if let presentedController = controller?.presentedViewController {
return topViewController(controller: presentedController)
}

return controller
}
}
46 changes: 46 additions & 0 deletions DevLog/Infra/Util/TopViewControllerProvider.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// TopViewControllerProvider.swift
// DevLog
//
// Created by 최윤진 on 2/12/26.
//

import UIKit

final class TopViewControllerProvider {
@MainActor
func topViewController() -> UIViewController? {
guard let keyWindow = keyWindow() else {
return nil
}

let rootController = keyWindow.rootViewController
return topViewController(controller: rootController)
}

@MainActor
func keyWindow() -> UIWindow? {
return UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap { $0.windows }
.first { $0.isKeyWindow }
}

@MainActor
private func topViewController(controller: UIViewController?) -> UIViewController? {
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}

if let tabController = controller as? UITabBarController,
let selectedController = tabController.selectedViewController {
return topViewController(controller: selectedController)
}

if let presentedController = controller?.presentedViewController {
return topViewController(controller: presentedController)
}

return controller
}
}