From de04eb22b16469cdbf4a5f2c265b0ce7ca992370 Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Sun, 15 Oct 2023 16:53:07 +0300 Subject: [PATCH 1/7] Move organizationName to CrowdinnProviderConfig. Update Languages API to support organization name. Rebuild some dependencies affected by moving organizationName to CrowdinnProviderConfig. --- .../CrowdinSDK/CrowdinAPI/CrowdinAPI.swift | 2 +- .../DistributionsAPI/DistributionsAPI.swift | 2 +- .../CrowdinAPI/LoginAPI/LoginAPI.swift | 2 +- .../CrowdinSDK/CrowdinSDKConfig.swift | 7 +------ .../LoginFeature/CrowdinLoginConfig.swift | 12 +++++------ .../Extensions/CrowdinSDK+Login.swift | 2 +- .../Extensions/CrowdinSDKConfig+Login.swift | 1 - .../Features/LoginFeature/LoginFeature.swift | 10 +++++----- .../CrowdinSDK+ReatimeUpdates.swift | 2 +- .../FilesDownloader/RUFilesDownloader.swift | 17 ++++++++-------- .../RURemoteLocalizationStorage.swift | 4 ++-- .../RealtimeUpdateFeature.swift | 6 +++--- .../Extensions/CrowdinSDK+Screenshots.swift | 2 +- .../ScreenshotUploader.swift | 6 +++--- .../Config/CrowdinProviderConfig.swift | 4 +++- .../CrowdinRemoteLocalizationStorage.swift | 19 +++++++++++------- .../Extensions/CrowdinSDK+ReactNative.swift | 2 +- .../CrowdinLocalizationDownloader.swift | 20 +++++++++---------- .../ManifestManager+LanguageResolver.swift | 2 +- .../ManifestManager/ManifestManager.swift | 13 +++++++----- .../CrowdinMappingDownloader.swift | 14 ++++++------- .../CrowdinMappingManager.swift | 6 +++--- .../CrowdinSupportedLanguages.swift | 15 +++++++++----- 23 files changed, 88 insertions(+), 82 deletions(-) diff --git a/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift index 1fd64ae4..7062f2c6 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift @@ -40,7 +40,7 @@ class CrowdinAPI: BaseAPI { baseURL + apiPath } - init(organizationName: String? = nil, auth: CrowdinAuth? = nil, session: URLSession = .shared) { + init(organizationName: String?, auth: CrowdinAuth? = nil, session: URLSession = .shared) { self.organizationName = organizationName self.auth = auth super.init(session: session) diff --git a/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift index d5375922..fe8b6258 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift @@ -10,7 +10,7 @@ import Foundation class DistributionsAPI: CrowdinAPI { let hashString: String - init(hashString: String, organizationName: String? = nil, auth: CrowdinAuth? = nil, session: URLSession = .shared) { + init(hashString: String, organizationName: String?, auth: CrowdinAuth? = nil, session: URLSession = .shared) { self.hashString = hashString super.init(organizationName: organizationName, auth: auth, session: session) } diff --git a/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift index 72a83a9f..a785753c 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift @@ -16,7 +16,7 @@ class LoginAPI: BaseAPI { var scope: String var redirectURI: String - init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String? = nil, session: URLSession = URLSession.shared) { + init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String?, session: URLSession = URLSession.shared) { self.clientId = clientId self.clientSecret = clientSecret self.scope = scope diff --git a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift index 68357921..62c049d8 100644 --- a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift +++ b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift @@ -16,10 +16,5 @@ import Foundation return CrowdinSDKConfig() } - var enterprise: Bool = false - - func with(enterprise: Bool) -> Self { - self.enterprise = enterprise - return self - } + var enterprise: Bool { crowdinProviderConfig?.organizationName != nil } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift index bbfc639e..41313766 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift @@ -14,27 +14,26 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat var clientSecret: String var scope: String var redirectURI: String - var organizationName: String? = nil public convenience init(clientId: String, clientSecret: String, scope: String) throws { guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: nil) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: nil) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, organizationName: String) throws { guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: organizationName) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: organizationName) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } - private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String? = nil) throws { + private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { guard !clientId.isEmpty else { throw NSError(domain: "clientId could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } self.clientId = clientId guard !clientSecret.isEmpty else { throw NSError(domain: "clientSecret could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } @@ -44,6 +43,5 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat guard !redirectURI.isEmpty else { throw NSError(domain: "redirectURI could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } guard let urlSchemes = Bundle.main.urlSchemes, urlSchemes.contains(redirectURI) else { throw NSError(domain: "Application supported url schemes should contain \(redirectURI)", code: defaultCrowdinErrorCode, userInfo: nil) } self.redirectURI = redirectURI - self.organizationName = organizationName } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift index 1a88c80d..d6aa19ed 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift @@ -13,7 +13,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } guard let loginConfig = config.loginConfig else { return } guard let hash = config.crowdinProviderConfig?.hashString else { return } - LoginFeature.configureWith(with: hash, loginConfig: loginConfig) + LoginFeature.configureWith(with: hash, organizationName: config.crowdinProviderConfig?.organizationName, loginConfig: loginConfig) } public class func login() { diff --git a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift index eb6f9cb5..f75636fd 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift @@ -21,7 +21,6 @@ extension CrowdinSDKConfig { public func with(loginConfig: CrowdinLoginConfig) -> Self { self.loginConfig = loginConfig - self.enterprise = loginConfig.organizationName != nil return self } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift b/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift index 29f6a894..a0c43e1f 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift @@ -16,7 +16,7 @@ import Foundation protocol LoginFeatureProtocol { static var shared: Self? { get } static var isLogined: Bool { get } - static func configureWith(with hash: String, loginConfig: CrowdinLoginConfig) + static func configureWith(with hash: String, organizationName: String?, loginConfig: CrowdinLoginConfig) func login(completion: @escaping () -> Void, error: @escaping (Error) -> Void) func relogin(completion: @escaping () -> Void, error: @escaping (Error) -> Void) @@ -34,9 +34,9 @@ final class LoginFeature: NSObject, LoginFeatureProtocol, CrowdinAuth { fileprivate var safariVC: SFSafariViewController? #endif - init(hashString: String, config: CrowdinLoginConfig) { + init(hashString: String, organizationName: String?, config: CrowdinLoginConfig) { self.config = config - self.loginAPI = LoginAPI(clientId: config.clientId, clientSecret: config.clientSecret, scope: config.scope, redirectURI: config.redirectURI, organizationName: config.organizationName) + self.loginAPI = LoginAPI(clientId: config.clientId, clientSecret: config.clientSecret, scope: config.scope, redirectURI: config.redirectURI, organizationName: organizationName) super.init() if self.hashString != hashString { self.logout() @@ -45,8 +45,8 @@ final class LoginFeature: NSObject, LoginFeatureProtocol, CrowdinAuth { NotificationCenter.default.addObserver(self, selector: #selector(receiveUnautorizedResponse), name: .CrowdinAPIUnautorizedNotification, object: nil) } - static func configureWith(with hashString: String, loginConfig: CrowdinLoginConfig) { - LoginFeature.shared = LoginFeature(hashString: hashString, config: loginConfig) + static func configureWith(with hashString: String, organizationName: String?, loginConfig: CrowdinLoginConfig) { + LoginFeature.shared = LoginFeature(hashString: hashString, organizationName: organizationName, config: loginConfig) } var hashString: String { diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift index f504dd4c..00024709 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift @@ -12,7 +12,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } let crowdinProviderConfig = config.crowdinProviderConfig ?? CrowdinProviderConfig() if config.realtimeUpdatesEnabled { - RealtimeUpdateFeature.shared = RealtimeUpdateFeature(hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage, organizationName: config.loginConfig?.organizationName) + RealtimeUpdateFeature.shared = RealtimeUpdateFeature(hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage, organizationName: config.crowdinProviderConfig?.organizationName) swizzleControlMethods() } } diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift index da653653..4b437211 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift @@ -21,11 +21,11 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { let projectsAPI: ProjectsAPI let projectId: String let enterprise: Bool - let languageResolver: LanguageResolver + let manifestManager: ManifestManager - init(projectId: String, laguageResolver: LanguageResolver, organizationName: String? = nil) { + init(projectId: String, manifestManager: ManifestManager, organizationName: String?) { self.projectId = projectId - self.languageResolver = laguageResolver + self.manifestManager = manifestManager self.enterprise = organizationName != nil self.projectsAPI = ProjectsAPI(organizationName: organizationName, auth: LoginFeature.shared) self.operationQueue.maxConcurrentOperationCount = 1 @@ -51,7 +51,7 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } fileIDs.forEach { (fileId) in - let targetLanguageId = languageResolver.crowdinLanguageCode(for: localization) ?? localization + let targetLanguageId = manifestManager.crowdinLanguageCode(for: localization) ?? localization let download = FileDataDownloadOperation(fileId: fileId, projectId: projectId, targetLanguageId: targetLanguageId, projectsAPI: projectsAPI) { [weak self] (data, error) in guard let self = self else { return @@ -107,10 +107,9 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) manifestManager.download { [weak self] in guard let self = self else { return } - guard let files = manifestManager.files else { completion(nil, nil); return; } + guard let files = self.manifestManager.files else { completion(nil, nil); return; } let fileNames = files.compactMap({ $0.split(separator: "/").last }).map({ String($0) }) self.getAllProjectFiles { (projectFiles, error) in guard let projectFiles = projectFiles else { completion(nil, error); return; } @@ -126,9 +125,9 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } func getLangiages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.languages, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift index 1464b18f..1404d4d5 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift @@ -23,8 +23,8 @@ class RURemoteLocalizationStorage: RemoteLocalizationStorageProtocol { init(localization: String, hash: String, projectId: String, organizationName: String?) { self.localization = localization self.hash = hash - manifestManager = ManifestManager.manifest(for: hash) - self.fileDownloader = RUFilesDownloader(projectId: projectId, laguageResolver: manifestManager, organizationName: organizationName) + manifestManager = ManifestManager.manifest(for: hash, organizationName: organizationName) + self.fileDownloader = RUFilesDownloader(projectId: projectId, manifestManager: manifestManager, organizationName: organizationName) } func prepare(with completion: @escaping (() -> Void)) { diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift index 310eb5f0..a3effba3 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift @@ -58,10 +58,10 @@ class RealtimeUpdateFeature: RealtimeUpdateFeatureProtocol { private var socketManger: CrowdinSocketManagerProtocol? private var mappingManager: CrowdinMappingManagerProtocol - required init(hash: String, sourceLanguage: String, organizationName: String? = nil) { + required init(hash: String, sourceLanguage: String, organizationName: String?) { self.hashString = hash self.organizationName = organizationName - self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage) + self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage, organizationName: organizationName) } func downloadDistribution(with successHandler: (() -> Void)? = nil, errorHandler: ((Error) -> Void)? = nil) { @@ -163,7 +163,7 @@ class RealtimeUpdateFeature: RealtimeUpdateFeatureProtocol { func setupSocketManager(with projectId: String, projectWsHash: String, userId: String, wsUrl: String) { // Download manifest if it is not initialized. - let manifestManager = ManifestManager.manifest(for: hashString) + let manifestManager = ManifestManager.manifest(for: hashString, organizationName: organizationName) guard manifestManager.downloaded else { manifestManager.download { [weak self] in guard let self = self else { return } diff --git a/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift b/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift index 01b2c124..9393cfce 100644 --- a/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift +++ b/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift @@ -14,7 +14,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } if config.screenshotsEnabled { let crowdinProviderConfig = config.crowdinProviderConfig ?? CrowdinProviderConfig() - let screenshotUploader = CrowdinScreenshotUploader(organizationName: config.loginConfig?.organizationName, hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage) + let screenshotUploader = CrowdinScreenshotUploader(organizationName: config.crowdinProviderConfig?.organizationName, hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage) ScreenshotFeature.shared = ScreenshotFeature(screenshotUploader: screenshotUploader, screenshotProcessor: CrowdinScreenshotProcessor()) swizzleControlMethods() } diff --git a/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift b/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift index 70a69976..61479ac7 100644 --- a/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift +++ b/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift @@ -15,7 +15,7 @@ public protocol ScreenshotUploader { } class CrowdinScreenshotUploader: ScreenshotUploader { - var organizationName: String? = nil + var organizationName: String? var hash: String var sourceLanguage: String @@ -29,11 +29,11 @@ class CrowdinScreenshotUploader: ScreenshotUploader { case noLocalizedStringsDetected = "There are no localized strings detected on current screen." } - init(organizationName: String? = nil, hash: String, sourceLanguage: String) { + init(organizationName: String?, hash: String, sourceLanguage: String) { self.organizationName = organizationName self.hash = hash self.sourceLanguage = sourceLanguage - self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage) + self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage, organizationName: organizationName) } func loginAndGetProjectId(success: (() -> Void)? = nil, errorHandler: ((Error) -> Void)? = nil) { diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift b/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift index ce7da72b..d7365894 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift @@ -10,10 +10,12 @@ import Foundation @objcMembers public class CrowdinProviderConfig: NSObject { var hashString: String var sourceLanguage: String + var organizationName: String? - public init(hashString: String, sourceLanguage: String) { + public init(hashString: String, sourceLanguage: String, organizationName: String? = nil) { self.hashString = hashString self.sourceLanguage = sourceLanguage + self.organizationName = organizationName } @available(*, deprecated, renamed: "init(hashString:sourceLanguage:)") diff --git a/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift b/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift index e84827bc..efcb54a7 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift @@ -9,6 +9,7 @@ import Foundation class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { var localization: String + var organizationName: String? var localizations: [String] var hashString: String var name: String = "Crowdin" @@ -16,13 +17,16 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { private var crowdinDownloader: CrowdinLocalizationDownloader private var _localizations: [String]? + private let crowdinSupportedLanguages: CrowdinSupportedLanguages init(localization: String, config: CrowdinProviderConfig) { self.localization = localization self.hashString = config.hashString - self.manifestManager = ManifestManager.manifest(for: config.hashString) - self.crowdinDownloader = CrowdinLocalizationDownloader(languageResolver: manifestManager) + self.organizationName = config.organizationName + self.manifestManager = ManifestManager.manifest(for: config.hashString, organizationName: config.organizationName) + self.crowdinDownloader = CrowdinLocalizationDownloader(manifestManager: manifestManager) self.localizations = self.manifestManager.iOSLanguages + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: config.organizationName) } func prepare(with completion: @escaping () -> Void) { @@ -33,8 +37,8 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { } func downloadCrowdinSupportedLanguages(completion: @escaping () -> Void) { - if !CrowdinSupportedLanguages.shared.loaded { - CrowdinSupportedLanguages.shared.downloadSupportedLanguages(completion: { + if !crowdinSupportedLanguages.loaded { + crowdinSupportedLanguages.downloadSupportedLanguages(completion: { completion() }, error: { LocalizationUpdateObserver.shared.notifyError(with: [$0]) @@ -54,15 +58,16 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { }) } - required init(localization: String, enterprise: Bool) { + required init(localization: String, enterprise: Bool, organizationName: String?) { self.localization = localization guard let hashString = Bundle.main.crowdinDistributionHash else { fatalError("Please add CrowdinDistributionHash key to your Info.plist file") } self.hashString = hashString - self.manifestManager = ManifestManager.manifest(for: hashString) - self.crowdinDownloader = CrowdinLocalizationDownloader(languageResolver: self.manifestManager) + self.manifestManager = ManifestManager.manifest(for: hashString, organizationName: organizationName) + self.crowdinDownloader = CrowdinLocalizationDownloader(manifestManager: self.manifestManager) self.localizations = [] + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: organizationName) } func fetchData(completion: @escaping LocalizationStorageCompletion, errorHandler: LocalizationStorageError?) { diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift index aa15c759..33dd6db6 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift @@ -74,7 +74,7 @@ extension CrowdinSDK { /// - errorHandler: Error handler. public class func localizationDictionary(for localization: String, hashString: String, completion: @escaping ([AnyHashable: Any]) -> Void, errorHandler: @escaping (Error) -> Void) { let localLocalizationStorage = LocalLocalizationStorage(localization: localization) - let remoteLocalizationStorage = CrowdinRemoteLocalizationStorage(localization: localization, config: CrowdinProviderConfig(hashString: hashString, sourceLanguage: .empty)) + let remoteLocalizationStorage = CrowdinRemoteLocalizationStorage(localization: localization, config: CrowdinProviderConfig(hashString: hashString, sourceLanguage: .empty, organizationName: nil)) remoteLocalizationStorage.prepare { localizationProvider = LocalizationProvider(localization: localization, localStorage: localLocalizationStorage, remoteStorage: remoteLocalizationStorage) localizationProvider?.refreshLocalization(completion: { error in diff --git a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift index 280da829..fa57871d 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift @@ -16,10 +16,10 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { fileprivate var plurals: [AnyHashable: Any]? = nil fileprivate var errors: [Error]? = nil fileprivate var contentDeliveryAPI: CrowdinContentDeliveryAPI! - fileprivate let languageResolver: LanguageResolver + fileprivate let manifestManager: ManifestManager - init(languageResolver: LanguageResolver) { - self.languageResolver = languageResolver + init(manifestManager: ManifestManager) { + self.manifestManager = manifestManager } func download(with hash: String, for localization: String, completion: @escaping CrowdinDownloaderCompletion) { @@ -47,7 +47,7 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { self.plurals = nil self.errors = nil - let pathParser = CrowdinPathsParser(languageResolver: languageResolver) + let pathParser = CrowdinPathsParser(languageResolver: manifestManager) let completionBlock = BlockOperation { [weak self] in guard let self = self else { return } @@ -107,16 +107,16 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.files, manifestManager.timestamp, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.files, self.manifestManager.timestamp, nil) } } func getLanguages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.languages, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift index 1786ab1b..95599636 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift @@ -9,7 +9,7 @@ import Foundation extension ManifestManager: LanguageResolver { var allLanguages: [CrowdinLanguage] { - let crowdinLanguages: [CrowdinLanguage] = CrowdinSupportedLanguages.shared.supportedLanguages?.data.map({ $0.data }) ?? [] + let crowdinLanguages: [CrowdinLanguage] = crowdinSupportedLanguages.supportedLanguages?.data.map({ $0.data }) ?? [] let customLaguages: [CrowdinLanguage] = customLanguages ?? [] let allLanguages: [CrowdinLanguage] = crowdinLanguages + customLaguages return allLanguages diff --git a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift index d6d45017..7215078c 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift @@ -51,25 +51,29 @@ class ManifestManager { } let hash: String + let organizationName: String? var files: [String]? var timestamp: TimeInterval? var languages: [String]? var customLanguages: [CustomLangugage]? var manifestURL: String? var contentDeliveryAPI: CrowdinContentDeliveryAPI + var crowdinSupportedLanguages: CrowdinSupportedLanguages - fileprivate init(hash: String) { + fileprivate init(hash: String, organizationName: String?) { self.hash = hash + self.organizationName = organizationName self.contentDeliveryAPI = CrowdinContentDeliveryAPI(hash: hash) + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: organizationName) self.load() ManifestManager.manifestMap[self.hash] = self } - class func manifest(for hash: String) -> ManifestManager { + class func manifest(for hash: String, organizationName: String?) -> ManifestManager { if let manifest = manifestMap[hash] { return manifest } - let manifest = ManifestManager(hash: hash) + let manifest = ManifestManager(hash: hash, organizationName: organizationName) return manifest } @@ -126,7 +130,7 @@ class ManifestManager { } /// Path for current hash manifests file - private var manifestPath: String { ManifestManager.manifestsPath + hash + ".json" } + private var manifestPath: String { ManifestManager.manifestsPath + hash + (organizationName ?? "") + ".json" } /// Root path for manifests files static private let manifestsPath = CrowdinFolder.shared.path + "/Manifests/" @@ -157,6 +161,5 @@ class ManifestManager { func clear() { ManifestManager.manifestMap.removeValue(forKey: hash) try? FileManager.default.removeItem(atPath: manifestPath) - } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift index f538dea6..c6060af3 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift @@ -16,10 +16,10 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { fileprivate var errors: [Error]? = nil //swiftlint:disable implicitly_unwrapped_optional fileprivate var contentDeliveryAPI: CrowdinContentDeliveryAPI! - fileprivate let languageResolver: LanguageResolver + fileprivate let manifestManager: ManifestManager - init(languageResolver: LanguageResolver) { - self.languageResolver = languageResolver + init(manifestManager: ManifestManager) { + self.manifestManager = manifestManager } func download(with hash: String, for localization: String, completion: @escaping CrowdinDownloaderCompletion) { @@ -45,7 +45,7 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { self.plurals = nil self.errors = nil - let pathParser = CrowdinPathsParser(languageResolver: languageResolver) + let pathParser = CrowdinPathsParser(languageResolver: manifestManager) let completionBlock = BlockOperation { self.completion?(self.strings, self.plurals, self.errors) @@ -91,9 +91,9 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, String?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.files, manifestManager.timestamp, manifestManager.manifestURL, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.files, self.manifestManager.timestamp, self.manifestManager.manifestURL, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift index e8ba5338..5d24b2e9 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift @@ -25,9 +25,9 @@ public class CrowdinMappingManager: CrowdinMappingManagerProtocol { var stringsMapping: [String: String] = [:] var plurals: [AnyHashable: Any] = [:] - init(hash: String, sourceLanguage: String) { - self.manifestManager = ManifestManager.manifest(for: hash) - self.downloader = CrowdinMappingDownloader(languageResolver: self.manifestManager) + init(hash: String, sourceLanguage: String, organizationName: String?) { + self.manifestManager = ManifestManager.manifest(for: hash, organizationName: organizationName) + self.downloader = CrowdinMappingDownloader(manifestManager: self.manifestManager) self.download(hash: hash, sourceLanguage: sourceLanguage) } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift b/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift index f527ffb8..c79c07ba 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift @@ -10,19 +10,19 @@ import Foundation extension LanguagesResponseData: CrowdinLanguage { } class CrowdinSupportedLanguages { - static let shared = CrowdinSupportedLanguages() - let api = LanguagesAPI() - fileprivate enum Strings: String { case SupportedLanguages case Crowdin } + fileprivate enum Keys: String { case lastUpdatedDate = "CrowdinSupportedLanguages.lastUpdatedDate" } + fileprivate var filePath: String { - return CrowdinFolder.shared.path + String.pathDelimiter + Strings.Crowdin.rawValue + String.pathDelimiter + Strings.SupportedLanguages.rawValue + FileType.json.extension + return CrowdinFolder.shared.path + String.pathDelimiter + Strings.Crowdin.rawValue + String.pathDelimiter + Strings.SupportedLanguages.rawValue + (organizationName ?? "") + FileType.json.extension } + fileprivate var lastUpdatedDate: Date? { set { UserDefaults.standard.set(newValue, forKey: Keys.lastUpdatedDate.rawValue) @@ -32,6 +32,9 @@ class CrowdinSupportedLanguages { return UserDefaults.standard.value(forKey: Keys.lastUpdatedDate.rawValue) as? Date } } + + let organizationName: String? + let api: LanguagesAPI var loaded: Bool { return supportedLanguages != nil } var loading = false @@ -44,7 +47,9 @@ class CrowdinSupportedLanguages { } } - init() { + init(organizationName: String?) { + self.organizationName = organizationName + api = LanguagesAPI(organizationName: organizationName) readSupportedLanguages() updateSupportedLanguagesIfNeeded() } From a10559db460697bda899c22bf5b2b22b48f7c33e Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Sun, 15 Oct 2023 17:21:17 +0300 Subject: [PATCH 2/7] Fix tests. Add organizationName to all initialisers where needed. --- .../LoginFeature/CrowdinLoginConfig.swift | 9 --------- .../CrowdinSDKConfig+CrowdinProvider.swift | 8 ++++++-- Sources/Tests/Core/CrowdinSDKConfigTests.swift | 8 ++++++-- Sources/Tests/CrowdinAPI/CrowdinAPITests.swift | 2 +- .../CrowdinAPI/CrowdinLoginAPITests.swift | 3 ++- .../CrowdinAPI/DistributionsAPITests.swift | 2 +- .../Tests/CrowdinAPI/LanguagesAPITests.swift | 2 +- .../Tests/CrowdinAPI/ProjectsAPITests.swift | 2 +- .../CrowdinProvider/ManifestManagerTests.swift | 2 +- Tests/Tests.xcodeproj/project.pbxproj | 18 +++++++++--------- Tests/UnitTests/AddErrorHandlersTests.swift | 1 - .../InitializationCompletionHandlerTests.swift | 1 - .../Login/CrowdinLoginConfigTests.swift | 16 +++++++--------- .../Login/CrowdinSDKConfigLoginTests.swift | 6 ++---- 14 files changed, 37 insertions(+), 43 deletions(-) diff --git a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift index 41313766..b67a01b1 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift @@ -24,15 +24,6 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } - public convenience init(clientId: String, clientSecret: String, scope: String, organizationName: String) throws { - guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) - } - - public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) - } - private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { guard !clientId.isEmpty else { throw NSError(domain: "clientId could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } self.clientId = clientId diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift index 7c34215a..72efda69 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift @@ -13,10 +13,10 @@ extension CrowdinSDKConfig { // Realtime updates var crowdinProviderConfig: CrowdinProviderConfig? { get { - return CrowdinSDKConfig.crowdinProviderConfig + return Self.crowdinProviderConfig } set { - CrowdinSDKConfig.crowdinProviderConfig = newValue + Self.crowdinProviderConfig = newValue } } @@ -28,4 +28,8 @@ extension CrowdinSDKConfig { self.crowdinProviderConfig = crowdinProviderConfig return self } + + static func resetStoredConfig() { + Self.crowdinProviderConfig = nil + } } diff --git a/Sources/Tests/Core/CrowdinSDKConfigTests.swift b/Sources/Tests/Core/CrowdinSDKConfigTests.swift index 5dfb084e..6f4fc41a 100644 --- a/Sources/Tests/Core/CrowdinSDKConfigTests.swift +++ b/Sources/Tests/Core/CrowdinSDKConfigTests.swift @@ -2,6 +2,10 @@ import XCTest @testable import CrowdinSDK class CrowdinSDKConfigTests: XCTestCase { + static override func setUp() { + CrowdinSDKConfig.resetStoredConfig() + } + func testConfigInitialization() { let config = CrowdinSDKConfig.config() XCTAssertNil(config.crowdinProviderConfig) @@ -13,12 +17,12 @@ class CrowdinSDKConfigTests: XCTestCase { } func testConfigFalseEnterprise() { - let config = CrowdinSDKConfig.config().with(enterprise: false) + let config = CrowdinSDKConfig.config().with(crowdinProviderConfig: CrowdinProviderConfig(hashString: "hashString", sourceLanguage: "sourceLanguage")) XCTAssert(config.enterprise == false, "Showuldn't be true as default value is false") } func testConfigTrueEnterprise() { - let config = CrowdinSDKConfig.config().with(enterprise: true) + let config = CrowdinSDKConfig.config().with(crowdinProviderConfig: CrowdinProviderConfig(hashString: "hashString", sourceLanguage: "sourceLanguage", organizationName: "organizationName")) XCTAssert(config.enterprise, "Showuld be true as per set-up") } } diff --git a/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift b/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift index 6b2e63ad..76bb382d 100644 --- a/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift +++ b/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift @@ -6,7 +6,7 @@ class CrowdinAPITests: XCTestCase { var api: CrowdinAPI! func testAPIInitialization() { - api = CrowdinAPI() + api = CrowdinAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "") diff --git a/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift b/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift index 226b90cc..0f839688 100644 --- a/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift +++ b/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift @@ -23,13 +23,14 @@ class CrowdinLoginAPITests: XCTestCase { } func testLoginAPIInitialization() { - loginAPI = LoginAPI(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "redirectURI") + loginAPI = LoginAPI(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "redirectURI", organizationName: nil) XCTAssertNotNil(loginAPI) XCTAssert(loginAPI.clientId == "clientId") XCTAssert(loginAPI.clientSecret == "clientSecret") XCTAssert(loginAPI.scope == "scope") XCTAssert(loginAPI.redirectURI == "redirectURI") + XCTAssert(loginAPI.organizationName == nil) XCTAssertNil(loginAPI.organizationName) } diff --git a/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift b/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift index ffb6822e..86b28c35 100644 --- a/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift +++ b/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift @@ -17,7 +17,7 @@ class DistributionsAPITests: XCTestCase { let defaultTimeoutForExpectation = 2.0 func testAPIInitialization() { - api = DistributionsAPI(hashString: testHashString) + api = DistributionsAPI(hashString: testHashString, organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "distributions/metadata?hash=\(testHashString)") diff --git a/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift b/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift index bc482ea2..af1b0600 100644 --- a/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift +++ b/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift @@ -17,7 +17,7 @@ class LanguagesAPITests: XCTestCase { var testOrganization = "test_organization" func testAPIInitialization() { - api = LanguagesAPI() + api = LanguagesAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "languages") diff --git a/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift b/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift index 2d10f5d7..711a8c1d 100644 --- a/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift +++ b/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift @@ -19,7 +19,7 @@ class ProjectsAPITests: XCTestCase { let defaultTimeoutForExpectation = 2.0 func testAPIInitialization() { - api = ProjectsAPI() + api = ProjectsAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "projects") diff --git a/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift b/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift index 1fe03362..df2b0de7 100644 --- a/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift +++ b/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift @@ -18,7 +18,7 @@ class ManifestManagerTests: XCTestCase { func testDownloadManifest() { let expectation = XCTestExpectation(description: "Manifest download expectation") - let manifest = ManifestManager.manifest(for: crowdinTestHash) + let manifest = ManifestManager.manifest(for: crowdinTestHash, organizationName: nil) XCTAssertFalse(manifest.loaded) XCTAssertFalse(manifest.downloaded) diff --git a/Tests/Tests.xcodeproj/project.pbxproj b/Tests/Tests.xcodeproj/project.pbxproj index 5083dc81..6e18d059 100644 --- a/Tests/Tests.xcodeproj/project.pbxproj +++ b/Tests/Tests.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -590,7 +590,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -645,7 +645,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -664,7 +664,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -685,7 +685,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -707,7 +707,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -731,7 +731,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -754,7 +754,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = UITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -777,7 +777,7 @@ DEVELOPMENT_TEAM = 22AFPHX3AU; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = UITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Tests/UnitTests/AddErrorHandlersTests.swift b/Tests/UnitTests/AddErrorHandlersTests.swift index d7f77718..86a9b94e 100644 --- a/Tests/UnitTests/AddErrorHandlersTests.swift +++ b/Tests/UnitTests/AddErrorHandlersTests.swift @@ -21,7 +21,6 @@ class AddErrorHandlersTests: XCTestCase { let crowdinProviderConfig = CrowdinProviderConfig(hashString: "wrong_hash", sourceLanguage: "en") let crowdinSDKConfig = CrowdinSDKConfig.config().with(crowdinProviderConfig: crowdinProviderConfig) - .with(enterprise: true) CrowdinSDK.currentLocalization = nil let expectation = XCTestExpectation(description: "Error handler is called") diff --git a/Tests/UnitTests/InitializationCompletionHandlerTests.swift b/Tests/UnitTests/InitializationCompletionHandlerTests.swift index 5efc8949..6882cd00 100644 --- a/Tests/UnitTests/InitializationCompletionHandlerTests.swift +++ b/Tests/UnitTests/InitializationCompletionHandlerTests.swift @@ -22,7 +22,6 @@ class InitializationCompletionHandlerTests: XCTestCase { let crowdinProviderConfig = CrowdinProviderConfig(hashString: "wrong_hash", sourceLanguage: "en") let crowdinSDKConfig = CrowdinSDKConfig.config().with(crowdinProviderConfig: crowdinProviderConfig) - .with(enterprise: true) CrowdinSDK.startWithConfig(crowdinSDKConfig, completion: { XCTAssert(true, "Initialization completion handler called") expectation.fulfill() diff --git a/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift b/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift index 328fc534..c200429c 100644 --- a/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift +++ b/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift @@ -30,58 +30,56 @@ class CrowdinLoginConfigTests: XCTestCase { } func testLoginConfigOrganization() { - loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") XCTAssertNotNil(loginConfig) XCTAssert(loginConfig.clientId == "clientId") XCTAssert(loginConfig.clientSecret == "clientSecret") XCTAssert(loginConfig.scope == "scope") XCTAssert(loginConfig.redirectURI == "crowdintest://") - XCTAssert(loginConfig.organizationName == "organizationName") } func testLoginConfigOrganizationInitWithoutRedirectURI() { - loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", organizationName: "organizationName") + loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope") XCTAssertNotNil(loginConfig) XCTAssert(loginConfig.clientId == "clientId") XCTAssert(loginConfig.clientSecret == "clientSecret") XCTAssert(loginConfig.scope == "scope") XCTAssert(loginConfig.redirectURI == "crowdintest://") - XCTAssert(loginConfig.organizationName == "organizationName") } func testLoginConfigInitWithEmptyClientId() { do { - loginConfig = try CrowdinLoginConfig(clientId: "", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyClientSecret() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "", scope: "scope", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyScope() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyRedirectURI() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithIcorrectRedirectURI() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest") } catch { XCTAssertNotNil(error) } diff --git a/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift b/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift index 41552de1..482322b9 100644 --- a/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift +++ b/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift @@ -14,7 +14,7 @@ class CrowdinSDKConfigLoginTests: XCTestCase { override func setUp() { super.setUp() - guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") else { return } + guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") else { return } config = CrowdinSDKConfig.config().with(loginConfig: loginConfig) } @@ -34,7 +34,7 @@ class CrowdinSDKConfigLoginTests: XCTestCase { } func testChangeConfigAfterSetup() { - guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId1", clientSecret: "clientSecret1", scope: "scope1", redirectURI: "crowdintest://", organizationName: "organizationName1") else { return } + guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId1", clientSecret: "clientSecret1", scope: "scope1", redirectURI: "crowdintest://") else { return } config.loginConfig = loginConfig XCTAssertNotNil(config.loginConfig) @@ -47,7 +47,5 @@ class CrowdinSDKConfigLoginTests: XCTestCase { XCTAssert(config.loginConfig?.scope == "scope1") XCTAssertNotNil(config.loginConfig?.redirectURI) XCTAssert(config.loginConfig?.redirectURI == "crowdintest://") - XCTAssertNotNil(config.loginConfig?.organizationName) - XCTAssert(config.loginConfig?.organizationName == "organizationName1") } } From 88e8c4888cd0873cb69281a699dded56370736b7 Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Sun, 15 Oct 2023 16:53:07 +0300 Subject: [PATCH 3/7] Move organizationName to CrowdinnProviderConfig. Update Languages API to support organization name. Rebuild some dependencies affected by moving organizationName to CrowdinnProviderConfig. --- .../CrowdinSDK/CrowdinAPI/CrowdinAPI.swift | 2 +- .../DistributionsAPI/DistributionsAPI.swift | 2 +- .../CrowdinAPI/LoginAPI/LoginAPI.swift | 2 +- .../CrowdinSDK/CrowdinSDKConfig.swift | 7 +------ .../LoginFeature/CrowdinLoginConfig.swift | 12 +++++------ .../Extensions/CrowdinSDK+Login.swift | 2 +- .../Extensions/CrowdinSDKConfig+Login.swift | 1 - .../Features/LoginFeature/LoginFeature.swift | 10 +++++----- .../CrowdinSDK+ReatimeUpdates.swift | 2 +- .../FilesDownloader/RUFilesDownloader.swift | 17 ++++++++-------- .../RURemoteLocalizationStorage.swift | 4 ++-- .../RealtimeUpdateFeature.swift | 6 +++--- .../Extensions/CrowdinSDK+Screenshots.swift | 2 +- .../ScreenshotUploader.swift | 6 +++--- .../Config/CrowdinProviderConfig.swift | 4 +++- .../CrowdinRemoteLocalizationStorage.swift | 19 +++++++++++------- .../Extensions/CrowdinSDK+ReactNative.swift | 2 +- .../CrowdinLocalizationDownloader.swift | 20 +++++++++---------- .../ManifestManager+LanguageResolver.swift | 2 +- .../ManifestManager/ManifestManager.swift | 13 +++++++----- .../CrowdinMappingDownloader.swift | 14 ++++++------- .../CrowdinMappingManager.swift | 6 +++--- .../CrowdinSupportedLanguages.swift | 15 +++++++++----- 23 files changed, 88 insertions(+), 82 deletions(-) diff --git a/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift index 1fd64ae4..7062f2c6 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/CrowdinAPI.swift @@ -40,7 +40,7 @@ class CrowdinAPI: BaseAPI { baseURL + apiPath } - init(organizationName: String? = nil, auth: CrowdinAuth? = nil, session: URLSession = .shared) { + init(organizationName: String?, auth: CrowdinAuth? = nil, session: URLSession = .shared) { self.organizationName = organizationName self.auth = auth super.init(session: session) diff --git a/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift index d5375922..fe8b6258 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/DistributionsAPI/DistributionsAPI.swift @@ -10,7 +10,7 @@ import Foundation class DistributionsAPI: CrowdinAPI { let hashString: String - init(hashString: String, organizationName: String? = nil, auth: CrowdinAuth? = nil, session: URLSession = .shared) { + init(hashString: String, organizationName: String?, auth: CrowdinAuth? = nil, session: URLSession = .shared) { self.hashString = hashString super.init(organizationName: organizationName, auth: auth, session: session) } diff --git a/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift b/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift index 72a83a9f..a785753c 100644 --- a/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift +++ b/Sources/CrowdinSDK/CrowdinAPI/LoginAPI/LoginAPI.swift @@ -16,7 +16,7 @@ class LoginAPI: BaseAPI { var scope: String var redirectURI: String - init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String? = nil, session: URLSession = URLSession.shared) { + init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String?, session: URLSession = URLSession.shared) { self.clientId = clientId self.clientSecret = clientSecret self.scope = scope diff --git a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift index 68357921..62c049d8 100644 --- a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift +++ b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift @@ -16,10 +16,5 @@ import Foundation return CrowdinSDKConfig() } - var enterprise: Bool = false - - func with(enterprise: Bool) -> Self { - self.enterprise = enterprise - return self - } + var enterprise: Bool { crowdinProviderConfig?.organizationName != nil } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift index bbfc639e..41313766 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift @@ -14,27 +14,26 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat var clientSecret: String var scope: String var redirectURI: String - var organizationName: String? = nil public convenience init(clientId: String, clientSecret: String, scope: String) throws { guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: nil) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: nil) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, organizationName: String) throws { guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: organizationName) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI, organizationName: organizationName) + try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } - private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String? = nil) throws { + private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { guard !clientId.isEmpty else { throw NSError(domain: "clientId could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } self.clientId = clientId guard !clientSecret.isEmpty else { throw NSError(domain: "clientSecret could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } @@ -44,6 +43,5 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat guard !redirectURI.isEmpty else { throw NSError(domain: "redirectURI could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } guard let urlSchemes = Bundle.main.urlSchemes, urlSchemes.contains(redirectURI) else { throw NSError(domain: "Application supported url schemes should contain \(redirectURI)", code: defaultCrowdinErrorCode, userInfo: nil) } self.redirectURI = redirectURI - self.organizationName = organizationName } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift index 1a88c80d..d6aa19ed 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDK+Login.swift @@ -13,7 +13,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } guard let loginConfig = config.loginConfig else { return } guard let hash = config.crowdinProviderConfig?.hashString else { return } - LoginFeature.configureWith(with: hash, loginConfig: loginConfig) + LoginFeature.configureWith(with: hash, organizationName: config.crowdinProviderConfig?.organizationName, loginConfig: loginConfig) } public class func login() { diff --git a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift index eb6f9cb5..f75636fd 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/Extensions/CrowdinSDKConfig+Login.swift @@ -21,7 +21,6 @@ extension CrowdinSDKConfig { public func with(loginConfig: CrowdinLoginConfig) -> Self { self.loginConfig = loginConfig - self.enterprise = loginConfig.organizationName != nil return self } } diff --git a/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift b/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift index 29f6a894..a0c43e1f 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/LoginFeature.swift @@ -16,7 +16,7 @@ import Foundation protocol LoginFeatureProtocol { static var shared: Self? { get } static var isLogined: Bool { get } - static func configureWith(with hash: String, loginConfig: CrowdinLoginConfig) + static func configureWith(with hash: String, organizationName: String?, loginConfig: CrowdinLoginConfig) func login(completion: @escaping () -> Void, error: @escaping (Error) -> Void) func relogin(completion: @escaping () -> Void, error: @escaping (Error) -> Void) @@ -34,9 +34,9 @@ final class LoginFeature: NSObject, LoginFeatureProtocol, CrowdinAuth { fileprivate var safariVC: SFSafariViewController? #endif - init(hashString: String, config: CrowdinLoginConfig) { + init(hashString: String, organizationName: String?, config: CrowdinLoginConfig) { self.config = config - self.loginAPI = LoginAPI(clientId: config.clientId, clientSecret: config.clientSecret, scope: config.scope, redirectURI: config.redirectURI, organizationName: config.organizationName) + self.loginAPI = LoginAPI(clientId: config.clientId, clientSecret: config.clientSecret, scope: config.scope, redirectURI: config.redirectURI, organizationName: organizationName) super.init() if self.hashString != hashString { self.logout() @@ -45,8 +45,8 @@ final class LoginFeature: NSObject, LoginFeatureProtocol, CrowdinAuth { NotificationCenter.default.addObserver(self, selector: #selector(receiveUnautorizedResponse), name: .CrowdinAPIUnautorizedNotification, object: nil) } - static func configureWith(with hashString: String, loginConfig: CrowdinLoginConfig) { - LoginFeature.shared = LoginFeature(hashString: hashString, config: loginConfig) + static func configureWith(with hashString: String, organizationName: String?, loginConfig: CrowdinLoginConfig) { + LoginFeature.shared = LoginFeature(hashString: hashString, organizationName: organizationName, config: loginConfig) } var hashString: String { diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift index f504dd4c..00024709 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/Extensions/CrowdinSDK+ReatimeUpdates.swift @@ -12,7 +12,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } let crowdinProviderConfig = config.crowdinProviderConfig ?? CrowdinProviderConfig() if config.realtimeUpdatesEnabled { - RealtimeUpdateFeature.shared = RealtimeUpdateFeature(hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage, organizationName: config.loginConfig?.organizationName) + RealtimeUpdateFeature.shared = RealtimeUpdateFeature(hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage, organizationName: config.crowdinProviderConfig?.organizationName) swizzleControlMethods() } } diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift index da653653..4b437211 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift @@ -21,11 +21,11 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { let projectsAPI: ProjectsAPI let projectId: String let enterprise: Bool - let languageResolver: LanguageResolver + let manifestManager: ManifestManager - init(projectId: String, laguageResolver: LanguageResolver, organizationName: String? = nil) { + init(projectId: String, manifestManager: ManifestManager, organizationName: String?) { self.projectId = projectId - self.languageResolver = laguageResolver + self.manifestManager = manifestManager self.enterprise = organizationName != nil self.projectsAPI = ProjectsAPI(organizationName: organizationName, auth: LoginFeature.shared) self.operationQueue.maxConcurrentOperationCount = 1 @@ -51,7 +51,7 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } fileIDs.forEach { (fileId) in - let targetLanguageId = languageResolver.crowdinLanguageCode(for: localization) ?? localization + let targetLanguageId = manifestManager.crowdinLanguageCode(for: localization) ?? localization let download = FileDataDownloadOperation(fileId: fileId, projectId: projectId, targetLanguageId: targetLanguageId, projectsAPI: projectsAPI) { [weak self] (data, error) in guard let self = self else { return @@ -107,10 +107,9 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) manifestManager.download { [weak self] in guard let self = self else { return } - guard let files = manifestManager.files else { completion(nil, nil); return; } + guard let files = self.manifestManager.files else { completion(nil, nil); return; } let fileNames = files.compactMap({ $0.split(separator: "/").last }).map({ String($0) }) self.getAllProjectFiles { (projectFiles, error) in guard let projectFiles = projectFiles else { completion(nil, error); return; } @@ -126,9 +125,9 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { } func getLangiages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.languages, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift index 1464b18f..1404d4d5 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/RURemoteLocalizationStorage.swift @@ -23,8 +23,8 @@ class RURemoteLocalizationStorage: RemoteLocalizationStorageProtocol { init(localization: String, hash: String, projectId: String, organizationName: String?) { self.localization = localization self.hash = hash - manifestManager = ManifestManager.manifest(for: hash) - self.fileDownloader = RUFilesDownloader(projectId: projectId, laguageResolver: manifestManager, organizationName: organizationName) + manifestManager = ManifestManager.manifest(for: hash, organizationName: organizationName) + self.fileDownloader = RUFilesDownloader(projectId: projectId, manifestManager: manifestManager, organizationName: organizationName) } func prepare(with completion: @escaping (() -> Void)) { diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift index 310eb5f0..a3effba3 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/RealtimeUpdateFeature.swift @@ -58,10 +58,10 @@ class RealtimeUpdateFeature: RealtimeUpdateFeatureProtocol { private var socketManger: CrowdinSocketManagerProtocol? private var mappingManager: CrowdinMappingManagerProtocol - required init(hash: String, sourceLanguage: String, organizationName: String? = nil) { + required init(hash: String, sourceLanguage: String, organizationName: String?) { self.hashString = hash self.organizationName = organizationName - self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage) + self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage, organizationName: organizationName) } func downloadDistribution(with successHandler: (() -> Void)? = nil, errorHandler: ((Error) -> Void)? = nil) { @@ -163,7 +163,7 @@ class RealtimeUpdateFeature: RealtimeUpdateFeatureProtocol { func setupSocketManager(with projectId: String, projectWsHash: String, userId: String, wsUrl: String) { // Download manifest if it is not initialized. - let manifestManager = ManifestManager.manifest(for: hashString) + let manifestManager = ManifestManager.manifest(for: hashString, organizationName: organizationName) guard manifestManager.downloaded else { manifestManager.download { [weak self] in guard let self = self else { return } diff --git a/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift b/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift index 01b2c124..9393cfce 100644 --- a/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift +++ b/Sources/CrowdinSDK/Features/ScreenshotFeature/Extensions/CrowdinSDK+Screenshots.swift @@ -14,7 +14,7 @@ extension CrowdinSDK { guard let config = CrowdinSDK.config else { return } if config.screenshotsEnabled { let crowdinProviderConfig = config.crowdinProviderConfig ?? CrowdinProviderConfig() - let screenshotUploader = CrowdinScreenshotUploader(organizationName: config.loginConfig?.organizationName, hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage) + let screenshotUploader = CrowdinScreenshotUploader(organizationName: config.crowdinProviderConfig?.organizationName, hash: crowdinProviderConfig.hashString, sourceLanguage: crowdinProviderConfig.sourceLanguage) ScreenshotFeature.shared = ScreenshotFeature(screenshotUploader: screenshotUploader, screenshotProcessor: CrowdinScreenshotProcessor()) swizzleControlMethods() } diff --git a/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift b/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift index 70a69976..61479ac7 100644 --- a/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift +++ b/Sources/CrowdinSDK/Features/ScreenshotFeature/ScreenshotUploader.swift @@ -15,7 +15,7 @@ public protocol ScreenshotUploader { } class CrowdinScreenshotUploader: ScreenshotUploader { - var organizationName: String? = nil + var organizationName: String? var hash: String var sourceLanguage: String @@ -29,11 +29,11 @@ class CrowdinScreenshotUploader: ScreenshotUploader { case noLocalizedStringsDetected = "There are no localized strings detected on current screen." } - init(organizationName: String? = nil, hash: String, sourceLanguage: String) { + init(organizationName: String?, hash: String, sourceLanguage: String) { self.organizationName = organizationName self.hash = hash self.sourceLanguage = sourceLanguage - self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage) + self.mappingManager = CrowdinMappingManager(hash: hash, sourceLanguage: sourceLanguage, organizationName: organizationName) } func loginAndGetProjectId(success: (() -> Void)? = nil, errorHandler: ((Error) -> Void)? = nil) { diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift b/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift index ce7da72b..d7365894 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Config/CrowdinProviderConfig.swift @@ -10,10 +10,12 @@ import Foundation @objcMembers public class CrowdinProviderConfig: NSObject { var hashString: String var sourceLanguage: String + var organizationName: String? - public init(hashString: String, sourceLanguage: String) { + public init(hashString: String, sourceLanguage: String, organizationName: String? = nil) { self.hashString = hashString self.sourceLanguage = sourceLanguage + self.organizationName = organizationName } @available(*, deprecated, renamed: "init(hashString:sourceLanguage:)") diff --git a/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift b/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift index e84827bc..efcb54a7 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/CrowdinRemoteLocalizationStorage.swift @@ -9,6 +9,7 @@ import Foundation class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { var localization: String + var organizationName: String? var localizations: [String] var hashString: String var name: String = "Crowdin" @@ -16,13 +17,16 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { private var crowdinDownloader: CrowdinLocalizationDownloader private var _localizations: [String]? + private let crowdinSupportedLanguages: CrowdinSupportedLanguages init(localization: String, config: CrowdinProviderConfig) { self.localization = localization self.hashString = config.hashString - self.manifestManager = ManifestManager.manifest(for: config.hashString) - self.crowdinDownloader = CrowdinLocalizationDownloader(languageResolver: manifestManager) + self.organizationName = config.organizationName + self.manifestManager = ManifestManager.manifest(for: config.hashString, organizationName: config.organizationName) + self.crowdinDownloader = CrowdinLocalizationDownloader(manifestManager: manifestManager) self.localizations = self.manifestManager.iOSLanguages + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: config.organizationName) } func prepare(with completion: @escaping () -> Void) { @@ -33,8 +37,8 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { } func downloadCrowdinSupportedLanguages(completion: @escaping () -> Void) { - if !CrowdinSupportedLanguages.shared.loaded { - CrowdinSupportedLanguages.shared.downloadSupportedLanguages(completion: { + if !crowdinSupportedLanguages.loaded { + crowdinSupportedLanguages.downloadSupportedLanguages(completion: { completion() }, error: { LocalizationUpdateObserver.shared.notifyError(with: [$0]) @@ -54,15 +58,16 @@ class CrowdinRemoteLocalizationStorage: RemoteLocalizationStorageProtocol { }) } - required init(localization: String, enterprise: Bool) { + required init(localization: String, enterprise: Bool, organizationName: String?) { self.localization = localization guard let hashString = Bundle.main.crowdinDistributionHash else { fatalError("Please add CrowdinDistributionHash key to your Info.plist file") } self.hashString = hashString - self.manifestManager = ManifestManager.manifest(for: hashString) - self.crowdinDownloader = CrowdinLocalizationDownloader(languageResolver: self.manifestManager) + self.manifestManager = ManifestManager.manifest(for: hashString, organizationName: organizationName) + self.crowdinDownloader = CrowdinLocalizationDownloader(manifestManager: self.manifestManager) self.localizations = [] + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: organizationName) } func fetchData(completion: @escaping LocalizationStorageCompletion, errorHandler: LocalizationStorageError?) { diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift index aa15c759..33dd6db6 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDK+ReactNative.swift @@ -74,7 +74,7 @@ extension CrowdinSDK { /// - errorHandler: Error handler. public class func localizationDictionary(for localization: String, hashString: String, completion: @escaping ([AnyHashable: Any]) -> Void, errorHandler: @escaping (Error) -> Void) { let localLocalizationStorage = LocalLocalizationStorage(localization: localization) - let remoteLocalizationStorage = CrowdinRemoteLocalizationStorage(localization: localization, config: CrowdinProviderConfig(hashString: hashString, sourceLanguage: .empty)) + let remoteLocalizationStorage = CrowdinRemoteLocalizationStorage(localization: localization, config: CrowdinProviderConfig(hashString: hashString, sourceLanguage: .empty, organizationName: nil)) remoteLocalizationStorage.prepare { localizationProvider = LocalizationProvider(localization: localization, localStorage: localLocalizationStorage, remoteStorage: remoteLocalizationStorage) localizationProvider?.refreshLocalization(completion: { error in diff --git a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift index 280da829..fa57871d 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift @@ -16,10 +16,10 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { fileprivate var plurals: [AnyHashable: Any]? = nil fileprivate var errors: [Error]? = nil fileprivate var contentDeliveryAPI: CrowdinContentDeliveryAPI! - fileprivate let languageResolver: LanguageResolver + fileprivate let manifestManager: ManifestManager - init(languageResolver: LanguageResolver) { - self.languageResolver = languageResolver + init(manifestManager: ManifestManager) { + self.manifestManager = manifestManager } func download(with hash: String, for localization: String, completion: @escaping CrowdinDownloaderCompletion) { @@ -47,7 +47,7 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { self.plurals = nil self.errors = nil - let pathParser = CrowdinPathsParser(languageResolver: languageResolver) + let pathParser = CrowdinPathsParser(languageResolver: manifestManager) let completionBlock = BlockOperation { [weak self] in guard let self = self else { return } @@ -107,16 +107,16 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.files, manifestManager.timestamp, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.files, self.manifestManager.timestamp, nil) } } func getLanguages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.languages, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift index c6a4698e..a8bd051d 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager+LanguageResolver.swift @@ -9,7 +9,7 @@ import Foundation extension ManifestManager: LanguageResolver { var allLanguages: [CrowdinLanguage] { - let crowdinLanguages: [CrowdinLanguage] = CrowdinSupportedLanguages.shared.supportedLanguages?.data.map({ $0.data }) ?? [] + let crowdinLanguages: [CrowdinLanguage] = crowdinSupportedLanguages.supportedLanguages?.data.map({ $0.data }) ?? [] let customLaguages: [CrowdinLanguage] = customLanguages ?? [] let allLanguages: [CrowdinLanguage] = crowdinLanguages + customLaguages return allLanguages diff --git a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift index d6d45017..7215078c 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/ManifestManager/ManifestManager.swift @@ -51,25 +51,29 @@ class ManifestManager { } let hash: String + let organizationName: String? var files: [String]? var timestamp: TimeInterval? var languages: [String]? var customLanguages: [CustomLangugage]? var manifestURL: String? var contentDeliveryAPI: CrowdinContentDeliveryAPI + var crowdinSupportedLanguages: CrowdinSupportedLanguages - fileprivate init(hash: String) { + fileprivate init(hash: String, organizationName: String?) { self.hash = hash + self.organizationName = organizationName self.contentDeliveryAPI = CrowdinContentDeliveryAPI(hash: hash) + self.crowdinSupportedLanguages = CrowdinSupportedLanguages(organizationName: organizationName) self.load() ManifestManager.manifestMap[self.hash] = self } - class func manifest(for hash: String) -> ManifestManager { + class func manifest(for hash: String, organizationName: String?) -> ManifestManager { if let manifest = manifestMap[hash] { return manifest } - let manifest = ManifestManager(hash: hash) + let manifest = ManifestManager(hash: hash, organizationName: organizationName) return manifest } @@ -126,7 +130,7 @@ class ManifestManager { } /// Path for current hash manifests file - private var manifestPath: String { ManifestManager.manifestsPath + hash + ".json" } + private var manifestPath: String { ManifestManager.manifestsPath + hash + (organizationName ?? "") + ".json" } /// Root path for manifests files static private let manifestsPath = CrowdinFolder.shared.path + "/Manifests/" @@ -157,6 +161,5 @@ class ManifestManager { func clear() { ManifestManager.manifestMap.removeValue(forKey: hash) try? FileManager.default.removeItem(atPath: manifestPath) - } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift index f538dea6..c6060af3 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift @@ -16,10 +16,10 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { fileprivate var errors: [Error]? = nil //swiftlint:disable implicitly_unwrapped_optional fileprivate var contentDeliveryAPI: CrowdinContentDeliveryAPI! - fileprivate let languageResolver: LanguageResolver + fileprivate let manifestManager: ManifestManager - init(languageResolver: LanguageResolver) { - self.languageResolver = languageResolver + init(manifestManager: ManifestManager) { + self.manifestManager = manifestManager } func download(with hash: String, for localization: String, completion: @escaping CrowdinDownloaderCompletion) { @@ -45,7 +45,7 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { self.plurals = nil self.errors = nil - let pathParser = CrowdinPathsParser(languageResolver: languageResolver) + let pathParser = CrowdinPathsParser(languageResolver: manifestManager) let completionBlock = BlockOperation { self.completion?(self.strings, self.plurals, self.errors) @@ -91,9 +91,9 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { } func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, String?, Error?) -> Void) { - let manifestManager = ManifestManager.manifest(for: hash) - manifestManager.download { - completion(manifestManager.files, manifestManager.timestamp, manifestManager.manifestURL, nil) + manifestManager.download { [weak self] in + guard let self else { return } + completion(self.manifestManager.files, self.manifestManager.timestamp, self.manifestManager.manifestURL, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift index e8ba5338..5d24b2e9 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingManager.swift @@ -25,9 +25,9 @@ public class CrowdinMappingManager: CrowdinMappingManagerProtocol { var stringsMapping: [String: String] = [:] var plurals: [AnyHashable: Any] = [:] - init(hash: String, sourceLanguage: String) { - self.manifestManager = ManifestManager.manifest(for: hash) - self.downloader = CrowdinMappingDownloader(languageResolver: self.manifestManager) + init(hash: String, sourceLanguage: String, organizationName: String?) { + self.manifestManager = ManifestManager.manifest(for: hash, organizationName: organizationName) + self.downloader = CrowdinMappingDownloader(manifestManager: self.manifestManager) self.download(hash: hash, sourceLanguage: sourceLanguage) } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift b/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift index f527ffb8..c79c07ba 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/SupportedLanguages/CrowdinSupportedLanguages.swift @@ -10,19 +10,19 @@ import Foundation extension LanguagesResponseData: CrowdinLanguage { } class CrowdinSupportedLanguages { - static let shared = CrowdinSupportedLanguages() - let api = LanguagesAPI() - fileprivate enum Strings: String { case SupportedLanguages case Crowdin } + fileprivate enum Keys: String { case lastUpdatedDate = "CrowdinSupportedLanguages.lastUpdatedDate" } + fileprivate var filePath: String { - return CrowdinFolder.shared.path + String.pathDelimiter + Strings.Crowdin.rawValue + String.pathDelimiter + Strings.SupportedLanguages.rawValue + FileType.json.extension + return CrowdinFolder.shared.path + String.pathDelimiter + Strings.Crowdin.rawValue + String.pathDelimiter + Strings.SupportedLanguages.rawValue + (organizationName ?? "") + FileType.json.extension } + fileprivate var lastUpdatedDate: Date? { set { UserDefaults.standard.set(newValue, forKey: Keys.lastUpdatedDate.rawValue) @@ -32,6 +32,9 @@ class CrowdinSupportedLanguages { return UserDefaults.standard.value(forKey: Keys.lastUpdatedDate.rawValue) as? Date } } + + let organizationName: String? + let api: LanguagesAPI var loaded: Bool { return supportedLanguages != nil } var loading = false @@ -44,7 +47,9 @@ class CrowdinSupportedLanguages { } } - init() { + init(organizationName: String?) { + self.organizationName = organizationName + api = LanguagesAPI(organizationName: organizationName) readSupportedLanguages() updateSupportedLanguagesIfNeeded() } From 9bc25b8e3325073a6c7c28a2731390404e3f0fdf Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Sun, 15 Oct 2023 17:21:17 +0300 Subject: [PATCH 4/7] Fix tests. Add organizationName to all initialisers where needed. --- .../LoginFeature/CrowdinLoginConfig.swift | 9 --------- .../CrowdinSDKConfig+CrowdinProvider.swift | 8 ++++++-- Sources/Tests/Core/CrowdinSDKConfigTests.swift | 8 ++++++-- Sources/Tests/CrowdinAPI/CrowdinAPITests.swift | 2 +- .../Tests/CrowdinAPI/CrowdinLoginAPITests.swift | 3 ++- .../Tests/CrowdinAPI/DistributionsAPITests.swift | 2 +- Sources/Tests/CrowdinAPI/LanguagesAPITests.swift | 2 +- Sources/Tests/CrowdinAPI/ProjectsAPITests.swift | 2 +- .../CrowdinProvider/ManifestManagerTests.swift | 2 +- Tests/UnitTests/AddErrorHandlersTests.swift | 1 - .../InitializationCompletionHandlerTests.swift | 1 - .../Login/CrowdinLoginConfigTests.swift | 16 +++++++--------- .../Login/CrowdinSDKConfigLoginTests.swift | 6 ++---- 13 files changed, 28 insertions(+), 34 deletions(-) diff --git a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift index 41313766..b67a01b1 100644 --- a/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift +++ b/Sources/CrowdinSDK/Features/LoginFeature/CrowdinLoginConfig.swift @@ -24,15 +24,6 @@ private let URLSchemeDocumentationLink = "https://developer.apple.com/documentat try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) } - public convenience init(clientId: String, clientSecret: String, scope: String, organizationName: String) throws { - guard let redirectURI = Bundle.main.urlSchemes?.first else { throw NSError(domain: "Application do not support any URL Scheme. To setup it, please check - \(URLSchemeDocumentationLink)", code: defaultCrowdinErrorCode, userInfo: nil) } - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) - } - - public convenience init(clientId: String, clientSecret: String, scope: String, redirectURI: String, organizationName: String) throws { - try self.init(with: clientId, clientSecret: clientSecret, scope: scope, redirectURI: redirectURI) - } - private init(with clientId: String, clientSecret: String, scope: String, redirectURI: String) throws { guard !clientId.isEmpty else { throw NSError(domain: "clientId could not be empty.", code: defaultCrowdinErrorCode, userInfo: nil) } self.clientId = clientId diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift index 7c34215a..72efda69 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift @@ -13,10 +13,10 @@ extension CrowdinSDKConfig { // Realtime updates var crowdinProviderConfig: CrowdinProviderConfig? { get { - return CrowdinSDKConfig.crowdinProviderConfig + return Self.crowdinProviderConfig } set { - CrowdinSDKConfig.crowdinProviderConfig = newValue + Self.crowdinProviderConfig = newValue } } @@ -28,4 +28,8 @@ extension CrowdinSDKConfig { self.crowdinProviderConfig = crowdinProviderConfig return self } + + static func resetStoredConfig() { + Self.crowdinProviderConfig = nil + } } diff --git a/Sources/Tests/Core/CrowdinSDKConfigTests.swift b/Sources/Tests/Core/CrowdinSDKConfigTests.swift index 5dfb084e..6f4fc41a 100644 --- a/Sources/Tests/Core/CrowdinSDKConfigTests.swift +++ b/Sources/Tests/Core/CrowdinSDKConfigTests.swift @@ -2,6 +2,10 @@ import XCTest @testable import CrowdinSDK class CrowdinSDKConfigTests: XCTestCase { + static override func setUp() { + CrowdinSDKConfig.resetStoredConfig() + } + func testConfigInitialization() { let config = CrowdinSDKConfig.config() XCTAssertNil(config.crowdinProviderConfig) @@ -13,12 +17,12 @@ class CrowdinSDKConfigTests: XCTestCase { } func testConfigFalseEnterprise() { - let config = CrowdinSDKConfig.config().with(enterprise: false) + let config = CrowdinSDKConfig.config().with(crowdinProviderConfig: CrowdinProviderConfig(hashString: "hashString", sourceLanguage: "sourceLanguage")) XCTAssert(config.enterprise == false, "Showuldn't be true as default value is false") } func testConfigTrueEnterprise() { - let config = CrowdinSDKConfig.config().with(enterprise: true) + let config = CrowdinSDKConfig.config().with(crowdinProviderConfig: CrowdinProviderConfig(hashString: "hashString", sourceLanguage: "sourceLanguage", organizationName: "organizationName")) XCTAssert(config.enterprise, "Showuld be true as per set-up") } } diff --git a/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift b/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift index 6b2e63ad..76bb382d 100644 --- a/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift +++ b/Sources/Tests/CrowdinAPI/CrowdinAPITests.swift @@ -6,7 +6,7 @@ class CrowdinAPITests: XCTestCase { var api: CrowdinAPI! func testAPIInitialization() { - api = CrowdinAPI() + api = CrowdinAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "") diff --git a/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift b/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift index 226b90cc..0f839688 100644 --- a/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift +++ b/Sources/Tests/CrowdinAPI/CrowdinLoginAPITests.swift @@ -23,13 +23,14 @@ class CrowdinLoginAPITests: XCTestCase { } func testLoginAPIInitialization() { - loginAPI = LoginAPI(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "redirectURI") + loginAPI = LoginAPI(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "redirectURI", organizationName: nil) XCTAssertNotNil(loginAPI) XCTAssert(loginAPI.clientId == "clientId") XCTAssert(loginAPI.clientSecret == "clientSecret") XCTAssert(loginAPI.scope == "scope") XCTAssert(loginAPI.redirectURI == "redirectURI") + XCTAssert(loginAPI.organizationName == nil) XCTAssertNil(loginAPI.organizationName) } diff --git a/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift b/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift index ffb6822e..86b28c35 100644 --- a/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift +++ b/Sources/Tests/CrowdinAPI/DistributionsAPITests.swift @@ -17,7 +17,7 @@ class DistributionsAPITests: XCTestCase { let defaultTimeoutForExpectation = 2.0 func testAPIInitialization() { - api = DistributionsAPI(hashString: testHashString) + api = DistributionsAPI(hashString: testHashString, organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "distributions/metadata?hash=\(testHashString)") diff --git a/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift b/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift index bc482ea2..af1b0600 100644 --- a/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift +++ b/Sources/Tests/CrowdinAPI/LanguagesAPITests.swift @@ -17,7 +17,7 @@ class LanguagesAPITests: XCTestCase { var testOrganization = "test_organization" func testAPIInitialization() { - api = LanguagesAPI() + api = LanguagesAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "languages") diff --git a/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift b/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift index 2d10f5d7..711a8c1d 100644 --- a/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift +++ b/Sources/Tests/CrowdinAPI/ProjectsAPITests.swift @@ -19,7 +19,7 @@ class ProjectsAPITests: XCTestCase { let defaultTimeoutForExpectation = 2.0 func testAPIInitialization() { - api = ProjectsAPI() + api = ProjectsAPI(organizationName: nil) XCTAssert(api.baseURL == "https://api.crowdin.com/api/v2/") XCTAssert(api.apiPath == "projects") diff --git a/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift b/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift index 1fe03362..df2b0de7 100644 --- a/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift +++ b/Sources/Tests/CrowdinProvider/ManifestManagerTests.swift @@ -18,7 +18,7 @@ class ManifestManagerTests: XCTestCase { func testDownloadManifest() { let expectation = XCTestExpectation(description: "Manifest download expectation") - let manifest = ManifestManager.manifest(for: crowdinTestHash) + let manifest = ManifestManager.manifest(for: crowdinTestHash, organizationName: nil) XCTAssertFalse(manifest.loaded) XCTAssertFalse(manifest.downloaded) diff --git a/Tests/UnitTests/AddErrorHandlersTests.swift b/Tests/UnitTests/AddErrorHandlersTests.swift index d7f77718..86a9b94e 100644 --- a/Tests/UnitTests/AddErrorHandlersTests.swift +++ b/Tests/UnitTests/AddErrorHandlersTests.swift @@ -21,7 +21,6 @@ class AddErrorHandlersTests: XCTestCase { let crowdinProviderConfig = CrowdinProviderConfig(hashString: "wrong_hash", sourceLanguage: "en") let crowdinSDKConfig = CrowdinSDKConfig.config().with(crowdinProviderConfig: crowdinProviderConfig) - .with(enterprise: true) CrowdinSDK.currentLocalization = nil let expectation = XCTestExpectation(description: "Error handler is called") diff --git a/Tests/UnitTests/InitializationCompletionHandlerTests.swift b/Tests/UnitTests/InitializationCompletionHandlerTests.swift index 5efc8949..6882cd00 100644 --- a/Tests/UnitTests/InitializationCompletionHandlerTests.swift +++ b/Tests/UnitTests/InitializationCompletionHandlerTests.swift @@ -22,7 +22,6 @@ class InitializationCompletionHandlerTests: XCTestCase { let crowdinProviderConfig = CrowdinProviderConfig(hashString: "wrong_hash", sourceLanguage: "en") let crowdinSDKConfig = CrowdinSDKConfig.config().with(crowdinProviderConfig: crowdinProviderConfig) - .with(enterprise: true) CrowdinSDK.startWithConfig(crowdinSDKConfig, completion: { XCTAssert(true, "Initialization completion handler called") expectation.fulfill() diff --git a/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift b/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift index 328fc534..c200429c 100644 --- a/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift +++ b/Tests/UnitTests/Login/CrowdinLoginConfigTests.swift @@ -30,58 +30,56 @@ class CrowdinLoginConfigTests: XCTestCase { } func testLoginConfigOrganization() { - loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") XCTAssertNotNil(loginConfig) XCTAssert(loginConfig.clientId == "clientId") XCTAssert(loginConfig.clientSecret == "clientSecret") XCTAssert(loginConfig.scope == "scope") XCTAssert(loginConfig.redirectURI == "crowdintest://") - XCTAssert(loginConfig.organizationName == "organizationName") } func testLoginConfigOrganizationInitWithoutRedirectURI() { - loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", organizationName: "organizationName") + loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope") XCTAssertNotNil(loginConfig) XCTAssert(loginConfig.clientId == "clientId") XCTAssert(loginConfig.clientSecret == "clientSecret") XCTAssert(loginConfig.scope == "scope") XCTAssert(loginConfig.redirectURI == "crowdintest://") - XCTAssert(loginConfig.organizationName == "organizationName") } func testLoginConfigInitWithEmptyClientId() { do { - loginConfig = try CrowdinLoginConfig(clientId: "", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyClientSecret() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "", scope: "scope", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyScope() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "", redirectURI: "crowdintest://", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "", redirectURI: "crowdintest://") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithEmptyRedirectURI() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "") } catch { XCTAssertNotNil(error) } } func testLoginConfigInitWithIcorrectRedirectURI() { do { - loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest", organizationName: "organizationName") + loginConfig = try CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest") } catch { XCTAssertNotNil(error) } diff --git a/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift b/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift index 41552de1..482322b9 100644 --- a/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift +++ b/Tests/UnitTests/Login/CrowdinSDKConfigLoginTests.swift @@ -14,7 +14,7 @@ class CrowdinSDKConfigLoginTests: XCTestCase { override func setUp() { super.setUp() - guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://", organizationName: "organizationName") else { return } + guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId", clientSecret: "clientSecret", scope: "scope", redirectURI: "crowdintest://") else { return } config = CrowdinSDKConfig.config().with(loginConfig: loginConfig) } @@ -34,7 +34,7 @@ class CrowdinSDKConfigLoginTests: XCTestCase { } func testChangeConfigAfterSetup() { - guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId1", clientSecret: "clientSecret1", scope: "scope1", redirectURI: "crowdintest://", organizationName: "organizationName1") else { return } + guard let loginConfig = try? CrowdinLoginConfig(clientId: "clientId1", clientSecret: "clientSecret1", scope: "scope1", redirectURI: "crowdintest://") else { return } config.loginConfig = loginConfig XCTAssertNotNil(config.loginConfig) @@ -47,7 +47,5 @@ class CrowdinSDKConfigLoginTests: XCTestCase { XCTAssert(config.loginConfig?.scope == "scope1") XCTAssertNotNil(config.loginConfig?.redirectURI) XCTAssert(config.loginConfig?.redirectURI == "crowdintest://") - XCTAssertNotNil(config.loginConfig?.organizationName) - XCTAssert(config.loginConfig?.organizationName == "organizationName1") } } From 2cd73c80d64f44b89a1488673214ce3d26e5268e Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Wed, 25 Oct 2023 01:01:46 +0300 Subject: [PATCH 5/7] Update CrowdinSDKConfigTests.swift Fix tests. --- Sources/Tests/Core/CrowdinSDKConfigTests.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/Tests/Core/CrowdinSDKConfigTests.swift b/Sources/Tests/Core/CrowdinSDKConfigTests.swift index 6f4fc41a..48632519 100644 --- a/Sources/Tests/Core/CrowdinSDKConfigTests.swift +++ b/Sources/Tests/Core/CrowdinSDKConfigTests.swift @@ -2,7 +2,8 @@ import XCTest @testable import CrowdinSDK class CrowdinSDKConfigTests: XCTestCase { - static override func setUp() { + override func setUp() { + super.setUp() CrowdinSDKConfig.resetStoredConfig() } From 03acdadd74c895dacdc7976d09c4217c54b73268 Mon Sep 17 00:00:00 2001 From: Serhii Londar Date: Wed, 25 Oct 2023 17:57:18 +0300 Subject: [PATCH 6/7] Fix issues with pod lint. --- Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift | 2 -- .../FilesDownloader/RUFilesDownloader.swift | 2 +- .../Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift | 2 ++ .../CrowdinLocalizationDownloader.swift | 4 ++-- .../Crowdin/MappingDownloader/CrowdinMappingDownloader.swift | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift index 62c049d8..cc6afbda 100644 --- a/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift +++ b/Sources/CrowdinSDK/CrowdinSDK/CrowdinSDKConfig.swift @@ -15,6 +15,4 @@ import Foundation public static func config() -> CrowdinSDKConfig { return CrowdinSDKConfig() } - - var enterprise: Bool { crowdinProviderConfig?.organizationName != nil } } diff --git a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift index 4b437211..1179ba23 100644 --- a/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift +++ b/Sources/CrowdinSDK/Features/RealtimeUpdateFeature/LocalizationProvider/FilesDownloader/RUFilesDownloader.swift @@ -126,7 +126,7 @@ class RUFilesDownloader: CrowdinDownloaderProtocol { func getLangiages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { manifestManager.download { [weak self] in - guard let self else { return } + guard let self = self else { return } completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift index 72efda69..410533ef 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/Extensions/CrowdinSDKConfig+CrowdinProvider.swift @@ -32,4 +32,6 @@ extension CrowdinSDKConfig { static func resetStoredConfig() { Self.crowdinProviderConfig = nil } + + var enterprise: Bool { crowdinProviderConfig?.organizationName != nil } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift index fa57871d..3833ceaf 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/LocalizationDownloader/CrowdinLocalizationDownloader.swift @@ -108,14 +108,14 @@ class CrowdinLocalizationDownloader: CrowdinDownloaderProtocol { func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, Error?) -> Void) { manifestManager.download { [weak self] in - guard let self else { return } + guard let self = self else { return } completion(self.manifestManager.files, self.manifestManager.timestamp, nil) } } func getLanguages(for hash: String, completion: @escaping ([String]?, Error?) -> Void) { manifestManager.download { [weak self] in - guard let self else { return } + guard let self = self else { return } completion(self.manifestManager.languages, nil) } } diff --git a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift index c6060af3..4fff5533 100644 --- a/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift +++ b/Sources/CrowdinSDK/Providers/Crowdin/MappingDownloader/CrowdinMappingDownloader.swift @@ -92,7 +92,7 @@ class CrowdinMappingDownloader: CrowdinDownloaderProtocol { func getFiles(for hash: String, completion: @escaping ([String]?, TimeInterval?, String?, Error?) -> Void) { manifestManager.download { [weak self] in - guard let self else { return } + guard let self = self else { return } completion(self.manifestManager.files, self.manifestManager.timestamp, self.manifestManager.manifestURL, nil) } } From 886d3336fc585eefab9dc23fa91686739b5994b1 Mon Sep 17 00:00:00 2001 From: Andrii Bodnar Date: Thu, 26 Oct 2023 15:06:24 +0300 Subject: [PATCH 7/7] docs: update according to the new configuration --- website/docs/advanced-features/real-time-preview.mdx | 10 +++++----- website/docs/advanced-features/screenshots.mdx | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/website/docs/advanced-features/real-time-preview.mdx b/website/docs/advanced-features/real-time-preview.mdx index c254f056..fdd8774e 100644 --- a/website/docs/advanced-features/real-time-preview.mdx +++ b/website/docs/advanced-features/real-time-preview.mdx @@ -26,15 +26,15 @@ Open *AppDelegate.swift* file and in the `application` method add: ```swift title="AppDelegate.swift" let crowdinProviderConfig = CrowdinProviderConfig(hashString: "{your_distribution_hash}", - sourceLanguage: "{source_language}") + sourceLanguage: "{source_language}", + organizationName: "{organization_name}") var loginConfig: CrowdinLoginConfig do { loginConfig = try CrowdinLoginConfig(clientId: "{client_id}", clientSecret: "{client_secret}", scope: "project", - redirectURI: "{redirectURI}", - organizationName: "{organization_name}") + redirectURI: "{redirectURI}") } catch { print(error) // CrowdinLoginConfig initialization error handling, typically for empty values and for wrong redirect URI value. @@ -53,10 +53,10 @@ CrowdinSDK.startWithConfig(crowdinSDKConfig, completion: { ### Objective-C ```objectivec -CrowdinProviderConfig *crowdinProviderConfig = [[CrowdinProviderConfig alloc] initWithHashString:@"" sourceLanguage:@""]; +CrowdinProviderConfig *crowdinProviderConfig = [[CrowdinProviderConfig alloc] initWithHashString:@"" sourceLanguage:@"" organizationName:@"{organization_name}"]; NSError *error; -CrowdinLoginConfig *loginConfig = [[CrowdinLoginConfig alloc] initWithClientId:@"{client_id}" clientSecret:@"{client_secter}" scope:@"project" organizationName:@"{organization_name}" error:&error]; +CrowdinLoginConfig *loginConfig = [[CrowdinLoginConfig alloc] initWithClientId:@"{client_id}" clientSecret:@"{client_secret}" scope:@"project" error:&error]; if (!error) { CrowdinSDKConfig *config = [[[CrowdinSDKConfig config] withCrowdinProviderConfig:crowdinProviderConfig] withLoginConfig:loginConfig]; diff --git a/website/docs/advanced-features/screenshots.mdx b/website/docs/advanced-features/screenshots.mdx index a16957a3..8fd49e0e 100644 --- a/website/docs/advanced-features/screenshots.mdx +++ b/website/docs/advanced-features/screenshots.mdx @@ -26,15 +26,15 @@ Open *AppDelegate.swift* file and in the `application` method add: ```swift title="AppDelegate.swift" let crowdinProviderConfig = CrowdinProviderConfig(hashString: "{your_distribution_hash}", - sourceLanguage: "{source_language}") + sourceLanguage: "{source_language}", + organizationName: "{organization_name}") var loginConfig: CrowdinLoginConfig do { loginConfig = try CrowdinLoginConfig(clientId: "{client_id}", clientSecret: "{client_secret}", scope: "project.screenshot", - redirectURI: "{redirectURI}", - organizationName: "{organization_name}") + redirectURI: "{redirectURI}") } catch { print(error) // CrowdinLoginConfig initialization error handling, typically for empty values and for wrong redirect URI value. @@ -53,10 +53,10 @@ CrowdinSDK.startWithConfig(crowdinSDKConfig, completion: { ### Objective-C ```objectivec -CrowdinProviderConfig *crowdinProviderConfig = [[CrowdinProviderConfig alloc] initWithHashString:@"" sourceLanguage:@""]; +CrowdinProviderConfig *crowdinProviderConfig = [[CrowdinProviderConfig alloc] initWithHashString:@"" sourceLanguage:@"" organizationName:@"{organization_name}"]; NSError *error; -CrowdinLoginConfig *loginConfig = [[CrowdinLoginConfig alloc] initWithClientId:@"{client_id}" clientSecret:@"{client_secter}" scope:@"project.screenshot" organizationName:@"{organization_name}" error:&error]; +CrowdinLoginConfig *loginConfig = [[CrowdinLoginConfig alloc] initWithClientId:@"{client_id}" clientSecret:@"{client_secret}" scope:@"project.screenshot" error:&error]; if (!error) { CrowdinSDKConfig *config = [[[CrowdinSDKConfig config] withCrowdinProviderConfig:crowdinProviderConfig] withLoginConfig:loginConfig];