Skip to content

Commit

Permalink
💫 Update RNIContextMenuViewController
Browse files Browse the repository at this point in the history
Summary: Final impl. WIP
  • Loading branch information
dominicstop committed Mar 12, 2022
1 parent 831c668 commit 5b05515
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 27 deletions.
88 changes: 63 additions & 25 deletions ios/Src/ReactNative/RNIHelpers/RNIContainerViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ import UIKit;
// TODO: move to sep. library (e.g. `react-native-ios-utilities`)
class RNIContextMenuViewController: UIViewController {

var didAttachToParentVC = false;

weak var parentVC: UIViewController?;
weak var eventsDelegate: RNIContainerViewControllerEventsDelegate?;

var isAttachedToParentVC = false;
var isBeingPopped = false;

// MARK: - Init
// ------------

Expand All @@ -35,38 +36,75 @@ class RNIContextMenuViewController: UIViewController {
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated);

guard let navVC = self.navigationController,
let parentVC = self.parentVC
else { return };
self.isBeingPopped = {
guard let navVC = self.navigationController,
let parentVC = self.parentVC,

// if parent VC still exist in the stack, then it hasn't been popped yet
navVC.viewControllers.contains(parentVC)
else { return false };

return true;
}();

// if parent VC still exist in the stack, then it hasn't been popped yet
let isPopping = !navVC.viewControllers.contains(parentVC);
self.eventsDelegate?.onViewControllerWillDisappear(
sender: self,
parentVC: parentVC,
isBeingPopped: self.isBeingPopped
);
};

override func viewDidDisappear(_ animated: Bool) {
self.eventsDelegate?.onViewControllerWillDisappear(
sender: self,
parentVC: parentVC,
isBeingPopped: self.isBeingPopped
);

if isPopping {

};
}
// reset
self.isBeingPopped = false;
};

// MARK: - Public Methods
// ----------------------

func attachToParentVC() throws {
guard !self.didAttachToParentVC,
// find the nearest parent view controller
let parentVC = RNIUtilities
.getParent(responder: self, type: UIViewController.self)

func attachToParentVC() throws -> UIViewController {
guard !self.isAttachedToParentVC else {
throw RNIPopoverGenericError(
code: .runtimeError,
message: "view controller already has a parent view controller"
);
};

// find the nearest parent view controller
guard let parentVC = RNIUtilities
.getParent(responder: self, type: UIViewController.self)
else {
throw RNIPopoverGenericError(code: .nilError, message: <#T##String?#>, debug: <#T##String?#>)
throw RNIPopoverGenericError(
code: .nilValue,
message: "Could not find any view controllers to attach to"
);
};

self.didAttachToParentVC = true;
self.parentVC = parentVC;
self.isAttachedToParentVC = true;

parentVC.addChild(self);
self.didMove(toParent: parentVC);

let childVC = RNIContextMenuViewController(contextMenuView: self);
childVC.parentVC = parentVC;
return parentVC;
};

func detachFromParentVC(){
guard self.parentVC != nil,
!self.isAttachedToParentVC
else { return };

self.contextMenuViewController = childVC;

parentVC.addChild(childVC);
childVC.didMove(toParent: parentVC);
// reset
self.parentVC = nil;
self.isAttachedToParentVC = false;

self.willMove(toParent: nil);
self.removeFromParent();
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,35 @@ import Foundation
protocol RNIContainerViewControllerEventsDelegate: AnyObject {

func onViewControllerWillDisappear(
sender: RNIContainerViewControllerEventsDelegate
sender: RNIContextMenuViewController,
parentVC: UIViewController,
isBeingPopped: Bool
);

func onViewControllerDidDisappear(
sender: RNIContainerViewControllerEventsDelegate
sender: RNIContextMenuViewController,
parentVC: UIViewController,
isBeingPopped: Bool
);
};

// make protocol conformance optional by adding a default impl. that is empty
// w/o using `@objc`'s `optional` keyword.
extension RNIContainerViewControllerEventsDelegate {

func onViewControllerWillDisappear(
sender: RNIContextMenuViewController,
parentVC: UIViewController?,
isBeingPopped: Bool
) {
/** no-op */
};

func onViewControllerDidDisappear(
sender: RNIContextMenuViewController,
parentVC: UIViewController?,
isBeingPopped: Bool
) {
/** no-op */
};
};

0 comments on commit 5b05515

Please sign in to comment.