Skip to content

Commit

Permalink
Updated WKNavigation delegate method reactive wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
monibu1548 authored and freak4pc committed Feb 12, 2020
1 parent 15693dd commit 424bfd0
Showing 1 changed file with 32 additions and 19 deletions.
51 changes: 32 additions & 19 deletions RxWebKit/Sources/WKNavigationDelegateEvents+Rx.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,6 @@ extension Reactive where Base: WKWebView {
public typealias ActionHandler = (WKNavigationActionPolicy) -> Void
/// WKNavigationActionPolicyEvent emits a tuple event of WKWebView + WKNavigationAction + ActionHandler
public typealias WKNavigationActionPolicyEvent = ( webView: WKWebView, action: WKNavigationAction, handler: ActionHandler)

private func navigationEventWith(_ arg: [Any]) throws -> WKNavigationEvent {
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
return (view, nav)
}

private func navigationFailEventWith(_ arg: [Any]) throws -> WKNavigationFailEvent {
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
let error = try castOrThrow(Swift.Error.self, arg[2])
return (view, nav, error)
}

/// Reactive wrapper for `navigationDelegate`.
public var delegate: DelegateProxy<WKWebView, WKNavigationDelegate> {
Expand All @@ -65,23 +52,35 @@ extension Reactive where Base: WKWebView {
public var didCommitNavigation: ControlEvent<WKNavigationEvent> {
let source: Observable<WKNavigationEvent> = delegate
.methodInvoked(.didCommitNavigation)
.map(navigationEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
return (view, nav)
}
return ControlEvent(events: source)
}

/// Reactive wrapper for delegate method `webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)`.
public var didStartProvisionalNavigation: ControlEvent<WKNavigationEvent> {
let source: Observable<WKNavigationEvent> = delegate
.methodInvoked(.didStartProvisionalNavigation)
.map(navigationEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
return (view, nav)
}
return ControlEvent(events: source)
}

/// Reactive wrapper for delegate method `webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)`
public var didFinishNavigation: ControlEvent<WKNavigationEvent> {
let source: Observable<WKNavigationEvent> = delegate
.methodInvoked(.didFinishNavigation)
.map(navigationEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
return (view, nav)
}
return ControlEvent(events: source)
}

Expand All @@ -98,23 +97,37 @@ extension Reactive where Base: WKWebView {
public var didReceiveServerRedirectForProvisionalNavigation: ControlEvent<WKNavigationEvent> {
let source: Observable<WKNavigationEvent> = delegate
.methodInvoked(.didReceiveServerRedirectForProvisionalNavigation)
.map(navigationEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
return (view, nav)
}
return ControlEvent(events: source)
}

/// Reactive wrapper for delegate method `webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)`.
public var didFailNavigation: ControlEvent<WKNavigationFailEvent> {
let source: Observable<WKNavigationFailEvent> = delegate
.methodInvoked(.didFailNavigation)
.map(navigationFailEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
let error = try castOrThrow(Swift.Error.self, arg[2])
return (view, nav, error)
}
return ControlEvent(events: source)
}

/// Reactive wrapper for delegate method `webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error)`.
public var didFailProvisionalNavigation: ControlEvent<WKNavigationFailEvent> {
let source: Observable<WKNavigationFailEvent> = delegate
.methodInvoked(.didFailProvisionalNavigation)
.map(navigationFailEventWith)
.map { arg in
let view = try castOrThrow(WKWebView.self, arg[0])
let nav = try castOrThrow(WKNavigation.self, arg[1])
let error = try castOrThrow(Swift.Error.self, arg[2])
return (view, nav, error)
}
return ControlEvent(events: source)
}

Expand Down

0 comments on commit 424bfd0

Please sign in to comment.