Compare commits

...

9 Commits

Author SHA1 Message Date
Artur b40f0ac185 Update to master branch 2019-10-03 16:09:07 +03:00
Artur Azarau dbcad92ff0 cartfile resolved updated 2019-10-02 09:51:39 +03:00
Artur Azarau 605e1aeeef branch changed 2019-10-02 09:49:50 +03:00
Ivan Babkin 6e712bf664 Carthage update 2019-06-17 19:43:13 +03:00
Ivan Babkin 0b860372e9
Merge pull request #3 from ZharaOo/fix/cartfile
Using RxSwift binary
2019-06-17 19:39:04 +03:00
Ivan Babkin c8f4fb213e Using RxSwift binary 2019-06-17 19:37:56 +03:00
Ivan Babkin 7ba0aff437
Merge pull request #2 from ZharaOo/feature/loading_observable
Added loadingObservable property
2019-06-17 19:32:57 +03:00
Ivan Babkin b3994f932e Added possibility to observe loading state changing 2019-06-17 19:32:23 +03:00
Ivan Babkin 1d178f7154
Merge pull request #1 from ZharaOo/fix/execute
Fixed unexpected error on old devices
2019-06-11 14:16:28 +03:00
5 changed files with 38 additions and 2 deletions

View File

@ -1 +1 @@
github "ReactiveX/RxSwift" ~> 4.3
binary "https://raw.github.com/TouchInstinct/CarthageBinaries/master/RxSwift/RxSwift.json"

View File

@ -1 +1 @@
github "ReactiveX/RxSwift" "4.4.0"
binary "https://raw.github.com/TouchInstinct/CarthageBinaries/master/RxSwift/RxSwift.json" "4.5.0"

View File

@ -13,6 +13,8 @@ import WebKit
/**
*/
public class ReCaptcha {
public typealias BoolParameterClosure = (Bool) -> ()
fileprivate struct Constants {
struct InfoDictKeys {
static let APIKey = "ReCaptchaKey"
@ -101,6 +103,12 @@ public class ReCaptcha {
}
}
/// Callback for WebView loading state changing
public var onLoadingChanged: BoolParameterClosure? {
get { return manager.onLoadingChanged }
set { manager.onLoadingChanged = newValue }
}
/// The worker that handles webview events and communication
let manager: ReCaptchaWebViewManager

View File

@ -44,6 +44,9 @@ internal class ReCaptchaWebViewManager {
public var shouldSkipForTests = false
#endif
/// Callback for loading state changing
var onLoadingChanged: ReCaptcha.BoolParameterClosure?
/// Sends the result message
var completion: ((ReCaptchaResult) -> Void)?
@ -106,6 +109,7 @@ internal class ReCaptchaWebViewManager {
*/
init(html: String, apiKey: String, baseURL: URL, endpoint: String) {
self.endpoint = endpoint
self.decoder = ReCaptchaDecoder { [weak self] result in
self?.handle(result: result)
}
@ -133,6 +137,7 @@ internal class ReCaptchaWebViewManager {
Starts the challenge validation
*/
func validate(on view: UIView) {
onLoadingChanged?(true)
#if DEBUG
guard !shouldSkipForTests else {
completion?(.token(""))
@ -194,6 +199,7 @@ fileprivate extension ReCaptchaWebViewManager {
webView.evaluateJavaScript(Constants.NumberOfDivsCommand) { [weak self] (result, error) -> Void in
if let error = error {
self?.decoder.send(error: .unexpected(error))
self?.onLoadingChanged?(false)
} else {
self?.handleNumberOfDivs(result: result, count: count)
}
@ -227,6 +233,7 @@ fileprivate extension ReCaptchaWebViewManager {
}
} else {
decoder.send(error: .htmlLoadError)
onLoadingChanged?(false)
}
}
@ -238,6 +245,7 @@ fileprivate extension ReCaptchaWebViewManager {
if let error = error {
self?.decoder.send(error: .unexpected(error))
}
self?.onLoadingChanged?(false)
}
}

View File

@ -9,6 +9,10 @@
import RxSwift
import UIKit
public enum ReCaptchaRxError: Error {
case baseWasReleased
}
/// Makes ReCaptcha compatible with RxSwift extensions
extension ReCaptcha: ReactiveCompatible {}
@ -64,4 +68,20 @@ public extension Reactive where Base: ReCaptcha {
base?.reset()
}
}
/**
Observable of loading state
(will not work if someone changes onLoadingChanged variable; current onLodinglChanged will not work after subscription)
*/
var loadingObservable: Observable<Bool> {
return .create { [weak base] observer -> Disposable in
guard let base = base else {
observer.onError(ReCaptchaRxError.baseWasReleased)
return Disposables.create()
}
base.onLoadingChanged = { observer.onNext($0) }
return Disposables.create { [weak base] in base?.onLoadingChanged = nil }
}
}
}