|
@@ -8,6 +8,7 @@
|
8
|
8
|
#import "RNCWKWebView.h"
|
9
|
9
|
#import <React/RCTConvert.h>
|
10
|
10
|
#import <React/RCTAutoInsetsProtocol.h>
|
|
11
|
+#import <UIKit/UIKit.h>
|
11
|
12
|
|
12
|
13
|
#import "objc/runtime.h"
|
13
|
14
|
|
|
@@ -339,6 +340,88 @@ static NSString *const MessageHanderName = @"ReactNative";
|
339
|
340
|
|
340
|
341
|
#pragma mark - WKNavigationDelegate methods
|
341
|
342
|
|
|
343
|
+/**
|
|
344
|
+* alert
|
|
345
|
+*/
|
|
346
|
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
|
|
347
|
+{
|
|
348
|
+ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
|
|
349
|
+ [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
|
|
350
|
+ completionHandler();
|
|
351
|
+ }]];
|
|
352
|
+ [[self topViewController] presentViewController:alert animated:YES completion:NULL];
|
|
353
|
+
|
|
354
|
+}
|
|
355
|
+
|
|
356
|
+/**
|
|
357
|
+* confirm
|
|
358
|
+*/
|
|
359
|
+- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
|
|
360
|
+ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
|
|
361
|
+ [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
|
|
362
|
+ completionHandler(YES);
|
|
363
|
+ }]];
|
|
364
|
+ [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
|
|
365
|
+ completionHandler(NO);
|
|
366
|
+ }]];
|
|
367
|
+ [[self topViewController] presentViewController:alert animated:YES completion:NULL];
|
|
368
|
+}
|
|
369
|
+
|
|
370
|
+/**
|
|
371
|
+* prompt
|
|
372
|
+*/
|
|
373
|
+- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler{
|
|
374
|
+ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:prompt preferredStyle:UIAlertControllerStyleAlert];
|
|
375
|
+ [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
|
|
376
|
+ textField.textColor = [UIColor lightGrayColor];
|
|
377
|
+ textField.placeholder = defaultText;
|
|
378
|
+ }];
|
|
379
|
+ [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
|
|
380
|
+ completionHandler([[alert.textFields lastObject] text]);
|
|
381
|
+ }]];
|
|
382
|
+ [[self topViewController] presentViewController:alert animated:YES completion:NULL];
|
|
383
|
+}
|
|
384
|
+
|
|
385
|
+/**
|
|
386
|
+ * topViewController
|
|
387
|
+ */
|
|
388
|
+-(UIViewController *)topViewController{
|
|
389
|
+ UIViewController *controller = [self topViewControllerWithRootViewController:[self getCurrentWindow].rootViewController];
|
|
390
|
+ return controller;
|
|
391
|
+}
|
|
392
|
+
|
|
393
|
+/**
|
|
394
|
+ * topViewControllerWithRootViewController
|
|
395
|
+ */
|
|
396
|
+-(UIViewController *)topViewControllerWithRootViewController:(UIViewController *)viewController{
|
|
397
|
+ if (viewController==nil) return nil;
|
|
398
|
+ if (viewController.presentedViewController!=nil) {
|
|
399
|
+ return [self topViewControllerWithRootViewController:viewController.presentedViewController];
|
|
400
|
+ } else if ([viewController isKindOfClass:[UITabBarController class]]){
|
|
401
|
+ return [self topViewControllerWithRootViewController:[(UITabBarController *)viewController selectedViewController]];
|
|
402
|
+ } else if ([viewController isKindOfClass:[UINavigationController class]]){
|
|
403
|
+ return [self topViewControllerWithRootViewController:[(UINavigationController *)viewController visibleViewController]];
|
|
404
|
+ } else {
|
|
405
|
+ return viewController;
|
|
406
|
+ }
|
|
407
|
+}
|
|
408
|
+/**
|
|
409
|
+ * getCurrentWindow
|
|
410
|
+ */
|
|
411
|
+-(UIWindow *)getCurrentWindow{
|
|
412
|
+ UIWindow *window = [UIApplication sharedApplication].keyWindow;
|
|
413
|
+ if (window.windowLevel!=UIWindowLevelNormal) {
|
|
414
|
+ for (UIWindow *wid in [UIApplication sharedApplication].windows) {
|
|
415
|
+ if (window.windowLevel==UIWindowLevelNormal) {
|
|
416
|
+ window = wid;
|
|
417
|
+ break;
|
|
418
|
+ }
|
|
419
|
+ }
|
|
420
|
+ }
|
|
421
|
+ return window;
|
|
422
|
+}
|
|
423
|
+
|
|
424
|
+
|
342
|
425
|
/**
|
343
|
426
|
* Decides whether to allow or cancel a navigation.
|
344
|
427
|
* @see https://fburl.com/42r9fxob
|