From 615e566c639104bdd0281fb011403edc2fb50b8b Mon Sep 17 00:00:00 2001 From: Dominic Go <18517029+dominicstop@users.noreply.github.com> Date: Mon, 1 May 2023 16:26:15 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=20Refactor:=20Extract=20to=20`RNIM?= =?UTF-8?q?odalUtilities`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Extract helper function in `RNIModalManager` to `RNIModalUtilities`. --- .../UIViewController+Swizzling.swift | 2 +- .../RNIModal/RNIModal+Helpers.swift | 4 +- .../RNIModal/RNIModalManager.swift | 126 ++---------------- .../RNIModal/RNIModalUtilities.swift | 120 +++++++++++++++++ .../RNIModal/RNIModalWindowMap.swift | 8 +- 5 files changed, 138 insertions(+), 122 deletions(-) create mode 100644 ios/src_library/React Native/RNIModal/RNIModalUtilities.swift diff --git a/ios/src_library/Extensions/UIViewController+Swizzling.swift b/ios/src_library/Extensions/UIViewController+Swizzling.swift index 4c8aac21..c87c8a0d 100644 --- a/ios/src_library/Extensions/UIViewController+Swizzling.swift +++ b/ios/src_library/Extensions/UIViewController+Swizzling.swift @@ -100,7 +100,7 @@ extension UIViewController { _ presentedVC: UIViewController? = nil ) -> (any RNIModal)? { - let presentedModal = RNIModalManager.getPresentedModal( + let presentedModal = RNIModalUtilities.getPresentedModal( forPresentingViewController: self, presentedViewController: presentedVC ); diff --git a/ios/src_library/React Native/RNIModal/RNIModal+Helpers.swift b/ios/src_library/React Native/RNIModal/RNIModal+Helpers.swift index 7cfbadb1..bf5c591e 100644 --- a/ios/src_library/React Native/RNIModal/RNIModal+Helpers.swift +++ b/ios/src_library/React Native/RNIModal/RNIModal+Helpers.swift @@ -64,7 +64,7 @@ extension RNIModalState where Self: RNIModalPresentation { let modalVC = self.modalViewController else { return -1 }; - return RNIModalManager.computeModalIndex( + return RNIModalUtilities.computeModalIndex( forWindow: window, forViewController: modalVC ); @@ -75,7 +75,7 @@ extension RNIModalState where Self: RNIModalPresentation { }; public var computedCurrentModalIndex: Int { - RNIModalManager.computeModalIndex(forWindow: self.window); + RNIModalUtilities.computeModalIndex(forWindow: self.window); }; public var synthesizedIsModalInFocus: Bool { diff --git a/ios/src_library/React Native/RNIModal/RNIModalManager.swift b/ios/src_library/React Native/RNIModal/RNIModalManager.swift index 6d3f29a5..10ccaedd 100644 --- a/ios/src_library/React Native/RNIModal/RNIModalManager.swift +++ b/ios/src_library/React Native/RNIModal/RNIModalManager.swift @@ -21,118 +21,6 @@ public class RNIModalManager { public static let sharedInstance = RNIModalManager(); - // MARK: - Static Functions - // ------------------------ - - static func getPresentedModals( - forWindow window: UIWindow - ) -> [any RNIModal] { - - let vcItems = RNIUtilities.getPresentedViewControllers(for: window); - - return vcItems.compactMap { - guard let modalVC = $0 as? RNIModalViewController else { return nil }; - return modalVC.modalViewRef; - }; - }; - - static func computeModalIndex( - forWindow window: UIWindow, - forViewController viewController: UIViewController? = nil - ) -> Int { - - let listPresentedVC = - RNIUtilities.getPresentedViewControllers(for: window); - - var index = -1; - - for vc in listPresentedVC { - if vc.presentingViewController != nil { - index += 1; - }; - - /// A - no `viewController` arg., keep counting until all items in - /// `listPresentedVC` have been exhausted. - guard viewController == nil else { continue }; - - /// B - `viewController` arg. specified, stop counting if found matching - /// instance of `viewController` in `listPresentedVC`. - guard viewController !== vc - else { break }; - }; - - return index; - }; - - static func computeModalIndex( - forWindow window: UIWindow?, - forViewController viewController: UIViewController? = nil - ) -> Int { - guard let window = window else { return -1 }; - - return Self.computeModalIndex( - forWindow: window, - forViewController: viewController - ); - }; - - static func getPresentedModal( - forPresentingViewController presentingVC: UIViewController, - presentedViewController presentedVC: UIViewController? = nil - ) -> (any RNIModal)? { - - let presentedVC = presentedVC ?? presentingVC.presentedViewController; - - /// A - `presentedVC` is a `RNIModalViewController`. - if let presentedModalVC = presentedVC as? RNIModalViewController { - return presentedModalVC.modalViewRef; - }; - - /// B - `presentingVC` is a `RNIModalViewController`. - if let presentingModalVC = presentingVC as? RNIModalViewController, - let presentingModal = presentingModalVC.modalViewRef, - let presentedModalVC = presentingModal.modalVC, - let presentedModal = presentedModalVC.modalViewRef { - - return presentedModal; - }; - - /// C - `presentedVC` has a corresponding `RNIModalViewControllerWrapper` - /// instance associated to it. - if let presentedVC = presentedVC, - let presentedModalWrapper = RNIModalViewControllerWrapperRegistry.get( - forViewController: presentedVC - ) { - - return presentedModalWrapper; - }; - - /// D - `presentingVC` has a `RNIModalViewControllerWrapper` instance - /// associated to it. - if let presentingModalWrapper = RNIModalViewControllerWrapperRegistry.get( - forViewController: presentingVC - ), - let presentedVC = presentingModalWrapper.modalViewController, - let presentedModalWrapper = RNIModalViewControllerWrapperRegistry.get( - forViewController: presentedVC - ) { - - return presentedModalWrapper; - }; - - let topmostVC = RNIUtilities.getTopmostPresentedViewController( - for: presentingVC.view.window - ); - - if let topmostModalVC = topmostVC as? RNIModalViewController, - let topmostModal = topmostModalVC.modalViewRef { - - return topmostModal; - }; - - return nil; - }; - // MARK: - Properties // ------------------ @@ -251,7 +139,9 @@ extension RNIModalManager: RNIModalPresentationNotifiable { /// * The sender will already be in `presentedModalList` despite it being /// not fully presented yet. /// - let presentedModalList = Self.getPresentedModals(forWindow: senderWindow); + let presentedModalList = RNIModalUtilities.getPresentedModals( + forWindow: senderWindow + ); #if DEBUG if windowData.nextModalToFocus != nil { @@ -346,7 +236,10 @@ extension RNIModalManager: RNIModalPresentationNotifiable { }; #endif - let presentedModalList = Self.getPresentedModals(forWindow: senderWindow); + let presentedModalList = RNIModalUtilities.getPresentedModals( + forWindow: senderWindow + ); + windowData.apply(forFocusedModal: sender); #if DEBUG @@ -424,7 +317,10 @@ extension RNIModalManager: RNIModalPresentationNotifiable { }; #endif - let presentedModalList = Self.getPresentedModals(forWindow: senderWindow); + let presentedModalList = RNIModalUtilities.getPresentedModals( + forWindow: senderWindow + ); + windowData.set(nextModalToBlur: sender); #if DEBUG diff --git a/ios/src_library/React Native/RNIModal/RNIModalUtilities.swift b/ios/src_library/React Native/RNIModal/RNIModalUtilities.swift new file mode 100644 index 00000000..f642442b --- /dev/null +++ b/ios/src_library/React Native/RNIModal/RNIModalUtilities.swift @@ -0,0 +1,120 @@ +// +// RNIModalUtilities.swift +// react-native-ios-modal +// +// Created by Dominic Go on 5/1/23. +// + +import Foundation + +public class RNIModalUtilities { + + static func getPresentedModals( + forWindow window: UIWindow + ) -> [any RNIModal] { + + let vcItems = RNIUtilities.getPresentedViewControllers(for: window); + + return vcItems.compactMap { + guard let modalVC = $0 as? RNIModalViewController else { return nil }; + return modalVC.modalViewRef; + }; + }; + + static func computeModalIndex( + forWindow window: UIWindow, + forViewController viewController: UIViewController? = nil + ) -> Int { + + let listPresentedVC = + RNIUtilities.getPresentedViewControllers(for: window); + + var index = -1; + + for vc in listPresentedVC { + if vc.presentingViewController != nil { + index += 1; + }; + + /// A - no `viewController` arg., keep counting until all items in + /// `listPresentedVC` have been exhausted. + guard viewController == nil else { continue }; + + /// B - `viewController` arg. specified, stop counting if found matching + /// instance of `viewController` in `listPresentedVC`. + guard viewController !== vc + else { break }; + }; + + return index; + }; + + static func computeModalIndex( + forWindow window: UIWindow?, + forViewController viewController: UIViewController? = nil + ) -> Int { + guard let window = window else { return -1 }; + + return Self.computeModalIndex( + forWindow: window, + forViewController: viewController + ); + }; + + static func getPresentedModal( + forPresentingViewController presentingVC: UIViewController, + presentedViewController presentedVC: UIViewController? = nil + ) -> (any RNIModal)? { + + let presentedVC = presentedVC ?? presentingVC.presentedViewController; + + /// A - `presentedVC` is a `RNIModalViewController`. + if let presentedModalVC = presentedVC as? RNIModalViewController { + return presentedModalVC.modalViewRef; + }; + + /// B - `presentingVC` is a `RNIModalViewController`. + if let presentingModalVC = presentingVC as? RNIModalViewController, + let presentingModal = presentingModalVC.modalViewRef, + let presentedModalVC = presentingModal.modalVC, + let presentedModal = presentedModalVC.modalViewRef { + + return presentedModal; + }; + + /// C - `presentedVC` has a corresponding `RNIModalViewControllerWrapper` + /// instance associated to it. + if let presentedVC = presentedVC, + let presentedModalWrapper = RNIModalViewControllerWrapperRegistry.get( + forViewController: presentedVC + ) { + + return presentedModalWrapper; + }; + + /// D - `presentingVC` has a `RNIModalViewControllerWrapper` instance + /// associated to it. + if let presentingModalWrapper = RNIModalViewControllerWrapperRegistry.get( + forViewController: presentingVC + ), + let presentedVC = presentingModalWrapper.modalViewController, + let presentedModalWrapper = RNIModalViewControllerWrapperRegistry.get( + forViewController: presentedVC + ) { + + return presentedModalWrapper; + }; + + let topmostVC = RNIUtilities.getTopmostPresentedViewController( + for: presentingVC.view.window + ); + + if let topmostModalVC = topmostVC as? RNIModalViewController, + let topmostModal = topmostModalVC.modalViewRef { + + return topmostModal; + }; + + return nil; + }; +}; diff --git a/ios/src_library/React Native/RNIModal/RNIModalWindowMap.swift b/ios/src_library/React Native/RNIModal/RNIModalWindowMap.swift index aeae2418..d71b65f8 100644 --- a/ios/src_library/React Native/RNIModal/RNIModalWindowMap.swift +++ b/ios/src_library/React Native/RNIModal/RNIModalWindowMap.swift @@ -39,7 +39,7 @@ internal class RNIWindowMapData { self.nextModalToFocus = modalToFocus; let modalIndexCurrent = - RNIModalManager.computeModalIndex(forWindow: modalToFocus.window); + RNIModalUtilities.computeModalIndex(forWindow: modalToFocus.window); let modalIndexPrev = self.modalIndexCurrent; @@ -52,7 +52,7 @@ internal class RNIWindowMapData { self.nextModalToFocus = nil; let modalIndexCurrent = - RNIModalManager.computeModalIndex(forWindow: focusedModal.window); + RNIModalUtilities.computeModalIndex(forWindow: focusedModal.window); let modalIndexPrev = self.modalIndexCurrent; @@ -68,7 +68,7 @@ internal class RNIWindowMapData { self.nextModalToBlur = modalToBlur; let modalIndexCurrent = - RNIModalManager.computeModalIndex(forWindow: modalToBlur.window); + RNIModalUtilities.computeModalIndex(forWindow: modalToBlur.window); let modalIndexPrev = self.modalIndexCurrent; @@ -81,7 +81,7 @@ internal class RNIWindowMapData { self.nextModalToBlur = nil; let modalIndexCurrent = - RNIModalManager.computeModalIndex(forWindow: blurredModal.window); + RNIModalUtilities.computeModalIndex(forWindow: blurredModal.window); let modalIndexPrev = self.modalIndexCurrent;