diff --git a/kDrive/UI/Controller/LoginDelegateHandler.swift b/kDrive/UI/Controller/LoginDelegateHandler.swift index 99e39567d..9c82b8c55 100644 --- a/kDrive/UI/Controller/LoginDelegateHandler.swift +++ b/kDrive/UI/Controller/LoginDelegateHandler.swift @@ -26,6 +26,7 @@ import kDriveResources public final class LoginDelegateHandler: InfomaniakLoginDelegate { @LazyInjectService var accountManager: AccountManageable @LazyInjectService var router: AppNavigable + @LazyInjectService var deeplinkService: DeeplinkServiceable var didStartLoginCallback: (() -> Void)? var didCompleteLoginCallback: (() -> Void)? @@ -57,6 +58,8 @@ public final class LoginDelegateHandler: InfomaniakLoginDelegate { } didCompleteLoginCallback?() + + deeplinkService.processDeeplinksPostAuthentication() } } diff --git a/kDriveCore/Utils/Deeplinks/DeeplinkService.swift b/kDriveCore/Utils/Deeplinks/DeeplinkService.swift index 2554d7b37..c7df36f63 100644 --- a/kDriveCore/Utils/Deeplinks/DeeplinkService.swift +++ b/kDriveCore/Utils/Deeplinks/DeeplinkService.swift @@ -17,40 +17,10 @@ */ import Foundation -import SwiftRegex - -public struct PublicShareLink { - public static let parsingRegex = Regex(pattern: #"^/app/share/([0-9]+)/([a-z0-9-]+)$"#) - - public let publicShareURL: URL - public let shareLinkUid: String - public let driveId: Int - - public init?(publicShareURL: URL) async { - guard let components = URLComponents(url: publicShareURL, resolvingAgainstBaseURL: true) else { - return nil - } - - let path = components.path - guard let matches = Self.parsingRegex?.matches(in: path) else { - return nil - } - - guard let firstMatch = matches.first, - let driveId = firstMatch[safe: 1], - let driveIdInt = Int(driveId), - let shareLinkUid = firstMatch[safe: 2] else { - return nil - } - - self.driveId = driveIdInt - self.shareLinkUid = shareLinkUid - self.publicShareURL = publicShareURL - } -} public protocol DeeplinkServiceable: AnyObject { func setLastPublicShare(_ link: PublicShareLink) + func processDeeplinksPostAuthentication() } public class DeeplinkService: DeeplinkServiceable { @@ -58,4 +28,15 @@ public class DeeplinkService: DeeplinkServiceable { public func setLastPublicShare(_ link: PublicShareLink) { lastPublicShareLink = link } + + public func processDeeplinksPostAuthentication() { + guard let lastPublicShareLink else { + return + } + + Task { + await UniversalLinksHelper.processPublicShareLink(lastPublicShareLink) + self.lastPublicShareLink = nil + } + } } diff --git a/kDriveCore/Utils/Deeplinks/PublicShareLink.swift b/kDriveCore/Utils/Deeplinks/PublicShareLink.swift index deba71ed1..556c48237 100644 --- a/kDriveCore/Utils/Deeplinks/PublicShareLink.swift +++ b/kDriveCore/Utils/Deeplinks/PublicShareLink.swift @@ -1,4 +1,3 @@ -// /* Infomaniak kDrive - iOS App Copyright (C) 2024 Infomaniak Network SA @@ -18,3 +17,34 @@ */ import Foundation +import SwiftRegex + +public struct PublicShareLink: Sendable { + public static let parsingRegex = Regex(pattern: #"^/app/share/([0-9]+)/([a-z0-9-]+)$"#) + + public let publicShareURL: URL + public let shareLinkUid: String + public let driveId: Int + + public init?(publicShareURL: URL) async { + guard let components = URLComponents(url: publicShareURL, resolvingAgainstBaseURL: true) else { + return nil + } + + let path = components.path + guard let matches = Self.parsingRegex?.matches(in: path) else { + return nil + } + + guard let firstMatch = matches.first, + let driveId = firstMatch[safe: 1], + let driveIdInt = Int(driveId), + let shareLinkUid = firstMatch[safe: 2] else { + return nil + } + + self.driveId = driveIdInt + self.shareLinkUid = shareLinkUid + self.publicShareURL = publicShareURL + } +} diff --git a/kDriveCore/Utils/UniversalLinksHelper.swift b/kDriveCore/Utils/Deeplinks/UniversalLinksHelper.swift similarity index 98% rename from kDriveCore/Utils/UniversalLinksHelper.swift rename to kDriveCore/Utils/Deeplinks/UniversalLinksHelper.swift index 4461c6d72..82e72631e 100644 --- a/kDriveCore/Utils/UniversalLinksHelper.swift +++ b/kDriveCore/Utils/Deeplinks/UniversalLinksHelper.swift @@ -20,13 +20,11 @@ import CocoaLumberjackSwift import Foundation import InfomaniakCore import InfomaniakDI -import kDriveCore import kDriveResources import SwiftRegex import UIKit -#if !ISEXTENSION -enum UniversalLinksHelper { +public enum UniversalLinksHelper { private struct Link { let regex: Regex let displayMode: DisplayMode @@ -57,7 +55,7 @@ enum UniversalLinksHelper { } @discardableResult - static func handleURL(_ url: URL) async -> Bool { + public static func handleURL(_ url: URL) async -> Bool { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { DDLogError("[UniversalLinksHelper] Failed to process url:\(url)") return false @@ -217,4 +215,3 @@ enum UniversalLinksHelper { } } } -#endif