#import "RNNComponentViewController.h" #import "RNNAnimationsTransitionDelegate.h" #import "UIViewController+LayoutProtocol.h" @implementation RNNComponentViewController @synthesize previewCallback; - (instancetype)initWithLayoutInfo:(RNNLayoutInfo *)layoutInfo rootViewCreator:(id)creator eventEmitter:(RNNEventEmitter *)eventEmitter presenter:(RNNComponentPresenter *)presenter options:(RNNNavigationOptions *)options defaultOptions:(RNNNavigationOptions *)defaultOptions { self = [super initWithLayoutInfo:layoutInfo creator:creator options:options defaultOptions:defaultOptions presenter:presenter eventEmitter:eventEmitter childViewControllers:nil]; self.animator = [[RNNAnimator alloc] initWithTransitionOptions:self.resolveOptions.customTransition]; return self; } - (void)setDefaultOptions:(RNNNavigationOptions *)defaultOptions { _defaultOptions = defaultOptions; [_presenter setDefaultOptions:defaultOptions]; } - (void)overrideOptions:(RNNNavigationOptions *)options { [self.options overrideOptions:options]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [_presenter applyOptions:self.resolveOptions]; [self.parentViewController onChildWillAppear]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self componentDidAppear]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [self componentDidDisappear]; } - (void)loadView { [self renderReactViewIfNeeded]; } - (void)render { if (!self.waitForRender) [self readyForPresentation]; [self renderReactViewIfNeeded]; } - (void)renderReactViewIfNeeded { if (!self.isViewLoaded) { self.view = [self.creator createRootView:self.layoutInfo.name rootViewId:self.layoutInfo.componentId ofType:RNNComponentTypeComponent reactViewReadyBlock:^{ [self->_presenter renderComponents:self.resolveOptions perform:^{ [self readyForPresentation]; }]; }]; } else { [self readyForPresentation]; } } - (UIViewController *)getCurrentChild { return nil; } -(void)updateSearchResultsForSearchController:(UISearchController *)searchController { [self.eventEmitter sendOnSearchBarUpdated:self.layoutInfo.componentId text:searchController.searchBar.text isFocused:searchController.searchBar.isFirstResponder]; } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [self.eventEmitter sendOnSearchBarCancelPressed:self.layoutInfo.componentId]; } -(BOOL)isCustomTransitioned { return self.resolveOptions.customTransition.animations != nil; } - (BOOL)prefersStatusBarHidden { return [_presenter isStatusBarVisibility:self.navigationController resolvedOptions:self.resolveOptions]; } - (UIStatusBarStyle)preferredStatusBarStyle { return [_presenter getStatusBarStyle:[self resolveOptions]]; } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ RNNComponentViewController* vc = (RNNComponentViewController*)viewController; if (![[vc.self.resolveOptions.topBar.backButton.transition getWithDefaultValue:@""] isEqualToString:@"custom"]){ navigationController.delegate = nil; } } - (id)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC { if (self.animator) { return self.animator; } else if (operation == UINavigationControllerOperationPush && self.resolveOptions.animations.push.hasCustomAnimation) { return [[RNNAnimationsTransitionDelegate alloc] initWithScreenTransition:self.resolveOptions.animations.push isDismiss:NO]; } else if (operation == UINavigationControllerOperationPop && self.resolveOptions.animations.pop.hasCustomAnimation) { return [[RNNAnimationsTransitionDelegate alloc] initWithScreenTransition:self.resolveOptions.animations.pop isDismiss:YES]; } else { return nil; } return nil; } - (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location{ return self.previewController; } - (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit { if (self.previewCallback) { self.previewCallback(self); } } - (void)onActionPress:(NSString *)id { [_eventEmitter sendOnNavigationButtonPressed:self.layoutInfo.componentId buttonId:id]; } - (UIPreviewAction *) convertAction:(NSDictionary *)action { NSString *actionId = action[@"id"]; NSString *actionTitle = action[@"title"]; UIPreviewActionStyle actionStyle = UIPreviewActionStyleDefault; if ([action[@"style"] isEqualToString:@"selected"]) { actionStyle = UIPreviewActionStyleSelected; } else if ([action[@"style"] isEqualToString:@"destructive"]) { actionStyle = UIPreviewActionStyleDestructive; } return [UIPreviewAction actionWithTitle:actionTitle style:actionStyle handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) { [self onActionPress:actionId]; }]; } - (NSArray> *)previewActionItems { NSMutableArray *actions = [[NSMutableArray alloc] init]; for (NSDictionary *previewAction in self.resolveOptions.preview.actions) { UIPreviewAction *action = [self convertAction:previewAction]; NSDictionary *actionActions = previewAction[@"actions"]; if (actionActions.count > 0) { NSMutableArray *group = [[NSMutableArray alloc] init]; for (NSDictionary *previewGroupAction in actionActions) { [group addObject:[self convertAction:previewGroupAction]]; } UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:action.title style:UIPreviewActionStyleDefault actions:group]; [actions addObject:actionGroup]; } else { [actions addObject:action]; } } return actions; } -(void)onButtonPress:(RNNUIBarButtonItem *)barButtonItem { [self.eventEmitter sendOnNavigationButtonPressed:self.layoutInfo.componentId buttonId:barButtonItem.buttonId]; } @end