From c9e67405e1e818e141edbcba87d067c6a651c998 Mon Sep 17 00:00:00 2001 From: tarun-gujjula Date: Tue, 21 Jun 2022 08:53:07 +0530 Subject: [PATCH 01/19] Updated ios --- index.js | 8 - index.ts | 12 + ios/Podfile | 14 + ios/Podfile.lock | 22 + ios/Pods/Manifest.lock | 22 + ios/Pods/Pods.xcodeproj/project.pbxproj | 1749 + ios/Pods/React/LICENSE | 30 + ios/Pods/React/LICENSE-CustomComponents | 9 + ios/Pods/React/LICENSE-docs | 393 + ios/Pods/React/LICENSE-examples | 9 + .../Libraries/ART/ARTSerializablePath.js | 76 + .../React/Libraries/ART/ReactNativeART.js | 584 + .../ActionSheetIOS/ActionSheetIOS.js | 60 + .../React/Libraries/AdSupport/AdSupportIOS.js | 24 + ios/Pods/React/Libraries/Animated/Animated.js | 1309 + ios/Pods/React/Libraries/Animated/Easing.js | 148 + .../React/Libraries/Animated/Interpolation.js | 265 + .../React/Libraries/Animated/SpringConfig.js | 102 + .../Animated/__tests__/Animated-test.js | 516 + .../Animated/__tests__/Easing-test.js | 119 + .../Animated/__tests__/Interpolation-test.js | 256 + ios/Pods/React/Libraries/Animation/bezier.js | 80 + .../Libraries/AppRegistry/AppRegistry.js | 92 + .../AppStateIOS/AppStateIOS.android.js | 30 + .../Libraries/AppStateIOS/AppStateIOS.ios.js | 143 + .../Libraries/BatchedBridge/BatchedBridge.js | 20 + .../BatchedBridgedModules/NativeModules.js | 20 + .../RCTAlertManager.ios.js | 16 + .../BatchedBridgedModules/RCTEventEmitter.js | 17 + .../__mocks__/NativeModules.js | 49 + .../React/Libraries/CameraRoll/CameraRoll.js | 189 + .../ActivityIndicatorIOS.ios.js | 105 + .../DatePicker/DatePickerIOS.ios.js | 150 + .../Libraries/Components/MapView/MapView.js | 283 + .../Components/Navigation/NavigatorIOS.ios.js | 683 + .../ProgressBarAndroid.ios.js | 8 + .../ProgressViewIOS.android.js | 49 + .../ProgressViewIOS/ProgressViewIOS.ios.js | 82 + .../Libraries/Components/ScrollResponder.js | 508 + .../Components/ScrollView/ScrollView.js | 451 + .../SegmentedControlIOS.android.js | 49 + .../SegmentedControlIOS.ios.js | 113 + .../Components/SliderIOS/SliderIOS.ios.js | 112 + .../Libraries/Components/StaticRenderer.js | 31 + .../Components/StatusBar/StatusBarIOS.ios.js | 44 + .../Libraries/Components/Subscribable.js | 64 + .../Components/SwitchIOS/SwitchIOS.android.js | 46 + .../Components/SwitchIOS/SwitchIOS.ios.js | 113 + .../Components/TabBarIOS/TabBarIOS.android.js | 34 + .../Components/TabBarIOS/TabBarIOS.ios.js | 63 + .../TabBarIOS/TabBarItemIOS.android.js | 44 + .../Components/TabBarIOS/TabBarItemIOS.ios.js | 138 + .../Components/TextInput/TextInput.js | 578 + .../Components/TextInput/TextInputState.js | 76 + .../Components/Touchable/TouchableBounce.js | 129 + .../Touchable/TouchableHighlight.js | 242 + .../Touchable/TouchableNativeFeedback.ios.js | 46 + .../Components/Touchable/TouchableOpacity.js | 182 + .../Touchable/TouchableWithoutFeedback.js | 126 + .../Touchable/ensureComponentIsNative.js | 24 + .../Touchable/ensurePositiveDelayProps.js | 24 + .../UnimplementedViews/UnimplementedView.js | 37 + .../React/Libraries/Components/View/View.js | 306 + .../Components/View/ViewStylePropTypes.js | 47 + .../Components/WebView/WebView.android.js | 207 + .../Components/WebView/WebView.ios.js | 266 + .../CustomComponents/ListView/ListView.js | 588 + .../ListView/ListViewDataSource.js | 407 + .../Navigator/Navigation/NavigationContext.js | 96 + .../Navigator/Navigation/NavigationEvent.js | 120 + .../Navigation/NavigationEventEmitter.js | 85 + .../Navigation/NavigationRouteStack.js | 264 + .../__tests__/NavigationContext-test.js | 52 + .../__tests__/NavigationEvent-test.js | 71 + .../__tests__/NavigationEventEmitter-test.js | 160 + .../__tests__/NavigationRouteStack-test.js | 433 + .../CustomComponents/Navigator/Navigator.js | 1114 + .../NavigatorBreadcrumbNavigationBar.js | 278 + ...igatorBreadcrumbNavigationBarStyles.ios.js | 227 + .../Navigator/NavigatorNavigationBar.js | 204 + .../NavigatorNavigationBarStyles.ios.js | 175 + .../Navigator/NavigatorSceneConfigs.js | 621 + .../RCTDebugComponentOwnership.js | 55 + .../Libraries/Device/RCTDeviceEventEmitter.js | 18 + .../React/Libraries/Devtools/setupDevtools.js | 105 + ios/Pods/React/Libraries/Fetch/fetch.js | 381 + .../Libraries/Geolocation/Geolocation.js | 125 + .../React/Libraries/Image/AssetRegistry.js | 20 + ios/Pods/React/Libraries/Image/Image.ios.js | 203 + .../React/Libraries/Image/ImagePickerIOS.js | 40 + .../React/Libraries/Image/ImageResizeMode.js | 39 + ios/Pods/React/Libraries/Image/ImageSource.js | 17 + .../Libraries/Image/ImageStylePropTypes.js | 35 + .../__tests__/resolveAssetSource-test.js | 194 + .../Libraries/Image/resolveAssetSource.js | 139 + .../React/Libraries/Inspector/BorderBox.js | 38 + .../React/Libraries/Inspector/BoxInspector.js | 113 + .../React/Libraries/Inspector/ElementBox.js | 74 + .../Libraries/Inspector/ElementProperties.js | 108 + .../React/Libraries/Inspector/Inspector.js | 191 + .../Libraries/Inspector/InspectorOverlay.js | 85 + .../Libraries/Inspector/InspectorPanel.js | 132 + .../Libraries/Inspector/InspectorUtils.js | 65 + .../Libraries/Inspector/PerformanceOverlay.js | 67 + .../Libraries/Inspector/StyleInspector.js | 63 + .../Libraries/Inspector/resolveBoxStyle.js | 59 + .../Interaction/InteractionManager.js | 156 + .../Libraries/Interaction/InteractionMixin.js | 50 + .../Initialization/ExceptionsManager.js | 127 + .../InitializeJavaScriptAppEngine.js | 154 + .../Initialization/SourceMap.js | 1966 ++ .../__tests__/parseErrorStack-test.js | 49 + .../Initialization/checkFlowAtRuntime.js | 59 + .../Initialization/loadSourceMap.js | 66 + .../Initialization/parseErrorStack.js | 49 + .../Initialization/source-map-url.js | 79 + .../System/JSTimers/JSTimers.js | 137 + .../System/JSTimers/JSTimersExecution.js | 133 + .../JavaScriptAppEngine/polyfills/document.js | 34 + .../LayoutAnimation/LayoutAnimation.js | 154 + .../React/Libraries/LinkingIOS/LinkingIOS.js | 156 + ios/Pods/React/Libraries/Modal/Modal.js | 61 + .../NativeApp/RCTNativeAppEventEmitter.js | 18 + ios/Pods/React/Libraries/Network/FormData.js | 95 + ios/Pods/React/Libraries/Network/NetInfo.js | 242 + .../Libraries/Network/XMLHttpRequest.ios.js | 131 + .../Libraries/Network/XMLHttpRequestBase.js | 186 + .../Libraries/Picker/PickerIOS.android.js | 15 + .../React/Libraries/Picker/PickerIOS.ios.js | 116 + ios/Pods/React/Libraries/Portal/Portal.js | 175 + ios/Pods/React/Libraries/Promise.js | 37 + .../PushNotificationIOS.js | 270 + .../RKBackendNode/queryLayoutByID.js | 60 + .../ReactIOS/IOSDefaultEventPluginOrder.js | 19 + .../ReactIOS/IOSNativeBridgeEventPlugin.js | 77 + .../Libraries/ReactIOS/NativeMethodsMixin.js | 151 + .../React/Libraries/ReactIOS/WarningBox.js | 393 + .../__tests__/diffRawProperties-test.js | 150 + .../Libraries/ReactIOS/diffRawProperties.js | 118 + .../ReactIOS/renderApplication.ios.js | 98 + .../ReactIOS/requireNativeComponent.js | 83 + .../Libraries/ReactIOS/verifyPropTypes.js | 55 + ios/Pods/React/Libraries/ReactNative/React.js | 14 + .../Libraries/ReactNative/ReactNative.js | 135 + .../ReactNative/ReactNativeBaseComponent.js | 293 + .../ReactNativeBaseComponentEnvironment.js | 42 + .../ReactNative/ReactNativeDOMIDOperations.js | 102 + .../ReactNativeDefaultInjection.js | 107 + .../ReactNative/ReactNativeEventEmitter.js | 214 + .../ReactNativeGlobalInteractionHandler.js | 33 + .../ReactNativeGlobalResponderHandler.js | 30 + .../Libraries/ReactNative/ReactNativeMount.js | 271 + .../ReactNativeReconcileTransaction.js | 103 + .../ReactNative/ReactNativeStyleAttributes.js | 35 + .../ReactNative/ReactNativeTagHandles.js | 113 + .../ReactNative/ReactNativeTextComponent.js | 73 + .../ReactNative/ReactNativeViewAttributes.js | 46 + .../createReactNativeComponentClass.js | 47 + .../Libraries/ReactNative/findNodeHandle.js | 112 + .../React/Libraries/Sample/Sample.android.js | 17 + ios/Pods/React/Libraries/Sample/Sample.ios.js | 20 + .../Libraries/Settings/Settings.android.js | 34 + .../React/Libraries/Settings/Settings.ios.js | 76 + .../Libraries/Storage/AsyncStorage.ios.js | 266 + .../StyleSheet/EdgeInsetsPropType.js | 25 + .../Libraries/StyleSheet/LayoutPropTypes.js | 98 + .../Libraries/StyleSheet/PointPropType.js | 23 + .../React/Libraries/StyleSheet/StyleSheet.js | 72 + .../StyleSheet/StyleSheetPropType.js | 32 + .../StyleSheet/StyleSheetRegistry.js | 44 + .../StyleSheet/StyleSheetValidation.js | 73 + .../StyleSheet/TransformPropTypes.js | 47 + .../Libraries/StyleSheet/flattenStyle.js | 53 + .../Libraries/StyleSheet/precomputeStyle.js | 196 + .../React/Libraries/StyleSheet/styleDiffer.js | 61 + ios/Pods/React/Libraries/Text/Text.js | 249 + .../Libraries/Text/TextStylePropTypes.js | 82 + .../React/Libraries/Text/TextUpdateTest.js | 61 + .../React/Libraries/Utilities/AlertIOS.js | 118 + .../Libraries/Utilities/BackAndroid.ios.js | 21 + .../Libraries/Utilities/BridgeProfiling.js | 52 + .../React/Libraries/Utilities/CSSVarConfig.js | 62 + .../React/Libraries/Utilities/Dimensions.js | 69 + .../React/Libraries/Utilities/ErrorUtils.js | 27 + .../React/Libraries/Utilities/MatrixMath.js | 584 + .../React/Libraries/Utilities/MessageQueue.js | 265 + .../Libraries/Utilities/PerformanceLogger.js | 105 + .../React/Libraries/Utilities/PixelRatio.js | 98 + .../React/Libraries/Utilities/Platform.ios.js | 19 + ios/Pods/React/Libraries/Utilities/RCTLog.js | 42 + .../Libraries/Utilities/RCTRenderingPerf.js | 79 + .../Utilities/__mocks__/ErrorUtils.js | 23 + .../Utilities/__mocks__/PixelRatio.js | 20 + .../Utilities/__tests__/MatrixMath-test.js | 140 + .../Utilities/__tests__/MessageQueue-test.js | 141 + .../Utilities/buildStyleInterpolator.js | 560 + .../Utilities/createStrictShapeTypeChecker.js | 79 + ios/Pods/React/Libraries/Utilities/cssVar.js | 18 + .../deepFreezeAndThrowOnMutationInDev.js | 65 + .../differ/__tests__/deepDiffer-test.js | 102 + .../Libraries/Utilities/differ/deepDiffer.js | 66 + .../Utilities/differ/insetsDiffer.js | 42 + .../Utilities/differ/matricesDiffer.js | 44 + .../Utilities/differ/pointsDiffer.js | 30 + .../Libraries/Utilities/differ/sizesDiffer.js | 19 + .../Libraries/Utilities/dismissKeyboard.js | 16 + .../Libraries/Utilities/groupByEveryN.js | 52 + .../React/Libraries/Utilities/logError.js | 28 + .../Libraries/Utilities/mapWithSeparator.js | 19 + .../React/Libraries/Utilities/mergeFast.js | 34 + .../Libraries/Utilities/mergeIntoFast.js | 27 + .../Utilities/nativeModulePrefixNormalizer.js | 32 + .../Libraries/Utilities/stringifySafe.js | 49 + .../React/Libraries/Utilities/truncate.js | 47 + .../Vibration/VibrationIOS.android.js | 23 + .../Libraries/Vibration/VibrationIOS.ios.js | 39 + .../Libraries/WebSocket/WebSocket.android.js | 39 + .../Libraries/WebSocket/WebSocket.ios.js | 104 + .../Libraries/WebSocket/WebSocketBase.js | 97 + .../react-native/react-native-interface.js | 26 + .../Libraries/react-native/react-native.js | 98 + ios/Pods/React/Libraries/vendor/core/Map.js | 626 + ios/Pods/React/Libraries/vendor/core/Set.js | 201 + .../core/_shouldPolyfillES6Collection.js | 78 + .../Libraries/vendor/core/clearImmediate.js | 19 + .../Libraries/vendor/core/copyProperties.js | 53 + .../Libraries/vendor/core/getObjectValues.js | 36 + ios/Pods/React/Libraries/vendor/core/guid.js | 31 + .../vendor/core/immediate/setImmediate.js | 201 + .../React/Libraries/vendor/core/isEmpty.js | 34 + ios/Pods/React/Libraries/vendor/core/merge.js | 50 + .../Libraries/vendor/core/mergeHelpers.js | 160 + .../React/Libraries/vendor/core/mergeInto.js | 59 + .../Libraries/vendor/core/setImmediate.js | 19 + .../Libraries/vendor/core/throwImmediate.js | 38 + .../React/Libraries/vendor/core/toIterator.js | 180 + .../React/Libraries/vendor/crypto/crc32.js | 92 + .../selection/DocumentSelectionState.js | 156 + .../vendor/emitter/EmitterSubscription.js | 42 + .../Libraries/vendor/emitter/EventEmitter.js | 182 + .../vendor/emitter/EventEmitterWithHolding.js | 164 + .../Libraries/vendor/emitter/EventHolder.js | 123 + .../vendor/emitter/EventSubscription.js | 42 + .../vendor/emitter/EventSubscriptionVendor.js | 101 + .../vendor/emitter/EventValidator.js | 144 + .../vendor/emitter/mixInEventEmitter.js | 135 + .../browser/eventPlugins/PanResponder.js | 361 + .../eventPlugins/ResponderEventPlugin.js | 612 + .../browser/eventPlugins/TouchHistoryMath.js | 122 + .../Libraries/vendor/react/core/clamp.js | 35 + .../vendor/react/event/EventPropagators.js | 163 + .../vendor/react/platform/NodeHandle.js | 83 + .../worker/UniversalWorkerNodeHandle.js | 19 + .../vendor/core/ExecutionEnvironment.ios.js | 48 + .../StaticContainer/StaticContainer.js | 54 + .../interactions/Touchable/Touchable.js | 679 + .../pooledClasses/BoundingDimensions.js | 37 + .../react_contrib/pooledClasses/Position.js | 27 + ios/Pods/React/PATENTS | 33 + ios/Pods/React/README.md | 219 + ios/Pods/React/React/Base/RCTAssert.h | 106 + ios/Pods/React/React/Base/RCTAssert.m | 115 + ios/Pods/React/React/Base/RCTBatchedBridge.m | 860 + ios/Pods/React/React/Base/RCTBridge.h | 163 + ios/Pods/React/React/Base/RCTBridge.m | 299 + ios/Pods/React/React/Base/RCTBridgeDelegate.h | 23 + ios/Pods/React/React/Base/RCTBridgeModule.h | 230 + ios/Pods/React/React/Base/RCTCache.h | 56 + ios/Pods/React/React/Base/RCTCache.m | 368 + ios/Pods/React/React/Base/RCTConvert.h | 228 + ios/Pods/React/React/Base/RCTConvert.m | 1105 + ios/Pods/React/React/Base/RCTDefines.h | 79 + .../React/React/Base/RCTEventDispatcher.h | 105 + .../React/React/Base/RCTEventDispatcher.m | 213 + ios/Pods/React/React/Base/RCTFPSGraph.h | 23 + ios/Pods/React/React/Base/RCTFPSGraph.m | 138 + ios/Pods/React/React/Base/RCTFrameUpdate.h | 50 + ios/Pods/React/React/Base/RCTFrameUpdate.m | 29 + ios/Pods/React/React/Base/RCTInvalidating.h | 16 + .../React/React/Base/RCTJSMethodRegistrar.h | 31 + .../React/React/Base/RCTJavaScriptExecutor.h | 72 + .../React/React/Base/RCTJavaScriptLoader.h | 25 + .../React/React/Base/RCTJavaScriptLoader.m | 99 + ios/Pods/React/React/Base/RCTKeyCommands.h | 35 + ios/Pods/React/React/Base/RCTKeyCommands.m | 247 + .../React/React/Base/RCTKeyboardObserver.h | 16 + .../React/React/Base/RCTKeyboardObserver.m | 87 + ios/Pods/React/React/Base/RCTLog.h | 115 + ios/Pods/React/React/Base/RCTLog.m | 238 + ios/Pods/React/React/Base/RCTModuleData.h | 34 + ios/Pods/React/React/Base/RCTModuleData.m | 147 + ios/Pods/React/React/Base/RCTModuleMap.h | 16 + ios/Pods/React/React/Base/RCTModuleMap.m | 79 + ios/Pods/React/React/Base/RCTModuleMethod.h | 48 + ios/Pods/React/React/Base/RCTModuleMethod.m | 437 + ios/Pods/React/React/Base/RCTPerfStats.h | 27 + ios/Pods/React/React/Base/RCTPerfStats.m | 142 + .../React/React/Base/RCTPerformanceLogger.h | 24 + .../React/React/Base/RCTPerformanceLogger.m | 82 + ios/Pods/React/React/Base/RCTProfile.h | 147 + ios/Pods/React/React/Base/RCTProfile.m | 405 + ios/Pods/React/React/Base/RCTRootView.h | 98 + ios/Pods/React/React/Base/RCTRootView.m | 309 + ios/Pods/React/React/Base/RCTSparseArray.h | 38 + ios/Pods/React/React/Base/RCTSparseArray.m | 123 + ios/Pods/React/React/Base/RCTTouchHandler.h | 20 + ios/Pods/React/React/Base/RCTTouchHandler.m | 313 + .../React/React/Base/RCTURLRequestDelegate.h | 42 + .../React/React/Base/RCTURLRequestHandler.h | 54 + ios/Pods/React/React/Base/RCTUtils.h | 68 + ios/Pods/React/React/Base/RCTUtils.m | 424 + .../React/Executors/RCTContextExecutor.h | 28 + .../React/Executors/RCTContextExecutor.m | 567 + .../React/Executors/RCTWebViewExecutor.h | 48 + .../React/Executors/RCTWebViewExecutor.m | 226 + ios/Pods/React/React/Layout/Layout.c | 808 + ios/Pods/React/React/Layout/Layout.h | 148 + .../React/Modules/RCTAccessibilityManager.h | 30 + .../React/Modules/RCTAccessibilityManager.m | 157 + .../React/React/Modules/RCTAlertManager.h | 16 + .../React/React/Modules/RCTAlertManager.m | 134 + ios/Pods/React/React/Modules/RCTAppState.h | 14 + ios/Pods/React/React/Modules/RCTAppState.m | 108 + .../React/Modules/RCTAsyncLocalStorage.h | 39 + .../React/Modules/RCTAsyncLocalStorage.m | 397 + .../React/React/Modules/RCTDevLoadingView.h | 14 + .../React/React/Modules/RCTDevLoadingView.m | 123 + ios/Pods/React/React/Modules/RCTDevMenu.h | 69 + ios/Pods/React/React/Modules/RCTDevMenu.m | 504 + .../React/Modules/RCTExceptionsManager.h | 28 + .../React/Modules/RCTExceptionsManager.m | 109 + .../React/React/Modules/RCTPointAnnotation.h | 19 + .../React/React/Modules/RCTPointAnnotation.m | 14 + ios/Pods/React/React/Modules/RCTRedBox.h | 35 + ios/Pods/React/React/Modules/RCTRedBox.m | 347 + ios/Pods/React/React/Modules/RCTSourceCode.h | 19 + ios/Pods/React/React/Modules/RCTSourceCode.m | 38 + .../React/React/Modules/RCTStatusBarManager.h | 24 + .../React/React/Modules/RCTStatusBarManager.m | 122 + ios/Pods/React/React/Modules/RCTTiming.h | 18 + ios/Pods/React/React/Modules/RCTTiming.m | 206 + ios/Pods/React/React/Modules/RCTUIManager.h | 104 + ios/Pods/React/React/Modules/RCTUIManager.m | 1258 + .../Views/RCTActivityIndicatorViewManager.h | 20 + .../Views/RCTActivityIndicatorViewManager.m | 50 + ios/Pods/React/React/Views/RCTAnimationType.h | 19 + .../React/React/Views/RCTAutoInsetsProtocol.h | 20 + ios/Pods/React/React/Views/RCTBorderDrawing.h | 61 + ios/Pods/React/React/Views/RCTBorderDrawing.m | 331 + ios/Pods/React/React/Views/RCTComponent.h | 44 + ios/Pods/React/React/Views/RCTComponentData.h | 32 + ios/Pods/React/React/Views/RCTComponentData.m | 321 + .../React/Views/RCTConvert+CoreLocation.h | 20 + .../React/Views/RCTConvert+CoreLocation.m | 26 + .../React/React/Views/RCTConvert+MapKit.h | 29 + .../React/React/Views/RCTConvert+MapKit.m | 69 + .../React/React/Views/RCTDatePickerManager.h | 21 + .../React/React/Views/RCTDatePickerManager.m | 68 + ios/Pods/React/React/Views/RCTMap.h | 33 + ios/Pods/React/React/Views/RCTMap.m | 163 + ios/Pods/React/React/Views/RCTMapManager.h | 14 + ios/Pods/React/React/Views/RCTMapManager.m | 228 + ios/Pods/React/React/Views/RCTModalHostView.h | 23 + ios/Pods/React/React/Views/RCTModalHostView.m | 101 + .../React/Views/RCTModalHostViewController.h | 16 + .../React/Views/RCTModalHostViewController.m | 27 + .../React/Views/RCTModalHostViewManager.h | 16 + .../React/Views/RCTModalHostViewManager.m | 50 + ios/Pods/React/React/Views/RCTNavItem.h | 32 + ios/Pods/React/React/Views/RCTNavItem.m | 114 + .../React/React/Views/RCTNavItemManager.h | 15 + .../React/React/Views/RCTNavItemManager.m | 42 + ios/Pods/React/React/Views/RCTNavigator.h | 33 + ios/Pods/React/React/Views/RCTNavigator.m | 559 + .../React/React/Views/RCTNavigatorManager.h | 15 + .../React/React/Views/RCTNavigatorManager.m | 62 + ios/Pods/React/React/Views/RCTPicker.h | 21 + ios/Pods/React/React/Views/RCTPicker.m | 106 + ios/Pods/React/React/Views/RCTPickerManager.h | 14 + ios/Pods/React/React/Views/RCTPickerManager.m | 37 + ios/Pods/React/React/Views/RCTPointerEvents.h | 17 + .../React/Views/RCTProgressViewManager.h | 14 + .../React/Views/RCTProgressViewManager.m | 47 + ios/Pods/React/React/Views/RCTScrollView.h | 62 + ios/Pods/React/React/Views/RCTScrollView.m | 817 + .../React/React/Views/RCTScrollViewManager.h | 22 + .../React/React/Views/RCTScrollViewManager.m | 128 + .../React/React/Views/RCTScrollableProtocol.h | 25 + .../React/React/Views/RCTSegmentedControl.h | 21 + .../React/React/Views/RCTSegmentedControl.m | 58 + .../React/Views/RCTSegmentedControlManager.h | 14 + .../React/Views/RCTSegmentedControlManager.m | 39 + ios/Pods/React/React/Views/RCTShadowView.h | 169 + ios/Pods/React/React/Views/RCTShadowView.m | 573 + ios/Pods/React/React/Views/RCTSlider.h | 14 + ios/Pods/React/React/Views/RCTSlider.m | 35 + ios/Pods/React/React/Views/RCTSliderManager.h | 14 + ios/Pods/React/React/Views/RCTSliderManager.m | 57 + ios/Pods/React/React/Views/RCTSwitch.h | 17 + ios/Pods/React/React/Views/RCTSwitch.m | 22 + ios/Pods/React/React/Views/RCTSwitchManager.h | 14 + ios/Pods/React/React/Views/RCTSwitchManager.m | 55 + ios/Pods/React/React/Views/RCTTabBar.h | 22 + ios/Pods/React/React/Views/RCTTabBar.m | 161 + ios/Pods/React/React/Views/RCTTabBarItem.h | 18 + ios/Pods/React/React/Views/RCTTabBarItem.m | 90 + .../React/React/Views/RCTTabBarItemManager.h | 14 + .../React/React/Views/RCTTabBarItemManager.m | 34 + ios/Pods/React/React/Views/RCTTabBarManager.h | 14 + ios/Pods/React/React/Views/RCTTabBarManager.m | 28 + .../React/Views/RCTTextDecorationLineType.h | 17 + ios/Pods/React/React/Views/RCTView.h | 84 + ios/Pods/React/React/Views/RCTView.m | 644 + .../React/Views/RCTViewControllerProtocol.h | 20 + ios/Pods/React/React/Views/RCTViewManager.h | 123 + ios/Pods/React/React/Views/RCTViewManager.m | 296 + ios/Pods/React/React/Views/RCTWebView.h | 35 + ios/Pods/React/React/Views/RCTWebView.m | 192 + .../React/React/Views/RCTWebViewManager.h | 14 + .../React/React/Views/RCTWebViewManager.m | 96 + .../React/Views/RCTWrapperViewController.h | 36 + .../React/Views/RCTWrapperViewController.m | 149 + ios/Pods/React/React/Views/UIView+Private.h | 18 + ios/Pods/React/React/Views/UIView+React.h | 49 + ios/Pods/React/React/Views/UIView+React.m | 128 + ios/Pods/React/cli.js | 7 + ios/Pods/React/package.json | 88 + ios/Pods/React/packager/README.md | 138 + ios/Pods/React/packager/blacklist.js | 53 + ios/Pods/React/packager/checkNodeVersion.js | 40 + ios/Pods/React/packager/debugger.html | 185 + ios/Pods/React/packager/formatBanner.js | 108 + .../packager/getFlowTypeCheckMiddleware.js | 150 + .../packager/launchChromeDevTools.applescript | 47 + ios/Pods/React/packager/launchEditor.js | 52 + .../React/packager/launchPackager.command | 17 + ios/Pods/React/packager/package.json | 33 + ios/Pods/React/packager/packager.js | 262 + ios/Pods/React/packager/packager.sh | 19 + ios/Pods/React/packager/parseCommandLine.js | 75 + .../React/packager/react-packager/.babelrc | 26 + .../React/packager/react-packager/.npmignore | 8 + .../react-packager/__mocks__/debug.js | 13 + .../React/packager/react-packager/index.js | 79 + .../src/Activity/__mocks__/chalk.js | 33 + .../src/Activity/__tests__/Activity-test.js | 94 + .../react-packager/src/Activity/index.js | 178 + .../AssetServer/__tests__/AssetServer-test.js | 267 + .../react-packager/src/AssetServer/index.js | 186 + .../react-packager/src/Bundler/Bundle.js | 337 + .../src/Bundler/__tests__/Bundle-test.js | 280 + .../src/Bundler/__tests__/Bundler-test.js | 241 + .../react-packager/src/Bundler/base64-vlq.js | 169 + .../react-packager/src/Bundler/index.js | 318 + .../__tests__/BundlesLayout-test.js | 256 + .../BundlesLayoutIntegration-test.js | 595 + .../react-packager/src/BundlesLayout/index.js | 117 + .../src/Cache/__mocks__/Cache.js | 33 + .../src/Cache/__mocks__/index.js | 20 + .../src/Cache/__tests__/Cache-test.js | 296 + .../react-packager/src/Cache/index.js | 223 + .../src/DependencyResolver/AssetModule.js | 51 + .../AssetModule_DEPRECATED.js | 49 + .../DependencyGraph/DeprecatedAssetMap.js | 100 + .../DependencyGraph/HasteMap.js | 119 + .../DependencyGraph/Helpers.js | 49 + .../DependencyGraph/ResolutionRequest.js | 347 + .../DependencyGraph/ResolutionResponse.js | 73 + .../__tests__/DependencyGraph-test.js | 3724 +++ .../DependencyGraph/docblock.js | 83 + .../DependencyGraph/index.js | 217 + .../src/DependencyResolver/Module.js | 183 + .../src/DependencyResolver/ModuleCache.js | 90 + .../src/DependencyResolver/Package.js | 93 + .../src/DependencyResolver/Polyfill.js | 38 + .../__tests__/HasteDependencyResolver-test.js | 528 + .../__tests__/Module-test.js | 104 + .../src/DependencyResolver/crawlers/index.js | 26 + .../src/DependencyResolver/crawlers/node.js | 61 + .../DependencyResolver/crawlers/watchman.js | 70 + .../src/DependencyResolver/fastfs.js | 311 + .../src/DependencyResolver/index.js | 176 + .../polyfills/Array.prototype.es6.js | 58 + .../polyfills/String.prototype.es6.js | 85 + .../DependencyResolver/polyfills/console.js | 473 + .../polyfills/error-guard.js | 91 + .../DependencyResolver/polyfills/polyfills.js | 68 + .../DependencyResolver/polyfills/prelude.js | 5 + .../polyfills/prelude_dev.js | 5 + .../DependencyResolver/polyfills/require.js | 587 + .../src/DependencyResolver/replacePatterns.js | 15 + .../src/FileWatcher/__mocks__/sane.js | 13 + .../FileWatcher/__tests__/FileWatcher-test.js | 69 + .../react-packager/src/FileWatcher/index.js | 117 + .../src/JSTransformer/README.md | 0 .../src/JSTransformer/__mocks__/q.js | 14 + .../src/JSTransformer/__mocks__/underscore.js | 13 + .../src/JSTransformer/__mocks__/worker.js | 13 + .../__tests__/Transformer-test.js | 90 + .../react-packager/src/JSTransformer/index.js | 170 + .../src/JSTransformer/worker.js | 34 + .../src/Server/__tests__/Server-test.js | 288 + .../react-packager/src/Server/index.js | 457 + .../src/SocketInterface/SocketClient.js | 101 + .../src/SocketInterface/SocketServer.js | 172 + .../__tests__/SocketClient-test.js | 112 + .../__tests__/SocketInterface-test.js | 75 + .../__tests__/SocketServer-test.js | 94 + .../src/SocketInterface/index.js | 103 + .../react-packager/src/__mocks__/fs.js | 138 + .../react-packager/src/lib/ModuleTransport.js | 38 + .../src/lib/__mocks__/declareOpts.js | 20 + .../src/lib/__tests__/declareOpts-test.js | 92 + .../__tests__/getAssetDataFromName-test.js | 123 + .../__tests__/getPotentialPlatformExt-test.js | 24 + .../react-packager/src/lib/declareOpts.js | 64 + .../src/lib/getAssetDataFromName.js | 55 + .../src/lib/getPlatformExtension.js | 28 + ios/Pods/React/packager/transformer.js | 71 + ios/Pods/React/packager/webSocketProxy.js | 64 + .../React/react-native-cli/CONTRIBUTING.md | 96 + ios/Pods/React/react-native-cli/README.md | 8 + ios/Pods/React/react-native-cli/index.js | 146 + ios/Pods/React/react-native-cli/package.json | 12 + .../Pods-RNVerloopSdk-Info.plist | 26 + ...ods-RNVerloopSdk-acknowledgements.markdown | 52 + .../Pods-RNVerloopSdk-acknowledgements.plist | 90 + .../Pods-RNVerloopSdk-dummy.m | 5 + .../Pods-RNVerloopSdk-umbrella.h | 16 + .../Pods-RNVerloopSdk.debug.xcconfig | 14 + .../Pods-RNVerloopSdk.modulemap | 6 + .../Pods-RNVerloopSdk.release.xcconfig | 14 + .../React/React-Info.plist | 26 + .../Target Support Files/React/React-dummy.m | 5 + .../React/React-prefix.pch | 12 + .../React/React-umbrella.h | 106 + .../React/React.debug.xcconfig | 12 + .../React/React.modulemap | 6 + .../React/React.release.xcconfig | 12 + .../VerloopSDKiOS/VerloopSDKiOS-Info.plist | 26 + .../VerloopSDKiOS/VerloopSDKiOS-dummy.m | 5 + .../VerloopSDKiOS/VerloopSDKiOS-prefix.pch | 12 + .../VerloopSDKiOS/VerloopSDKiOS-umbrella.h | 17 + .../VerloopSDKiOS.debug.xcconfig | 13 + .../VerloopSDKiOS/VerloopSDKiOS.modulemap | 6 + .../VerloopSDKiOS.release.xcconfig | 13 + ios/Pods/VerloopSDKiOS/README.md | 196 + .../VerloopSDKiOS/VerloopSDK/Constants.swift | 21 + .../VerloopSDK/NetworkMonitor.swift | 164 + .../VerloopSDK/Reachability.swift | 406 + .../VerloopSDK/ScriptMessageHandler.swift | 24 + .../VerloopSDKiOS/VerloopSDK/VLConfig.swift | 370 + .../VerloopSDKiOS/VerloopSDK/VLEvent.swift | 60 + .../VerloopSDK/VLEventDelegate.swift | 21 + .../VerloopSDK/VLExtensions.swift | 55 + .../VerloopSDK/VLJSInterface.swift | 12 + .../VerloopSDK/VLNavViewController.swift | 18 + .../VerloopSDK/VLViewController.swift | 125 + .../VerloopSDK/VLWebViewManager.swift | 479 + .../VerloopSDKiOS/VerloopSDK}/VerloopSDK.h | 0 .../VerloopSDKiOS/VerloopSDK/VerloopSDK.swift | 299 + ios/RNVerloopSdk.podspec | 14 +- ios/RNVerloopSdk.xcodeproj/project.pbxproj | 105 +- .../xcschemes/RNVerloopSdk.xcscheme | 81 + .../contents.xcworkspacedata | 5 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ios/RNVerloopSdk/RNVerloopSdk.h | 7 +- ios/RNVerloopSdk/RNVerloopSdk.m | 5 +- .../Headers/VerloopSDK-Swift.h | 984 - ios/VerloopSDK.framework/Info.plist | Bin 733 -> 0 bytes .../VerloopSDK.swiftmodule/arm.swiftdoc | Bin 380 -> 0 bytes .../VerloopSDK.swiftmodule/arm.swiftmodule | Bin 104048 -> 0 bytes .../arm64-apple-ios.swiftdoc | Bin 380 -> 0 bytes .../arm64-apple-ios.swiftmodule | Bin 103804 -> 0 bytes .../VerloopSDK.swiftmodule/arm64.swiftdoc | Bin 380 -> 0 bytes .../VerloopSDK.swiftmodule/arm64.swiftmodule | Bin 103804 -> 0 bytes .../armv7-apple-ios.swiftdoc | Bin 380 -> 0 bytes .../armv7-apple-ios.swiftmodule | Bin 104048 -> 0 bytes .../VerloopSDK.swiftmodule/armv7.swiftdoc | Bin 380 -> 0 bytes .../VerloopSDK.swiftmodule/armv7.swiftmodule | Bin 104048 -> 0 bytes .../i386-apple-ios-simulator.swiftdoc | Bin 388 -> 0 bytes .../i386-apple-ios-simulator.swiftmodule | Bin 103428 -> 0 bytes .../VerloopSDK.swiftmodule/i386.swiftdoc | Bin 388 -> 0 bytes .../VerloopSDK.swiftmodule/i386.swiftmodule | Bin 103428 -> 0 bytes .../x86_64-apple-ios-simulator.swiftdoc | Bin 392 -> 0 bytes .../x86_64-apple-ios-simulator.swiftmodule | Bin 103192 -> 0 bytes .../VerloopSDK.swiftmodule/x86_64.swiftdoc | Bin 392 -> 0 bytes .../VerloopSDK.swiftmodule/x86_64.swiftmodule | Bin 103192 -> 0 bytes .../Modules/module.modulemap | 11 - ios/VerloopSDK.framework/VerloopSDK | Bin 2040048 -> 0 bytes package-lock.json | 16009 +++++++++ package.json | 1 - sample/SampleProject/ios/Podfile | 21 +- sample/SampleProject/ios/Podfile.lock | 8 +- .../SampleProject.xcodeproj/project.pbxproj | 38 - sample/SampleProject/package-lock.json | 25925 +++++++++++++++ sample/SampleProject/package.json | 2 +- sample/SampleProject/yarn.lock | 12084 +++---- sample/SampleProject2/.buckconfig | 6 + sample/SampleProject2/.eslintrc.js | 4 + sample/SampleProject2/.flowconfig | 67 + sample/SampleProject2/.gitignore | 61 + sample/SampleProject2/.prettierrc.js | 7 + sample/SampleProject2/.watchmanconfig | 1 + sample/SampleProject2/App.js | 79 + sample/SampleProject2/Gemfile | 6 + sample/SampleProject2/Gemfile.lock | 100 + sample/SampleProject2/VerloopLivechat.js | 51 + sample/SampleProject2/__tests__/App-test.js | 14 + sample/SampleProject2/_bundle/config | 2 + sample/SampleProject2/_ruby-version | 1 + sample/SampleProject2/android/app/_BUCK | 55 + .../SampleProject2/android/app/build.gradle | 319 + .../SampleProject2/android/app/build_defs.bzl | 19 + .../SampleProject2/android/app/debug.keystore | Bin 0 -> 2257 bytes .../android/app/proguard-rules.pro | 10 + .../android/app/src/debug/AndroidManifest.xml | 13 + .../sampleproject2/ReactNativeFlipper.java | 73 + .../android/app/src/main/AndroidManifest.xml | 26 + .../java/com/sampleproject2/MainActivity.java | 40 + .../com/sampleproject2/MainApplication.java | 92 + .../MainApplicationReactNativeHost.java | 116 + .../components/MainComponentsRegistry.java | 36 + ...ApplicationTurboModuleManagerDelegate.java | 48 + .../android/app/src/main/jni/Android.mk | 49 + .../jni/MainApplicationModuleProvider.cpp | 24 + .../main/jni/MainApplicationModuleProvider.h | 16 + ...nApplicationTurboModuleManagerDelegate.cpp | 45 + ...ainApplicationTurboModuleManagerDelegate.h | 38 + .../src/main/jni/MainComponentsRegistry.cpp | 61 + .../app/src/main/jni/MainComponentsRegistry.h | 32 + .../android/app/src/main/jni/OnLoad.cpp | 11 + .../res/drawable/rn_edit_text_material.xml | 36 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 9 + sample/SampleProject2/android/build.gradle | 53 + .../SampleProject2/android/gradle.properties | 40 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + sample/SampleProject2/android/gradlew | 234 + sample/SampleProject2/android/gradlew.bat | 89 + sample/SampleProject2/android/settings.gradle | 11 + sample/SampleProject2/app.json | 4 + sample/SampleProject2/babel.config.js | 3 + sample/SampleProject2/index.js | 9 + .../ios/ForceBridgingHeader.swift | 8 + sample/SampleProject2/ios/Podfile | 38 + sample/SampleProject2/ios/Podfile.lock | 554 + .../ios/SampleProject2-Bridging-Header.h | 4 + .../SampleProject2.xcodeproj/project.pbxproj | 708 + .../xcschemes/SampleProject2.xcscheme | 116 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../ios/SampleProject2/AppDelegate.h | 8 + .../ios/SampleProject2/AppDelegate.mm | 108 + .../AppIcon.appiconset/Contents.json | 53 + .../Images.xcassets/Contents.json | 6 + .../ios/SampleProject2/Info.plist | 55 + .../SampleProject2/LaunchScreen.storyboard | 47 + .../SampleProject2/ios/SampleProject2/main.m | 10 + .../ios/SampleProject2Tests/Info.plist | 24 + .../SampleProject2Tests/SampleProject2Tests.m | 66 + sample/SampleProject2/metro.config.js | 17 + sample/SampleProject2/package-lock.json | 26981 ++++++++++++++++ sample/SampleProject2/package.json | 30 + sample/SampleProject2/yarn.lock | 7312 +++++ yarn.lock | 4691 +++ 677 files changed, 168495 insertions(+), 7052 deletions(-) delete mode 100644 index.js create mode 100644 index.ts create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Pods/Manifest.lock create mode 100644 ios/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 ios/Pods/React/LICENSE create mode 100644 ios/Pods/React/LICENSE-CustomComponents create mode 100644 ios/Pods/React/LICENSE-docs create mode 100644 ios/Pods/React/LICENSE-examples create mode 100644 ios/Pods/React/Libraries/ART/ARTSerializablePath.js create mode 100644 ios/Pods/React/Libraries/ART/ReactNativeART.js create mode 100644 ios/Pods/React/Libraries/ActionSheetIOS/ActionSheetIOS.js create mode 100644 ios/Pods/React/Libraries/AdSupport/AdSupportIOS.js create mode 100644 ios/Pods/React/Libraries/Animated/Animated.js create mode 100644 ios/Pods/React/Libraries/Animated/Easing.js create mode 100644 ios/Pods/React/Libraries/Animated/Interpolation.js create mode 100644 ios/Pods/React/Libraries/Animated/SpringConfig.js create mode 100644 ios/Pods/React/Libraries/Animated/__tests__/Animated-test.js create mode 100644 ios/Pods/React/Libraries/Animated/__tests__/Easing-test.js create mode 100644 ios/Pods/React/Libraries/Animated/__tests__/Interpolation-test.js create mode 100644 ios/Pods/React/Libraries/Animation/bezier.js create mode 100644 ios/Pods/React/Libraries/AppRegistry/AppRegistry.js create mode 100644 ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.android.js create mode 100644 ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.ios.js create mode 100644 ios/Pods/React/Libraries/BatchedBridge/BatchedBridge.js create mode 100644 ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/NativeModules.js create mode 100644 ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTAlertManager.ios.js create mode 100644 ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTEventEmitter.js create mode 100644 ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/__mocks__/NativeModules.js create mode 100644 ios/Pods/React/Libraries/CameraRoll/CameraRoll.js create mode 100644 ios/Pods/React/Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/DatePicker/DatePickerIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/MapView/MapView.js create mode 100644 ios/Pods/React/Libraries/Components/Navigation/NavigatorIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.ios.js create mode 100644 ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js create mode 100644 ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/ScrollResponder.js create mode 100644 ios/Pods/React/Libraries/Components/ScrollView/ScrollView.js create mode 100644 ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.android.js create mode 100644 ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/SliderIOS/SliderIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/StaticRenderer.js create mode 100644 ios/Pods/React/Libraries/Components/StatusBar/StatusBarIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/Subscribable.js create mode 100644 ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.android.js create mode 100644 ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.android.js create mode 100644 ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.android.js create mode 100644 ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Components/TextInput/TextInput.js create mode 100644 ios/Pods/React/Libraries/Components/TextInput/TextInputState.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/TouchableBounce.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/TouchableHighlight.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/TouchableOpacity.js create mode 100755 ios/Pods/React/Libraries/Components/Touchable/TouchableWithoutFeedback.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/ensureComponentIsNative.js create mode 100644 ios/Pods/React/Libraries/Components/Touchable/ensurePositiveDelayProps.js create mode 100644 ios/Pods/React/Libraries/Components/UnimplementedViews/UnimplementedView.js create mode 100644 ios/Pods/React/Libraries/Components/View/View.js create mode 100644 ios/Pods/React/Libraries/Components/View/ViewStylePropTypes.js create mode 100644 ios/Pods/React/Libraries/Components/WebView/WebView.android.js create mode 100644 ios/Pods/React/Libraries/Components/WebView/WebView.ios.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/ListView/ListView.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/ListView/ListViewDataSource.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEvent.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEventEmitter.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationRouteStack.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEvent-test.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEventEmitter-test.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationRouteStack-test.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/Navigator.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBar.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBarStyles.ios.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBar.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBarStyles.ios.js create mode 100644 ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js create mode 100644 ios/Pods/React/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js create mode 100644 ios/Pods/React/Libraries/Device/RCTDeviceEventEmitter.js create mode 100644 ios/Pods/React/Libraries/Devtools/setupDevtools.js create mode 100644 ios/Pods/React/Libraries/Fetch/fetch.js create mode 100644 ios/Pods/React/Libraries/Geolocation/Geolocation.js create mode 100644 ios/Pods/React/Libraries/Image/AssetRegistry.js create mode 100644 ios/Pods/React/Libraries/Image/Image.ios.js create mode 100644 ios/Pods/React/Libraries/Image/ImagePickerIOS.js create mode 100644 ios/Pods/React/Libraries/Image/ImageResizeMode.js create mode 100644 ios/Pods/React/Libraries/Image/ImageSource.js create mode 100644 ios/Pods/React/Libraries/Image/ImageStylePropTypes.js create mode 100644 ios/Pods/React/Libraries/Image/__tests__/resolveAssetSource-test.js create mode 100644 ios/Pods/React/Libraries/Image/resolveAssetSource.js create mode 100644 ios/Pods/React/Libraries/Inspector/BorderBox.js create mode 100644 ios/Pods/React/Libraries/Inspector/BoxInspector.js create mode 100644 ios/Pods/React/Libraries/Inspector/ElementBox.js create mode 100644 ios/Pods/React/Libraries/Inspector/ElementProperties.js create mode 100644 ios/Pods/React/Libraries/Inspector/Inspector.js create mode 100644 ios/Pods/React/Libraries/Inspector/InspectorOverlay.js create mode 100644 ios/Pods/React/Libraries/Inspector/InspectorPanel.js create mode 100644 ios/Pods/React/Libraries/Inspector/InspectorUtils.js create mode 100644 ios/Pods/React/Libraries/Inspector/PerformanceOverlay.js create mode 100644 ios/Pods/React/Libraries/Inspector/StyleInspector.js create mode 100644 ios/Pods/React/Libraries/Inspector/resolveBoxStyle.js create mode 100644 ios/Pods/React/Libraries/Interaction/InteractionManager.js create mode 100644 ios/Pods/React/Libraries/Interaction/InteractionMixin.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/ExceptionsManager.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/SourceMap.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/__tests__/parseErrorStack-test.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/checkFlowAtRuntime.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/loadSourceMap.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/parseErrorStack.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/Initialization/source-map-url.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/System/JSTimers/JSTimers.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/System/JSTimers/JSTimersExecution.js create mode 100644 ios/Pods/React/Libraries/JavaScriptAppEngine/polyfills/document.js create mode 100644 ios/Pods/React/Libraries/LayoutAnimation/LayoutAnimation.js create mode 100644 ios/Pods/React/Libraries/LinkingIOS/LinkingIOS.js create mode 100644 ios/Pods/React/Libraries/Modal/Modal.js create mode 100644 ios/Pods/React/Libraries/NativeApp/RCTNativeAppEventEmitter.js create mode 100644 ios/Pods/React/Libraries/Network/FormData.js create mode 100644 ios/Pods/React/Libraries/Network/NetInfo.js create mode 100644 ios/Pods/React/Libraries/Network/XMLHttpRequest.ios.js create mode 100644 ios/Pods/React/Libraries/Network/XMLHttpRequestBase.js create mode 100644 ios/Pods/React/Libraries/Picker/PickerIOS.android.js create mode 100644 ios/Pods/React/Libraries/Picker/PickerIOS.ios.js create mode 100644 ios/Pods/React/Libraries/Portal/Portal.js create mode 100644 ios/Pods/React/Libraries/Promise.js create mode 100644 ios/Pods/React/Libraries/PushNotificationIOS/PushNotificationIOS.js create mode 100644 ios/Pods/React/Libraries/RKBackendNode/queryLayoutByID.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/IOSDefaultEventPluginOrder.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/IOSNativeBridgeEventPlugin.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/NativeMethodsMixin.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/WarningBox.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/__tests__/diffRawProperties-test.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/diffRawProperties.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/renderApplication.ios.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/requireNativeComponent.js create mode 100644 ios/Pods/React/Libraries/ReactIOS/verifyPropTypes.js create mode 100644 ios/Pods/React/Libraries/ReactNative/React.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNative.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeBaseComponent.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeBaseComponentEnvironment.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeDOMIDOperations.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeDefaultInjection.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeEventEmitter.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeGlobalInteractionHandler.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeGlobalResponderHandler.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeMount.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeReconcileTransaction.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeStyleAttributes.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeTagHandles.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeTextComponent.js create mode 100644 ios/Pods/React/Libraries/ReactNative/ReactNativeViewAttributes.js create mode 100644 ios/Pods/React/Libraries/ReactNative/createReactNativeComponentClass.js create mode 100644 ios/Pods/React/Libraries/ReactNative/findNodeHandle.js create mode 100644 ios/Pods/React/Libraries/Sample/Sample.android.js create mode 100644 ios/Pods/React/Libraries/Sample/Sample.ios.js create mode 100644 ios/Pods/React/Libraries/Settings/Settings.android.js create mode 100644 ios/Pods/React/Libraries/Settings/Settings.ios.js create mode 100644 ios/Pods/React/Libraries/Storage/AsyncStorage.ios.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/EdgeInsetsPropType.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/LayoutPropTypes.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/PointPropType.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/StyleSheet.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/StyleSheetPropType.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/StyleSheetRegistry.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/StyleSheetValidation.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/TransformPropTypes.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/flattenStyle.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/precomputeStyle.js create mode 100644 ios/Pods/React/Libraries/StyleSheet/styleDiffer.js create mode 100644 ios/Pods/React/Libraries/Text/Text.js create mode 100644 ios/Pods/React/Libraries/Text/TextStylePropTypes.js create mode 100644 ios/Pods/React/Libraries/Text/TextUpdateTest.js create mode 100644 ios/Pods/React/Libraries/Utilities/AlertIOS.js create mode 100644 ios/Pods/React/Libraries/Utilities/BackAndroid.ios.js create mode 100644 ios/Pods/React/Libraries/Utilities/BridgeProfiling.js create mode 100644 ios/Pods/React/Libraries/Utilities/CSSVarConfig.js create mode 100644 ios/Pods/React/Libraries/Utilities/Dimensions.js create mode 100644 ios/Pods/React/Libraries/Utilities/ErrorUtils.js create mode 100755 ios/Pods/React/Libraries/Utilities/MatrixMath.js create mode 100644 ios/Pods/React/Libraries/Utilities/MessageQueue.js create mode 100644 ios/Pods/React/Libraries/Utilities/PerformanceLogger.js create mode 100644 ios/Pods/React/Libraries/Utilities/PixelRatio.js create mode 100644 ios/Pods/React/Libraries/Utilities/Platform.ios.js create mode 100644 ios/Pods/React/Libraries/Utilities/RCTLog.js create mode 100644 ios/Pods/React/Libraries/Utilities/RCTRenderingPerf.js create mode 100644 ios/Pods/React/Libraries/Utilities/__mocks__/ErrorUtils.js create mode 100644 ios/Pods/React/Libraries/Utilities/__mocks__/PixelRatio.js create mode 100644 ios/Pods/React/Libraries/Utilities/__tests__/MatrixMath-test.js create mode 100644 ios/Pods/React/Libraries/Utilities/__tests__/MessageQueue-test.js create mode 100644 ios/Pods/React/Libraries/Utilities/buildStyleInterpolator.js create mode 100644 ios/Pods/React/Libraries/Utilities/createStrictShapeTypeChecker.js create mode 100644 ios/Pods/React/Libraries/Utilities/cssVar.js create mode 100644 ios/Pods/React/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/__tests__/deepDiffer-test.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/deepDiffer.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/insetsDiffer.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/matricesDiffer.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/pointsDiffer.js create mode 100644 ios/Pods/React/Libraries/Utilities/differ/sizesDiffer.js create mode 100644 ios/Pods/React/Libraries/Utilities/dismissKeyboard.js create mode 100644 ios/Pods/React/Libraries/Utilities/groupByEveryN.js create mode 100644 ios/Pods/React/Libraries/Utilities/logError.js create mode 100644 ios/Pods/React/Libraries/Utilities/mapWithSeparator.js create mode 100644 ios/Pods/React/Libraries/Utilities/mergeFast.js create mode 100644 ios/Pods/React/Libraries/Utilities/mergeIntoFast.js create mode 100644 ios/Pods/React/Libraries/Utilities/nativeModulePrefixNormalizer.js create mode 100644 ios/Pods/React/Libraries/Utilities/stringifySafe.js create mode 100644 ios/Pods/React/Libraries/Utilities/truncate.js create mode 100644 ios/Pods/React/Libraries/Vibration/VibrationIOS.android.js create mode 100644 ios/Pods/React/Libraries/Vibration/VibrationIOS.ios.js create mode 100644 ios/Pods/React/Libraries/WebSocket/WebSocket.android.js create mode 100644 ios/Pods/React/Libraries/WebSocket/WebSocket.ios.js create mode 100644 ios/Pods/React/Libraries/WebSocket/WebSocketBase.js create mode 100644 ios/Pods/React/Libraries/react-native/react-native-interface.js create mode 100644 ios/Pods/React/Libraries/react-native/react-native.js create mode 100644 ios/Pods/React/Libraries/vendor/core/Map.js create mode 100644 ios/Pods/React/Libraries/vendor/core/Set.js create mode 100644 ios/Pods/React/Libraries/vendor/core/_shouldPolyfillES6Collection.js create mode 100644 ios/Pods/React/Libraries/vendor/core/clearImmediate.js create mode 100644 ios/Pods/React/Libraries/vendor/core/copyProperties.js create mode 100644 ios/Pods/React/Libraries/vendor/core/getObjectValues.js create mode 100644 ios/Pods/React/Libraries/vendor/core/guid.js create mode 100644 ios/Pods/React/Libraries/vendor/core/immediate/setImmediate.js create mode 100644 ios/Pods/React/Libraries/vendor/core/isEmpty.js create mode 100644 ios/Pods/React/Libraries/vendor/core/merge.js create mode 100644 ios/Pods/React/Libraries/vendor/core/mergeHelpers.js create mode 100644 ios/Pods/React/Libraries/vendor/core/mergeInto.js create mode 100644 ios/Pods/React/Libraries/vendor/core/setImmediate.js create mode 100644 ios/Pods/React/Libraries/vendor/core/throwImmediate.js create mode 100644 ios/Pods/React/Libraries/vendor/core/toIterator.js create mode 100644 ios/Pods/React/Libraries/vendor/crypto/crc32.js create mode 100644 ios/Pods/React/Libraries/vendor/document/selection/DocumentSelectionState.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EmitterSubscription.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventEmitter.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventEmitterWithHolding.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventHolder.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventSubscription.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventSubscriptionVendor.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/EventValidator.js create mode 100644 ios/Pods/React/Libraries/vendor/emitter/mixInEventEmitter.js create mode 100644 ios/Pods/React/Libraries/vendor/react/browser/eventPlugins/PanResponder.js create mode 100644 ios/Pods/React/Libraries/vendor/react/browser/eventPlugins/ResponderEventPlugin.js create mode 100644 ios/Pods/React/Libraries/vendor/react/browser/eventPlugins/TouchHistoryMath.js create mode 100644 ios/Pods/React/Libraries/vendor/react/core/clamp.js create mode 100644 ios/Pods/React/Libraries/vendor/react/event/EventPropagators.js create mode 100644 ios/Pods/React/Libraries/vendor/react/platform/NodeHandle.js create mode 100644 ios/Pods/React/Libraries/vendor/react/platformImplementations/universal/worker/UniversalWorkerNodeHandle.js create mode 100644 ios/Pods/React/Libraries/vendor/react/vendor/core/ExecutionEnvironment.ios.js create mode 100644 ios/Pods/React/Libraries/vendor/react_contrib/StaticContainer/StaticContainer.js create mode 100644 ios/Pods/React/Libraries/vendor/react_contrib/interactions/Touchable/Touchable.js create mode 100644 ios/Pods/React/Libraries/vendor/react_contrib/pooledClasses/BoundingDimensions.js create mode 100644 ios/Pods/React/Libraries/vendor/react_contrib/pooledClasses/Position.js create mode 100644 ios/Pods/React/PATENTS create mode 100644 ios/Pods/React/README.md create mode 100644 ios/Pods/React/React/Base/RCTAssert.h create mode 100644 ios/Pods/React/React/Base/RCTAssert.m create mode 100644 ios/Pods/React/React/Base/RCTBatchedBridge.m create mode 100644 ios/Pods/React/React/Base/RCTBridge.h create mode 100644 ios/Pods/React/React/Base/RCTBridge.m create mode 100644 ios/Pods/React/React/Base/RCTBridgeDelegate.h create mode 100644 ios/Pods/React/React/Base/RCTBridgeModule.h create mode 100644 ios/Pods/React/React/Base/RCTCache.h create mode 100644 ios/Pods/React/React/Base/RCTCache.m create mode 100644 ios/Pods/React/React/Base/RCTConvert.h create mode 100644 ios/Pods/React/React/Base/RCTConvert.m create mode 100644 ios/Pods/React/React/Base/RCTDefines.h create mode 100644 ios/Pods/React/React/Base/RCTEventDispatcher.h create mode 100644 ios/Pods/React/React/Base/RCTEventDispatcher.m create mode 100644 ios/Pods/React/React/Base/RCTFPSGraph.h create mode 100644 ios/Pods/React/React/Base/RCTFPSGraph.m create mode 100644 ios/Pods/React/React/Base/RCTFrameUpdate.h create mode 100644 ios/Pods/React/React/Base/RCTFrameUpdate.m create mode 100644 ios/Pods/React/React/Base/RCTInvalidating.h create mode 100644 ios/Pods/React/React/Base/RCTJSMethodRegistrar.h create mode 100644 ios/Pods/React/React/Base/RCTJavaScriptExecutor.h create mode 100755 ios/Pods/React/React/Base/RCTJavaScriptLoader.h create mode 100755 ios/Pods/React/React/Base/RCTJavaScriptLoader.m create mode 100644 ios/Pods/React/React/Base/RCTKeyCommands.h create mode 100644 ios/Pods/React/React/Base/RCTKeyCommands.m create mode 100644 ios/Pods/React/React/Base/RCTKeyboardObserver.h create mode 100644 ios/Pods/React/React/Base/RCTKeyboardObserver.m create mode 100644 ios/Pods/React/React/Base/RCTLog.h create mode 100644 ios/Pods/React/React/Base/RCTLog.m create mode 100644 ios/Pods/React/React/Base/RCTModuleData.h create mode 100644 ios/Pods/React/React/Base/RCTModuleData.m create mode 100644 ios/Pods/React/React/Base/RCTModuleMap.h create mode 100644 ios/Pods/React/React/Base/RCTModuleMap.m create mode 100644 ios/Pods/React/React/Base/RCTModuleMethod.h create mode 100644 ios/Pods/React/React/Base/RCTModuleMethod.m create mode 100644 ios/Pods/React/React/Base/RCTPerfStats.h create mode 100644 ios/Pods/React/React/Base/RCTPerfStats.m create mode 100644 ios/Pods/React/React/Base/RCTPerformanceLogger.h create mode 100644 ios/Pods/React/React/Base/RCTPerformanceLogger.m create mode 100644 ios/Pods/React/React/Base/RCTProfile.h create mode 100644 ios/Pods/React/React/Base/RCTProfile.m create mode 100644 ios/Pods/React/React/Base/RCTRootView.h create mode 100644 ios/Pods/React/React/Base/RCTRootView.m create mode 100644 ios/Pods/React/React/Base/RCTSparseArray.h create mode 100644 ios/Pods/React/React/Base/RCTSparseArray.m create mode 100644 ios/Pods/React/React/Base/RCTTouchHandler.h create mode 100644 ios/Pods/React/React/Base/RCTTouchHandler.m create mode 100644 ios/Pods/React/React/Base/RCTURLRequestDelegate.h create mode 100644 ios/Pods/React/React/Base/RCTURLRequestHandler.h create mode 100644 ios/Pods/React/React/Base/RCTUtils.h create mode 100644 ios/Pods/React/React/Base/RCTUtils.m create mode 100644 ios/Pods/React/React/Executors/RCTContextExecutor.h create mode 100644 ios/Pods/React/React/Executors/RCTContextExecutor.m create mode 100644 ios/Pods/React/React/Executors/RCTWebViewExecutor.h create mode 100644 ios/Pods/React/React/Executors/RCTWebViewExecutor.m create mode 100644 ios/Pods/React/React/Layout/Layout.c create mode 100644 ios/Pods/React/React/Layout/Layout.h create mode 100644 ios/Pods/React/React/Modules/RCTAccessibilityManager.h create mode 100644 ios/Pods/React/React/Modules/RCTAccessibilityManager.m create mode 100644 ios/Pods/React/React/Modules/RCTAlertManager.h create mode 100644 ios/Pods/React/React/Modules/RCTAlertManager.m create mode 100644 ios/Pods/React/React/Modules/RCTAppState.h create mode 100644 ios/Pods/React/React/Modules/RCTAppState.m create mode 100644 ios/Pods/React/React/Modules/RCTAsyncLocalStorage.h create mode 100644 ios/Pods/React/React/Modules/RCTAsyncLocalStorage.m create mode 100644 ios/Pods/React/React/Modules/RCTDevLoadingView.h create mode 100644 ios/Pods/React/React/Modules/RCTDevLoadingView.m create mode 100644 ios/Pods/React/React/Modules/RCTDevMenu.h create mode 100644 ios/Pods/React/React/Modules/RCTDevMenu.m create mode 100644 ios/Pods/React/React/Modules/RCTExceptionsManager.h create mode 100644 ios/Pods/React/React/Modules/RCTExceptionsManager.m create mode 100644 ios/Pods/React/React/Modules/RCTPointAnnotation.h create mode 100644 ios/Pods/React/React/Modules/RCTPointAnnotation.m create mode 100644 ios/Pods/React/React/Modules/RCTRedBox.h create mode 100644 ios/Pods/React/React/Modules/RCTRedBox.m create mode 100644 ios/Pods/React/React/Modules/RCTSourceCode.h create mode 100644 ios/Pods/React/React/Modules/RCTSourceCode.m create mode 100644 ios/Pods/React/React/Modules/RCTStatusBarManager.h create mode 100644 ios/Pods/React/React/Modules/RCTStatusBarManager.m create mode 100644 ios/Pods/React/React/Modules/RCTTiming.h create mode 100644 ios/Pods/React/React/Modules/RCTTiming.m create mode 100644 ios/Pods/React/React/Modules/RCTUIManager.h create mode 100644 ios/Pods/React/React/Modules/RCTUIManager.m create mode 100644 ios/Pods/React/React/Views/RCTActivityIndicatorViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTActivityIndicatorViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTAnimationType.h create mode 100644 ios/Pods/React/React/Views/RCTAutoInsetsProtocol.h create mode 100644 ios/Pods/React/React/Views/RCTBorderDrawing.h create mode 100644 ios/Pods/React/React/Views/RCTBorderDrawing.m create mode 100644 ios/Pods/React/React/Views/RCTComponent.h create mode 100644 ios/Pods/React/React/Views/RCTComponentData.h create mode 100644 ios/Pods/React/React/Views/RCTComponentData.m create mode 100644 ios/Pods/React/React/Views/RCTConvert+CoreLocation.h create mode 100644 ios/Pods/React/React/Views/RCTConvert+CoreLocation.m create mode 100644 ios/Pods/React/React/Views/RCTConvert+MapKit.h create mode 100644 ios/Pods/React/React/Views/RCTConvert+MapKit.m create mode 100644 ios/Pods/React/React/Views/RCTDatePickerManager.h create mode 100644 ios/Pods/React/React/Views/RCTDatePickerManager.m create mode 100644 ios/Pods/React/React/Views/RCTMap.h create mode 100644 ios/Pods/React/React/Views/RCTMap.m create mode 100644 ios/Pods/React/React/Views/RCTMapManager.h create mode 100644 ios/Pods/React/React/Views/RCTMapManager.m create mode 100644 ios/Pods/React/React/Views/RCTModalHostView.h create mode 100644 ios/Pods/React/React/Views/RCTModalHostView.m create mode 100644 ios/Pods/React/React/Views/RCTModalHostViewController.h create mode 100644 ios/Pods/React/React/Views/RCTModalHostViewController.m create mode 100644 ios/Pods/React/React/Views/RCTModalHostViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTModalHostViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTNavItem.h create mode 100644 ios/Pods/React/React/Views/RCTNavItem.m create mode 100644 ios/Pods/React/React/Views/RCTNavItemManager.h create mode 100644 ios/Pods/React/React/Views/RCTNavItemManager.m create mode 100644 ios/Pods/React/React/Views/RCTNavigator.h create mode 100644 ios/Pods/React/React/Views/RCTNavigator.m create mode 100644 ios/Pods/React/React/Views/RCTNavigatorManager.h create mode 100644 ios/Pods/React/React/Views/RCTNavigatorManager.m create mode 100644 ios/Pods/React/React/Views/RCTPicker.h create mode 100644 ios/Pods/React/React/Views/RCTPicker.m create mode 100644 ios/Pods/React/React/Views/RCTPickerManager.h create mode 100644 ios/Pods/React/React/Views/RCTPickerManager.m create mode 100644 ios/Pods/React/React/Views/RCTPointerEvents.h create mode 100644 ios/Pods/React/React/Views/RCTProgressViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTProgressViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTScrollView.h create mode 100644 ios/Pods/React/React/Views/RCTScrollView.m create mode 100644 ios/Pods/React/React/Views/RCTScrollViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTScrollViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTScrollableProtocol.h create mode 100644 ios/Pods/React/React/Views/RCTSegmentedControl.h create mode 100644 ios/Pods/React/React/Views/RCTSegmentedControl.m create mode 100644 ios/Pods/React/React/Views/RCTSegmentedControlManager.h create mode 100644 ios/Pods/React/React/Views/RCTSegmentedControlManager.m create mode 100644 ios/Pods/React/React/Views/RCTShadowView.h create mode 100644 ios/Pods/React/React/Views/RCTShadowView.m create mode 100644 ios/Pods/React/React/Views/RCTSlider.h create mode 100644 ios/Pods/React/React/Views/RCTSlider.m create mode 100644 ios/Pods/React/React/Views/RCTSliderManager.h create mode 100644 ios/Pods/React/React/Views/RCTSliderManager.m create mode 100644 ios/Pods/React/React/Views/RCTSwitch.h create mode 100644 ios/Pods/React/React/Views/RCTSwitch.m create mode 100644 ios/Pods/React/React/Views/RCTSwitchManager.h create mode 100644 ios/Pods/React/React/Views/RCTSwitchManager.m create mode 100644 ios/Pods/React/React/Views/RCTTabBar.h create mode 100644 ios/Pods/React/React/Views/RCTTabBar.m create mode 100644 ios/Pods/React/React/Views/RCTTabBarItem.h create mode 100644 ios/Pods/React/React/Views/RCTTabBarItem.m create mode 100644 ios/Pods/React/React/Views/RCTTabBarItemManager.h create mode 100644 ios/Pods/React/React/Views/RCTTabBarItemManager.m create mode 100644 ios/Pods/React/React/Views/RCTTabBarManager.h create mode 100644 ios/Pods/React/React/Views/RCTTabBarManager.m create mode 100644 ios/Pods/React/React/Views/RCTTextDecorationLineType.h create mode 100644 ios/Pods/React/React/Views/RCTView.h create mode 100644 ios/Pods/React/React/Views/RCTView.m create mode 100644 ios/Pods/React/React/Views/RCTViewControllerProtocol.h create mode 100644 ios/Pods/React/React/Views/RCTViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTWebView.h create mode 100644 ios/Pods/React/React/Views/RCTWebView.m create mode 100644 ios/Pods/React/React/Views/RCTWebViewManager.h create mode 100644 ios/Pods/React/React/Views/RCTWebViewManager.m create mode 100644 ios/Pods/React/React/Views/RCTWrapperViewController.h create mode 100644 ios/Pods/React/React/Views/RCTWrapperViewController.m create mode 100644 ios/Pods/React/React/Views/UIView+Private.h create mode 100644 ios/Pods/React/React/Views/UIView+React.h create mode 100644 ios/Pods/React/React/Views/UIView+React.m create mode 100644 ios/Pods/React/cli.js create mode 100644 ios/Pods/React/package.json create mode 100644 ios/Pods/React/packager/README.md create mode 100644 ios/Pods/React/packager/blacklist.js create mode 100644 ios/Pods/React/packager/checkNodeVersion.js create mode 100644 ios/Pods/React/packager/debugger.html create mode 100644 ios/Pods/React/packager/formatBanner.js create mode 100644 ios/Pods/React/packager/getFlowTypeCheckMiddleware.js create mode 100755 ios/Pods/React/packager/launchChromeDevTools.applescript create mode 100644 ios/Pods/React/packager/launchEditor.js create mode 100755 ios/Pods/React/packager/launchPackager.command create mode 100644 ios/Pods/React/packager/package.json create mode 100644 ios/Pods/React/packager/packager.js create mode 100755 ios/Pods/React/packager/packager.sh create mode 100644 ios/Pods/React/packager/parseCommandLine.js create mode 100644 ios/Pods/React/packager/react-packager/.babelrc create mode 100644 ios/Pods/React/packager/react-packager/.npmignore create mode 100644 ios/Pods/React/packager/react-packager/__mocks__/debug.js create mode 100644 ios/Pods/React/packager/react-packager/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/Activity/__mocks__/chalk.js create mode 100644 ios/Pods/React/packager/react-packager/src/Activity/__tests__/Activity-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/Activity/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/AssetServer/__tests__/AssetServer-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/AssetServer/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/Bundler/Bundle.js create mode 100644 ios/Pods/React/packager/react-packager/src/Bundler/__tests__/Bundle-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/Bundler/__tests__/Bundler-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/Bundler/base64-vlq.js create mode 100644 ios/Pods/React/packager/react-packager/src/Bundler/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/BundlesLayout/__tests__/BundlesLayout-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/BundlesLayout/__tests__/BundlesLayoutIntegration-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/BundlesLayout/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/Cache/__mocks__/Cache.js create mode 100644 ios/Pods/React/packager/react-packager/src/Cache/__mocks__/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/Cache/__tests__/Cache-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/Cache/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/AssetModule.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/AssetModule_DEPRECATED.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/DeprecatedAssetMap.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/HasteMap.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/Helpers.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/ResolutionRequest.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/ResolutionResponse.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/__tests__/DependencyGraph-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/docblock.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/DependencyGraph/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/Module.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/ModuleCache.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/Package.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/Polyfill.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/__tests__/HasteDependencyResolver-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/__tests__/Module-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/crawlers/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/crawlers/node.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/crawlers/watchman.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/fastfs.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/Array.prototype.es6.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/String.prototype.es6.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/console.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/error-guard.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/polyfills.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/prelude.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/prelude_dev.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/polyfills/require.js create mode 100644 ios/Pods/React/packager/react-packager/src/DependencyResolver/replacePatterns.js create mode 100644 ios/Pods/React/packager/react-packager/src/FileWatcher/__mocks__/sane.js create mode 100644 ios/Pods/React/packager/react-packager/src/FileWatcher/__tests__/FileWatcher-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/FileWatcher/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/README.md create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/__mocks__/q.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/__mocks__/underscore.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/__mocks__/worker.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/__tests__/Transformer-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/JSTransformer/worker.js create mode 100644 ios/Pods/React/packager/react-packager/src/Server/__tests__/Server-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/Server/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/SocketClient.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/SocketServer.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/__tests__/SocketClient-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/__tests__/SocketServer-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/SocketInterface/index.js create mode 100644 ios/Pods/React/packager/react-packager/src/__mocks__/fs.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/ModuleTransport.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/__mocks__/declareOpts.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/__tests__/declareOpts-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/__tests__/getAssetDataFromName-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/__tests__/getPotentialPlatformExt-test.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/declareOpts.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/getAssetDataFromName.js create mode 100644 ios/Pods/React/packager/react-packager/src/lib/getPlatformExtension.js create mode 100644 ios/Pods/React/packager/transformer.js create mode 100644 ios/Pods/React/packager/webSocketProxy.js create mode 100644 ios/Pods/React/react-native-cli/CONTRIBUTING.md create mode 100644 ios/Pods/React/react-native-cli/README.md create mode 100755 ios/Pods/React/react-native-cli/index.js create mode 100644 ios/Pods/React/react-native-cli/package.json create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-Info.plist create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-acknowledgements.markdown create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-acknowledgements.plist create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-dummy.m create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-umbrella.h create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk.debug.xcconfig create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk.modulemap create mode 100644 ios/Pods/Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk.release.xcconfig create mode 100644 ios/Pods/Target Support Files/React/React-Info.plist create mode 100644 ios/Pods/Target Support Files/React/React-dummy.m create mode 100644 ios/Pods/Target Support Files/React/React-prefix.pch create mode 100644 ios/Pods/Target Support Files/React/React-umbrella.h create mode 100644 ios/Pods/Target Support Files/React/React.debug.xcconfig create mode 100644 ios/Pods/Target Support Files/React/React.modulemap create mode 100644 ios/Pods/Target Support Files/React/React.release.xcconfig create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS-Info.plist create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS-dummy.m create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS-prefix.pch create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS-umbrella.h create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS.debug.xcconfig create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS.modulemap create mode 100644 ios/Pods/Target Support Files/VerloopSDKiOS/VerloopSDKiOS.release.xcconfig create mode 100644 ios/Pods/VerloopSDKiOS/README.md create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/Constants.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/NetworkMonitor.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/Reachability.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/ScriptMessageHandler.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLConfig.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLEvent.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLEventDelegate.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLExtensions.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLJSInterface.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLNavViewController.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLViewController.swift create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VLWebViewManager.swift rename ios/{VerloopSDK.framework/Headers => Pods/VerloopSDKiOS/VerloopSDK}/VerloopSDK.h (100%) create mode 100644 ios/Pods/VerloopSDKiOS/VerloopSDK/VerloopSDK.swift create mode 100644 ios/RNVerloopSdk.xcodeproj/xcshareddata/xcschemes/RNVerloopSdk.xcscheme create mode 100644 ios/RNVerloopSdk.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/VerloopSDK.framework/Headers/VerloopSDK-Swift.h delete mode 100644 ios/VerloopSDK.framework/Info.plist delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm64-apple-ios.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm64-apple-ios.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm64.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/arm64.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/armv7-apple-ios.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/armv7-apple-ios.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/armv7.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/armv7.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/i386-apple-ios-simulator.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/i386-apple-ios-simulator.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/i386.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/i386.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/x86_64-apple-ios-simulator.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/x86_64.swiftdoc delete mode 100644 ios/VerloopSDK.framework/Modules/VerloopSDK.swiftmodule/x86_64.swiftmodule delete mode 100644 ios/VerloopSDK.framework/Modules/module.modulemap delete mode 100755 ios/VerloopSDK.framework/VerloopSDK create mode 100644 package-lock.json create mode 100644 sample/SampleProject/package-lock.json create mode 100644 sample/SampleProject2/.buckconfig create mode 100644 sample/SampleProject2/.eslintrc.js create mode 100644 sample/SampleProject2/.flowconfig create mode 100644 sample/SampleProject2/.gitignore create mode 100644 sample/SampleProject2/.prettierrc.js create mode 100644 sample/SampleProject2/.watchmanconfig create mode 100644 sample/SampleProject2/App.js create mode 100644 sample/SampleProject2/Gemfile create mode 100644 sample/SampleProject2/Gemfile.lock create mode 100644 sample/SampleProject2/VerloopLivechat.js create mode 100644 sample/SampleProject2/__tests__/App-test.js create mode 100644 sample/SampleProject2/_bundle/config create mode 100644 sample/SampleProject2/_ruby-version create mode 100644 sample/SampleProject2/android/app/_BUCK create mode 100644 sample/SampleProject2/android/app/build.gradle create mode 100644 sample/SampleProject2/android/app/build_defs.bzl create mode 100644 sample/SampleProject2/android/app/debug.keystore create mode 100644 sample/SampleProject2/android/app/proguard-rules.pro create mode 100644 sample/SampleProject2/android/app/src/debug/AndroidManifest.xml create mode 100644 sample/SampleProject2/android/app/src/debug/java/com/sampleproject2/ReactNativeFlipper.java create mode 100644 sample/SampleProject2/android/app/src/main/AndroidManifest.xml create mode 100644 sample/SampleProject2/android/app/src/main/java/com/sampleproject2/MainActivity.java create mode 100644 sample/SampleProject2/android/app/src/main/java/com/sampleproject2/MainApplication.java create mode 100644 sample/SampleProject2/android/app/src/main/java/com/sampleproject2/newarchitecture/MainApplicationReactNativeHost.java create mode 100644 sample/SampleProject2/android/app/src/main/java/com/sampleproject2/newarchitecture/components/MainComponentsRegistry.java create mode 100644 sample/SampleProject2/android/app/src/main/java/com/sampleproject2/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java create mode 100644 sample/SampleProject2/android/app/src/main/jni/Android.mk create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainApplicationModuleProvider.cpp create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainApplicationModuleProvider.h create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainComponentsRegistry.cpp create mode 100644 sample/SampleProject2/android/app/src/main/jni/MainComponentsRegistry.h create mode 100644 sample/SampleProject2/android/app/src/main/jni/OnLoad.cpp create mode 100644 sample/SampleProject2/android/app/src/main/res/drawable/rn_edit_text_material.xml create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample/SampleProject2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 sample/SampleProject2/android/app/src/main/res/values/strings.xml create mode 100644 sample/SampleProject2/android/app/src/main/res/values/styles.xml create mode 100644 sample/SampleProject2/android/build.gradle create mode 100644 sample/SampleProject2/android/gradle.properties create mode 100644 sample/SampleProject2/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 sample/SampleProject2/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 sample/SampleProject2/android/gradlew create mode 100644 sample/SampleProject2/android/gradlew.bat create mode 100644 sample/SampleProject2/android/settings.gradle create mode 100644 sample/SampleProject2/app.json create mode 100644 sample/SampleProject2/babel.config.js create mode 100644 sample/SampleProject2/index.js create mode 100644 sample/SampleProject2/ios/ForceBridgingHeader.swift create mode 100644 sample/SampleProject2/ios/Podfile create mode 100644 sample/SampleProject2/ios/Podfile.lock create mode 100644 sample/SampleProject2/ios/SampleProject2-Bridging-Header.h create mode 100644 sample/SampleProject2/ios/SampleProject2.xcodeproj/project.pbxproj create mode 100644 sample/SampleProject2/ios/SampleProject2.xcodeproj/xcshareddata/xcschemes/SampleProject2.xcscheme create mode 100644 sample/SampleProject2/ios/SampleProject2.xcworkspace/contents.xcworkspacedata create mode 100644 sample/SampleProject2/ios/SampleProject2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 sample/SampleProject2/ios/SampleProject2/AppDelegate.h create mode 100644 sample/SampleProject2/ios/SampleProject2/AppDelegate.mm create mode 100644 sample/SampleProject2/ios/SampleProject2/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 sample/SampleProject2/ios/SampleProject2/Images.xcassets/Contents.json create mode 100644 sample/SampleProject2/ios/SampleProject2/Info.plist create mode 100644 sample/SampleProject2/ios/SampleProject2/LaunchScreen.storyboard create mode 100644 sample/SampleProject2/ios/SampleProject2/main.m create mode 100644 sample/SampleProject2/ios/SampleProject2Tests/Info.plist create mode 100644 sample/SampleProject2/ios/SampleProject2Tests/SampleProject2Tests.m create mode 100644 sample/SampleProject2/metro.config.js create mode 100644 sample/SampleProject2/package-lock.json create mode 100644 sample/SampleProject2/package.json create mode 100644 sample/SampleProject2/yarn.lock diff --git a/index.js b/index.js deleted file mode 100644 index 43da08ad..00000000 --- a/index.js +++ /dev/null @@ -1,8 +0,0 @@ - -import { NativeModules } from 'react-native'; - -const { RNVerloopSdk } = NativeModules; - -const VerloopSdk = RNVerloopSdk; - -export default VerloopSdk; diff --git a/index.ts b/index.ts new file mode 100644 index 00000000..3a9f82aa --- /dev/null +++ b/index.ts @@ -0,0 +1,12 @@ + +import { NativeModules } from 'react-native'; + +const { RNVerloopSdk } = NativeModules; + +const VerloopSdk = RNVerloopSdk; + +interface VerloopSdkInterface { + createUserConfig(clientId: string, userId:string ): void; +} + +export default VerloopSdk as VerloopSdkInterface; diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 00000000..f6063214 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,14 @@ +# Uncomment the next line to define a global platform for your project +platform :ios, '11.0' + +target 'RNVerloopSdk' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + pod 'VerloopSDKiOS', '~> 0.2' + pod 'React' + + + # Pods for RNVerloopSdk + +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 00000000..382bd165 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - React (0.11.0): + - React/Core (= 0.11.0) + - React/Core (0.11.0) + - VerloopSDKiOS (0.2.0) + +DEPENDENCIES: + - React + - VerloopSDKiOS (~> 0.2) + +SPEC REPOS: + trunk: + - React + - VerloopSDKiOS + +SPEC CHECKSUMS: + React: ab1a2e21deb34965c38328d5ec40cc7d12c6050a + VerloopSDKiOS: b018c0666fb497820888af1876a567c2576074ea + +PODFILE CHECKSUM: 7a9acd880f7cb0dac4f36f6150b0c58f4f93c4b6 + +COCOAPODS: 1.11.3 diff --git a/ios/Pods/Manifest.lock b/ios/Pods/Manifest.lock new file mode 100644 index 00000000..382bd165 --- /dev/null +++ b/ios/Pods/Manifest.lock @@ -0,0 +1,22 @@ +PODS: + - React (0.11.0): + - React/Core (= 0.11.0) + - React/Core (0.11.0) + - VerloopSDKiOS (0.2.0) + +DEPENDENCIES: + - React + - VerloopSDKiOS (~> 0.2) + +SPEC REPOS: + trunk: + - React + - VerloopSDKiOS + +SPEC CHECKSUMS: + React: ab1a2e21deb34965c38328d5ec40cc7d12c6050a + VerloopSDKiOS: b018c0666fb497820888af1876a567c2576074ea + +PODFILE CHECKSUM: 7a9acd880f7cb0dac4f36f6150b0c58f4f93c4b6 + +COCOAPODS: 1.11.3 diff --git a/ios/Pods/Pods.xcodeproj/project.pbxproj b/ios/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 00000000..052e1131 --- /dev/null +++ b/ios/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1749 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 001900E0E340C4D6AC7B713FAFC4A47A /* RCTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = AC4811CABE7ADA4B17A145497AAEFDDE /* RCTUtils.h */; }; + 0329A75C435FFA2123C7829EA94D5A3F /* RCTSparseArray.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 3DF331B2A08729831EC186E7016C80A2 /* RCTSparseArray.h */; }; + 0529A50C344DF11CEE6D447F8C4A4F97 /* RCTAsyncLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 71352F8A6D9EE8B9D09BAD40BA773F1B /* RCTAsyncLocalStorage.m */; }; + 0583DF2B5E141DE8054E41FF7A8670A5 /* RCTStatusBarManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CB43466D346797DC2450C73912F87B /* RCTStatusBarManager.h */; }; + 05AF676BFC563877E0B35173B031C1FA /* RCTInvalidating.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 49BEBC96158E9B6E307FD481C4684E40 /* RCTInvalidating.h */; }; + 063BBE2AA8A92A70C642CA8851C1F118 /* RCTCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 03DDA0C6B880781059C8630A42FBA48A /* RCTCache.h */; }; + 069AF77768EACF6BB235B18AF9F21769 /* RCTExceptionsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F454823D34C72CEE22AFF7A395C0256A /* RCTExceptionsManager.h */; }; + 06AECE072FF0D18A462EAECD0ECA4CB7 /* RCTUIManager.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = E7081B5638A218EB530DAAC88CE3B8E2 /* RCTUIManager.h */; }; + 07C01963DE84CFC7B8DF870B552F0722 /* RCTDevLoadingView.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = 7C12BF5A03222174FBF9436C95EE6F65 /* RCTDevLoadingView.h */; }; + 0975436AD99B45FE0C9805A6462A877A /* RCTComponentData.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1B366ACC51D293983203F54AC58A2DD2 /* RCTComponentData.h */; }; + 097E32B35C4771D22ED6B16409119D1D /* RCTSegmentedControlManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 5EE9BA2B263D47BFFCDB5B8D499E9A69 /* RCTSegmentedControlManager.h */; }; + 0A256EA449D0330AE94920350A175C3D /* RCTAlertManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 323642446F6C9FC9459F112536DDFEAB /* RCTAlertManager.m */; }; + 0AF1BDA9660AFD03659FC2169C56920C /* RCTConvert+CoreLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 89F4568CAFF592EB71D698DC263B8717 /* RCTConvert+CoreLocation.h */; }; + 0AF6CA287E51BA9522BE5A443CD9B5E4 /* RCTConvert+MapKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DD2021525C3BA6981DFDE7FF5BFC3CF /* RCTConvert+MapKit.h */; }; + 0CAE3C348C6E2E37D768FA64D1C8DCE7 /* RCTPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 581BEA3CAD9A61F90204EA16CC3A09A4 /* RCTPicker.h */; }; + 0D1EC645B6869786C78FCB4BD357ABF8 /* RCTAppState.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = 820FAB899CF185DE81C3685C5B408969 /* RCTAppState.h */; }; + 0D5D86C2EE270F18B32B998B14C18663 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37BC21AE98AE360F5EF7132520B540F4 /* Foundation.framework */; }; + 0DCA836E200D19A12FE253C431663F69 /* RCTModuleData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8626CBB571BE6CFC0C34D002CEE428D5 /* RCTModuleData.m */; }; + 0DCD9AFFA34B40582DC974EDADDFBBEC /* RCTJavaScriptLoader.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = AEC89743290B75DFA8B18392C301B25E /* RCTJavaScriptLoader.h */; }; + 0DD9720CE5F6E8B52ADFAA650E24CEAB /* RCTConvert+CoreLocation.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 89F4568CAFF592EB71D698DC263B8717 /* RCTConvert+CoreLocation.h */; }; + 0F20BA0C7B9EBC8BAFA68ACFAF5F426D /* RCTPointAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = F459B29A1C124E84F8755D71D1DFFB6A /* RCTPointAnnotation.h */; }; + 0F8EB10A462BD57E9889824BAC03A8E6 /* RCTWebViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 053AEAB11F016868E21550C85882276D /* RCTWebViewManager.h */; }; + 1409315D5452124E775B3E0DDF80D6A8 /* RCTScrollViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EC47757FCD9BEA236EBB834329378BCD /* RCTScrollViewManager.m */; }; + 148337544BFD640583A3A92CEB77BBE5 /* RCTScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ADE79029E068AA724F415D9D43F421E /* RCTScrollView.m */; }; + 18659459DC065258DE7784BF271058F5 /* RCTActivityIndicatorViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6673F66C74A05A4882DF4BF9A3CC26 /* RCTActivityIndicatorViewManager.h */; }; + 1932220CA1D27EBA1FEDF7EB891054F0 /* RCTNavItem.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 2E2A5605E8CEB14AD4F696DEB9802019 /* RCTNavItem.h */; }; + 1A4CF46751077421068FEB3846C8E54C /* RCTProfile.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = BCC75152F7BAD85B89962C789804F235 /* RCTProfile.h */; }; + 1BD987E01D7977439AED45F198D6A1F5 /* RCTDevLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = DFA57F291D66EBDEB5CC78078750DBB7 /* RCTDevLoadingView.m */; }; + 1BF318E276CCF0C8CCCBD83D635CD013 /* VLWebViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49A9D0044BA4FB3FDA5CCB363EA5C363 /* VLWebViewManager.swift */; }; + 1BF88B4167720CFB886EBC3543E0DCC6 /* RCTScrollView.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 86CBE7ECE4F33B3BB8AEF3B28550FC0C /* RCTScrollView.h */; }; + 1C7ED7B862F8C65361300F79FEEE823D /* Layout.h in Copy React/Layout Public Headers */ = {isa = PBXBuildFile; fileRef = 9F0DB9DF13CB90D97B401CAA58F24CCE /* Layout.h */; }; + 1D8D5B8D2720C4C3DE2B90510286B456 /* RCTSwitchManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 712701D6DABFBEFB2733C7C61849BDE2 /* RCTSwitchManager.h */; }; + 1E040935B949F172208626DE96254022 /* RCTPointerEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = BE594D64368916347CB04E234D46E8FA /* RCTPointerEvents.h */; }; + 1E294A35572A5EE8D3CD897712DCA4C0 /* RCTNavigator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CFF4517A2A4214FE9FE637CFC5069B4 /* RCTNavigator.m */; }; + 1E94193C95B868E90BA6BB6412FA70E1 /* RCTModalHostView.h in Headers */ = {isa = PBXBuildFile; fileRef = 27FA59E014A76D6D4B628C4D486F57A9 /* RCTModalHostView.h */; }; + 1F76CC424965B8286A78AD281ADC9539 /* UIView+React.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 5D38F8D50D8FA3ACF9A1B8C0F4CF301A /* UIView+React.h */; }; + 21943203E837B3664920FBB0932E141F /* RCTPerformanceLogger.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = D1EEB9C65C6BFB7EAD469E4DFFF44B12 /* RCTPerformanceLogger.h */; }; + 2439E1233379C05F5750231B82EE7052 /* RCTDevMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E3014AA160979B5C43694264E6F081 /* RCTDevMenu.h */; }; + 2582752AB420960FB02BF1FF883B4E13 /* RCTComponent.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 865771706E387A31C3167C494854797E /* RCTComponent.h */; }; + 27C42AE22054BFB42BB823A780A24D5A /* RCTPerfStats.m in Sources */ = {isa = PBXBuildFile; fileRef = 90F601E7DA100C53DF1123113968AB7B /* RCTPerfStats.m */; }; + 2899E99EC5F03A1746D27BAA1FEB8C8D /* RCTTiming.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = 91A9AA30DCDC737B05149604AD56F9CB /* RCTTiming.h */; }; + 2B112D833912BC93EEE513E00F087CCA /* RCTUtils.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = AC4811CABE7ADA4B17A145497AAEFDDE /* RCTUtils.h */; }; + 2BAC801E2746880834C300C30BB13261 /* RCTTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 91A9AA30DCDC737B05149604AD56F9CB /* RCTTiming.h */; }; + 2D7FCE2B67E8DD0FAF75A8B5D94A9301 /* RCTJavaScriptLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = AEC89743290B75DFA8B18392C301B25E /* RCTJavaScriptLoader.h */; }; + 2F232BCDCACFC2916AD563359904EE4A /* RCTAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D13B2679EC5963114DD9A6E79791D96 /* RCTAssert.h */; }; + 2F966372AA07FA58A1015A1621C1ABDA /* RCTBorderDrawing.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1AD280B89E1C86F721AD0080EDCF24F2 /* RCTBorderDrawing.h */; }; + 32F9F6D7BF83B6B988139F987F4DD323 /* RCTBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 593E278E661BA422413C5CB4E0176532 /* RCTBridge.m */; }; + 3387F5C2CAAF452BC7CCBDFEB0DA4D19 /* RCTConvert.m in Sources */ = {isa = PBXBuildFile; fileRef = 959EEE6736AAFF6D289F5C0D1DE3D28B /* RCTConvert.m */; }; + 34486562E99B6D9E76835C4C0E7F0C23 /* RCTWrapperViewController.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 3C8ABAF2D599C10C3DC1C6E7BDD35B22 /* RCTWrapperViewController.h */; }; + 34BD0438D880ECFE321F1EA15FE7AB32 /* RCTKeyCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = 928C3326EFD3BAB97A21898A4F0C1B1A /* RCTKeyCommands.m */; }; + 356C0B44D4EF64BDCCC0CC1854C286AA /* RCTBridgeDelegate.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = BCEA67F09F9C3FF41B18DA2269F3441C /* RCTBridgeDelegate.h */; }; + 36AAF21B4B46D683592D6B68F4AB757E /* RCTConvert+CoreLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 777A05DC8CF0672C65F0C021CDADAD01 /* RCTConvert+CoreLocation.m */; }; + 37703904BEFC1901CBE6624155F5D973 /* RCTTabBarManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 274B696964D5FB1D02D3DC65C52F1E7D /* RCTTabBarManager.m */; }; + 378D8AEE134F266DDBE3F69E66971247 /* RCTModalHostViewController.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 4CE29203413405852BD01DC7D6D3B082 /* RCTModalHostViewController.h */; }; + 37FE0AE846151B21DADCD3647FA70936 /* RCTProgressViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BD7C052758C90D5AF36CAD644528447B /* RCTProgressViewManager.m */; }; + 380BEAB22A4E8D7C36142361EA60A350 /* RCTView.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = ED86924CE7BECDA80D30FE1D3A50E240 /* RCTView.h */; }; + 382214A2C052956BC8CC34E7339B7983 /* RCTSwitch.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = EF2651B7BF1FCDFF2C3FACA5017CD067 /* RCTSwitch.h */; }; + 38A9DB28C167CEED85834EAFB49FE89A /* RCTTextDecorationLineType.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 3C71066D33A4D712BBAC136C90E3F4FD /* RCTTextDecorationLineType.h */; }; + 38FE3788A68595024E46596D54C0A8D2 /* React-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6830770B8DCECA47C7B72CABB3AC803F /* React-dummy.m */; }; + 39444B4183DAB846B15547428ED07A99 /* RCTJavaScriptExecutor.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 8CFF92AC3AC43F9E3FA43E39E447B04A /* RCTJavaScriptExecutor.h */; }; + 3C1F10FFD8385EC08A42A43E9AB613B3 /* RCTDefines.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 8A08971B7BA3F617C8FA0EB41B07A064 /* RCTDefines.h */; }; + 3C35CF94F5EFFB1ACC6D1AE805B6E9B5 /* VLViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 362F009C7D95BF41953CB12F73F7EB25 /* VLViewController.swift */; }; + 3CFE43B32EBD063BB3D92741E29C4239 /* RCTSparseArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DF331B2A08729831EC186E7016C80A2 /* RCTSparseArray.h */; }; + 3D145468F16D5C9F4326AF067B004D0A /* VerloopSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0885DDB219B73419E282D99C87B2E1D9 /* VerloopSDK.swift */; }; + 3D30BC8B84183E24EDD2F2F0439DC6EA /* RCTPicker.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 581BEA3CAD9A61F90204EA16CC3A09A4 /* RCTPicker.h */; }; + 3D94B449FA76EE4BADEB726CF4681B73 /* RCTTabBar.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1C78397F73FC71EA031634BC70437A /* RCTTabBar.h */; }; + 3F10F14DDF1F6BB28E295A01F8FAEB4E /* ScriptMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211A1BC9CC40ACE66DFAE93040936F2D /* ScriptMessageHandler.swift */; }; + 40FC9F1A2B7A30B942AA54433F803BF9 /* RCTPerfStats.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C671A355F27EF4BCCE8EC64A35792B2 /* RCTPerfStats.h */; }; + 415F9D3210FAB5A72E7651BE9ADCC84B /* UIView+Private.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 9C3494705C8D5C67CF7056F01B651AD0 /* UIView+Private.h */; }; + 4184FABEEC2BED74C1F01D0FE04E3DCA /* RCTTabBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E06F0FC3B81DACC9772B9A84F02FA855 /* RCTTabBarItem.m */; }; + 42226791D529D6891AA463EA1ED06C3D /* RCTBridgeModule.h in Headers */ = {isa = PBXBuildFile; fileRef = EEA212A133689A3CADC394DB4DB39233 /* RCTBridgeModule.h */; }; + 42D79A1AD278AD7FDF24985DB1E05D35 /* RCTRootView.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = E5E2C7D30AD930AE4A48213A9B4D9600 /* RCTRootView.h */; }; + 44E686D0EA3B95262B4C84F5344DBBED /* RCTKeyCommands.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 853A644DA6ABAD6DA6504A33EEC8D50F /* RCTKeyCommands.h */; }; + 47CD57F3F5E7425DEC5AAE5D81793194 /* RCTModalHostViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4872DD404033301B92B730A9F587ED2 /* RCTModalHostViewManager.m */; }; + 4872494204EF24C52BD98FB198389373 /* RCTBridge.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 7918EDE9F5BBA6610467209EE21CDC8B /* RCTBridge.h */; }; + 49A332B5669BD891F5307549CA229A27 /* RCTFrameUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 8941A48A5224F9D63EE9366D93B9CB0B /* RCTFrameUpdate.h */; }; + 4B277D5A986D99BB6FBC9D9C7D27C734 /* RCTJSMethodRegistrar.h in Headers */ = {isa = PBXBuildFile; fileRef = 079E42E21DB03B79288E71214051EFCE /* RCTJSMethodRegistrar.h */; }; + 4B6F03EEF2745F154872641A2BD8C3B7 /* Pods-RNVerloopSdk-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5721DAAA3BD8BF560C2235A84407DA6F /* Pods-RNVerloopSdk-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4BAABCDA2C568AACAEEB0714F0F8B3D8 /* RCTSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C520E77809C15F4E1AFB0AB5FC1B1A1 /* RCTSwitch.m */; }; + 4D7F62577A72D2788EF77CFFD0BC8F24 /* RCTNavItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E2A5605E8CEB14AD4F696DEB9802019 /* RCTNavItem.h */; }; + 4DC65260EBFA4612FFE152A761A3D5E9 /* Layout.c in Sources */ = {isa = PBXBuildFile; fileRef = DEADD54C9EEF66DE4CEFF1881A2F5384 /* Layout.c */; }; + 4DDDAA1129E8D6A2EC896141FEE7C2E9 /* RCTWrapperViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D2BD72A78FAC9A770AE33355CCEC27E /* RCTWrapperViewController.m */; }; + 4EB662217A3B7D6208D798BC7D5FFDF2 /* RCTPointAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 987F02002DB7F5EB47E5E1BE30209098 /* RCTPointAnnotation.m */; }; + 4EF33443B631ED0542DD43D729925D55 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A9BB70E06D26858AFE658C92CFE22EA /* JavaScriptCore.framework */; }; + 51AB39DB7E56B5C2C3FD8FCED055456A /* RCTShadowView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E2CFE714BA0A00ABEDA255D3E67287B /* RCTShadowView.h */; }; + 52AC9092180CF35EC86454964FE31D23 /* RCTAnimationType.h in Headers */ = {isa = PBXBuildFile; fileRef = E0BDDCA80D56F5809214E3242E615860 /* RCTAnimationType.h */; }; + 53056FC061E9784BF11E820F1FE5BF1D /* RCTWrapperViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C8ABAF2D599C10C3DC1C6E7BDD35B22 /* RCTWrapperViewController.h */; }; + 5333339C47F70E154C3779EF6A47CC28 /* RCTActivityIndicatorViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 82EE1CDDB08CD39597B64852BC1DC9E9 /* RCTActivityIndicatorViewManager.m */; }; + 541CC86DDC6CB0973DDB412FDE1C162A /* RCTTouchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 2821536D15757D3189193DA6D1F4E32D /* RCTTouchHandler.m */; }; + 546CEDFB98EB660AF6E0084ECE7A87CE /* RCTNavigator.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 518802CBE33EE1F6522D8F4EA71383F1 /* RCTNavigator.h */; }; + 561DF9C8AC21845402CFDECC8C0E8E9C /* RCTModalHostViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 921BF7580CAF9E1080B05DDBE8C26208 /* RCTModalHostViewManager.h */; }; + 57B69DEB34BC3E6EBC71A66975B042DE /* RCTTabBarManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1E790BDD0C4BAA876511DC5BA9F15F11 /* RCTTabBarManager.h */; }; + 5880F644A7BFEBE438BA3083ADA935F5 /* RCTModuleMap.h in Headers */ = {isa = PBXBuildFile; fileRef = B1EC6E491CDFEAD017FEDA2D96B6B00D /* RCTModuleMap.h */; }; + 59D395F08BF0A0AA05110C15F3A1DB34 /* RCTSwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = EF2651B7BF1FCDFF2C3FACA5017CD067 /* RCTSwitch.h */; }; + 5A208F0CAD2FE492393607C883A692AE /* RCTModuleMethod.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 40137AE123C5B29FB639DB83BC0B815A /* RCTModuleMethod.h */; }; + 5A5CC942F33E91B875DEC39098DCDC65 /* RCTModuleData.h in Headers */ = {isa = PBXBuildFile; fileRef = CADD22662BF57754E6681DCE2B117134 /* RCTModuleData.h */; }; + 5ADE337A522F51ECE1A89C382F5F214F /* RCTWebView.h in Headers */ = {isa = PBXBuildFile; fileRef = C50401083335B3676DA218EF59D0D804 /* RCTWebView.h */; }; + 5AEB4B7B47CC0C317DB36DFD067AF0A2 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = E992625AE58033C1EF93A0A959ABA069 /* Reachability.swift */; }; + 5B6C87346340697D7D58B309AAB0FC91 /* RCTConvert+MapKit.m in Sources */ = {isa = PBXBuildFile; fileRef = F913F287F054E079BE9D552428E39D4C /* RCTConvert+MapKit.m */; }; + 5D9BD21B381D73AC9789FAA902F8F677 /* RCTJavaScriptLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B6A2869F9311F2C57630E8888741A /* RCTJavaScriptLoader.m */; }; + 5EC8AFAC91CDCD9BCB828A047E018ADF /* RCTNavigatorManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = D4D722EDE2F96E1F6D89FA0A7B3B1AEC /* RCTNavigatorManager.h */; }; + 5EF55B20764C214BE973CE55F2A0B70C /* RCTNavigator.h in Headers */ = {isa = PBXBuildFile; fileRef = 518802CBE33EE1F6522D8F4EA71383F1 /* RCTNavigator.h */; }; + 5FB67AB91D8515DE3F32FDB0D1D4F492 /* RCTModuleMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = B2DFFA0900C72E83B9ABA8E2F86287EA /* RCTModuleMethod.m */; }; + 62E6E0A13C23EC4E61FAB09AD76627A7 /* RCTComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 865771706E387A31C3167C494854797E /* RCTComponent.h */; }; + 6304D6F42B06C1B2DD95E5CEDF90147A /* RCTSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 9497FBE1CF4A03731173B360EFFD551B /* RCTSlider.m */; }; + 6377A7E9FF4739E47D1C9F0D5D7BF26C /* RCTConvert+MapKit.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 2DD2021525C3BA6981DFDE7FF5BFC3CF /* RCTConvert+MapKit.h */; }; + 63C48F841C40BF098BF6240F7AAD018C /* RCTDevLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C12BF5A03222174FBF9436C95EE6F65 /* RCTDevLoadingView.h */; }; + 66505B28FDD802E89B8A893668C3237C /* RCTURLRequestDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 60C2C91FB5EBD0C3B476618A5C12ED9C /* RCTURLRequestDelegate.h */; }; + 665EBA83F4422325DE3D35FCBBD5A260 /* RCTUIManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E7081B5638A218EB530DAAC88CE3B8E2 /* RCTUIManager.h */; }; + 6731243B76C38758375A2CBCF8B05D46 /* RCTNavItemManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1607F7F7F53614893D27437612A22883 /* RCTNavItemManager.h */; }; + 674B62F1A1D8CE7D1367CACDCCB2020E /* RCTPerfStats.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 2C671A355F27EF4BCCE8EC64A35792B2 /* RCTPerfStats.h */; }; + 67B1F3CF8215CC8E6912856E97C0DD2B /* RCTProgressViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 417F707F01380FEADE93A5C39EEDD2D4 /* RCTProgressViewManager.h */; }; + 68D87AD538360BB84E35722B05B48610 /* RCTAppState.h in Headers */ = {isa = PBXBuildFile; fileRef = 820FAB899CF185DE81C3685C5B408969 /* RCTAppState.h */; }; + 6927E9E7A77D86B6B8E1EC79C0B41A50 /* RCTMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BB21D824B4BF345A78090825A4E9609 /* RCTMap.h */; }; + 69BF8B3E389B3D1701FCD98F03C94CD8 /* RCTModuleMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D219C02C95D1B950B1FD2E14F32DCAF /* RCTModuleMap.m */; }; + 6A80C0554BB197A74CF2F2E5028168DA /* RCTTabBarItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 68BD228B2357D92C4BF6A1688FBDC88D /* RCTTabBarItem.h */; }; + 6AF8F2E0CC39FC5236225B31C6EFB975 /* RCTSourceCode.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = 730BF239458CE4B4251B7DA8BB494FFA /* RCTSourceCode.h */; }; + 6B7EA1678424208362DE47A5C4DEDBF4 /* RCTDevMenu.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = E1E3014AA160979B5C43694264E6F081 /* RCTDevMenu.h */; }; + 6BCD8CFFF9ECC93FC1FD17EE48760345 /* RCTComponentData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B366ACC51D293983203F54AC58A2DD2 /* RCTComponentData.h */; }; + 6BE446AD731322D19C1A5FD95D839C09 /* RCTRedBox.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = E042848057889FCEF5B753C2545C66F1 /* RCTRedBox.h */; }; + 6CE2D73EF25F83C9839188B09FC7291D /* RCTSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C71433BE70BDE1A2078E082133AC3E29 /* RCTSegmentedControl.m */; }; + 6D136D93B0895869050A62B02EEB676C /* RCTSliderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F4CC7A3DE7B31E055AC356168C427F9 /* RCTSliderManager.h */; }; + 6EDBF6EA316995D54E97567439B54FD3 /* RCTModalHostView.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 27FA59E014A76D6D4B628C4D486F57A9 /* RCTModalHostView.h */; }; + 6F4834A2B9242C599AFD59508526C2B7 /* VLEventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A719004B3B4149B8EBC228C361400D5C /* VLEventDelegate.swift */; }; + 705754F19B621296B771015F696396DC /* RCTComponentData.m in Sources */ = {isa = PBXBuildFile; fileRef = DF0AEFECFF6307909A20394AF2D12F75 /* RCTComponentData.m */; }; + 70E485289F363040A7E01D75E0BC65DC /* RCTProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 61784D572958ED413625F38A44E9AA22 /* RCTProfile.m */; }; + 71CD25B3381184F97FEAEEE60713387B /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2048318AB6A4C6BF37A1CC3D9DD3F76 /* NetworkMonitor.swift */; }; + 72CCFE15A44CDB60180A350238A4E05F /* RCTFPSGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D2F1BCF6124295D82A7FE8ECCD494E9 /* RCTFPSGraph.m */; }; + 72F018AB1B44628570C2B691C99B28F8 /* RCTTiming.m in Sources */ = {isa = PBXBuildFile; fileRef = 3553ECFDD2E300A395209EF9C318AD0C /* RCTTiming.m */; }; + 7377A9244D15B1797821F5EF4D0465C8 /* RCTTouchHandler.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 9F4C4635CA7C34F94017F3DF9BCDD98F /* RCTTouchHandler.h */; }; + 73F978669931E91308941A487859A801 /* RCTPickerManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = E5099CD8EF57ED63A83BE4B0D6CF0E66 /* RCTPickerManager.h */; }; + 7426FCECB23E399F56EC7534CCF81384 /* RCTMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D283365CEADCFC70CB0044E7491703 /* RCTMapManager.m */; }; + 744E1C7783AA0BD0C20FCB7C2DB5507E /* RCTModalHostViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CE29203413405852BD01DC7D6D3B082 /* RCTModalHostViewController.h */; }; + 76C612079D4DF2455AC5E3867EA1C076 /* RCTKeyboardObserver.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 6F6333E1AA3250BB6D6F55B28D15F6E0 /* RCTKeyboardObserver.h */; }; + 79023E3097187C91D5A1A71D086B6681 /* RCTTextDecorationLineType.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C71066D33A4D712BBAC136C90E3F4FD /* RCTTextDecorationLineType.h */; }; + 7CD1C1EC399BCF05FCB5969E6A52FFFC /* RCTAccessibilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FEF5D8C100C05621F82628C4CC5E2C67 /* RCTAccessibilityManager.h */; }; + 7D9E7FD0F1931645A1EE0BB8CD67E388 /* RCTURLRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AA7E839FDF512E6C25D714EBE3C5ADA /* RCTURLRequestHandler.h */; }; + 7DE9EE0915490C21E6104FE12DEAF763 /* RCTTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C8DA2645ECA815A8D1083344C17F24C /* RCTTabBar.m */; }; + 7F38CCF4582FC1B6739279002C6922C1 /* RCTScrollableProtocol.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 110D4B5441905414CEFF2083005B76E7 /* RCTScrollableProtocol.h */; }; + 7FE2CB05E2B78ECDDE040F1178D619FF /* RCTWebViewExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = B342CEDB2F43CDA55724E1C008887EF8 /* RCTWebViewExecutor.m */; }; + 802A15DC0CB22B810FFD07285DD618EC /* RCTModuleData.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = CADD22662BF57754E6681DCE2B117134 /* RCTModuleData.h */; }; + 80521C7F082DD178360A1382BE1F851D /* RCTView.m in Sources */ = {isa = PBXBuildFile; fileRef = B731E0FA442E397BE04519F0E71CA139 /* RCTView.m */; }; + 80FBA392E4E39F1C65B5BED884E9C37A /* RCTPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3CEBDE88EDE2F5017A8956F17DBF77 /* RCTPicker.m */; }; + 824E1410B41814870E08D5210DFC2275 /* VLNavViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3BA8291D612805E4617A66772C4BE0 /* VLNavViewController.swift */; }; + 82549F2D66CE9FA8E9E5BD38D289BE05 /* RCTActivityIndicatorViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1A6673F66C74A05A4882DF4BF9A3CC26 /* RCTActivityIndicatorViewManager.h */; }; + 826B63C587206DC705DD53F60D2F897B /* RCTEventDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = EDB86D98529494E40CC25D5325D49F9A /* RCTEventDispatcher.m */; }; + 8428627048064F2C373A6E932D925C10 /* React-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EEF20436E6D4B66DC5EAFD63F966CF47 /* React-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 847135AB47AE1772975DD1E93BB8B76E /* RCTViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C362610731A25D6925E36AF7E38EB991 /* RCTViewManager.h */; }; + 84D96626E8A8E9F3858F5CF5154F104E /* RCTEventDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = C5FB5C9E9D1515B4A22D793825730F91 /* RCTEventDispatcher.h */; }; + 86B91FCF0D5B1F5C3976C4547E1CFA1D /* RCTPointerEvents.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = BE594D64368916347CB04E234D46E8FA /* RCTPointerEvents.h */; }; + 87084B9C8972E033816996B26003E1F1 /* RCTLog.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 3E293D7D69A68515B1A99FBA4288C389 /* RCTLog.h */; }; + 878DFC528DB62C23FD7E725AE43CF2E6 /* RCTWebViewExecutor.h in Copy React/Executors Public Headers */ = {isa = PBXBuildFile; fileRef = 1C1BB9D4F1ADB79901A912409384DF7F /* RCTWebViewExecutor.h */; }; + 880C6DAE70CDD5C3D3622A578BC14F72 /* RCTWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DD58701AF585C38B66C7115CFBBCE48 /* RCTWebView.m */; }; + 8AAA5A094800EE19CC5BA8FBE03DBD44 /* RCTDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6009A238021B0A2EE61CEE4B06E2ED50 /* RCTDatePickerManager.m */; }; + 8B62D8C8C575459C4DB0A6DEDDA2DA12 /* RCTViewControllerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 392080750C86180DF549EC1EEFC734B7 /* RCTViewControllerProtocol.h */; }; + 8CB9A04C4692B45E571DCBF4DCDC09B4 /* RCTTabBarItemManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 2E0C66CC0AF3A4C8C82F45DD5BAA51AF /* RCTTabBarItemManager.h */; }; + 8D16D23D4650178467B219004AED7CBE /* RCTModalHostViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 921BF7580CAF9E1080B05DDBE8C26208 /* RCTModalHostViewManager.h */; }; + 902890746801607AC24687C705AC36FE /* RCTModuleMap.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = B1EC6E491CDFEAD017FEDA2D96B6B00D /* RCTModuleMap.h */; }; + 917BE803BD6729E4E509A5D42669EDD3 /* VerloopSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = FFD39732160A132FF6F1E8335A031090 /* VerloopSDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 948CFB407E74340AA7A82EF9566D5C6B /* RCTStatusBarManager.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = 86CB43466D346797DC2450C73912F87B /* RCTStatusBarManager.h */; }; + 94A16405BEC9552A71B335E8BE8100B3 /* RCTContextExecutor.h in Copy React/Executors Public Headers */ = {isa = PBXBuildFile; fileRef = 341C28E3D24A81319D6D025DE441AD90 /* RCTContextExecutor.h */; }; + 950AFC2E1F15A656C0009449FE292F64 /* RCTAssert.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 6D13B2679EC5963114DD9A6E79791D96 /* RCTAssert.h */; }; + 95A714A5BFA6E3611E8F7222DD92378B /* RCTTabBarItemManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E0C66CC0AF3A4C8C82F45DD5BAA51AF /* RCTTabBarItemManager.h */; }; + 96A1B0199A2863039D704E832E3041F3 /* RCTAccessibilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 816BBA9198B1BF457BBE5E9A2CB186AF /* RCTAccessibilityManager.m */; }; + 97CC2A1D7B7C719B9846578EEFBB313C /* RCTURLRequestDelegate.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 60C2C91FB5EBD0C3B476618A5C12ED9C /* RCTURLRequestDelegate.h */; }; + 97F35316C2DD156005C37329ACB12110 /* RCTSourceCode.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F48DBBF295A034B1288872EA4B448A /* RCTSourceCode.m */; }; + 9832FAE4BF235B97217FDA7D86B5D93A /* RCTBridgeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEA67F09F9C3FF41B18DA2269F3441C /* RCTBridgeDelegate.h */; }; + 98D40F9B8355736823881CC193413812 /* RCTKeyCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = 853A644DA6ABAD6DA6504A33EEC8D50F /* RCTKeyCommands.h */; }; + 995C39862F6B67DE00B50D3226185B68 /* RCTContextExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = 341C28E3D24A81319D6D025DE441AD90 /* RCTContextExecutor.h */; }; + 9964A025785462770F18C21B0B0420CC /* RCTFrameUpdate.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 8941A48A5224F9D63EE9366D93B9CB0B /* RCTFrameUpdate.h */; }; + 9A12D274D40C0611A4C2DAAC501BF598 /* RCTAutoInsetsProtocol.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = ED9F5EABBCBC8DB568C1CE23F789EC51 /* RCTAutoInsetsProtocol.h */; }; + 9A3191EBB354A25A6FCF39ACAF304525 /* UIView+React.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D38F8D50D8FA3ACF9A1B8C0F4CF301A /* UIView+React.h */; }; + 9A54C5A59B825589ED094F47EFC605CB /* RCTMapManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DE44995D1777DA42FBF0AC27DBBA516B /* RCTMapManager.h */; }; + 9A5FA4DD18CA2ABEAA61D069F0A95289 /* RCTShadowView.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 9E2CFE714BA0A00ABEDA255D3E67287B /* RCTShadowView.h */; }; + 9BBA28B80C45E8756D2FC6237E6400FA /* Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F0DB9DF13CB90D97B401CAA58F24CCE /* Layout.h */; }; + 9CC44E3FAA3BE3B3CD02088992233CEB /* RCTScrollViewManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 936EC1997FE748B3D01FCD1AB6B0ECE2 /* RCTScrollViewManager.h */; }; + 9E353DA8937A4319BEF1DA83FD0CEBDF /* RCTMapManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = DE44995D1777DA42FBF0AC27DBBA516B /* RCTMapManager.h */; }; + A142B0BEC264C3D4F280A52228E2F36F /* RCTSwitchManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D1239634E8B235FD23AF965F6C2E898 /* RCTSwitchManager.m */; }; + A30F7C946E1561B8F57017E57E1D203F /* RCTBridgeModule.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = EEA212A133689A3CADC394DB4DB39233 /* RCTBridgeModule.h */; }; + A3EE586042FB47078782388477EF5CED /* RCTWebView.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = C50401083335B3676DA218EF59D0D804 /* RCTWebView.h */; }; + A4D128B5D23F638DC639EED7E2974523 /* RCTExceptionsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1141FF163CCB380533F6971821A05121 /* RCTExceptionsManager.m */; }; + A600C707E82F3135685BF1693652A997 /* RCTNavItemManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 64AB5EA88B915B2F4D6E8BDA1AED515A /* RCTNavItemManager.m */; }; + A6FD1FF7C487E5F7F677A74B83CBED83 /* RCTFrameUpdate.m in Sources */ = {isa = PBXBuildFile; fileRef = 23C035EB63DB69BE476E9BA6F4134440 /* RCTFrameUpdate.m */; }; + A75E50877D70A5DF64334488D6CB70FF /* RCTDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A08971B7BA3F617C8FA0EB41B07A064 /* RCTDefines.h */; }; + A94F00821800CD7007BBE076B19B6D97 /* RCTSliderManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 5F4CC7A3DE7B31E055AC356168C427F9 /* RCTSliderManager.h */; }; + AA69452DCFE0A4ECF94DB33769C32569 /* RCTJSMethodRegistrar.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 079E42E21DB03B79288E71214051EFCE /* RCTJSMethodRegistrar.h */; }; + AD2F2AC289E8840A9698DFFAC7BD8A77 /* RCTCache.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9919C4198100FD579E9CD4C29DAEBC /* RCTCache.m */; }; + AE146255202C73EADB8CC676140E9A74 /* RCTConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 99989C370E8C60710DF094B00DF1F7BE /* RCTConvert.h */; }; + AED84C9B1EC8AD08DCC4759EE9DBE2DC /* RCTWebViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B79F7473ACBDDC317778DA9855CE8CD1 /* RCTWebViewManager.m */; }; + AF031E294AA4B04973D4BACE6B3D5B70 /* RCTTabBarItemManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EE843712DB3CCB963E7DAE9B4C0E090 /* RCTTabBarItemManager.m */; }; + AF5EB58A7B1E297BAEF3AC208F2C9CB4 /* RCTKeyboardObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F6333E1AA3250BB6D6F55B28D15F6E0 /* RCTKeyboardObserver.h */; }; + B256E5A7C696344002976550291E6540 /* RCTSegmentedControl.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = A58A7F8F58DB43F94F3D823BC43DB654 /* RCTSegmentedControl.h */; }; + B2E90B30F44C72EFF07F35D3E4FD974E /* RCTSlider.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 59298E7239F2E84ABF9A01D304D69D31 /* RCTSlider.h */; }; + B41449BCE2232BF1F29E3BC005DC71A3 /* RCTAppState.m in Sources */ = {isa = PBXBuildFile; fileRef = 687105957EE442614799449069FADC8F /* RCTAppState.m */; }; + B4394D58294873F7419F9ED73FEA0414 /* RCTWebViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 053AEAB11F016868E21550C85882276D /* RCTWebViewManager.h */; }; + B51837DCBE848D63181EAD679C9FCB5F /* RCTModalHostViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 707B2FECF158C6C2226ABDF3FD757750 /* RCTModalHostViewController.m */; }; + B60E1A27A3DCB81C8658AC8B3599E3DE /* RCTScrollViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 936EC1997FE748B3D01FCD1AB6B0ECE2 /* RCTScrollViewManager.h */; }; + B69675DD3A1CA52029AD404587946B87 /* RCTModuleMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 40137AE123C5B29FB639DB83BC0B815A /* RCTModuleMethod.h */; }; + B6A7290455EE501245FF3C9739DEB677 /* RCTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E293D7D69A68515B1A99FBA4288C389 /* RCTLog.h */; }; + B7D8A54E3622D1A1F09886AB7D1BE7A2 /* RCTSparseArray.m in Sources */ = {isa = PBXBuildFile; fileRef = FDC6B3D74530164DCE87A991053D743C /* RCTSparseArray.m */; }; + B851C88DBDDE3EDA6C14CB9DB37BDF5C /* RCTScrollableProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 110D4B5441905414CEFF2083005B76E7 /* RCTScrollableProtocol.h */; }; + B88E5DB8E88FAFFDB5F1A0C872C467E1 /* RCTJavaScriptExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CFF92AC3AC43F9E3FA43E39E447B04A /* RCTJavaScriptExecutor.h */; }; + B8BE8BD6AFAD80715035216CADDBCB4E /* RCTBorderDrawing.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AD280B89E1C86F721AD0080EDCF24F2 /* RCTBorderDrawing.h */; }; + B908928FF3E18C663F6DC7F3234F3250 /* RCTExceptionsManager.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = F454823D34C72CEE22AFF7A395C0256A /* RCTExceptionsManager.h */; }; + B919D3A32B3502C320D036F85641FAE2 /* RCTBatchedBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CABC1F0A4428487D5D848007E0CEF5B /* RCTBatchedBridge.m */; }; + B98B4AADC54AEA78F3206284B0D542A2 /* RCTTabBar.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = CA1C78397F73FC71EA031634BC70437A /* RCTTabBar.h */; }; + BA2F41267276C9AA5F65FD03E1B6DD8F /* RCTMap.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 1BB21D824B4BF345A78090825A4E9609 /* RCTMap.h */; }; + BA60D9D598FD0B00DB47CFC4DB4E4AC9 /* RCTProgressViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 417F707F01380FEADE93A5C39EEDD2D4 /* RCTProgressViewManager.h */; }; + BA86D83EF176870756D99B7DEAFAEBA2 /* RCTUIManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D181B5ED44918AA1DC1A12764BB8EE87 /* RCTUIManager.m */; }; + BAACAA4E4D3943AFAB4B76EC617C76E1 /* RCTAlertManager.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = A77C891B6C9FC3FE3429C6749A16486E /* RCTAlertManager.h */; }; + BB5F48118EECF77DDD5F7E737971DF6E /* RCTViewControllerProtocol.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 392080750C86180DF549EC1EEFC734B7 /* RCTViewControllerProtocol.h */; }; + BB98C1993A4B632B99FB28F9F7A2C104 /* RCTTabBarManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E790BDD0C4BAA876511DC5BA9F15F11 /* RCTTabBarManager.h */; }; + BCC7DAE0EB5C7978D13BEB20E864E1CF /* RCTNavItem.m in Sources */ = {isa = PBXBuildFile; fileRef = FC6AE280FA3FA6C08E88F5EDB6D938E2 /* RCTNavItem.m */; }; + BD9C0D779BD6C1B08D74C2D0E7DB4EBB /* RCTModalHostView.m in Sources */ = {isa = PBXBuildFile; fileRef = 36740C0B5268371F072E0BFD03CC5DE6 /* RCTModalHostView.m */; }; + BF0E641626587BD0E37B742C3AC97B14 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37BC21AE98AE360F5EF7132520B540F4 /* Foundation.framework */; }; + C319144FD741D563227705AA5DCEA7E1 /* VLEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD1625E11BFF708195BBCA3EFDD2DBD /* VLEvent.swift */; }; + C3492BFDEABAB243625C3536B35D4B11 /* RCTDatePickerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A33833983E00903DEF3A3FA3F55A01 /* RCTDatePickerManager.h */; }; + C451DD80EDA817372187BC730144B3AA /* RCTViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D163DB761EBB74EF3941A3EDF9E02CA /* RCTViewManager.m */; }; + C5DB1C1AFB2340BC753642A5E88B1FCB /* RCTPerformanceLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = D1EEB9C65C6BFB7EAD469E4DFFF44B12 /* RCTPerformanceLogger.h */; }; + C6CA6B1B86DA9A3686B33785F9B80EF1 /* RCTShadowView.m in Sources */ = {isa = PBXBuildFile; fileRef = F1E2352BF245521521F4A0416E2B3A77 /* RCTShadowView.m */; }; + C85D7C8D30F432A696827C520FF6A50C /* RCTPickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D72859B332650958A0B5DAAA479612FC /* RCTPickerManager.m */; }; + C890D0E3BFA6EE77D84C1288DAF0D439 /* UIView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C3494705C8D5C67CF7056F01B651AD0 /* UIView+Private.h */; }; + C8D61D4CFA5BE78F2448A7F8E3D2E7A3 /* RCTScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CBE7ECE4F33B3BB8AEF3B28550FC0C /* RCTScrollView.h */; }; + CA0D8BA113A0CB797B68BEA4A0796EAD /* RCTFPSGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 59BE96916B2C596EF941C535333C420D /* RCTFPSGraph.h */; }; + CC6D0C3A2DA09D9F954B94F292947679 /* RCTSwitchManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 712701D6DABFBEFB2733C7C61849BDE2 /* RCTSwitchManager.h */; }; + CD1C03805B5D95D97707D779A7E6D746 /* RCTViewManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = C362610731A25D6925E36AF7E38EB991 /* RCTViewManager.h */; }; + CD3437AC70934841D36B03290AF8C62B /* VerloopSDKiOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D82A49AD1043E612EF4312FE184751 /* VerloopSDKiOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CD37A6D391820DB9666CC58A691E1A37 /* RCTKeyboardObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = BD67D2CABE7193807447351012B5E2C3 /* RCTKeyboardObserver.m */; }; + CD3BD42912D2D62E249E98394F6FC16F /* RCTStatusBarManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EC32F7AA4741808A288E49B1D8427D93 /* RCTStatusBarManager.m */; }; + CEEAF5E0E2FC93304862214A8B1E0909 /* RCTSegmentedControl.h in Headers */ = {isa = PBXBuildFile; fileRef = A58A7F8F58DB43F94F3D823BC43DB654 /* RCTSegmentedControl.h */; }; + CEF3D3AF4BA53FBA818B22244A0D1470 /* VLConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECD5040ED0D1FCE35076228F38E88C /* VLConfig.swift */; }; + CFC59B544CB69BCC535AC4C4A96DC2A1 /* RCTPerformanceLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 40440B4874CC7E57406BFC0D6C7FD5DE /* RCTPerformanceLogger.m */; }; + CFC7CDCAE582124DFF3B3FE944DC50ED /* RCTAutoInsetsProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9F5EABBCBC8DB568C1CE23F789EC51 /* RCTAutoInsetsProtocol.h */; }; + D1E86441B124FAA4301A8AFE28C05023 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37BC21AE98AE360F5EF7132520B540F4 /* Foundation.framework */; }; + D2313CE0D5A88ABBF95FAF2FCF30916C /* RCTSegmentedControlManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EE9BA2B263D47BFFCDB5B8D499E9A69 /* RCTSegmentedControlManager.h */; }; + D5FC047765510F20B7D5DFE259DC844C /* RCTSegmentedControlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C30C3628EE07A05EF2AAEB7D256302 /* RCTSegmentedControlManager.m */; }; + D66FFCD433C5E28EF09D276E8F9855D3 /* RCTContextExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B7794E87A7AB46E347C66CEB53DDE2 /* RCTContextExecutor.m */; }; + D70DBFA6F34FFDB478E182819BA2AF97 /* RCTNavigatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A931BEC912FE34FB55EA22CC7F2DC3 /* RCTNavigatorManager.m */; }; + D70FE58DF04E14BB083BE0D0E3397DDF /* RCTDatePickerManager.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 22A33833983E00903DEF3A3FA3F55A01 /* RCTDatePickerManager.h */; }; + D74342C1190145C2D38AC428336E1E29 /* RCTWebViewExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C1BB9D4F1ADB79901A912409384DF7F /* RCTWebViewExecutor.h */; }; + D78D2BD1904DE076481B73F2A206D09A /* RCTSourceCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 730BF239458CE4B4251B7DA8BB494FFA /* RCTSourceCode.h */; }; + D7BCBA38CF6EB1A9862BB5CFBF89E1C7 /* RCTNavItemManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1607F7F7F53614893D27437612A22883 /* RCTNavItemManager.h */; }; + D8E004712628BDF8DB03FCEDFD3B4C18 /* VLJSInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A13213FC54E963F0D212C35F16B0C5E /* VLJSInterface.swift */; }; + D9D1D1172E1A2832452C89DA5E7335F7 /* RCTRedBox.h in Headers */ = {isa = PBXBuildFile; fileRef = E042848057889FCEF5B753C2545C66F1 /* RCTRedBox.h */; }; + DA5698582E4CBDE9A48B9A6EE7082DD2 /* Pods-RNVerloopSdk-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CB8899B135BC575CA6B06094354E9CFD /* Pods-RNVerloopSdk-dummy.m */; }; + DB07A9CAD51667D8661187B56713E140 /* RCTInvalidating.h in Headers */ = {isa = PBXBuildFile; fileRef = 49BEBC96158E9B6E307FD481C4684E40 /* RCTInvalidating.h */; }; + DC8557F7118DE18AEBE91B9E8B8E2579 /* RCTAsyncLocalStorage.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = A2492065D694A0A44C29D7B678281E09 /* RCTAsyncLocalStorage.h */; }; + DED307CBCEB675B2968BDBBA0FF74AD9 /* RCTMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DED3B4E03BF2728E4E816FCDE2DB82B /* RCTMap.m */; }; + E035D58CDF4CBAB28224EAEBDD68C43A /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AC1DFCEE36685A6D6B22F8E483CB903 /* RCTAssert.m */; }; + E3122E2700DDA080080200A377019368 /* VLExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A996438816CF44027C78D61A1CB9169F /* VLExtensions.swift */; }; + E5007ABD3FEC86F265535CE8959D056D /* RCTFPSGraph.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 59BE96916B2C596EF941C535333C420D /* RCTFPSGraph.h */; }; + E561D3BA4AD56507F9F4815C9A68E5D1 /* RCTView.h in Headers */ = {isa = PBXBuildFile; fileRef = ED86924CE7BECDA80D30FE1D3A50E240 /* RCTView.h */; }; + E56F805421C07608115C145243E5312B /* UIView+React.m in Sources */ = {isa = PBXBuildFile; fileRef = 50F0CB24A6276A6E7AA2009FEBA2463F /* UIView+React.m */; }; + E5DA7386A3C3821BCB26987A0FE22E4D /* RCTPickerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E5099CD8EF57ED63A83BE4B0D6CF0E66 /* RCTPickerManager.h */; }; + E611519CD7B3AC3D325803FD405707A1 /* RCTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 805AFC94BA56B18650A978D4672EA351 /* RCTUtils.m */; }; + E6D8452050E50DC5063BCF2839A448D1 /* RCTURLRequestHandler.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 2AA7E839FDF512E6C25D714EBE3C5ADA /* RCTURLRequestHandler.h */; }; + E6D9AC4CD814DEF09D7A3837AB7BC1B4 /* RCTBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 7918EDE9F5BBA6610467209EE21CDC8B /* RCTBridge.h */; }; + E73C6DE343B3505C84B8A6FF8518FC99 /* RCTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = C2551CAA85B646344BF984CC49FBD535 /* RCTLog.m */; }; + E9277E793375A3A28CB6A7383B49DCBE /* RCTAsyncLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = A2492065D694A0A44C29D7B678281E09 /* RCTAsyncLocalStorage.h */; }; + E92DDDC02495E8404182B649B6370396 /* RCTSliderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 067FCE76F2DB013B191C770AF3197E73 /* RCTSliderManager.m */; }; + EA5C3406E897CFF863F829EE119D7F43 /* RCTTouchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F4C4635CA7C34F94017F3DF9BCDD98F /* RCTTouchHandler.h */; }; + EBCB1C73D9160FC21AC1995D37761523 /* RCTAlertManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A77C891B6C9FC3FE3429C6749A16486E /* RCTAlertManager.h */; }; + EC91536E7DE2AD98F869A3CF9184C65A /* RCTNavigatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D4D722EDE2F96E1F6D89FA0A7B3B1AEC /* RCTNavigatorManager.h */; }; + ED31DC5E1C037A655102655B14CF51FD /* RCTTabBarItem.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = 68BD228B2357D92C4BF6A1688FBDC88D /* RCTTabBarItem.h */; }; + EE461325C07A31A92AE07E440C13C51A /* RCTPointAnnotation.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = F459B29A1C124E84F8755D71D1DFFB6A /* RCTPointAnnotation.h */; }; + F022E4E64659F92D7C6C27C112DF6EC3 /* RCTAccessibilityManager.h in Copy React/Modules Public Headers */ = {isa = PBXBuildFile; fileRef = FEF5D8C100C05621F82628C4CC5E2C67 /* RCTAccessibilityManager.h */; }; + F0C9490260E97A60F3AB187C8F742533 /* VerloopSDKiOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD75F7F9094A920D30F506F38952B138 /* VerloopSDKiOS-dummy.m */; }; + F1C0B80C92F87632E55FF2F065FA0AF7 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48B053AB7DBDF184C4283434D377EF3 /* Constants.swift */; }; + F24ACC14781AA764D3931AA95887ECF2 /* RCTCache.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 03DDA0C6B880781059C8630A42FBA48A /* RCTCache.h */; }; + F28F79F2E77FFA6B672B0E061E58F8AE /* RCTBorderDrawing.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C2B5A95B5DB469DC4AE4041EC4DB72 /* RCTBorderDrawing.m */; }; + F5FEB247E977E3665182C13443FE0228 /* RCTSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 59298E7239F2E84ABF9A01D304D69D31 /* RCTSlider.h */; }; + F6AD645FF09B6BE516A1592FEFF91321 /* RCTRedBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EE2004379F7892F3CF84DE1152A12EE /* RCTRedBox.m */; }; + F6F8D9D78188E42A0DFEA2142734B68D /* RCTProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC75152F7BAD85B89962C789804F235 /* RCTProfile.h */; }; + F6FA2199C4C3FF18CC65541AAD31611F /* RCTRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = F512157E25A1E3E9EEA82D917F6F46B9 /* RCTRootView.m */; }; + F7EBFD06475D589B7DAF26F7AEBD35F0 /* RCTConvert.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = 99989C370E8C60710DF094B00DF1F7BE /* RCTConvert.h */; }; + F8EB3696E8BF1B7DB3FA7EE99FD0B45C /* RCTEventDispatcher.h in Copy React/Base Public Headers */ = {isa = PBXBuildFile; fileRef = C5FB5C9E9D1515B4A22D793825730F91 /* RCTEventDispatcher.h */; }; + FA749202B2F7DF0CC8828D06653B9649 /* RCTDevMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = B0C0CCE499083A6B11E7933B79FDF1FC /* RCTDevMenu.m */; }; + FADBD9D37C324000ABFE4B14EB6B3C67 /* RCTRootView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5E2C7D30AD930AE4A48213A9B4D9600 /* RCTRootView.h */; }; + FEEB7E58EEF0CAA52683C306781F7F4C /* RCTAnimationType.h in Copy React/Views Public Headers */ = {isa = PBXBuildFile; fileRef = E0BDDCA80D56F5809214E3242E615860 /* RCTAnimationType.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 553EC9542309856EB683DFF98BFDA166 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1BEE828C124E6416179B904A9F66D794; + remoteInfo = React; + }; + 9B08A6D9EE495E4649E823596CD430EE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 21A74B5A5E2B97F60184141B9134706A; + remoteInfo = VerloopSDKiOS; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1E0DD3A1E2494870C4E481C8A15DB257 /* Copy React/Base Public Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(PUBLIC_HEADERS_FOLDER_PATH)/React/Base"; + dstSubfolderSpec = 16; + files = ( + 950AFC2E1F15A656C0009449FE292F64 /* RCTAssert.h in Copy React/Base Public Headers */, + 4872494204EF24C52BD98FB198389373 /* RCTBridge.h in Copy React/Base Public Headers */, + 356C0B44D4EF64BDCCC0CC1854C286AA /* RCTBridgeDelegate.h in Copy React/Base Public Headers */, + A30F7C946E1561B8F57017E57E1D203F /* RCTBridgeModule.h in Copy React/Base Public Headers */, + F24ACC14781AA764D3931AA95887ECF2 /* RCTCache.h in Copy React/Base Public Headers */, + F7EBFD06475D589B7DAF26F7AEBD35F0 /* RCTConvert.h in Copy React/Base Public Headers */, + 3C1F10FFD8385EC08A42A43E9AB613B3 /* RCTDefines.h in Copy React/Base Public Headers */, + F8EB3696E8BF1B7DB3FA7EE99FD0B45C /* RCTEventDispatcher.h in Copy React/Base Public Headers */, + E5007ABD3FEC86F265535CE8959D056D /* RCTFPSGraph.h in Copy React/Base Public Headers */, + 9964A025785462770F18C21B0B0420CC /* RCTFrameUpdate.h in Copy React/Base Public Headers */, + 05AF676BFC563877E0B35173B031C1FA /* RCTInvalidating.h in Copy React/Base Public Headers */, + 39444B4183DAB846B15547428ED07A99 /* RCTJavaScriptExecutor.h in Copy React/Base Public Headers */, + 0DCD9AFFA34B40582DC974EDADDFBBEC /* RCTJavaScriptLoader.h in Copy React/Base Public Headers */, + AA69452DCFE0A4ECF94DB33769C32569 /* RCTJSMethodRegistrar.h in Copy React/Base Public Headers */, + 76C612079D4DF2455AC5E3867EA1C076 /* RCTKeyboardObserver.h in Copy React/Base Public Headers */, + 44E686D0EA3B95262B4C84F5344DBBED /* RCTKeyCommands.h in Copy React/Base Public Headers */, + 87084B9C8972E033816996B26003E1F1 /* RCTLog.h in Copy React/Base Public Headers */, + 802A15DC0CB22B810FFD07285DD618EC /* RCTModuleData.h in Copy React/Base Public Headers */, + 902890746801607AC24687C705AC36FE /* RCTModuleMap.h in Copy React/Base Public Headers */, + 5A208F0CAD2FE492393607C883A692AE /* RCTModuleMethod.h in Copy React/Base Public Headers */, + 21943203E837B3664920FBB0932E141F /* RCTPerformanceLogger.h in Copy React/Base Public Headers */, + 674B62F1A1D8CE7D1367CACDCCB2020E /* RCTPerfStats.h in Copy React/Base Public Headers */, + 1A4CF46751077421068FEB3846C8E54C /* RCTProfile.h in Copy React/Base Public Headers */, + 42D79A1AD278AD7FDF24985DB1E05D35 /* RCTRootView.h in Copy React/Base Public Headers */, + 0329A75C435FFA2123C7829EA94D5A3F /* RCTSparseArray.h in Copy React/Base Public Headers */, + 7377A9244D15B1797821F5EF4D0465C8 /* RCTTouchHandler.h in Copy React/Base Public Headers */, + 97CC2A1D7B7C719B9846578EEFBB313C /* RCTURLRequestDelegate.h in Copy React/Base Public Headers */, + E6D8452050E50DC5063BCF2839A448D1 /* RCTURLRequestHandler.h in Copy React/Base Public Headers */, + 2B112D833912BC93EEE513E00F087CCA /* RCTUtils.h in Copy React/Base Public Headers */, + ); + name = "Copy React/Base Public Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + 71DE862B78B2A8CED6AAC580C3712941 /* Copy React/Executors Public Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(PUBLIC_HEADERS_FOLDER_PATH)/React/Executors"; + dstSubfolderSpec = 16; + files = ( + 94A16405BEC9552A71B335E8BE8100B3 /* RCTContextExecutor.h in Copy React/Executors Public Headers */, + 878DFC528DB62C23FD7E725AE43CF2E6 /* RCTWebViewExecutor.h in Copy React/Executors Public Headers */, + ); + name = "Copy React/Executors Public Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + 7F49B97F88A7FCADBDE308E55E57B775 /* Copy React/Layout Public Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(PUBLIC_HEADERS_FOLDER_PATH)/React/Layout"; + dstSubfolderSpec = 16; + files = ( + 1C7ED7B862F8C65361300F79FEEE823D /* Layout.h in Copy React/Layout Public Headers */, + ); + name = "Copy React/Layout Public Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + 930A8545B2CF8D340D47656360D66554 /* Copy React/Modules Public Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(PUBLIC_HEADERS_FOLDER_PATH)/React/Modules"; + dstSubfolderSpec = 16; + files = ( + F022E4E64659F92D7C6C27C112DF6EC3 /* RCTAccessibilityManager.h in Copy React/Modules Public Headers */, + BAACAA4E4D3943AFAB4B76EC617C76E1 /* RCTAlertManager.h in Copy React/Modules Public Headers */, + 0D1EC645B6869786C78FCB4BD357ABF8 /* RCTAppState.h in Copy React/Modules Public Headers */, + DC8557F7118DE18AEBE91B9E8B8E2579 /* RCTAsyncLocalStorage.h in Copy React/Modules Public Headers */, + 07C01963DE84CFC7B8DF870B552F0722 /* RCTDevLoadingView.h in Copy React/Modules Public Headers */, + 6B7EA1678424208362DE47A5C4DEDBF4 /* RCTDevMenu.h in Copy React/Modules Public Headers */, + B908928FF3E18C663F6DC7F3234F3250 /* RCTExceptionsManager.h in Copy React/Modules Public Headers */, + EE461325C07A31A92AE07E440C13C51A /* RCTPointAnnotation.h in Copy React/Modules Public Headers */, + 6BE446AD731322D19C1A5FD95D839C09 /* RCTRedBox.h in Copy React/Modules Public Headers */, + 6AF8F2E0CC39FC5236225B31C6EFB975 /* RCTSourceCode.h in Copy React/Modules Public Headers */, + 948CFB407E74340AA7A82EF9566D5C6B /* RCTStatusBarManager.h in Copy React/Modules Public Headers */, + 2899E99EC5F03A1746D27BAA1FEB8C8D /* RCTTiming.h in Copy React/Modules Public Headers */, + 06AECE072FF0D18A462EAECD0ECA4CB7 /* RCTUIManager.h in Copy React/Modules Public Headers */, + ); + name = "Copy React/Modules Public Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + E0EC0689716AD127039CE1C91AF23381 /* Copy React/Views Public Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(PUBLIC_HEADERS_FOLDER_PATH)/React/Views"; + dstSubfolderSpec = 16; + files = ( + 82549F2D66CE9FA8E9E5BD38D289BE05 /* RCTActivityIndicatorViewManager.h in Copy React/Views Public Headers */, + FEEB7E58EEF0CAA52683C306781F7F4C /* RCTAnimationType.h in Copy React/Views Public Headers */, + 9A12D274D40C0611A4C2DAAC501BF598 /* RCTAutoInsetsProtocol.h in Copy React/Views Public Headers */, + 2F966372AA07FA58A1015A1621C1ABDA /* RCTBorderDrawing.h in Copy React/Views Public Headers */, + 2582752AB420960FB02BF1FF883B4E13 /* RCTComponent.h in Copy React/Views Public Headers */, + 0975436AD99B45FE0C9805A6462A877A /* RCTComponentData.h in Copy React/Views Public Headers */, + 0DD9720CE5F6E8B52ADFAA650E24CEAB /* RCTConvert+CoreLocation.h in Copy React/Views Public Headers */, + 6377A7E9FF4739E47D1C9F0D5D7BF26C /* RCTConvert+MapKit.h in Copy React/Views Public Headers */, + D70FE58DF04E14BB083BE0D0E3397DDF /* RCTDatePickerManager.h in Copy React/Views Public Headers */, + BA2F41267276C9AA5F65FD03E1B6DD8F /* RCTMap.h in Copy React/Views Public Headers */, + 9E353DA8937A4319BEF1DA83FD0CEBDF /* RCTMapManager.h in Copy React/Views Public Headers */, + 6EDBF6EA316995D54E97567439B54FD3 /* RCTModalHostView.h in Copy React/Views Public Headers */, + 378D8AEE134F266DDBE3F69E66971247 /* RCTModalHostViewController.h in Copy React/Views Public Headers */, + 8D16D23D4650178467B219004AED7CBE /* RCTModalHostViewManager.h in Copy React/Views Public Headers */, + 546CEDFB98EB660AF6E0084ECE7A87CE /* RCTNavigator.h in Copy React/Views Public Headers */, + 5EC8AFAC91CDCD9BCB828A047E018ADF /* RCTNavigatorManager.h in Copy React/Views Public Headers */, + 1932220CA1D27EBA1FEDF7EB891054F0 /* RCTNavItem.h in Copy React/Views Public Headers */, + 6731243B76C38758375A2CBCF8B05D46 /* RCTNavItemManager.h in Copy React/Views Public Headers */, + 3D30BC8B84183E24EDD2F2F0439DC6EA /* RCTPicker.h in Copy React/Views Public Headers */, + 73F978669931E91308941A487859A801 /* RCTPickerManager.h in Copy React/Views Public Headers */, + 86B91FCF0D5B1F5C3976C4547E1CFA1D /* RCTPointerEvents.h in Copy React/Views Public Headers */, + BA60D9D598FD0B00DB47CFC4DB4E4AC9 /* RCTProgressViewManager.h in Copy React/Views Public Headers */, + 7F38CCF4582FC1B6739279002C6922C1 /* RCTScrollableProtocol.h in Copy React/Views Public Headers */, + 1BF88B4167720CFB886EBC3543E0DCC6 /* RCTScrollView.h in Copy React/Views Public Headers */, + B60E1A27A3DCB81C8658AC8B3599E3DE /* RCTScrollViewManager.h in Copy React/Views Public Headers */, + B256E5A7C696344002976550291E6540 /* RCTSegmentedControl.h in Copy React/Views Public Headers */, + 097E32B35C4771D22ED6B16409119D1D /* RCTSegmentedControlManager.h in Copy React/Views Public Headers */, + 9A5FA4DD18CA2ABEAA61D069F0A95289 /* RCTShadowView.h in Copy React/Views Public Headers */, + B2E90B30F44C72EFF07F35D3E4FD974E /* RCTSlider.h in Copy React/Views Public Headers */, + A94F00821800CD7007BBE076B19B6D97 /* RCTSliderManager.h in Copy React/Views Public Headers */, + 382214A2C052956BC8CC34E7339B7983 /* RCTSwitch.h in Copy React/Views Public Headers */, + 1D8D5B8D2720C4C3DE2B90510286B456 /* RCTSwitchManager.h in Copy React/Views Public Headers */, + B98B4AADC54AEA78F3206284B0D542A2 /* RCTTabBar.h in Copy React/Views Public Headers */, + ED31DC5E1C037A655102655B14CF51FD /* RCTTabBarItem.h in Copy React/Views Public Headers */, + 8CB9A04C4692B45E571DCBF4DCDC09B4 /* RCTTabBarItemManager.h in Copy React/Views Public Headers */, + 57B69DEB34BC3E6EBC71A66975B042DE /* RCTTabBarManager.h in Copy React/Views Public Headers */, + 38A9DB28C167CEED85834EAFB49FE89A /* RCTTextDecorationLineType.h in Copy React/Views Public Headers */, + 380BEAB22A4E8D7C36142361EA60A350 /* RCTView.h in Copy React/Views Public Headers */, + BB5F48118EECF77DDD5F7E737971DF6E /* RCTViewControllerProtocol.h in Copy React/Views Public Headers */, + CD1C03805B5D95D97707D779A7E6D746 /* RCTViewManager.h in Copy React/Views Public Headers */, + A3EE586042FB47078782388477EF5CED /* RCTWebView.h in Copy React/Views Public Headers */, + B4394D58294873F7419F9ED73FEA0414 /* RCTWebViewManager.h in Copy React/Views Public Headers */, + 34486562E99B6D9E76835C4C0E7F0C23 /* RCTWrapperViewController.h in Copy React/Views Public Headers */, + 415F9D3210FAB5A72E7651BE9ADCC84B /* UIView+Private.h in Copy React/Views Public Headers */, + 1F76CC424965B8286A78AD281ADC9539 /* UIView+React.h in Copy React/Views Public Headers */, + ); + name = "Copy React/Views Public Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 020DC8AAE723EC701D84B6BEAB3D1377 /* VerloopSDKiOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = VerloopSDKiOS.modulemap; sourceTree = ""; }; + 03DDA0C6B880781059C8630A42FBA48A /* RCTCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTCache.h; path = React/Base/RCTCache.h; sourceTree = ""; }; + 053AEAB11F016868E21550C85882276D /* RCTWebViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTWebViewManager.h; path = React/Views/RCTWebViewManager.h; sourceTree = ""; }; + 067FCE76F2DB013B191C770AF3197E73 /* RCTSliderManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSliderManager.m; path = React/Views/RCTSliderManager.m; sourceTree = ""; }; + 079E42E21DB03B79288E71214051EFCE /* RCTJSMethodRegistrar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTJSMethodRegistrar.h; path = React/Base/RCTJSMethodRegistrar.h; sourceTree = ""; }; + 0885DDB219B73419E282D99C87B2E1D9 /* VerloopSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VerloopSDK.swift; path = VerloopSDK/VerloopSDK.swift; sourceTree = ""; }; + 09A931BEC912FE34FB55EA22CC7F2DC3 /* RCTNavigatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTNavigatorManager.m; path = React/Views/RCTNavigatorManager.m; sourceTree = ""; }; + 0AC0309ADD6EB7032C02BC0D131DA485 /* React.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = React.debug.xcconfig; sourceTree = ""; }; + 0E7C341FA544E64E23E052A68E4A0A5E /* React */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = React; path = React.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 110D4B5441905414CEFF2083005B76E7 /* RCTScrollableProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTScrollableProtocol.h; path = React/Views/RCTScrollableProtocol.h; sourceTree = ""; }; + 1141FF163CCB380533F6971821A05121 /* RCTExceptionsManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTExceptionsManager.m; path = React/Modules/RCTExceptionsManager.m; sourceTree = ""; }; + 1607F7F7F53614893D27437612A22883 /* RCTNavItemManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTNavItemManager.h; path = React/Views/RCTNavItemManager.h; sourceTree = ""; }; + 172FADA009A75524DD45506E1B79A452 /* React.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = React.modulemap; sourceTree = ""; }; + 19EADABC7E9C62358595B2665B02B74A /* VerloopSDKiOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = VerloopSDKiOS.release.xcconfig; sourceTree = ""; }; + 1A6673F66C74A05A4882DF4BF9A3CC26 /* RCTActivityIndicatorViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTActivityIndicatorViewManager.h; path = React/Views/RCTActivityIndicatorViewManager.h; sourceTree = ""; }; + 1AD280B89E1C86F721AD0080EDCF24F2 /* RCTBorderDrawing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTBorderDrawing.h; path = React/Views/RCTBorderDrawing.h; sourceTree = ""; }; + 1B366ACC51D293983203F54AC58A2DD2 /* RCTComponentData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTComponentData.h; path = React/Views/RCTComponentData.h; sourceTree = ""; }; + 1BB21D824B4BF345A78090825A4E9609 /* RCTMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTMap.h; path = React/Views/RCTMap.h; sourceTree = ""; }; + 1C1BB9D4F1ADB79901A912409384DF7F /* RCTWebViewExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTWebViewExecutor.h; path = React/Executors/RCTWebViewExecutor.h; sourceTree = ""; }; + 1D3090FD29C544FA1B6CA807FC8E9156 /* Pods-RNVerloopSdk.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-RNVerloopSdk.modulemap"; sourceTree = ""; }; + 1E790BDD0C4BAA876511DC5BA9F15F11 /* RCTTabBarManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTabBarManager.h; path = React/Views/RCTTabBarManager.h; sourceTree = ""; }; + 1FE93FAAD3A7BA373409EA9047E25E7B /* React.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = React.release.xcconfig; sourceTree = ""; }; + 211A1BC9CC40ACE66DFAE93040936F2D /* ScriptMessageHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScriptMessageHandler.swift; path = VerloopSDK/ScriptMessageHandler.swift; sourceTree = ""; }; + 22A33833983E00903DEF3A3FA3F55A01 /* RCTDatePickerManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTDatePickerManager.h; path = React/Views/RCTDatePickerManager.h; sourceTree = ""; }; + 22C2B5A95B5DB469DC4AE4041EC4DB72 /* RCTBorderDrawing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTBorderDrawing.m; path = React/Views/RCTBorderDrawing.m; sourceTree = ""; }; + 23C035EB63DB69BE476E9BA6F4134440 /* RCTFrameUpdate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTFrameUpdate.m; path = React/Base/RCTFrameUpdate.m; sourceTree = ""; }; + 274B696964D5FB1D02D3DC65C52F1E7D /* RCTTabBarManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTabBarManager.m; path = React/Views/RCTTabBarManager.m; sourceTree = ""; }; + 27FA59E014A76D6D4B628C4D486F57A9 /* RCTModalHostView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModalHostView.h; path = React/Views/RCTModalHostView.h; sourceTree = ""; }; + 2821536D15757D3189193DA6D1F4E32D /* RCTTouchHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTouchHandler.m; path = React/Base/RCTTouchHandler.m; sourceTree = ""; }; + 2AA7E839FDF512E6C25D714EBE3C5ADA /* RCTURLRequestHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTURLRequestHandler.h; path = React/Base/RCTURLRequestHandler.h; sourceTree = ""; }; + 2C671A355F27EF4BCCE8EC64A35792B2 /* RCTPerfStats.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPerfStats.h; path = React/Base/RCTPerfStats.h; sourceTree = ""; }; + 2CFF4517A2A4214FE9FE637CFC5069B4 /* RCTNavigator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTNavigator.m; path = React/Views/RCTNavigator.m; sourceTree = ""; }; + 2D219C02C95D1B950B1FD2E14F32DCAF /* RCTModuleMap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModuleMap.m; path = React/Base/RCTModuleMap.m; sourceTree = ""; }; + 2DD2021525C3BA6981DFDE7FF5BFC3CF /* RCTConvert+MapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RCTConvert+MapKit.h"; path = "React/Views/RCTConvert+MapKit.h"; sourceTree = ""; }; + 2E0C66CC0AF3A4C8C82F45DD5BAA51AF /* RCTTabBarItemManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTabBarItemManager.h; path = React/Views/RCTTabBarItemManager.h; sourceTree = ""; }; + 2E2A5605E8CEB14AD4F696DEB9802019 /* RCTNavItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTNavItem.h; path = React/Views/RCTNavItem.h; sourceTree = ""; }; + 2FD1625E11BFF708195BBCA3EFDD2DBD /* VLEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLEvent.swift; path = VerloopSDK/VLEvent.swift; sourceTree = ""; }; + 323642446F6C9FC9459F112536DDFEAB /* RCTAlertManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTAlertManager.m; path = React/Modules/RCTAlertManager.m; sourceTree = ""; }; + 341C28E3D24A81319D6D025DE441AD90 /* RCTContextExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTContextExecutor.h; path = React/Executors/RCTContextExecutor.h; sourceTree = ""; }; + 34983B2E87A67876BE4ABF6CCD0F9F24 /* React-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "React-prefix.pch"; sourceTree = ""; }; + 3553ECFDD2E300A395209EF9C318AD0C /* RCTTiming.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTiming.m; path = React/Modules/RCTTiming.m; sourceTree = ""; }; + 362F009C7D95BF41953CB12F73F7EB25 /* VLViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLViewController.swift; path = VerloopSDK/VLViewController.swift; sourceTree = ""; }; + 36740C0B5268371F072E0BFD03CC5DE6 /* RCTModalHostView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModalHostView.m; path = React/Views/RCTModalHostView.m; sourceTree = ""; }; + 37BC21AE98AE360F5EF7132520B540F4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 38BD620DB2B7726A1B4969C0B9C3F46F /* Pods-RNVerloopSdk.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RNVerloopSdk.release.xcconfig"; sourceTree = ""; }; + 392080750C86180DF549EC1EEFC734B7 /* RCTViewControllerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTViewControllerProtocol.h; path = React/Views/RCTViewControllerProtocol.h; sourceTree = ""; }; + 3AC1DFCEE36685A6D6B22F8E483CB903 /* RCTAssert.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTAssert.m; path = React/Base/RCTAssert.m; sourceTree = ""; }; + 3ADE79029E068AA724F415D9D43F421E /* RCTScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTScrollView.m; path = React/Views/RCTScrollView.m; sourceTree = ""; }; + 3C520E77809C15F4E1AFB0AB5FC1B1A1 /* RCTSwitch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSwitch.m; path = React/Views/RCTSwitch.m; sourceTree = ""; }; + 3C71066D33A4D712BBAC136C90E3F4FD /* RCTTextDecorationLineType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTextDecorationLineType.h; path = React/Views/RCTTextDecorationLineType.h; sourceTree = ""; }; + 3C8ABAF2D599C10C3DC1C6E7BDD35B22 /* RCTWrapperViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTWrapperViewController.h; path = React/Views/RCTWrapperViewController.h; sourceTree = ""; }; + 3CABC1F0A4428487D5D848007E0CEF5B /* RCTBatchedBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTBatchedBridge.m; path = React/Base/RCTBatchedBridge.m; sourceTree = ""; }; + 3DF331B2A08729831EC186E7016C80A2 /* RCTSparseArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSparseArray.h; path = React/Base/RCTSparseArray.h; sourceTree = ""; }; + 3E293D7D69A68515B1A99FBA4288C389 /* RCTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTLog.h; path = React/Base/RCTLog.h; sourceTree = ""; }; + 3EE2004379F7892F3CF84DE1152A12EE /* RCTRedBox.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTRedBox.m; path = React/Modules/RCTRedBox.m; sourceTree = ""; }; + 40137AE123C5B29FB639DB83BC0B815A /* RCTModuleMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModuleMethod.h; path = React/Base/RCTModuleMethod.h; sourceTree = ""; }; + 40440B4874CC7E57406BFC0D6C7FD5DE /* RCTPerformanceLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTPerformanceLogger.m; path = React/Base/RCTPerformanceLogger.m; sourceTree = ""; }; + 417F707F01380FEADE93A5C39EEDD2D4 /* RCTProgressViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTProgressViewManager.h; path = React/Views/RCTProgressViewManager.h; sourceTree = ""; }; + 44E96DA09DC4399FA26D0D6EEA682966 /* VerloopSDKiOS */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = VerloopSDKiOS; path = VerloopSDKiOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 49A9D0044BA4FB3FDA5CCB363EA5C363 /* VLWebViewManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLWebViewManager.swift; path = VerloopSDK/VLWebViewManager.swift; sourceTree = ""; }; + 49BEBC96158E9B6E307FD481C4684E40 /* RCTInvalidating.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTInvalidating.h; path = React/Base/RCTInvalidating.h; sourceTree = ""; }; + 4CE29203413405852BD01DC7D6D3B082 /* RCTModalHostViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModalHostViewController.h; path = React/Views/RCTModalHostViewController.h; sourceTree = ""; }; + 4D163DB761EBB74EF3941A3EDF9E02CA /* RCTViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTViewManager.m; path = React/Views/RCTViewManager.m; sourceTree = ""; }; + 50F0CB24A6276A6E7AA2009FEBA2463F /* UIView+React.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+React.m"; path = "React/Views/UIView+React.m"; sourceTree = ""; }; + 518802CBE33EE1F6522D8F4EA71383F1 /* RCTNavigator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTNavigator.h; path = React/Views/RCTNavigator.h; sourceTree = ""; }; + 5721DAAA3BD8BF560C2235A84407DA6F /* Pods-RNVerloopSdk-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-RNVerloopSdk-umbrella.h"; sourceTree = ""; }; + 581BEA3CAD9A61F90204EA16CC3A09A4 /* RCTPicker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPicker.h; path = React/Views/RCTPicker.h; sourceTree = ""; }; + 59298E7239F2E84ABF9A01D304D69D31 /* RCTSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSlider.h; path = React/Views/RCTSlider.h; sourceTree = ""; }; + 593E278E661BA422413C5CB4E0176532 /* RCTBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTBridge.m; path = React/Base/RCTBridge.m; sourceTree = ""; }; + 59BE96916B2C596EF941C535333C420D /* RCTFPSGraph.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTFPSGraph.h; path = React/Base/RCTFPSGraph.h; sourceTree = ""; }; + 5A13213FC54E963F0D212C35F16B0C5E /* VLJSInterface.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLJSInterface.swift; path = VerloopSDK/VLJSInterface.swift; sourceTree = ""; }; + 5A3CEBDE88EDE2F5017A8956F17DBF77 /* RCTPicker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTPicker.m; path = React/Views/RCTPicker.m; sourceTree = ""; }; + 5A9BB70E06D26858AFE658C92CFE22EA /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; + 5D38F8D50D8FA3ACF9A1B8C0F4CF301A /* UIView+React.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+React.h"; path = "React/Views/UIView+React.h"; sourceTree = ""; }; + 5EE9BA2B263D47BFFCDB5B8D499E9A69 /* RCTSegmentedControlManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSegmentedControlManager.h; path = React/Views/RCTSegmentedControlManager.h; sourceTree = ""; }; + 5F4CC7A3DE7B31E055AC356168C427F9 /* RCTSliderManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSliderManager.h; path = React/Views/RCTSliderManager.h; sourceTree = ""; }; + 6009A238021B0A2EE61CEE4B06E2ED50 /* RCTDatePickerManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTDatePickerManager.m; path = React/Views/RCTDatePickerManager.m; sourceTree = ""; }; + 60C2C91FB5EBD0C3B476618A5C12ED9C /* RCTURLRequestDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTURLRequestDelegate.h; path = React/Base/RCTURLRequestDelegate.h; sourceTree = ""; }; + 61784D572958ED413625F38A44E9AA22 /* RCTProfile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTProfile.m; path = React/Base/RCTProfile.m; sourceTree = ""; }; + 63B7794E87A7AB46E347C66CEB53DDE2 /* RCTContextExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTContextExecutor.m; path = React/Executors/RCTContextExecutor.m; sourceTree = ""; }; + 64AB5EA88B915B2F4D6E8BDA1AED515A /* RCTNavItemManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTNavItemManager.m; path = React/Views/RCTNavItemManager.m; sourceTree = ""; }; + 65C30C3628EE07A05EF2AAEB7D256302 /* RCTSegmentedControlManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSegmentedControlManager.m; path = React/Views/RCTSegmentedControlManager.m; sourceTree = ""; }; + 6830770B8DCECA47C7B72CABB3AC803F /* React-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "React-dummy.m"; sourceTree = ""; }; + 687105957EE442614799449069FADC8F /* RCTAppState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTAppState.m; path = React/Modules/RCTAppState.m; sourceTree = ""; }; + 68BD228B2357D92C4BF6A1688FBDC88D /* RCTTabBarItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTabBarItem.h; path = React/Views/RCTTabBarItem.h; sourceTree = ""; }; + 6D13B2679EC5963114DD9A6E79791D96 /* RCTAssert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAssert.h; path = React/Base/RCTAssert.h; sourceTree = ""; }; + 6DD58701AF585C38B66C7115CFBBCE48 /* RCTWebView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTWebView.m; path = React/Views/RCTWebView.m; sourceTree = ""; }; + 6F6333E1AA3250BB6D6F55B28D15F6E0 /* RCTKeyboardObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTKeyboardObserver.h; path = React/Base/RCTKeyboardObserver.h; sourceTree = ""; }; + 707B2FECF158C6C2226ABDF3FD757750 /* RCTModalHostViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModalHostViewController.m; path = React/Views/RCTModalHostViewController.m; sourceTree = ""; }; + 712701D6DABFBEFB2733C7C61849BDE2 /* RCTSwitchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSwitchManager.h; path = React/Views/RCTSwitchManager.h; sourceTree = ""; }; + 71352F8A6D9EE8B9D09BAD40BA773F1B /* RCTAsyncLocalStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTAsyncLocalStorage.m; path = React/Modules/RCTAsyncLocalStorage.m; sourceTree = ""; }; + 730BF239458CE4B4251B7DA8BB494FFA /* RCTSourceCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSourceCode.h; path = React/Modules/RCTSourceCode.h; sourceTree = ""; }; + 75ECD5040ED0D1FCE35076228F38E88C /* VLConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLConfig.swift; path = VerloopSDK/VLConfig.swift; sourceTree = ""; }; + 777A05DC8CF0672C65F0C021CDADAD01 /* RCTConvert+CoreLocation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "RCTConvert+CoreLocation.m"; path = "React/Views/RCTConvert+CoreLocation.m"; sourceTree = ""; }; + 77D283365CEADCFC70CB0044E7491703 /* RCTMapManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTMapManager.m; path = React/Views/RCTMapManager.m; sourceTree = ""; }; + 77D82A49AD1043E612EF4312FE184751 /* VerloopSDKiOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "VerloopSDKiOS-umbrella.h"; sourceTree = ""; }; + 7918EDE9F5BBA6610467209EE21CDC8B /* RCTBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTBridge.h; path = React/Base/RCTBridge.h; sourceTree = ""; }; + 792F6A0CA3AE9826CB2A32FDC7879BBB /* Pods-RNVerloopSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RNVerloopSdk.debug.xcconfig"; sourceTree = ""; }; + 7C12BF5A03222174FBF9436C95EE6F65 /* RCTDevLoadingView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTDevLoadingView.h; path = React/Modules/RCTDevLoadingView.h; sourceTree = ""; }; + 7C8B6A2869F9311F2C57630E8888741A /* RCTJavaScriptLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTJavaScriptLoader.m; path = React/Base/RCTJavaScriptLoader.m; sourceTree = ""; }; + 7FA7B555535B122E3C0C2B5A56B6F24F /* React-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "React-Info.plist"; sourceTree = ""; }; + 805AFC94BA56B18650A978D4672EA351 /* RCTUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTUtils.m; path = React/Base/RCTUtils.m; sourceTree = ""; }; + 816BBA9198B1BF457BBE5E9A2CB186AF /* RCTAccessibilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTAccessibilityManager.m; path = React/Modules/RCTAccessibilityManager.m; sourceTree = ""; }; + 820FAB899CF185DE81C3685C5B408969 /* RCTAppState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAppState.h; path = React/Modules/RCTAppState.h; sourceTree = ""; }; + 82EE1CDDB08CD39597B64852BC1DC9E9 /* RCTActivityIndicatorViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTActivityIndicatorViewManager.m; path = React/Views/RCTActivityIndicatorViewManager.m; sourceTree = ""; }; + 853A644DA6ABAD6DA6504A33EEC8D50F /* RCTKeyCommands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTKeyCommands.h; path = React/Base/RCTKeyCommands.h; sourceTree = ""; }; + 859DE6FA01266C2CFE4E6D116A2EA4E4 /* VerloopSDKiOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = VerloopSDKiOS.debug.xcconfig; sourceTree = ""; }; + 8626CBB571BE6CFC0C34D002CEE428D5 /* RCTModuleData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModuleData.m; path = React/Base/RCTModuleData.m; sourceTree = ""; }; + 865771706E387A31C3167C494854797E /* RCTComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTComponent.h; path = React/Views/RCTComponent.h; sourceTree = ""; }; + 86CB43466D346797DC2450C73912F87B /* RCTStatusBarManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTStatusBarManager.h; path = React/Modules/RCTStatusBarManager.h; sourceTree = ""; }; + 86CBE7ECE4F33B3BB8AEF3B28550FC0C /* RCTScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTScrollView.h; path = React/Views/RCTScrollView.h; sourceTree = ""; }; + 8941A48A5224F9D63EE9366D93B9CB0B /* RCTFrameUpdate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTFrameUpdate.h; path = React/Base/RCTFrameUpdate.h; sourceTree = ""; }; + 89F4568CAFF592EB71D698DC263B8717 /* RCTConvert+CoreLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RCTConvert+CoreLocation.h"; path = "React/Views/RCTConvert+CoreLocation.h"; sourceTree = ""; }; + 8A08971B7BA3F617C8FA0EB41B07A064 /* RCTDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTDefines.h; path = React/Base/RCTDefines.h; sourceTree = ""; }; + 8C8DA2645ECA815A8D1083344C17F24C /* RCTTabBar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTabBar.m; path = React/Views/RCTTabBar.m; sourceTree = ""; }; + 8CFF92AC3AC43F9E3FA43E39E447B04A /* RCTJavaScriptExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTJavaScriptExecutor.h; path = React/Base/RCTJavaScriptExecutor.h; sourceTree = ""; }; + 8D2BD72A78FAC9A770AE33355CCEC27E /* RCTWrapperViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTWrapperViewController.m; path = React/Views/RCTWrapperViewController.m; sourceTree = ""; }; + 8D2F1BCF6124295D82A7FE8ECCD494E9 /* RCTFPSGraph.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTFPSGraph.m; path = React/Base/RCTFPSGraph.m; sourceTree = ""; }; + 8DED3B4E03BF2728E4E816FCDE2DB82B /* RCTMap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTMap.m; path = React/Views/RCTMap.m; sourceTree = ""; }; + 90F601E7DA100C53DF1123113968AB7B /* RCTPerfStats.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTPerfStats.m; path = React/Base/RCTPerfStats.m; sourceTree = ""; }; + 91A9AA30DCDC737B05149604AD56F9CB /* RCTTiming.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTiming.h; path = React/Modules/RCTTiming.h; sourceTree = ""; }; + 921BF7580CAF9E1080B05DDBE8C26208 /* RCTModalHostViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModalHostViewManager.h; path = React/Views/RCTModalHostViewManager.h; sourceTree = ""; }; + 928C3326EFD3BAB97A21898A4F0C1B1A /* RCTKeyCommands.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTKeyCommands.m; path = React/Base/RCTKeyCommands.m; sourceTree = ""; }; + 936EC1997FE748B3D01FCD1AB6B0ECE2 /* RCTScrollViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTScrollViewManager.h; path = React/Views/RCTScrollViewManager.h; sourceTree = ""; }; + 9497FBE1CF4A03731173B360EFFD551B /* RCTSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSlider.m; path = React/Views/RCTSlider.m; sourceTree = ""; }; + 959EEE6736AAFF6D289F5C0D1DE3D28B /* RCTConvert.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTConvert.m; path = React/Base/RCTConvert.m; sourceTree = ""; }; + 987F02002DB7F5EB47E5E1BE30209098 /* RCTPointAnnotation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTPointAnnotation.m; path = React/Modules/RCTPointAnnotation.m; sourceTree = ""; }; + 99989C370E8C60710DF094B00DF1F7BE /* RCTConvert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTConvert.h; path = React/Base/RCTConvert.h; sourceTree = ""; }; + 9C3494705C8D5C67CF7056F01B651AD0 /* UIView+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Private.h"; path = "React/Views/UIView+Private.h"; sourceTree = ""; }; + 9D1239634E8B235FD23AF965F6C2E898 /* RCTSwitchManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSwitchManager.m; path = React/Views/RCTSwitchManager.m; sourceTree = ""; }; + 9D8ACCD4F2549A9B63C3B4B9A1DA7A84 /* Pods-RNVerloopSdk */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-RNVerloopSdk"; path = Pods_RNVerloopSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9E2CFE714BA0A00ABEDA255D3E67287B /* RCTShadowView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTShadowView.h; path = React/Views/RCTShadowView.h; sourceTree = ""; }; + 9EE843712DB3CCB963E7DAE9B4C0E090 /* RCTTabBarItemManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTabBarItemManager.m; path = React/Views/RCTTabBarItemManager.m; sourceTree = ""; }; + 9F0DB9DF13CB90D97B401CAA58F24CCE /* Layout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Layout.h; path = React/Layout/Layout.h; sourceTree = ""; }; + 9F4C4635CA7C34F94017F3DF9BCDD98F /* RCTTouchHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTouchHandler.h; path = React/Base/RCTTouchHandler.h; sourceTree = ""; }; + A2048318AB6A4C6BF37A1CC3D9DD3F76 /* NetworkMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkMonitor.swift; path = VerloopSDK/NetworkMonitor.swift; sourceTree = ""; }; + A2492065D694A0A44C29D7B678281E09 /* RCTAsyncLocalStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAsyncLocalStorage.h; path = React/Modules/RCTAsyncLocalStorage.h; sourceTree = ""; }; + A58A7F8F58DB43F94F3D823BC43DB654 /* RCTSegmentedControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSegmentedControl.h; path = React/Views/RCTSegmentedControl.h; sourceTree = ""; }; + A719004B3B4149B8EBC228C361400D5C /* VLEventDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLEventDelegate.swift; path = VerloopSDK/VLEventDelegate.swift; sourceTree = ""; }; + A77C891B6C9FC3FE3429C6749A16486E /* RCTAlertManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAlertManager.h; path = React/Modules/RCTAlertManager.h; sourceTree = ""; }; + A996438816CF44027C78D61A1CB9169F /* VLExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLExtensions.swift; path = VerloopSDK/VLExtensions.swift; sourceTree = ""; }; + AC4811CABE7ADA4B17A145497AAEFDDE /* RCTUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTUtils.h; path = React/Base/RCTUtils.h; sourceTree = ""; }; + AEC89743290B75DFA8B18392C301B25E /* RCTJavaScriptLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTJavaScriptLoader.h; path = React/Base/RCTJavaScriptLoader.h; sourceTree = ""; }; + B0C0CCE499083A6B11E7933B79FDF1FC /* RCTDevMenu.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTDevMenu.m; path = React/Modules/RCTDevMenu.m; sourceTree = ""; }; + B0D215B32532AB38EED227AD4BAAC01B /* VerloopSDKiOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "VerloopSDKiOS-prefix.pch"; sourceTree = ""; }; + B1EC6E491CDFEAD017FEDA2D96B6B00D /* RCTModuleMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModuleMap.h; path = React/Base/RCTModuleMap.h; sourceTree = ""; }; + B2DFFA0900C72E83B9ABA8E2F86287EA /* RCTModuleMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModuleMethod.m; path = React/Base/RCTModuleMethod.m; sourceTree = ""; }; + B342CEDB2F43CDA55724E1C008887EF8 /* RCTWebViewExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTWebViewExecutor.m; path = React/Executors/RCTWebViewExecutor.m; sourceTree = ""; }; + B70DE3ECC969F37CD59F38B4AEF03591 /* Pods-RNVerloopSdk-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RNVerloopSdk-acknowledgements.plist"; sourceTree = ""; }; + B731E0FA442E397BE04519F0E71CA139 /* RCTView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTView.m; path = React/Views/RCTView.m; sourceTree = ""; }; + B79F7473ACBDDC317778DA9855CE8CD1 /* RCTWebViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTWebViewManager.m; path = React/Views/RCTWebViewManager.m; sourceTree = ""; }; + BCC75152F7BAD85B89962C789804F235 /* RCTProfile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTProfile.h; path = React/Base/RCTProfile.h; sourceTree = ""; }; + BCEA67F09F9C3FF41B18DA2269F3441C /* RCTBridgeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTBridgeDelegate.h; path = React/Base/RCTBridgeDelegate.h; sourceTree = ""; }; + BD67D2CABE7193807447351012B5E2C3 /* RCTKeyboardObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTKeyboardObserver.m; path = React/Base/RCTKeyboardObserver.m; sourceTree = ""; }; + BD7C052758C90D5AF36CAD644528447B /* RCTProgressViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTProgressViewManager.m; path = React/Views/RCTProgressViewManager.m; sourceTree = ""; }; + BE594D64368916347CB04E234D46E8FA /* RCTPointerEvents.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPointerEvents.h; path = React/Views/RCTPointerEvents.h; sourceTree = ""; }; + BF3BA8291D612805E4617A66772C4BE0 /* VLNavViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VLNavViewController.swift; path = VerloopSDK/VLNavViewController.swift; sourceTree = ""; }; + C2551CAA85B646344BF984CC49FBD535 /* RCTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTLog.m; path = React/Base/RCTLog.m; sourceTree = ""; }; + C362610731A25D6925E36AF7E38EB991 /* RCTViewManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTViewManager.h; path = React/Views/RCTViewManager.h; sourceTree = ""; }; + C4872DD404033301B92B730A9F587ED2 /* RCTModalHostViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTModalHostViewManager.m; path = React/Views/RCTModalHostViewManager.m; sourceTree = ""; }; + C48B053AB7DBDF184C4283434D377EF3 /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constants.swift; path = VerloopSDK/Constants.swift; sourceTree = ""; }; + C50401083335B3676DA218EF59D0D804 /* RCTWebView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTWebView.h; path = React/Views/RCTWebView.h; sourceTree = ""; }; + C5FB5C9E9D1515B4A22D793825730F91 /* RCTEventDispatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTEventDispatcher.h; path = React/Base/RCTEventDispatcher.h; sourceTree = ""; }; + C71433BE70BDE1A2078E082133AC3E29 /* RCTSegmentedControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSegmentedControl.m; path = React/Views/RCTSegmentedControl.m; sourceTree = ""; }; + CA1C78397F73FC71EA031634BC70437A /* RCTTabBar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTTabBar.h; path = React/Views/RCTTabBar.h; sourceTree = ""; }; + CADD22662BF57754E6681DCE2B117134 /* RCTModuleData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTModuleData.h; path = React/Base/RCTModuleData.h; sourceTree = ""; }; + CB8899B135BC575CA6B06094354E9CFD /* Pods-RNVerloopSdk-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-RNVerloopSdk-dummy.m"; sourceTree = ""; }; + CD0384F2BEA1513005743D17D6B633BF /* Pods-RNVerloopSdk-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-RNVerloopSdk-acknowledgements.markdown"; sourceTree = ""; }; + CF30C4ADAD67C1B910FDEF526294C197 /* VerloopSDKiOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "VerloopSDKiOS-Info.plist"; sourceTree = ""; }; + D181B5ED44918AA1DC1A12764BB8EE87 /* RCTUIManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTUIManager.m; path = React/Modules/RCTUIManager.m; sourceTree = ""; }; + D1EEB9C65C6BFB7EAD469E4DFFF44B12 /* RCTPerformanceLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPerformanceLogger.h; path = React/Base/RCTPerformanceLogger.h; sourceTree = ""; }; + D4D722EDE2F96E1F6D89FA0A7B3B1AEC /* RCTNavigatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTNavigatorManager.h; path = React/Views/RCTNavigatorManager.h; sourceTree = ""; }; + D72859B332650958A0B5DAAA479612FC /* RCTPickerManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTPickerManager.m; path = React/Views/RCTPickerManager.m; sourceTree = ""; }; + DD9919C4198100FD579E9CD4C29DAEBC /* RCTCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTCache.m; path = React/Base/RCTCache.m; sourceTree = ""; }; + DE44995D1777DA42FBF0AC27DBBA516B /* RCTMapManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTMapManager.h; path = React/Views/RCTMapManager.h; sourceTree = ""; }; + DEADD54C9EEF66DE4CEFF1881A2F5384 /* Layout.c */ = {isa = PBXFileReference; includeInIndex = 1; name = Layout.c; path = React/Layout/Layout.c; sourceTree = ""; }; + DF0AEFECFF6307909A20394AF2D12F75 /* RCTComponentData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTComponentData.m; path = React/Views/RCTComponentData.m; sourceTree = ""; }; + DFA57F291D66EBDEB5CC78078750DBB7 /* RCTDevLoadingView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTDevLoadingView.m; path = React/Modules/RCTDevLoadingView.m; sourceTree = ""; }; + E042848057889FCEF5B753C2545C66F1 /* RCTRedBox.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTRedBox.h; path = React/Modules/RCTRedBox.h; sourceTree = ""; }; + E06F0FC3B81DACC9772B9A84F02FA855 /* RCTTabBarItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTTabBarItem.m; path = React/Views/RCTTabBarItem.m; sourceTree = ""; }; + E0BDDCA80D56F5809214E3242E615860 /* RCTAnimationType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAnimationType.h; path = React/Views/RCTAnimationType.h; sourceTree = ""; }; + E1E3014AA160979B5C43694264E6F081 /* RCTDevMenu.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTDevMenu.h; path = React/Modules/RCTDevMenu.h; sourceTree = ""; }; + E5099CD8EF57ED63A83BE4B0D6CF0E66 /* RCTPickerManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPickerManager.h; path = React/Views/RCTPickerManager.h; sourceTree = ""; }; + E5E2C7D30AD930AE4A48213A9B4D9600 /* RCTRootView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTRootView.h; path = React/Base/RCTRootView.h; sourceTree = ""; }; + E7081B5638A218EB530DAAC88CE3B8E2 /* RCTUIManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTUIManager.h; path = React/Modules/RCTUIManager.h; sourceTree = ""; }; + E992625AE58033C1EF93A0A959ABA069 /* Reachability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reachability.swift; path = VerloopSDK/Reachability.swift; sourceTree = ""; }; + EC32F7AA4741808A288E49B1D8427D93 /* RCTStatusBarManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTStatusBarManager.m; path = React/Modules/RCTStatusBarManager.m; sourceTree = ""; }; + EC47757FCD9BEA236EBB834329378BCD /* RCTScrollViewManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTScrollViewManager.m; path = React/Views/RCTScrollViewManager.m; sourceTree = ""; }; + ED86924CE7BECDA80D30FE1D3A50E240 /* RCTView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTView.h; path = React/Views/RCTView.h; sourceTree = ""; }; + ED9F5EABBCBC8DB568C1CE23F789EC51 /* RCTAutoInsetsProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAutoInsetsProtocol.h; path = React/Views/RCTAutoInsetsProtocol.h; sourceTree = ""; }; + EDB86D98529494E40CC25D5325D49F9A /* RCTEventDispatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTEventDispatcher.m; path = React/Base/RCTEventDispatcher.m; sourceTree = ""; }; + EEA212A133689A3CADC394DB4DB39233 /* RCTBridgeModule.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTBridgeModule.h; path = React/Base/RCTBridgeModule.h; sourceTree = ""; }; + EEF20436E6D4B66DC5EAFD63F966CF47 /* React-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "React-umbrella.h"; sourceTree = ""; }; + EF2651B7BF1FCDFF2C3FACA5017CD067 /* RCTSwitch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTSwitch.h; path = React/Views/RCTSwitch.h; sourceTree = ""; }; + F1E2352BF245521521F4A0416E2B3A77 /* RCTShadowView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTShadowView.m; path = React/Views/RCTShadowView.m; sourceTree = ""; }; + F454823D34C72CEE22AFF7A395C0256A /* RCTExceptionsManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTExceptionsManager.h; path = React/Modules/RCTExceptionsManager.h; sourceTree = ""; }; + F459B29A1C124E84F8755D71D1DFFB6A /* RCTPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTPointAnnotation.h; path = React/Modules/RCTPointAnnotation.h; sourceTree = ""; }; + F512157E25A1E3E9EEA82D917F6F46B9 /* RCTRootView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTRootView.m; path = React/Base/RCTRootView.m; sourceTree = ""; }; + F8F48DBBF295A034B1288872EA4B448A /* RCTSourceCode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSourceCode.m; path = React/Modules/RCTSourceCode.m; sourceTree = ""; }; + F913F287F054E079BE9D552428E39D4C /* RCTConvert+MapKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "RCTConvert+MapKit.m"; path = "React/Views/RCTConvert+MapKit.m"; sourceTree = ""; }; + FC6AE280FA3FA6C08E88F5EDB6D938E2 /* RCTNavItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTNavItem.m; path = React/Views/RCTNavItem.m; sourceTree = ""; }; + FD2EE57A3247D010AA97B5E1E3DBDC46 /* Pods-RNVerloopSdk-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RNVerloopSdk-Info.plist"; sourceTree = ""; }; + FD75F7F9094A920D30F506F38952B138 /* VerloopSDKiOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "VerloopSDKiOS-dummy.m"; sourceTree = ""; }; + FDC6B3D74530164DCE87A991053D743C /* RCTSparseArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RCTSparseArray.m; path = React/Base/RCTSparseArray.m; sourceTree = ""; }; + FEF5D8C100C05621F82628C4CC5E2C67 /* RCTAccessibilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RCTAccessibilityManager.h; path = React/Modules/RCTAccessibilityManager.h; sourceTree = ""; }; + FFD39732160A132FF6F1E8335A031090 /* VerloopSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = VerloopSDK.h; path = VerloopSDK/VerloopSDK.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 049A048BB60B84E5AAD683CDB82DD0A9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D1E86441B124FAA4301A8AFE28C05023 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 81ED23BF14D274F3701F7654AB05A395 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF0E641626587BD0E37B742C3AC97B14 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AB9BE5FE9FE664F316C84B06A3E0DC6C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D5D86C2EE270F18B32B998B14C18663 /* Foundation.framework in Frameworks */, + 4EF33443B631ED0542DD43D729925D55 /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 54D6947E2C2ED9ECA478D56342628C94 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2CFDC86A26A55A1D6A315F09DCBCB0E8 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + F79ABBFDAC7BAB06EAA2125A82416769 /* Pods-RNVerloopSdk */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 3E05A1EDA621DC676264784ABDC7E44B /* Support Files */ = { + isa = PBXGroup; + children = ( + 020DC8AAE723EC701D84B6BEAB3D1377 /* VerloopSDKiOS.modulemap */, + FD75F7F9094A920D30F506F38952B138 /* VerloopSDKiOS-dummy.m */, + CF30C4ADAD67C1B910FDEF526294C197 /* VerloopSDKiOS-Info.plist */, + B0D215B32532AB38EED227AD4BAAC01B /* VerloopSDKiOS-prefix.pch */, + 77D82A49AD1043E612EF4312FE184751 /* VerloopSDKiOS-umbrella.h */, + 859DE6FA01266C2CFE4E6D116A2EA4E4 /* VerloopSDKiOS.debug.xcconfig */, + 19EADABC7E9C62358595B2665B02B74A /* VerloopSDKiOS.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/VerloopSDKiOS"; + sourceTree = ""; + }; + 54D6947E2C2ED9ECA478D56342628C94 /* iOS */ = { + isa = PBXGroup; + children = ( + 37BC21AE98AE360F5EF7132520B540F4 /* Foundation.framework */, + 5A9BB70E06D26858AFE658C92CFE22EA /* JavaScriptCore.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 60E6AB5C47FFB965B21B3F38F3DF3099 /* React */ = { + isa = PBXGroup; + children = ( + A835D838E66D5D472DA9FBE5E0C9CB2D /* Core */, + DA64CDCBFACC5ABB06BA0F42EC225126 /* Support Files */, + ); + name = React; + path = React; + sourceTree = ""; + }; + 721D17C344632A2B43E1BCCC2A56C05A /* Products */ = { + isa = PBXGroup; + children = ( + 9D8ACCD4F2549A9B63C3B4B9A1DA7A84 /* Pods-RNVerloopSdk */, + 0E7C341FA544E64E23E052A68E4A0A5E /* React */, + 44E96DA09DC4399FA26D0D6EEA682966 /* VerloopSDKiOS */, + ); + name = Products; + sourceTree = ""; + }; + 922DB3062271CBBE4AEAA8373385E599 /* VerloopSDKiOS */ = { + isa = PBXGroup; + children = ( + C48B053AB7DBDF184C4283434D377EF3 /* Constants.swift */, + A2048318AB6A4C6BF37A1CC3D9DD3F76 /* NetworkMonitor.swift */, + E992625AE58033C1EF93A0A959ABA069 /* Reachability.swift */, + 211A1BC9CC40ACE66DFAE93040936F2D /* ScriptMessageHandler.swift */, + FFD39732160A132FF6F1E8335A031090 /* VerloopSDK.h */, + 0885DDB219B73419E282D99C87B2E1D9 /* VerloopSDK.swift */, + 75ECD5040ED0D1FCE35076228F38E88C /* VLConfig.swift */, + 2FD1625E11BFF708195BBCA3EFDD2DBD /* VLEvent.swift */, + A719004B3B4149B8EBC228C361400D5C /* VLEventDelegate.swift */, + A996438816CF44027C78D61A1CB9169F /* VLExtensions.swift */, + 5A13213FC54E963F0D212C35F16B0C5E /* VLJSInterface.swift */, + BF3BA8291D612805E4617A66772C4BE0 /* VLNavViewController.swift */, + 362F009C7D95BF41953CB12F73F7EB25 /* VLViewController.swift */, + 49A9D0044BA4FB3FDA5CCB363EA5C363 /* VLWebViewManager.swift */, + 3E05A1EDA621DC676264784ABDC7E44B /* Support Files */, + ); + name = VerloopSDKiOS; + path = VerloopSDKiOS; + sourceTree = ""; + }; + A835D838E66D5D472DA9FBE5E0C9CB2D /* Core */ = { + isa = PBXGroup; + children = ( + DEADD54C9EEF66DE4CEFF1881A2F5384 /* Layout.c */, + 9F0DB9DF13CB90D97B401CAA58F24CCE /* Layout.h */, + FEF5D8C100C05621F82628C4CC5E2C67 /* RCTAccessibilityManager.h */, + 816BBA9198B1BF457BBE5E9A2CB186AF /* RCTAccessibilityManager.m */, + 1A6673F66C74A05A4882DF4BF9A3CC26 /* RCTActivityIndicatorViewManager.h */, + 82EE1CDDB08CD39597B64852BC1DC9E9 /* RCTActivityIndicatorViewManager.m */, + A77C891B6C9FC3FE3429C6749A16486E /* RCTAlertManager.h */, + 323642446F6C9FC9459F112536DDFEAB /* RCTAlertManager.m */, + E0BDDCA80D56F5809214E3242E615860 /* RCTAnimationType.h */, + 820FAB899CF185DE81C3685C5B408969 /* RCTAppState.h */, + 687105957EE442614799449069FADC8F /* RCTAppState.m */, + 6D13B2679EC5963114DD9A6E79791D96 /* RCTAssert.h */, + 3AC1DFCEE36685A6D6B22F8E483CB903 /* RCTAssert.m */, + A2492065D694A0A44C29D7B678281E09 /* RCTAsyncLocalStorage.h */, + 71352F8A6D9EE8B9D09BAD40BA773F1B /* RCTAsyncLocalStorage.m */, + ED9F5EABBCBC8DB568C1CE23F789EC51 /* RCTAutoInsetsProtocol.h */, + 3CABC1F0A4428487D5D848007E0CEF5B /* RCTBatchedBridge.m */, + 1AD280B89E1C86F721AD0080EDCF24F2 /* RCTBorderDrawing.h */, + 22C2B5A95B5DB469DC4AE4041EC4DB72 /* RCTBorderDrawing.m */, + 7918EDE9F5BBA6610467209EE21CDC8B /* RCTBridge.h */, + 593E278E661BA422413C5CB4E0176532 /* RCTBridge.m */, + BCEA67F09F9C3FF41B18DA2269F3441C /* RCTBridgeDelegate.h */, + EEA212A133689A3CADC394DB4DB39233 /* RCTBridgeModule.h */, + 03DDA0C6B880781059C8630A42FBA48A /* RCTCache.h */, + DD9919C4198100FD579E9CD4C29DAEBC /* RCTCache.m */, + 865771706E387A31C3167C494854797E /* RCTComponent.h */, + 1B366ACC51D293983203F54AC58A2DD2 /* RCTComponentData.h */, + DF0AEFECFF6307909A20394AF2D12F75 /* RCTComponentData.m */, + 341C28E3D24A81319D6D025DE441AD90 /* RCTContextExecutor.h */, + 63B7794E87A7AB46E347C66CEB53DDE2 /* RCTContextExecutor.m */, + 99989C370E8C60710DF094B00DF1F7BE /* RCTConvert.h */, + 959EEE6736AAFF6D289F5C0D1DE3D28B /* RCTConvert.m */, + 89F4568CAFF592EB71D698DC263B8717 /* RCTConvert+CoreLocation.h */, + 777A05DC8CF0672C65F0C021CDADAD01 /* RCTConvert+CoreLocation.m */, + 2DD2021525C3BA6981DFDE7FF5BFC3CF /* RCTConvert+MapKit.h */, + F913F287F054E079BE9D552428E39D4C /* RCTConvert+MapKit.m */, + 22A33833983E00903DEF3A3FA3F55A01 /* RCTDatePickerManager.h */, + 6009A238021B0A2EE61CEE4B06E2ED50 /* RCTDatePickerManager.m */, + 8A08971B7BA3F617C8FA0EB41B07A064 /* RCTDefines.h */, + 7C12BF5A03222174FBF9436C95EE6F65 /* RCTDevLoadingView.h */, + DFA57F291D66EBDEB5CC78078750DBB7 /* RCTDevLoadingView.m */, + E1E3014AA160979B5C43694264E6F081 /* RCTDevMenu.h */, + B0C0CCE499083A6B11E7933B79FDF1FC /* RCTDevMenu.m */, + C5FB5C9E9D1515B4A22D793825730F91 /* RCTEventDispatcher.h */, + EDB86D98529494E40CC25D5325D49F9A /* RCTEventDispatcher.m */, + F454823D34C72CEE22AFF7A395C0256A /* RCTExceptionsManager.h */, + 1141FF163CCB380533F6971821A05121 /* RCTExceptionsManager.m */, + 59BE96916B2C596EF941C535333C420D /* RCTFPSGraph.h */, + 8D2F1BCF6124295D82A7FE8ECCD494E9 /* RCTFPSGraph.m */, + 8941A48A5224F9D63EE9366D93B9CB0B /* RCTFrameUpdate.h */, + 23C035EB63DB69BE476E9BA6F4134440 /* RCTFrameUpdate.m */, + 49BEBC96158E9B6E307FD481C4684E40 /* RCTInvalidating.h */, + 8CFF92AC3AC43F9E3FA43E39E447B04A /* RCTJavaScriptExecutor.h */, + AEC89743290B75DFA8B18392C301B25E /* RCTJavaScriptLoader.h */, + 7C8B6A2869F9311F2C57630E8888741A /* RCTJavaScriptLoader.m */, + 079E42E21DB03B79288E71214051EFCE /* RCTJSMethodRegistrar.h */, + 6F6333E1AA3250BB6D6F55B28D15F6E0 /* RCTKeyboardObserver.h */, + BD67D2CABE7193807447351012B5E2C3 /* RCTKeyboardObserver.m */, + 853A644DA6ABAD6DA6504A33EEC8D50F /* RCTKeyCommands.h */, + 928C3326EFD3BAB97A21898A4F0C1B1A /* RCTKeyCommands.m */, + 3E293D7D69A68515B1A99FBA4288C389 /* RCTLog.h */, + C2551CAA85B646344BF984CC49FBD535 /* RCTLog.m */, + 1BB21D824B4BF345A78090825A4E9609 /* RCTMap.h */, + 8DED3B4E03BF2728E4E816FCDE2DB82B /* RCTMap.m */, + DE44995D1777DA42FBF0AC27DBBA516B /* RCTMapManager.h */, + 77D283365CEADCFC70CB0044E7491703 /* RCTMapManager.m */, + 27FA59E014A76D6D4B628C4D486F57A9 /* RCTModalHostView.h */, + 36740C0B5268371F072E0BFD03CC5DE6 /* RCTModalHostView.m */, + 4CE29203413405852BD01DC7D6D3B082 /* RCTModalHostViewController.h */, + 707B2FECF158C6C2226ABDF3FD757750 /* RCTModalHostViewController.m */, + 921BF7580CAF9E1080B05DDBE8C26208 /* RCTModalHostViewManager.h */, + C4872DD404033301B92B730A9F587ED2 /* RCTModalHostViewManager.m */, + CADD22662BF57754E6681DCE2B117134 /* RCTModuleData.h */, + 8626CBB571BE6CFC0C34D002CEE428D5 /* RCTModuleData.m */, + B1EC6E491CDFEAD017FEDA2D96B6B00D /* RCTModuleMap.h */, + 2D219C02C95D1B950B1FD2E14F32DCAF /* RCTModuleMap.m */, + 40137AE123C5B29FB639DB83BC0B815A /* RCTModuleMethod.h */, + B2DFFA0900C72E83B9ABA8E2F86287EA /* RCTModuleMethod.m */, + 518802CBE33EE1F6522D8F4EA71383F1 /* RCTNavigator.h */, + 2CFF4517A2A4214FE9FE637CFC5069B4 /* RCTNavigator.m */, + D4D722EDE2F96E1F6D89FA0A7B3B1AEC /* RCTNavigatorManager.h */, + 09A931BEC912FE34FB55EA22CC7F2DC3 /* RCTNavigatorManager.m */, + 2E2A5605E8CEB14AD4F696DEB9802019 /* RCTNavItem.h */, + FC6AE280FA3FA6C08E88F5EDB6D938E2 /* RCTNavItem.m */, + 1607F7F7F53614893D27437612A22883 /* RCTNavItemManager.h */, + 64AB5EA88B915B2F4D6E8BDA1AED515A /* RCTNavItemManager.m */, + D1EEB9C65C6BFB7EAD469E4DFFF44B12 /* RCTPerformanceLogger.h */, + 40440B4874CC7E57406BFC0D6C7FD5DE /* RCTPerformanceLogger.m */, + 2C671A355F27EF4BCCE8EC64A35792B2 /* RCTPerfStats.h */, + 90F601E7DA100C53DF1123113968AB7B /* RCTPerfStats.m */, + 581BEA3CAD9A61F90204EA16CC3A09A4 /* RCTPicker.h */, + 5A3CEBDE88EDE2F5017A8956F17DBF77 /* RCTPicker.m */, + E5099CD8EF57ED63A83BE4B0D6CF0E66 /* RCTPickerManager.h */, + D72859B332650958A0B5DAAA479612FC /* RCTPickerManager.m */, + F459B29A1C124E84F8755D71D1DFFB6A /* RCTPointAnnotation.h */, + 987F02002DB7F5EB47E5E1BE30209098 /* RCTPointAnnotation.m */, + BE594D64368916347CB04E234D46E8FA /* RCTPointerEvents.h */, + BCC75152F7BAD85B89962C789804F235 /* RCTProfile.h */, + 61784D572958ED413625F38A44E9AA22 /* RCTProfile.m */, + 417F707F01380FEADE93A5C39EEDD2D4 /* RCTProgressViewManager.h */, + BD7C052758C90D5AF36CAD644528447B /* RCTProgressViewManager.m */, + E042848057889FCEF5B753C2545C66F1 /* RCTRedBox.h */, + 3EE2004379F7892F3CF84DE1152A12EE /* RCTRedBox.m */, + E5E2C7D30AD930AE4A48213A9B4D9600 /* RCTRootView.h */, + F512157E25A1E3E9EEA82D917F6F46B9 /* RCTRootView.m */, + 110D4B5441905414CEFF2083005B76E7 /* RCTScrollableProtocol.h */, + 86CBE7ECE4F33B3BB8AEF3B28550FC0C /* RCTScrollView.h */, + 3ADE79029E068AA724F415D9D43F421E /* RCTScrollView.m */, + 936EC1997FE748B3D01FCD1AB6B0ECE2 /* RCTScrollViewManager.h */, + EC47757FCD9BEA236EBB834329378BCD /* RCTScrollViewManager.m */, + A58A7F8F58DB43F94F3D823BC43DB654 /* RCTSegmentedControl.h */, + C71433BE70BDE1A2078E082133AC3E29 /* RCTSegmentedControl.m */, + 5EE9BA2B263D47BFFCDB5B8D499E9A69 /* RCTSegmentedControlManager.h */, + 65C30C3628EE07A05EF2AAEB7D256302 /* RCTSegmentedControlManager.m */, + 9E2CFE714BA0A00ABEDA255D3E67287B /* RCTShadowView.h */, + F1E2352BF245521521F4A0416E2B3A77 /* RCTShadowView.m */, + 59298E7239F2E84ABF9A01D304D69D31 /* RCTSlider.h */, + 9497FBE1CF4A03731173B360EFFD551B /* RCTSlider.m */, + 5F4CC7A3DE7B31E055AC356168C427F9 /* RCTSliderManager.h */, + 067FCE76F2DB013B191C770AF3197E73 /* RCTSliderManager.m */, + 730BF239458CE4B4251B7DA8BB494FFA /* RCTSourceCode.h */, + F8F48DBBF295A034B1288872EA4B448A /* RCTSourceCode.m */, + 3DF331B2A08729831EC186E7016C80A2 /* RCTSparseArray.h */, + FDC6B3D74530164DCE87A991053D743C /* RCTSparseArray.m */, + 86CB43466D346797DC2450C73912F87B /* RCTStatusBarManager.h */, + EC32F7AA4741808A288E49B1D8427D93 /* RCTStatusBarManager.m */, + EF2651B7BF1FCDFF2C3FACA5017CD067 /* RCTSwitch.h */, + 3C520E77809C15F4E1AFB0AB5FC1B1A1 /* RCTSwitch.m */, + 712701D6DABFBEFB2733C7C61849BDE2 /* RCTSwitchManager.h */, + 9D1239634E8B235FD23AF965F6C2E898 /* RCTSwitchManager.m */, + CA1C78397F73FC71EA031634BC70437A /* RCTTabBar.h */, + 8C8DA2645ECA815A8D1083344C17F24C /* RCTTabBar.m */, + 68BD228B2357D92C4BF6A1688FBDC88D /* RCTTabBarItem.h */, + E06F0FC3B81DACC9772B9A84F02FA855 /* RCTTabBarItem.m */, + 2E0C66CC0AF3A4C8C82F45DD5BAA51AF /* RCTTabBarItemManager.h */, + 9EE843712DB3CCB963E7DAE9B4C0E090 /* RCTTabBarItemManager.m */, + 1E790BDD0C4BAA876511DC5BA9F15F11 /* RCTTabBarManager.h */, + 274B696964D5FB1D02D3DC65C52F1E7D /* RCTTabBarManager.m */, + 3C71066D33A4D712BBAC136C90E3F4FD /* RCTTextDecorationLineType.h */, + 91A9AA30DCDC737B05149604AD56F9CB /* RCTTiming.h */, + 3553ECFDD2E300A395209EF9C318AD0C /* RCTTiming.m */, + 9F4C4635CA7C34F94017F3DF9BCDD98F /* RCTTouchHandler.h */, + 2821536D15757D3189193DA6D1F4E32D /* RCTTouchHandler.m */, + E7081B5638A218EB530DAAC88CE3B8E2 /* RCTUIManager.h */, + D181B5ED44918AA1DC1A12764BB8EE87 /* RCTUIManager.m */, + 60C2C91FB5EBD0C3B476618A5C12ED9C /* RCTURLRequestDelegate.h */, + 2AA7E839FDF512E6C25D714EBE3C5ADA /* RCTURLRequestHandler.h */, + AC4811CABE7ADA4B17A145497AAEFDDE /* RCTUtils.h */, + 805AFC94BA56B18650A978D4672EA351 /* RCTUtils.m */, + ED86924CE7BECDA80D30FE1D3A50E240 /* RCTView.h */, + B731E0FA442E397BE04519F0E71CA139 /* RCTView.m */, + 392080750C86180DF549EC1EEFC734B7 /* RCTViewControllerProtocol.h */, + C362610731A25D6925E36AF7E38EB991 /* RCTViewManager.h */, + 4D163DB761EBB74EF3941A3EDF9E02CA /* RCTViewManager.m */, + C50401083335B3676DA218EF59D0D804 /* RCTWebView.h */, + 6DD58701AF585C38B66C7115CFBBCE48 /* RCTWebView.m */, + 1C1BB9D4F1ADB79901A912409384DF7F /* RCTWebViewExecutor.h */, + B342CEDB2F43CDA55724E1C008887EF8 /* RCTWebViewExecutor.m */, + 053AEAB11F016868E21550C85882276D /* RCTWebViewManager.h */, + B79F7473ACBDDC317778DA9855CE8CD1 /* RCTWebViewManager.m */, + 3C8ABAF2D599C10C3DC1C6E7BDD35B22 /* RCTWrapperViewController.h */, + 8D2BD72A78FAC9A770AE33355CCEC27E /* RCTWrapperViewController.m */, + 9C3494705C8D5C67CF7056F01B651AD0 /* UIView+Private.h */, + 5D38F8D50D8FA3ACF9A1B8C0F4CF301A /* UIView+React.h */, + 50F0CB24A6276A6E7AA2009FEBA2463F /* UIView+React.m */, + ); + name = Core; + sourceTree = ""; + }; + BF23B5F1BA3721514B6328144E3E0C82 /* Pods */ = { + isa = PBXGroup; + children = ( + 60E6AB5C47FFB965B21B3F38F3DF3099 /* React */, + 922DB3062271CBBE4AEAA8373385E599 /* VerloopSDKiOS */, + ); + name = Pods; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + BF23B5F1BA3721514B6328144E3E0C82 /* Pods */, + 721D17C344632A2B43E1BCCC2A56C05A /* Products */, + 2CFDC86A26A55A1D6A315F09DCBCB0E8 /* Targets Support Files */, + ); + sourceTree = ""; + }; + DA64CDCBFACC5ABB06BA0F42EC225126 /* Support Files */ = { + isa = PBXGroup; + children = ( + 172FADA009A75524DD45506E1B79A452 /* React.modulemap */, + 6830770B8DCECA47C7B72CABB3AC803F /* React-dummy.m */, + 7FA7B555535B122E3C0C2B5A56B6F24F /* React-Info.plist */, + 34983B2E87A67876BE4ABF6CCD0F9F24 /* React-prefix.pch */, + EEF20436E6D4B66DC5EAFD63F966CF47 /* React-umbrella.h */, + 0AC0309ADD6EB7032C02BC0D131DA485 /* React.debug.xcconfig */, + 1FE93FAAD3A7BA373409EA9047E25E7B /* React.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/React"; + sourceTree = ""; + }; + F79ABBFDAC7BAB06EAA2125A82416769 /* Pods-RNVerloopSdk */ = { + isa = PBXGroup; + children = ( + 1D3090FD29C544FA1B6CA807FC8E9156 /* Pods-RNVerloopSdk.modulemap */, + CD0384F2BEA1513005743D17D6B633BF /* Pods-RNVerloopSdk-acknowledgements.markdown */, + B70DE3ECC969F37CD59F38B4AEF03591 /* Pods-RNVerloopSdk-acknowledgements.plist */, + CB8899B135BC575CA6B06094354E9CFD /* Pods-RNVerloopSdk-dummy.m */, + FD2EE57A3247D010AA97B5E1E3DBDC46 /* Pods-RNVerloopSdk-Info.plist */, + 5721DAAA3BD8BF560C2235A84407DA6F /* Pods-RNVerloopSdk-umbrella.h */, + 792F6A0CA3AE9826CB2A32FDC7879BBB /* Pods-RNVerloopSdk.debug.xcconfig */, + 38BD620DB2B7726A1B4969C0B9C3F46F /* Pods-RNVerloopSdk.release.xcconfig */, + ); + name = "Pods-RNVerloopSdk"; + path = "Target Support Files/Pods-RNVerloopSdk"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 58B35171760431D9080E511461B17127 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9BBA28B80C45E8756D2FC6237E6400FA /* Layout.h in Headers */, + 7CD1C1EC399BCF05FCB5969E6A52FFFC /* RCTAccessibilityManager.h in Headers */, + 18659459DC065258DE7784BF271058F5 /* RCTActivityIndicatorViewManager.h in Headers */, + EBCB1C73D9160FC21AC1995D37761523 /* RCTAlertManager.h in Headers */, + 52AC9092180CF35EC86454964FE31D23 /* RCTAnimationType.h in Headers */, + 68D87AD538360BB84E35722B05B48610 /* RCTAppState.h in Headers */, + 2F232BCDCACFC2916AD563359904EE4A /* RCTAssert.h in Headers */, + E9277E793375A3A28CB6A7383B49DCBE /* RCTAsyncLocalStorage.h in Headers */, + CFC7CDCAE582124DFF3B3FE944DC50ED /* RCTAutoInsetsProtocol.h in Headers */, + B8BE8BD6AFAD80715035216CADDBCB4E /* RCTBorderDrawing.h in Headers */, + E6D9AC4CD814DEF09D7A3837AB7BC1B4 /* RCTBridge.h in Headers */, + 9832FAE4BF235B97217FDA7D86B5D93A /* RCTBridgeDelegate.h in Headers */, + 42226791D529D6891AA463EA1ED06C3D /* RCTBridgeModule.h in Headers */, + 063BBE2AA8A92A70C642CA8851C1F118 /* RCTCache.h in Headers */, + 62E6E0A13C23EC4E61FAB09AD76627A7 /* RCTComponent.h in Headers */, + 6BCD8CFFF9ECC93FC1FD17EE48760345 /* RCTComponentData.h in Headers */, + 995C39862F6B67DE00B50D3226185B68 /* RCTContextExecutor.h in Headers */, + AE146255202C73EADB8CC676140E9A74 /* RCTConvert.h in Headers */, + 0AF1BDA9660AFD03659FC2169C56920C /* RCTConvert+CoreLocation.h in Headers */, + 0AF6CA287E51BA9522BE5A443CD9B5E4 /* RCTConvert+MapKit.h in Headers */, + C3492BFDEABAB243625C3536B35D4B11 /* RCTDatePickerManager.h in Headers */, + A75E50877D70A5DF64334488D6CB70FF /* RCTDefines.h in Headers */, + 63C48F841C40BF098BF6240F7AAD018C /* RCTDevLoadingView.h in Headers */, + 2439E1233379C05F5750231B82EE7052 /* RCTDevMenu.h in Headers */, + 84D96626E8A8E9F3858F5CF5154F104E /* RCTEventDispatcher.h in Headers */, + 069AF77768EACF6BB235B18AF9F21769 /* RCTExceptionsManager.h in Headers */, + CA0D8BA113A0CB797B68BEA4A0796EAD /* RCTFPSGraph.h in Headers */, + 49A332B5669BD891F5307549CA229A27 /* RCTFrameUpdate.h in Headers */, + DB07A9CAD51667D8661187B56713E140 /* RCTInvalidating.h in Headers */, + B88E5DB8E88FAFFDB5F1A0C872C467E1 /* RCTJavaScriptExecutor.h in Headers */, + 2D7FCE2B67E8DD0FAF75A8B5D94A9301 /* RCTJavaScriptLoader.h in Headers */, + 4B277D5A986D99BB6FBC9D9C7D27C734 /* RCTJSMethodRegistrar.h in Headers */, + AF5EB58A7B1E297BAEF3AC208F2C9CB4 /* RCTKeyboardObserver.h in Headers */, + 98D40F9B8355736823881CC193413812 /* RCTKeyCommands.h in Headers */, + B6A7290455EE501245FF3C9739DEB677 /* RCTLog.h in Headers */, + 6927E9E7A77D86B6B8E1EC79C0B41A50 /* RCTMap.h in Headers */, + 9A54C5A59B825589ED094F47EFC605CB /* RCTMapManager.h in Headers */, + 1E94193C95B868E90BA6BB6412FA70E1 /* RCTModalHostView.h in Headers */, + 744E1C7783AA0BD0C20FCB7C2DB5507E /* RCTModalHostViewController.h in Headers */, + 561DF9C8AC21845402CFDECC8C0E8E9C /* RCTModalHostViewManager.h in Headers */, + 5A5CC942F33E91B875DEC39098DCDC65 /* RCTModuleData.h in Headers */, + 5880F644A7BFEBE438BA3083ADA935F5 /* RCTModuleMap.h in Headers */, + B69675DD3A1CA52029AD404587946B87 /* RCTModuleMethod.h in Headers */, + 5EF55B20764C214BE973CE55F2A0B70C /* RCTNavigator.h in Headers */, + EC91536E7DE2AD98F869A3CF9184C65A /* RCTNavigatorManager.h in Headers */, + 4D7F62577A72D2788EF77CFFD0BC8F24 /* RCTNavItem.h in Headers */, + D7BCBA38CF6EB1A9862BB5CFBF89E1C7 /* RCTNavItemManager.h in Headers */, + C5DB1C1AFB2340BC753642A5E88B1FCB /* RCTPerformanceLogger.h in Headers */, + 40FC9F1A2B7A30B942AA54433F803BF9 /* RCTPerfStats.h in Headers */, + 0CAE3C348C6E2E37D768FA64D1C8DCE7 /* RCTPicker.h in Headers */, + E5DA7386A3C3821BCB26987A0FE22E4D /* RCTPickerManager.h in Headers */, + 0F20BA0C7B9EBC8BAFA68ACFAF5F426D /* RCTPointAnnotation.h in Headers */, + 1E040935B949F172208626DE96254022 /* RCTPointerEvents.h in Headers */, + F6F8D9D78188E42A0DFEA2142734B68D /* RCTProfile.h in Headers */, + 67B1F3CF8215CC8E6912856E97C0DD2B /* RCTProgressViewManager.h in Headers */, + D9D1D1172E1A2832452C89DA5E7335F7 /* RCTRedBox.h in Headers */, + FADBD9D37C324000ABFE4B14EB6B3C67 /* RCTRootView.h in Headers */, + B851C88DBDDE3EDA6C14CB9DB37BDF5C /* RCTScrollableProtocol.h in Headers */, + C8D61D4CFA5BE78F2448A7F8E3D2E7A3 /* RCTScrollView.h in Headers */, + 9CC44E3FAA3BE3B3CD02088992233CEB /* RCTScrollViewManager.h in Headers */, + CEEAF5E0E2FC93304862214A8B1E0909 /* RCTSegmentedControl.h in Headers */, + D2313CE0D5A88ABBF95FAF2FCF30916C /* RCTSegmentedControlManager.h in Headers */, + 51AB39DB7E56B5C2C3FD8FCED055456A /* RCTShadowView.h in Headers */, + F5FEB247E977E3665182C13443FE0228 /* RCTSlider.h in Headers */, + 6D136D93B0895869050A62B02EEB676C /* RCTSliderManager.h in Headers */, + D78D2BD1904DE076481B73F2A206D09A /* RCTSourceCode.h in Headers */, + 3CFE43B32EBD063BB3D92741E29C4239 /* RCTSparseArray.h in Headers */, + 0583DF2B5E141DE8054E41FF7A8670A5 /* RCTStatusBarManager.h in Headers */, + 59D395F08BF0A0AA05110C15F3A1DB34 /* RCTSwitch.h in Headers */, + CC6D0C3A2DA09D9F954B94F292947679 /* RCTSwitchManager.h in Headers */, + 3D94B449FA76EE4BADEB726CF4681B73 /* RCTTabBar.h in Headers */, + 6A80C0554BB197A74CF2F2E5028168DA /* RCTTabBarItem.h in Headers */, + 95A714A5BFA6E3611E8F7222DD92378B /* RCTTabBarItemManager.h in Headers */, + BB98C1993A4B632B99FB28F9F7A2C104 /* RCTTabBarManager.h in Headers */, + 79023E3097187C91D5A1A71D086B6681 /* RCTTextDecorationLineType.h in Headers */, + 2BAC801E2746880834C300C30BB13261 /* RCTTiming.h in Headers */, + EA5C3406E897CFF863F829EE119D7F43 /* RCTTouchHandler.h in Headers */, + 665EBA83F4422325DE3D35FCBBD5A260 /* RCTUIManager.h in Headers */, + 66505B28FDD802E89B8A893668C3237C /* RCTURLRequestDelegate.h in Headers */, + 7D9E7FD0F1931645A1EE0BB8CD67E388 /* RCTURLRequestHandler.h in Headers */, + 001900E0E340C4D6AC7B713FAFC4A47A /* RCTUtils.h in Headers */, + E561D3BA4AD56507F9F4815C9A68E5D1 /* RCTView.h in Headers */, + 8B62D8C8C575459C4DB0A6DEDDA2DA12 /* RCTViewControllerProtocol.h in Headers */, + 847135AB47AE1772975DD1E93BB8B76E /* RCTViewManager.h in Headers */, + 5ADE337A522F51ECE1A89C382F5F214F /* RCTWebView.h in Headers */, + D74342C1190145C2D38AC428336E1E29 /* RCTWebViewExecutor.h in Headers */, + 0F8EB10A462BD57E9889824BAC03A8E6 /* RCTWebViewManager.h in Headers */, + 53056FC061E9784BF11E820F1FE5BF1D /* RCTWrapperViewController.h in Headers */, + 8428627048064F2C373A6E932D925C10 /* React-umbrella.h in Headers */, + C890D0E3BFA6EE77D84C1288DAF0D439 /* UIView+Private.h in Headers */, + 9A3191EBB354A25A6FCF39ACAF304525 /* UIView+React.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7277D767944E87EBAD5AC8D3AB96ED3E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 917BE803BD6729E4E509A5D42669EDD3 /* VerloopSDK.h in Headers */, + CD3437AC70934841D36B03290AF8C62B /* VerloopSDKiOS-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DF188318B698B620BC896E735478B2AA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4B6F03EEF2745F154872641A2BD8C3B7 /* Pods-RNVerloopSdk-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1BEE828C124E6416179B904A9F66D794 /* React */ = { + isa = PBXNativeTarget; + buildConfigurationList = E8EF05B7A453D9E7585B8FE3175AA2D7 /* Build configuration list for PBXNativeTarget "React" */; + buildPhases = ( + 58B35171760431D9080E511461B17127 /* Headers */, + 1E0DD3A1E2494870C4E481C8A15DB257 /* Copy React/Base Public Headers */, + 7F49B97F88A7FCADBDE308E55E57B775 /* Copy React/Layout Public Headers */, + 71DE862B78B2A8CED6AAC580C3712941 /* Copy React/Executors Public Headers */, + 930A8545B2CF8D340D47656360D66554 /* Copy React/Modules Public Headers */, + E0EC0689716AD127039CE1C91AF23381 /* Copy React/Views Public Headers */, + 87CC3885D643BCE0F93616FCB87187DF /* Sources */, + AB9BE5FE9FE664F316C84B06A3E0DC6C /* Frameworks */, + C5304105C303909C8C1F701F6D2C2272 /* Resources */, + 97D7850F6A73F6C68E93D7BAE11CAF35 /* Create Symlinks to Header Folders */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = React; + productName = React; + productReference = 0E7C341FA544E64E23E052A68E4A0A5E /* React */; + productType = "com.apple.product-type.framework"; + }; + 21A74B5A5E2B97F60184141B9134706A /* VerloopSDKiOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = C10B5F1F1773408CC106DB97DBA4C0A1 /* Build configuration list for PBXNativeTarget "VerloopSDKiOS" */; + buildPhases = ( + 7277D767944E87EBAD5AC8D3AB96ED3E /* Headers */, + BEB55D37AFB3F946F45A9350E9FF1520 /* Sources */, + 81ED23BF14D274F3701F7654AB05A395 /* Frameworks */, + 989FEB89BBBEBB8D3C0F49C53085B26A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = VerloopSDKiOS; + productName = VerloopSDKiOS; + productReference = 44E96DA09DC4399FA26D0D6EEA682966 /* VerloopSDKiOS */; + productType = "com.apple.product-type.framework"; + }; + F1DE335FC471A5F975A31A28FA6C0478 /* Pods-RNVerloopSdk */ = { + isa = PBXNativeTarget; + buildConfigurationList = 507D9642F73F4071A7184FAA58D403B2 /* Build configuration list for PBXNativeTarget "Pods-RNVerloopSdk" */; + buildPhases = ( + DF188318B698B620BC896E735478B2AA /* Headers */, + 27A9C4BFE6DC0EF6273AED146BF812E0 /* Sources */, + 049A048BB60B84E5AAD683CDB82DD0A9 /* Frameworks */, + C430A02CD54B89F6BA599607C4EA32E5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + D7199998F339E45833017F7466D9EF4F /* PBXTargetDependency */, + 985C08865046B89DFAB615CBAF91E408 /* PBXTargetDependency */, + ); + name = "Pods-RNVerloopSdk"; + productName = Pods_RNVerloopSdk; + productReference = 9D8ACCD4F2549A9B63C3B4B9A1DA7A84 /* Pods-RNVerloopSdk */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 721D17C344632A2B43E1BCCC2A56C05A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F1DE335FC471A5F975A31A28FA6C0478 /* Pods-RNVerloopSdk */, + 1BEE828C124E6416179B904A9F66D794 /* React */, + 21A74B5A5E2B97F60184141B9134706A /* VerloopSDKiOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 989FEB89BBBEBB8D3C0F49C53085B26A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C430A02CD54B89F6BA599607C4EA32E5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C5304105C303909C8C1F701F6D2C2272 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 97D7850F6A73F6C68E93D7BAE11CAF35 /* Create Symlinks to Header Folders */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Create Symlinks to Header Folders"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"$CONFIGURATION_BUILD_DIR/$WRAPPER_NAME\" || exit 1\nif [ ! -d Versions ]; then\n # Not a versioned framework, so no need to do anything\n exit 0\nfi\n\npublic_path=\"${PUBLIC_HEADERS_FOLDER_PATH#$CONTENTS_FOLDER_PATH/}\"\nif [ ! -f \"$public_path\" ]; then\n ln -fs \"${PUBLIC_HEADERS_FOLDER_PATH#$WRAPPER_NAME/}\" \"$public_path\"\nfi\n\nprivate_path=\"${PRIVATE_HEADERS_FOLDER_PATH#$CONTENTS_FOLDER_PATH/}\"\nif [ ! -f \"$private_path\" ]; then\n ln -fs \"${PRIVATE_HEADERS_FOLDER_PATH#$WRAPPER_NAME/}\" \"$private_path\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 27A9C4BFE6DC0EF6273AED146BF812E0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DA5698582E4CBDE9A48B9A6EE7082DD2 /* Pods-RNVerloopSdk-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 87CC3885D643BCE0F93616FCB87187DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4DC65260EBFA4612FFE152A761A3D5E9 /* Layout.c in Sources */, + 96A1B0199A2863039D704E832E3041F3 /* RCTAccessibilityManager.m in Sources */, + 5333339C47F70E154C3779EF6A47CC28 /* RCTActivityIndicatorViewManager.m in Sources */, + 0A256EA449D0330AE94920350A175C3D /* RCTAlertManager.m in Sources */, + B41449BCE2232BF1F29E3BC005DC71A3 /* RCTAppState.m in Sources */, + E035D58CDF4CBAB28224EAEBDD68C43A /* RCTAssert.m in Sources */, + 0529A50C344DF11CEE6D447F8C4A4F97 /* RCTAsyncLocalStorage.m in Sources */, + B919D3A32B3502C320D036F85641FAE2 /* RCTBatchedBridge.m in Sources */, + F28F79F2E77FFA6B672B0E061E58F8AE /* RCTBorderDrawing.m in Sources */, + 32F9F6D7BF83B6B988139F987F4DD323 /* RCTBridge.m in Sources */, + AD2F2AC289E8840A9698DFFAC7BD8A77 /* RCTCache.m in Sources */, + 705754F19B621296B771015F696396DC /* RCTComponentData.m in Sources */, + D66FFCD433C5E28EF09D276E8F9855D3 /* RCTContextExecutor.m in Sources */, + 3387F5C2CAAF452BC7CCBDFEB0DA4D19 /* RCTConvert.m in Sources */, + 36AAF21B4B46D683592D6B68F4AB757E /* RCTConvert+CoreLocation.m in Sources */, + 5B6C87346340697D7D58B309AAB0FC91 /* RCTConvert+MapKit.m in Sources */, + 8AAA5A094800EE19CC5BA8FBE03DBD44 /* RCTDatePickerManager.m in Sources */, + 1BD987E01D7977439AED45F198D6A1F5 /* RCTDevLoadingView.m in Sources */, + FA749202B2F7DF0CC8828D06653B9649 /* RCTDevMenu.m in Sources */, + 826B63C587206DC705DD53F60D2F897B /* RCTEventDispatcher.m in Sources */, + A4D128B5D23F638DC639EED7E2974523 /* RCTExceptionsManager.m in Sources */, + 72CCFE15A44CDB60180A350238A4E05F /* RCTFPSGraph.m in Sources */, + A6FD1FF7C487E5F7F677A74B83CBED83 /* RCTFrameUpdate.m in Sources */, + 5D9BD21B381D73AC9789FAA902F8F677 /* RCTJavaScriptLoader.m in Sources */, + CD37A6D391820DB9666CC58A691E1A37 /* RCTKeyboardObserver.m in Sources */, + 34BD0438D880ECFE321F1EA15FE7AB32 /* RCTKeyCommands.m in Sources */, + E73C6DE343B3505C84B8A6FF8518FC99 /* RCTLog.m in Sources */, + DED307CBCEB675B2968BDBBA0FF74AD9 /* RCTMap.m in Sources */, + 7426FCECB23E399F56EC7534CCF81384 /* RCTMapManager.m in Sources */, + BD9C0D779BD6C1B08D74C2D0E7DB4EBB /* RCTModalHostView.m in Sources */, + B51837DCBE848D63181EAD679C9FCB5F /* RCTModalHostViewController.m in Sources */, + 47CD57F3F5E7425DEC5AAE5D81793194 /* RCTModalHostViewManager.m in Sources */, + 0DCA836E200D19A12FE253C431663F69 /* RCTModuleData.m in Sources */, + 69BF8B3E389B3D1701FCD98F03C94CD8 /* RCTModuleMap.m in Sources */, + 5FB67AB91D8515DE3F32FDB0D1D4F492 /* RCTModuleMethod.m in Sources */, + 1E294A35572A5EE8D3CD897712DCA4C0 /* RCTNavigator.m in Sources */, + D70DBFA6F34FFDB478E182819BA2AF97 /* RCTNavigatorManager.m in Sources */, + BCC7DAE0EB5C7978D13BEB20E864E1CF /* RCTNavItem.m in Sources */, + A600C707E82F3135685BF1693652A997 /* RCTNavItemManager.m in Sources */, + CFC59B544CB69BCC535AC4C4A96DC2A1 /* RCTPerformanceLogger.m in Sources */, + 27C42AE22054BFB42BB823A780A24D5A /* RCTPerfStats.m in Sources */, + 80FBA392E4E39F1C65B5BED884E9C37A /* RCTPicker.m in Sources */, + C85D7C8D30F432A696827C520FF6A50C /* RCTPickerManager.m in Sources */, + 4EB662217A3B7D6208D798BC7D5FFDF2 /* RCTPointAnnotation.m in Sources */, + 70E485289F363040A7E01D75E0BC65DC /* RCTProfile.m in Sources */, + 37FE0AE846151B21DADCD3647FA70936 /* RCTProgressViewManager.m in Sources */, + F6AD645FF09B6BE516A1592FEFF91321 /* RCTRedBox.m in Sources */, + F6FA2199C4C3FF18CC65541AAD31611F /* RCTRootView.m in Sources */, + 148337544BFD640583A3A92CEB77BBE5 /* RCTScrollView.m in Sources */, + 1409315D5452124E775B3E0DDF80D6A8 /* RCTScrollViewManager.m in Sources */, + 6CE2D73EF25F83C9839188B09FC7291D /* RCTSegmentedControl.m in Sources */, + D5FC047765510F20B7D5DFE259DC844C /* RCTSegmentedControlManager.m in Sources */, + C6CA6B1B86DA9A3686B33785F9B80EF1 /* RCTShadowView.m in Sources */, + 6304D6F42B06C1B2DD95E5CEDF90147A /* RCTSlider.m in Sources */, + E92DDDC02495E8404182B649B6370396 /* RCTSliderManager.m in Sources */, + 97F35316C2DD156005C37329ACB12110 /* RCTSourceCode.m in Sources */, + B7D8A54E3622D1A1F09886AB7D1BE7A2 /* RCTSparseArray.m in Sources */, + CD3BD42912D2D62E249E98394F6FC16F /* RCTStatusBarManager.m in Sources */, + 4BAABCDA2C568AACAEEB0714F0F8B3D8 /* RCTSwitch.m in Sources */, + A142B0BEC264C3D4F280A52228E2F36F /* RCTSwitchManager.m in Sources */, + 7DE9EE0915490C21E6104FE12DEAF763 /* RCTTabBar.m in Sources */, + 4184FABEEC2BED74C1F01D0FE04E3DCA /* RCTTabBarItem.m in Sources */, + AF031E294AA4B04973D4BACE6B3D5B70 /* RCTTabBarItemManager.m in Sources */, + 37703904BEFC1901CBE6624155F5D973 /* RCTTabBarManager.m in Sources */, + 72F018AB1B44628570C2B691C99B28F8 /* RCTTiming.m in Sources */, + 541CC86DDC6CB0973DDB412FDE1C162A /* RCTTouchHandler.m in Sources */, + BA86D83EF176870756D99B7DEAFAEBA2 /* RCTUIManager.m in Sources */, + E611519CD7B3AC3D325803FD405707A1 /* RCTUtils.m in Sources */, + 80521C7F082DD178360A1382BE1F851D /* RCTView.m in Sources */, + C451DD80EDA817372187BC730144B3AA /* RCTViewManager.m in Sources */, + 880C6DAE70CDD5C3D3622A578BC14F72 /* RCTWebView.m in Sources */, + 7FE2CB05E2B78ECDDE040F1178D619FF /* RCTWebViewExecutor.m in Sources */, + AED84C9B1EC8AD08DCC4759EE9DBE2DC /* RCTWebViewManager.m in Sources */, + 4DDDAA1129E8D6A2EC896141FEE7C2E9 /* RCTWrapperViewController.m in Sources */, + 38FE3788A68595024E46596D54C0A8D2 /* React-dummy.m in Sources */, + E56F805421C07608115C145243E5312B /* UIView+React.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BEB55D37AFB3F946F45A9350E9FF1520 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1C0B80C92F87632E55FF2F065FA0AF7 /* Constants.swift in Sources */, + 71CD25B3381184F97FEAEEE60713387B /* NetworkMonitor.swift in Sources */, + 5AEB4B7B47CC0C317DB36DFD067AF0A2 /* Reachability.swift in Sources */, + 3F10F14DDF1F6BB28E295A01F8FAEB4E /* ScriptMessageHandler.swift in Sources */, + 3D145468F16D5C9F4326AF067B004D0A /* VerloopSDK.swift in Sources */, + F0C9490260E97A60F3AB187C8F742533 /* VerloopSDKiOS-dummy.m in Sources */, + CEF3D3AF4BA53FBA818B22244A0D1470 /* VLConfig.swift in Sources */, + C319144FD741D563227705AA5DCEA7E1 /* VLEvent.swift in Sources */, + 6F4834A2B9242C599AFD59508526C2B7 /* VLEventDelegate.swift in Sources */, + E3122E2700DDA080080200A377019368 /* VLExtensions.swift in Sources */, + D8E004712628BDF8DB03FCEDFD3B4C18 /* VLJSInterface.swift in Sources */, + 824E1410B41814870E08D5210DFC2275 /* VLNavViewController.swift in Sources */, + 3C35CF94F5EFFB1ACC6D1AE805B6E9B5 /* VLViewController.swift in Sources */, + 1BF318E276CCF0C8CCCBD83D635CD013 /* VLWebViewManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 985C08865046B89DFAB615CBAF91E408 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = VerloopSDKiOS; + target = 21A74B5A5E2B97F60184141B9134706A /* VerloopSDKiOS */; + targetProxy = 9B08A6D9EE495E4649E823596CD430EE /* PBXContainerItemProxy */; + }; + D7199998F339E45833017F7466D9EF4F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = React; + target = 1BEE828C124E6416179B904A9F66D794 /* React */; + targetProxy = 553EC9542309856EB683DFF98BFDA166 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4F12FE447F1612868E1D0AB079B624C0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19EADABC7E9C62358595B2665B02B74A /* VerloopSDKiOS.release.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS.modulemap"; + PRODUCT_MODULE_NAME = VerloopSDKiOS; + PRODUCT_NAME = VerloopSDKiOS; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 544CEB1A3A097C53F0E97F5889E395F4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 859DE6FA01266C2CFE4E6D116A2EA4E4 /* VerloopSDKiOS.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/VerloopSDKiOS/VerloopSDKiOS.modulemap"; + PRODUCT_MODULE_NAME = VerloopSDKiOS; + PRODUCT_NAME = VerloopSDKiOS; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 77E7F977202052399D28426CD021E83B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0AC0309ADD6EB7032C02BC0D131DA485 /* React.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/React/React-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/React/React-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/React/React.modulemap"; + PRODUCT_MODULE_NAME = React; + PRODUCT_NAME = React; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 903A0004D3E6651EFD5D2E16214D101B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + C1B24D9A90F332415C52A56959043323 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 792F6A0CA3AE9826CB2A32FDC7879BBB /* Pods-RNVerloopSdk.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E92E462A0C5F31570022D202C5481AE8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1FE93FAAD3A7BA373409EA9047E25E7B /* React.release.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/React/React-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/React/React-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/React/React.modulemap"; + PRODUCT_MODULE_NAME = React; + PRODUCT_NAME = React; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F135E282333684924F27EC336A262EDE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 38BD620DB2B7726A1B4969C0B9C3F46F /* Pods-RNVerloopSdk.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-RNVerloopSdk/Pods-RNVerloopSdk.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */, + 903A0004D3E6651EFD5D2E16214D101B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 507D9642F73F4071A7184FAA58D403B2 /* Build configuration list for PBXNativeTarget "Pods-RNVerloopSdk" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1B24D9A90F332415C52A56959043323 /* Debug */, + F135E282333684924F27EC336A262EDE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C10B5F1F1773408CC106DB97DBA4C0A1 /* Build configuration list for PBXNativeTarget "VerloopSDKiOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 544CEB1A3A097C53F0E97F5889E395F4 /* Debug */, + 4F12FE447F1612868E1D0AB079B624C0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E8EF05B7A453D9E7585B8FE3175AA2D7 /* Build configuration list for PBXNativeTarget "React" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 77E7F977202052399D28426CD021E83B /* Debug */, + E92E462A0C5F31570022D202C5481AE8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/ios/Pods/React/LICENSE b/ios/Pods/React/LICENSE new file mode 100644 index 00000000..8085fec4 --- /dev/null +++ b/ios/Pods/React/LICENSE @@ -0,0 +1,30 @@ +BSD License + +For React Native software + +Copyright (c) 2015-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ios/Pods/React/LICENSE-CustomComponents b/ios/Pods/React/LICENSE-CustomComponents new file mode 100644 index 00000000..01f2fbc0 --- /dev/null +++ b/ios/Pods/React/LICENSE-CustomComponents @@ -0,0 +1,9 @@ +LICENSE AGREEMENT + +For React Native Custom Components software + +Copyright (c) 2015, Facebook, Inc. All rights reserved. + +Facebook, Inc. (“Facebook”) owns all right, title and interest, including all intellectual property and other proprietary rights, in and to the React Native Custom Components software (the “Software”). Subject to your compliance with these terms, you are hereby granted a non-exclusive, worldwide, royalty-free copyright license to (1) use and copy the Software; and (2) reproduce and distribute the Software as part of your own software (“Your Software”). Facebook reserves all rights not expressly granted to you in this license agreement. + +THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ios/Pods/React/LICENSE-docs b/ios/Pods/React/LICENSE-docs new file mode 100644 index 00000000..d21a91a9 --- /dev/null +++ b/ios/Pods/React/LICENSE-docs @@ -0,0 +1,393 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/ios/Pods/React/LICENSE-examples b/ios/Pods/React/LICENSE-examples new file mode 100644 index 00000000..87f537d4 --- /dev/null +++ b/ios/Pods/React/LICENSE-examples @@ -0,0 +1,9 @@ +The examples provided by Facebook are for non-commercial testing and evaluation +purposes only. Facebook reserves all rights not expressly granted. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/ios/Pods/React/Libraries/ART/ARTSerializablePath.js b/ios/Pods/React/Libraries/ART/ARTSerializablePath.js new file mode 100644 index 00000000..4e8b3c22 --- /dev/null +++ b/ios/Pods/React/Libraries/ART/ARTSerializablePath.js @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ARTSerializablePath + */ +'use strict'; + +// TODO: Move this into an ART mode called "serialized" or something + +var Class = require('art/core/class.js'); +var Path = require('art/core/path.js'); + +var MOVE_TO = 0; +var CLOSE = 1; +var LINE_TO = 2; +var CURVE_TO = 3; +var ARC = 4; + +var SerializablePath = Class(Path, { + + initialize: function(path) { + this.reset(); + if (path instanceof SerializablePath) { + this.path = path.path.slice(0); + } else if (path) { + if (path.applyToPath) { + path.applyToPath(this); + } else { + this.push(path); + } + } + }, + + onReset: function() { + this.path = []; + }, + + onMove: function(sx, sy, x, y) { + this.path.push(MOVE_TO, x, y); + }, + + onLine: function(sx, sy, x, y) { + this.path.push(LINE_TO, x, y); + }, + + onBezierCurve: function(sx, sy, p1x, p1y, p2x, p2y, x, y) { + this.path.push(CURVE_TO, p1x, p1y, p2x, p2y, x, y); + }, + + _arcToBezier: Path.prototype.onArc, + + onArc: function(sx, sy, ex, ey, cx, cy, rx, ry, sa, ea, ccw, rotation) { + if (rx !== ry || rotation) { + return this._arcToBezier( + sx, sy, ex, ey, cx, cy, rx, ry, sa, ea, ccw, rotation + ); + } + this.path.push(ARC, cx, cy, rx, sa, ea, ccw ? 0 : 1); + }, + + onClose: function() { + this.path.push(CLOSE); + }, + + toJSON: function() { + return this.path; + } + +}); + +module.exports = SerializablePath; diff --git a/ios/Pods/React/Libraries/ART/ReactNativeART.js b/ios/Pods/React/Libraries/ART/ReactNativeART.js new file mode 100644 index 00000000..3b5801d0 --- /dev/null +++ b/ios/Pods/React/Libraries/ART/ReactNativeART.js @@ -0,0 +1,584 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactNativeART + */ +'use strict'; + +var Color = require('art/core/color'); +var Path = require('ARTSerializablePath'); +var Transform = require('art/core/transform'); + +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); +var merge = require('merge'); + +// Diff Helpers + +function arrayDiffer(a, b) { + if (a == null) { + return true; + } + if (a.length !== b.length) { + return true; + } + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return true; + } + } + return false; +} + +function fontAndLinesDiffer(a, b) { + if (a === b) { + return false; + } + if (a.font !== b.font) { + if (a.font === null) { + return true; + } + if (b.font === null) { + return true; + } + + if ( + a.font.fontFamily !== b.font.fontFamily || + a.font.fontSize !== b.font.fontSize || + a.font.fontWeight !== b.font.fontWeight || + a.font.fontStyle !== b.font.fontStyle + ) { + return true; + } + } + return arrayDiffer(a.lines, b.lines); +} + +// Native Attributes + +var SurfaceViewAttributes = merge(ReactNativeViewAttributes.UIView, { + // This should contain pixel information such as width, height and + // resolution to know what kind of buffer needs to be allocated. + // Currently we rely on UIViews and style to figure that out. +}); + +var NodeAttributes = { + transform: { diff: arrayDiffer }, + opacity: true, +}; + +var GroupAttributes = merge(NodeAttributes, { + clipping: { diff: arrayDiffer } +}); + +var RenderableAttributes = merge(NodeAttributes, { + fill: { diff: arrayDiffer }, + stroke: { diff: arrayDiffer }, + strokeWidth: true, + strokeCap: true, + strokeJoin: true, + strokeDash: { diff: arrayDiffer }, +}); + +var ShapeAttributes = merge(RenderableAttributes, { + d: { diff: arrayDiffer }, +}); + +var TextAttributes = merge(RenderableAttributes, { + alignment: true, + frame: { diff: fontAndLinesDiffer }, + path: { diff: arrayDiffer } +}); + +// Native Components + +var NativeSurfaceView = createReactNativeComponentClass({ + validAttributes: SurfaceViewAttributes, + uiViewClassName: 'ARTSurfaceView', +}); + +var NativeGroup = createReactNativeComponentClass({ + validAttributes: GroupAttributes, + uiViewClassName: 'ARTGroup', +}); + +var NativeShape = createReactNativeComponentClass({ + validAttributes: ShapeAttributes, + uiViewClassName: 'ARTShape', +}); + +var NativeText = createReactNativeComponentClass({ + validAttributes: TextAttributes, + uiViewClassName: 'ARTText', +}); + +// Utilities + +function childrenAsString(children) { + if (!children) { + return ''; + } + if (typeof children === 'string') { + return children; + } + if (children.length) { + return children.join('\n'); + } + return ''; +} + +// Surface - Root node of all ART + +var Surface = React.createClass({ + + render: function() { + var props = this.props; + var w = extractNumber(props.width, 0); + var h = extractNumber(props.height, 0); + return ( + + {this.props.children} + + ); + } + +}); + +// Node Props + +// TODO: The desktop version of ART has title and cursor. We should have +// accessibility support here too even though hovering doesn't work. + +function extractNumber(value, defaultValue) { + if (value == null) { + return defaultValue; + } + return +value; +} + +var pooledTransform = new Transform(); + +function extractTransform(props) { + var scaleX = props.scaleX != null ? props.scaleX : + props.scale != null ? props.scale : 1; + var scaleY = props.scaleY != null ? props.scaleY : + props.scale != null ? props.scale : 1; + + pooledTransform + .transformTo(1, 0, 0, 1, 0, 0) + .move(props.x || 0, props.y || 0) + .rotate(props.rotation || 0, props.originX, props.originY) + .scale(scaleX, scaleY, props.originX, props.originY); + + if (props.transform != null) { + pooledTransform.transform(props.transform); + } + + return [ + pooledTransform.xx, pooledTransform.yx, + pooledTransform.xy, pooledTransform.yy, + pooledTransform.x, pooledTransform.y, + ]; +} + +function extractOpacity(props) { + // TODO: visible === false should also have no hit detection + if (props.visible === false) { + return 0; + } + if (props.opacity == null) { + return 1; + } + return +props.opacity; +} + +// Groups + +// Note: ART has a notion of width and height on Group but AFAIK it's a noop in +// ReactART. + +var Group = React.createClass({ + + render: function() { + var props = this.props; + return ( + + {this.props.children} + + ); + } + +}); + +var ClippingRectangle = React.createClass({ + + render: function() { + var props = this.props; + var x = extractNumber(props.x, 0); + var y = extractNumber(props.y, 0); + var w = extractNumber(props.width, 0); + var h = extractNumber(props.height, 0); + var clipping = new Path() + .moveTo(x, y) + .line(w, 0) + .line(0, h) + .line(w, 0) + .close() + .toJSON(); + // The current clipping API requires x and y to be ignored in the transform + var propsExcludingXAndY = merge(props); + delete propsExcludingXAndY.x; + delete propsExcludingXAndY.y; + return ( + + {this.props.children} + + ); + } + +}); + +// Renderables + +var SOLID_COLOR = 0; +var LINEAR_GRADIENT = 1; +var RADIAL_GRADIENT = 2; +var PATTERN = 3; + +function insertColorIntoArray(color, targetArray, atIndex) { + var c = new Color(color); + targetArray[atIndex + 0] = c.red / 255; + targetArray[atIndex + 1] = c.green / 255; + targetArray[atIndex + 2] = c.blue / 255; + targetArray[atIndex + 3] = c.alpha; +} + +function insertColorsIntoArray(stops, targetArray, atIndex) { + var i = 0; + if ('length' in stops) { + while (i < stops.length) { + insertColorIntoArray(stops[i], targetArray, atIndex + i * 4); + i++; + } + } else { + for (var offset in stops) { + insertColorIntoArray(stops[offset], targetArray, atIndex + i * 4); + i++; + } + } + return atIndex + i * 4; +} + +function insertOffsetsIntoArray(stops, targetArray, atIndex, multi, reverse) { + var offsetNumber; + var i = 0; + if ('length' in stops) { + while (i < stops.length) { + offsetNumber = i / (stops.length - 1) * multi; + targetArray[atIndex + i] = reverse ? 1 - offsetNumber : offsetNumber; + i++; + } + } else { + for (var offsetString in stops) { + offsetNumber = (+offsetString) * multi; + targetArray[atIndex + i] = reverse ? 1 - offsetNumber : offsetNumber; + i++; + } + } + return atIndex + i; +} + +function insertColorStopsIntoArray(stops, targetArray, atIndex) { + var lastIndex = insertColorsIntoArray(stops, targetArray, atIndex); + insertOffsetsIntoArray(stops, targetArray, lastIndex, 1, false); +} + +function insertDoubleColorStopsIntoArray(stops, targetArray, atIndex) { + var lastIndex = insertColorsIntoArray(stops, targetArray, atIndex); + lastIndex = insertColorsIntoArray(stops, targetArray, lastIndex); + lastIndex = insertOffsetsIntoArray(stops, targetArray, lastIndex, 0.5, false); + insertOffsetsIntoArray(stops, targetArray, lastIndex, 0.5, true); +} + +function applyBoundingBoxToBrushData(brushData, props) { + var type = brushData[0]; + var width = +props.width; + var height = +props.height; + if (type === LINEAR_GRADIENT) { + brushData[1] *= width; + brushData[2] *= height; + brushData[3] *= width; + brushData[4] *= height; + } else if (type === RADIAL_GRADIENT) { + brushData[1] *= width; + brushData[2] *= height; + brushData[3] *= width; + brushData[4] *= height; + brushData[5] *= width; + brushData[6] *= height; + } else if (type === PATTERN) { + // todo + } +} + +function extractBrush(colorOrBrush, props) { + if (colorOrBrush == null) { + return null; + } + if (colorOrBrush._brush) { + if (colorOrBrush._bb) { + // The legacy API for Gradients allow for the bounding box to be used + // as a convenience for specifying gradient positions. This should be + // deprecated. It's not properly implemented in canvas mode. ReactART + // doesn't handle update to the bounding box correctly. That's why we + // mutate this so that if it's reused, we reuse the same resolved box. + applyBoundingBoxToBrushData(colorOrBrush._brush, props); + colorOrBrush._bb = false; + } + return colorOrBrush._brush; + } + var c = new Color(colorOrBrush); + return [SOLID_COLOR, c.red / 255, c.green / 255, c.blue / 255, c.alpha]; +} + +function extractColor(color) { + if (color == null) { + return null; + } + var c = new Color(color); + return [c.red / 255, c.green / 255, c.blue / 255, c.alpha]; +} + +function extractStrokeCap(strokeCap) { + switch (strokeCap) { + case 'butt': return 0; + case 'square': return 2; + default: return 1; // round + } +} + +function extractStrokeJoin(strokeJoin) { + switch (strokeJoin) { + case 'miter': return 0; + case 'bevel': return 2; + default: return 1; // round + } +} + +// Shape + +// Note: ART has a notion of width and height on Shape but AFAIK it's a noop in +// ReactART. + +var Shape = React.createClass({ + + render: function() { + var props = this.props; + var path = props.d || childrenAsString(props.children); + var d = new Path(path).toJSON(); + return ( + + ); + } + +}); + +// Text + +var cachedFontObjectsFromString = {}; + +var fontFamilyPrefix = /^[\s"']*/; +var fontFamilySuffix = /[\s"']*$/; + +function extractSingleFontFamily(fontFamilyString) { + // ART on the web allows for multiple font-families to be specified. + // For compatibility, we extract the first font-family, hoping + // we'll get a match. + return fontFamilyString.split(',')[0] + .replace(fontFamilyPrefix, '') + .replace(fontFamilySuffix, ''); +} + +function parseFontString(font) { + if (cachedFontObjectsFromString.hasOwnProperty(font)) { + return cachedFontObjectsFromString[font]; + } + var regexp = /^\s*((?:(?:normal|bold|italic)\s+)*)(?:(\d+(?:\.\d+)?)[ptexm\%]*(?:\s*\/.*?)?\s+)?\s*\"?([^\"]*)/i; + var match = regexp.exec(font); + if (!match) { + return null; + } + var fontFamily = extractSingleFontFamily(match[3]); + var fontSize = +match[2] || 12; + var isBold = /bold/.exec(match[1]); + var isItalic = /italic/.exec(match[1]); + cachedFontObjectsFromString[font] = { + fontFamily: fontFamily, + fontSize: fontSize, + fontWeight: isBold ? 'bold' : 'normal', + fontStyle: isItalic ? 'italic' : 'normal', + }; + return cachedFontObjectsFromString[font]; +} + +function extractFont(font) { + if (font == null) { + return null; + } + if (typeof font === 'string') { + return parseFontString(font); + } + var fontFamily = extractSingleFontFamily(font.fontFamily); + var fontSize = +font.fontSize || 12; + return { + // Normalize + fontFamily: fontFamily, + fontSize: fontSize, + fontWeight: font.fontWeight, + fontStyle: font.fontStyle, + }; +} + +var newLine = /\n/g; +function extractFontAndLines(font, text) { + return { font: extractFont(font), lines: text.split(newLine) }; +} + +function extractAlignment(alignment) { + switch (alignment) { + case 'right': + return 1; + case 'center': + return 2; + default: + return 0; + } +} + +var Text = React.createClass({ + + render: function() { + var props = this.props; + var textPath = props.path ? new Path(props.path).toJSON() : null; + var textFrame = extractFontAndLines( + props.font, + childrenAsString(props.children) + ); + return ( + + ); + } + +}); + +// Declarative fill type objects - API design not finalized + +function LinearGradient(stops, x1, y1, x2, y2) { + var type = LINEAR_GRADIENT; + + if (arguments.length < 5) { + var angle = ((x1 == null) ? 270 : x1) * Math.PI / 180; + + var x = Math.cos(angle); + var y = -Math.sin(angle); + var l = (Math.abs(x) + Math.abs(y)) / 2; + + x *= l; y *= l; + + x1 = 0.5 - x; + x2 = 0.5 + x; + y1 = 0.5 - y; + y2 = 0.5 + y; + this._bb = true; + } else { + this._bb = false; + } + + var brushData = [type, +x1, +y1, +x2, +y2]; + insertColorStopsIntoArray(stops, brushData, 5); + this._brush = brushData; +} + +function RadialGradient(stops, fx, fy, rx, ry, cx, cy) { + if (ry == null) { + ry = rx; + } + if (cx == null) { + cx = fx; + } + if (cy == null) { + cy = fy; + } + if (fx == null) { + // As a convenience we allow the whole radial gradient to cover the + // bounding box. We should consider dropping this API. + fx = fy = rx = ry = cx = cy = 0.5; + this._bb = true; + } else { + this._bb = false; + } + // The ART API expects the radial gradient to be repeated at the edges. + // To simulate this we render the gradient twice as large and add double + // color stops. Ideally this API would become more restrictive so that this + // extra work isn't needed. + var brushData = [RADIAL_GRADIENT, +fx, +fy, +rx * 2, +ry * 2, +cx, +cy]; + insertDoubleColorStopsIntoArray(stops, brushData, 7); + this._brush = brushData; +} + +function Pattern(url, width, height, left, top) { + this._brush = [PATTERN, url, +left || 0, +top || 0, +width, +height]; +} + +var ReactART = { + + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + Pattern: Pattern, + Transform: Transform, + Path: Path, + Surface: Surface, + Group: Group, + ClippingRectangle: ClippingRectangle, + Shape: Shape, + Text: Text, + +}; + +module.exports = ReactART; diff --git a/ios/Pods/React/Libraries/ActionSheetIOS/ActionSheetIOS.js b/ios/Pods/React/Libraries/ActionSheetIOS/ActionSheetIOS.js new file mode 100644 index 00000000..20150d6f --- /dev/null +++ b/ios/Pods/React/Libraries/ActionSheetIOS/ActionSheetIOS.js @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ActionSheetIOS + * @flow + */ +'use strict'; + +var RCTActionSheetManager = require('NativeModules').ActionSheetManager; + +var invariant = require('invariant'); + +var ActionSheetIOS = { + showActionSheetWithOptions(options: Object, callback: Function) { + invariant( + typeof options === 'object' && options !== null, + 'Options must a valid object' + ); + invariant( + typeof callback === 'function', + 'Must provide a valid callback' + ); + RCTActionSheetManager.showActionSheetWithOptions( + options, + () => {}, // RKActionSheet compatibility hack + callback + ); + }, + + showShareActionSheetWithOptions( + options: Object, + failureCallback: Function, + successCallback: Function + ) { + invariant( + typeof options === 'object' && options !== null, + 'Options must a valid object' + ); + invariant( + typeof failureCallback === 'function', + 'Must provide a valid failureCallback' + ); + invariant( + typeof successCallback === 'function', + 'Must provide a valid successCallback' + ); + RCTActionSheetManager.showShareActionSheetWithOptions( + options, + failureCallback, + successCallback + ); + } +}; + +module.exports = ActionSheetIOS; diff --git a/ios/Pods/React/Libraries/AdSupport/AdSupportIOS.js b/ios/Pods/React/Libraries/AdSupport/AdSupportIOS.js new file mode 100644 index 00000000..d9d315a1 --- /dev/null +++ b/ios/Pods/React/Libraries/AdSupport/AdSupportIOS.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AdSupportIOS + * @flow + */ +'use strict'; + +var AdSupport = require('NativeModules').AdSupport; + +module.exports = { + getAdvertisingId: function(onSuccess: Function, onFailure: Function) { + AdSupport.getAdvertisingId(onSuccess, onFailure); + }, + + getAdvertisingTrackingEnabled: function(onSuccess: Function, onFailure: Function) { + AdSupport.getAdvertisingTrackingEnabled(onSuccess, onFailure); + }, +}; diff --git a/ios/Pods/React/Libraries/Animated/Animated.js b/ios/Pods/React/Libraries/Animated/Animated.js new file mode 100644 index 00000000..ec4977f3 --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/Animated.js @@ -0,0 +1,1309 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Animated + * @flow + */ +'use strict'; + +var Easing = require('Easing'); +var Image = require('Image'); +var InteractionManager = require('InteractionManager'); +var Interpolation = require('Interpolation'); +var React = require('React'); +var Set = require('Set'); +var SpringConfig = require('SpringConfig'); +var Text = require('Text'); +var View = require('View'); +var invariant = require('invariant'); + +var flattenStyle = require('flattenStyle'); +var requestAnimationFrame = require('requestAnimationFrame'); + +import type InterpolationConfigType from 'Interpolation'; + +type EndResult = {finished: bool}; +type EndCallback = (result: EndResult) => void; + +// Note(vjeux): this would be better as an interface but flow doesn't +// support them yet +class Animated { + __attach(): void {} + __detach(): void {} + __getValue(): any {} + __getAnimatedValue(): any { return this.__getValue(); } + __addChild(child: Animated) {} + __removeChild(child: Animated) {} + __getChildren(): Array { return []; } +} + +// Important note: start() and stop() will only be called at most once. +// Once an animation has been stopped or finished its course, it will +// not be reused. +class Animation { + __active: bool; + __onEnd: ?EndCallback; + start( + fromValue: number, + onUpdate: (value: number) => void, + onEnd: ?EndCallback, + previousAnimation: ?Animation, + ): void {} + stop(): void {} + // Helper function for subclasses to make sure onEnd is only called once. + __debouncedOnEnd(result: EndResult) { + var onEnd = this.__onEnd; + this.__onEnd = null; + onEnd && onEnd(result); + } +} + +class AnimatedWithChildren extends Animated { + _children: Array; + + constructor() { + super(); + this._children = []; + } + + __addChild(child: Animated): void { + if (this._children.length === 0) { + this.__attach(); + } + this._children.push(child); + } + + __removeChild(child: Animated): void { + var index = this._children.indexOf(child); + if (index === -1) { + console.warn('Trying to remove a child that doesn\'t exist'); + return; + } + this._children.splice(index, 1); + if (this._children.length === 0) { + this.__detach(); + } + } + + __getChildren(): Array { + return this._children; + } +} + +/** + * Animated works by building a directed acyclic graph of dependencies + * transparently when you render your Animated components. + * + * new Animated.Value(0) + * .interpolate() .interpolate() new Animated.Value(1) + * opacity translateY scale + * style transform + * View#234 style + * View#123 + * + * A) Top Down phase + * When an Animated.Value is updated, we recursively go down through this + * graph in order to find leaf nodes: the views that we flag as needing + * an update. + * + * B) Bottom Up phase + * When a view is flagged as needing an update, we recursively go back up + * in order to build the new value that it needs. The reason why we need + * this two-phases process is to deal with composite props such as + * transform which can receive values from multiple parents. + */ +function _flush(rootNode: AnimatedValue): void { + var animatedStyles = new Set(); + function findAnimatedStyles(node) { + if (typeof node.update === 'function') { + animatedStyles.add(node); + } else { + node.__getChildren().forEach(findAnimatedStyles); + } + } + findAnimatedStyles(rootNode); + animatedStyles.forEach(animatedStyle => animatedStyle.update()); +} + +type TimingAnimationConfig = { + toValue: number; + easing?: (value: number) => number; + duration?: number; + delay?: number; +}; + +var easeInOut = Easing.inOut(Easing.ease); + +class TimingAnimation extends Animation { + _startTime: number; + _fromValue: number; + _toValue: number; + _duration: number; + _delay: number; + _easing: (value: number) => number; + _onUpdate: (value: number) => void; + _animationFrame: any; + _timeout: any; + + constructor( + config: TimingAnimationConfig, + ) { + super(); + this._toValue = config.toValue; + this._easing = config.easing || easeInOut; + this._duration = config.duration !== undefined ? config.duration : 500; + this._delay = config.delay || 0; + } + + start( + fromValue: number, + onUpdate: (value: number) => void, + onEnd: ?EndCallback, + ): void { + this.__active = true; + this._fromValue = fromValue; + this._onUpdate = onUpdate; + this.__onEnd = onEnd; + + var start = () => { + if (this._duration === 0) { + this._onUpdate(this._toValue); + this.__debouncedOnEnd({finished: true}); + } else { + this._startTime = Date.now(); + this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); + } + }; + if (this._delay) { + this._timeout = setTimeout(start, this._delay); + } else { + start(); + } + } + + onUpdate(): void { + var now = Date.now(); + if (now >= this._startTime + this._duration) { + if (this._duration === 0) { + this._onUpdate(this._toValue); + } else { + this._onUpdate( + this._fromValue + this._easing(1) * (this._toValue - this._fromValue) + ); + } + this.__debouncedOnEnd({finished: true}); + return; + } + + this._onUpdate( + this._fromValue + + this._easing((now - this._startTime) / this._duration) * + (this._toValue - this._fromValue) + ); + if (this.__active) { + this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); + } + } + + stop(): void { + this.__active = false; + clearTimeout(this._timeout); + window.cancelAnimationFrame(this._animationFrame); + this.__debouncedOnEnd({finished: false}); + } +} + +type DecayAnimationConfig = { + velocity: number | {x: number, y: number}; + deceleration?: number; +}; + +type DecayAnimationConfigSingle = { + velocity: number; + deceleration?: number; +}; + +class DecayAnimation extends Animation { + _startTime: number; + _lastValue: number; + _fromValue: number; + _deceleration: number; + _velocity: number; + _onUpdate: (value: number) => void; + _animationFrame: any; + + constructor( + config: DecayAnimationConfigSingle, + ) { + super(); + this._deceleration = config.deceleration || 0.998; + this._velocity = config.velocity; + } + + start( + fromValue: number, + onUpdate: (value: number) => void, + onEnd: ?EndCallback, + ): void { + this.__active = true; + this._lastValue = fromValue; + this._fromValue = fromValue; + this._onUpdate = onUpdate; + this.__onEnd = onEnd; + this._startTime = Date.now(); + this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); + } + + onUpdate(): void { + var now = Date.now(); + + var value = this._fromValue + + (this._velocity / (1 - this._deceleration)) * + (1 - Math.exp(-(1 - this._deceleration) * (now - this._startTime))); + + this._onUpdate(value); + + if (Math.abs(this._lastValue - value) < 0.1) { + this.__debouncedOnEnd({finished: true}); + return; + } + + this._lastValue = value; + if (this.__active) { + this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); + } + } + + stop(): void { + this.__active = false; + window.cancelAnimationFrame(this._animationFrame); + this.__debouncedOnEnd({finished: false}); + } +} + +type SpringAnimationConfig = { + toValue: number | AnimatedValue | {x: number, y: number} | AnimatedValueXY; + overshootClamping?: bool; + restDisplacementThreshold?: number; + restSpeedThreshold?: number; + velocity?: number | {x: number, y: number}; + bounciness?: number; + speed?: number; + tension?: number; + friction?: number; +}; + +type SpringAnimationConfigSingle = { + toValue: number | AnimatedValue; + overshootClamping?: bool; + restDisplacementThreshold?: number; + restSpeedThreshold?: number; + velocity?: number; + bounciness?: number; + speed?: number; + tension?: number; + friction?: number; +}; + +function withDefault(value: ?T, defaultValue: T): T { + if (value === undefined || value === null) { + return defaultValue; + } + return value; +} + +class SpringAnimation extends Animation { + _overshootClamping: bool; + _restDisplacementThreshold: number; + _restSpeedThreshold: number; + _initialVelocity: ?number; + _lastVelocity: number; + _startPosition: number; + _lastPosition: number; + _fromValue: number; + _toValue: any; + _tension: number; + _friction: number; + _lastTime: number; + _onUpdate: (value: number) => void; + _animationFrame: any; + + constructor( + config: SpringAnimationConfigSingle, + ) { + super(); + + this._overshootClamping = withDefault(config.overshootClamping, false); + this._restDisplacementThreshold = withDefault(config.restDisplacementThreshold, 0.001); + this._restSpeedThreshold = withDefault(config.restSpeedThreshold, 0.001); + this._initialVelocity = config.velocity; + this._lastVelocity = withDefault(config.velocity, 0); + this._toValue = config.toValue; + + var springConfig; + if (config.bounciness !== undefined || config.speed !== undefined) { + invariant( + config.tension === undefined && config.friction === undefined, + 'You can only define bounciness/speed or tension/friction but not both', + ); + springConfig = SpringConfig.fromBouncinessAndSpeed( + withDefault(config.bounciness, 8), + withDefault(config.speed, 12), + ); + } else { + springConfig = SpringConfig.fromOrigamiTensionAndFriction( + withDefault(config.tension, 40), + withDefault(config.friction, 7), + ); + } + this._tension = springConfig.tension; + this._friction = springConfig.friction; + } + + start( + fromValue: number, + onUpdate: (value: number) => void, + onEnd: ?EndCallback, + previousAnimation: ?Animation, + ): void { + this.__active = true; + this._startPosition = fromValue; + this._lastPosition = this._startPosition; + + this._onUpdate = onUpdate; + this.__onEnd = onEnd; + this._lastTime = Date.now(); + + if (previousAnimation instanceof SpringAnimation) { + var internalState = previousAnimation.getInternalState(); + this._lastPosition = internalState.lastPosition; + this._lastVelocity = internalState.lastVelocity; + this._lastTime = internalState.lastTime; + } + if (this._initialVelocity !== undefined && + this._initialVelocity !== null) { + this._lastVelocity = this._initialVelocity; + } + this.onUpdate(); + } + + getInternalState(): Object { + return { + lastPosition: this._lastPosition, + lastVelocity: this._lastVelocity, + lastTime: this._lastTime, + }; + } + + onUpdate(): void { + var position = this._lastPosition; + var velocity = this._lastVelocity; + + var tempPosition = this._lastPosition; + var tempVelocity = this._lastVelocity; + + // If for some reason we lost a lot of frames (e.g. process large payload or + // stopped in the debugger), we only advance by 4 frames worth of + // computation and will continue on the next frame. It's better to have it + // running at faster speed than jumping to the end. + var MAX_STEPS = 64; + var now = Date.now(); + if (now > this._lastTime + MAX_STEPS) { + now = this._lastTime + MAX_STEPS; + } + + // We are using a fixed time step and a maximum number of iterations. + // The following post provides a lot of thoughts into how to build this + // loop: http://gafferongames.com/game-physics/fix-your-timestep/ + var TIMESTEP_MSEC = 1; + var numSteps = Math.floor((now - this._lastTime) / TIMESTEP_MSEC); + + for (var i = 0; i < numSteps; ++i) { + // Velocity is based on seconds instead of milliseconds + var step = TIMESTEP_MSEC / 1000; + + // This is using RK4. A good blog post to understand how it works: + // http://gafferongames.com/game-physics/integration-basics/ + var aVelocity = velocity; + var aAcceleration = this._tension * (this._toValue - tempPosition) - this._friction * tempVelocity; + var tempPosition = position + aVelocity * step / 2; + var tempVelocity = velocity + aAcceleration * step / 2; + + var bVelocity = tempVelocity; + var bAcceleration = this._tension * (this._toValue - tempPosition) - this._friction * tempVelocity; + tempPosition = position + bVelocity * step / 2; + tempVelocity = velocity + bAcceleration * step / 2; + + var cVelocity = tempVelocity; + var cAcceleration = this._tension * (this._toValue - tempPosition) - this._friction * tempVelocity; + tempPosition = position + cVelocity * step / 2; + tempVelocity = velocity + cAcceleration * step / 2; + + var dVelocity = tempVelocity; + var dAcceleration = this._tension * (this._toValue - tempPosition) - this._friction * tempVelocity; + tempPosition = position + cVelocity * step / 2; + tempVelocity = velocity + cAcceleration * step / 2; + + var dxdt = (aVelocity + 2 * (bVelocity + cVelocity) + dVelocity) / 6; + var dvdt = (aAcceleration + 2 * (bAcceleration + cAcceleration) + dAcceleration) / 6; + + position += dxdt * step; + velocity += dvdt * step; + } + + this._lastTime = now; + this._lastPosition = position; + this._lastVelocity = velocity; + + this._onUpdate(position); + if (!this.__active) { // a listener might have stopped us in _onUpdate + return; + } + + // Conditions for stopping the spring animation + var isOvershooting = false; + if (this._overshootClamping && this._tension !== 0) { + if (this._startPosition < this._toValue) { + isOvershooting = position > this._toValue; + } else { + isOvershooting = position < this._toValue; + } + } + var isVelocity = Math.abs(velocity) <= this._restSpeedThreshold; + var isDisplacement = true; + if (this._tension !== 0) { + isDisplacement = Math.abs(this._toValue - position) <= this._restDisplacementThreshold; + } + + if (isOvershooting || (isVelocity && isDisplacement)) { + if (this._tension !== 0) { + // Ensure that we end up with a round value + this._onUpdate(this._toValue); + } + + this.__debouncedOnEnd({finished: true}); + return; + } + this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); + } + + stop(): void { + this.__active = false; + window.cancelAnimationFrame(this._animationFrame); + this.__debouncedOnEnd({finished: false}); + } +} + +type ValueListenerCallback = (state: {value: number}) => void; + +var _uniqueId = 1; + +class AnimatedValue extends AnimatedWithChildren { + _value: number; + _offset: number; + _animation: ?Animation; + _tracking: ?Animated; + _listeners: {[key: string]: ValueListenerCallback}; + + constructor(value: number) { + super(); + this._value = value; + this._offset = 0; + this._animation = null; + this._listeners = {}; + } + + __detach() { + this.stopAnimation(); + } + + __getValue(): number { + return this._value + this._offset; + } + + setValue(value: number): void { + if (this._animation) { + this._animation.stop(); + this._animation = null; + } + this._updateValue(value); + } + + setOffset(offset: number): void { + this._offset = offset; + } + + flattenOffset(): void { + this._value += this._offset; + this._offset = 0; + } + + addListener(callback: ValueListenerCallback): string { + var id = String(_uniqueId++); + this._listeners[id] = callback; + return id; + } + + removeListener(id: string): void { + delete this._listeners[id]; + } + + removeAllListeners(): void { + this._listeners = {}; + } + + animate(animation: Animation, callback: ?EndCallback): void { + var handle = InteractionManager.createInteractionHandle(); + var previousAnimation = this._animation; + this._animation && this._animation.stop(); + this._animation = animation; + animation.start( + this._value, + (value) => { + this._updateValue(value); + }, + (result) => { + this._animation = null; + InteractionManager.clearInteractionHandle(handle); + callback && callback(result); + }, + previousAnimation, + ); + } + + stopAnimation(callback?: ?(value: number) => void): void { + this.stopTracking(); + this._animation && this._animation.stop(); + this._animation = null; + callback && callback(this.__getValue()); + } + + stopTracking(): void { + this._tracking && this._tracking.__detach(); + this._tracking = null; + } + + track(tracking: Animated): void { + this.stopTracking(); + this._tracking = tracking; + } + + interpolate(config: InterpolationConfigType): AnimatedInterpolation { + return new AnimatedInterpolation(this, Interpolation.create(config)); + } + + _updateValue(value: number): void { + this._value = value; + _flush(this); + for (var key in this._listeners) { + this._listeners[key]({value: this.__getValue()}); + } + } +} + +type ValueXYListenerCallback = (value: {x: number; y: number}) => void; +class AnimatedValueXY extends AnimatedWithChildren { + x: AnimatedValue; + y: AnimatedValue; + _listeners: {[key: string]: {x: string; y: string}}; + + constructor(valueIn?: ?{x: number | AnimatedValue; y: number | AnimatedValue}) { + super(); + var value: any = valueIn || {x: 0, y: 0}; // @flowfixme: shouldn't need `: any` + if (typeof value.x === 'number' && typeof value.y === 'number') { + this.x = new AnimatedValue(value.x); + this.y = new AnimatedValue(value.y); + } else { + invariant( + value.x instanceof AnimatedValue && + value.y instanceof AnimatedValue, + 'AnimatedValueXY must be initalized with an object of numbers or ' + + 'AnimatedValues.' + ); + this.x = value.x; + this.y = value.y; + } + this._listeners = {}; + } + + setValue(value: {x: number; y: number}) { + this.x.setValue(value.x); + this.y.setValue(value.y); + } + + setOffset(offset: {x: number; y: number}) { + this.x.setOffset(offset.x); + this.y.setOffset(offset.y); + } + + flattenOffset(): void { + this.x.flattenOffset(); + this.y.flattenOffset(); + } + + __getValue(): {x: number; y: number} { + return { + x: this.x.__getValue(), + y: this.y.__getValue(), + }; + } + + stopAnimation(callback?: ?() => number): void { + this.x.stopAnimation(); + this.y.stopAnimation(); + callback && callback(this.__getValue()); + } + + addListener(callback: ValueXYListenerCallback): string { + var id = String(_uniqueId++); + var jointCallback = ({value: number}) => { + callback(this.__getValue()); + }; + this._listeners[id] = { + x: this.x.addListener(jointCallback), + y: this.y.addListener(jointCallback), + }; + return id; + } + + removeListener(id: string): void { + this.x.removeListener(this._listeners[id].x); + this.y.removeListener(this._listeners[id].y); + delete this._listeners[id]; + } + + getLayout(): {[key: string]: AnimatedValue} { + return { + left: this.x, + top: this.y, + }; + } + + getTranslateTransform(): Array<{[key: string]: AnimatedValue}> { + return [ + {translateX: this.x}, + {translateY: this.y} + ]; + } +} + +class AnimatedInterpolation extends AnimatedWithChildren { + _parent: Animated; + _interpolation: (input: number) => number | string; + + constructor(parent: Animated, interpolation: (input: number) => number | string) { + super(); + this._parent = parent; + this._interpolation = interpolation; + } + + __getValue(): number | string { + var parentValue: number = this._parent.__getValue(); + invariant( + typeof parentValue === 'number', + 'Cannot interpolate an input which is not a number.' + ); + return this._interpolation(parentValue); + } + + interpolate(config: InterpolationConfigType): AnimatedInterpolation { + return new AnimatedInterpolation(this, Interpolation.create(config)); + } + + __attach(): void { + this._parent.__addChild(this); + } + + __detach(): void { + this._parent.__removeChild(this); + } +} + +class AnimatedTransform extends AnimatedWithChildren { + _transforms: Array; + + constructor(transforms: Array) { + super(); + this._transforms = transforms; + } + + __getValue(): Array { + return this._transforms.map(transform => { + var result = {}; + for (var key in transform) { + var value = transform[key]; + if (value instanceof Animated) { + result[key] = value.__getValue(); + } else { + result[key] = value; + } + } + return result; + }); + } + + __getAnimatedValue(): Array { + return this._transforms.map(transform => { + var result = {}; + for (var key in transform) { + var value = transform[key]; + if (value instanceof Animated) { + result[key] = value.__getAnimatedValue(); + } else { + // All transform components needed to recompose matrix + result[key] = value; + } + } + return result; + }); + } + + __attach(): void { + this._transforms.forEach(transform => { + for (var key in transform) { + var value = transform[key]; + if (value instanceof Animated) { + value.__addChild(this); + } + } + }); + } + + __detach(): void { + this._transforms.forEach(transform => { + for (var key in transform) { + var value = transform[key]; + if (value instanceof Animated) { + value.__removeChild(this); + } + } + }); + } +} + +class AnimatedStyle extends AnimatedWithChildren { + _style: Object; + + constructor(style: any) { + super(); + style = flattenStyle(style) || {}; + if (style.transform) { + style = { + ...style, + transform: new AnimatedTransform(style.transform), + }; + } + this._style = style; + } + + __getValue(): Object { + var style = {}; + for (var key in this._style) { + var value = this._style[key]; + if (value instanceof Animated) { + style[key] = value.__getValue(); + } else { + style[key] = value; + } + } + return style; + } + + __getAnimatedValue(): Object { + var style = {}; + for (var key in this._style) { + var value = this._style[key]; + if (value instanceof Animated) { + style[key] = value.__getAnimatedValue(); + } + } + return style; + } + + __attach(): void { + for (var key in this._style) { + var value = this._style[key]; + if (value instanceof Animated) { + value.__addChild(this); + } + } + } + + __detach(): void { + for (var key in this._style) { + var value = this._style[key]; + if (value instanceof Animated) { + value.__removeChild(this); + } + } + } +} + +class AnimatedProps extends Animated { + _props: Object; + _callback: () => void; + + constructor( + props: Object, + callback: () => void, + ) { + super(); + if (props.style) { + props = { + ...props, + style: new AnimatedStyle(props.style), + }; + } + this._props = props; + this._callback = callback; + this.__attach(); + } + + __getValue(): Object { + var props = {}; + for (var key in this._props) { + var value = this._props[key]; + if (value instanceof Animated) { + props[key] = value.__getValue(); + } else { + props[key] = value; + } + } + return props; + } + + __getAnimatedValue(): Object { + var props = {}; + for (var key in this._props) { + var value = this._props[key]; + if (value instanceof Animated) { + props[key] = value.__getAnimatedValue(); + } + } + return props; + } + + __attach(): void { + for (var key in this._props) { + var value = this._props[key]; + if (value instanceof Animated) { + value.__addChild(this); + } + } + } + + __detach(): void { + for (var key in this._props) { + var value = this._props[key]; + if (value instanceof Animated) { + value.__removeChild(this); + } + } + } + + update(): void { + this._callback(); + } +} + +function createAnimatedComponent(Component: any): any { + var refName = 'node'; + + class AnimatedComponent extends React.Component { + _propsAnimated: AnimatedProps; + + componentWillUnmount() { + this._propsAnimated && this._propsAnimated.__detach(); + } + + setNativeProps(props) { + this.refs[refName].setNativeProps(props); + } + + componentWillMount() { + this.attachProps(this.props); + } + + attachProps(nextProps) { + var oldPropsAnimated = this._propsAnimated; + + // The system is best designed when setNativeProps is implemented. It is + // able to avoid re-rendering and directly set the attributes that + // changed. However, setNativeProps can only be implemented on leaf + // native components. If you want to animate a composite component, you + // need to re-render it. In this case, we have a fallback that uses + // forceUpdate. + var callback = () => { + if (this.refs[refName].setNativeProps) { + var value = this._propsAnimated.__getAnimatedValue(); + this.refs[refName].setNativeProps(value); + } else { + this.forceUpdate(); + } + }; + + this._propsAnimated = new AnimatedProps( + nextProps, + callback, + ); + + // When you call detach, it removes the element from the parent list + // of children. If it goes to 0, then the parent also detaches itself + // and so on. + // An optimization is to attach the new elements and THEN detach the old + // ones instead of detaching and THEN attaching. + // This way the intermediate state isn't to go to 0 and trigger + // this expensive recursive detaching to then re-attach everything on + // the very next operation. + oldPropsAnimated && oldPropsAnimated.__detach(); + } + + componentWillReceiveProps(nextProps) { + this.attachProps(nextProps); + } + + render() { + return ( + + ); + } + } + + return AnimatedComponent; +} + +class AnimatedTracking extends Animated { + _value: AnimatedValue; + _parent: Animated; + _callback: ?EndCallback; + _animationConfig: Object; + _animationClass: any; + + constructor( + value: AnimatedValue, + parent: Animated, + animationClass: any, + animationConfig: Object, + callback?: ?EndCallback, + ) { + super(); + this._value = value; + this._parent = parent; + this._animationClass = animationClass; + this._animationConfig = animationConfig; + this._callback = callback; + this.__attach(); + } + + __getValue(): Object { + return this._parent.__getValue(); + } + + __attach(): void { + this._parent.__addChild(this); + } + + __detach(): void { + this._parent.__removeChild(this); + } + + update(): void { + this._value.animate(new this._animationClass({ + ...this._animationConfig, + toValue: (this._animationConfig.toValue: any).__getValue(), + }), this._callback); + } +} + +type CompositeAnimation = { + start: (callback?: ?EndCallback) => void; + stop: () => void; +}; + +var maybeVectorAnim = function( + value: AnimatedValue | AnimatedValueXY, + config: Object, + anim: (value: AnimatedValue, config: Object) => CompositeAnimation +): ?CompositeAnimation { + if (value instanceof AnimatedValueXY) { + var configX = {...config}; + var configY = {...config}; + for (var key in config) { + var {x, y} = config[key]; + if (x !== undefined && y !== undefined) { + configX[key] = x; + configY[key] = y; + } + } + var aX = anim((value: AnimatedValueXY).x, configX); + var aY = anim((value: AnimatedValueXY).y, configY); + // We use `stopTogether: false` here because otherwise tracking will break + // because the second animation will get stopped before it can update. + return parallel([aX, aY], {stopTogether: false}); + } + return null; +}; + +var spring = function( + value: AnimatedValue | AnimatedValueXY, + config: SpringAnimationConfig, +): CompositeAnimation { + return maybeVectorAnim(value, config, spring) || { + start: function(callback?: ?EndCallback): void { + var singleValue: any = value; + var singleConfig: any = config; + singleValue.stopTracking(); + if (config.toValue instanceof Animated) { + singleValue.track(new AnimatedTracking( + singleValue, + config.toValue, + SpringAnimation, + singleConfig, + callback + )); + } else { + singleValue.animate(new SpringAnimation(singleConfig), callback); + } + }, + + stop: function(): void { + value.stopAnimation(); + }, + }; +}; + +var timing = function( + value: AnimatedValue | AnimatedValueXY, + config: TimingAnimationConfig, +): CompositeAnimation { + return maybeVectorAnim(value, config, timing) || { + start: function(callback?: ?EndCallback): void { + var singleValue: any = value; + var singleConfig: any = config; + singleValue.stopTracking(); + if (config.toValue instanceof Animated) { + singleValue.track(new AnimatedTracking( + singleValue, + config.toValue, + TimingAnimation, + singleConfig, + callback + )); + } else { + singleValue.animate(new TimingAnimation(singleConfig), callback); + } + }, + + stop: function(): void { + value.stopAnimation(); + }, + }; +}; + +var decay = function( + value: AnimatedValue | AnimatedValueXY, + config: DecayAnimationConfig, +): CompositeAnimation { + return maybeVectorAnim(value, config, decay) || { + start: function(callback?: ?EndCallback): void { + var singleValue: any = value; + var singleConfig: any = config; + singleValue.stopTracking(); + singleValue.animate(new DecayAnimation(singleConfig), callback); + }, + + stop: function(): void { + value.stopAnimation(); + }, + }; +}; + +var sequence = function( + animations: Array, +): CompositeAnimation { + var current = 0; + return { + start: function(callback?: ?EndCallback) { + var onComplete = function(result) { + if (!result.finished) { + callback && callback(result); + return; + } + + current++; + + if (current === animations.length) { + callback && callback(result); + return; + } + + animations[current].start(onComplete); + }; + + if (animations.length === 0) { + callback && callback({finished: true}); + } else { + animations[current].start(onComplete); + } + }, + + stop: function() { + if (current < animations.length) { + animations[current].stop(); + } + } + }; +}; + +type ParallelConfig = { + stopTogether?: bool; // If one is stopped, stop all. default: true +} +var parallel = function( + animations: Array, + config?: ?ParallelConfig, +): CompositeAnimation { + var doneCount = 0; + // Make sure we only call stop() at most once for each animation + var hasEnded = {}; + var stopTogether = !(config && config.stopTogether === false); + + var result = { + start: function(callback?: ?EndCallback) { + if (doneCount === animations.length) { + callback && callback({finished: true}); + return; + } + + animations.forEach((animation, idx) => { + var cb = function(endResult) { + hasEnded[idx] = true; + doneCount++; + if (doneCount === animations.length) { + doneCount = 0; + callback && callback(endResult); + return; + } + + if (!endResult.finished && stopTogether) { + result.stop(); + } + }; + + if (!animation) { + cb({finished: true}); + } else { + animation.start(cb); + } + }); + }, + + stop: function(): void { + animations.forEach((animation, idx) => { + !hasEnded[idx] && animation.stop(); + hasEnded[idx] = true; + }); + } + }; + + return result; +}; + +var delay = function(time: number): CompositeAnimation { + // Would be nice to make a specialized implementation + return timing(new AnimatedValue(0), {toValue: 0, delay: time, duration: 0}); +}; + +var stagger = function( + time: number, + animations: Array, +): CompositeAnimation { + return parallel(animations.map((animation, i) => { + return sequence([ + delay(time * i), + animation, + ]); + })); +}; + +type Mapping = {[key: string]: Mapping} | AnimatedValue; + +/** + * Takes an array of mappings and extracts values from each arg accordingly, + * then calls setValue on the mapped outputs. e.g. + * + * onScroll={this.AnimatedEvent( + * [{nativeEvent: {contentOffset: {x: this._scrollX}}}] + * {listener} // optional listener invoked asynchronously + * ) + * ... + * onPanResponderMove: this.AnimatedEvent([ + * null, // raw event arg + * {dx: this._panX}, // gestureState arg + * ]), + * + */ +type EventConfig = {listener?: ?Function}; +var event = function( + argMapping: Array, + config?: ?EventConfig, +): () => void { + return function(...args): void { + var traverse = function(recMapping, recEvt, key) { + if (typeof recEvt === 'number') { + invariant( + recMapping instanceof AnimatedValue, + 'Bad mapping of type ' + typeof recMapping + ' for key ' + key + + ', event value must map to AnimatedValue' + ); + recMapping.setValue(recEvt); + return; + } + invariant( + typeof recMapping === 'object', + 'Bad mapping of type ' + typeof recMapping + ' for key ' + key + ); + invariant( + typeof recEvt === 'object', + 'Bad event of type ' + typeof recEvt + ' for key ' + key + ); + for (var key in recMapping) { + traverse(recMapping[key], recEvt[key], key); + } + }; + argMapping.forEach((mapping, idx) => { + traverse(mapping, args[idx], 'arg' + idx); + }); + if (config && config.listener) { + config.listener.apply(null, args); + } + }; +}; + +module.exports = { + delay, + sequence, + parallel, + stagger, + + decay, + timing, + spring, + + event, + + Value: AnimatedValue, + ValueXY: AnimatedValueXY, + __PropsOnlyForTests: AnimatedProps, + View: createAnimatedComponent(View), + Text: createAnimatedComponent(Text), + Image: createAnimatedComponent(Image), + createAnimatedComponent, +}; diff --git a/ios/Pods/React/Libraries/Animated/Easing.js b/ios/Pods/React/Libraries/Animated/Easing.js new file mode 100644 index 00000000..ae90136d --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/Easing.js @@ -0,0 +1,148 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Easing + * @flow + */ +'use strict'; + +var bezier = require('bezier'); + +/** + * This class implements common easing functions. The math is pretty obscure, + * but this cool website has nice visual illustrations of what they represent: + * http://xaedes.de/dev/transitions/ + */ +class Easing { + static step0(n) { + return n > 0 ? 1 : 0; + } + + static step1(n) { + return n >= 1 ? 1 : 0; + } + + static linear(t) { + return t; + } + + static ease(t: number): number { + return ease(t); + } + + static quad(t) { + return t * t; + } + + static cubic(t) { + return t * t * t; + } + + static poly(n) { + return (t) => Math.pow(t, n); + } + + static sin(t) { + return 1 - Math.cos(t * Math.PI / 2); + } + + static circle(t) { + return 1 - Math.sqrt(1 - t * t); + } + + static exp(t) { + return Math.pow(2, 10 * (t - 1)); + } + + static elastic(a: number, p: number): (t: number) => number { + var tau = Math.PI * 2; + // flow isn't smart enough to figure out that s is always assigned to a + // number before being used in the returned function + var s: any; + if (arguments.length < 2) { + p = 0.45; + } + if (arguments.length) { + s = p / tau * Math.asin(1 / a); + } else { + a = 1; + s = p / 4; + } + return (t) => 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * tau / p); + }; + + static back(s: number): (t: number) => number { + if (s === undefined) { + s = 1.70158; + } + return (t) => t * t * ((s + 1) * t - s); + }; + + static bounce(t: number): number { + if (t < 1 / 2.75) { + return 7.5625 * t * t; + } + + if (t < 2 / 2.75) { + t -= 1.5 / 2.75; + return 7.5625 * t * t + 0.75; + } + + if (t < 2.5 / 2.75) { + t -= 2.25 / 2.75; + return 7.5625 * t * t + 0.9375; + } + + t -= 2.625 / 2.75; + return 7.5625 * t * t + 0.984375; + }; + + static bezier( + x1: number, + y1: number, + x2: number, + y2: number, + epsilon?: ?number, + ): (t: number) => number { + if (epsilon === undefined) { + // epsilon determines the precision of the solved values + // a good approximation is: + var duration = 500; // duration of animation in milliseconds. + epsilon = (1000 / 60 / duration) / 4; + } + + return bezier(x1, y1, x2, y2, epsilon); + } + + static in( + easing: (t: number) => number, + ): (t: number) => number { + return easing; + } + + static out( + easing: (t: number) => number, + ): (t: number) => number { + return (t) => 1 - easing(1 - t); + } + + static inOut( + easing: (t: number) => number, + ): (t: number) => number { + return (t) => { + if (t < 0.5) { + return easing(t * 2) / 2; + } + return 1 - easing((1 - t) * 2) / 2; + }; + } +} + +var ease = Easing.bezier(0.42, 0, 1, 1); + +module.exports = Easing; diff --git a/ios/Pods/React/Libraries/Animated/Interpolation.js b/ios/Pods/React/Libraries/Animated/Interpolation.js new file mode 100644 index 00000000..fecbf0d4 --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/Interpolation.js @@ -0,0 +1,265 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Interpolation + * @flow + */ +'use strict'; + +// TODO(#7644673): fix this hack once github jest actually checks invariants +var invariant = function(condition, message) { + if (!condition) { + var error = new Error(message); + (error: any).framesToPop = 1; // $FlowIssue + throw error; + } +}; + +type ExtrapolateType = 'extend' | 'identity' | 'clamp'; + +// $FlowFixMe D2163827 +export type InterpolationConfigType = { + inputRange: Array; + outputRange: (Array | Array); + easing?: ((input: number) => number); + extrapolate?: ExtrapolateType; + extrapolateLeft?: ExtrapolateType; + extrapolateRight?: ExtrapolateType; +}; + +var linear = (t) => t; + +/** + * Very handy helper to map input ranges to output ranges with an easing + * function and custom behavior outside of the ranges. + */ +class Interpolation { + static create(config: InterpolationConfigType): (input: number) => number | string { + + if (config.outputRange && typeof config.outputRange[0] === 'string') { + return createInterpolationFromStringOutputRange(config); + } + + var outputRange: Array = (config.outputRange: any); + checkInfiniteRange('outputRange', outputRange); + + var inputRange = config.inputRange; + checkInfiniteRange('inputRange', inputRange); + checkValidInputRange(inputRange); + + invariant( + inputRange.length === outputRange.length, + 'inputRange (' + inputRange.length + ') and outputRange (' + + outputRange.length + ') must have the same length' + ); + + var easing = config.easing || linear; + + var extrapolateLeft: ExtrapolateType = 'extend'; + if (config.extrapolateLeft !== undefined) { + extrapolateLeft = config.extrapolateLeft; + } else if (config.extrapolate !== undefined) { + extrapolateLeft = config.extrapolate; + } + + var extrapolateRight: ExtrapolateType = 'extend'; + if (config.extrapolateRight !== undefined) { + extrapolateRight = config.extrapolateRight; + } else if (config.extrapolate !== undefined) { + extrapolateRight = config.extrapolate; + } + + return (input) => { + invariant( + typeof input === 'number', + 'Cannot interpolation an input which is not a number' + ); + + var range = findRange(input, inputRange); + return interpolate( + input, + inputRange[range], + inputRange[range + 1], + outputRange[range], + outputRange[range + 1], + easing, + extrapolateLeft, + extrapolateRight, + ); + }; + } +} + +function interpolate( + input: number, + inputMin: number, + inputMax: number, + outputMin: number, + outputMax: number, + easing: ((input: number) => number), + extrapolateLeft: ExtrapolateType, + extrapolateRight: ExtrapolateType, +) { + var result = input; + + // Extrapolate + if (result < inputMin) { + if (extrapolateLeft === 'identity') { + return result; + } else if (extrapolateLeft === 'clamp') { + result = inputMin; + } else if (extrapolateLeft === 'extend') { + // noop + } + } + + if (result > inputMax) { + if (extrapolateRight === 'identity') { + return result; + } else if (extrapolateRight === 'clamp') { + result = inputMax; + } else if (extrapolateRight === 'extend') { + // noop + } + } + + if (outputMin === outputMax) { + return outputMin; + } + + if (inputMin === inputMax) { + if (input <= inputMin) { + return outputMin; + } + return outputMax; + } + + // Input Range + if (inputMin === -Infinity) { + result = -result; + } else if (inputMax === Infinity) { + result = result - inputMin; + } else { + result = (result - inputMin) / (inputMax - inputMin); + } + + // Easing + result = easing(result); + + // Output Range + if (outputMin === -Infinity) { + result = -result; + } else if (outputMax === Infinity) { + result = result + outputMin; + } else { + result = result * (outputMax - outputMin) + outputMin; + } + + return result; +} + +var stringShapeRegex = /[0-9\.-]+/g; + +/** + * Supports string shapes by extracting numbers so new values can be computed, + * and recombines those values into new strings of the same shape. Supports + * things like: + * + * rgba(123, 42, 99, 0.36) // colors + * -45deg // values with units + */ +function createInterpolationFromStringOutputRange( + config: InterpolationConfigType, +): (input: number) => string { + var outputRange: Array = (config.outputRange: any); + invariant(outputRange.length >= 2, 'Bad output range'); + checkPattern(outputRange); + + // ['rgba(0, 100, 200, 0)', 'rgba(50, 150, 250, 0.5)'] + // -> + // [ + // [0, 50], + // [100, 150], + // [200, 250], + // [0, 0.5], + // ] + var outputRanges = outputRange[0].match(stringShapeRegex).map(() => []); + outputRange.forEach(value => { + value.match(stringShapeRegex).forEach((number, i) => { + outputRanges[i].push(+number); + }); + }); + + var interpolations = outputRange[0].match(stringShapeRegex).map((value, i) => { + return Interpolation.create({ + ...config, + outputRange: outputRanges[i], + }); + }); + + return (input) => { + var i = 0; + // 'rgba(0, 100, 200, 0)' + // -> + // 'rgba(${interpolations[0](input)}, ${interpolations[1](input)}, ...' + return outputRange[0].replace(stringShapeRegex, () => { + return String(interpolations[i++](input)); + }); + }; +} + +function checkPattern(arr: Array) { + var pattern = arr[0].replace(stringShapeRegex, ''); + for (var i = 1; i < arr.length; ++i) { + invariant( + pattern === arr[i].replace(stringShapeRegex, ''), + 'invalid pattern ' + arr[0] + ' and ' + arr[i], + ); + } +} + +function findRange(input: number, inputRange: Array) { + for (var i = 1; i < inputRange.length - 1; ++i) { + if (inputRange[i] >= input) { + break; + } + } + return i - 1; +} + +function checkValidInputRange(arr: Array) { + invariant(arr.length >= 2, 'inputRange must have at least 2 elements'); + for (var i = 1; i < arr.length; ++i) { + invariant( + arr[i] >= arr[i - 1], + /* $FlowFixMe(>=0.13.0) - In the addition expression below this comment, + * one or both of the operands may be something that doesn't cleanly + * convert to a string, like undefined, null, and object, etc. If you really + * mean this implicit string conversion, you can do something like + * String(myThing) + */ + 'inputRange must be monotonically increasing ' + arr + ); + } +} + +function checkInfiniteRange(name: string, arr: Array) { + invariant(arr.length >= 2, name + ' must have at least 2 elements'); + invariant( + arr.length !== 2 || arr[0] !== -Infinity || arr[1] !== Infinity, + /* $FlowFixMe(>=0.13.0) - In the addition expression below this comment, + * one or both of the operands may be something that doesn't cleanly convert + * to a string, like undefined, null, and object, etc. If you really mean + * this implicit string conversion, you can do something like + * String(myThing) + */ + name + 'cannot be ]-infinity;+infinity[ ' + arr + ); +} + +module.exports = Interpolation; diff --git a/ios/Pods/React/Libraries/Animated/SpringConfig.js b/ios/Pods/React/Libraries/Animated/SpringConfig.js new file mode 100644 index 00000000..d10abced --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/SpringConfig.js @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SpringConfig + * @flow + */ + +'use strict'; + +type SpringConfigType = { + tension: number, + friction: number, +}; + +function tensionFromOrigamiValue(oValue) { + return (oValue - 30) * 3.62 + 194; +} + +function frictionFromOrigamiValue(oValue) { + return (oValue - 8) * 3 + 25; +} + +function fromOrigamiTensionAndFriction( + tension: number, + friction: number, +): SpringConfigType { + return { + tension: tensionFromOrigamiValue(tension), + friction: frictionFromOrigamiValue(friction) + }; +} + +function fromBouncinessAndSpeed( + bounciness: number, + speed: number, +): SpringConfigType { + function normalize(value, startValue, endValue) { + return (value - startValue) / (endValue - startValue); + } + + function projectNormal(n, start, end) { + return start + (n * (end - start)); + } + + function linearInterpolation(t, start, end) { + return t * end + (1 - t) * start; + } + + function quadraticOutInterpolation(t, start, end) { + return linearInterpolation(2 * t - t * t, start, end); + } + + function b3Friction1(x) { + return (0.0007 * Math.pow(x, 3)) - + (0.031 * Math.pow(x, 2)) + 0.64 * x + 1.28; + } + + function b3Friction2(x) { + return (0.000044 * Math.pow(x, 3)) - + (0.006 * Math.pow(x, 2)) + 0.36 * x + 2; + } + + function b3Friction3(x) { + return (0.00000045 * Math.pow(x, 3)) - + (0.000332 * Math.pow(x, 2)) + 0.1078 * x + 5.84; + } + + function b3Nobounce(tension) { + if (tension <= 18) { + return b3Friction1(tension); + } else if (tension > 18 && tension <= 44) { + return b3Friction2(tension); + } else { + return b3Friction3(tension); + } + } + + var b = normalize(bounciness / 1.7, 0, 20); + b = projectNormal(b, 0, 0.8); + var s = normalize(speed / 1.7, 0, 20); + var bouncyTension = projectNormal(s, 0.5, 200); + var bouncyFriction = quadraticOutInterpolation( + b, + b3Nobounce(bouncyTension), + 0.01 + ); + + return { + tension: tensionFromOrigamiValue(bouncyTension), + friction: frictionFromOrigamiValue(bouncyFriction) + }; +} + +module.exports = { + fromOrigamiTensionAndFriction, + fromBouncinessAndSpeed, +}; diff --git a/ios/Pods/React/Libraries/Animated/__tests__/Animated-test.js b/ios/Pods/React/Libraries/Animated/__tests__/Animated-test.js new file mode 100644 index 00000000..5f24fc54 --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/__tests__/Animated-test.js @@ -0,0 +1,516 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +jest + .autoMockOff() + .setMock('Text', {}) + .setMock('View', {}) + .setMock('Image', {}) + .setMock('React', {Component: class {}}); + +var Animated = require('Animated'); + +describe('Animated', () => { + it('works end to end', () => { + var anim = new Animated.Value(0); + + var callback = jest.genMockFunction(); + + var node = new Animated.__PropsOnlyForTests({ + style: { + backgroundColor: 'red', + opacity: anim, + transform: [ + {translateX: anim.interpolate({ + inputRange: [0, 1], + outputRange: [100, 200], + })}, + {scale: anim}, + ] + } + }, callback); + + expect(anim.__getChildren().length).toBe(3); + + expect(node.__getValue()).toEqual({ + style: { + backgroundColor: 'red', + opacity: 0, + transform: [ + {translateX: 100}, + {scale: 0}, + ], + }, + }); + + anim.setValue(0.5); + + expect(callback).toBeCalled(); + + expect(node.__getValue()).toEqual({ + style: { + backgroundColor: 'red', + opacity: 0.5, + transform: [ + {translateX: 150}, + {scale: 0.5}, + ], + }, + }); + + node.__detach(); + expect(anim.__getChildren().length).toBe(0); + + anim.setValue(1); + expect(callback.mock.calls.length).toBe(1); + }); + + it('does not detach on updates', () => { + var anim = new Animated.Value(0); + anim.__detach = jest.genMockFunction(); + + var c = new Animated.View(); + c.props = { + style: { + opacity: anim, + }, + }; + c.componentWillMount(); + + expect(anim.__detach).not.toBeCalled(); + c.componentWillReceiveProps({ + style: { + opacity: anim, + }, + }); + expect(anim.__detach).not.toBeCalled(); + + c.componentWillUnmount(); + expect(anim.__detach).toBeCalled(); + }); + + + it('stops animation when detached', () => { + // jest environment doesn't have requestAnimationFrame :( + window.requestAnimationFrame = jest.genMockFunction(); + window.cancelAnimationFrame = jest.genMockFunction(); + + var anim = new Animated.Value(0); + var callback = jest.genMockFunction(); + + var c = new Animated.View(); + c.props = { + style: { + opacity: anim, + }, + }; + c.componentWillMount(); + + Animated.timing(anim, {toValue: 10, duration: 1000}).start(callback); + + c.componentWillUnmount(); + + expect(callback).toBeCalledWith({finished: false}); + expect(callback).toBeCalledWith({finished: false}); + }); + + it('triggers callback when spring is at rest', () => { + var anim = new Animated.Value(0); + var callback = jest.genMockFunction(); + Animated.spring(anim, {toValue: 0, velocity: 0}).start(callback); + expect(callback).toBeCalled(); + }); + + it('send toValue when a spring stops', () => { + var anim = new Animated.Value(0); + var listener = jest.genMockFunction(); + anim.addListener(listener); + Animated.spring(anim, {toValue: 15}).start(); + jest.runAllTimers(); + var lastValue = listener.mock.calls[listener.mock.calls.length - 2][0].value; + expect(lastValue).not.toBe(15); + expect(lastValue).toBeCloseTo(15); + expect(anim.__getValue()).toBe(15); + }); + +}); + + +describe('Animated Sequence', () => { + + it('works with an empty sequence', () => { + var cb = jest.genMockFunction(); + Animated.sequence([]).start(cb); + expect(cb).toBeCalledWith({finished: true}); + }); + + it('sequences well', () => { + var anim1 = {start: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + var seq = Animated.sequence([anim1, anim2]); + + expect(anim1.start).not.toBeCalled(); + expect(anim2.start).not.toBeCalled(); + + seq.start(cb); + + expect(anim1.start).toBeCalled(); + expect(anim2.start).not.toBeCalled(); + expect(cb).not.toBeCalled(); + + anim1.start.mock.calls[0][0]({finished: true}); + + expect(anim2.start).toBeCalled(); + expect(cb).not.toBeCalled(); + + anim2.start.mock.calls[0][0]({finished: true}); + expect(cb).toBeCalledWith({finished: true}); + }); + + it('supports interrupting sequence', () => { + var anim1 = {start: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + Animated.sequence([anim1, anim2]).start(cb); + + anim1.start.mock.calls[0][0]({finished: false}); + + expect(anim1.start).toBeCalled(); + expect(anim2.start).not.toBeCalled(); + expect(cb).toBeCalledWith({finished: false}); + }); + + it('supports stopping sequence', () => { + var anim1 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + var seq = Animated.sequence([anim1, anim2]); + seq.start(cb); + seq.stop(); + + expect(anim1.stop).toBeCalled(); + expect(anim2.stop).not.toBeCalled(); + expect(cb).not.toBeCalled(); + + anim1.start.mock.calls[0][0]({finished: false}); + + expect(cb).toBeCalledWith({finished: false}); + }); +}); + + +describe('Animated Parallel', () => { + + it('works with an empty parallel', () => { + var cb = jest.genMockFunction(); + Animated.parallel([]).start(cb); + expect(cb).toBeCalledWith({finished: true}); + }); + + it('works with an empty element in array', () => { + var anim1 = {start: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + Animated.parallel([null, anim1]).start(cb); + + expect(anim1.start).toBeCalled(); + anim1.start.mock.calls[0][0]({finished: true}); + + expect(cb).toBeCalledWith({finished: true}); + }); + + it('parellelizes well', () => { + var anim1 = {start: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + var par = Animated.parallel([anim1, anim2]); + + expect(anim1.start).not.toBeCalled(); + expect(anim2.start).not.toBeCalled(); + + par.start(cb); + + expect(anim1.start).toBeCalled(); + expect(anim2.start).toBeCalled(); + expect(cb).not.toBeCalled(); + + anim1.start.mock.calls[0][0]({finished: true}); + expect(cb).not.toBeCalled(); + + anim2.start.mock.calls[0][0]({finished: true}); + expect(cb).toBeCalledWith({finished: true}); + }); + + it('supports stopping parallel', () => { + var anim1 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + var seq = Animated.parallel([anim1, anim2]); + seq.start(cb); + seq.stop(); + + expect(anim1.stop).toBeCalled(); + expect(anim2.stop).toBeCalled(); + expect(cb).not.toBeCalled(); + + anim1.start.mock.calls[0][0]({finished: false}); + expect(cb).not.toBeCalled(); + + anim2.start.mock.calls[0][0]({finished: false}); + expect(cb).toBeCalledWith({finished: false}); + }); + + + it('does not call stop more than once when stopping', () => { + var anim1 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var anim2 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var anim3 = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + + var seq = Animated.parallel([anim1, anim2, anim3]); + seq.start(cb); + + anim1.start.mock.calls[0][0]({finished: false}); + + expect(anim1.stop.mock.calls.length).toBe(0); + expect(anim2.stop.mock.calls.length).toBe(1); + expect(anim3.stop.mock.calls.length).toBe(1); + + anim2.start.mock.calls[0][0]({finished: false}); + + expect(anim1.stop.mock.calls.length).toBe(0); + expect(anim2.stop.mock.calls.length).toBe(1); + expect(anim3.stop.mock.calls.length).toBe(1); + + anim3.start.mock.calls[0][0]({finished: false}); + + expect(anim1.stop.mock.calls.length).toBe(0); + expect(anim2.stop.mock.calls.length).toBe(1); + expect(anim3.stop.mock.calls.length).toBe(1); + }); +}); + +describe('Animated delays', () => { + it('should call anim after delay in sequence', () => { + var anim = {start: jest.genMockFunction(), stop: jest.genMockFunction()}; + var cb = jest.genMockFunction(); + Animated.sequence([ + Animated.delay(1000), + anim, + ]).start(cb); + jest.runAllTimers(); + expect(anim.start.mock.calls.length).toBe(1); + expect(cb).not.toBeCalled(); + anim.start.mock.calls[0][0]({finished: true}); + expect(cb).toBeCalledWith({finished: true}); + }); + it('should run stagger to end', () => { + var cb = jest.genMockFunction(); + Animated.stagger(1000, [ + Animated.delay(1000), + Animated.delay(1000), + Animated.delay(1000), + ]).start(cb); + jest.runAllTimers(); + expect(cb).toBeCalledWith({finished: true}); + }); +}); + +describe('Animated Events', () => { + it('should map events', () => { + var value = new Animated.Value(0); + var handler = Animated.event( + [null, {state: {foo: value}}], + ); + handler({bar: 'ignoreBar'}, {state: {baz: 'ignoreBaz', foo: 42}}); + expect(value.__getValue()).toBe(42); + }); + it('should call listeners', () => { + var value = new Animated.Value(0); + var listener = jest.genMockFunction(); + var handler = Animated.event( + [{foo: value}], + {listener}, + ); + handler({foo: 42}); + expect(value.__getValue()).toBe(42); + expect(listener.mock.calls.length).toBe(1); + expect(listener).toBeCalledWith({foo: 42}); + }); +}); + +describe('Animated Tracking', () => { + it('should track values', () => { + var value1 = new Animated.Value(0); + var value2 = new Animated.Value(0); + Animated.timing(value2, { + toValue: value1, + duration: 0, + }).start(); + value1.setValue(42); + expect(value2.__getValue()).toBe(42); + value1.setValue(7); + expect(value2.__getValue()).toBe(7); + }); + + it('should track interpolated values', () => { + var value1 = new Animated.Value(0); + var value2 = new Animated.Value(0); + Animated.timing(value2, { + toValue: value1.interpolate({ + inputRange: [0, 2], + outputRange: [0, 1] + }), + duration: 0, + }).start(); + value1.setValue(42); + expect(value2.__getValue()).toBe(42 / 2); + }); + + it('should stop tracking when animated', () => { + var value1 = new Animated.Value(0); + var value2 = new Animated.Value(0); + Animated.timing(value2, { + toValue: value1, + duration: 0, + }).start(); + value1.setValue(42); + expect(value2.__getValue()).toBe(42); + Animated.timing(value2, { + toValue: 7, + duration: 0, + }).start(); + value1.setValue(1492); + expect(value2.__getValue()).toBe(7); + }); +}); + +describe('Animated Vectors', () => { + it('should animate vectors', () => { + var vec = new Animated.ValueXY(); + + var callback = jest.genMockFunction(); + + var node = new Animated.__PropsOnlyForTests({ + style: { + opacity: vec.x.interpolate({ + inputRange: [0, 42], + outputRange: [0.2, 0.8], + }), + transform: vec.getTranslateTransform(), + ...vec.getLayout(), + } + }, callback); + + expect(node.__getValue()).toEqual({ + style: { + opacity: 0.2, + transform: [ + {translateX: 0}, + {translateY: 0}, + ], + left: 0, + top: 0, + }, + }); + + vec.setValue({x: 42, y: 1492}); + + expect(callback.mock.calls.length).toBe(2); // once each for x, y + + expect(node.__getValue()).toEqual({ + style: { + opacity: 0.8, + transform: [ + {translateX: 42}, + {translateY: 1492}, + ], + left: 42, + top: 1492, + }, + }); + + node.__detach(); + + vec.setValue({x: 1, y: 1}); + expect(callback.mock.calls.length).toBe(2); + }); + + it('should track vectors', () => { + var value1 = new Animated.ValueXY(); + var value2 = new Animated.ValueXY(); + Animated.timing(value2, { + toValue: value1, + duration: 0, + }).start(); + value1.setValue({x: 42, y: 1492}); + expect(value2.__getValue()).toEqual({x: 42, y: 1492}); + + // Make sure tracking keeps working (see stopTogether in ParallelConfig used + // by maybeVectorAnim). + value1.setValue({x: 3, y: 4}); + expect(value2.__getValue()).toEqual({x: 3, y: 4}); + }); + + it('should track with springs', () => { + var value1 = new Animated.ValueXY(); + var value2 = new Animated.ValueXY(); + Animated.spring(value2, { + toValue: value1, + tension: 3000, // faster spring for faster test + friction: 60, + }).start(); + value1.setValue({x: 1, y: 1}); + jest.runAllTimers(); + expect(Math.round(value2.__getValue().x)).toEqual(1); + expect(Math.round(value2.__getValue().y)).toEqual(1); + value1.setValue({x: 2, y: 2}); + jest.runAllTimers(); + expect(Math.round(value2.__getValue().x)).toEqual(2); + expect(Math.round(value2.__getValue().y)).toEqual(2); + }); +}); + +describe('Animated Listeners', () => { + it('should get updates', () => { + var value1 = new Animated.Value(0); + var listener = jest.genMockFunction(); + var id = value1.addListener(listener); + value1.setValue(42); + expect(listener.mock.calls.length).toBe(1); + expect(listener).toBeCalledWith({value: 42}); + expect(value1.__getValue()).toBe(42); + value1.setValue(7); + expect(listener.mock.calls.length).toBe(2); + expect(listener).toBeCalledWith({value: 7}); + expect(value1.__getValue()).toBe(7); + value1.removeListener(id); + value1.setValue(1492); + expect(listener.mock.calls.length).toBe(2); + expect(value1.__getValue()).toBe(1492); + }); + + it('should removeAll', () => { + var value1 = new Animated.Value(0); + var listener = jest.genMockFunction(); + [1,2,3,4].forEach(() => value1.addListener(listener)); + value1.setValue(42); + expect(listener.mock.calls.length).toBe(4); + expect(listener).toBeCalledWith({value: 42}); + value1.removeAllListeners(); + value1.setValue(7); + expect(listener.mock.calls.length).toBe(4); + }); +}); diff --git a/ios/Pods/React/Libraries/Animated/__tests__/Easing-test.js b/ios/Pods/React/Libraries/Animated/__tests__/Easing-test.js new file mode 100644 index 00000000..bee894d6 --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/__tests__/Easing-test.js @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +jest.dontMock('Easing'); + +var Easing = require('Easing'); +describe('Easing', () => { + it('should work with linear', () => { + var easing = Easing.linear; + + expect(easing(0)).toBe(0); + expect(easing(0.5)).toBe(0.5); + expect(easing(0.8)).toBe(0.8); + expect(easing(1)).toBe(1); + }); + + it('should work with ease in linear', () => { + var easing = Easing.in(Easing.linear); + expect(easing(0)).toBe(0); + expect(easing(0.5)).toBe(0.5); + expect(easing(0.8)).toBe(0.8); + expect(easing(1)).toBe(1); + }); + + it('should work with easy out linear', () => { + var easing = Easing.out(Easing.linear); + expect(easing(0)).toBe(0); + expect(easing(0.5)).toBe(0.5); + expect(easing(0.6)).toBe(0.6); + expect(easing(1)).toBe(1); + }); + + it('should work with ease in quad', () => { + function easeInQuad(t) { + return t * t; + } + var easing = Easing.in(Easing.quad); + for (var t = -0.5; t < 1.5; t += 0.1) { + expect(easing(t)).toBe(easeInQuad(t)); + } + }); + + it('should work with ease out quad', () => { + function easeOutQuad(t) { + return -t * (t - 2); + } + var easing = Easing.out(Easing.quad); + for (var t = 0; t <= 1; t += 0.1) { + expect(easing(1)).toBe(easeOutQuad(1)); + } + }); + + it('should work with ease in-out quad', () => { + function easeInOutQuad(t) { + t = t * 2; + if (t < 1) { + return 0.5 * t * t; + } + return -((t - 1) * (t - 3) - 1) / 2; + } + var easing = Easing.inOut(Easing.quad); + for (var t = -0.5; t < 1.5; t += 0.1) { + expect(easing(t)).toBeCloseTo(easeInOutQuad(t), 4); + } + }); + + function sampleEasingFunction(easing) { + var DURATION = 300; + var tickCount = Math.round(DURATION * 60 / 1000); + var samples = []; + for (var i = 0; i <= tickCount; i++) { + samples.push(easing(i / tickCount)); + } + return samples; + } + + var Samples = { + in_quad: [0,0.0030864197530864196,0.012345679012345678,0.027777777777777776,0.04938271604938271,0.0771604938271605,0.1111111111111111,0.15123456790123457,0.19753086419753085,0.25,0.308641975308642,0.37345679012345684,0.4444444444444444,0.5216049382716049,0.6049382716049383,0.6944444444444445,0.7901234567901234,0.8919753086419753,1], + out_quad: [0,0.10802469135802469,0.20987654320987653,0.3055555555555555,0.3950617283950617,0.47839506172839513,0.5555555555555556,0.6265432098765432,0.691358024691358,0.75,0.8024691358024691,0.8487654320987654,0.888888888888889,0.9228395061728394,0.9506172839506174,0.9722222222222221,0.9876543209876543,0.9969135802469136,1], + inOut_quad: [0,0.006172839506172839,0.024691358024691357,0.05555555555555555,0.09876543209876543,0.154320987654321,0.2222222222222222,0.30246913580246915,0.3950617283950617,0.5,0.6049382716049383,0.697530864197531,0.7777777777777777,0.845679012345679,0.9012345679012346,0.9444444444444444,0.9753086419753086,0.9938271604938271,1], + in_cubic: [0,0.00017146776406035664,0.0013717421124828531,0.004629629629629629,0.010973936899862825,0.021433470507544586,0.037037037037037035,0.05881344307270234,0.0877914951989026,0.125,0.1714677640603567,0.22822359396433475,0.2962962962962963,0.37671467764060357,0.4705075445816187,0.5787037037037038,0.7023319615912208,0.8424211248285322,1], + out_cubic: [0,0.15757887517146785,0.2976680384087792,0.42129629629629617,0.5294924554183813,0.6232853223593964,0.7037037037037036,0.7717764060356652,0.8285322359396433,0.875,0.9122085048010974,0.9411865569272977,0.9629629629629629,0.9785665294924554,0.9890260631001372,0.9953703703703703,0.9986282578875172,0.9998285322359396,1], + inOut_cubic: [0,0.0006858710562414266,0.0054869684499314125,0.018518518518518517,0.0438957475994513,0.08573388203017834,0.14814814814814814,0.23525377229080935,0.3511659807956104,0.5,0.6488340192043895,0.7647462277091908,0.8518518518518519,0.9142661179698217,0.9561042524005487,0.9814814814814815,0.9945130315500685,0.9993141289437586,1], + in_sin: [0,0.003805301908254455,0.01519224698779198,0.03407417371093169,0.06030737921409157,0.09369221296335006,0.1339745962155613,0.1808479557110082,0.233955556881022,0.2928932188134524,0.35721239031346064,0.42642356364895384,0.4999999999999999,0.5773817382593005,0.6579798566743311,0.7411809548974793,0.8263518223330696,0.9128442572523416,0.9999999999999999], + out_sin: [0,0.08715574274765817,0.17364817766693033,0.25881904510252074,0.3420201433256687,0.42261826174069944,0.49999999999999994,0.573576436351046,0.6427876096865393,0.7071067811865475,0.766044443118978,0.8191520442889918,0.8660254037844386,0.9063077870366499,0.9396926207859083,0.9659258262890683,0.984807753012208,0.9961946980917455,1], + inOut_sin: [0,0.00759612349389599,0.030153689607045786,0.06698729810778065,0.116977778440511,0.17860619515673032,0.24999999999999994,0.32898992833716556,0.4131759111665348,0.49999999999999994,0.5868240888334652,0.6710100716628343,0.7499999999999999,0.8213938048432696,0.883022221559489,0.9330127018922194,0.9698463103929542,0.9924038765061041,1], + in_exp: [0,0.0014352875901128893,0.002109491677524035,0.0031003926796253885,0.004556754060844206,0.006697218616039631,0.009843133202303688,0.014466792379488908,0.021262343752724643,0.03125,0.045929202883612456,0.06750373368076916,0.09921256574801243,0.1458161299470146,0.2143109957132682,0.31498026247371835,0.46293735614364506,0.6803950000871883,1], + out_exp: [0,0.31960499991281155,0.5370626438563548,0.6850197375262816,0.7856890042867318,0.8541838700529854,0.9007874342519875,0.9324962663192309,0.9540707971163875,0.96875,0.9787376562472754,0.9855332076205111,0.9901568667976963,0.9933027813839603,0.9954432459391558,0.9968996073203746,0.9978905083224759,0.9985647124098871,1], + inOut_exp: [0,0.0010547458387620175,0.002278377030422103,0.004921566601151844,0.010631171876362321,0.022964601441806228,0.049606282874006216,0.1071554978566341,0.23146867807182253,0.5,0.7685313219281775,0.892844502143366,0.9503937171259937,0.9770353985581938,0.9893688281236377,0.9950784333988482,0.9977216229695779,0.998945254161238,1], + in_circle: [0,0.0015444024660317135,0.006192010000093506,0.013986702816730645,0.025003956956430873,0.03935464078941209,0.057190958417936644,0.07871533601238889,0.10419358352238339,0.1339745962155614,0.1685205807169019,0.20845517506805522,0.2546440075000701,0.3083389112228482,0.37146063894529113,0.4472292016074334,0.5418771527091488,0.6713289009389102,1], + out_circle: [0,0.3286710990610898,0.45812284729085123,0.5527707983925666,0.6285393610547089,0.6916610887771518,0.7453559924999298,0.7915448249319448,0.8314794192830981,0.8660254037844386,0.8958064164776166,0.9212846639876111,0.9428090415820634,0.9606453592105879,0.9749960430435691,0.9860132971832694,0.9938079899999065,0.9984555975339683,1], + inOut_circle: [0,0.003096005000046753,0.012501978478215436,0.028595479208968322,0.052096791761191696,0.08426029035845095,0.12732200375003505,0.18573031947264557,0.2709385763545744,0.5,0.7290614236454256,0.8142696805273546,0.8726779962499649,0.915739709641549,0.9479032082388084,0.9714045207910317,0.9874980215217846,0.9969039949999532,1], + in_back_: [0,-0.004788556241426612,-0.017301289437585736,-0.0347587962962963,-0.05438167352537723,-0.07339051783264748,-0.08900592592592595,-0.09844849451303156,-0.0989388203017833,-0.08769750000000004,-0.06194513031550073,-0.018902307956104283,0.044210370370370254,0.13017230795610413,0.2417629080932785,0.3817615740740742,0.5529477091906719,0.7581007167352535,0.9999999999999998], + out_back_: [2.220446049250313e-16,0.24189928326474652,0.44705229080932807,0.6182384259259258,0.7582370919067215,0.8698276920438959,0.9557896296296297,1.0189023079561044,1.0619451303155008,1.0876975,1.0989388203017834,1.0984484945130315,1.089005925925926,1.0733905178326475,1.0543816735253773,1.0347587962962963,1.0173012894375857,1.0047885562414267,1], + }; + + Object.keys(Samples).forEach(function(type) { + it('should ease ' + type, function() { + var [modeName, easingName, isFunction] = type.split('_'); + var easing = Easing[easingName]; + if (isFunction !== undefined) { + easing = easing(); + } + var computed = sampleEasingFunction(Easing[modeName](easing)); + var samples = Samples[type]; + + computed.forEach((value, key) => { + expect(value).toBeCloseTo(samples[key], 2); + }); + }); + }); +}); diff --git a/ios/Pods/React/Libraries/Animated/__tests__/Interpolation-test.js b/ios/Pods/React/Libraries/Animated/__tests__/Interpolation-test.js new file mode 100644 index 00000000..aec20ba2 --- /dev/null +++ b/ios/Pods/React/Libraries/Animated/__tests__/Interpolation-test.js @@ -0,0 +1,256 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +jest + .dontMock('Interpolation') + .dontMock('Easing'); + +var Interpolation = require('Interpolation'); +var Easing = require('Easing'); + +describe('Interpolation', () => { + it('should work with defaults', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + }); + + expect(interpolation(0)).toBe(0); + expect(interpolation(0.5)).toBe(0.5); + expect(interpolation(0.8)).toBe(0.8); + expect(interpolation(1)).toBe(1); + }); + + it('should work with output range', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [100, 200], + }); + + expect(interpolation(0)).toBe(100); + expect(interpolation(0.5)).toBe(150); + expect(interpolation(0.8)).toBe(180); + expect(interpolation(1)).toBe(200); + }); + + it('should work with input range', () => { + var interpolation = Interpolation.create({ + inputRange: [100, 200], + outputRange: [0, 1], + }); + + expect(interpolation(100)).toBe(0); + expect(interpolation(150)).toBe(0.5); + expect(interpolation(180)).toBe(0.8); + expect(interpolation(200)).toBe(1); + }); + + it('should throw for non monotonic input ranges', () => { + expect(() => Interpolation.create({ + inputRange: [0, 2, 1], + outputRange: [0, 1, 2], + })).toThrow(); + + expect(() => Interpolation.create({ + inputRange: [0, 1, 2], + outputRange: [0, 3, 1], + })).not.toThrow(); + }); + + it('should work with empty input range', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 10, 10], + outputRange: [1, 2, 3], + extrapolate: 'extend', + }); + + expect(interpolation(0)).toBe(1); + expect(interpolation(5)).toBe(1.5); + expect(interpolation(10)).toBe(2); + expect(interpolation(10.1)).toBe(3); + expect(interpolation(15)).toBe(3); + }); + + it('should work with empty output range', () => { + var interpolation = Interpolation.create({ + inputRange: [1, 2, 3], + outputRange: [0, 10, 10], + extrapolate: 'extend', + }); + + expect(interpolation(0)).toBe(-10); + expect(interpolation(1.5)).toBe(5); + expect(interpolation(2)).toBe(10); + expect(interpolation(2.5)).toBe(10); + expect(interpolation(3)).toBe(10); + expect(interpolation(4)).toBe(10); + }); + + it('should work with easing', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + easing: Easing.quad, + }); + + expect(interpolation(0)).toBe(0); + expect(interpolation(0.5)).toBe(0.25); + expect(interpolation(0.9)).toBe(0.81); + expect(interpolation(1)).toBe(1); + }); + + it('should work with extrapolate', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + extrapolate: 'extend', + easing: Easing.quad, + }); + + expect(interpolation(-2)).toBe(4); + expect(interpolation(2)).toBe(4); + + interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + extrapolate: 'clamp', + easing: Easing.quad, + }); + + expect(interpolation(-2)).toBe(0); + expect(interpolation(2)).toBe(1); + + interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + extrapolate: 'identity', + easing: Easing.quad, + }); + + expect(interpolation(-2)).toBe(-2); + expect(interpolation(2)).toBe(2); + }); + + it('should work with keyframes with extrapolate', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 10, 100, 1000], + outputRange: [0, 5, 50, 500], + extrapolate: true, + }); + + expect(interpolation(-5)).toBe(-2.5); + expect(interpolation(0)).toBe(0); + expect(interpolation(5)).toBe(2.5); + expect(interpolation(10)).toBe(5); + expect(interpolation(50)).toBe(25); + expect(interpolation(100)).toBe(50); + expect(interpolation(500)).toBe(250); + expect(interpolation(1000)).toBe(500); + expect(interpolation(2000)).toBe(1000); + }); + + it('should work with keyframes without extrapolate', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1, 2], + outputRange: [0.2, 1, 0.2], + extrapolate: 'clamp', + }); + + expect(interpolation(5)).toBeCloseTo(0.2); + }); + + it('should throw for an infinite input range', () => { + expect(() => Interpolation.create({ + inputRange: [-Infinity, Infinity], + outputRange: [0, 1], + })).toThrow(); + + expect(() => Interpolation.create({ + inputRange: [-Infinity, 0, Infinity], + outputRange: [1, 2, 3], + })).not.toThrow(); + }); + + it('should work with negative infinite', () => { + var interpolation = Interpolation.create({ + inputRange: [-Infinity, 0], + outputRange: [-Infinity, 0], + easing: Easing.quad, + extrapolate: 'identity', + }); + + expect(interpolation(-Infinity)).toBe(-Infinity); + expect(interpolation(-100)).toBeCloseTo(-10000); + expect(interpolation(-10)).toBeCloseTo(-100); + expect(interpolation(0)).toBeCloseTo(0); + expect(interpolation(1)).toBeCloseTo(1); + expect(interpolation(100)).toBeCloseTo(100); + }); + + it('should work with positive infinite', () => { + var interpolation = Interpolation.create({ + inputRange: [5, Infinity], + outputRange: [5, Infinity], + easing: Easing.quad, + extrapolate: 'identity', + }); + + expect(interpolation(-100)).toBeCloseTo(-100); + expect(interpolation(-10)).toBeCloseTo(-10); + expect(interpolation(0)).toBeCloseTo(0); + expect(interpolation(5)).toBeCloseTo(5); + expect(interpolation(6)).toBeCloseTo(5 + 1); + expect(interpolation(10)).toBeCloseTo(5 + 25); + expect(interpolation(100)).toBeCloseTo(5 + (95 * 95)); + expect(interpolation(Infinity)).toBe(Infinity); + }); + + it('should work with output ranges as string', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: ['rgba(0, 100, 200, 0)', 'rgba(50, 150, 250, 0.5)'], + }); + + expect(interpolation(0)).toBe('rgba(0, 100, 200, 0)'); + expect(interpolation(0.5)).toBe('rgba(25, 125, 225, 0.25)'); + expect(interpolation(1)).toBe('rgba(50, 150, 250, 0.5)'); + }); + + it('should work with negative and decimal values in string ranges', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: ['-100.5deg', '100deg'], + }); + + expect(interpolation(0)).toBe('-100.5deg'); + expect(interpolation(0.5)).toBe('-0.25deg'); + expect(interpolation(1)).toBe('100deg'); + }); + + it('should crash when chaining an interpolation that returns a string', () => { + var interpolation = Interpolation.create({ + inputRange: [0, 1], + outputRange: [0, 1], + }); + expect(() => { interpolation('45rad'); }).toThrow(); + }); + + it('should crash when defining output range with different pattern', () => { + expect(() => Interpolation.create({ + inputRange: [0, 1], + outputRange: ['rgba(0, 100, 200, 0)', 'rgb(50, 150, 250)'], + })).toThrow(); + + expect(() => Interpolation.create({ + inputRange: [0, 1], + outputRange: ['20deg', '30rad'], + })).toThrow(); + }); +}); diff --git a/ios/Pods/React/Libraries/Animation/bezier.js b/ios/Pods/React/Libraries/Animation/bezier.js new file mode 100644 index 00000000..11b02f50 --- /dev/null +++ b/ios/Pods/React/Libraries/Animation/bezier.js @@ -0,0 +1,80 @@ +/** + * https://github.com/arian/cubic-bezier + * + * MIT License + * + * Copyright (c) 2013 Arian Stolwijk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @providesModule bezier + * @nolint + */ + +module.exports = function(x1, y1, x2, y2, epsilon){ + + var curveX = function(t){ + var v = 1 - t; + return 3 * v * v * t * x1 + 3 * v * t * t * x2 + t * t * t; + }; + + var curveY = function(t){ + var v = 1 - t; + return 3 * v * v * t * y1 + 3 * v * t * t * y2 + t * t * t; + }; + + var derivativeCurveX = function(t){ + var v = 1 - t; + return 3 * (2 * (t - 1) * t + v * v) * x1 + 3 * (- t * t * t + 2 * v * t) * x2; + }; + + return function(t){ + + var x = t, t0, t1, t2, x2, d2, i; + + // First try a few iterations of Newton's method -- normally very fast. + for (t2 = x, i = 0; i < 8; i++){ + x2 = curveX(t2) - x; + if (Math.abs(x2) < epsilon) return curveY(t2); + d2 = derivativeCurveX(t2); + if (Math.abs(d2) < 1e-6) break; + t2 = t2 - x2 / d2; + } + + t0 = 0, t1 = 1, t2 = x; + + if (t2 < t0) return curveY(t0); + if (t2 > t1) return curveY(t1); + + // Fallback to the bisection method for reliability. + while (t0 < t1){ + x2 = curveX(t2); + if (Math.abs(x2 - x) < epsilon) return curveY(t2); + if (x > x2) t0 = t2; + else t1 = t2; + t2 = (t1 - t0) * .5 + t0; + } + + // Failure + return curveY(t2); + + }; + +}; diff --git a/ios/Pods/React/Libraries/AppRegistry/AppRegistry.js b/ios/Pods/React/Libraries/AppRegistry/AppRegistry.js new file mode 100644 index 00000000..3cf7f3ab --- /dev/null +++ b/ios/Pods/React/Libraries/AppRegistry/AppRegistry.js @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AppRegistry + * @flow + */ +'use strict'; + +var invariant = require('invariant'); +var renderApplication = require('renderApplication'); + +if (__DEV__) { + // In order to use Cmd+P to record/dump perf data, we need to make sure + // this module is available in the bundle + require('RCTRenderingPerf'); +} + +var runnables = {}; + +type ComponentProvider = () => ReactClass; + +type AppConfig = { + appKey: string; + component?: ComponentProvider; + run?: Function; +}; + +/** + * `AppRegistry` is the JS entry point to running all React Native apps. App + * root components should register themselves with + * `AppRegistry.registerComponent`, then the native system can load the bundle + * for the app and then actually run the app when it's ready by invoking + * `AppRegistry.runApplication`. + * + * `AppRegistry` should be `require`d early in the `require` sequence to make + * sure the JS execution environment is setup before other modules are + * `require`d. + */ +var AppRegistry = { + registerConfig: function(config: Array) { + for (var i = 0; i < config.length; ++i) { + var appConfig = config[i]; + if (appConfig.run) { + AppRegistry.registerRunnable(appConfig.appKey, appConfig.run); + } else { + invariant(appConfig.component, 'No component provider passed in'); + AppRegistry.registerComponent(appConfig.appKey, appConfig.component); + } + } + }, + + registerComponent: function(appKey: string, getComponentFunc: ComponentProvider): string { + runnables[appKey] = { + run: (appParameters) => + renderApplication(getComponentFunc(), appParameters.initialProps, appParameters.rootTag) + }; + return appKey; + }, + + registerRunnable: function(appKey: string, func: Function): string { + runnables[appKey] = {run: func}; + return appKey; + }, + + getAppKeys: function(): Array { + return Object.keys(runnables); + }, + + runApplication: function(appKey: string, appParameters: any): void { + console.log( + 'Running application "' + appKey + '" with appParams: ' + + JSON.stringify(appParameters) + '. ' + + '__DEV__ === ' + String(__DEV__) + + ', development-level warning are ' + (__DEV__ ? 'ON' : 'OFF') + + ', performance optimizations are ' + (__DEV__ ? 'OFF' : 'ON') + ); + invariant( + runnables[appKey] && runnables[appKey].run, + 'Application ' + appKey + ' has not been registered. This ' + + 'is either due to a require() error during initialization ' + + 'or failure to call AppRegistry.registerComponent.' + ); + runnables[appKey].run(appParameters); + }, +}; + +module.exports = AppRegistry; diff --git a/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.android.js b/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.android.js new file mode 100644 index 00000000..b8c3e8de --- /dev/null +++ b/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.android.js @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AppStateIOS + * @flow + */ +'use strict'; + +var warning = require('warning'); + +class AppStateIOS { + + static addEventListener(type, handler) { + warning('Cannot listen to AppStateIOS events on Android.'); + } + + static removeEventListener(type, handler) { + warning('Cannot remove AppStateIOS listener on Android.'); + } + +} + +AppStateIOS.currentState = null; + +module.exports = AppStateIOS; diff --git a/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.ios.js b/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.ios.js new file mode 100644 index 00000000..1d64c7d6 --- /dev/null +++ b/ios/Pods/React/Libraries/AppStateIOS/AppStateIOS.ios.js @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AppStateIOS + * @flow + */ +'use strict'; + +var Map = require('Map'); +var NativeModules = require('NativeModules'); +var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); +var RCTAppState = NativeModules.AppState; + +var logError = require('logError'); +var invariant = require('invariant'); + +var _eventHandlers = { + change: new Map(), + memoryWarning: new Map(), +}; + +/** + * `AppStateIOS` can tell you if the app is in the foreground or background, + * and notify you when the state changes. + * + * AppStateIOS is frequently used to determine the intent and proper behavior when + * handling push notifications. + * + * ### iOS App States + * + * - `active` - The app is running in the foreground + * - `background` - The app is running in the background. The user is either + * in another app or on the home screen + * - `inactive` - This is a transition state that currently never happens for + * typical React Native apps. + * + * For more information, see + * [Apple's documentation](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html) + * + * ### Basic Usage + * + * To see the current state, you can check `AppStateIOS.currentState`, which + * will be kept up-to-date. However, `currentState` will be null at launch + * while `AppStateIOS` retrieves it over the bridge. + * + * ``` + * getInitialState: function() { + * return { + * currentAppState: AppStateIOS.currentState, + * }; + * }, + * componentDidMount: function() { + * AppStateIOS.addEventListener('change', this._handleAppStateChange); + * }, + * componentWillUnmount: function() { + * AppStateIOS.removeEventListener('change', this._handleAppStateChange); + * }, + * _handleAppStateChange: function(currentAppState) { + * this.setState({ currentAppState, }); + * }, + * render: function() { + * return ( + * Current state is: {this.state.currentAppState} + * ); + * }, + * ``` + * + * This example will only ever appear to say "Current state is: active" because + * the app is only visible to the user when in the `active` state, and the null + * state will happen only momentarily. + */ + +var AppStateIOS = { + + /** + * Add a handler to AppState changes by listening to the `change` event type + * and providing the handler + */ + addEventListener: function( + type: string, + handler: Function + ) { + invariant( + ['change', 'memoryWarning'].indexOf(type) !== -1, + 'Trying to subscribe to unknown event: "%s"', type + ); + if (type === 'change') { + _eventHandlers[type].set(handler, RCTDeviceEventEmitter.addListener( + 'appStateDidChange', + (appStateData) => { + handler(appStateData.app_state); + } + )); + } else if (type === 'memoryWarning') { + _eventHandlers[type].set(handler, RCTDeviceEventEmitter.addListener( + 'memoryWarning', + handler + )); + } + }, + + /** + * Remove a handler by passing the `change` event type and the handler + */ + removeEventListener: function( + type: string, + handler: Function + ) { + invariant( + ['change', 'memoryWarning'].indexOf(type) !== -1, + 'Trying to remove listener for unknown event: "%s"', type + ); + if (!_eventHandlers[type].has(handler)) { + return; + } + _eventHandlers[type].get(handler).remove(); + _eventHandlers[type].delete(handler); + }, + + currentState: (RCTAppState && RCTAppState.initialAppState : ?string), + +}; + +RCTDeviceEventEmitter.addListener( + 'appStateDidChange', + (appStateData) => { + AppStateIOS.currentState = appStateData.app_state; + } +); + +RCTAppState.getCurrentAppState( + (appStateData) => { + AppStateIOS.currentState = appStateData.app_state; + }, + logError +); + +module.exports = AppStateIOS; diff --git a/ios/Pods/React/Libraries/BatchedBridge/BatchedBridge.js b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridge.js new file mode 100644 index 00000000..ea49b202 --- /dev/null +++ b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridge.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BatchedBridge + */ +'use strict'; + +let MessageQueue = require('MessageQueue'); + +let BatchedBridge = new MessageQueue( + __fbBatchedBridgeConfig.remoteModuleConfig, + __fbBatchedBridgeConfig.localModulesConfig, +); + +module.exports = BatchedBridge; diff --git a/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/NativeModules.js b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/NativeModules.js new file mode 100644 index 00000000..e3a17988 --- /dev/null +++ b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/NativeModules.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule NativeModules + * @flow + */ +'use strict'; + +var NativeModules = require('BatchedBridge').RemoteModules; + +var nativeModulePrefixNormalizer = require('nativeModulePrefixNormalizer'); + +nativeModulePrefixNormalizer(NativeModules); + +module.exports = NativeModules; diff --git a/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTAlertManager.ios.js b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTAlertManager.ios.js new file mode 100644 index 00000000..409ecf5c --- /dev/null +++ b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTAlertManager.ios.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule RCTAlertManager + * @flow + */ +'use strict'; + +var RCTAlertManager = require('NativeModules').AlertManager; + +module.exports = RCTAlertManager; diff --git a/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTEventEmitter.js b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTEventEmitter.js new file mode 100644 index 00000000..8c66aac9 --- /dev/null +++ b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/RCTEventEmitter.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule RCTEventEmitter + * @flow + */ +'use strict'; + +var ReactNativeEventEmitter = require('ReactNativeEventEmitter'); + +// Completely locally implemented - no native hooks. +module.exports = ReactNativeEventEmitter; diff --git a/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/__mocks__/NativeModules.js b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/__mocks__/NativeModules.js new file mode 100644 index 00000000..266a50d3 --- /dev/null +++ b/ios/Pods/React/Libraries/BatchedBridge/BatchedBridgedModules/__mocks__/NativeModules.js @@ -0,0 +1,49 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + */ +'use strict'; + +var NativeModules = { + I18n: { + translationsDictionary: JSON.stringify({ + 'Good bye, {name}!|Bye message': '¡Adiós {name}!', + }), + }, + Timing: { + createTimer: jest.genMockFunction(), + deleteTimer: jest.genMockFunction(), + }, + GraphPhotoUpload: { + upload: jest.genMockFunction(), + }, + FacebookSDK: { + login: jest.genMockFunction(), + logout: jest.genMockFunction(), + queryGraphPath: jest.genMockFunction().mockImpl( + (path, method, params, callback) => callback() + ), + }, + DataManager: { + queryData: jest.genMockFunction(), + }, + UIManager: { + customBubblingEventTypes: {}, + customDirectEventTypes: {}, + Dimensions: {}, + }, + AsyncLocalStorage: { + getItem: jest.genMockFunction(), + setItem: jest.genMockFunction(), + removeItem: jest.genMockFunction(), + clear: jest.genMockFunction(), + }, + SourceCode: { + scriptURL: null, + }, + BuildInfo: { + appVersion: '0', + buildVersion: '0', + }, +}; + +module.exports = NativeModules; diff --git a/ios/Pods/React/Libraries/CameraRoll/CameraRoll.js b/ios/Pods/React/Libraries/CameraRoll/CameraRoll.js new file mode 100644 index 00000000..a710e7ec --- /dev/null +++ b/ios/Pods/React/Libraries/CameraRoll/CameraRoll.js @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CameraRoll + * @flow + */ +'use strict'; + +var ReactPropTypes = require('ReactPropTypes'); +var RCTCameraRollManager = require('NativeModules').CameraRollManager; + +var createStrictShapeTypeChecker = require('createStrictShapeTypeChecker'); +var deepFreezeAndThrowOnMutationInDev = + require('deepFreezeAndThrowOnMutationInDev'); +var invariant = require('invariant'); + +var GROUP_TYPES_OPTIONS = [ + 'Album', + 'All', + 'Event', + 'Faces', + 'Library', + 'PhotoStream', + 'SavedPhotos', // default +]; + +var ASSET_TYPE_OPTIONS = [ + 'All', + 'Videos', + 'Photos', // default +]; + + +// Flow treats Object and Array as disjoint types, currently. +deepFreezeAndThrowOnMutationInDev((GROUP_TYPES_OPTIONS: any)); +deepFreezeAndThrowOnMutationInDev((ASSET_TYPE_OPTIONS: any)); + +/** + * Shape of the param arg for the `getPhotos` function. + */ +var getPhotosParamChecker = createStrictShapeTypeChecker({ + /** + * The number of photos wanted in reverse order of the photo application + * (i.e. most recent first for SavedPhotos). + */ + first: ReactPropTypes.number.isRequired, + + /** + * A cursor that matches `page_info { end_cursor }` returned from a previous + * call to `getPhotos` + */ + after: ReactPropTypes.string, + + /** + * Specifies which group types to filter the results to. + */ + groupTypes: ReactPropTypes.oneOf(GROUP_TYPES_OPTIONS), + + /** + * Specifies filter on group names, like 'Recent Photos' or custom album + * titles. + */ + groupName: ReactPropTypes.string, + + /** + * Specifies filter on asset type + */ + assetType: ReactPropTypes.oneOf(ASSET_TYPE_OPTIONS), + + /** + * Filter by mimetype (e.g. image/jpeg). + */ + mimeTypes: ReactPropTypes.arrayOf(ReactPropTypes.string), +}); + +/** + * Shape of the return value of the `getPhotos` function. + */ +var getPhotosReturnChecker = createStrictShapeTypeChecker({ + edges: ReactPropTypes.arrayOf(createStrictShapeTypeChecker({ + node: createStrictShapeTypeChecker({ + type: ReactPropTypes.string.isRequired, + group_name: ReactPropTypes.string.isRequired, + image: createStrictShapeTypeChecker({ + uri: ReactPropTypes.string.isRequired, + height: ReactPropTypes.number.isRequired, + width: ReactPropTypes.number.isRequired, + isStored: ReactPropTypes.bool, + }).isRequired, + timestamp: ReactPropTypes.number.isRequired, + location: createStrictShapeTypeChecker({ + latitude: ReactPropTypes.number, + longitude: ReactPropTypes.number, + altitude: ReactPropTypes.number, + heading: ReactPropTypes.number, + speed: ReactPropTypes.number, + }), + }).isRequired, + })).isRequired, + page_info: createStrictShapeTypeChecker({ + has_next_page: ReactPropTypes.bool.isRequired, + start_cursor: ReactPropTypes.string, + end_cursor: ReactPropTypes.string, + }).isRequired, +}); + +/** + * `CameraRoll` provides access to the local camera roll / gallery. + */ +class CameraRoll { + + static GroupTypesOptions: Array; + static AssetTypeOptions: Array; + /** + * Saves the image to the camera roll / gallery. + * + * @param {string} tag On Android, this is a local URI, such + * as `"file:///sdcard/img.png"`. + * + * On iOS, the tag can be one of the following: + * + * - local URI + * - assets-library tag + * - a tag not maching any of the above, which means the image data will + * be stored in memory (and consume memory as long as the process is alive) + * + * @param successCallback Invoked with the value of `tag` on success. + * @param errorCallback Invoked with error message on error. + */ + static saveImageWithTag(tag, successCallback, errorCallback) { + invariant( + typeof tag === 'string', + 'CameraRoll.saveImageWithTag tag must be a valid string.' + ); + RCTCameraRollManager.saveImageWithTag( + tag, + (imageTag) => { + successCallback && successCallback(imageTag); + }, + (errorMessage) => { + errorCallback && errorCallback(errorMessage); + }); + } + + /** + * Invokes `callback` with photo identifier objects from the local camera + * roll of the device matching shape defined by `getPhotosReturnChecker`. + * + * @param {object} params See `getPhotosParamChecker`. + * @param {function} callback Invoked with arg of shape defined by + * `getPhotosReturnChecker` on success. + * @param {function} errorCallback Invoked with error message on error. + */ + static getPhotos(params, callback, errorCallback) { + var metaCallback = callback; + if (__DEV__) { + getPhotosParamChecker({params}, 'params', 'CameraRoll.getPhotos'); + invariant( + typeof callback === 'function', + 'CameraRoll.getPhotos callback must be a valid function.' + ); + invariant( + typeof errorCallback === 'function', + 'CameraRoll.getPhotos errorCallback must be a valid function.' + ); + } + if (__DEV__) { + metaCallback = (response) => { + getPhotosReturnChecker( + {response}, + 'response', + 'CameraRoll.getPhotos callback' + ); + callback(response); + }; + } + RCTCameraRollManager.getPhotos(params, metaCallback, errorCallback); + } +} + +CameraRoll.GroupTypesOptions = GROUP_TYPES_OPTIONS; +CameraRoll.AssetTypeOptions = ASSET_TYPE_OPTIONS; + +module.exports = CameraRoll; diff --git a/ios/Pods/React/Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js b/ios/Pods/React/Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js new file mode 100644 index 00000000..7e0ea693 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ActivityIndicatorIOS + * @flow + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); + +var GRAY = '#999999'; + +type DefaultProps = { + animating: boolean; + color: string; + hidesWhenStopped: boolean; + size: 'small' | 'large'; +}; + +var ActivityIndicatorIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * Whether to show the indicator (true, the default) or hide it (false). + */ + animating: PropTypes.bool, + /** + * The foreground color of the spinner (default is gray). + */ + color: PropTypes.string, + /** + * Whether the indicator should hide when not animating (true by default). + */ + hidesWhenStopped: PropTypes.bool, + /** + * Size of the indicator. Small has a height of 20, large has a height of 36. + */ + size: PropTypes.oneOf([ + 'small', + 'large', + ]), + /** + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. + */ + onLayout: PropTypes.func, + }, + + getDefaultProps: function(): DefaultProps { + return { + animating: true, + color: GRAY, + hidesWhenStopped: true, + size: 'small', + }; + }, + + render: function() { + var {onLayout, style, ...props} = this.props; + var sizeStyle = (this.props.size === 'large') ? styles.sizeLarge : styles.sizeSmall; + return ( + + + + ); + } +}); + +var styles = StyleSheet.create({ + container: { + alignItems: 'center', + justifyContent: 'center', + }, + sizeSmall: { + width: 20, + height: 20, + }, + sizeLarge: { + width: 36, + height: 36, + } +}); + +var RCTActivityIndicatorView = requireNativeComponent( + 'RCTActivityIndicatorView', + ActivityIndicatorIOS, + {nativeOnly: {activityIndicatorViewStyle: true}}, +); + +module.exports = ActivityIndicatorIOS; diff --git a/ios/Pods/React/Libraries/Components/DatePicker/DatePickerIOS.ios.js b/ios/Pods/React/Libraries/Components/DatePicker/DatePickerIOS.ios.js new file mode 100644 index 00000000..f184c6f7 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/DatePicker/DatePickerIOS.ios.js @@ -0,0 +1,150 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DatePickerIOS + * @flow + * + * This is a controlled component version of RCTDatePickerIOS + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var RCTDatePickerIOSConsts = require('NativeModules').UIManager.RCTDatePicker.Constants; +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); + +var DATEPICKER = 'datepicker'; + +type DefaultProps = { + mode: 'date' | 'time' | 'datetime'; +}; + +type Event = Object; + +/** + * Use `DatePickerIOS` to render a date/time picker (selector) on iOS. This is + * a controlled component, so you must hook in to the `onDateChange` callback + * and update the `date` prop in order for the component to update, otherwise + * the user's change will be reverted immediately to reflect `props.date` as the + * source of truth. + */ +var DatePickerIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * The currently selected date. + */ + date: PropTypes.instanceOf(Date).isRequired, + + /** + * Date change handler. + * + * This is called when the user changes the date or time in the UI. + * The first and only argument is a Date object representing the new + * date and time. + */ + onDateChange: PropTypes.func.isRequired, + + /** + * Maximum date. + * + * Restricts the range of possible date/time values. + */ + maximumDate: PropTypes.instanceOf(Date), + + /** + * Minimum date. + * + * Restricts the range of possible date/time values. + */ + minimumDate: PropTypes.instanceOf(Date), + + /** + * The date picker mode. + */ + mode: PropTypes.oneOf(['date', 'time', 'datetime']), + + /** + * The interval at which minutes can be selected. + */ + minuteInterval: PropTypes.oneOf([1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30]), + + /** + * Timezone offset in minutes. + * + * By default, the date picker will use the device's timezone. With this + * parameter, it is possible to force a certain timezone offset. For + * instance, to show times in Pacific Standard Time, pass -7 * 60. + */ + timeZoneOffsetInMinutes: PropTypes.number, + }, + + getDefaultProps: function(): DefaultProps { + return { + mode: 'datetime', + }; + }, + + _onChange: function(event: Event) { + var nativeTimeStamp = event.nativeEvent.timestamp; + this.props.onDateChange && this.props.onDateChange( + new Date(nativeTimeStamp) + ); + this.props.onChange && this.props.onChange(event); + + // We expect the onChange* handlers to be in charge of updating our `date` + // prop. That way they can also disallow/undo/mutate the selection of + // certain values. In other words, the embedder of this component should + // be the source of truth, not the native component. + var propsTimeStamp = this.props.date.getTime(); + if (nativeTimeStamp !== propsTimeStamp) { + this.refs[DATEPICKER].setNativeProps({ + date: propsTimeStamp, + }); + } + }, + + render: function() { + var props = this.props; + return ( + + + + ); + } +}); + +var styles = StyleSheet.create({ + datePickerIOS: { + height: RCTDatePickerIOSConsts.ComponentHeight, + width: RCTDatePickerIOSConsts.ComponentWidth, + }, +}); + +var RCTDatePickerIOS = requireNativeComponent('RCTDatePicker', DatePickerIOS); + +module.exports = DatePickerIOS; diff --git a/ios/Pods/React/Libraries/Components/MapView/MapView.js b/ios/Pods/React/Libraries/Components/MapView/MapView.js new file mode 100644 index 00000000..da4350e4 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/MapView/MapView.js @@ -0,0 +1,283 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule MapView + * @flow + */ +'use strict'; + +var EdgeInsetsPropType = require('EdgeInsetsPropType'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var Platform = require('Platform'); +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var View = require('View'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); +var deepDiffer = require('deepDiffer'); +var insetsDiffer = require('insetsDiffer'); +var merge = require('merge'); +var requireNativeComponent = require('requireNativeComponent'); + +type Event = Object; +type MapRegion = { + latitude: number; + longitude: number; + latitudeDelta: number; + longitudeDelta: number; +}; + +var MapView = React.createClass({ + mixins: [NativeMethodsMixin], + + checkAnnotationIds: function (annotations: Array) { + + var newAnnotations = annotations.map(function (annotation) { + if (!annotation.id) { + // TODO: add a base64 (or similar) encoder here + annotation.id = encodeURIComponent(JSON.stringify(annotation)); + } + + return annotation; + }); + + this.setState({ + annotations: newAnnotations + }); + }, + + componentWillMount: function() { + if (this.props.annotations) { + this.checkAnnotationIds(this.props.annotations); + } + }, + + componentWillReceiveProps: function(nextProps: Object) { + if (nextProps.annotations) { + this.checkAnnotationIds(nextProps.annotations); + } + }, + + propTypes: { + /** + * Used to style and layout the `MapView`. See `StyleSheet.js` and + * `ViewStylePropTypes.js` for more info. + */ + style: View.propTypes.style, + + /** + * If `true` the app will ask for the user's location and focus on it. + * Default value is `false`. + * + * **NOTE**: You need to add NSLocationWhenInUseUsageDescription key in + * Info.plist to enable geolocation, otherwise it is going + * to *fail silently*! + */ + showsUserLocation: React.PropTypes.bool, + + /** + * If `false` the user won't be able to pinch/zoom the map. + * Default `value` is true. + */ + zoomEnabled: React.PropTypes.bool, + + /** + * When this property is set to `true` and a valid camera is associated with + * the map, the camera’s heading angle is used to rotate the plane of the + * map around its center point. When this property is set to `false`, the + * camera’s heading angle is ignored and the map is always oriented so + * that true north is situated at the top of the map view + */ + rotateEnabled: React.PropTypes.bool, + + /** + * When this property is set to `true` and a valid camera is associated + * with the map, the camera’s pitch angle is used to tilt the plane + * of the map. When this property is set to `false`, the camera’s pitch + * angle is ignored and the map is always displayed as if the user + * is looking straight down onto it. + */ + pitchEnabled: React.PropTypes.bool, + + /** + * If `false` the user won't be able to change the map region being displayed. + * Default value is `true`. + */ + scrollEnabled: React.PropTypes.bool, + + /** + * The map type to be displayed. + * + * - standard: standard road map (default) + * - satellite: satellite view + * - hybrid: satellite view with roads and points of interest overlayed + */ + mapType: React.PropTypes.oneOf([ + 'standard', + 'satellite', + 'hybrid', + ]), + + /** + * The region to be displayed by the map. + * + * The region is defined by the center coordinates and the span of + * coordinates to display. + */ + region: React.PropTypes.shape({ + /** + * Coordinates for the center of the map. + */ + latitude: React.PropTypes.number.isRequired, + longitude: React.PropTypes.number.isRequired, + + /** + * Distance between the minimun and the maximum latitude/longitude + * to be displayed. + */ + latitudeDelta: React.PropTypes.number.isRequired, + longitudeDelta: React.PropTypes.number.isRequired, + }), + + /** + * Map annotations with title/subtitle. + */ + annotations: React.PropTypes.arrayOf(React.PropTypes.shape({ + /** + * The location of the annotation. + */ + latitude: React.PropTypes.number.isRequired, + longitude: React.PropTypes.number.isRequired, + + /** + * Whether the pin drop should be animated or not + */ + animateDrop: React.PropTypes.bool, + + /** + * Annotation title/subtile. + */ + title: React.PropTypes.string, + subtitle: React.PropTypes.string, + + /** + * Whether the Annotation has callout buttons. + */ + hasLeftCallout: React.PropTypes.bool, + hasRightCallout: React.PropTypes.bool, + + /** + * Event handlers for callout buttons. + */ + onLeftCalloutPress: React.PropTypes.func, + onRightCalloutPress: React.PropTypes.func, + + /** + * annotation id + */ + id: React.PropTypes.string + + })), + + /** + * Maximum size of area that can be displayed. + */ + maxDelta: React.PropTypes.number, + + /** + * Minimum size of area that can be displayed. + */ + minDelta: React.PropTypes.number, + + /** + * Insets for the map's legal label, originally at bottom left of the map. + * See `EdgeInsetsPropType.js` for more information. + */ + legalLabelInsets: EdgeInsetsPropType, + + /** + * Callback that is called continuously when the user is dragging the map. + */ + onRegionChange: React.PropTypes.func, + + /** + * Callback that is called once, when the user is done moving the map. + */ + onRegionChangeComplete: React.PropTypes.func, + + /** + * Callback that is called once, when the user is clicked on a annotation. + */ + onAnnotationPress: React.PropTypes.func, + }, + + _onChange: function(event: Event) { + if (event.nativeEvent.continuous) { + this.props.onRegionChange && + this.props.onRegionChange(event.nativeEvent.region); + } else { + this.props.onRegionChangeComplete && + this.props.onRegionChangeComplete(event.nativeEvent.region); + } + }, + + _onPress: function(event: Event) { + if (event.nativeEvent.action === 'annotation-click') { + this.props.onAnnotationPress && this.props.onAnnotationPress(event.nativeEvent.annotation); + } + + if (event.nativeEvent.action === 'callout-click') { + if (!this.props.annotations) { + return; + } + + // Find the annotation with the id of what has been pressed + for (var i = 0; i < this.props.annotations.length; i++) { + var annotation = this.props.annotations[i]; + if (annotation.id === event.nativeEvent.annotationId) { + // Pass the right function + if (event.nativeEvent.side === 'left') { + annotation.onLeftCalloutPress && annotation.onLeftCalloutPress(event.nativeEvent); + } else if (event.nativeEvent.side === 'right') { + annotation.onRightCalloutPress && annotation.onRightCalloutPress(event.nativeEvent); + } + } + } + + } + }, + + render: function() { + return ; + }, +}); + +if (Platform.OS === 'android') { + var RCTMap = createReactNativeComponentClass({ + validAttributes: merge( + ReactNativeViewAttributes.UIView, { + active: true, + showsUserLocation: true, + zoomEnabled: true, + rotateEnabled: true, + pitchEnabled: true, + scrollEnabled: true, + region: {diff: deepDiffer}, + annotations: {diff: deepDiffer}, + maxDelta: true, + minDelta: true, + legalLabelInsets: {diff: insetsDiffer}, + } + ), + uiViewClassName: 'RCTMap', + }); +} else { + var RCTMap = requireNativeComponent('RCTMap', MapView); +} + +module.exports = MapView; diff --git a/ios/Pods/React/Libraries/Components/Navigation/NavigatorIOS.ios.js b/ios/Pods/React/Libraries/Components/Navigation/NavigatorIOS.ios.js new file mode 100644 index 00000000..4c8e1b6e --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Navigation/NavigatorIOS.ios.js @@ -0,0 +1,683 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule NavigatorIOS + * @flow + */ +'use strict'; + +var EventEmitter = require('EventEmitter'); +var Image = require('Image'); +var NavigationContext = require('NavigationContext'); +var React = require('React'); +var RCTNavigatorManager = require('NativeModules').NavigatorManager; +var StyleSheet = require('StyleSheet'); +var StaticContainer = require('StaticContainer.react'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); +var invariant = require('invariant'); +var logError = require('logError'); + +var TRANSITIONER_REF = 'transitionerRef'; + +var PropTypes = React.PropTypes; + +var __uid = 0; +function getuid() { + return __uid++; +} + +var NavigatorTransitionerIOS = React.createClass({ + requestSchedulingNavigation: function(cb) { + RCTNavigatorManager.requestSchedulingJavaScriptNavigation( + React.findNodeHandle(this), + logError, + cb + ); + }, + + render: function() { + return ( + + ); + }, +}); + +type Route = { + component: Function; + title: string; + passProps?: Object; + backButtonTitle?: string; + backButtonIcon?: Object; + leftButtonTitle?: string; + leftButtonIcon?: Object; + onLeftButtonPress?: Function; + rightButtonTitle?: string; + rightButtonIcon?: Object; + onRightButtonPress?: Function; + wrapperStyle?: any; +}; + +type State = { + idStack: Array; + routeStack: Array; + requestedTopOfStack: number; + observedTopOfStack: number; + progress: number; + fromIndex: number; + toIndex: number; + makingNavigatorRequest: boolean; + updatingAllIndicesAtOrBeyond: number; +} + +type Event = Object; + +/** + * Think of `` as simply a component that renders an + * `RCTNavigator`, and moves the `RCTNavigator`'s `requestedTopOfStack` pointer + * forward and backward. The `RCTNavigator` interprets changes in + * `requestedTopOfStack` to be pushes and pops of children that are rendered. + * `` always ensures that whenever the `requestedTopOfStack` + * pointer is moved, that we've also rendered enough children so that the + * `RCTNavigator` can carry out the push/pop with those children. + * `` also removes children that will no longer be needed + * (after the pop of a child has been fully completed/animated out). + */ + +/** + * NavigatorIOS wraps UIKit navigation and allows you to add back-swipe + * functionality across your app. + * + * #### Routes + * A route is an object used to describe each page in the navigator. The first + * route is provided to NavigatorIOS as `initialRoute`: + * + * ``` + * render: function() { + * return ( + * + * ); + * }, + * ``` + * + * Now MyView will be rendered by the navigator. It will recieve the route + * object in the `route` prop, a navigator, and all of the props specified in + * `passProps`. + * + * See the initialRoute propType for a complete definition of a route. + * + * #### Navigator + * + * A `navigator` is an object of navigation functions that a view can call. It + * is passed as a prop to any component rendered by NavigatorIOS. + * + * ``` + * var MyView = React.createClass({ + * _handleBackButtonPress: function() { + * this.props.navigator.pop(); + * }, + * _handleNextButtonPress: function() { + * this.props.navigator.push(nextRoute); + * }, + * ... + * }); + * ``` + * + * A navigation object contains the following functions: + * + * - `push(route)` - Navigate forward to a new route + * - `pop()` - Go back one page + * - `popN(n)` - Go back N pages at once. When N=1, behavior matches `pop()` + * - `replace(route)` - Replace the route for the current page and immediately + * load the view for the new route + * - `replacePrevious(route)` - Replace the route/view for the previous page + * - `replacePreviousAndPop(route)` - Replaces the previous route/view and + * transitions back to it + * - `resetTo(route)` - Replaces the top item and popToTop + * - `popToRoute(route)` - Go back to the item for a particular route object + * - `popToTop()` - Go back to the top item + * + * Navigator functions are also available on the NavigatorIOS component: + * + * ``` + * var MyView = React.createClass({ + * _handleNavigationRequest: function() { + * this.refs.nav.push(otherRoute); + * }, + * render: () => ( + * + * ), + * }); + * ``` + * + */ +var NavigatorIOS = React.createClass({ + + propTypes: { + + /** + * NavigatorIOS uses "route" objects to identify child views, their props, + * and navigation bar configuration. "push" and all the other navigation + * operations expect routes to be like this: + */ + initialRoute: PropTypes.shape({ + /** + * The React Class to render for this route + */ + component: PropTypes.func.isRequired, + + /** + * The title displayed in the nav bar and back button for this route + */ + title: PropTypes.string.isRequired, + + /** + * Specify additional props passed to the component. NavigatorIOS will + * automatically provide "route" and "navigator" components + */ + passProps: PropTypes.object, + + /** + * If set, the left header button image will appear with this source. Note + * that this doesn't apply for the header of the current view, but the + * ones of the views that are pushed afterward. + */ + backButtonIcon: Image.propTypes.source, + + /** + * If set, the left header button will appear with this name. Note that + * this doesn't apply for the header of the current view, but the ones + * of the views that are pushed afterward. + */ + backButtonTitle: PropTypes.string, + + /** + * If set, the left header button image will appear with this source + */ + leftButtonIcon: Image.propTypes.source, + + /** + * If set, the left header button will appear with this name + */ + leftButtonTitle: PropTypes.string, + + /** + * Called when the left header button is pressed + */ + onLeftButtonPress: PropTypes.func, + + /** + * If set, the right header button image will appear with this source + */ + rightButtonIcon: Image.propTypes.source, + + /** + * If set, the right header button will appear with this name + */ + rightButtonTitle: PropTypes.string, + + /** + * Called when the right header button is pressed + */ + onRightButtonPress: PropTypes.func, + + /** + * Styles for the navigation item containing the component + */ + wrapperStyle: View.propTypes.style, + + }).isRequired, + + /** + * A Boolean value that indicates whether the navigation bar is hidden + */ + navigationBarHidden: PropTypes.bool, + + /** + * A Boolean value that indicates whether to hide the 1px hairline shadow + */ + shadowHidden: PropTypes.bool, + + /** + * The default wrapper style for components in the navigator. + * A common use case is to set the backgroundColor for every page + */ + itemWrapperStyle: View.propTypes.style, + + /** + * The color used for buttons in the navigation bar + */ + tintColor: PropTypes.string, + + /** + * The background color of the navigation bar + */ + barTintColor: PropTypes.string, + + /** + * The text color of the navigation bar title + */ + titleTextColor: PropTypes.string, + + /** + * A Boolean value that indicates whether the navigation bar is translucent + */ + translucent: PropTypes.bool, + + }, + + navigator: (undefined: ?Object), + navigationContext: new NavigationContext(), + + componentWillMount: function() { + // Precompute a pack of callbacks that's frequently generated and passed to + // instances. + this.navigator = { + push: this.push, + pop: this.pop, + popN: this.popN, + replace: this.replace, + replacePrevious: this.replacePrevious, + replacePreviousAndPop: this.replacePreviousAndPop, + resetTo: this.resetTo, + popToRoute: this.popToRoute, + popToTop: this.popToTop, + navigationContext: this.navigationContext, + }; + this._emitWillFocus(this.state.routeStack[this.state.observedTopOfStack]); + }, + + componentDidMount: function() { + this._emitDidFocus(this.state.routeStack[this.state.observedTopOfStack]); + }, + + componentWillUnmount: function() { + this.navigationContext.dispose(); + this.navigationContext = new NavigationContext(); + }, + + getInitialState: function(): State { + return { + idStack: [getuid()], + routeStack: [this.props.initialRoute], + // The navigation index that we wish to push/pop to. + requestedTopOfStack: 0, + // The last index that native has sent confirmation of completed push/pop + // for. At this point, we can discard any views that are beyond the + // `requestedTopOfStack`. A value of `null` means we have not received + // any confirmation, ever. We may receive an `observedTopOfStack` without + // ever requesting it - native can instigate pops of its own with the + // backswipe gesture. + observedTopOfStack: 0, + progress: 1, + fromIndex: 0, + toIndex: 0, + // Whether or not we are making a navigator request to push/pop. (Used + // for performance optimization). + makingNavigatorRequest: false, + // Whether or not we are updating children of navigator and if so (not + // `null`) which index marks the beginning of all updates. Used for + // performance optimization. + updatingAllIndicesAtOrBeyond: 0, + }; + }, + + _toFocusOnNavigationComplete: (undefined: any), + + _handleFocusRequest: function(item: any) { + if (this.state.makingNavigatorRequest) { + this._toFocusOnNavigationComplete = item; + } else { + this._getFocusEmitter().emit('focus', item); + } + }, + + _focusEmitter: (undefined: ?EventEmitter), + + _getFocusEmitter: function(): EventEmitter { + // Flow not yet tracking assignments to instance fields. + var focusEmitter = this._focusEmitter; + if (!focusEmitter) { + focusEmitter = new EventEmitter(); + this._focusEmitter = focusEmitter; + } + return focusEmitter; + }, + + getChildContext: function(): { + onFocusRequested: Function; + focusEmitter: EventEmitter; + } { + return { + onFocusRequested: this._handleFocusRequest, + focusEmitter: this._getFocusEmitter(), + }; + }, + + childContextTypes: { + onFocusRequested: React.PropTypes.func, + focusEmitter: React.PropTypes.instanceOf(EventEmitter), + }, + + _tryLockNavigator: function(cb: () => void) { + this.refs[TRANSITIONER_REF].requestSchedulingNavigation( + (acquiredLock) => acquiredLock && cb() + ); + }, + + _handleNavigatorStackChanged: function(e: Event) { + var newObservedTopOfStack = e.nativeEvent.stackLength - 1; + this._emitDidFocus(this.state.routeStack[newObservedTopOfStack]); + + invariant( + newObservedTopOfStack <= this.state.requestedTopOfStack, + 'No navigator item should be pushed without JS knowing about it %s %s', newObservedTopOfStack, this.state.requestedTopOfStack + ); + var wasWaitingForConfirmation = + this.state.requestedTopOfStack !== this.state.observedTopOfStack; + if (wasWaitingForConfirmation) { + invariant( + newObservedTopOfStack === this.state.requestedTopOfStack, + 'If waiting for observedTopOfStack to reach requestedTopOfStack, ' + + 'the only valid observedTopOfStack should be requestedTopOfStack.' + ); + } + // Mark the most recent observation regardless of if we can lock the + // navigator. `observedTopOfStack` merely represents what we've observed + // and this first `setState` is only executed to update debugging + // overlays/navigation bar. + // Also reset progress, toIndex, and fromIndex as they might not end + // in the correct states for a two possible reasons: + // Progress isn't always 0 or 1 at the end, the system rounds + // If the Navigator is offscreen these values won't be updated + // TOOD: Revisit this decision when no longer relying on native navigator. + var nextState = { + observedTopOfStack: newObservedTopOfStack, + makingNavigatorRequest: false, + updatingAllIndicesAtOrBeyond: null, + progress: 1, + toIndex: newObservedTopOfStack, + fromIndex: newObservedTopOfStack, + }; + this.setState(nextState, this._eliminateUnneededChildren); + }, + + _eliminateUnneededChildren: function() { + // Updating the indices that we're deleting and that's all. (Truth: Nothing + // even uses the indices in this case, but let's make this describe the + // truth anyways). + var updatingAllIndicesAtOrBeyond = + this.state.routeStack.length > this.state.observedTopOfStack + 1 ? + this.state.observedTopOfStack + 1 : + null; + this.setState({ + idStack: this.state.idStack.slice(0, this.state.observedTopOfStack + 1), + routeStack: this.state.routeStack.slice(0, this.state.observedTopOfStack + 1), + // Now we rerequest the top of stack that we observed. + requestedTopOfStack: this.state.observedTopOfStack, + makingNavigatorRequest: true, + updatingAllIndicesAtOrBeyond: updatingAllIndicesAtOrBeyond, + }); + }, + + _emitDidFocus: function(route: Route) { + this.navigationContext.emit('didfocus', {route: route}); + }, + + _emitWillFocus: function(route: Route) { + this.navigationContext.emit('willfocus', {route: route}); + }, + + push: function(route: Route) { + invariant(!!route, 'Must supply route to push'); + // Make sure all previous requests are caught up first. Otherwise reject. + if (this.state.requestedTopOfStack === this.state.observedTopOfStack) { + this._tryLockNavigator(() => { + this._emitWillFocus(route); + + var nextStack = this.state.routeStack.concat([route]); + var nextIDStack = this.state.idStack.concat([getuid()]); + this.setState({ + // We have to make sure that we've also supplied enough views to + // satisfy our request to adjust the `requestedTopOfStack`. + idStack: nextIDStack, + routeStack: nextStack, + requestedTopOfStack: nextStack.length - 1, + makingNavigatorRequest: true, + updatingAllIndicesAtOrBeyond: nextStack.length - 1, + }); + }); + } + }, + + popN: function(n: number) { + if (n === 0) { + return; + } + // Make sure all previous requests are caught up first. Otherwise reject. + if (this.state.requestedTopOfStack === this.state.observedTopOfStack) { + if (this.state.requestedTopOfStack > 0) { + this._tryLockNavigator(() => { + var newRequestedTopOfStack = this.state.requestedTopOfStack - n; + invariant(newRequestedTopOfStack >= 0, 'Cannot pop below 0'); + this._emitWillFocus(this.state.routeStack[newRequestedTopOfStack]); + this.setState({ + requestedTopOfStack: newRequestedTopOfStack, + makingNavigatorRequest: true, + // Not actually updating the indices yet until we get the native + // `onNavigationComplete`. + updatingAllIndicesAtOrBeyond: null, + }); + }); + } + } + }, + + pop: function() { + this.popN(1); + }, + + /** + * Replace a route in the navigation stack. + * + * `index` specifies the route in the stack that should be replaced. + * If it's negative, it counts from the back. + */ + replaceAtIndex: function(route: Route, index: number) { + invariant(!!route, 'Must supply route to replace'); + if (index < 0) { + index += this.state.routeStack.length; + } + + if (this.state.routeStack.length <= index) { + return; + } + + // I don't believe we need to lock for a replace since there's no + // navigation actually happening + var nextIDStack = this.state.idStack.slice(); + var nextRouteStack = this.state.routeStack.slice(); + nextIDStack[index] = getuid(); + nextRouteStack[index] = route; + + this.setState({ + idStack: nextIDStack, + routeStack: nextRouteStack, + makingNavigatorRequest: false, + updatingAllIndicesAtOrBeyond: index, + }); + + this._emitWillFocus(route); + this._emitDidFocus(route); + }, + + /** + * Replaces the top of the navigation stack. + */ + replace: function(route: Route) { + this.replaceAtIndex(route, -1); + }, + + /** + * Replace the current route's parent. + */ + replacePrevious: function(route: Route) { + this.replaceAtIndex(route, -2); + }, + + popToTop: function() { + this.popToRoute(this.state.routeStack[0]); + }, + + popToRoute: function(route: Route) { + var indexOfRoute = this.state.routeStack.indexOf(route); + invariant( + indexOfRoute !== -1, + 'Calling pop to route for a route that doesn\'t exist!' + ); + var numToPop = this.state.routeStack.length - indexOfRoute - 1; + this.popN(numToPop); + }, + + replacePreviousAndPop: function(route: Route) { + // Make sure all previous requests are caught up first. Otherwise reject. + if (this.state.requestedTopOfStack !== this.state.observedTopOfStack) { + return; + } + if (this.state.routeStack.length < 2) { + return; + } + this._tryLockNavigator(() => { + this.replacePrevious(route); + this.setState({ + requestedTopOfStack: this.state.requestedTopOfStack - 1, + makingNavigatorRequest: true, + }); + }); + }, + + resetTo: function(route: Route) { + invariant(!!route, 'Must supply route to push'); + // Make sure all previous requests are caught up first. Otherwise reject. + if (this.state.requestedTopOfStack !== this.state.observedTopOfStack) { + return; + } + this.replaceAtIndex(route, 0); + this.popToRoute(route); + }, + + handleNavigationComplete: function(e: Event) { + if (this._toFocusOnNavigationComplete) { + this._getFocusEmitter().emit('focus', this._toFocusOnNavigationComplete); + this._toFocusOnNavigationComplete = null; + } + this._handleNavigatorStackChanged(e); + }, + + _routeToStackItem: function(route: Route, i: number) { + var Component = route.component; + var shouldUpdateChild = this.state.updatingAllIndicesAtOrBeyond !== null && + this.state.updatingAllIndicesAtOrBeyond >= i; + + return ( + + + + + + ); + }, + + _imageNameFromSource: function(source: ?Object) { + return source ? source.uri : undefined; + }, + + renderNavigationStackItems: function() { + var shouldRecurseToNavigator = + this.state.makingNavigatorRequest || + this.state.updatingAllIndicesAtOrBeyond !== null; + // If not recursing update to navigator at all, may as well avoid + // computation of navigator children. + var items = shouldRecurseToNavigator ? + this.state.routeStack.map(this._routeToStackItem) : null; + return ( + + + {items} + + + ); + }, + + render: function() { + return ( + + {this.renderNavigationStackItems()} + + ); + }, +}); + +var styles = StyleSheet.create({ + stackItem: { + backgroundColor: 'white', + overflow: 'hidden', + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }, + transitioner: { + flex: 1, + }, +}); + +var RCTNavigator = requireNativeComponent('RCTNavigator'); +var RCTNavigatorItem = requireNativeComponent('RCTNavItem'); + +module.exports = NavigatorIOS; diff --git a/ios/Pods/React/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.ios.js b/ios/Pods/React/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.ios.js new file mode 100644 index 00000000..de4dbf9d --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.ios.js @@ -0,0 +1,8 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule ProgressBarAndroid + */ +'use strict'; + +module.exports = require('UnimplementedView'); diff --git a/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js b/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js new file mode 100644 index 00000000..abda1c36 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js @@ -0,0 +1,49 @@ + +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ProgressViewIOS + */ + +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); + +var DummyProgressViewIOS = React.createClass({ + render: function() { + return ( + + + ProgressViewIOS is not supported on this platform! + + + ); + }, +}); + +var styles = StyleSheet.create({ + dummy: { + width: 120, + height: 20, + backgroundColor: '#ffbcbc', + borderWidth: 1, + borderColor: 'red', + alignItems: 'center', + justifyContent: 'center', + }, + text: { + color: '#333333', + margin: 5, + fontSize: 10, + } +}); + +module.exports = DummyProgressViewIOS; diff --git a/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js b/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js new file mode 100644 index 00000000..c8ff595d --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ProgressViewIOS + * @flow + */ +'use strict'; + +var Image = require('Image'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var NativeModules = require('NativeModules'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); + +var requireNativeComponent = require('requireNativeComponent'); + +/** + * Use `ProgressViewIOS` to render a UIProgressView on iOS. + */ +var ProgressViewIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * The progress bar style. + */ + progressViewStyle: PropTypes.oneOf(['default', 'bar']), + + /** + * The progress value (between 0 and 1). + */ + progress: PropTypes.number, + + /** + * The tint color of the progress bar itself. + */ + progressTintColor: PropTypes.string, + + /** + * The tint color of the progress bar track. + */ + trackTintColor: PropTypes.string, + + /** + * A stretchable image to display as the progress bar. + */ + progressImage: Image.propTypes.source, + + /** + * A stretchable image to display behind the progress bar. + */ + trackImage: Image.propTypes.source, + }, + + render: function() { + return ( + + ); + } +}); + +var styles = StyleSheet.create({ + progressView: { + height: NativeModules.ProgressViewManager.ComponentHeight + }, +}); + +var RCTProgressView = requireNativeComponent( + 'RCTProgressView', + ProgressViewIOS +); + +module.exports = ProgressViewIOS; diff --git a/ios/Pods/React/Libraries/Components/ScrollResponder.js b/ios/Pods/React/Libraries/Components/ScrollResponder.js new file mode 100644 index 00000000..b0f13207 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ScrollResponder.js @@ -0,0 +1,508 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ScrollResponder + * @flow + */ +'use strict'; + +var NativeModules = require('NativeModules'); +var Platform = require('Platform'); +var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); +var React = require('React'); +var Subscribable = require('Subscribable'); +var TextInputState = require('TextInputState'); + +var RCTUIManager = NativeModules.UIManager; +var RCTScrollViewConsts = RCTUIManager.RCTScrollView.Constants; + +var warning = require('warning'); + +/** + * Mixin that can be integrated in order to handle scrolling that plays well + * with `ResponderEventPlugin`. Integrate with your platform specific scroll + * views, or even your custom built (every-frame animating) scroll views so that + * all of these systems play well with the `ResponderEventPlugin`. + * + * iOS scroll event timing nuances: + * =============================== + * + * + * Scrolling without bouncing, if you touch down: + * ------------------------------- + * + * 1. `onMomentumScrollBegin` (when animation begins after letting up) + * ... physical touch starts ... + * 2. `onTouchStartCapture` (when you press down to stop the scroll) + * 3. `onTouchStart` (same, but bubble phase) + * 4. `onResponderRelease` (when lifting up - you could pause forever before * lifting) + * 5. `onMomentumScrollEnd` + * + * + * Scrolling with bouncing, if you touch down: + * ------------------------------- + * + * 1. `onMomentumScrollBegin` (when animation begins after letting up) + * ... bounce begins ... + * ... some time elapses ... + * ... physical touch during bounce ... + * 2. `onMomentumScrollEnd` (Makes no sense why this occurs first during bounce) + * 3. `onTouchStartCapture` (immediately after `onMomentumScrollEnd`) + * 4. `onTouchStart` (same, but bubble phase) + * 5. `onTouchEnd` (You could hold the touch start for a long time) + * 6. `onMomentumScrollBegin` (When releasing the view starts bouncing back) + * + * So when we receive an `onTouchStart`, how can we tell if we are touching + * *during* an animation (which then causes the animation to stop)? The only way + * to tell is if the `touchStart` occurred immediately after the + * `onMomentumScrollEnd`. + * + * This is abstracted out for you, so you can just call this.scrollResponderIsAnimating() if + * necessary + * + * `ScrollResponder` also includes logic for blurring a currently focused input + * if one is focused while scrolling. The `ScrollResponder` is a natural place + * to put this logic since it can support not dismissing the keyboard while + * scrolling, unless a recognized "tap"-like gesture has occurred. + * + * The public lifecycle API includes events for keyboard interaction, responder + * interaction, and scrolling (among others). The keyboard callbacks + * `onKeyboardWill/Did/*` are *global* events, but are invoked on scroll + * responder's props so that you can guarantee that the scroll responder's + * internal state has been updated accordingly (and deterministically) by + * the time the props callbacks are invoke. Otherwise, you would always wonder + * if the scroll responder is currently in a state where it recognizes new + * keyboard positions etc. If coordinating scrolling with keyboard movement, + * *always* use these hooks instead of listening to your own global keyboard + * events. + * + * Public keyboard lifecycle API: (props callbacks) + * + * Standard Keyboard Appearance Sequence: + * + * this.props.onKeyboardWillShow + * this.props.onKeyboardDidShow + * + * `onScrollResponderKeyboardDismissed` will be invoked if an appropriate + * tap inside the scroll responder's scrollable region was responsible + * for the dismissal of the keyboard. There are other reasons why the + * keyboard could be dismissed. + * + * this.props.onScrollResponderKeyboardDismissed + * + * Standard Keyboard Hide Sequence: + * + * this.props.onKeyboardWillHide + * this.props.onKeyboardDidHide + */ + +var IS_ANIMATING_TOUCH_START_THRESHOLD_MS = 16; + +type State = { + isTouching: boolean; + lastMomentumScrollBeginTime: number; + lastMomentumScrollEndTime: number; + observedScrollSinceBecomingResponder: boolean; + becameResponderWhileAnimating: boolean; +}; +type Event = Object; + +var ScrollResponderMixin = { + mixins: [Subscribable.Mixin], + statics: RCTScrollViewConsts, + scrollResponderMixinGetInitialState: function(): State { + return { + isTouching: false, + lastMomentumScrollBeginTime: 0, + lastMomentumScrollEndTime: 0, + + // Reset to false every time becomes responder. This is used to: + // - Determine if the scroll view has been scrolled and therefore should + // refuse to give up its responder lock. + // - Determine if releasing should dismiss the keyboard when we are in + // tap-to-dismiss mode (!this.props.keyboardShouldPersistTaps). + observedScrollSinceBecomingResponder: false, + becameResponderWhileAnimating: false, + }; + }, + + /** + * Invoke this from an `onScroll` event. + */ + scrollResponderHandleScrollShouldSetResponder: function(): boolean { + return this.state.isTouching; + }, + + /** + * Merely touch starting is not sufficient for a scroll view to become the + * responder. Being the "responder" means that the very next touch move/end + * event will result in an action/movement. + * + * Invoke this from an `onStartShouldSetResponder` event. + * + * `onStartShouldSetResponder` is used when the next move/end will trigger + * some UI movement/action, but when you want to yield priority to views + * nested inside of the view. + * + * There may be some cases where scroll views actually should return `true` + * from `onStartShouldSetResponder`: Any time we are detecting a standard tap + * that gives priority to nested views. + * + * - If a single tap on the scroll view triggers an action such as + * recentering a map style view yet wants to give priority to interaction + * views inside (such as dropped pins or labels), then we would return true + * from this method when there is a single touch. + * + * - Similar to the previous case, if a two finger "tap" should trigger a + * zoom, we would check the `touches` count, and if `>= 2`, we would return + * true. + * + */ + scrollResponderHandleStartShouldSetResponder: function(): boolean { + return false; + }, + + /** + * There are times when the scroll view wants to become the responder + * (meaning respond to the next immediate `touchStart/touchEnd`), in a way + * that *doesn't* give priority to nested views (hence the capture phase): + * + * - Currently animating. + * - Tapping anywhere that is not the focused input, while the keyboard is + * up (which should dismiss the keyboard). + * + * Invoke this from an `onStartShouldSetResponderCapture` event. + */ + scrollResponderHandleStartShouldSetResponderCapture: function(e: Event): boolean { + // First see if we want to eat taps while the keyboard is up + var currentlyFocusedTextInput = TextInputState.currentlyFocusedField(); + if (this.props.keyboardShouldPersistTaps === false && + currentlyFocusedTextInput != null && + e.target !== currentlyFocusedTextInput) { + return true; + } + return this.scrollResponderIsAnimating(); + }, + + /** + * Invoke this from an `onResponderReject` event. + * + * Some other element is not yielding its role as responder. Normally, we'd + * just disable the `UIScrollView`, but a touch has already began on it, the + * `UIScrollView` will not accept being disabled after that. The easiest + * solution for now is to accept the limitation of disallowing this + * altogether. To improve this, find a way to disable the `UIScrollView` after + * a touch has already started. + */ + scrollResponderHandleResponderReject: function() { + warning(false, "ScrollView doesn't take rejection well - scrolls anyway"); + }, + + /** + * We will allow the scroll view to give up its lock iff it acquired the lock + * during an animation. This is a very useful default that happens to satisfy + * many common user experiences. + * + * - Stop a scroll on the left edge, then turn that into an outer view's + * backswipe. + * - Stop a scroll mid-bounce at the top, continue pulling to have the outer + * view dismiss. + * - However, without catching the scroll view mid-bounce (while it is + * motionless), if you drag far enough for the scroll view to become + * responder (and therefore drag the scroll view a bit), any backswipe + * navigation of a swipe gesture higher in the view hierarchy, should be + * rejected. + */ + scrollResponderHandleTerminationRequest: function(): boolean { + return !this.state.observedScrollSinceBecomingResponder; + }, + + /** + * Invoke this from an `onTouchEnd` event. + * + * @param {SyntheticEvent} e Event. + */ + scrollResponderHandleTouchEnd: function(e: Event) { + var nativeEvent = e.nativeEvent; + this.state.isTouching = nativeEvent.touches.length !== 0; + this.props.onTouchEnd && this.props.onTouchEnd(e); + }, + + /** + * Invoke this from an `onResponderRelease` event. + */ + scrollResponderHandleResponderRelease: function(e: Event) { + this.props.onResponderRelease && this.props.onResponderRelease(e); + + // By default scroll views will unfocus a textField + // if another touch occurs outside of it + var currentlyFocusedTextInput = TextInputState.currentlyFocusedField(); + if (this.props.keyboardShouldPersistTaps === false && + currentlyFocusedTextInput != null && + e.target !== currentlyFocusedTextInput && + !this.state.observedScrollSinceBecomingResponder && + !this.state.becameResponderWhileAnimating) { + this.props.onScrollResponderKeyboardDismissed && + this.props.onScrollResponderKeyboardDismissed(e); + TextInputState.blurTextInput(currentlyFocusedTextInput); + } + }, + + scrollResponderHandleScroll: function(e: Event) { + this.state.observedScrollSinceBecomingResponder = true; + this.props.onScroll && this.props.onScroll(e); + }, + + /** + * Invoke this from an `onResponderGrant` event. + */ + scrollResponderHandleResponderGrant: function(e: Event) { + this.state.observedScrollSinceBecomingResponder = false; + this.props.onResponderGrant && this.props.onResponderGrant(e); + this.state.becameResponderWhileAnimating = this.scrollResponderIsAnimating(); + }, + + /** + * Unfortunately, `onScrollBeginDrag` also fires when *stopping* the scroll + * animation, and there's not an easy way to distinguish a drag vs. stopping + * momentum. + * + * Invoke this from an `onScrollBeginDrag` event. + */ + scrollResponderHandleScrollBeginDrag: function(e: Event) { + this.props.onScrollBeginDrag && this.props.onScrollBeginDrag(e); + }, + + /** + * Invoke this from an `onScrollEndDrag` event. + */ + scrollResponderHandleScrollEndDrag: function(e: Event) { + this.props.onScrollEndDrag && this.props.onScrollEndDrag(e); + }, + + /** + * Invoke this from an `onMomentumScrollBegin` event. + */ + scrollResponderHandleMomentumScrollBegin: function(e: Event) { + this.state.lastMomentumScrollBeginTime = Date.now(); + this.props.onMomentumScrollBegin && this.props.onMomentumScrollBegin(e); + }, + + /** + * Invoke this from an `onMomentumScrollEnd` event. + */ + scrollResponderHandleMomentumScrollEnd: function(e: Event) { + this.state.lastMomentumScrollEndTime = Date.now(); + this.props.onMomentumScrollEnd && this.props.onMomentumScrollEnd(e); + }, + + /** + * Invoke this from an `onTouchStart` event. + * + * Since we know that the `SimpleEventPlugin` occurs later in the plugin + * order, after `ResponderEventPlugin`, we can detect that we were *not* + * permitted to be the responder (presumably because a contained view became + * responder). The `onResponderReject` won't fire in that case - it only + * fires when a *current* responder rejects our request. + * + * @param {SyntheticEvent} e Touch Start event. + */ + scrollResponderHandleTouchStart: function(e: Event) { + this.state.isTouching = true; + this.props.onTouchStart && this.props.onTouchStart(e); + }, + + /** + * Invoke this from an `onTouchMove` event. + * + * Since we know that the `SimpleEventPlugin` occurs later in the plugin + * order, after `ResponderEventPlugin`, we can detect that we were *not* + * permitted to be the responder (presumably because a contained view became + * responder). The `onResponderReject` won't fire in that case - it only + * fires when a *current* responder rejects our request. + * + * @param {SyntheticEvent} e Touch Start event. + */ + scrollResponderHandleTouchMove: function(e: Event) { + this.props.onTouchMove && this.props.onTouchMove(e); + }, + + /** + * A helper function for this class that lets us quickly determine if the + * view is currently animating. This is particularly useful to know when + * a touch has just started or ended. + */ + scrollResponderIsAnimating: function(): boolean { + var now = Date.now(); + var timeSinceLastMomentumScrollEnd = now - this.state.lastMomentumScrollEndTime; + var isAnimating = timeSinceLastMomentumScrollEnd < IS_ANIMATING_TOUCH_START_THRESHOLD_MS || + this.state.lastMomentumScrollEndTime < this.state.lastMomentumScrollBeginTime; + return isAnimating; + }, + + /** + * A helper function to scroll to a specific point in the scrollview. + * This is currently used to help focus on child textview's, but this + * can also be used to quickly scroll to any element we want to focus + */ + scrollResponderScrollTo: function(offsetX: number, offsetY: number) { + if (Platform.OS === 'android') { + RCTUIManager.dispatchViewManagerCommand( + React.findNodeHandle(this), + RCTUIManager.RCTScrollView.Commands.scrollTo, + [offsetX, offsetY], + ); + } else { + RCTUIManager.scrollTo( + React.findNodeHandle(this), + offsetX, + offsetY + ); + } + }, + + /** + * A helper function to zoom to a specific rect in the scrollview. + * @param {object} rect Should have shape {x, y, width, height} + */ + scrollResponderZoomTo: function(rect: { x: number; y: number; width: number; height: number; }) { + RCTUIManager.zoomToRect(React.findNodeHandle(this), rect); + }, + + /** + * This method should be used as the callback to onFocus in a TextInputs' + * parent view. Note that any module using this mixin needs to return + * the parent view's ref in getScrollViewRef() in order to use this method. + * @param {any} nodeHandle The TextInput node handle + * @param {number} additionalOffset The scroll view's top "contentInset". + * Default is 0. + * @param {bool} preventNegativeScrolling Whether to allow pulling the content + * down to make it meet the keyboard's top. Default is false. + */ + scrollResponderScrollNativeHandleToKeyboard: function(nodeHandle: any, additionalOffset?: number, preventNegativeScrollOffset?: bool) { + this.additionalScrollOffset = additionalOffset || 0; + this.preventNegativeScrollOffset = !!preventNegativeScrollOffset; + RCTUIManager.measureLayout( + nodeHandle, + React.findNodeHandle(this.getInnerViewNode()), + this.scrollResponderTextInputFocusError, + this.scrollResponderInputMeasureAndScrollToKeyboard + ); + }, + + /** + * The calculations performed here assume the scroll view takes up the entire + * screen - even if has some content inset. We then measure the offsets of the + * keyboard, and compensate both for the scroll view's "contentInset". + * + * @param {number} left Position of input w.r.t. table view. + * @param {number} top Position of input w.r.t. table view. + * @param {number} width Width of the text input. + * @param {number} height Height of the text input. + */ + scrollResponderInputMeasureAndScrollToKeyboard: function(left: number, top: number, width: number, height: number) { + if (this.keyboardWillOpenTo) { + var scrollOffsetY = + top - this.keyboardWillOpenTo.endCoordinates.screenY + height + + this.additionalScrollOffset; + + // By default, this can scroll with negative offset, pulling the content + // down so that the target component's bottom meets the keyboard's top. + // If requested otherwise, cap the offset at 0 minimum to avoid content + // shifting down. + if (this.preventNegativeScrollOffset) { + scrollOffsetY = Math.max(0, scrollOffsetY); + } + this.scrollResponderScrollTo(0, scrollOffsetY); + } + this.additionalOffset = 0; + this.preventNegativeScrollOffset = false; + }, + + scrollResponderTextInputFocusError: function(e: Event) { + console.error('Error measuring text field: ', e); + }, + + /** + * `componentWillMount` is the closest thing to a standard "constructor" for + * React components. + * + * The `keyboardWillShow` is called before input focus. + */ + componentWillMount: function() { + this.keyboardWillOpenTo = null; + this.additionalScrollOffset = 0; + this.addListenerOn(RCTDeviceEventEmitter, 'keyboardWillShow', this.scrollResponderKeyboardWillShow); + this.addListenerOn(RCTDeviceEventEmitter, 'keyboardWillHide', this.scrollResponderKeyboardWillHide); + this.addListenerOn(RCTDeviceEventEmitter, 'keyboardDidShow', this.scrollResponderKeyboardDidShow); + this.addListenerOn(RCTDeviceEventEmitter, 'keyboardDidHide', this.scrollResponderKeyboardDidHide); + warning(this.getInnerViewNode, 'You need to implement getInnerViewNode in ' + + this.constructor.displayName + ' to get full' + + 'functionality from ScrollResponder mixin. See example of ListView and' + + ' ScrollView.'); + }, + + /** + * Warning, this may be called several times for a single keyboard opening. + * It's best to store the information in this method and then take any action + * at a later point (either in `keyboardDidShow` or other). + * + * Here's the order that events occur in: + * - focus + * - willShow {startCoordinates, endCoordinates} several times + * - didShow several times + * - blur + * - willHide {startCoordinates, endCoordinates} several times + * - didHide several times + * + * The `ScrollResponder` providesModule callbacks for each of these events. + * Even though any user could have easily listened to keyboard events + * themselves, using these `props` callbacks ensures that ordering of events + * is consistent - and not dependent on the order that the keyboard events are + * subscribed to. This matters when telling the scroll view to scroll to where + * the keyboard is headed - the scroll responder better have been notified of + * the keyboard destination before being instructed to scroll to where the + * keyboard will be. Stick to the `ScrollResponder` callbacks, and everything + * will work. + * + * WARNING: These callbacks will fire even if a keyboard is displayed in a + * different navigation pane. Filter out the events to determine if they are + * relevant to you. (For example, only if you receive these callbacks after + * you had explicitly focused a node etc). + */ + scrollResponderKeyboardWillShow: function(e: Event) { + this.keyboardWillOpenTo = e; + this.props.onKeyboardWillShow && this.props.onKeyboardWillShow(e); + }, + + scrollResponderKeyboardWillHide: function(e: Event) { + this.keyboardWillOpenTo = null; + this.props.onKeyboardWillHide && this.props.onKeyboardWillHide(e); + }, + + scrollResponderKeyboardDidShow: function(e: Event) { + // TODO(7693961): The event for DidShow is not available on iOS yet. + // Use the one from WillShow and do not assign. + if (e) { + this.keyboardWillOpenTo = e; + } + this.props.onKeyboardDidShow && this.props.onKeyboardDidShow(e); + }, + + scrollResponderKeyboardDidHide: function() { + this.keyboardWillOpenTo = null; + this.props.onKeyboardDidHide && this.props.onKeyboardDidHide(); + } + +}; + +var ScrollResponder = { + Mixin: ScrollResponderMixin, +}; + +module.exports = ScrollResponder; diff --git a/ios/Pods/React/Libraries/Components/ScrollView/ScrollView.js b/ios/Pods/React/Libraries/Components/ScrollView/ScrollView.js new file mode 100644 index 00000000..1ee37a84 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/ScrollView/ScrollView.js @@ -0,0 +1,451 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ScrollView + * @flow + */ +'use strict'; + +var EdgeInsetsPropType = require('EdgeInsetsPropType'); +var Platform = require('Platform'); +var PointPropType = require('PointPropType'); +var RCTScrollView = require('NativeModules').UIManager.RCTScrollView; +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var RCTUIManager = require('NativeModules').UIManager; +var ScrollResponder = require('ScrollResponder'); +var StyleSheet = require('StyleSheet'); +var StyleSheetPropType = require('StyleSheetPropType'); +var View = require('View'); +var ViewStylePropTypes = require('ViewStylePropTypes'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); +var deepDiffer = require('deepDiffer'); +var dismissKeyboard = require('dismissKeyboard'); +var flattenStyle = require('flattenStyle'); +var insetsDiffer = require('insetsDiffer'); +var invariant = require('invariant'); +var pointsDiffer = require('pointsDiffer'); +var requireNativeComponent = require('requireNativeComponent'); + +var PropTypes = React.PropTypes; + +var SCROLLVIEW = 'ScrollView'; +var INNERVIEW = 'InnerScrollView'; + +/** + * Component that wraps platform ScrollView while providing + * integration with touch locking "responder" system. + * + * Keep in mind that ScrollViews must have a bounded height in order to work, + * since they contain unbounded-height children into a bounded container (via + * a scroll interaction). In order to bound the height of a ScrollView, either + * set the height of the view directly (discouraged) or make sure all parent + * views have bounded height. Forgetting to transfer `{flex: 1}` down the + * view stack can lead to errors here, which the element inspector makes + * easy to debug. + * + * Doesn't yet support other contained responders from blocking this scroll + * view from becoming the responder. + */ +var ScrollView = React.createClass({ + propTypes: { + /** + * Controls whether iOS should automatically adjust the content inset + * for scroll views that are placed behind a navigation bar or + * tab bar/ toolbar. The default value is true. + * @platform ios + */ + automaticallyAdjustContentInsets: PropTypes.bool, + /** + * The amount by which the scroll view content is inset from the edges + * of the scroll view. Defaults to `{0, 0, 0, 0}`. + * @platform ios + */ + contentInset: EdgeInsetsPropType, + /** + * Used to manually set the starting scroll offset. + * The default value is `{x: 0, y: 0}`. + * @platform ios + */ + contentOffset: PointPropType, + /** + * When true, the scroll view bounces when it reaches the end of the + * content if the content is larger then the scroll view along the axis of + * the scroll direction. When false, it disables all bouncing even if + * the `alwaysBounce*` props are true. The default value is true. + * @platform ios + */ + bounces: PropTypes.bool, + /** + * When true, gestures can drive zoom past min/max and the zoom will animate + * to the min/max value at gesture end, otherwise the zoom will not exceed + * the limits. + * @platform ios + */ + bouncesZoom: PropTypes.bool, + /** + * When true, the scroll view bounces horizontally when it reaches the end + * even if the content is smaller than the scroll view itself. The default + * value is true when `horizontal={true}` and false otherwise. + * @platform ios + */ + alwaysBounceHorizontal: PropTypes.bool, + /** + * When true, the scroll view bounces vertically when it reaches the end + * even if the content is smaller than the scroll view itself. The default + * value is false when `horizontal={true}` and true otherwise. + * @platform ios + */ + alwaysBounceVertical: PropTypes.bool, + /** + * When true, the scroll view automatically centers the content when the + * content is smaller than the scroll view bounds; when the content is + * larger than the scroll view, this property has no effect. The default + * value is false. + * @platform ios + */ + centerContent: PropTypes.bool, + /** + * These styles will be applied to the scroll view content container which + * wraps all of the child views. Example: + * + * return ( + * + * + * ); + * ... + * var styles = StyleSheet.create({ + * contentContainer: { + * paddingVertical: 20 + * } + * }); + */ + contentContainerStyle: StyleSheetPropType(ViewStylePropTypes), + /** + * A floating-point number that determines how quickly the scroll view + * decelerates after the user lifts their finger. Reasonable choices include + * - Normal: 0.998 (the default) + * - Fast: 0.9 + * @platform ios + */ + decelerationRate: PropTypes.number, + /** + * When true, the scroll view's children are arranged horizontally in a row + * instead of vertically in a column. The default value is false. + */ + horizontal: PropTypes.bool, + /** + * When true, the ScrollView will try to lock to only vertical or horizontal + * scrolling while dragging. The default value is false. + * @platform ios + */ + directionalLockEnabled: PropTypes.bool, + /** + * When false, once tracking starts, won't try to drag if the touch moves. + * The default value is true. + * @platform ios + */ + canCancelContentTouches: PropTypes.bool, + /** + * Determines whether the keyboard gets dismissed in response to a drag. + * - 'none' (the default), drags do not dismiss the keyboard. + * - 'on-drag', the keyboard is dismissed when a drag begins. + * - 'interactive', the keyboard is dismissed interactively with the drag and moves in + * synchrony with the touch; dragging upwards cancels the dismissal. + * On android this is not supported and it will have the same behavior as 'none'. + */ + keyboardDismissMode: PropTypes.oneOf([ + 'none', // default + 'interactive', + 'on-drag', + ]), + /** + * When false, tapping outside of the focused text input when the keyboard + * is up dismisses the keyboard. When true, the scroll view will not catch + * taps, and the keyboard will not dismiss automatically. The default value + * is false. + */ + keyboardShouldPersistTaps: PropTypes.bool, + /** + * The maximum allowed zoom scale. The default value is 1.0. + * @platform ios + */ + maximumZoomScale: PropTypes.number, + /** + * The minimum allowed zoom scale. The default value is 1.0. + * @platform ios + */ + minimumZoomScale: PropTypes.number, + /** + * Fires at most once per frame during scrolling. The frequency of the + * events can be contolled using the `scrollEventThrottle` prop. + */ + onScroll: PropTypes.func, + /** + * Called when a scrolling animation ends. + * @platform ios + */ + onScrollAnimationEnd: PropTypes.func, + /** + * When true, the scroll view stops on multiples of the scroll view's size + * when scrolling. This can be used for horizontal pagination. The default + * value is false. + * @platform ios + */ + pagingEnabled: PropTypes.bool, + /** + * When false, the content does not scroll. + * The default value is true. + * @platform ios + */ + scrollEnabled: PropTypes.bool, + /** + * This controls how often the scroll event will be fired while scrolling + * (in events per seconds). A higher number yields better accuracy for code + * that is tracking the scroll position, but can lead to scroll performance + * problems due to the volume of information being send over the bridge. + * The default value is zero, which means the scroll event will be sent + * only once each time the view is scrolled. + * @platform ios + */ + scrollEventThrottle: PropTypes.number, + /** + * The amount by which the scroll view indicators are inset from the edges + * of the scroll view. This should normally be set to the same value as + * the `contentInset`. Defaults to `{0, 0, 0, 0}`. + * @platform ios + */ + scrollIndicatorInsets: EdgeInsetsPropType, + /** + * When true, the scroll view scrolls to top when the status bar is tapped. + * The default value is true. + * @platform ios + */ + scrollsToTop: PropTypes.bool, + /** + * When true, shows a horizontal scroll indicator. + */ + showsHorizontalScrollIndicator: PropTypes.bool, + /** + * When true, shows a vertical scroll indicator. + */ + showsVerticalScrollIndicator: PropTypes.bool, + /** + * An array of child indices determining which children get docked to the + * top of the screen when scrolling. For example, passing + * `stickyHeaderIndices={[0]}` will cause the first child to be fixed to the + * top of the scroll view. This property is not supported in conjunction + * with `horizontal={true}`. + * @platform ios + */ + stickyHeaderIndices: PropTypes.arrayOf(PropTypes.number), + style: StyleSheetPropType(ViewStylePropTypes), + /** + * Experimental: When true, offscreen child views (whose `overflow` value is + * `hidden`) are removed from their native backing superview when offscreen. + * This can improve scrolling performance on long lists. The default value is + * false. + */ + removeClippedSubviews: PropTypes.bool, + /** + * The current scale of the scroll view content. The default value is 1.0. + * @platform ios + */ + zoomScale: PropTypes.number, + }, + + mixins: [ScrollResponder.Mixin], + + getInitialState: function() { + return this.scrollResponderMixinGetInitialState(); + }, + + setNativeProps: function(props: Object) { + this.refs[SCROLLVIEW].setNativeProps(props); + }, + + /** + * Returns a reference to the underlying scroll responder, which supports + * operations like `scrollTo`. All ScrollView-like components should + * implement this method so that they can be composed while providing access + * to the underlying scroll responder's methods. + */ + getScrollResponder: function(): ReactComponent { + return this; + }, + + getInnerViewNode: function(): any { + return React.findNodeHandle(this.refs[INNERVIEW]); + }, + + scrollTo: function(destY?: number, destX?: number) { + // $FlowFixMe - Don't know how to pass Mixin correctly. Postpone for now + this.getScrollResponder().scrollResponderScrollTo(destX || 0, destY || 0); + }, + + scrollWithoutAnimationTo: function(destY?: number, destX?: number) { + RCTUIManager.scrollWithoutAnimationTo( + React.findNodeHandle(this), + destX || 0, + destY || 0 + ); + }, + + handleScroll: function(e: Event) { + if (__DEV__) { + if (this.props.onScroll && !this.props.scrollEventThrottle) { + console.log( + 'You specified `onScroll` on a but not ' + + '`scrollEventThrottle`. You will only receive one event. ' + + 'Using `16` you get all the events but be aware that it may ' + + 'cause frame drops, use a bigger number if you don\'t need as ' + + 'much precision.' + ); + } + } + if (Platform.OS === 'android') { + if (this.props.keyboardDismissMode === 'on-drag') { + dismissKeyboard(); + } + } + this.scrollResponderHandleScroll(e); + }, + + render: function() { + var contentContainerStyle = [ + this.props.horizontal && styles.contentContainerHorizontal, + this.props.contentContainerStyle, + ]; + if (__DEV__ && this.props.style) { + var style = flattenStyle(this.props.style); + var childLayoutProps = ['alignItems', 'justifyContent'] + .filter((prop) => style && style[prop] !== undefined); + invariant( + childLayoutProps.length === 0, + 'ScrollView child layout (' + JSON.stringify(childLayoutProps) + + ') must by applied through the contentContainerStyle prop.' + ); + } + + var contentContainer = + + {this.props.children} + ; + + var alwaysBounceHorizontal = + this.props.alwaysBounceHorizontal !== undefined ? + this.props.alwaysBounceHorizontal : + this.props.horizontal; + + var alwaysBounceVertical = + this.props.alwaysBounceVertical !== undefined ? + this.props.alwaysBounceVertical : + !this.props.horizontal; + + var props = { + ...this.props, + alwaysBounceHorizontal, + alwaysBounceVertical, + style: ([styles.base, this.props.style]: ?Array), + onTouchStart: this.scrollResponderHandleTouchStart, + onTouchMove: this.scrollResponderHandleTouchMove, + onTouchEnd: this.scrollResponderHandleTouchEnd, + onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag, + onScrollEndDrag: this.scrollResponderHandleScrollEndDrag, + onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin, + onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd, + onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder, + onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture, + onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder, + onScroll: this.handleScroll, + onResponderGrant: this.scrollResponderHandleResponderGrant, + onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest, + onResponderTerminate: this.scrollResponderHandleTerminate, + onResponderRelease: this.scrollResponderHandleResponderRelease, + onResponderReject: this.scrollResponderHandleResponderReject, + }; + + var ScrollViewClass; + if (Platform.OS === 'ios') { + ScrollViewClass = RCTScrollView; + } else if (Platform.OS === 'android') { + if (this.props.horizontal) { + ScrollViewClass = AndroidHorizontalScrollView; + } else { + ScrollViewClass = AndroidScrollView; + } + } + invariant( + ScrollViewClass !== undefined, + 'ScrollViewClass must not be undefined' + ); + + return ( + + {contentContainer} + + ); + } +}); + +var styles = StyleSheet.create({ + base: { + flex: 1, + }, + contentContainerHorizontal: { + alignSelf: 'flex-start', + flexDirection: 'row', + }, +}); + +var validAttributes = { + ...ReactNativeViewAttributes.UIView, + alwaysBounceHorizontal: true, + alwaysBounceVertical: true, + automaticallyAdjustContentInsets: true, + bounces: true, + centerContent: true, + contentInset: {diff: insetsDiffer}, + contentOffset: {diff: pointsDiffer}, + decelerationRate: true, + horizontal: true, + keyboardDismissMode: true, + keyboardShouldPersistTaps: true, + maximumZoomScale: true, + minimumZoomScale: true, + pagingEnabled: true, + removeClippedSubviews: true, + scrollEnabled: true, + scrollIndicatorInsets: {diff: insetsDiffer}, + scrollsToTop: true, + showsHorizontalScrollIndicator: true, + showsVerticalScrollIndicator: true, + stickyHeaderIndices: {diff: deepDiffer}, + scrollEventThrottle: true, + zoomScale: true, +}; + +if (Platform.OS === 'android') { + var AndroidScrollView = createReactNativeComponentClass({ + validAttributes: validAttributes, + uiViewClassName: 'RCTScrollView', + }); + var AndroidHorizontalScrollView = createReactNativeComponentClass({ + validAttributes: validAttributes, + uiViewClassName: 'AndroidHorizontalScrollView', + }); +} else if (Platform.OS === 'ios') { + var RCTScrollView = requireNativeComponent('RCTScrollView', ScrollView); +} + +module.exports = ScrollView; diff --git a/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.android.js b/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.android.js new file mode 100644 index 00000000..848144bf --- /dev/null +++ b/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.android.js @@ -0,0 +1,49 @@ + +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SegmentedControlIOS + */ + +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); + +var DummySegmentedControlIOS = React.createClass({ + render: function() { + return ( + + + SegmentedControlIOS is not supported on this platform! + + + ); + }, +}); + +var styles = StyleSheet.create({ + dummy: { + width: 120, + height: 50, + backgroundColor: '#ffbcbc', + borderWidth: 1, + borderColor: 'red', + alignItems: 'center', + justifyContent: 'center', + }, + text: { + color: '#333333', + margin: 5, + fontSize: 10, + } +}); + +module.exports = DummySegmentedControlIOS; diff --git a/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js b/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js new file mode 100644 index 00000000..0fcc92e8 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SegmentedControlIOS + * @flow + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var NativeModules = require('NativeModules'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); + +var requireNativeComponent = require('requireNativeComponent'); + +type DefaultProps = { + values: Array; + enabled: boolean; +}; + +var SEGMENTED_CONTROL_REFERENCE = 'segmentedcontrol'; + +type Event = Object; + +/** + * Use `SegmentedControlIOS` to render a UISegmentedControl iOS. + */ +var SegmentedControlIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * The labels for the control's segment buttons, in order. + */ + values: PropTypes.arrayOf(PropTypes.string), + + /** + * The index in `props.values` of the segment to be pre-selected + */ + selectedIndex: PropTypes.number, + + /** + * Callback that is called when the user taps a segment; + * passes the segment's value as an argument + */ + onValueChange: PropTypes.func, + + /** + * Callback that is called when the user taps a segment; + * passes the event as an argument + */ + onChange: PropTypes.func, + + /** + * If false the user won't be able to interact with the control. + * Default value is true. + */ + enabled: PropTypes.bool, + + /** + * Accent color of the control. + */ + tintColor: PropTypes.string, + + /** + * If true, then selecting a segment won't persist visually. + * The `onValueChange` callback will still work as expected. + */ + momentary: PropTypes.bool + }, + + getDefaultProps: function(): DefaultProps { + return { + values: [], + enabled: true + }; + }, + + _onChange: function(event: Event) { + this.props.onChange && this.props.onChange(event); + this.props.onValueChange && this.props.onValueChange(event.nativeEvent.value); + }, + + render: function() { + return ( + + ); + } +}); + +var styles = StyleSheet.create({ + segmentedControl: { + height: NativeModules.SegmentedControlManager.ComponentHeight + }, +}); + +var RCTSegmentedControl = requireNativeComponent( + 'RCTSegmentedControl', + SegmentedControlIOS +); + +module.exports = SegmentedControlIOS; diff --git a/ios/Pods/React/Libraries/Components/SliderIOS/SliderIOS.ios.js b/ios/Pods/React/Libraries/Components/SliderIOS/SliderIOS.ios.js new file mode 100644 index 00000000..bfb2b927 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/SliderIOS/SliderIOS.ios.js @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SliderIOS + * @flow + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); + +type Event = Object; + +var SliderIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * Used to style and layout the `Slider`. See `StyleSheet.js` and + * `ViewStylePropTypes.js` for more info. + */ + style: View.propTypes.style, + + /** + * Initial value of the slider. The value should be between minimumValue + * and maximumValue, which default to 0 and 1 respectively. + * Default value is 0. + * + * *This is not a controlled component*, e.g. if you don't update + * the value, the component won't be reset to its inital value. + */ + value: PropTypes.number, + + /** + * Initial minimum value of the slider. Default value is 0. + */ + minimumValue: PropTypes.number, + + /** + * Initial maximum value of the slider. Default value is 1. + */ + maximumValue: PropTypes.number, + + /** + * The color used for the track to the left of the button. Overrides the + * default blue gradient image. + */ + minimumTrackTintColor: PropTypes.string, + + /** + * The color used for the track to the right of the button. Overrides the + * default blue gradient image. + */ + maximumTrackTintColor: PropTypes.string, + + /** + * Callback continuously called while the user is dragging the slider. + */ + onValueChange: PropTypes.func, + + /** + * Callback called when the user finishes changing the value (e.g. when + * the slider is released). + */ + onSlidingComplete: PropTypes.func, + }, + + _onValueChange: function(event: Event) { + this.props.onChange && this.props.onChange(event); + if (event.nativeEvent.continuous) { + this.props.onValueChange && + this.props.onValueChange(event.nativeEvent.value); + } else { + this.props.onSlidingComplete && event.nativeEvent.value !== undefined && + this.props.onSlidingComplete(event.nativeEvent.value); + } + }, + + render: function() { + return ( + + ); + } +}); + +var styles = StyleSheet.create({ + slider: { + height: 40, + }, +}); + +var RCTSlider = requireNativeComponent('RCTSlider', SliderIOS); + +module.exports = SliderIOS; diff --git a/ios/Pods/React/Libraries/Components/StaticRenderer.js b/ios/Pods/React/Libraries/Components/StaticRenderer.js new file mode 100644 index 00000000..8f6cabde --- /dev/null +++ b/ios/Pods/React/Libraries/Components/StaticRenderer.js @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule StaticRenderer + * @flow + */ +'use strict'; + +var React = require('React'); + +var StaticRenderer = React.createClass({ + propTypes: { + shouldUpdate: React.PropTypes.bool.isRequired, + render: React.PropTypes.func.isRequired, + }, + + shouldComponentUpdate: function(nextProps: { shouldUpdate: boolean }): boolean { + return nextProps.shouldUpdate; + }, + + render: function(): ReactElement { + return this.props.render(); + }, +}); + +module.exports = StaticRenderer; diff --git a/ios/Pods/React/Libraries/Components/StatusBar/StatusBarIOS.ios.js b/ios/Pods/React/Libraries/Components/StatusBar/StatusBarIOS.ios.js new file mode 100644 index 00000000..59369ef1 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/StatusBar/StatusBarIOS.ios.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule StatusBarIOS + * @flow + */ +'use strict'; + +var RCTStatusBarManager = require('NativeModules').StatusBarManager; + +type StatusBarStyle = $Enum<{ + 'default': string, + 'light-content': string, +}>; + +type StatusBarAnimation = $Enum<{ + 'none': string, + 'fade': string, + 'slide': string, +}>; + +var StatusBarIOS = { + + setStyle(style: StatusBarStyle, animated?: boolean) { + animated = animated || false; + RCTStatusBarManager.setStyle(style, animated); + }, + + setHidden(hidden: boolean, animation?: StatusBarAnimation) { + animation = animation || 'none'; + RCTStatusBarManager.setHidden(hidden, animation); + }, + + setNetworkActivityIndicatorVisible(visible: boolean) { + RCTStatusBarManager.setNetworkActivityIndicatorVisible(visible); + }, +}; + +module.exports = StatusBarIOS; diff --git a/ios/Pods/React/Libraries/Components/Subscribable.js b/ios/Pods/React/Libraries/Components/Subscribable.js new file mode 100644 index 00000000..8474b214 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Subscribable.js @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Subscribable + * @flow + */ +'use strict'; + +import type EventEmitter from 'EventEmitter'; + +/** + * Subscribable provides a mixin for safely subscribing a component to an + * eventEmitter + * + * This will be replaced with the observe interface that will be coming soon to + * React Core + */ + +var Subscribable = {}; + +Subscribable.Mixin = { + + componentWillMount: function() { + this._subscribableSubscriptions = []; + }, + + componentWillUnmount: function() { + this._subscribableSubscriptions.forEach( + (subscription) => subscription.remove() + ); + this._subscribableSubscriptions = null; + }, + + /** + * Special form of calling `addListener` that *guarantees* that a + * subscription *must* be tied to a component instance, and therefore will + * be cleaned up when the component is unmounted. It is impossible to create + * the subscription and pass it in - this method must be the one to create + * the subscription and therefore can guarantee it is retained in a way that + * will be cleaned up. + * + * @param {EventEmitter} eventEmitter emitter to subscribe to. + * @param {string} eventType Type of event to listen to. + * @param {function} listener Function to invoke when event occurs. + * @param {object} context Object to use as listener context. + */ + addListenerOn: function( + eventEmitter: EventEmitter, + eventType: string, + listener: Function, + context: Object + ) { + this._subscribableSubscriptions.push( + eventEmitter.addListener(eventType, listener, context) + ); + } +}; + +module.exports = Subscribable; diff --git a/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.android.js b/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.android.js new file mode 100644 index 00000000..9fde1a65 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.android.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SwitchIOS + */ + +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); + +var DummySwitchIOS = React.createClass({ + render: function() { + return ( + + SwitchIOS is not supported on this platform! + + ); + }, +}); + +var styles = StyleSheet.create({ + dummySwitchIOS: { + width: 120, + height: 50, + backgroundColor: '#ffbcbc', + borderWidth: 1, + borderColor: 'red', + alignItems: 'center', + justifyContent: 'center', + }, + text: { + color: '#333333', + margin: 5, + fontSize: 10, + } +}); + +module.exports = DummySwitchIOS; diff --git a/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.ios.js b/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.ios.js new file mode 100644 index 00000000..5a56e36b --- /dev/null +++ b/ios/Pods/React/Libraries/Components/SwitchIOS/SwitchIOS.ios.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SwitchIOS + * @flow + * + * This is a controlled component version of RCTSwitch. + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); + +var requireNativeComponent = require('requireNativeComponent'); + +var SWITCH = 'switch'; + +type DefaultProps = { + value: boolean; + disabled: boolean; +}; + +type Event = Object; + +/** + * Use `SwitchIOS` to render a boolean input on iOS. This is + * a controlled component, so you must hook in to the `onValueChange` callback + * and update the `value` prop in order for the component to update, otherwise + * the user's change will be reverted immediately to reflect `props.value` as the + * source of truth. + */ +var SwitchIOS = React.createClass({ + mixins: [NativeMethodsMixin], + + propTypes: { + /** + * The value of the switch, if true the switch will be turned on. + * Default value is false. + */ + value: PropTypes.bool, + + /** + * If true the user won't be able to toggle the switch. + * Default value is false. + */ + disabled: PropTypes.bool, + + /** + * Callback that is called when the user toggles the switch. + */ + onValueChange: PropTypes.func, + + /** + * Background color when the switch is turned on. + */ + onTintColor: PropTypes.string, + + /** + * Background color for the switch round button. + */ + thumbTintColor: PropTypes.string, + + /** + * Background color when the switch is turned off. + */ + tintColor: PropTypes.string, + }, + + getDefaultProps: function(): DefaultProps { + return { + value: false, + disabled: false, + }; + }, + + _onChange: function(event: Event) { + this.props.onChange && this.props.onChange(event); + this.props.onValueChange && this.props.onValueChange(event.nativeEvent.value); + + // The underlying switch might have changed, but we're controlled, + // and so want to ensure it represents our value. + this.refs[SWITCH].setNativeProps({value: this.props.value}); + }, + + render: function() { + return ( + + ); + } +}); + +var styles = StyleSheet.create({ + rkSwitch: { + height: 31, + width: 51, + }, +}); + +var RCTSwitch = requireNativeComponent('RCTSwitch', SwitchIOS); + +module.exports = SwitchIOS; diff --git a/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.android.js b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.android.js new file mode 100644 index 00000000..95b820f5 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.android.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TabBarIOS + */ + +'use strict'; + +var React = require('React'); +var View = require('View'); +var StyleSheet = require('StyleSheet'); + +var DummyTabBarIOS = React.createClass({ + render: function() { + return ( + + {this.props.children} + + ); + } +}); + +var styles = StyleSheet.create({ + tabGroup: { + flex: 1, + } +}); + +module.exports = DummyTabBarIOS; diff --git a/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.ios.js b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.ios.js new file mode 100644 index 00000000..0be39a8f --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarIOS.ios.js @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TabBarIOS + * @flow + */ +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var TabBarItemIOS = require('TabBarItemIOS'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); + +var TabBarIOS = React.createClass({ + statics: { + Item: TabBarItemIOS, + }, + + propTypes: { + style: View.propTypes.style, + /** + * Color of the currently selected tab icon + */ + tintColor: React.PropTypes.string, + /** + * Background color of the tab bar + */ + barTintColor: React.PropTypes.string, + /** + * A Boolean value that indicates whether the tab bar is translucent + */ + translucent: React.PropTypes.bool, + }, + + render: function() { + return ( + + {this.props.children} + + ); + } +}); + +var styles = StyleSheet.create({ + tabGroup: { + flex: 1, + } +}); + +var RCTTabBar = requireNativeComponent('RCTTabBar', TabBarIOS); + +module.exports = TabBarIOS; diff --git a/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.android.js b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.android.js new file mode 100644 index 00000000..6eb46c36 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.android.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TabBarItemIOS + */ + +'use strict'; + +var React = require('React'); +var View = require('View'); +var StyleSheet = require('StyleSheet'); + +var DummyTab = React.createClass({ + render: function() { + if (!this.props.selected) { + return ; + } + return ( + + {this.props.children} + + ); + } +}); + +var styles = StyleSheet.create({ + tab: { + // TODO(5405356): Implement overflow: visible so position: absolute isn't useless + // position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: 0, + borderColor: 'red', + borderWidth: 1, + } +}); + +module.exports = DummyTab; diff --git a/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js new file mode 100644 index 00000000..f44fb049 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TabBarItemIOS + */ +'use strict'; + +var Image = require('Image'); +var React = require('React'); +var StaticContainer = require('StaticContainer.react'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var requireNativeComponent = require('requireNativeComponent'); + +var TabBarItemIOS = React.createClass({ + propTypes: { + /** + * Little red bubble that sits at the top right of the icon. + */ + badge: React.PropTypes.oneOfType([ + React.PropTypes.string, + React.PropTypes.number, + ]), + /** + * Items comes with a few predefined system icons. Note that if you are + * using them, the title and selectedIcon will be overriden with the + * system ones. + */ + systemIcon: React.PropTypes.oneOf([ + 'bookmarks', + 'contacts', + 'downloads', + 'favorites', + 'featured', + 'history', + 'more', + 'most-recent', + 'most-viewed', + 'recents', + 'search', + 'top-rated', + ]), + /** + * A custom icon for the tab. It is ignored when a system icon is defined. + */ + icon: Image.propTypes.source, + /** + * A custom icon when the tab is selected. It is ignored when a system + * icon is defined. If left empty, the icon will be tinted in blue. + */ + selectedIcon: Image.propTypes.source, + /** + * Callback when this tab is being selected, you should change the state of your + * component to set selected={true}. + */ + onPress: React.PropTypes.func, + /** + * It specifies whether the children are visible or not. If you see a + * blank content, you probably forgot to add a selected one. + */ + selected: React.PropTypes.bool, + /** + * React style object. + */ + style: View.propTypes.style, + /** + * Text that appears under the icon. It is ignored when a system icon + * is defined. + */ + title: React.PropTypes.string, + }, + + getInitialState: function() { + return { + hasBeenSelected: false, + }; + }, + + componentWillMount: function() { + if (this.props.selected) { + this.setState({hasBeenSelected: true}); + } + }, + + componentWillReceiveProps: function(nextProps: { selected?: boolean }) { + if (this.state.hasBeenSelected || nextProps.selected) { + this.setState({hasBeenSelected: true}); + } + }, + + render: function() { + var tabContents = null; + // if the tab has already been shown once, always continue to show it so we + // preserve state between tab transitions + if (this.state.hasBeenSelected) { + tabContents = + + {this.props.children} + ; + } else { + tabContents = ; + } + + var badge = typeof this.props.badge === 'number' ? + '' + this.props.badge : + this.props.badge; + + return ( + + {tabContents} + + ); + } +}); + +var styles = StyleSheet.create({ + tab: { + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: 0, + } +}); + +var RCTTabBarItem = requireNativeComponent('RCTTabBarItem', TabBarItemIOS); + +module.exports = TabBarItemIOS; diff --git a/ios/Pods/React/Libraries/Components/TextInput/TextInput.js b/ios/Pods/React/Libraries/Components/TextInput/TextInput.js new file mode 100644 index 00000000..f114ac18 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TextInput/TextInput.js @@ -0,0 +1,578 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TextInput + * @flow + */ +'use strict'; + +var DocumentSelectionState = require('DocumentSelectionState'); +var EventEmitter = require('EventEmitter'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var RCTUIManager = require('NativeModules').UIManager; +var Platform = require('Platform'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var ReactChildren = require('ReactChildren'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var TextInputState = require('TextInputState'); +var TimerMixin = require('react-timer-mixin'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); +var emptyFunction = require('emptyFunction'); +var invariant = require('invariant'); +var requireNativeComponent = require('requireNativeComponent'); + +var onlyMultiline = { + onSelectionChange: true, // not supported in Open Source yet + onTextInput: true, // not supported in Open Source yet + children: true, +}; + +var notMultiline = { + onSubmitEditing: true, +}; + +var AndroidTextInputAttributes = { + autoCapitalize: true, + autoCorrect: true, + autoFocus: true, + textAlign: true, + textAlignVertical: true, + keyboardType: true, + mostRecentEventCount: true, + multiline: true, + password: true, + placeholder: true, + placeholderTextColor: true, + text: true, + testID: true, + underlineColorAndroid: true, + editable : true, +}; + +var viewConfigAndroid = { + uiViewClassName: 'AndroidTextInput', + validAttributes: AndroidTextInputAttributes, +}; + +var RCTTextView = requireNativeComponent('RCTTextView', null); +var RCTTextField = requireNativeComponent('RCTTextField', null); + +type Event = Object; + +/** + * A foundational component for inputting text into the app via a + * keyboard. Props provide configurability for several features, such as + * auto-correction, auto-capitalization, placeholder text, and different keyboard + * types, such as a numeric keypad. + * + * The simplest use case is to plop down a `TextInput` and subscribe to the + * `onChangeText` events to read the user input. There are also other events, + * such as `onSubmitEditing` and `onFocus` that can be subscribed to. A simple + * example: + * + * ``` + * this.setState({text})} + * value={this.state.text} + * /> + * ``` + * + * Note that some props are only available with multiline={true/false}: + * + * var onlyMultiline = { + * onSelectionChange: true, // not supported in Open Source yet + * onTextInput: true, // not supported in Open Source yet + * children: true, + * }; + * + * var notMultiline = { + * onSubmitEditing: true, + * }; + */ +var TextInput = React.createClass({ + propTypes: { + /** + * Can tell TextInput to automatically capitalize certain characters. + * + * - characters: all characters, + * - words: first letter of each word + * - sentences: first letter of each sentence (default) + * - none: don't auto capitalize anything + */ + autoCapitalize: PropTypes.oneOf([ + 'none', + 'sentences', + 'words', + 'characters', + ]), + /** + * If false, disables auto-correct. The default value is true. + */ + autoCorrect: PropTypes.bool, + /** + * If true, focuses the input on componentDidMount. + * The default value is false. + */ + autoFocus: PropTypes.bool, + /** + * Set the position of the cursor from where editing will begin. + * @platorm android + */ + textAlign: PropTypes.oneOf([ + 'start', + 'center', + 'end', + ]), + /** + * Aligns text vertically within the TextInput. + * @platform android + */ + textAlignVertical: PropTypes.oneOf([ + 'top', + 'center', + 'bottom', + ]), + /** + * If false, text is not editable. The default value is true. + */ + editable: PropTypes.bool, + /** + * Determines which keyboard to open, e.g.`numeric`. + * + * The following values work across platforms: + * - default + * - numeric + * - email-address + */ + keyboardType: PropTypes.oneOf([ + // Cross-platform + 'default', + 'numeric', + 'email-address', + // iOS-only + 'ascii-capable', + 'numbers-and-punctuation', + 'url', + 'number-pad', + 'phone-pad', + 'name-phone-pad', + 'decimal-pad', + 'twitter', + 'web-search', + ]), + /** + * Determines how the return key should look. + * @platform ios + */ + returnKeyType: PropTypes.oneOf([ + 'default', + 'go', + 'google', + 'join', + 'next', + 'route', + 'search', + 'send', + 'yahoo', + 'done', + 'emergency-call', + ]), + /** + * Limits the maximum number of characters that can be entered. Use this + * instead of implementing the logic in JS to avoid flicker. + * @platform ios + */ + maxLength: PropTypes.number, + /** + * If true, the keyboard disables the return key when there is no text and + * automatically enables it when there is text. The default value is false. + * @platform ios + */ + enablesReturnKeyAutomatically: PropTypes.bool, + /** + * If true, the text input can be multiple lines. + * The default value is false. + */ + multiline: PropTypes.bool, + /** + * Callback that is called when the text input is blurred + */ + onBlur: PropTypes.func, + /** + * Callback that is called when the text input is focused + */ + onFocus: PropTypes.func, + /** + * Callback that is called when the text input's text changes. + */ + onChange: PropTypes.func, + /** + * Callback that is called when the text input's text changes. + * Changed text is passed as an argument to the callback handler. + */ + onChangeText: PropTypes.func, + /** + * Callback that is called when text input ends. + */ + onEndEditing: PropTypes.func, + /** + * Callback that is called when the text input's submit button is pressed. + */ + onSubmitEditing: PropTypes.func, + /** + * Invoked on mount and layout changes with `{x, y, width, height}`. + */ + onLayout: PropTypes.func, + /** + * The string that will be rendered before text input has been entered + */ + placeholder: PropTypes.string, + /** + * The text color of the placeholder string + */ + placeholderTextColor: PropTypes.string, + /** + * If true, the text input obscures the text entered so that sensitive text + * like passwords stay secure. The default value is false. + */ + secureTextEntry: PropTypes.bool, + /** + * See DocumentSelectionState.js, some state that is responsible for + * maintaining selection information for a document + * @platform ios + */ + selectionState: PropTypes.instanceOf(DocumentSelectionState), + /** + * The value to show for the text input. TextInput is a controlled + * component, which means the native value will be forced to match this + * value prop if provided. For most uses this works great, but in some + * cases this may cause flickering - one common cause is preventing edits + * by keeping value the same. In addition to simply setting the same value, + * either set `editable={false}`, or set/update `maxLength` to prevent + * unwanted edits without flicker. + */ + value: PropTypes.string, + /** + * Provides an initial value that will change when the user starts typing. + * Useful for simple use-cases where you don't want to deal with listening + * to events and updating the value prop to keep the controlled state in sync. + */ + defaultValue: PropTypes.string, + /** + * When the clear button should appear on the right side of the text view + * @platform ios + */ + clearButtonMode: PropTypes.oneOf([ + 'never', + 'while-editing', + 'unless-editing', + 'always', + ]), + /** + * If true, clears the text field automatically when editing begins + * @platform ios + */ + clearTextOnFocus: PropTypes.bool, + /** + * If true, all text will automatically be selected on focus + * @platform ios + */ + selectTextOnFocus: PropTypes.bool, + /** + * Styles + */ + style: Text.propTypes.style, + /** + * Used to locate this view in end-to-end tests + */ + testID: PropTypes.string, + /** + * The color of the textInput underline. + * @platform android + */ + underlineColorAndroid: PropTypes.string, + }, + + /** + * `NativeMethodsMixin` will look for this when invoking `setNativeProps`. We + * make `this` look like an actual native component class. + */ + mixins: [NativeMethodsMixin, TimerMixin], + + viewConfig: ((Platform.OS === 'ios' ? RCTTextField.viewConfig : + (Platform.OS === 'android' ? viewConfigAndroid : {})) : Object), + + isFocused: function(): boolean { + return TextInputState.currentlyFocusedField() === + React.findNodeHandle(this.refs.input); + }, + + getInitialState: function() { + return { + mostRecentEventCount: 0, + }; + }, + + contextTypes: { + onFocusRequested: React.PropTypes.func, + focusEmitter: React.PropTypes.instanceOf(EventEmitter), + }, + + _focusSubscription: (undefined: ?Function), + + componentDidMount: function() { + if (!this.context.focusEmitter) { + if (this.props.autoFocus) { + this.requestAnimationFrame(this.focus); + } + return; + } + this._focusSubscription = this.context.focusEmitter.addListener( + 'focus', + (el) => { + if (this === el) { + this.requestAnimationFrame(this.focus); + } else if (this.isFocused()) { + this.blur(); + } + } + ); + if (this.props.autoFocus) { + this.context.onFocusRequested(this); + } + }, + + componentWillUnmount: function() { + this._focusSubscription && this._focusSubscription.remove(); + if (this.isFocused()) { + this.blur(); + } + }, + + getChildContext: function(): Object { + return {isInAParentText: true}; + }, + + childContextTypes: { + isInAParentText: React.PropTypes.bool + }, + + clear: function() { + this.setNativeProps({text: ''}); + }, + + render: function() { + if (Platform.OS === 'ios') { + return this._renderIOS(); + } else if (Platform.OS === 'android') { + return this._renderAndroid(); + } + }, + + _getText: function(): ?string { + return typeof this.props.value === 'string' ? + this.props.value : + this.props.defaultValue; + }, + + _renderIOS: function() { + var textContainer; + + var props = Object.assign({}, this.props); + props.style = [styles.input, this.props.style]; + if (!props.multiline) { + for (var propKey in onlyMultiline) { + if (props[propKey]) { + throw new Error( + 'TextInput prop `' + propKey + '` is only supported with multiline.' + ); + } + } + textContainer = + true} + text={this._getText()} + mostRecentEventCount={this.state.mostRecentEventCount} + />; + } else { + for (var propKey in notMultiline) { + if (props[propKey]) { + throw new Error( + 'TextInput prop `' + propKey + '` cannot be used with multiline.' + ); + } + } + + var children = props.children; + var childCount = 0; + ReactChildren.forEach(children, () => ++childCount); + invariant( + !(props.value && childCount), + 'Cannot specify both value and children.' + ); + if (childCount > 1) { + children = {children}; + } + if (props.inputView) { + children = [children, props.inputView]; + } + textContainer = + ; + } + + return ( + + {textContainer} + + ); + }, + + _renderAndroid: function() { + var autoCapitalize = RCTUIManager.UIText.AutocapitalizationType[this.props.autoCapitalize]; + var textAlign = + RCTUIManager.AndroidTextInput.Constants.TextAlign[this.props.textAlign]; + var textAlignVertical = + RCTUIManager.AndroidTextInput.Constants.TextAlignVertical[this.props.textAlignVertical]; + var children = this.props.children; + var childCount = 0; + ReactChildren.forEach(children, () => ++childCount); + invariant( + !(this.props.value && childCount), + 'Cannot specify both value and children.' + ); + if (childCount > 1) { + children = {children}; + } + var textContainer = + ; + + return ( + + {textContainer} + + ); + }, + + _onFocus: function(event: Event) { + if (this.props.onFocus) { + this.props.onFocus(event); + } + }, + + _onPress: function(event: Event) { + if (this.props.editable || this.props.editable === undefined) { + this.focus(); + } + }, + + _onChange: function(event: Event) { + if (Platform.OS === 'android') { + // Android expects the event count to be updated as soon as possible. + this.refs.input.setNativeProps({ + mostRecentEventCount: event.nativeEvent.eventCount, + }); + } + var text = event.nativeEvent.text; + var eventCount = event.nativeEvent.eventCount; + this.props.onChange && this.props.onChange(event); + this.props.onChangeText && this.props.onChangeText(text); + this.setState({mostRecentEventCount: eventCount}, () => { + // This is a controlled component, so make sure to force the native value + // to match. Most usage shouldn't need this, but if it does this will be + // more correct but might flicker a bit and/or cause the cursor to jump. + if (text !== this.props.value && typeof this.props.value === 'string') { + this.refs.input.setNativeProps({ + text: this.props.value, + }); + } + }); + }, + + _onBlur: function(event: Event) { + this.blur(); + if (this.props.onBlur) { + this.props.onBlur(event); + } + }, + + _onSelectionChange: function(event: Event) { + if (this.props.selectionState) { + var selection = event.nativeEvent.selection; + this.props.selectionState.update(selection.start, selection.end); + } + this.props.onSelectionChange && this.props.onSelectionChange(event); + }, + + _onTextInput: function(event: Event) { + this.props.onTextInput && this.props.onTextInput(event); + }, +}); + +var styles = StyleSheet.create({ + input: { + alignSelf: 'stretch', + }, +}); + +var AndroidTextInput = createReactNativeComponentClass({ + validAttributes: AndroidTextInputAttributes, + uiViewClassName: 'AndroidTextInput', +}); + +module.exports = TextInput; diff --git a/ios/Pods/React/Libraries/Components/TextInput/TextInputState.js b/ios/Pods/React/Libraries/Components/TextInput/TextInputState.js new file mode 100644 index 00000000..f3e35b78 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/TextInput/TextInputState.js @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TextInputState + * @flow + * + * This class is responsible for coordinating the "focused" + * state for TextInputs. All calls relating to the keyboard + * should be funneled through here + */ +'use strict'; + +var Platform = require('Platform'); +var RCTUIManager = require('NativeModules').UIManager; + +var TextInputState = { + /** + * Internal state + */ + _currentlyFocusedID: (null: ?number), + + /** + * Returns the ID of the currently focused text field, if one exists + * If no text field is focused it returns null + */ + currentlyFocusedField: function(): ?number { + return this._currentlyFocusedID; + }, + + /** + * @param {number} TextInputID id of the text field to focus + * Focuses the specified text field + * noop if the text field was already focused + */ + focusTextInput: function(textFieldID: ?number) { + if (this._currentlyFocusedID !== textFieldID && textFieldID !== null) { + this._currentlyFocusedID = textFieldID; + if (Platform.OS === 'ios') { + RCTUIManager.focus(textFieldID); + } else if (Platform.OS === 'android') { + RCTUIManager.dispatchViewManagerCommand( + textFieldID, + RCTUIManager.AndroidTextInput.Commands.focusTextInput, + null + ); + } + } + }, + + /** + * @param {number} textFieldID id of the text field to focus + * Unfocuses the specified text field + * noop if it wasn't focused + */ + blurTextInput: function(textFieldID: ?number) { + if (this._currentlyFocusedID === textFieldID && textFieldID !== null) { + this._currentlyFocusedID = null; + if (Platform.OS === 'ios') { + RCTUIManager.blur(textFieldID); + } else if (Platform.OS === 'android') { + RCTUIManager.dispatchViewManagerCommand( + textFieldID, + RCTUIManager.AndroidTextInput.Commands.blurTextInput, + null + ); + } + } + } +}; + +module.exports = TextInputState; diff --git a/ios/Pods/React/Libraries/Components/Touchable/TouchableBounce.js b/ios/Pods/React/Libraries/Components/Touchable/TouchableBounce.js new file mode 100644 index 00000000..487836a2 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/TouchableBounce.js @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TouchableBounce + * @flow + */ +'use strict'; + +var Animated = require('Animated'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var React = require('React'); +var Touchable = require('Touchable'); + +var merge = require('merge'); + +type Event = Object; +type State = { + animationID: ?number; +}; + +/** + * When the scroll view is disabled, this defines how far your touch may move + * off of the button, before deactivating the button. Once deactivated, try + * moving it back and you'll see that the button is once again reactivated! + * Move it back and forth several times while the scroll view is disabled. + */ +var PRESS_RECT_OFFSET = {top: 20, left: 20, right: 20, bottom: 30}; +/** + * Example of using the `TouchableMixin` to play well with other responder + * locking views including `ScrollView`. `TouchableMixin` provides touchable + * hooks (`this.touchableHandle*`) that we forward events to. In turn, + * `TouchableMixin` expects us to implement some abstract methods to handle + * interesting interactions such as `handleTouchablePress`. + */ +var TouchableBounce = React.createClass({ + mixins: [Touchable.Mixin, NativeMethodsMixin], + + propTypes: { + onPress: React.PropTypes.func, + onPressIn: React.PropTypes.func, + onPressOut: React.PropTypes.func, + // The function passed takes a callback to start the animation which should + // be run after this onPress handler is done. You can use this (for example) + // to update UI before starting the animation. + onPressWithCompletion: React.PropTypes.func, + // the function passed is called after the animation is complete + onPressAnimationComplete: React.PropTypes.func, + }, + + getInitialState: function(): State { + return { + ...this.touchableGetInitialState(), + scale: new Animated.Value(1), + }; + }, + + bounceTo: function( + value: number, + velocity: number, + bounciness: number, + callback?: ?Function + ) { + Animated.spring(this.state.scale, { + toValue: value, + velocity, + bounciness, + }).start(callback); + }, + + /** + * `Touchable.Mixin` self callbacks. The mixin will invoke these if they are + * defined on your component. + */ + touchableHandleActivePressIn: function(e: Event) { + this.bounceTo(0.93, 0.1, 0); + this.props.onPressIn && this.props.onPressIn(e); + }, + + touchableHandleActivePressOut: function(e: Event) { + this.bounceTo(1, 0.4, 0); + this.props.onPressOut && this.props.onPressOut(e); + }, + + touchableHandlePress: function(e: Event) { + var onPressWithCompletion = this.props.onPressWithCompletion; + if (onPressWithCompletion) { + onPressWithCompletion(() => { + this.state.scale.setValue(0.93); + this.bounceTo(1, 10, 10, this.props.onPressAnimationComplete); + }); + return; + } + + this.bounceTo(1, 10, 10, this.props.onPressAnimationComplete); + this.props.onPress && this.props.onPress(e); + }, + + touchableGetPressRectOffset: function(): typeof PRESS_RECT_OFFSET { + return PRESS_RECT_OFFSET; // Always make sure to predeclare a constant! + }, + + touchableGetHighlightDelayMS: function(): number { + return 0; + }, + + render: function(): ReactElement { + return ( + + {this.props.children} + + ); + } +}); + +module.exports = TouchableBounce; diff --git a/ios/Pods/React/Libraries/Components/Touchable/TouchableHighlight.js b/ios/Pods/React/Libraries/Components/Touchable/TouchableHighlight.js new file mode 100644 index 00000000..4b6442ed --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/TouchableHighlight.js @@ -0,0 +1,242 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TouchableHighlight + */ +'use strict'; + +// Note (avik): add @flow when Flow supports spread properties in propTypes + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var StyleSheet = require('StyleSheet'); +var TimerMixin = require('react-timer-mixin'); +var Touchable = require('Touchable'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); +var View = require('View'); + +var cloneWithProps = require('cloneWithProps'); +var ensureComponentIsNative = require('ensureComponentIsNative'); +var ensurePositiveDelayProps = require('ensurePositiveDelayProps'); +var keyOf = require('keyOf'); +var merge = require('merge'); +var onlyChild = require('onlyChild'); + +type Event = Object; + +var DEFAULT_PROPS = { + activeOpacity: 0.8, + underlayColor: 'black', +}; + +/** + * A wrapper for making views respond properly to touches. + * On press down, the opacity of the wrapped view is decreased, which allows + * the underlay color to show through, darkening or tinting the view. The + * underlay comes from adding a view to the view hierarchy, which can sometimes + * cause unwanted visual artifacts if not used correctly, for example if the + * backgroundColor of the wrapped view isn't explicitly set to an opaque color. + * + * Example: + * + * ``` + * renderButton: function() { + * return ( + * + * + * + * ); + * }, + * ``` + */ + +var TouchableHighlight = React.createClass({ + propTypes: { + ...TouchableWithoutFeedback.propTypes, + /** + * Determines what the opacity of the wrapped view should be when touch is + * active. + */ + activeOpacity: React.PropTypes.number, + /** + * The color of the underlay that will show through when the touch is + * active. + */ + underlayColor: React.PropTypes.string, + style: View.propTypes.style, + /** + * Called immediately after the underlay is shown + */ + onShowUnderlay: React.PropTypes.func, + /** + * Called immediately after the underlay is hidden + */ + onHideUnderlay: React.PropTypes.func, + }, + + mixins: [NativeMethodsMixin, TimerMixin, Touchable.Mixin], + + getDefaultProps: () => DEFAULT_PROPS, + + // Performance optimization to avoid constantly re-generating these objects. + computeSyntheticState: function(props) { + return { + activeProps: { + style: { + opacity: props.activeOpacity, + } + }, + activeUnderlayProps: { + style: { + backgroundColor: props.underlayColor, + } + }, + underlayStyle: [ + INACTIVE_UNDERLAY_PROPS.style, + props.style, + ] + }; + }, + + getInitialState: function() { + return merge( + this.touchableGetInitialState(), this.computeSyntheticState(this.props) + ); + }, + + componentDidMount: function() { + ensurePositiveDelayProps(this.props); + ensureComponentIsNative(this.refs[CHILD_REF]); + }, + + componentDidUpdate: function() { + ensureComponentIsNative(this.refs[CHILD_REF]); + }, + + componentWillReceiveProps: function(nextProps) { + ensurePositiveDelayProps(nextProps); + if (nextProps.activeOpacity !== this.props.activeOpacity || + nextProps.underlayColor !== this.props.underlayColor || + nextProps.style !== this.props.style) { + this.setState(this.computeSyntheticState(nextProps)); + } + }, + + viewConfig: { + uiViewClassName: 'RCTView', + validAttributes: ReactNativeViewAttributes.RCTView + }, + + /** + * `Touchable.Mixin` self callbacks. The mixin will invoke these if they are + * defined on your component. + */ + touchableHandleActivePressIn: function(e: Event) { + this.clearTimeout(this._hideTimeout); + this._hideTimeout = null; + this._showUnderlay(); + this.props.onPressIn && this.props.onPressIn(e); + }, + + touchableHandleActivePressOut: function(e: Event) { + if (!this._hideTimeout) { + this._hideUnderlay(); + } + this.props.onPressOut && this.props.onPressOut(e); + }, + + touchableHandlePress: function(e: Event) { + this.clearTimeout(this._hideTimeout); + this._showUnderlay(); + this._hideTimeout = this.setTimeout(this._hideUnderlay, + this.props.delayPressOut || 100); + this.props.onPress && this.props.onPress(e); + }, + + touchableHandleLongPress: function(e: Event) { + this.props.onLongPress && this.props.onLongPress(e); + }, + + touchableGetPressRectOffset: function() { + return PRESS_RECT_OFFSET; // Always make sure to predeclare a constant! + }, + + touchableGetHighlightDelayMS: function() { + return this.props.delayPressIn; + }, + + touchableGetLongPressDelayMS: function() { + return this.props.delayLongPress; + }, + + touchableGetPressOutDelayMS: function() { + return this.props.delayPressOut; + }, + + _showUnderlay: function() { + if (!this.isMounted()) { + return; + } + + this.refs[UNDERLAY_REF].setNativeProps(this.state.activeUnderlayProps); + this.refs[CHILD_REF].setNativeProps(this.state.activeProps); + this.props.onShowUnderlay && this.props.onShowUnderlay(); + }, + + _hideUnderlay: function() { + this.clearTimeout(this._hideTimeout); + this._hideTimeout = null; + if (this.refs[UNDERLAY_REF]) { + this.refs[CHILD_REF].setNativeProps(INACTIVE_CHILD_PROPS); + this.refs[UNDERLAY_REF].setNativeProps({ + ...INACTIVE_UNDERLAY_PROPS, + style: this.state.underlayStyle, + }); + this.props.onHideUnderlay && this.props.onHideUnderlay(); + } + }, + + render: function() { + return ( + + {cloneWithProps( + onlyChild(this.props.children), + { + ref: CHILD_REF, + } + )} + + ); + } +}); + +var PRESS_RECT_OFFSET = {top: 20, left: 20, right: 20, bottom: 30}; +var CHILD_REF = keyOf({childRef: null}); +var UNDERLAY_REF = keyOf({underlayRef: null}); +var INACTIVE_CHILD_PROPS = { + style: StyleSheet.create({x: {opacity: 1.0}}).x, +}; +var INACTIVE_UNDERLAY_PROPS = { + style: StyleSheet.create({x: {backgroundColor: 'transparent'}}).x, +}; + +module.exports = TouchableHighlight; diff --git a/ios/Pods/React/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js b/ios/Pods/React/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js new file mode 100644 index 00000000..4596e8d2 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/TouchableNativeFeedback.ios.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TouchableNativeFeedback + */ + +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); + +var DummyTouchableNativeFeedback = React.createClass({ + render: function() { + return ( + + TouchableNativeFeedback is not supported on this platform! + + ); + }, +}); + +var styles = StyleSheet.create({ + container: { + height: 100, + width: 300, + backgroundColor: '#ffbcbc', + borderWidth: 1, + borderColor: 'red', + alignItems: 'center', + justifyContent: 'center', + margin: 10, + }, + info: { + color: '#333333', + margin: 20, + } +}); + +module.exports = DummyTouchableNativeFeedback; diff --git a/ios/Pods/React/Libraries/Components/Touchable/TouchableOpacity.js b/ios/Pods/React/Libraries/Components/Touchable/TouchableOpacity.js new file mode 100644 index 00000000..7564a1b6 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/TouchableOpacity.js @@ -0,0 +1,182 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TouchableOpacity + */ +'use strict'; + +// Note (avik): add @flow when Flow supports spread properties in propTypes + +var Animated = require('Animated'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var React = require('React'); +var TimerMixin = require('react-timer-mixin'); +var Touchable = require('Touchable'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); + +var ensurePositiveDelayProps = require('ensurePositiveDelayProps'); +var flattenStyle = require('flattenStyle'); +var keyOf = require('keyOf'); + +type Event = Object; + +/** + * A wrapper for making views respond properly to touches. + * On press down, the opacity of the wrapped view is decreased, dimming it. + * This is done without actually changing the view hierarchy, and in general is + * easy to add to an app without weird side-effects. + * + * Example: + * + * ``` + * renderButton: function() { + * return ( + * + * + * + * ); + * }, + * ``` + * > **NOTE**: TouchableOpacity supports only one child + * > + * > If you wish to have to have several child components, wrap them in a View. + */ + +var TouchableOpacity = React.createClass({ + mixins: [TimerMixin, Touchable.Mixin, NativeMethodsMixin], + + propTypes: { + ...TouchableWithoutFeedback.propTypes, + /** + * Determines what the opacity of the wrapped view should be when touch is + * active. + */ + activeOpacity: React.PropTypes.number, + }, + + getDefaultProps: function() { + return { + activeOpacity: 0.2, + }; + }, + + getInitialState: function() { + return { + ...this.touchableGetInitialState(), + anim: new Animated.Value(1), + }; + }, + + componentDidMount: function() { + ensurePositiveDelayProps(this.props); + }, + + componentWillReceiveProps: function(nextProps) { + ensurePositiveDelayProps(nextProps); + }, + + setOpacityTo: function(value) { + Animated.timing( + this.state.anim, + {toValue: value, duration: 150} + ).start(); + }, + + /** + * `Touchable.Mixin` self callbacks. The mixin will invoke these if they are + * defined on your component. + */ + touchableHandleActivePressIn: function(e: Event) { + this.clearTimeout(this._hideTimeout); + this._hideTimeout = null; + this._opacityActive(); + this.props.onPressIn && this.props.onPressIn(e); + }, + + touchableHandleActivePressOut: function(e: Event) { + if (!this._hideTimeout) { + this._opacityInactive(); + } + this.props.onPressOut && this.props.onPressOut(e); + }, + + touchableHandlePress: function(e: Event) { + this.clearTimeout(this._hideTimeout); + this._opacityActive(); + this._hideTimeout = this.setTimeout( + this._opacityInactive, + this.props.delayPressOut || 100 + ); + this.props.onPress && this.props.onPress(e); + }, + + touchableHandleLongPress: function(e: Event) { + this.props.onLongPress && this.props.onLongPress(e); + }, + + touchableGetPressRectOffset: function() { + return PRESS_RECT_OFFSET; // Always make sure to predeclare a constant! + }, + + touchableGetHighlightDelayMS: function() { + return this.props.delayPressIn || 0; + }, + + touchableGetLongPressDelayMS: function() { + return this.props.delayLongPress === 0 ? 0 : + this.props.delayLongPress || 500; + }, + + touchableGetPressOutDelayMS: function() { + return this.props.delayPressOut; + }, + + _opacityActive: function() { + this.setOpacityTo(this.props.activeOpacity); + }, + + _opacityInactive: function() { + this.clearTimeout(this._hideTimeout); + this._hideTimeout = null; + var childStyle = flattenStyle(this.props.style) || {}; + this.setOpacityTo( + childStyle.opacity === undefined ? 1 : childStyle.opacity + ); + }, + + render: function() { + return ( + + {this.props.children} + + ); + }, +}); + +/** + * When the scroll view is disabled, this defines how far your touch may move + * off of the button, before deactivating the button. Once deactivated, try + * moving it back and you'll see that the button is once again reactivated! + * Move it back and forth several times while the scroll view is disabled. + */ +var PRESS_RECT_OFFSET = {top: 20, left: 20, right: 20, bottom: 30}; + + +module.exports = TouchableOpacity; diff --git a/ios/Pods/React/Libraries/Components/Touchable/TouchableWithoutFeedback.js b/ios/Pods/React/Libraries/Components/Touchable/TouchableWithoutFeedback.js new file mode 100755 index 00000000..d8b17118 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/TouchableWithoutFeedback.js @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule TouchableWithoutFeedback + * @flow + */ +'use strict'; + +var React = require('React'); +var TimerMixin = require('react-timer-mixin'); +var Touchable = require('Touchable'); +var ensurePositiveDelayProps = require('ensurePositiveDelayProps'); +var onlyChild = require('onlyChild'); + +type Event = Object; + +/** + * When the scroll view is disabled, this defines how far your touch may move + * off of the button, before deactivating the button. Once deactivated, try + * moving it back and you'll see that the button is once again reactivated! + * Move it back and forth several times while the scroll view is disabled. + */ +var PRESS_RECT_OFFSET = {top: 20, left: 20, right: 20, bottom: 30}; + +/** + * Do not use unless you have a very good reason. All the elements that + * respond to press should have a visual feedback when touched. This is + * one of the primary reason a "web" app doesn't feel "native". + */ +var TouchableWithoutFeedback = React.createClass({ + mixins: [TimerMixin, Touchable.Mixin], + + propTypes: { + /** + * Called when the touch is released, but not if cancelled (e.g. by a scroll + * that steals the responder lock). + */ + accessible: React.PropTypes.bool, + onPress: React.PropTypes.func, + onPressIn: React.PropTypes.func, + onPressOut: React.PropTypes.func, + onLongPress: React.PropTypes.func, + /** + * Delay in ms, from the start of the touch, before onPressIn is called. + */ + delayPressIn: React.PropTypes.number, + /** + * Delay in ms, from the release of the touch, before onPressOut is called. + */ + delayPressOut: React.PropTypes.number, + /** + * Delay in ms, from onPressIn, before onLongPress is called. + */ + delayLongPress: React.PropTypes.number, + }, + + getInitialState: function() { + return this.touchableGetInitialState(); + }, + + componentDidMount: function() { + ensurePositiveDelayProps(this.props); + }, + + componentWillReceiveProps: function(nextProps: Object) { + ensurePositiveDelayProps(nextProps); + }, + + /** + * `Touchable.Mixin` self callbacks. The mixin will invoke these if they are + * defined on your component. + */ + touchableHandlePress: function(e: Event) { + this.props.onPress && this.props.onPress(e); + }, + + touchableHandleActivePressIn: function(e: Event) { + this.props.onPressIn && this.props.onPressIn(e); + }, + + touchableHandleActivePressOut: function(e: Event) { + this.props.onPressOut && this.props.onPressOut(e); + }, + + touchableHandleLongPress: function(e: Event) { + this.props.onLongPress && this.props.onLongPress(e); + }, + + touchableGetPressRectOffset: function(): typeof PRESS_RECT_OFFSET { + return PRESS_RECT_OFFSET; // Always make sure to predeclare a constant! + }, + + touchableGetHighlightDelayMS: function(): number { + return this.props.delayPressIn || 0; + }, + + touchableGetLongPressDelayMS: function(): number { + return this.props.delayLongPress === 0 ? 0 : + this.props.delayLongPress || 500; + }, + + touchableGetPressOutDelayMS: function(): number { + return this.props.delayPressOut || 0; + }, + + render: function(): ReactElement { + // Note(avik): remove dynamic typecast once Flow has been upgraded + return (React: any).cloneElement(onlyChild(this.props.children), { + accessible: this.props.accessible !== false, + testID: this.props.testID, + onStartShouldSetResponder: this.touchableHandleStartShouldSetResponder, + onResponderTerminationRequest: this.touchableHandleResponderTerminationRequest, + onResponderGrant: this.touchableHandleResponderGrant, + onResponderMove: this.touchableHandleResponderMove, + onResponderRelease: this.touchableHandleResponderRelease, + onResponderTerminate: this.touchableHandleResponderTerminate + }); + } +}); + +module.exports = TouchableWithoutFeedback; diff --git a/ios/Pods/React/Libraries/Components/Touchable/ensureComponentIsNative.js b/ios/Pods/React/Libraries/Components/Touchable/ensureComponentIsNative.js new file mode 100644 index 00000000..944093f7 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/ensureComponentIsNative.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ensureComponentIsNative + * @flow + */ +'use strict'; + +var invariant = require('invariant'); + +var ensureComponentIsNative = function(component: any) { + invariant( + component && typeof component.setNativeProps === 'function', + 'Touchable child must either be native or forward setNativeProps to a ' + + 'native component' + ); +}; + +module.exports = ensureComponentIsNative; diff --git a/ios/Pods/React/Libraries/Components/Touchable/ensurePositiveDelayProps.js b/ios/Pods/React/Libraries/Components/Touchable/ensurePositiveDelayProps.js new file mode 100644 index 00000000..4c6525a5 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/Touchable/ensurePositiveDelayProps.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ensurePositiveDelayProps + * @flow + */ +'use strict'; + +var invariant = require('invariant'); + +var ensurePositiveDelayProps = function(props: any) { + invariant( + !(props.delayPressIn < 0 || props.delayPressOut < 0 || + props.delayLongPress < 0), + 'Touchable components cannot have negative delay properties' + ); +}; + +module.exports = ensurePositiveDelayProps; diff --git a/ios/Pods/React/Libraries/Components/UnimplementedViews/UnimplementedView.js b/ios/Pods/React/Libraries/Components/UnimplementedViews/UnimplementedView.js new file mode 100644 index 00000000..6aebef38 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/UnimplementedViews/UnimplementedView.js @@ -0,0 +1,37 @@ +/** + * Common implementation for a simple stubbed view. Simply applies the view's styles to the inner + * View component and renders its children. + * + * @providesModule UnimplementedView + */ + +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var UnimplementedView = React.createClass({ + setNativeProps: function() { + // Do nothing. + // This method is required in order to use this view as a Touchable* child. + // See ensureComponentIsNative.js for more info + }, + render: function() { + return ( + + {this.props.children} + + ); + }, +}); + +var styles = StyleSheet.create({ + unimplementedView: { + borderWidth: 1, + borderColor: 'red', + alignSelf: 'flex-start', + } +}); + +module.exports = UnimplementedView; diff --git a/ios/Pods/React/Libraries/Components/View/View.js b/ios/Pods/React/Libraries/Components/View/View.js new file mode 100644 index 00000000..8594cfe8 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/View/View.js @@ -0,0 +1,306 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule View + * @flow + */ +'use strict'; + +var NativeMethodsMixin = require('NativeMethodsMixin'); +var PropTypes = require('ReactPropTypes'); +var RCTUIManager = require('NativeModules').UIManager; +var React = require('React'); +var ReactNativeStyleAttributes = require('ReactNativeStyleAttributes'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var StyleSheetPropType = require('StyleSheetPropType'); +var ViewStylePropTypes = require('ViewStylePropTypes'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); + +var stylePropType = StyleSheetPropType(ViewStylePropTypes); + +var AccessibilityTraits = [ + 'none', + 'button', + 'link', + 'header', + 'search', + 'image', + 'selected', + 'plays', + 'key', + 'text', + 'summary', + 'disabled', + 'frequentUpdates', + 'startsMedia', + 'adjustable', + 'allowsDirectInteraction', + 'pageTurn', +]; + +/** + * The most fundamental component for building UI, `View` is a + * container that supports layout with flexbox, style, some touch handling, and + * accessibility controls, and is designed to be nested inside other views and + * to have 0 to many children of any type. `View` maps directly to the native + * view equivalent on whatever platform React is running on, whether that is a + * `UIView`, `
`, `android.view`, etc. This example creates a `View` that + * wraps two colored boxes and custom component in a row with padding. + * + * ``` + * + * + * + * + * + * ``` + * + * `View`s are designed to be used with `StyleSheet`s for clarity and + * performance, although inline styles are also supported. + */ +var View = React.createClass({ + mixins: [NativeMethodsMixin], + + /** + * `NativeMethodsMixin` will look for this when invoking `setNativeProps`. We + * make `this` look like an actual native component class. + */ + viewConfig: { + uiViewClassName: 'RCTView', + validAttributes: ReactNativeViewAttributes.RCTView + }, + + propTypes: { + /** + * When true, indicates that the view is an accessibility element. By default, + * all the touchable elements are accessible. + */ + accessible: PropTypes.bool, + + /** + * Overrides the text that's read by the screen reader when the user interacts + * with the element. By default, the label is constructed by traversing all the + * children and accumulating all the Text nodes separated by space. + */ + accessibilityLabel: PropTypes.string, + + /** + * Indicates to accessibility services to treat UI component like a + * native one. Works for Android only. + * @platform android + */ + accessibilityComponentType: PropTypes.oneOf([ + 'none', + 'button', + 'radiobutton_checked', + 'radiobutton_unchecked', + ]), + + /** + * Indicates to accessibility services whether the user should be notified + * when this view changes. Works for Android API >= 19 only. + * See http://developer.android.com/reference/android/view/View.html#attr_android:accessibilityLiveRegion + * for references. + * @platform android + */ + accessibilityLiveRegion: PropTypes.oneOf([ + 'none', + 'polite', + 'assertive', + ]), + + /** + * Controls how view is important for accessibility which is if it + * fires accessibility events and if it is reported to accessibility services + * that query the screen. Works for Android only. + * See http://developer.android.com/reference/android/R.attr.html#importantForAccessibility + * for references. + * Possible values: + * 'auto' - The system determines whether the view is important for accessibility - + * default (recommended). + * 'yes' - The view is important for accessibility. + * 'no' - The view is not important for accessibility. + * 'no-hide-descendants' - The view is not important for accessibility, + * nor are any of its descendant views. + * + * @platform android + */ + importantForAccessibility: PropTypes.oneOf([ + 'auto', + 'yes', + 'no', + 'no-hide-descendants', + ]), + + /** + * Provides additional traits to screen reader. By default no traits are + * provided unless specified otherwise in element + * @platform ios + */ + accessibilityTraits: PropTypes.oneOfType([ + PropTypes.oneOf(AccessibilityTraits), + PropTypes.arrayOf(PropTypes.oneOf(AccessibilityTraits)), + ]), + + /** + * When `accessible` is true, the system will try to invoke this function + * when the user performs accessibility tap gesture. + */ + onAcccessibilityTap: PropTypes.func, + + /** + * When `accessible` is true, the system will invoke this function when the + * user performs the magic tap gesture. + */ + onMagicTap: PropTypes.func, + + /** + * Used to locate this view in end-to-end tests. NB: disables the 'layout-only + * view removal' optimization for this view! + */ + testID: PropTypes.string, + + /** + * For most touch interactions, you'll simply want to wrap your component in + * `TouchableHighlight` or `TouchableOpacity`. Check out `Touchable.js`, + * `ScrollResponder.js` and `ResponderEventPlugin.js` for more discussion. + */ + onMoveShouldSetResponder: PropTypes.func, + onResponderGrant: PropTypes.func, + onResponderMove: PropTypes.func, + onResponderReject: PropTypes.func, + onResponderRelease: PropTypes.func, + onResponderTerminate: PropTypes.func, + onResponderTerminationRequest: PropTypes.func, + onStartShouldSetResponder: PropTypes.func, + onStartShouldSetResponderCapture: PropTypes.func, + + /** + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. + */ + onLayout: PropTypes.func, + + /** + * In the absence of `auto` property, `none` is much like `CSS`'s `none` + * value. `box-none` is as if you had applied the `CSS` class: + * + * ``` + * .box-none { + * pointer-events: none; + * } + * .box-none * { + * pointer-events: all; + * } + * ``` + * + * `box-only` is the equivalent of + * + * ``` + * .box-only { + * pointer-events: all; + * } + * .box-only * { + * pointer-events: none; + * } + * ``` + * + * But since `pointerEvents` does not affect layout/appearance, and we are + * already deviating from the spec by adding additional modes, we opt to not + * include `pointerEvents` on `style`. On some platforms, we would need to + * implement it as a `className` anyways. Using `style` or not is an + * implementation detail of the platform. + */ + pointerEvents: PropTypes.oneOf([ + 'box-none', + 'none', + 'box-only', + 'auto', + ]), + style: stylePropType, + + /** + * This is a special performance property exposed by RCTView and is useful + * for scrolling content when there are many subviews, most of which are + * offscreen. For this property to be effective, it must be applied to a + * view that contains many subviews that extend outside its bound. The + * subviews must also have overflow: hidden, as should the containing view + * (or one of its superviews). + */ + removeClippedSubviews: PropTypes.bool, + + /** + * Whether this view should render itself (and all of its children) into a + * single hardware texture on the GPU. + * + * On Android, this is useful for animations and interactions that only + * modify opacity, rotation, translation, and/or scale: in those cases, the + * view doesn't have to be redrawn and display lists don't need to be + * re-executed. The texture can just be re-used and re-composited with + * different parameters. The downside is that this can use up limited video + * memory, so this prop should be set back to false at the end of the + * interaction/animation. + * @platform android + */ + renderToHardwareTextureAndroid: PropTypes.bool, + + /** + * Whether this view should be rendered as a bitmap before compositing. + * + * On iOS, this is useful for animations and interactions that do not + * modify this component's dimensions nor its children; for example, when + * translating the position of a static view, rasterization allows the + * renderer to reuse a cached bitmap of a static view and quickly composite + * it during each frame. + * + * Rasterization incurs an off-screen drawing pass and the bitmap consumes + * memory. Test and measure when using this property. + * @platform ios + */ + shouldRasterizeIOS: PropTypes.bool, + + /** + * Views that are only used to layout their children or otherwise don't draw + * anything may be automatically removed from the native hierarchy as an + * optimization. Set this property to `false` to disable this optimization and + * ensure that this View exists in the native view hierarchy. + * @platform android + */ + collapsable: PropTypes.bool, + }, + + render: function() { + return ; + }, +}); + +var RCTView = createReactNativeComponentClass({ + validAttributes: ReactNativeViewAttributes.RCTView, + uiViewClassName: 'RCTView', +}); +RCTView.propTypes = View.propTypes; +if (__DEV__) { + var viewConfig = RCTUIManager.viewConfigs && RCTUIManager.viewConfigs.RCTView || {}; + for (var prop in viewConfig.nativeProps) { + var viewAny: any = View; // Appease flow + if (!viewAny.propTypes[prop] && !ReactNativeStyleAttributes[prop]) { + throw new Error( + 'View is missing propType for native prop `' + prop + '`' + ); + } + } +} + +var ViewToExport = RCTView; +if (__DEV__) { + ViewToExport = View; +} + +module.exports = ViewToExport; diff --git a/ios/Pods/React/Libraries/Components/View/ViewStylePropTypes.js b/ios/Pods/React/Libraries/Components/View/ViewStylePropTypes.js new file mode 100644 index 00000000..64ace6d7 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/View/ViewStylePropTypes.js @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ViewStylePropTypes + * @flow + */ +'use strict'; + +var LayoutPropTypes = require('LayoutPropTypes'); +var ReactPropTypes = require('ReactPropTypes'); +var TransformPropTypes = require('TransformPropTypes'); + +/** + * Warning: Some of these properties may not be supported in all releases. + */ +var ViewStylePropTypes = { + ...LayoutPropTypes, + ...TransformPropTypes, + backfaceVisibility: ReactPropTypes.oneOf(['visible', 'hidden']), + backgroundColor: ReactPropTypes.string, + borderColor: ReactPropTypes.string, + borderTopColor: ReactPropTypes.string, + borderRightColor: ReactPropTypes.string, + borderBottomColor: ReactPropTypes.string, + borderLeftColor: ReactPropTypes.string, + borderRadius: ReactPropTypes.number, + borderTopLeftRadius: ReactPropTypes.number, + borderTopRightRadius: ReactPropTypes.number, + borderBottomLeftRadius: ReactPropTypes.number, + borderBottomRightRadius: ReactPropTypes.number, + borderStyle: ReactPropTypes.oneOf(['solid', 'dotted', 'dashed']), + opacity: ReactPropTypes.number, + overflow: ReactPropTypes.oneOf(['visible', 'hidden']), + shadowColor: ReactPropTypes.string, + shadowOffset: ReactPropTypes.shape( + {width: ReactPropTypes.number, height: ReactPropTypes.number} + ), + shadowOpacity: ReactPropTypes.number, + shadowRadius: ReactPropTypes.number, +}; + +module.exports = ViewStylePropTypes; diff --git a/ios/Pods/React/Libraries/Components/WebView/WebView.android.js b/ios/Pods/React/Libraries/Components/WebView/WebView.android.js new file mode 100644 index 00000000..274d7672 --- /dev/null +++ b/ios/Pods/React/Libraries/Components/WebView/WebView.android.js @@ -0,0 +1,207 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule WebView + */ +'use strict'; + +var EdgeInsetsPropType = require('EdgeInsetsPropType'); +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var createReactNativeComponentClass = require('createReactNativeComponentClass'); +var keyMirror = require('keyMirror'); +var merge = require('merge'); + +var PropTypes = React.PropTypes; +var RCTUIManager = require('NativeModules').UIManager; + +var RCT_WEBVIEW_REF = 'webview'; + +var WebViewState = keyMirror({ + IDLE: null, + LOADING: null, + ERROR: null, +}); + +var WebView = React.createClass({ + + propTypes: { + renderError: PropTypes.func, // view to show if there's an error + renderLoading: PropTypes.func, // loading indicator to show + url: PropTypes.string, + html: PropTypes.string, + automaticallyAdjustContentInsets: PropTypes.bool, + contentInset: EdgeInsetsPropType, + onNavigationStateChange: PropTypes.func, + startInLoadingState: PropTypes.bool, // force WebView to show loadingView on first load + style: View.propTypes.style, + javaScriptEnabledAndroid: PropTypes.bool, + + /** + * Sets the JS to be injected when the webpage loads. + */ + injectedJavaScript: PropTypes.string, + + /** + * Sets the user-agent for this WebView. The user-agent can also be set in native through + * WebViewConfig, but this can and will overwrite that config. + */ + userAgent: PropTypes.string, + /** + * Used to locate this view in end-to-end tests. + */ + testID: PropTypes.string, + }, + + getInitialState: function() { + return { + viewState: WebViewState.IDLE, + lastErrorEvent: null, + startInLoadingState: true, + }; + }, + + componentWillMount: function() { + if (this.props.startInLoadingState) { + this.setState({viewState: WebViewState.LOADING}); + } + }, + + render: function() { + var otherView = null; + + if (this.state.viewState === WebViewState.LOADING) { + otherView = this.props.renderLoading && this.props.renderLoading(); + } else if (this.state.viewState === WebViewState.ERROR) { + var errorEvent = this.state.lastErrorEvent; + otherView = this.props.renderError && this.props.renderError( + errorEvent.domain, + errorEvent.code, + errorEvent.description); + } else if (this.state.viewState !== WebViewState.IDLE) { + console.error('RCTWebView invalid state encountered: ' + this.state.loading); + } + + var webViewStyles = [styles.container, this.props.style]; + if (this.state.viewState === WebViewState.LOADING || + this.state.viewState === WebViewState.ERROR) { + // if we're in either LOADING or ERROR states, don't show the webView + webViewStyles.push(styles.hidden); + } + + var webView = + ; + + return ( + + {webView} + {otherView} + + ); + }, + + goForward: function() { + RCTUIManager.dispatchViewManagerCommand( + this.getWebWiewHandle(), + RCTUIManager.RCTWebView.Commands.goForward, + null + ); + }, + + goBack: function() { + RCTUIManager.dispatchViewManagerCommand( + this.getWebWiewHandle(), + RCTUIManager.RCTWebView.Commands.goBack, + null + ); + }, + + reload: function() { + RCTUIManager.dispatchViewManagerCommand( + this.getWebWiewHandle(), + RCTUIManager.RCTWebView.Commands.reload, + null + ); + }, + + /** + * We return an event with a bunch of fields including: + * url, title, loading, canGoBack, canGoForward + */ + updateNavigationState: function(event) { + if (this.props.onNavigationStateChange) { + this.props.onNavigationStateChange(event.nativeEvent); + } + }, + + getWebWiewHandle: function() { + return React.findNodeHandle(this.refs[RCT_WEBVIEW_REF]); + }, + + onLoadingStart: function(event) { + this.updateNavigationState(event); + }, + + onLoadingError: function(event) { + event.persist(); // persist this event because we need to store it + console.error('Encountered an error loading page', event.nativeEvent); + + this.setState({ + lastErrorEvent: event.nativeEvent, + viewState: WebViewState.ERROR + }); + }, + + onLoadingFinish: function(event) { + this.setState({ + viewState: WebViewState.IDLE, + }); + this.updateNavigationState(event); + }, +}); + +var RCTWebView = createReactNativeComponentClass({ + validAttributes: merge(ReactNativeViewAttributes.UIView, { + html: true, + injectedJavaScript: true, + javaScriptEnabledAndroid: true, + url: true, + userAgent: true, + }), + uiViewClassName: 'RCTWebView', +}); + +var styles = StyleSheet.create({ + container: { + flex: 1, + }, + hidden: { + height: 0, + flex: 0, // disable 'flex:1' when hiding a View + }, +}); + +module.exports = WebView; diff --git a/ios/Pods/React/Libraries/Components/WebView/WebView.ios.js b/ios/Pods/React/Libraries/Components/WebView/WebView.ios.js new file mode 100644 index 00000000..3308842a --- /dev/null +++ b/ios/Pods/React/Libraries/Components/WebView/WebView.ios.js @@ -0,0 +1,266 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule WebView + * @flow + */ +'use strict'; + +var ActivityIndicatorIOS = require('ActivityIndicatorIOS'); +var EdgeInsetsPropType = require('EdgeInsetsPropType'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); + +var invariant = require('invariant'); +var keyMirror = require('keyMirror'); +var requireNativeComponent = require('requireNativeComponent'); + +var PropTypes = React.PropTypes; +var RCTWebViewManager = require('NativeModules').WebViewManager; + +var BGWASH = 'rgba(255,255,255,0.8)'; +var RCT_WEBVIEW_REF = 'webview'; + +var WebViewState = keyMirror({ + IDLE: null, + LOADING: null, + ERROR: null, +}); + +var NavigationType = { + click: RCTWebViewManager.NavigationType.LinkClicked, + formsubmit: RCTWebViewManager.NavigationType.FormSubmitted, + backforward: RCTWebViewManager.NavigationType.BackForward, + reload: RCTWebViewManager.NavigationType.Reload, + formresubmit: RCTWebViewManager.NavigationType.FormResubmitted, + other: RCTWebViewManager.NavigationType.Other, +}; + +var JSNavigationScheme = RCTWebViewManager.JSNavigationScheme; + +type ErrorEvent = { + domain: any; + code: any; + description: any; +} + +type Event = Object; + +var defaultRenderLoading = () => ( + + + +); +var defaultRenderError = (errorDomain, errorCode, errorDesc) => ( + + + Error loading page + + + {'Domain: ' + errorDomain} + + + {'Error Code: ' + errorCode} + + + {'Description: ' + errorDesc} + + +); + +var WebView = React.createClass({ + statics: { + JSNavigationScheme: JSNavigationScheme, + NavigationType: NavigationType, + }, + + propTypes: { + url: PropTypes.string, + html: PropTypes.string, + renderError: PropTypes.func, // view to show if there's an error + renderLoading: PropTypes.func, // loading indicator to show + bounces: PropTypes.bool, + scrollEnabled: PropTypes.bool, + automaticallyAdjustContentInsets: PropTypes.bool, + contentInset: EdgeInsetsPropType, + onNavigationStateChange: PropTypes.func, + startInLoadingState: PropTypes.bool, // force WebView to show loadingView on first load + style: View.propTypes.style, + /** + * Used for android only, JS is enabled by default for WebView on iOS + */ + javaScriptEnabledAndroid: PropTypes.bool, + /** + * Sets the JS to be injected when the webpage loads. + */ + injectedJavaScript: PropTypes.string, + + /** + * Used for iOS only, sets whether the webpage scales to fit the view and the + * user can change the scale + */ + scalesPageToFit: PropTypes.bool, + }, + + getInitialState: function() { + return { + viewState: WebViewState.IDLE, + lastErrorEvent: (null: ?ErrorEvent), + startInLoadingState: true, + }; + }, + + componentWillMount: function() { + if (this.props.startInLoadingState) { + this.setState({viewState: WebViewState.LOADING}); + } + }, + + render: function() { + var otherView = null; + + if (this.state.viewState === WebViewState.LOADING) { + otherView = (this.props.renderLoading || defaultRenderLoading)(); + } else if (this.state.viewState === WebViewState.ERROR) { + var errorEvent = this.state.lastErrorEvent; + invariant( + errorEvent != null, + 'lastErrorEvent expected to be non-null' + ); + otherView = (this.props.renderError || defaultRenderError)( + errorEvent.domain, + errorEvent.code, + errorEvent.description + ); + } else if (this.state.viewState !== WebViewState.IDLE) { + console.error( + 'RCTWebView invalid state encountered: ' + this.state.loading + ); + } + + var webViewStyles = [styles.container, styles.webView, this.props.style]; + if (this.state.viewState === WebViewState.LOADING || + this.state.viewState === WebViewState.ERROR) { + // if we're in either LOADING or ERROR states, don't show the webView + webViewStyles.push(styles.hidden); + } + + var webView = + ; + + return ( + + {webView} + {otherView} + + ); + }, + + goForward: function() { + RCTWebViewManager.goForward(this.getWebViewHandle()); + }, + + goBack: function() { + RCTWebViewManager.goBack(this.getWebViewHandle()); + }, + + reload: function() { + RCTWebViewManager.reload(this.getWebViewHandle()); + }, + + /** + * We return an event with a bunch of fields including: + * url, title, loading, canGoBack, canGoForward + */ + updateNavigationState: function(event: Event) { + if (this.props.onNavigationStateChange) { + this.props.onNavigationStateChange(event.nativeEvent); + } + }, + + getWebViewHandle: function(): any { + return React.findNodeHandle(this.refs[RCT_WEBVIEW_REF]); + }, + + onLoadingStart: function(event: Event) { + this.updateNavigationState(event); + }, + + onLoadingError: function(event: Event) { + event.persist(); // persist this event because we need to store it + console.error('Encountered an error loading page', event.nativeEvent); + + this.setState({ + lastErrorEvent: event.nativeEvent, + viewState: WebViewState.ERROR + }); + }, + + onLoadingFinish: function(event: Event) { + this.setState({ + viewState: WebViewState.IDLE, + }); + this.updateNavigationState(event); + }, +}); + +var RCTWebView = requireNativeComponent('RCTWebView', WebView); + +var styles = StyleSheet.create({ + container: { + flex: 1, + }, + errorContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: BGWASH, + }, + errorText: { + fontSize: 14, + textAlign: 'center', + marginBottom: 2, + }, + errorTextTitle: { + fontSize: 15, + fontWeight: '500', + marginBottom: 10, + }, + hidden: { + height: 0, + flex: 0, // disable 'flex:1' when hiding a View + }, + loadingView: { + backgroundColor: BGWASH, + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + webView: { + backgroundColor: '#ffffff', + } +}); + +module.exports = WebView; diff --git a/ios/Pods/React/Libraries/CustomComponents/ListView/ListView.js b/ios/Pods/React/Libraries/CustomComponents/ListView/ListView.js new file mode 100644 index 00000000..4554eb68 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/ListView/ListView.js @@ -0,0 +1,588 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule ListView + */ +'use strict'; + +var ListViewDataSource = require('ListViewDataSource'); +var React = require('React'); +var RCTUIManager = require('NativeModules').UIManager; +var RCTScrollViewManager = require('NativeModules').ScrollViewManager; +var ScrollView = require('ScrollView'); +var ScrollResponder = require('ScrollResponder'); +var StaticRenderer = require('StaticRenderer'); +var TimerMixin = require('react-timer-mixin'); + +var isEmpty = require('isEmpty'); +var logError = require('logError'); +var merge = require('merge'); + +var PropTypes = React.PropTypes; + +var DEFAULT_PAGE_SIZE = 1; +var DEFAULT_INITIAL_ROWS = 10; +var DEFAULT_SCROLL_RENDER_AHEAD = 1000; +var DEFAULT_END_REACHED_THRESHOLD = 1000; +var DEFAULT_SCROLL_CALLBACK_THROTTLE = 50; +var SCROLLVIEW_REF = 'listviewscroll'; + + +/** + * ListView - A core component designed for efficient display of vertically + * scrolling lists of changing data. The minimal API is to create a + * `ListView.DataSource`, populate it with a simple array of data blobs, and + * instantiate a `ListView` component with that data source and a `renderRow` + * callback which takes a blob from the data array and returns a renderable + * component. + * + * Minimal example: + * + * ``` + * getInitialState: function() { + * var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); + * return { + * dataSource: ds.cloneWithRows(['row 1', 'row 2']), + * }; + * }, + * + * render: function() { + * return ( + * {rowData}} + * /> + * ); + * }, + * ``` + * + * ListView also supports more advanced features, including sections with sticky + * section headers, header and footer support, callbacks on reaching the end of + * the available data (`onEndReached`) and on the set of rows that are visible + * in the device viewport change (`onChangeVisibleRows`), and several + * performance optimizations. + * + * There are a few performance operations designed to make ListView scroll + * smoothly while dynamically loading potentially very large (or conceptually + * infinite) data sets: + * + * * Only re-render changed rows - the rowHasChanged function provided to the + * data source tells the ListView if it needs to re-render a row because the + * source data has changed - see ListViewDataSource for more details. + * + * * Rate-limited row rendering - By default, only one row is rendered per + * event-loop (customizable with the `pageSize` prop). This breaks up the + * work into smaller chunks to reduce the chance of dropping frames while + * rendering rows. + */ + +var ListView = React.createClass({ + mixins: [ScrollResponder.Mixin, TimerMixin], + + statics: { + DataSource: ListViewDataSource, + }, + + /** + * You must provide a renderRow function. If you omit any of the other render + * functions, ListView will simply skip rendering them. + * + * - renderRow(rowData, sectionID, rowID, highlightRow); + * - renderSectionHeader(sectionData, sectionID); + */ + propTypes: { + ...ScrollView.propTypes, + + dataSource: PropTypes.instanceOf(ListViewDataSource).isRequired, + /** + * (sectionID, rowID, adjacentRowHighlighted) => renderable + * If provided, a renderable component to be rendered as the separator + * below each row but not the last row if there is a section header below. + * Take a sectionID and rowID of the row above and whether its adjacent row + * is highlighted. + */ + renderSeparator: PropTypes.func, + /** + * (rowData, sectionID, rowID, highlightRow) => renderable + * Takes a data entry from the data source and its ids and should return + * a renderable component to be rendered as the row. By default the data + * is exactly what was put into the data source, but it's also possible to + * provide custom extractors. ListView can be notified when a row is + * being highlighted by calling highlightRow function. The separators above and + * below will be hidden when a row is highlighted. The highlighted state of + * a row can be reset by calling highlightRow(null). + */ + renderRow: PropTypes.func.isRequired, + /** + * How many rows to render on initial component mount. Use this to make + * it so that the first screen worth of data apears at one time instead of + * over the course of multiple frames. + */ + initialListSize: PropTypes.number, + /** + * Called when all rows have been rendered and the list has been scrolled + * to within onEndReachedThreshold of the bottom. The native scroll + * event is provided. + */ + onEndReached: PropTypes.func, + /** + * Threshold in pixels for onEndReached. + */ + onEndReachedThreshold: PropTypes.number, + /** + * Number of rows to render per event loop. + */ + pageSize: PropTypes.number, + /** + * () => renderable + * + * The header and footer are always rendered (if these props are provided) + * on every render pass. If they are expensive to re-render, wrap them + * in StaticContainer or other mechanism as appropriate. Footer is always + * at the bottom of the list, and header at the top, on every render pass. + */ + renderFooter: PropTypes.func, + renderHeader: PropTypes.func, + /** + * (sectionData, sectionID) => renderable + * + * If provided, a sticky header is rendered for this section. The sticky + * behavior means that it will scroll with the content at the top of the + * section until it reaches the top of the screen, at which point it will + * stick to the top until it is pushed off the screen by the next section + * header. + */ + renderSectionHeader: PropTypes.func, + /** + * (props) => renderable + * + * A function that returns the scrollable component in which the list rows + * are rendered. Defaults to returning a ScrollView with the given props. + */ + renderScrollComponent: React.PropTypes.func.isRequired, + /** + * How early to start rendering rows before they come on screen, in + * pixels. + */ + scrollRenderAheadDistance: React.PropTypes.number, + /** + * (visibleRows, changedRows) => void + * + * Called when the set of visible rows changes. `visibleRows` maps + * { sectionID: { rowID: true }} for all the visible rows, and + * `changedRows` maps { sectionID: { rowID: true | false }} for the rows + * that have changed their visibility, with true indicating visible, and + * false indicating the view has moved out of view. + */ + onChangeVisibleRows: React.PropTypes.func, + /** + * An experimental performance optimization for improving scroll perf of + * large lists, used in conjunction with overflow: 'hidden' on the row + * containers. Use at your own risk. + */ + removeClippedSubviews: React.PropTypes.bool, + }, + + /** + * Exports some data, e.g. for perf investigations or analytics. + */ + getMetrics: function() { + return { + contentLength: this.scrollProperties.contentLength, + totalRows: this.props.dataSource.getRowCount(), + renderedRows: this.state.curRenderedRowsCount, + visibleRows: Object.keys(this._visibleRows).length, + }; + }, + + /** + * Provides a handle to the underlying scroll responder to support operations + * such as scrollTo. + */ + getScrollResponder: function() { + return this.refs[SCROLLVIEW_REF] && + this.refs[SCROLLVIEW_REF].getScrollResponder && + this.refs[SCROLLVIEW_REF].getScrollResponder(); + }, + + setNativeProps: function(props) { + this.refs[SCROLLVIEW_REF].setNativeProps(props); + }, + + /** + * React life cycle hooks. + */ + + getDefaultProps: function() { + return { + initialListSize: DEFAULT_INITIAL_ROWS, + pageSize: DEFAULT_PAGE_SIZE, + renderScrollComponent: props => , + scrollRenderAheadDistance: DEFAULT_SCROLL_RENDER_AHEAD, + onEndReachedThreshold: DEFAULT_END_REACHED_THRESHOLD, + }; + }, + + getInitialState: function() { + return { + curRenderedRowsCount: this.props.initialListSize, + prevRenderedRowsCount: 0, + highlightedRow: {}, + }; + }, + + getInnerViewNode: function() { + return this.refs[SCROLLVIEW_REF].getInnerViewNode(); + }, + + componentWillMount: function() { + // this data should never trigger a render pass, so don't put in state + this.scrollProperties = { + visibleLength: null, + contentLength: null, + offset: 0 + }; + this._childFrames = []; + this._visibleRows = {}; + }, + + componentDidMount: function() { + // do this in animation frame until componentDidMount actually runs after + // the component is laid out + this.requestAnimationFrame(() => { + this._measureAndUpdateScrollProps(); + }); + }, + + componentWillReceiveProps: function(nextProps) { + if (this.props.dataSource !== nextProps.dataSource) { + this.setState((state, props) => { + var rowsToRender = Math.min( + state.curRenderedRowsCount + props.pageSize, + props.dataSource.getRowCount() + ); + return { + prevRenderedRowsCount: 0, + curRenderedRowsCount: rowsToRender, + }; + }); + } + }, + + componentDidUpdate: function() { + this.requestAnimationFrame(() => { + this._measureAndUpdateScrollProps(); + }); + }, + + onRowHighlighted: function(sectionID, rowID) { + this.setState({highlightedRow: {sectionID, rowID}}); + }, + + render: function() { + var bodyComponents = []; + + var dataSource = this.props.dataSource; + var allRowIDs = dataSource.rowIdentities; + var rowCount = 0; + var sectionHeaderIndices = []; + + var header = this.props.renderHeader && this.props.renderHeader(); + var footer = this.props.renderFooter && this.props.renderFooter(); + var totalIndex = header ? 1 : 0; + + for (var sectionIdx = 0; sectionIdx < allRowIDs.length; sectionIdx++) { + var sectionID = dataSource.sectionIdentities[sectionIdx]; + var rowIDs = allRowIDs[sectionIdx]; + if (rowIDs.length === 0) { + continue; + } + + if (this.props.renderSectionHeader) { + var shouldUpdateHeader = rowCount >= this.state.prevRenderedRowsCount && + dataSource.sectionHeaderShouldUpdate(sectionIdx); + bodyComponents.push( + + ); + sectionHeaderIndices.push(totalIndex++); + } + + for (var rowIdx = 0; rowIdx < rowIDs.length; rowIdx++) { + var rowID = rowIDs[rowIdx]; + var comboID = sectionID + rowID; + var shouldUpdateRow = rowCount >= this.state.prevRenderedRowsCount && + dataSource.rowShouldUpdate(sectionIdx, rowIdx); + var row = + ; + bodyComponents.push(row); + totalIndex++; + + if (this.props.renderSeparator && + (rowIdx !== rowIDs.length - 1 || sectionIdx === allRowIDs.length - 1)) { + var adjacentRowHighlighted = + this.state.highlightedRow.sectionID === sectionID && ( + this.state.highlightedRow.rowID === rowID || + this.state.highlightedRow.rowID === rowIDs[rowIdx + 1] + ); + var separator = this.props.renderSeparator( + sectionID, + rowID, + adjacentRowHighlighted + ); + bodyComponents.push(separator); + totalIndex++; + } + if (++rowCount === this.state.curRenderedRowsCount) { + break; + } + } + if (rowCount >= this.state.curRenderedRowsCount) { + break; + } + } + + var { + renderScrollComponent, + ...props, + } = this.props; + if (!props.scrollEventThrottle) { + props.scrollEventThrottle = DEFAULT_SCROLL_CALLBACK_THROTTLE; + } + Object.assign(props, { + onScroll: this._onScroll, + stickyHeaderIndices: sectionHeaderIndices, + + // Do not pass these events downstream to ScrollView since they will be + // registered in ListView's own ScrollResponder.Mixin + onKeyboardWillShow: undefined, + onKeyboardWillHide: undefined, + onKeyboardDidShow: undefined, + onKeyboardDidHide: undefined, + }); + + // TODO(ide): Use function refs so we can compose with the scroll + // component's original ref instead of clobbering it + return React.cloneElement(renderScrollComponent(props), { + ref: SCROLLVIEW_REF, + }, header, bodyComponents, footer); + }, + + /** + * Private methods + */ + + _measureAndUpdateScrollProps: function() { + var scrollComponent = this.getScrollResponder(); + if (!scrollComponent || !scrollComponent.getInnerViewNode) { + return; + } + RCTUIManager.measureLayout( + scrollComponent.getInnerViewNode(), + React.findNodeHandle(scrollComponent), + logError, + this._setScrollContentLength + ); + RCTUIManager.measureLayoutRelativeToParent( + React.findNodeHandle(scrollComponent), + logError, + this._setScrollVisibleLength + ); + + // RCTScrollViewManager.calculateChildFrames is not available on + // every platform + RCTScrollViewManager && RCTScrollViewManager.calculateChildFrames && + RCTScrollViewManager.calculateChildFrames( + React.findNodeHandle(scrollComponent), + this._updateChildFrames, + ); + }, + + _setScrollContentLength: function(left, top, width, height) { + this.scrollProperties.contentLength = !this.props.horizontal ? + height : width; + }, + + _setScrollVisibleLength: function(left, top, width, height) { + this.scrollProperties.visibleLength = !this.props.horizontal ? + height : width; + this._updateVisibleRows(); + this._renderMoreRowsIfNeeded(); + }, + + _updateChildFrames: function(childFrames) { + this._updateVisibleRows(childFrames); + }, + + _renderMoreRowsIfNeeded: function() { + if (this.scrollProperties.contentLength === null || + this.scrollProperties.visibleLength === null || + this.state.curRenderedRowsCount === this.props.dataSource.getRowCount()) { + return; + } + + var distanceFromEnd = this._getDistanceFromEnd(this.scrollProperties); + if (distanceFromEnd < this.props.scrollRenderAheadDistance) { + this._pageInNewRows(); + } + }, + + _pageInNewRows: function() { + this.setState((state, props) => { + var rowsToRender = Math.min( + state.curRenderedRowsCount + props.pageSize, + props.dataSource.getRowCount() + ); + return { + prevRenderedRowsCount: state.curRenderedRowsCount, + curRenderedRowsCount: rowsToRender + }; + }, () => { + this._measureAndUpdateScrollProps(); + this.setState(state => ({ + prevRenderedRowsCount: state.curRenderedRowsCount, + })); + }); + }, + + _getDistanceFromEnd: function(scrollProperties) { + return scrollProperties.contentLength - + scrollProperties.visibleLength - + scrollProperties.offset; + }, + + _updateVisibleRows: function(updatedFrames) { + if (!this.props.onChangeVisibleRows) { + return; // No need to compute visible rows if there is no callback + } + if (updatedFrames) { + updatedFrames.forEach((newFrame) => { + this._childFrames[newFrame.index] = merge(newFrame); + }); + } + var isVertical = !this.props.horizontal; + var dataSource = this.props.dataSource; + var visibleMin = this.scrollProperties.offset; + var visibleMax = visibleMin + this.scrollProperties.visibleLength; + var allRowIDs = dataSource.rowIdentities; + + var header = this.props.renderHeader && this.props.renderHeader(); + var totalIndex = header ? 1 : 0; + var visibilityChanged = false; + var changedRows = {}; + for (var sectionIdx = 0; sectionIdx < allRowIDs.length; sectionIdx++) { + var rowIDs = allRowIDs[sectionIdx]; + if (rowIDs.length === 0) { + continue; + } + var sectionID = dataSource.sectionIdentities[sectionIdx]; + if (this.props.renderSectionHeader) { + totalIndex++; + } + var visibleSection = this._visibleRows[sectionID]; + if (!visibleSection) { + visibleSection = {}; + } + for (var rowIdx = 0; rowIdx < rowIDs.length; rowIdx++) { + var rowID = rowIDs[rowIdx]; + var frame = this._childFrames[totalIndex]; + totalIndex++; + if (!frame) { + break; + } + var rowVisible = visibleSection[rowID]; + var min = isVertical ? frame.y : frame.x; + var max = min + (isVertical ? frame.height : frame.width); + if (min > visibleMax || max < visibleMin) { + if (rowVisible) { + visibilityChanged = true; + delete visibleSection[rowID]; + if (!changedRows[sectionID]) { + changedRows[sectionID] = {}; + } + changedRows[sectionID][rowID] = false; + } + } else if (!rowVisible) { + visibilityChanged = true; + visibleSection[rowID] = true; + if (!changedRows[sectionID]) { + changedRows[sectionID] = {}; + } + changedRows[sectionID][rowID] = true; + } + } + if (!isEmpty(visibleSection)) { + this._visibleRows[sectionID] = visibleSection; + } else if (this._visibleRows[sectionID]) { + delete this._visibleRows[sectionID]; + } + } + visibilityChanged && this.props.onChangeVisibleRows(this._visibleRows, changedRows); + }, + + _onScroll: function(e) { + var isVertical = !this.props.horizontal; + this.scrollProperties.visibleLength = e.nativeEvent.layoutMeasurement[ + isVertical ? 'height' : 'width' + ]; + this.scrollProperties.contentLength = e.nativeEvent.contentSize[ + isVertical ? 'height' : 'width' + ]; + this.scrollProperties.offset = e.nativeEvent.contentOffset[ + isVertical ? 'y' : 'x' + ]; + this._updateVisibleRows(e.nativeEvent.updatedChildFrames); + var nearEnd = this._getDistanceFromEnd(this.scrollProperties) < this.props.onEndReachedThreshold; + if (nearEnd && + this.props.onEndReached && + this.scrollProperties.contentLength !== this._sentEndForContentLength && + this.state.curRenderedRowsCount === this.props.dataSource.getRowCount()) { + this._sentEndForContentLength = this.scrollProperties.contentLength; + this.props.onEndReached(e); + } else { + this._renderMoreRowsIfNeeded(); + } + + this.props.onScroll && this.props.onScroll(e); + }, +}); + +module.exports = ListView; diff --git a/ios/Pods/React/Libraries/CustomComponents/ListView/ListViewDataSource.js b/ios/Pods/React/Libraries/CustomComponents/ListView/ListViewDataSource.js new file mode 100644 index 00000000..8af08f1c --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/ListView/ListViewDataSource.js @@ -0,0 +1,407 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule ListViewDataSource + * @typechecks + * @flow + */ +'use strict'; + +var invariant = require('invariant'); +var isEmpty = require('isEmpty'); +var warning = require('warning'); + +function defaultGetRowData( + dataBlob: any, + sectionID: number | string, + rowID: number | string +): any { + return dataBlob[sectionID][rowID]; +} + +function defaultGetSectionHeaderData( + dataBlob: any, + sectionID: number | string +): any { + return dataBlob[sectionID]; +} + +type differType = (data1: any, data2: any) => bool; + +type ParamType = { + rowHasChanged: differType; + getRowData: ?typeof defaultGetRowData; + sectionHeaderHasChanged: ?differType; + getSectionHeaderData: ?typeof defaultGetSectionHeaderData; +} + +/** + * Provides efficient data processing and access to the + * `ListView` component. A `ListViewDataSource` is created with functions for + * extracting data from the input blob, and comparing elements (with default + * implementations for convenience). The input blob can be as simple as an + * array of strings, or an object with rows nested inside section objects. + * + * To update the data in the datasource, use `cloneWithRows` (or + * `cloneWithRowsAndSections` if you care about sections). The data in the + * data source is immutable, so you can't modify it directly. The clone methods + * suck in the new data and compute a diff for each row so ListView knows + * whether to re-render it or not. + * + * In this example, a component receives data in chunks, handled by + * `_onDataArrived`, which concats the new data onto the old data and updates the + * data source. We use `concat` to create a new array - mutating `this._data`, + * e.g. with `this._data.push(newRowData)`, would be an error. `_rowHasChanged` + * understands the shape of the row data and knows how to efficiently compare + * it. + * + * ``` + * getInitialState: function() { + * var ds = new ListViewDataSource({rowHasChanged: this._rowHasChanged}); + * return {ds}; + * }, + * _onDataArrived(newData) { + * this._data = this._data.concat(newData); + * this.setState({ + * ds: this.state.ds.cloneWithRows(this._data) + * }); + * } + * ``` + */ + +class ListViewDataSource { + + /** + * You can provide custom extraction and `hasChanged` functions for section + * headers and rows. If absent, data will be extracted with the + * `defaultGetRowData` and `defaultGetSectionHeaderData` functions. + * + * The default extractor expects data of one of the following forms: + * + * { sectionID_1: { rowID_1: , ... }, ... } + * + * or + * + * { sectionID_1: [ , , ... ], ... } + * + * or + * + * [ [ , , ... ], ... ] + * + * The constructor takes in a params argument that can contain any of the + * following: + * + * - getRowData(dataBlob, sectionID, rowID); + * - getSectionHeaderData(dataBlob, sectionID); + * - rowHasChanged(prevRowData, nextRowData); + * - sectionHeaderHasChanged(prevSectionData, nextSectionData); + */ + constructor(params: ParamType) { + invariant( + params && typeof params.rowHasChanged === 'function', + 'Must provide a rowHasChanged function.' + ); + this._rowHasChanged = params.rowHasChanged; + this._getRowData = params.getRowData || defaultGetRowData; + this._sectionHeaderHasChanged = params.sectionHeaderHasChanged; + this._getSectionHeaderData = + params.getSectionHeaderData || defaultGetSectionHeaderData; + + this._dataBlob = null; + this._dirtyRows = []; + this._dirtySections = []; + this._cachedRowCount = 0; + + // These two private variables are accessed by outsiders because ListView + // uses them to iterate over the data in this class. + this.rowIdentities = []; + this.sectionIdentities = []; + } + + /** + * Clones this `ListViewDataSource` with the specified `dataBlob` and + * `rowIdentities`. The `dataBlob` is just an aribitrary blob of data. At + * construction an extractor to get the interesting informatoin was defined + * (or the default was used). + * + * The `rowIdentities` is is a 2D array of identifiers for rows. + * ie. [['a1', 'a2'], ['b1', 'b2', 'b3'], ...]. If not provided, it's + * assumed that the keys of the section data are the row identities. + * + * Note: This function does NOT clone the data in this data source. It simply + * passes the functions defined at construction to a new data source with + * the data specified. If you wish to maintain the existing data you must + * handle merging of old and new data separately and then pass that into + * this function as the `dataBlob`. + */ + cloneWithRows( + dataBlob: Array | {[key: string]: any}, + rowIdentities: ?Array + ): ListViewDataSource { + var rowIds = rowIdentities ? [rowIdentities] : null; + if (!this._sectionHeaderHasChanged) { + this._sectionHeaderHasChanged = () => false; + } + return this.cloneWithRowsAndSections({s1: dataBlob}, ['s1'], rowIds); + } + + /** + * This performs the same function as the `cloneWithRows` function but here + * you also specify what your `sectionIdentities` are. If you don't care + * about sections you should safely be able to use `cloneWithRows`. + * + * `sectionIdentities` is an array of identifiers for sections. + * ie. ['s1', 's2', ...]. If not provided, it's assumed that the + * keys of dataBlob are the section identities. + * + * Note: this returns a new object! + */ + cloneWithRowsAndSections( + dataBlob: any, + sectionIdentities: ?Array, + rowIdentities: ?Array> + ): ListViewDataSource { + invariant( + typeof this._sectionHeaderHasChanged === 'function', + 'Must provide a sectionHeaderHasChanged function with section data.' + ); + var newSource = new ListViewDataSource({ + getRowData: this._getRowData, + getSectionHeaderData: this._getSectionHeaderData, + rowHasChanged: this._rowHasChanged, + sectionHeaderHasChanged: this._sectionHeaderHasChanged, + }); + newSource._dataBlob = dataBlob; + if (sectionIdentities) { + newSource.sectionIdentities = sectionIdentities; + } else { + newSource.sectionIdentities = Object.keys(dataBlob); + } + if (rowIdentities) { + newSource.rowIdentities = rowIdentities; + } else { + newSource.rowIdentities = []; + newSource.sectionIdentities.forEach((sectionID) => { + newSource.rowIdentities.push(Object.keys(dataBlob[sectionID])); + }); + } + newSource._cachedRowCount = countRows(newSource.rowIdentities); + + newSource._calculateDirtyArrays( + this._dataBlob, + this.sectionIdentities, + this.rowIdentities + ); + + return newSource; + } + + getRowCount(): number { + return this._cachedRowCount; + } + + /** + * Returns if the row is dirtied and needs to be rerendered + */ + rowShouldUpdate(sectionIndex: number, rowIndex: number): bool { + var needsUpdate = this._dirtyRows[sectionIndex][rowIndex]; + warning(needsUpdate !== undefined, + 'missing dirtyBit for section, row: ' + sectionIndex + ', ' + rowIndex); + return needsUpdate; + } + + /** + * Gets the data required to render the row. + */ + getRowData(sectionIndex: number, rowIndex: number): any { + var sectionID = this.sectionIdentities[sectionIndex]; + var rowID = this.rowIdentities[sectionIndex][rowIndex]; + warning( + sectionID !== undefined && rowID !== undefined, + 'rendering invalid section, row: ' + sectionIndex + ', ' + rowIndex + ); + return this._getRowData(this._dataBlob, sectionID, rowID); + } + + /** + * Gets the rowID at index provided if the dataSource arrays were flattened, + * or null of out of range indexes. + */ + getRowIDForFlatIndex(index: number): ?string { + var accessIndex = index; + for (var ii = 0; ii < this.sectionIdentities.length; ii++) { + if (accessIndex >= this.rowIdentities[ii].length) { + accessIndex -= this.rowIdentities[ii].length; + } else { + return this.rowIdentities[ii][accessIndex]; + } + } + return null; + } + + /** + * Gets the sectionID at index provided if the dataSource arrays were flattened, + * or null for out of range indexes. + */ + getSectionIDForFlatIndex(index: number): ?string { + var accessIndex = index; + for (var ii = 0; ii < this.sectionIdentities.length; ii++) { + if (accessIndex >= this.rowIdentities[ii].length) { + accessIndex -= this.rowIdentities[ii].length; + } else { + return this.sectionIdentities[ii]; + } + } + return null; + } + + /** + * Returns an array containing the number of rows in each section + */ + getSectionLengths(): Array { + var results = []; + for (var ii = 0; ii < this.sectionIdentities.length; ii++) { + results.push(this.rowIdentities[ii].length); + } + return results; + } + + /** + * Returns if the section header is dirtied and needs to be rerendered + */ + sectionHeaderShouldUpdate(sectionIndex: number): bool { + var needsUpdate = this._dirtySections[sectionIndex]; + warning(needsUpdate !== undefined, + 'missing dirtyBit for section: ' + sectionIndex); + return needsUpdate; + } + + /** + * Gets the data required to render the section header + */ + getSectionHeaderData(sectionIndex: number): any { + if (!this._getSectionHeaderData) { + return null; + } + var sectionID = this.sectionIdentities[sectionIndex]; + warning(sectionID !== undefined, + 'renderSection called on invalid section: ' + sectionIndex); + return this._getSectionHeaderData(this._dataBlob, sectionID); + } + + /** + * Private members and methods. + */ + + _getRowData: typeof defaultGetRowData; + _getSectionHeaderData: typeof defaultGetSectionHeaderData; + _rowHasChanged: differType; + _sectionHeaderHasChanged: ?differType; + + _dataBlob: any; + _dirtyRows: Array>; + _dirtySections: Array; + _cachedRowCount: number; + + // These two 'protected' variables are accessed by ListView to iterate over + // the data in this class. + rowIdentities: Array>; + sectionIdentities: Array; + + _calculateDirtyArrays( + prevDataBlob: any, + prevSectionIDs: Array, + prevRowIDs: Array> + ): void { + // construct a hashmap of the existing (old) id arrays + var prevSectionsHash = keyedDictionaryFromArray(prevSectionIDs); + var prevRowsHash = {}; + for (var ii = 0; ii < prevRowIDs.length; ii++) { + var sectionID = prevSectionIDs[ii]; + warning( + !prevRowsHash[sectionID], + 'SectionID appears more than once: ' + sectionID + ); + prevRowsHash[sectionID] = keyedDictionaryFromArray(prevRowIDs[ii]); + } + + // compare the 2 identity array and get the dirtied rows + this._dirtySections = []; + this._dirtyRows = []; + + var dirty; + for (var sIndex = 0; sIndex < this.sectionIdentities.length; sIndex++) { + var sectionID = this.sectionIdentities[sIndex]; + // dirty if the sectionHeader is new or _sectionHasChanged is true + dirty = !prevSectionsHash[sectionID]; + var sectionHeaderHasChanged = this._sectionHeaderHasChanged; + if (!dirty && sectionHeaderHasChanged) { + dirty = sectionHeaderHasChanged( + this._getSectionHeaderData(prevDataBlob, sectionID), + this._getSectionHeaderData(this._dataBlob, sectionID) + ); + } + this._dirtySections.push(!!dirty); + + this._dirtyRows[sIndex] = []; + for (var rIndex = 0; rIndex < this.rowIdentities[sIndex].length; rIndex++) { + var rowID = this.rowIdentities[sIndex][rIndex]; + // dirty if the section is new, row is new or _rowHasChanged is true + dirty = + !prevSectionsHash[sectionID] || + !prevRowsHash[sectionID][rowID] || + this._rowHasChanged( + this._getRowData(prevDataBlob, sectionID, rowID), + this._getRowData(this._dataBlob, sectionID, rowID) + ); + this._dirtyRows[sIndex].push(!!dirty); + } + } + } +} + +function countRows(allRowIDs) { + var totalRows = 0; + for (var sectionIdx = 0; sectionIdx < allRowIDs.length; sectionIdx++) { + var rowIDs = allRowIDs[sectionIdx]; + totalRows += rowIDs.length; + } + return totalRows; +} + +function keyedDictionaryFromArray(arr) { + if (isEmpty(arr)) { + return {}; + } + var result = {}; + for (var ii = 0; ii < arr.length; ii++) { + var key = arr[ii]; + warning(!result[key], 'Value appears more than once in array: ' + key); + result[key] = true; + } + return result; +} + + +module.exports = ListViewDataSource; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js new file mode 100644 index 00000000..48e721f4 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigationContext + */ +'use strict'; + +var NavigationEventEmitter = require('NavigationEventEmitter'); + +var emptyFunction = require('emptyFunction'); +var invariant = require('invariant'); + +import type * as NavigationEvent from 'NavigationEvent'; +import type * as EventSubscription from 'EventSubscription'; + +/** + * Class that contains the info and methods for app navigation. + */ +class NavigationContext { + _eventEmitter: ?NavigationEventEmitter; + _currentRoute: any; + + constructor() { + this._eventEmitter = new NavigationEventEmitter(this); + this._currentRoute = null; + this.addListener('willfocus', this._onFocus, this); + this.addListener('didfocus', this._onFocus, this); + } + + // TODO: @flow does not like this getter. Will add @flow check back once + // getter/setter is supported. + get currentRoute(): any { + return this._currentRoute; + } + + addListener( + eventType: string, + listener: Function, + context: ?Object + ): EventSubscription { + var emitter = this._eventEmitter; + if (emitter) { + return emitter.addListener(eventType, listener, context); + } else { + return {remove: emptyFunction}; + } + } + + emit(eventType: String, data: any, didEmitCallback: ?Function): void { + var emitter = this._eventEmitter; + if (emitter) { + emitter.emit(eventType, data, didEmitCallback); + } + } + + dispose(): void { + var emitter = this._eventEmitter; + if (emitter) { + // clean up everything. + emitter.removeAllListeners(); + this._eventEmitter = null; + this._currentRoute = null; + } + } + + _onFocus(event: NavigationEvent): void { + invariant( + event.data && event.data.hasOwnProperty('route'), + 'didfocus event should provide route' + ); + this._currentRoute = event.data.route; + } +} + +module.exports = NavigationContext; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEvent.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEvent.js new file mode 100644 index 00000000..b1d6268d --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEvent.js @@ -0,0 +1,120 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigationEvent + * @flow + */ +'use strict'; + +var invariant = require('invariant'); + +class NavigationEventPool { + _list: Array; + + constructor() { + this._list = []; + } + + get(type: string, target: Object, data: any): NavigationEvent { + var event; + if (this._list.length > 0) { + event = this._list.pop(); + event.constructor.call(event, type, target, data); + } else { + event = new NavigationEvent(type, target, data); + } + return event; + } + + put(event: NavigationEvent) { + this._list.push(event); + } +} + +var _navigationEventPool = new NavigationEventPool(); + +class NavigationEvent { + _data: any; + _defaultPrevented: boolean; + _disposed: boolean; + _target: ?Object; + _type: ?string; + + static pool(type: string, target: Object, data: any): NavigationEvent { + return _navigationEventPool.get(type, target, data); + } + + constructor(type: string, target: Object, data: any) { + this._type = type; + this._target = target; + this._data = data; + this._defaultPrevented = false; + this._disposed = false; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get type(): string { + return this._type; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get target(): Object { + return this._target; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get data(): any { + return this._data; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get defaultPrevented(): boolean { + return this._defaultPrevented; + } + + preventDefault(): void { + this._defaultPrevented = true; + } + + /** + * Dispose the event. + * NavigationEvent shall be disposed after being emitted by + * `NavigationEventEmitter`. + */ + dispose(): void { + invariant(!this._disposed, 'NavigationEvent is already disposed'); + this._disposed = true; + + // Clean up. + this._type = null; + this._target = null; + this._data = null; + this._defaultPrevented = false; + + // Put this back to the pool to reuse the instance. + _navigationEventPool.put(this); + } +} + +module.exports = NavigationEvent; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEventEmitter.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEventEmitter.js new file mode 100644 index 00000000..a379edd7 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationEventEmitter.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigationEventEmitter + * @flow + */ +'use strict'; + +var EventEmitter = require('EventEmitter'); +var NavigationEvent = require('NavigationEvent'); + +type EventParams = { + data: any; + didEmitCallback: ?Function; + eventType: string; +}; + +class NavigationEventEmitter extends EventEmitter { + _emitQueue: Array; + _emitting: boolean; + _target: Object; + + constructor(target: Object) { + super(); + this._emitting = false; + this._emitQueue = []; + this._target = target; + } + + emit( + eventType: string, + data: any, + didEmitCallback: ?Function + ): void { + if (this._emitting) { + // An event cycle that was previously created hasn't finished yet. + // Put this event cycle into the queue and will finish them later. + this._emitQueue.push({eventType, data, didEmitCallback}); + return; + } + + this._emitting = true; + + var event = new NavigationEvent(eventType, this._target, data); + + // EventEmitter#emit only takes `eventType` as `String`. Casting `eventType` + // to `String` to make @flow happy. + super.emit(String(eventType), event); + + if (typeof didEmitCallback === 'function') { + didEmitCallback.call(this._target, event); + } + event.dispose(); + + this._emitting = false; + + while (this._emitQueue.length) { + var arg = this._emitQueue.shift(); + this.emit(arg.eventType, arg.data, arg.didEmitCallback); + } + } +} + +module.exports = NavigationEventEmitter; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationRouteStack.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationRouteStack.js new file mode 100644 index 00000000..16a95b55 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/NavigationRouteStack.js @@ -0,0 +1,264 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule NavigationRouteStack + * @flow + */ +'use strict'; + +var immutable = require('immutable'); +var invariant = require('invariant'); + +type IterationCallback = (route: any, index: number, key: string) => void; + +var {List, Set} = immutable; + +function isRouteEmpty(route: any): boolean { + return (route === undefined || route === null || route === '') || false; +} + +var _nextID = 0; + +class RouteNode { + key: string; + value: any; + constructor(route: any) { + // Key value gets bigger incrementally. Developer can compare the + // keys of two routes then know which route is added to the stack + // earlier. + this.key = String(_nextID++); + + this.value = route; + } +} + +var StackDiffRecord = immutable.Record({ + key: null, + route: null, + index: null, +}); + +/** + * The immutable route stack. + */ +class RouteStack { + _index: number; + + _routeNodes: List; + + constructor(index: number, routeNodes: List) { + invariant( + routeNodes.size > 0, + 'size must not be empty' + ); + + invariant( + index > -1 && index <= routeNodes.size - 1, + 'index out of bound' + ); + + this._routeNodes = routeNodes; + this._index = index; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get size(): number { + return this._routeNodes.size; + } + + /* $FlowFixMe - get/set properties not yet supported */ + get index(): number { + return this._index; + } + + toArray(): Array { + var result = []; + var ii = 0; + var nodes = this._routeNodes; + while (ii < nodes.size) { + result.push(nodes.get(ii).value); + ii++; + } + return result; + } + + get(index: number): any { + if (index < 0 || index > this._routeNodes.size - 1) { + return null; + } + return this._routeNodes.get(index).value; + } + + /** + * Returns the key associated with the route. + * When a route is added to a stack, the stack creates a key for this route. + * The key will persist until the initial stack and its derived stack + * no longer contains this route. + */ + keyOf(route: any): ?string { + if (isRouteEmpty(route)) { + return null; + } + var index = this.indexOf(route); + return index > -1 ? + this._routeNodes.get(index).key : + null; + } + + indexOf(route: any): number { + if (isRouteEmpty(route)) { + return -1; + } + + var finder = (node) => { + return (node: RouteNode).value === route; + }; + + return this._routeNodes.findIndex(finder, this); + } + + slice(begin: ?number, end: ?number): RouteStack { + var routeNodes = this._routeNodes.slice(begin, end); + var index = Math.min(this._index, routeNodes.size - 1); + return this._update(index, routeNodes); + } + + /** + * Returns a new stack with the provided route appended, + * starting at this stack size. + */ + push(route: any): RouteStack { + + invariant( + !isRouteEmpty(route), + 'Must supply route to push' + ); + + invariant(this._routeNodes.indexOf(route) === -1, 'route must be unique'); + + // When pushing, removes the rest of the routes past the current index. + var routeNodes = this._routeNodes.withMutations((list: List) => { + list.slice(0, this._index + 1).push(new RouteNode(route)); + }); + + return this._update(routeNodes.size - 1, routeNodes); + } + + /** + * Returns a new stack a size ones less than this stack, + * excluding the last index in this stack. + */ + pop(): RouteStack { + invariant(this._routeNodes.size > 1, 'shoud not pop routeNodes stack to empty'); + + // When popping, removes the rest of the routes past the current index. + var routeNodes = this._routeNodes.slice(0, this._index); + return this._update(routeNodes.size - 1, routeNodes); + } + + jumpToIndex(index: number): RouteStack { + invariant( + index > -1 && index < this._routeNodes.size, + 'index out of bound' + ); + + return this._update(index, this._routeNodes); + } + + /** + * Replace a route in the navigation stack. + * + * `index` specifies the route in the stack that should be replaced. + * If it's negative, it counts from the back. + */ + replaceAtIndex(index: number, route: any): RouteStack { + invariant( + !isRouteEmpty(route), + 'Must supply route to replace' + ); + + if (this.get(index) === route) { + return this; + } + + invariant(this.indexOf(route) === -1, 'route must be unique'); + + if (index < 0) { + index += this._routeNodes.size; + } + + invariant( + index > -1 && index < this._routeNodes.size, + 'index out of bound' + ); + + var routeNodes = this._routeNodes.set(index, new RouteNode(route)); + return this._update(index, routeNodes); + } + + // Iterations + forEach(callback: IterationCallback, context: ?Object): void { + var ii = 0; + var nodes = this._routeNodes; + while (ii < nodes.size) { + var node = nodes.get(ii); + callback.call(context, node.value, ii, node.key); + ii++; + } + } + + mapToArray(callback: IterationCallback, context: ?Object): Array { + var result = []; + this.forEach((route, index, key) => { + result.push(callback.call(context, route, index, key)); + }); + return result; + } + + /** + * Returns a Set excluding any routes contained within the stack given. + */ + subtract(stack: RouteStack): Set { + var items = []; + this._routeNodes.forEach((node: RouteNode, index: number) => { + if (!stack._routeNodes.contains(node)) { + items.push( + new StackDiffRecord({ + route: node.value, + index: index, + key: node.key, + }) + ); + } + }); + return new Set(items); + } + + _update(index: number, routeNodes: List): RouteStack { + if (this._index === index && this._routeNodes === routeNodes) { + return this; + } + return new RouteStack(index, routeNodes); + } +} + +/** + * The first class data structure for NavigationContext to manage the navigation + * stack of routes. + */ +class NavigationRouteStack extends RouteStack { + constructor(index: number, routeNodes: Array) { + // For now, `RouteStack` internally, uses an immutable `List` to keep + // track of routeNodes. Since using `List` is really just the implementation + // detail, we don't want to accept `routeNodes` as `list` from constructor + // for developer. + var nodes = routeNodes.map((route) => { + invariant(!isRouteEmpty(route), 'route must not be mepty'); + return new RouteNode(route); + }); + + super(index, new List(nodes)); + } +} + +module.exports = NavigationRouteStack; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js new file mode 100644 index 00000000..7a66159c --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; + +jest + .dontMock('EmitterSubscription') + .dontMock('EventSubscription') + .dontMock('EventEmitter') + .dontMock('EventSubscriptionVendor') + .dontMock('NavigationContext') + .dontMock('NavigationEvent') + .dontMock('NavigationEventEmitter') + .dontMock('invariant'); + +var NavigationContext = require('NavigationContext'); + +describe('NavigationContext', () => { + it('defaults `currentRoute` to null', () => { + var context = new NavigationContext(); + expect(context.currentRoute).toEqual(null); + }); + + it('updates `currentRoute`', () => { + var context = new NavigationContext(); + context.emit('didfocus', {route: {name: 'a'}}); + expect(context.currentRoute.name).toEqual('a'); + }); +}); + + diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEvent-test.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEvent-test.js new file mode 100644 index 00000000..c3fc0f5e --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEvent-test.js @@ -0,0 +1,71 @@ + +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; + +jest + .dontMock('NavigationEvent') + .dontMock('invariant'); + +var NavigationEvent = require('NavigationEvent'); + +describe('NavigationEvent', () => { + it('constructs', () => { + var target = {}; + var event = new NavigationEvent('foo', target, 123); + expect(event.type).toBe('foo'); + expect(event.target).toBe(target); + expect(event.data).toBe(123); + }); + + it('constructs from pool', () => { + var target = {}; + var event = NavigationEvent.pool('foo', target, 123); + expect(event.type).toBe('foo'); + expect(event.target).toBe(target); + expect(event.data).toBe(123); + }); + + it('prevents default', () => { + var event = new NavigationEvent('foo', {}, 123); + expect(event.defaultPrevented).toBe(false); + event.preventDefault(); + expect(event.defaultPrevented).toBe(true); + }); + + it('recycles', () => { + var event1 = NavigationEvent.pool('foo', {}, 123); + event1.dispose(); + expect(event1.type).toBe(null); + expect(event1.data).toBe(null); + expect(event1.target).toBe(null); + + var event2 = NavigationEvent.pool('bar', {}, 456); + expect(event2.type).toBe('bar'); + expect(event2).toBe(event1); + }); +}); + + diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEventEmitter-test.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEventEmitter-test.js new file mode 100644 index 00000000..36189208 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationEventEmitter-test.js @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; + +jest + .dontMock('EmitterSubscription') + .dontMock('EventEmitter') + .dontMock('EventSubscriptionVendor') + .dontMock('NavigationEvent') + .dontMock('NavigationEventEmitter'); + +var NavigationEventEmitter = require('NavigationEventEmitter'); + +describe('NavigationEventEmitter', () => { + it('emits event', () => { + var context = {}; + var emitter = new NavigationEventEmitter(context); + var logs = []; + + emitter.addListener('ping', (event) => { + var {type, data, target, defaultPrevented} = event; + + logs.push({ + data, + defaultPrevented, + target, + type, + }); + + }); + + emitter.emit('ping', 'hello'); + + expect(logs.length).toBe(1); + expect(logs[0].target).toBe(context); + expect(logs[0].type).toBe('ping'); + expect(logs[0].data).toBe('hello'); + expect(logs[0].defaultPrevented).toBe(false); + }); + + it('does not emit event that has no listeners', () => { + var context = {}; + var emitter = new NavigationEventEmitter(context); + var pinged = false; + + emitter.addListener('ping', () => { + pinged = true; + }); + + emitter.emit('yo', 'bo'); + expect(pinged).toBe(false); + }); + + it('puts nested emit call in a queue', () => { + var context = {}; + var emitter = new NavigationEventEmitter(context); + var logs = []; + + emitter.addListener('one', () => { + logs.push(1); + emitter.emit('two'); + logs.push(2); + }); + + emitter.addListener('two', () => { + logs.push(3); + emitter.emit('three'); + logs.push(4); + }); + + emitter.addListener('three', () => { + logs.push(5); + }); + + emitter.emit('one'); + + expect(logs).toEqual([1, 2, 3, 4, 5]); + }); + + it('calls callback after emitting', () => { + var context = {}; + var emitter = new NavigationEventEmitter(context); + var logs = []; + + emitter.addListener('ping', (event) => { + var {type, data, target, defaultPrevented} = event; + logs.push({ + data, + defaultPrevented, + target, + type, + }); + event.preventDefault(); + }); + + emitter.emit('ping', 'hello', (event) => { + var {type, data, target, defaultPrevented} = event; + logs.push({ + data, + defaultPrevented, + target, + type, + }); + }); + + expect(logs.length).toBe(2); + expect(logs[1].target).toBe(context); + expect(logs[1].type).toBe('ping'); + expect(logs[1].data).toBe('hello'); + expect(logs[1].defaultPrevented).toBe(true); + }); + + it('calls callback after emitting the current event and before ' + + 'emitting the next event', () => { + var context = {}; + var emitter = new NavigationEventEmitter(context); + var logs = []; + + emitter.addListener('ping', (event) => { + logs.push('ping'); + emitter.emit('pong'); + }); + + emitter.addListener('pong', (event) => { + logs.push('pong'); + }); + + emitter.emit('ping', null, () => { + logs.push('did-ping'); + }); + + expect(logs).toEqual([ + 'ping', + 'did-ping', + 'pong', + ]); + }); +}); diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationRouteStack-test.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationRouteStack-test.js new file mode 100644 index 00000000..7807f9e0 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationRouteStack-test.js @@ -0,0 +1,433 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; + + +jest + .autoMockOff() + .mock('ErrorUtils'); + +var NavigationRouteStack = require('NavigationRouteStack'); + +function assetStringNotEmpty(str) { + expect(!!str && typeof str === 'string').toBe(true); +} + +describe('NavigationRouteStack:', () => { + // Different types of routes. + var ROUTES = [ + 'foo', + 1, + true, + {foo: 'bar'}, + ['foo'], + ]; + + // Basic + it('gets index', () => { + var stack = new NavigationRouteStack(1, ['a', 'b', 'c']); + expect(stack.index).toBe(1); + }); + + it('gets size', () => { + var stack = new NavigationRouteStack(1, ['a', 'b', 'c']); + expect(stack.size).toBe(3); + }); + + it('gets route', () => { + var stack = new NavigationRouteStack(0, ['a', 'b', 'c']); + expect(stack.get(2)).toBe('c'); + }); + + it('converts to an array', () => { + var stack = new NavigationRouteStack(0, ['a', 'b']); + expect(stack.toArray()).toEqual(['a', 'b']); + }); + + it('creates a new stack after mutation', () => { + var stack1 = new NavigationRouteStack(0, ['a', 'b']); + var stack2 = stack1.push('c'); + expect(stack1).not.toBe(stack2); + }); + + it('throws at index out of bound', () => { + expect(() => { + new NavigationRouteStack(-1, ['a', 'b']); + }).toThrow(); + + expect(() => { + new NavigationRouteStack(100, ['a', 'b']); + }).toThrow(); + }); + + it('finds index', () => { + var stack = new NavigationRouteStack(0, ['a', 'b']); + expect(stack.indexOf('b')).toBe(1); + expect(stack.indexOf('c')).toBe(-1); + }); + + // Key + it('gets key for route', () => { + var test = (route) => { + var stack = new NavigationRouteStack(0, ['a']); + var key = stack.push(route).keyOf(route); + expect(typeof key).toBe('string'); + expect(!!key).toBe(true); + }; + + ROUTES.forEach(test); + }); + + it('gets a key of larger value for route', () => { + var lastKey = ''; + var test = (route) => { + var stack = new NavigationRouteStack(0, ['a']); + var key = stack.push(route).keyOf(route); + expect(key > lastKey).toBe(true); + lastKey = key; + }; + + ROUTES.forEach(test); + }); + + it('gets an unique key for a different route', () => { + var stack = new NavigationRouteStack(0, ['a']); + var keys = {}; + + var test = (route) => { + stack = stack.push(route); + var key = stack.keyOf(route); + expect(keys[key]).toBe(undefined); + keys[key] = true; + }; + + ROUTES.forEach(test); + }); + + it('gets the same unique key for the same route', () => { + var test = (route) => { + var stack = new NavigationRouteStack(0, [route]); + expect(stack.keyOf(route)).toBe(stack.keyOf(route)); + }; + + ROUTES.forEach(test); + }); + + + it('gets the same unique key form the derived stack', () => { + var test = (route) => { + var stack = new NavigationRouteStack(0, [route]); + var derivedStack = stack.push('wow').pop().slice(0, 10).push('blah'); + expect(derivedStack.keyOf(route)).toBe(stack.keyOf(route)); + }; + + ROUTES.forEach(test); + }); + + it('gets a different key from a different stack', () => { + var test = (route) => { + var stack1 = new NavigationRouteStack(0, [route]); + var stack2 = new NavigationRouteStack(0, [route]); + expect(stack1.keyOf(route)).not.toBe(stack2.keyOf(route)); + }; + + ROUTES.forEach(test); + }); + + it('gets no key for a route that does not contains this route', () => { + var stack = new NavigationRouteStack(0, ['a']); + expect(stack.keyOf('b')).toBe(null); + }); + + it('gets a new key for a route that was removed and added again', () => { + var test = (route) => { + var stack = new NavigationRouteStack(0, ['a']); + + var key1 = stack.push(route).keyOf(route); + var key2 = stack.push(route).pop().push(route).keyOf(route); + expect(key1).not.toBe(key2); + }; + + ROUTES.forEach(test); + }); + + // Slice + it('slices', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b', 'c', 'd']); + var stack2 = stack1.slice(1, 3); + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['b', 'c']); + }); + + it('may update index after slicing', () => { + var stack = new NavigationRouteStack(2, ['a', 'b', 'c']); + expect(stack.slice().index).toBe(2); + expect(stack.slice(0, 1).index).toBe(0); + expect(stack.slice(0, 2).index).toBe(1); + expect(stack.slice(0, 3).index).toBe(2); + expect(stack.slice(0, 100).index).toBe(2); + expect(stack.slice(-2).index).toBe(1); + }); + + it('slices without specifying params', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b', 'c']); + var stack2 = stack1.slice(); + expect(stack2).toBe(stack1); + }); + + it('slices to from the end', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b', 'c', 'd']); + var stack2 = stack1.slice(-2); + expect(stack2.toArray()).toEqual(['c', 'd']); + }); + + it('throws when slicing to empty', () => { + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.slice(100); + }).toThrow(); + }); + + // Push + it('pushes route', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b']); + var stack2 = stack1.push('c'); + + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['a', 'b', 'c']); + expect(stack2.index).toBe(2); + expect(stack2.size).toBe(3); + }); + + it('throws when pushing empty route', () => { + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.push(null); + }).toThrow(); + + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.push(''); + }).toThrow(); + + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.push(undefined); + }).toThrow(); + }); + + it('replaces routes on push', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b', 'c']); + var stack2 = stack1.push('d'); + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['a', 'b', 'd']); + expect(stack2.index).toBe(2); + }); + + // Pop + it('pops route', () => { + var stack1 = new NavigationRouteStack(2, ['a', 'b', 'c']); + var stack2 = stack1.pop(); + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['a', 'b']); + expect(stack2.index).toBe(1); + expect(stack2.size).toBe(2); + }); + + it('replaces routes on pop', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b', 'c']); + var stack2 = stack1.pop(); + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['a']); + expect(stack2.index).toBe(0); + }); + + it('throws when popping to empty stack', () => { + expect(() => { + var stack = new NavigationRouteStack(0, ['a']); + stack.pop(); + }).toThrow(); + }); + + // Jump + it('jumps to index', () => { + var stack1 = new NavigationRouteStack(0, ['a', 'b', 'c']); + var stack2 = stack1.jumpToIndex(2); + + expect(stack2).not.toBe(stack1); + expect(stack2.index).toBe(2); + }); + + it('throws then jumping to index out of bound', () => { + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.jumpToIndex(2); + }).toThrow(); + + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.jumpToIndex(-1); + }).toThrow(); + }); + + // Replace + it('replaces route at index', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b']); + var stack2 = stack1.replaceAtIndex(0, 'x'); + + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['x', 'b']); + expect(stack2.index).toBe(0); + }); + + it('replaces route at negative index', () => { + var stack1 = new NavigationRouteStack(1, ['a', 'b']); + var stack2 = stack1.replaceAtIndex(-1, 'x'); + + expect(stack2).not.toBe(stack1); + expect(stack2.toArray()).toEqual(['a', 'x']); + expect(stack2.index).toBe(1); + }); + + it('throws when replacing empty route', () => { + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.replaceAtIndex(1, null); + }).toThrow(); + }); + + it('throws when replacing at index out of bound', () => { + expect(() => { + var stack = new NavigationRouteStack(1, ['a', 'b']); + stack.replaceAtIndex(100, 'x'); + }).toThrow(); + }); + + // Iteration + it('iterates each item', () => { + var stack = new NavigationRouteStack(0, ['a', 'b']); + var logs = []; + var keys = {}; + var context = {name: 'yo'}; + + stack.forEach(function (route, index, key) { + assetStringNotEmpty(key); + if (!keys.hasOwnProperty(key)) { + keys[key] = true; + logs.push([ + route, + index, + this.name, + ]); + } + }, context); + + expect(logs).toEqual([ + ['a', 0, 'yo'], + ['b', 1, 'yo'], + ]); + }); + + it('Maps to an array', () => { + var stack = new NavigationRouteStack(0, ['a', 'b']); + var keys = {}; + var context = {name: 'yo'}; + + var logs = stack.mapToArray(function(route, index, key) { + assetStringNotEmpty(key); + if (!keys.hasOwnProperty(key)) { + keys[key] = true; + return [ + route, + index, + this.name, + ]; + } + }, context); + + expect(logs).toEqual([ + ['a', 0, 'yo'], + ['b', 1, 'yo'], + ]); + }); + + // Diff + it('subtracts stack', () => { + var stack1 = new NavigationRouteStack(2, ['a', 'b', 'c']); + var stack2 = stack1.pop().pop().push('x').push('y'); + + var diff = stack1.subtract(stack2); + + var result = diff.toJS().map((record) => { + assetStringNotEmpty(record.key); + return { + index: record.index, + route: record.route, + }; + }); + + // route `b` and `c` are no longer in the stack. + expect(result).toEqual([ + { + index: 1, + route: 'b', + }, + { + index: 2, + route: 'c', + }, + ]); + }); + + it('only subtracts the derived stack', () => { + var stack1 = new NavigationRouteStack(2, ['a', 'b', 'c']); + var stack2 = new NavigationRouteStack(0, ['a']); + var diff = stack1.subtract(stack2); + + var result = diff.toJS().map((record) => { + assetStringNotEmpty(record.key); + return { + index: record.index, + route: record.route, + }; + }); + + expect(result).toEqual([ + { + index: 0, + route: 'a', + }, + { + index: 1, + route: 'b', + }, + { + index: 2, + route: 'c', + }, + ]); + + }); +}); diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigator.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigator.js new file mode 100644 index 00000000..d8034d24 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/Navigator.js @@ -0,0 +1,1114 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule Navigator + */ + /* eslint-disable no-extra-boolean-cast*/ +'use strict'; + +var AnimationsDebugModule = require('NativeModules').AnimationsDebugModule; +var Dimensions = require('Dimensions'); +var InteractionMixin = require('InteractionMixin'); +var Map = require('Map'); +var NavigationContext = require('NavigationContext'); +var NavigatorBreadcrumbNavigationBar = require('NavigatorBreadcrumbNavigationBar'); +var NavigatorNavigationBar = require('NavigatorNavigationBar'); +var NavigatorSceneConfigs = require('NavigatorSceneConfigs'); +var PanResponder = require('PanResponder'); +var React = require('React'); +var StaticContainer = require('StaticContainer.react'); +var StyleSheet = require('StyleSheet'); +var Subscribable = require('Subscribable'); +var TimerMixin = require('react-timer-mixin'); +var View = require('View'); + +var clamp = require('clamp'); +var flattenStyle = require('flattenStyle'); +var invariant = require('invariant'); +var rebound = require('rebound'); + +var PropTypes = React.PropTypes; + +// TODO: this is not ideal because there is no guarantee that the navigator +// is full screen, hwoever we don't have a good way to measure the actual +// size of the navigator right now, so this is the next best thing. +var SCREEN_WIDTH = Dimensions.get('window').width; +var SCREEN_HEIGHT = Dimensions.get('window').height; +var SCENE_DISABLED_NATIVE_PROPS = { + pointerEvents: 'none', + style: { + top: SCREEN_HEIGHT, + bottom: -SCREEN_HEIGHT, + opacity: 0, + }, +}; + +var __uid = 0; +function getuid() { + return __uid++; +} + +function getRouteID(route) { + if (route === null || typeof route !== 'object') { + return String(route); + } + + var key = '__navigatorRouteID'; + + if (!route.hasOwnProperty(key)) { + Object.defineProperty(route, key, { + enumerable: false, + configurable: false, + writable: false, + value: getuid(), + }); + } + return route[key]; +} + +// styles moved to the top of the file so getDefaultProps can refer to it +var styles = StyleSheet.create({ + container: { + flex: 1, + overflow: 'hidden', + }, + defaultSceneStyle: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + top: 0, + }, + baseScene: { + position: 'absolute', + overflow: 'hidden', + left: 0, + right: 0, + bottom: 0, + top: 0, + }, + disabledScene: { + top: SCREEN_HEIGHT, + bottom: -SCREEN_HEIGHT, + }, + transitioner: { + flex: 1, + backgroundColor: 'transparent', + overflow: 'hidden', + } +}); + +var GESTURE_ACTIONS = [ + 'pop', + 'jumpBack', + 'jumpForward', +]; + +/** + * Use `Navigator` to transition between different scenes in your app. To + * accomplish this, provide route objects to the navigator to identify each + * scene, and also a `renderScene` function that the navigator can use to + * render the scene for a given route. + * + * To change the animation or gesture properties of the scene, provide a + * `configureScene` prop to get the config object for a given route. See + * `Navigator.SceneConfigs` for default animations and more info on + * scene config options. + * + * ### Basic Usage + * + * ``` + * + * { + * var nextIndex = route.index + 1; + * navigator.push({ + * name: 'Scene ' + nextIndex, + * index: nextIndex, + * }); + * }} + * onBack={() => { + * if (route.index > 0) { + * navigator.pop(); + * } + * }} + * /> + * } + * /> + * ``` + * + * ### Navigator Methods + * + * If you have a ref to the Navigator element, you can invoke several methods + * on it to trigger navigation: + * + * - `getCurrentRoutes()` - returns the current list of routes + * - `jumpBack()` - Jump backward without unmounting the current scene + * - `jumpForward()` - Jump forward to the next scene in the route stack + * - `jumpTo(route)` - Transition to an existing scene without unmounting + * - `push(route)` - Navigate forward to a new scene, squashing any scenes + * that you could `jumpForward` to + * - `pop()` - Transition back and unmount the current scene + * - `replace(route)` - Replace the current scene with a new route + * - `replaceAtIndex(route, index)` - Replace a scene as specified by an index + * - `replacePrevious(route)` - Replace the previous scene + * - `immediatelyResetRouteStack(routeStack)` - Reset every scene with an + * array of routes + * - `popToRoute(route)` - Pop to a particular scene, as specified by it's + * route. All scenes after it will be unmounted + * - `popToTop()` - Pop to the first scene in the stack, unmounting every + * other scene + * + */ +var Navigator = React.createClass({ + + propTypes: { + /** + * Optional function that allows configuration about scene animations and + * gestures. Will be invoked with the route and should return a scene + * configuration object + * + * ``` + * (route) => Navigator.SceneConfigs.FloatFromRight + * ``` + */ + configureScene: PropTypes.func, + + /** + * Required function which renders the scene for a given route. Will be + * invoked with the route and the navigator object + * + * ``` + * (route, navigator) => + * + * ``` + */ + renderScene: PropTypes.func.isRequired, + + /** + * Specify a route to start on. A route is an object that the navigator + * will use to identify each scene to render. `initialRoute` must be + * a route in the `initialRouteStack` if both props are provided. The + * `initialRoute` will default to the last item in the `initialRouteStack`. + */ + initialRoute: PropTypes.object, + + /** + * Provide a set of routes to initially mount. Required if no initialRoute + * is provided. Otherwise, it will default to an array containing only the + * `initialRoute` + */ + initialRouteStack: PropTypes.arrayOf(PropTypes.object), + + /** + * @deprecated + * Use `navigationContext.addListener('willfocus', callback)` instead. + * + * Will emit the target route upon mounting and before each nav transition + */ + onWillFocus: PropTypes.func, + + /** + * @deprecated + * Use `navigationContext.addListener('didfocus', callback)` instead. + * + * Will be called with the new route of each scene after the transition is + * complete or after the initial mounting + */ + onDidFocus: PropTypes.func, + + /** + * Optionally provide a navigation bar that persists across scene + * transitions + */ + navigationBar: PropTypes.node, + + /** + * Optionally provide the navigator object from a parent Navigator + */ + navigator: PropTypes.object, + + /** + * Styles to apply to the container of each scene + */ + sceneStyle: View.propTypes.style, + }, + + statics: { + BreadcrumbNavigationBar: NavigatorBreadcrumbNavigationBar, + NavigationBar: NavigatorNavigationBar, + SceneConfigs: NavigatorSceneConfigs, + }, + + mixins: [TimerMixin, InteractionMixin, Subscribable.Mixin], + + getDefaultProps: function() { + return { + configureScene: () => NavigatorSceneConfigs.PushFromRight, + sceneStyle: styles.defaultSceneStyle, + }; + }, + + getInitialState: function() { + this._renderedSceneMap = new Map(); + + var routeStack = this.props.initialRouteStack || [this.props.initialRoute]; + invariant( + routeStack.length >= 1, + 'Navigator requires props.initialRoute or props.initialRouteStack.' + ); + var initialRouteIndex = routeStack.length - 1; + if (this.props.initialRoute) { + initialRouteIndex = routeStack.indexOf(this.props.initialRoute); + invariant( + initialRouteIndex !== -1, + 'initialRoute is not in initialRouteStack.' + ); + } + return { + sceneConfigStack: routeStack.map( + (route) => this.props.configureScene(route) + ), + routeStack, + presentedIndex: initialRouteIndex, + transitionFromIndex: null, + activeGesture: null, + pendingGestureProgress: null, + transitionQueue: [], + }; + }, + + componentWillMount: function() { + // TODO(t7489503): Don't need this once ES6 Class landed. + this.__defineGetter__('navigationContext', this._getNavigationContext); + + this._subRouteFocus = []; + this.parentNavigator = this.props.navigator; + this._handlers = {}; + this.springSystem = new rebound.SpringSystem(); + this.spring = this.springSystem.createSpring(); + this.spring.setRestSpeedThreshold(0.05); + this.spring.setCurrentValue(0).setAtRest(); + this.spring.addListener({ + onSpringEndStateChange: () => { + if (!this._interactionHandle) { + this._interactionHandle = this.createInteractionHandle(); + } + }, + onSpringUpdate: () => { + this._handleSpringUpdate(); + }, + onSpringAtRest: () => { + this._completeTransition(); + }, + }); + this.panGesture = PanResponder.create({ + onMoveShouldSetPanResponder: this._handleMoveShouldSetPanResponder, + onPanResponderGrant: this._handlePanResponderGrant, + onPanResponderRelease: this._handlePanResponderRelease, + onPanResponderMove: this._handlePanResponderMove, + onPanResponderTerminate: this._handlePanResponderTerminate, + }); + this._interactionHandle = null; + this._emitWillFocus(this.state.routeStack[this.state.presentedIndex]); + }, + + componentDidMount: function() { + this._handleSpringUpdate(); + this._emitDidFocus(this.state.routeStack[this.state.presentedIndex]); + }, + + componentWillUnmount: function() { + if (this._navigationContext) { + this._navigationContext.dispose(); + this._navigationContext = null; + } + }, + + /** + * @param {RouteStack} nextRouteStack Next route stack to reinitialize. This + * doesn't accept stack item `id`s, which implies that all existing items are + * destroyed, and then potentially recreated according to `routeStack`. Does + * not animate, immediately replaces and rerenders navigation bar and stack + * items. + */ + immediatelyResetRouteStack: function(nextRouteStack) { + var destIndex = nextRouteStack.length - 1; + this.setState({ + routeStack: nextRouteStack, + sceneConfigStack: nextRouteStack.map( + this.props.configureScene + ), + presentedIndex: destIndex, + activeGesture: null, + transitionFromIndex: null, + transitionQueue: [], + }, () => { + this._handleSpringUpdate(); + }); + }, + + _transitionTo: function(destIndex, velocity, jumpSpringTo, cb) { + if (destIndex === this.state.presentedIndex) { + return; + } + if (this.state.transitionFromIndex !== null) { + this.state.transitionQueue.push({ + destIndex, + velocity, + cb, + }); + return; + } + this.state.transitionFromIndex = this.state.presentedIndex; + this.state.presentedIndex = destIndex; + this.state.transitionCb = cb; + this._onAnimationStart(); + if (AnimationsDebugModule) { + AnimationsDebugModule.startRecordingFps(); + } + var sceneConfig = this.state.sceneConfigStack[this.state.transitionFromIndex] || + this.state.sceneConfigStack[this.state.presentedIndex]; + invariant( + sceneConfig, + 'Cannot configure scene at index ' + this.state.transitionFromIndex + ); + if (jumpSpringTo != null) { + this.spring.setCurrentValue(jumpSpringTo); + } + this.spring.setOvershootClampingEnabled(true); + this.spring.getSpringConfig().friction = sceneConfig.springFriction; + this.spring.getSpringConfig().tension = sceneConfig.springTension; + this.spring.setVelocity(velocity || sceneConfig.defaultTransitionVelocity); + this.spring.setEndValue(1); + }, + + /** + * This happens for each frame of either a gesture or a transition. If both are + * happening, we only set values for the transition and the gesture will catch up later + */ + _handleSpringUpdate: function() { + // Prioritize handling transition in progress over a gesture: + if (this.state.transitionFromIndex != null) { + this._transitionBetween( + this.state.transitionFromIndex, + this.state.presentedIndex, + this.spring.getCurrentValue() + ); + } else if (this.state.activeGesture != null) { + var presentedToIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + this._transitionBetween( + this.state.presentedIndex, + presentedToIndex, + this.spring.getCurrentValue() + ); + } + }, + + /** + * This happens at the end of a transition started by transitionTo, and when the spring catches up to a pending gesture + */ + _completeTransition: function() { + if (this.spring.getCurrentValue() !== 1 && this.spring.getCurrentValue() !== 0) { + // The spring has finished catching up to a gesture in progress. Remove the pending progress + // and we will be in a normal activeGesture state + if (this.state.pendingGestureProgress) { + this.state.pendingGestureProgress = null; + } + return; + } + this._onAnimationEnd(); + var presentedIndex = this.state.presentedIndex; + var didFocusRoute = this._subRouteFocus[presentedIndex] || this.state.routeStack[presentedIndex]; + this._emitDidFocus(didFocusRoute); + if (AnimationsDebugModule) { + AnimationsDebugModule.stopRecordingFps(Date.now()); + } + this.state.transitionFromIndex = null; + this.spring.setCurrentValue(0).setAtRest(); + this._hideScenes(); + if (this.state.transitionCb) { + this.state.transitionCb(); + this.state.transitionCb = null; + } + if (this._interactionHandle) { + this.clearInteractionHandle(this._interactionHandle); + this._interactionHandle = null; + } + if (this.state.pendingGestureProgress) { + // A transition completed, but there is already another gesture happening. + // Enable the scene and set the spring to catch up with the new gesture + var gestureToIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + this._enableScene(gestureToIndex); + this.spring.setEndValue(this.state.pendingGestureProgress); + return; + } + if (this.state.transitionQueue.length) { + var queuedTransition = this.state.transitionQueue.shift(); + this._enableScene(queuedTransition.destIndex); + this._emitWillFocus(this.state.routeStack[queuedTransition.destIndex]); + this._transitionTo( + queuedTransition.destIndex, + queuedTransition.velocity, + null, + queuedTransition.cb + ); + } + }, + + _emitDidFocus: function(route) { + this.navigationContext.emit('didfocus', {route: route}); + + if (this.props.onDidFocus) { + this.props.onDidFocus(route); + } + }, + + _emitWillFocus: function(route) { + this.navigationContext.emit('willfocus', {route: route}); + + var navBar = this._navBar; + if (navBar && navBar.handleWillFocus) { + navBar.handleWillFocus(route); + } + if (this.props.onWillFocus) { + this.props.onWillFocus(route); + } + }, + + /** + * Hides all scenes that we are not currently on, gesturing to, or transitioning from + */ + _hideScenes: function() { + var gesturingToIndex = null; + if (this.state.activeGesture) { + gesturingToIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + } + for (var i = 0; i < this.state.routeStack.length; i++) { + if (i === this.state.presentedIndex || + i === this.state.transitionFromIndex || + i === gesturingToIndex) { + continue; + } + this._disableScene(i); + } + }, + + /** + * Push a scene off the screen, so that opacity:0 scenes will not block touches sent to the presented scenes + */ + _disableScene: function(sceneIndex) { + this.refs['scene_' + sceneIndex] && + this.refs['scene_' + sceneIndex].setNativeProps(SCENE_DISABLED_NATIVE_PROPS); + }, + + /** + * Put the scene back into the state as defined by props.sceneStyle, so transitions can happen normally + */ + _enableScene: function(sceneIndex) { + // First, determine what the defined styles are for scenes in this navigator + var sceneStyle = flattenStyle([styles.baseScene, this.props.sceneStyle]); + // Then restore the pointer events and top value for this scene + var enabledSceneNativeProps = { + pointerEvents: 'auto', + style: { + top: sceneStyle.top, + bottom: sceneStyle.bottom, + }, + }; + if (sceneIndex !== this.state.transitionFromIndex && + sceneIndex !== this.state.presentedIndex) { + // If we are not in a transition from this index, make sure opacity is 0 + // to prevent the enabled scene from flashing over the presented scene + enabledSceneNativeProps.style.opacity = 0; + } + this.refs['scene_' + sceneIndex] && + this.refs['scene_' + sceneIndex].setNativeProps(enabledSceneNativeProps); + }, + + _onAnimationStart: function() { + var fromIndex = this.state.presentedIndex; + var toIndex = this.state.presentedIndex; + if (this.state.transitionFromIndex != null) { + fromIndex = this.state.transitionFromIndex; + } else if (this.state.activeGesture) { + toIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + } + this._setRenderSceneToHarwareTextureAndroid(fromIndex, true); + this._setRenderSceneToHarwareTextureAndroid(toIndex, true); + var navBar = this._navBar; + if (navBar && navBar.onAnimationStart) { + navBar.onAnimationStart(fromIndex, toIndex); + } + }, + + _onAnimationEnd: function() { + var max = this.state.routeStack.length - 1; + for (var index = 0; index <= max; index++) { + this._setRenderSceneToHarwareTextureAndroid(index, false); + } + + var navBar = this._navBar; + if (navBar && navBar.onAnimationEnd) { + navBar.onAnimationEnd(); + } + }, + + _setRenderSceneToHarwareTextureAndroid: function(sceneIndex, shouldRenderToHardwareTexture) { + var viewAtIndex = this.refs['scene_' + sceneIndex]; + if (viewAtIndex === null || viewAtIndex === undefined) { + return; + } + viewAtIndex.setNativeProps({renderToHardwareTextureAndroid: shouldRenderToHardwareTexture}); + }, + + _handleTouchStart: function() { + this._eligibleGestures = GESTURE_ACTIONS; + }, + + _handleMoveShouldSetPanResponder: function(e, gestureState) { + var sceneConfig = this.state.sceneConfigStack[this.state.presentedIndex]; + this._expectingGestureGrant = this._matchGestureAction(this._eligibleGestures, sceneConfig.gestures, gestureState); + return !! this._expectingGestureGrant; + }, + + _doesGestureOverswipe: function(gestureName) { + var wouldOverswipeBack = this.state.presentedIndex <= 0 && + (gestureName === 'pop' || gestureName === 'jumpBack'); + var wouldOverswipeForward = this.state.presentedIndex >= this.state.routeStack.length - 1 && + gestureName === 'jumpForward'; + return wouldOverswipeForward || wouldOverswipeBack; + }, + + _handlePanResponderGrant: function(e, gestureState) { + invariant( + this._expectingGestureGrant, + 'Responder granted unexpectedly.' + ); + this._attachGesture(this._expectingGestureGrant); + this._onAnimationStart(); + this._expectingGestureGrant = null; + }, + + _deltaForGestureAction: function(gestureAction) { + switch (gestureAction) { + case 'pop': + case 'jumpBack': + return -1; + case 'jumpForward': + return 1; + default: + invariant(false, 'Unsupported gesture action ' + gestureAction); + return; + } + }, + + _handlePanResponderRelease: function(e, gestureState) { + var sceneConfig = this.state.sceneConfigStack[this.state.presentedIndex]; + var releaseGestureAction = this.state.activeGesture; + if (!releaseGestureAction) { + // The gesture may have been detached while responder, so there is no action here + return; + } + var releaseGesture = sceneConfig.gestures[releaseGestureAction]; + var destIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + if (this.spring.getCurrentValue() === 0) { + // The spring is at zero, so the gesture is already complete + this.spring.setCurrentValue(0).setAtRest(); + this._completeTransition(); + return; + } + var isTravelVertical = releaseGesture.direction === 'top-to-bottom' || releaseGesture.direction === 'bottom-to-top'; + var isTravelInverted = releaseGesture.direction === 'right-to-left' || releaseGesture.direction === 'bottom-to-top'; + var velocity, gestureDistance; + if (isTravelVertical) { + velocity = isTravelInverted ? -gestureState.vy : gestureState.vy; + gestureDistance = isTravelInverted ? -gestureState.dy : gestureState.dy; + } else { + velocity = isTravelInverted ? -gestureState.vx : gestureState.vx; + gestureDistance = isTravelInverted ? -gestureState.dx : gestureState.dx; + } + var transitionVelocity = clamp(-10, velocity, 10); + if (Math.abs(velocity) < releaseGesture.notMoving) { + // The gesture velocity is so slow, is "not moving" + var hasGesturedEnoughToComplete = gestureDistance > releaseGesture.fullDistance * releaseGesture.stillCompletionRatio; + transitionVelocity = hasGesturedEnoughToComplete ? releaseGesture.snapVelocity : -releaseGesture.snapVelocity; + } + if (transitionVelocity < 0 || this._doesGestureOverswipe(releaseGestureAction)) { + // This gesture is to an overswiped region or does not have enough velocity to complete + // If we are currently mid-transition, then this gesture was a pending gesture. Because this gesture takes no action, we can stop here + if (this.state.transitionFromIndex == null) { + // There is no current transition, so we need to transition back to the presented index + var transitionBackToPresentedIndex = this.state.presentedIndex; + // slight hack: change the presented index for a moment in order to transitionTo correctly + this.state.presentedIndex = destIndex; + this._transitionTo( + transitionBackToPresentedIndex, + - transitionVelocity, + 1 - this.spring.getCurrentValue() + ); + } + } else { + // The gesture has enough velocity to complete, so we transition to the gesture's destination + this._emitWillFocus(this.state.routeStack[destIndex]); + this._transitionTo( + destIndex, + transitionVelocity, + null, + () => { + if (releaseGestureAction === 'pop') { + this._cleanScenesPastIndex(destIndex); + } + } + ); + } + this._detachGesture(); + }, + + _handlePanResponderTerminate: function(e, gestureState) { + var destIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + this._detachGesture(); + var transitionBackToPresentedIndex = this.state.presentedIndex; + // slight hack: change the presented index for a moment in order to transitionTo correctly + this.state.presentedIndex = destIndex; + this._transitionTo( + transitionBackToPresentedIndex, + null, + 1 - this.spring.getCurrentValue() + ); + }, + + _attachGesture: function(gestureId) { + this.state.activeGesture = gestureId; + var gesturingToIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + this._enableScene(gesturingToIndex); + }, + + _detachGesture: function() { + this.state.activeGesture = null; + this.state.pendingGestureProgress = null; + this._hideScenes(); + }, + + _handlePanResponderMove: function(e, gestureState) { + var sceneConfig = this.state.sceneConfigStack[this.state.presentedIndex]; + if (this.state.activeGesture) { + var gesture = sceneConfig.gestures[this.state.activeGesture]; + return this._moveAttachedGesture(gesture, gestureState); + } + var matchedGesture = this._matchGestureAction(GESTURE_ACTIONS, sceneConfig.gestures, gestureState); + if (matchedGesture) { + this._attachGesture(matchedGesture); + } + }, + + _moveAttachedGesture: function(gesture, gestureState) { + var isTravelVertical = gesture.direction === 'top-to-bottom' || gesture.direction === 'bottom-to-top'; + var isTravelInverted = gesture.direction === 'right-to-left' || gesture.direction === 'bottom-to-top'; + var distance = isTravelVertical ? gestureState.dy : gestureState.dx; + distance = isTravelInverted ? - distance : distance; + var gestureDetectMovement = gesture.gestureDetectMovement; + var nextProgress = (distance - gestureDetectMovement) / + (gesture.fullDistance - gestureDetectMovement); + if (nextProgress < 0 && gesture.isDetachable) { + var gesturingToIndex = this.state.presentedIndex + this._deltaForGestureAction(this.state.activeGesture); + this._transitionBetween(this.state.presentedIndex, gesturingToIndex, 0); + this._detachGesture(); + if (this.state.pendingGestureProgress != null) { + this.spring.setCurrentValue(0); + } + return; + } + if (this._doesGestureOverswipe(this.state.activeGesture)) { + var frictionConstant = gesture.overswipe.frictionConstant; + var frictionByDistance = gesture.overswipe.frictionByDistance; + var frictionRatio = 1 / ((frictionConstant) + (Math.abs(nextProgress) * frictionByDistance)); + nextProgress *= frictionRatio; + } + nextProgress = clamp(0, nextProgress, 1); + if (this.state.transitionFromIndex != null) { + this.state.pendingGestureProgress = nextProgress; + } else if (this.state.pendingGestureProgress) { + this.spring.setEndValue(nextProgress); + } else { + this.spring.setCurrentValue(nextProgress); + } + }, + + _matchGestureAction: function(eligibleGestures, gestures, gestureState) { + if (!gestures) { + return null; + } + var matchedGesture = null; + eligibleGestures.some((gestureName, gestureIndex) => { + var gesture = gestures[gestureName]; + if (!gesture) { + return; + } + if (gesture.overswipe == null && this._doesGestureOverswipe(gestureName)) { + // cannot swipe past first or last scene without overswiping + return false; + } + var isTravelVertical = gesture.direction === 'top-to-bottom' || gesture.direction === 'bottom-to-top'; + var isTravelInverted = gesture.direction === 'right-to-left' || gesture.direction === 'bottom-to-top'; + var currentLoc = isTravelVertical ? gestureState.moveY : gestureState.moveX; + var travelDist = isTravelVertical ? gestureState.dy : gestureState.dx; + var oppositeAxisTravelDist = + isTravelVertical ? gestureState.dx : gestureState.dy; + var edgeHitWidth = gesture.edgeHitWidth; + if (isTravelInverted) { + currentLoc = -currentLoc; + travelDist = -travelDist; + oppositeAxisTravelDist = -oppositeAxisTravelDist; + edgeHitWidth = isTravelVertical ? + -(SCREEN_HEIGHT - edgeHitWidth) : + -(SCREEN_WIDTH - edgeHitWidth); + } + var moveStartedInRegion = gesture.edgeHitWidth == null || + currentLoc < edgeHitWidth; + if (!moveStartedInRegion) { + return false; + } + var moveTravelledFarEnough = travelDist >= gesture.gestureDetectMovement; + if (!moveTravelledFarEnough) { + return false; + } + var directionIsCorrect = Math.abs(travelDist) > Math.abs(oppositeAxisTravelDist) * gesture.directionRatio; + if (directionIsCorrect) { + matchedGesture = gestureName; + return true; + } else { + this._eligibleGestures = this._eligibleGestures.slice().splice(gestureIndex, 1); + } + }); + return matchedGesture; + }, + + _transitionSceneStyle: function(fromIndex, toIndex, progress, index) { + var viewAtIndex = this.refs['scene_' + index]; + if (viewAtIndex === null || viewAtIndex === undefined) { + return; + } + // Use toIndex animation when we move forwards. Use fromIndex when we move back + var sceneConfigIndex = fromIndex < toIndex ? toIndex : fromIndex; + var sceneConfig = this.state.sceneConfigStack[sceneConfigIndex]; + // this happens for overswiping when there is no scene at toIndex + if (!sceneConfig) { + sceneConfig = this.state.sceneConfigStack[sceneConfigIndex - 1]; + } + var styleToUse = {}; + var useFn = index < fromIndex || index < toIndex ? + sceneConfig.animationInterpolators.out : + sceneConfig.animationInterpolators.into; + var directionAdjustedProgress = fromIndex < toIndex ? progress : 1 - progress; + var didChange = useFn(styleToUse, directionAdjustedProgress); + if (didChange) { + viewAtIndex.setNativeProps({style: styleToUse}); + } + }, + + _transitionBetween: function(fromIndex, toIndex, progress) { + this._transitionSceneStyle(fromIndex, toIndex, progress, fromIndex); + this._transitionSceneStyle(fromIndex, toIndex, progress, toIndex); + var navBar = this._navBar; + if (navBar && navBar.updateProgress && toIndex >= 0 && fromIndex >= 0) { + navBar.updateProgress(progress, fromIndex, toIndex); + } + }, + + _handleResponderTerminationRequest: function() { + return false; + }, + + _getDestIndexWithinBounds: function(n) { + var currentIndex = this.state.presentedIndex; + var destIndex = currentIndex + n; + invariant( + destIndex >= 0, + 'Cannot jump before the first route.' + ); + var maxIndex = this.state.routeStack.length - 1; + invariant( + maxIndex >= destIndex, + 'Cannot jump past the last route.' + ); + return destIndex; + }, + + _jumpN: function(n) { + var destIndex = this._getDestIndexWithinBounds(n); + this._enableScene(destIndex); + this._emitWillFocus(this.state.routeStack[destIndex]); + this._transitionTo(destIndex); + }, + + jumpTo: function(route) { + var destIndex = this.state.routeStack.indexOf(route); + invariant( + destIndex !== -1, + 'Cannot jump to route that is not in the route stack' + ); + this._jumpN(destIndex - this.state.presentedIndex); + }, + + jumpForward: function() { + this._jumpN(1); + }, + + jumpBack: function() { + this._jumpN(-1); + }, + + push: function(route) { + invariant(!!route, 'Must supply route to push'); + var activeLength = this.state.presentedIndex + 1; + var activeStack = this.state.routeStack.slice(0, activeLength); + var activeAnimationConfigStack = this.state.sceneConfigStack.slice(0, activeLength); + var nextStack = activeStack.concat([route]); + var destIndex = nextStack.length - 1; + var nextAnimationConfigStack = activeAnimationConfigStack.concat([ + this.props.configureScene(route), + ]); + this._emitWillFocus(nextStack[destIndex]); + this.setState({ + routeStack: nextStack, + sceneConfigStack: nextAnimationConfigStack, + }, () => { + this._enableScene(destIndex); + this._transitionTo(destIndex); + }); + }, + + _popN: function(n) { + if (n === 0) { + return; + } + invariant( + this.state.presentedIndex - n >= 0, + 'Cannot pop below zero' + ); + var popIndex = this.state.presentedIndex - n; + this._enableScene(popIndex); + this._emitWillFocus(this.state.routeStack[popIndex]); + this._transitionTo( + popIndex, + null, // default velocity + null, // no spring jumping + () => { + this._cleanScenesPastIndex(popIndex); + } + ); + }, + + pop: function() { + if (this.state.transitionQueue.length) { + // This is the workaround to prevent user from firing multiple `pop()` + // calls that may pop the routes beyond the limit. + // Because `this.state.presentedIndex` does not update until the + // transition starts, we can't reliably use `this.state.presentedIndex` + // to know whether we can safely keep popping the routes or not at this + // moment. + return; + } + + if (this.state.presentedIndex > 0) { + this._popN(1); + } + }, + + /** + * Replace a route in the navigation stack. + * + * `index` specifies the route in the stack that should be replaced. + * If it's negative, it counts from the back. + */ + replaceAtIndex: function(route, index, cb) { + invariant(!!route, 'Must supply route to replace'); + if (index < 0) { + index += this.state.routeStack.length; + } + + if (this.state.routeStack.length <= index) { + return; + } + + var nextRouteStack = this.state.routeStack.slice(); + var nextAnimationModeStack = this.state.sceneConfigStack.slice(); + nextRouteStack[index] = route; + nextAnimationModeStack[index] = this.props.configureScene(route); + + if (index === this.state.presentedIndex) { + this._emitWillFocus(route); + } + this.setState({ + routeStack: nextRouteStack, + sceneConfigStack: nextAnimationModeStack, + }, () => { + if (index === this.state.presentedIndex) { + this._emitDidFocus(route); + } + cb && cb(); + }); + }, + + /** + * Replaces the current scene in the stack. + */ + replace: function(route) { + this.replaceAtIndex(route, this.state.presentedIndex); + }, + + /** + * Replace the current route's parent. + */ + replacePrevious: function(route) { + this.replaceAtIndex(route, this.state.presentedIndex - 1); + }, + + popToTop: function() { + this.popToRoute(this.state.routeStack[0]); + }, + + popToRoute: function(route) { + var indexOfRoute = this.state.routeStack.indexOf(route); + invariant( + indexOfRoute !== -1, + 'Calling popToRoute for a route that doesn\'t exist!' + ); + var numToPop = this.state.presentedIndex - indexOfRoute; + this._popN(numToPop); + }, + + replacePreviousAndPop: function(route) { + if (this.state.routeStack.length < 2) { + return; + } + this.replacePrevious(route); + this.pop(); + }, + + resetTo: function(route) { + invariant(!!route, 'Must supply route to push'); + this.replaceAtIndex(route, 0, () => { + // Do not use popToRoute here, because race conditions could prevent the + // route from existing at this time. Instead, just go to index 0 + if (this.state.presentedIndex > 0) { + this._popN(this.state.presentedIndex); + } + }); + }, + + getCurrentRoutes: function() { + // Clone before returning to avoid caller mutating the stack + return this.state.routeStack.slice(); + }, + + _cleanScenesPastIndex: function(index) { + var newStackLength = index + 1; + // Remove any unneeded rendered routes. + if (newStackLength < this.state.routeStack.length) { + this.setState({ + sceneConfigStack: this.state.sceneConfigStack.slice(0, newStackLength), + routeStack: this.state.routeStack.slice(0, newStackLength), + }); + } + }, + + _renderScene: function(route, i) { + var disabledSceneStyle = null; + var disabledScenePointerEvents = 'auto'; + if (i !== this.state.presentedIndex) { + disabledSceneStyle = styles.disabledScene; + disabledScenePointerEvents = 'none'; + } + return ( + { + return (this.state.transitionFromIndex != null) || (this.state.transitionFromIndex != null); + }} + pointerEvents={disabledScenePointerEvents} + style={[styles.baseScene, this.props.sceneStyle, disabledSceneStyle]}> + {this.props.renderScene( + route, + this + )} + + ); + }, + + _renderNavigationBar: function() { + if (!this.props.navigationBar) { + return null; + } + return React.cloneElement(this.props.navigationBar, { + ref: (navBar) => { this._navBar = navBar; }, + navigator: this, + navState: this.state, + }); + }, + + render: function() { + var newRenderedSceneMap = new Map(); + var scenes = this.state.routeStack.map((route, index) => { + var renderedScene; + if (this._renderedSceneMap.has(route) && + index !== this.state.presentedIndex) { + renderedScene = this._renderedSceneMap.get(route); + } else { + renderedScene = this._renderScene(route, index); + } + newRenderedSceneMap.set(route, renderedScene); + return renderedScene; + }); + this._renderedSceneMap = newRenderedSceneMap; + return ( + + + {scenes} + + {this._renderNavigationBar()} + + ); + }, + + _getNavigationContext: function() { + if (!this._navigationContext) { + this._navigationContext = new NavigationContext(); + } + return this._navigationContext; + } +}); + +module.exports = Navigator; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBar.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBar.js new file mode 100644 index 00000000..ddfd3326 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBar.js @@ -0,0 +1,278 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigatorBreadcrumbNavigationBar + */ +'use strict'; + +var NavigatorBreadcrumbNavigationBarStyles = require('NavigatorBreadcrumbNavigationBarStyles'); +var NavigatorNavigationBarStyles = require('NavigatorNavigationBarStyles'); +var React = require('React'); +var StaticContainer = require('StaticContainer.react'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var { Map } = require('immutable'); + +var invariant = require('invariant'); + +var Interpolators = NavigatorBreadcrumbNavigationBarStyles.Interpolators; +var PropTypes = React.PropTypes; + +/** + * Reusable props objects. + */ +var CRUMB_PROPS = Interpolators.map(() => {return {style: {}};}); +var ICON_PROPS = Interpolators.map(() => {return {style: {}};}); +var SEPARATOR_PROPS = Interpolators.map(() => {return {style: {}};}); +var TITLE_PROPS = Interpolators.map(() => {return {style: {}};}); +var RIGHT_BUTTON_PROPS = Interpolators.map(() => {return {style: {}};}); + + +var navStatePresentedIndex = function(navState) { + if (navState.presentedIndex !== undefined) { + return navState.presentedIndex; + } + // TODO: rename `observedTopOfStack` to `presentedIndex` in `NavigatorIOS` + return navState.observedTopOfStack; +}; + + +/** + * The first route is initially rendered using a different style than all + * future routes. + * + * @param {number} index Index of breadcrumb. + * @return {object} Style config for initial rendering of index. + */ +var initStyle = function(index, presentedIndex) { + return index === presentedIndex ? NavigatorBreadcrumbNavigationBarStyles.Center[index] : + index < presentedIndex ? NavigatorBreadcrumbNavigationBarStyles.Left[index] : + NavigatorBreadcrumbNavigationBarStyles.Right[index]; +}; + +var NavigatorBreadcrumbNavigationBar = React.createClass({ + propTypes: { + navigator: PropTypes.shape({ + push: PropTypes.func, + pop: PropTypes.func, + replace: PropTypes.func, + popToRoute: PropTypes.func, + popToTop: PropTypes.func, + }), + routeMapper: PropTypes.shape({ + rightContentForRoute: PropTypes.func, + titleContentForRoute: PropTypes.func, + iconForRoute: PropTypes.func, + }), + navState: React.PropTypes.shape({ + routeStack: React.PropTypes.arrayOf(React.PropTypes.object), + presentedIndex: React.PropTypes.number, + }), + style: View.propTypes.style, + }, + + statics: { + Styles: NavigatorBreadcrumbNavigationBarStyles, + }, + + _updateIndexProgress: function(progress, index, fromIndex, toIndex) { + var amount = toIndex > fromIndex ? progress : (1 - progress); + var oldDistToCenter = index - fromIndex; + var newDistToCenter = index - toIndex; + var interpolate; + invariant( + Interpolators[index], + 'Cannot find breadcrumb interpolators for ' + index + ); + if (oldDistToCenter > 0 && newDistToCenter === 0 || + newDistToCenter > 0 && oldDistToCenter === 0) { + interpolate = Interpolators[index].RightToCenter; + } else if (oldDistToCenter < 0 && newDistToCenter === 0 || + newDistToCenter < 0 && oldDistToCenter === 0) { + interpolate = Interpolators[index].CenterToLeft; + } else if (oldDistToCenter === newDistToCenter) { + interpolate = Interpolators[index].RightToCenter; + } else { + interpolate = Interpolators[index].RightToLeft; + } + + if (interpolate.Crumb(CRUMB_PROPS[index].style, amount)) { + this._setPropsIfExists('crumb_' + index, CRUMB_PROPS[index]); + } + if (interpolate.Icon(ICON_PROPS[index].style, amount)) { + this._setPropsIfExists('icon_' + index, ICON_PROPS[index]); + } + if (interpolate.Separator(SEPARATOR_PROPS[index].style, amount)) { + this._setPropsIfExists('separator_' + index, SEPARATOR_PROPS[index]); + } + if (interpolate.Title(TITLE_PROPS[index].style, amount)) { + this._setPropsIfExists('title_' + index, TITLE_PROPS[index]); + } + var right = this.refs['right_' + index]; + if (right && + interpolate.RightItem(RIGHT_BUTTON_PROPS[index].style, amount)) { + right.setNativeProps(RIGHT_BUTTON_PROPS[index]); + } + }, + + updateProgress: function(progress, fromIndex, toIndex) { + var max = Math.max(fromIndex, toIndex); + var min = Math.min(fromIndex, toIndex); + for (var index = min; index <= max; index++) { + this._updateIndexProgress(progress, index, fromIndex, toIndex); + } + }, + + onAnimationStart: function(fromIndex, toIndex) { + var max = Math.max(fromIndex, toIndex); + var min = Math.min(fromIndex, toIndex); + for (var index = min; index <= max; index++) { + this._setRenderViewsToHardwareTextureAndroid(index, true); + } + }, + + onAnimationEnd: function() { + var max = this.props.navState.routeStack.length - 1; + for (var index = 0; index <= max; index++) { + this._setRenderViewsToHardwareTextureAndroid(index, false); + } + }, + + _setRenderViewsToHardwareTextureAndroid: function(index, renderToHardwareTexture) { + var props = { + renderToHardwareTextureAndroid: renderToHardwareTexture, + }; + + this._setPropsIfExists('icon_' + index, props); + this._setPropsIfExists('separator_' + index, props); + this._setPropsIfExists('title_' + index, props); + this._setPropsIfExists('right_' + index, props); + }, + + componentWillMount: function() { + this._descriptors = { + crumb: new Map(), + title: new Map(), + right: new Map(), + }; + }, + + render: function() { + var navState = this.props.navState; + var icons = navState && navState.routeStack.map(this._getBreadcrumb); + var titles = navState.routeStack.map(this._getTitle); + var buttons = navState.routeStack.map(this._getRightButton); + return ( + + {titles} + {icons} + {buttons} + + ); + }, + + _getBreadcrumb: function(route, index) { + if (this._descriptors.crumb.has(route)) { + return this._descriptors.crumb.get(route); + } + + var navBarRouteMapper = this.props.routeMapper; + var firstStyles = initStyle(index, navStatePresentedIndex(this.props.navState)); + + var breadcrumbDescriptor = ( + + + {navBarRouteMapper.iconForRoute(route, this.props.navigator)} + + + {navBarRouteMapper.separatorForRoute(route, this.props.navigator)} + + + ); + + this._descriptors.crumb = this._descriptors.crumb.set(route, breadcrumbDescriptor); + return breadcrumbDescriptor; + }, + + _getTitle: function(route, index) { + if (this._descriptors.title.has(route)) { + return this._descriptors.title.get(route); + } + + var titleContent = this.props.routeMapper.titleContentForRoute( + this.props.navState.routeStack[index], + this.props.navigator + ); + var firstStyles = initStyle(index, navStatePresentedIndex(this.props.navState)); + + var titleDescriptor = ( + + {titleContent} + + ); + this._descriptors.title = this._descriptors.title.set(route, titleDescriptor); + return titleDescriptor; + }, + + _getRightButton: function(route, index) { + if (this._descriptors.right.has(route)) { + return this._descriptors.right.get(route); + } + var rightContent = this.props.routeMapper.rightContentForRoute( + this.props.navState.routeStack[index], + this.props.navigator + ); + if (!rightContent) { + this._descriptors.right = this._descriptors.right.set(route, null); + return null; + } + var firstStyles = initStyle(index, navStatePresentedIndex(this.props.navState)); + var rightButtonDescriptor = ( + + {rightContent} + + ); + this._descriptors.right = this._descriptors.right.set(route, rightButtonDescriptor); + return rightButtonDescriptor; + }, + + _setPropsIfExists: function(ref, props) { + var ref = this.refs[ref]; + ref && ref.setNativeProps(props); + }, +}); + +var styles = StyleSheet.create({ + breadCrumbContainer: { + overflow: 'hidden', + position: 'absolute', + height: NavigatorNavigationBarStyles.General.TotalNavHeight, + top: 0, + left: 0, + right: 0, + }, +}); + +module.exports = NavigatorBreadcrumbNavigationBar; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBarStyles.ios.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBarStyles.ios.js new file mode 100644 index 00000000..bf6a96b6 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorBreadcrumbNavigationBarStyles.ios.js @@ -0,0 +1,227 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigatorBreadcrumbNavigationBarStyles + */ +'use strict'; + +var Dimensions = require('Dimensions'); +var NavigatorNavigationBarStyles = require('NavigatorNavigationBarStyles'); + +var buildStyleInterpolator = require('buildStyleInterpolator'); +var merge = require('merge'); + +var SCREEN_WIDTH = Dimensions.get('window').width; +var STATUS_BAR_HEIGHT = NavigatorNavigationBarStyles.General.StatusBarHeight; +var NAV_BAR_HEIGHT = NavigatorNavigationBarStyles.General.NavBarHeight; + +var SPACING = 4; +var ICON_WIDTH = 40; +var SEPARATOR_WIDTH = 9; +var CRUMB_WIDTH = ICON_WIDTH + SEPARATOR_WIDTH; + +var OPACITY_RATIO = 100; +var ICON_INACTIVE_OPACITY = 0.6; +var MAX_BREADCRUMBS = 10; + +var CRUMB_BASE = { + position: 'absolute', + flexDirection: 'row', + top: STATUS_BAR_HEIGHT, + width: CRUMB_WIDTH, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', +}; + +var ICON_BASE = { + width: ICON_WIDTH, + height: NAV_BAR_HEIGHT, +}; + +var SEPARATOR_BASE = { + width: SEPARATOR_WIDTH, + height: NAV_BAR_HEIGHT, +}; + +var TITLE_BASE = { + position: 'absolute', + top: STATUS_BAR_HEIGHT, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', +}; + +// For first title styles, make sure first title is centered +var FIRST_TITLE_BASE = merge(TITLE_BASE, { + left: 0, + right: 0, + alignItems: 'center', + height: NAV_BAR_HEIGHT, +}); + +var RIGHT_BUTTON_BASE = { + position: 'absolute', + top: STATUS_BAR_HEIGHT, + right: SPACING, + overflow: 'hidden', + opacity: 1, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', +}; + +/** + * Precompute crumb styles so that they don't need to be recomputed on every + * interaction. + */ +var LEFT = []; +var CENTER = []; +var RIGHT = []; +for (var i = 0; i < MAX_BREADCRUMBS; i++) { + var crumbLeft = CRUMB_WIDTH * i + SPACING; + LEFT[i] = { + Crumb: merge(CRUMB_BASE, { left: crumbLeft }), + Icon: merge(ICON_BASE, { opacity: ICON_INACTIVE_OPACITY }), + Separator: merge(SEPARATOR_BASE, { opacity: 1 }), + Title: merge(TITLE_BASE, { left: crumbLeft, opacity: 0 }), + RightItem: merge(RIGHT_BUTTON_BASE, { opacity: 0 }), + }; + CENTER[i] = { + Crumb: merge(CRUMB_BASE, { left: crumbLeft }), + Icon: merge(ICON_BASE, { opacity: 1 }), + Separator: merge(SEPARATOR_BASE, { opacity: 0 }), + Title: merge(TITLE_BASE, { + left: crumbLeft + ICON_WIDTH, + opacity: 1, + }), + RightItem: merge(RIGHT_BUTTON_BASE, { opacity: 1 }), + }; + var crumbRight = SCREEN_WIDTH - 100; + RIGHT[i] = { + Crumb: merge(CRUMB_BASE, { left: crumbRight}), + Icon: merge(ICON_BASE, { opacity: 0 }), + Separator: merge(SEPARATOR_BASE, { opacity: 0 }), + Title: merge(TITLE_BASE, { + left: crumbRight + ICON_WIDTH, + opacity: 0, + }), + RightItem: merge(RIGHT_BUTTON_BASE, { opacity: 0 }), + }; +} + +// Special case the CENTER state of the first scene. +CENTER[0] = { + Crumb: merge(CRUMB_BASE, {left: SCREEN_WIDTH / 4}), + Icon: merge(ICON_BASE, {opacity: 0}), + Separator: merge(SEPARATOR_BASE, {opacity: 0}), + Title: merge(FIRST_TITLE_BASE, {opacity: 1}), + RightItem: CENTER[0].RightItem, +}; +LEFT[0].Title = merge(FIRST_TITLE_BASE, {left: - SCREEN_WIDTH / 4, opacity: 0}); +RIGHT[0].Title = merge(FIRST_TITLE_BASE, {opacity: 0}); + + +var buildIndexSceneInterpolator = function(startStyles, endStyles) { + return { + Crumb: buildStyleInterpolator({ + left: { + type: 'linear', + from: startStyles.Crumb.left, + to: endStyles.Crumb.left, + min: 0, + max: 1, + extrapolate: true, + }, + }), + Icon: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.Icon.opacity, + to: endStyles.Icon.opacity, + min: 0, + max: 1, + }, + }), + Separator: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.Separator.opacity, + to: endStyles.Separator.opacity, + min: 0, + max: 1, + }, + }), + Title: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.Title.opacity, + to: endStyles.Title.opacity, + min: 0, + max: 1, + }, + left: { + type: 'linear', + from: startStyles.Title.left, + to: endStyles.Title.left, + min: 0, + max: 1, + extrapolate: true, + }, + }), + RightItem: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.RightItem.opacity, + to: endStyles.RightItem.opacity, + min: 0, + max: 1, + round: OPACITY_RATIO, + }, + }), + }; +}; + +var Interpolators = CENTER.map(function(_, ii) { + return { + // Animating *into* the center stage from the right + RightToCenter: buildIndexSceneInterpolator(RIGHT[ii], CENTER[ii]), + // Animating out of the center stage, to the left + CenterToLeft: buildIndexSceneInterpolator(CENTER[ii], LEFT[ii]), + // Both stages (animating *past* the center stage) + RightToLeft: buildIndexSceneInterpolator(RIGHT[ii], LEFT[ii]), + }; +}); + +/** + * Contains constants that are used in constructing both `StyleSheet`s and + * inline styles during transitions. + */ +module.exports = { + Interpolators, + Left: LEFT, + Center: CENTER, + Right: RIGHT, + IconWidth: ICON_WIDTH, + IconHeight: NAV_BAR_HEIGHT, + SeparatorWidth: SEPARATOR_WIDTH, + SeparatorHeight: NAV_BAR_HEIGHT, +}; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBar.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBar.js new file mode 100644 index 00000000..a2470518 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBar.js @@ -0,0 +1,204 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigatorNavigationBar + */ +'use strict'; + +var React = require('React'); +var NavigatorNavigationBarStyles = require('NavigatorNavigationBarStyles'); +var StaticContainer = require('StaticContainer.react'); +var StyleSheet = require('StyleSheet'); +var View = require('View'); + +var { Map } = require('immutable'); + +var COMPONENT_NAMES = ['Title', 'LeftButton', 'RightButton']; + +var navStatePresentedIndex = function(navState) { + if (navState.presentedIndex !== undefined) { + return navState.presentedIndex; + } + // TODO: rename `observedTopOfStack` to `presentedIndex` in `NavigatorIOS` + return navState.observedTopOfStack; +}; + +var NavigatorNavigationBar = React.createClass({ + + propTypes: { + navigator: React.PropTypes.object, + routeMapper: React.PropTypes.shape({ + Title: React.PropTypes.func.isRequired, + LeftButton: React.PropTypes.func.isRequired, + RightButton: React.PropTypes.func.isRequired, + }), + navState: React.PropTypes.shape({ + routeStack: React.PropTypes.arrayOf(React.PropTypes.object), + presentedIndex: React.PropTypes.number, + }), + style: View.propTypes.style, + }, + + statics: { + Styles: NavigatorNavigationBarStyles, + }, + + componentWillMount: function() { + this._components = {}; + this._descriptors = {}; + + COMPONENT_NAMES.forEach(componentName => { + this._components[componentName] = new Map(); + this._descriptors[componentName] = new Map(); + }); + }, + + _getReusableProps: function( + /*string*/componentName, + /*number*/index + ) /*object*/ { + if (!this._reusableProps) { + this._reusableProps = {}; + } + var propStack = this._reusableProps[componentName]; + if (!propStack) { + propStack = this._reusableProps[componentName] = []; + } + var props = propStack[index]; + if (!props) { + props = propStack[index] = {style:{}}; + } + return props; + }, + + _updateIndexProgress: function( + /*number*/progress, + /*number*/index, + /*number*/fromIndex, + /*number*/toIndex + ) { + var amount = toIndex > fromIndex ? progress : (1 - progress); + var oldDistToCenter = index - fromIndex; + var newDistToCenter = index - toIndex; + var interpolate; + if (oldDistToCenter > 0 && newDistToCenter === 0 || + newDistToCenter > 0 && oldDistToCenter === 0) { + interpolate = NavigatorNavigationBarStyles.Interpolators.RightToCenter; + } else if (oldDistToCenter < 0 && newDistToCenter === 0 || + newDistToCenter < 0 && oldDistToCenter === 0) { + interpolate = NavigatorNavigationBarStyles.Interpolators.CenterToLeft; + } else if (oldDistToCenter === newDistToCenter) { + interpolate = NavigatorNavigationBarStyles.Interpolators.RightToCenter; + } else { + interpolate = NavigatorNavigationBarStyles.Interpolators.RightToLeft; + } + + COMPONENT_NAMES.forEach(function (componentName) { + var component = this._components[componentName].get(this.props.navState.routeStack[index]); + var props = this._getReusableProps(componentName, index); + if (component && interpolate[componentName](props.style, amount)) { + component.setNativeProps(props); + } + }, this); + }, + + updateProgress: function( + /*number*/progress, + /*number*/fromIndex, + /*number*/toIndex + ) { + var max = Math.max(fromIndex, toIndex); + var min = Math.min(fromIndex, toIndex); + for (var index = min; index <= max; index++) { + this._updateIndexProgress(progress, index, fromIndex, toIndex); + } + }, + + render: function() { + var navState = this.props.navState; + var components = COMPONENT_NAMES.map(function (componentName) { + return navState.routeStack.map( + this._getComponent.bind(this, componentName) + ); + }, this); + + return ( + + {components} + + ); + }, + + _getComponent: function( + /*string*/componentName, + /*object*/route, + /*number*/index + ) /*?Object*/ { + if (this._descriptors[componentName].includes(route)) { + return this._descriptors[componentName].get(route); + } + + var rendered = null; + + var content = this.props.routeMapper[componentName]( + this.props.navState.routeStack[index], + this.props.navigator, + index, + this.props.navState + ); + if (!content) { + return null; + } + + var initialStage = index === navStatePresentedIndex(this.props.navState) ? + NavigatorNavigationBarStyles.Stages.Center : NavigatorNavigationBarStyles.Stages.Left; + rendered = ( + { + this._components[componentName] = this._components[componentName].set(route, ref); + }} + style={initialStage[componentName]}> + {content} + + ); + + this._descriptors[componentName] = this._descriptors[componentName].set(route, rendered); + return rendered; + }, + +}); + + +var styles = StyleSheet.create({ + navBarContainer: { + position: 'absolute', + height: NavigatorNavigationBarStyles.General.TotalNavHeight, + top: 0, + left: 0, + right: 0, + backgroundColor: 'transparent', + }, +}); + +module.exports = NavigatorNavigationBar; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBarStyles.ios.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBarStyles.ios.js new file mode 100644 index 00000000..769722a6 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorNavigationBarStyles.ios.js @@ -0,0 +1,175 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigatorNavigationBarStyles + */ +'use strict'; + +var Dimensions = require('Dimensions'); + +var buildStyleInterpolator = require('buildStyleInterpolator'); +var merge = require('merge'); + +var SCREEN_WIDTH = Dimensions.get('window').width; +var NAV_BAR_HEIGHT = 44; +var STATUS_BAR_HEIGHT = 20; +var NAV_HEIGHT = NAV_BAR_HEIGHT + STATUS_BAR_HEIGHT; + +var BASE_STYLES = { + Title: { + position: 'absolute', + top: STATUS_BAR_HEIGHT, + left: 0, + alignItems: 'center', + width: SCREEN_WIDTH, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', + }, + LeftButton: { + position: 'absolute', + top: STATUS_BAR_HEIGHT, + left: 0, + overflow: 'hidden', + opacity: 1, + width: SCREEN_WIDTH / 3, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', + }, + RightButton: { + position: 'absolute', + top: STATUS_BAR_HEIGHT, + left: 2 * SCREEN_WIDTH / 3, + overflow: 'hidden', + opacity: 1, + alignItems: 'flex-end', + width: SCREEN_WIDTH / 3, + height: NAV_BAR_HEIGHT, + backgroundColor: 'transparent', + }, +}; + +// There are 3 stages: left, center, right. All previous navigation +// items are in the left stage. The current navigation item is in the +// center stage. All upcoming navigation items are in the right stage. +// Another way to think of the stages is in terms of transitions. When +// we move forward in the navigation stack, we perform a +// right-to-center transition on the new navigation item and a +// center-to-left transition on the current navigation item. +var Stages = { + Left: { + Title: merge(BASE_STYLES.Title, { left: - SCREEN_WIDTH / 2, opacity: 0 }), + LeftButton: merge(BASE_STYLES.LeftButton, { left: - SCREEN_WIDTH / 3, opacity: 1 }), + RightButton: merge(BASE_STYLES.RightButton, { left: SCREEN_WIDTH / 3, opacity: 0 }), + }, + Center: { + Title: merge(BASE_STYLES.Title, { left: 0, opacity: 1 }), + LeftButton: merge(BASE_STYLES.LeftButton, { left: 0, opacity: 1 }), + RightButton: merge(BASE_STYLES.RightButton, { left: 2 * SCREEN_WIDTH / 3 - 0, opacity: 1 }), + }, + Right: { + Title: merge(BASE_STYLES.Title, { left: SCREEN_WIDTH / 2, opacity: 0 }), + LeftButton: merge(BASE_STYLES.LeftButton, { left: 0, opacity: 0 }), + RightButton: merge(BASE_STYLES.RightButton, { left: SCREEN_WIDTH, opacity: 0 }), + }, +}; + + +var opacityRatio = 100; + +function buildSceneInterpolators(startStyles, endStyles) { + return { + Title: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.Title.opacity, + to: endStyles.Title.opacity, + min: 0, + max: 1, + }, + left: { + type: 'linear', + from: startStyles.Title.left, + to: endStyles.Title.left, + min: 0, + max: 1, + extrapolate: true, + }, + }), + LeftButton: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.LeftButton.opacity, + to: endStyles.LeftButton.opacity, + min: 0, + max: 1, + round: opacityRatio, + }, + left: { + type: 'linear', + from: startStyles.LeftButton.left, + to: endStyles.LeftButton.left, + min: 0, + max: 1, + }, + }), + RightButton: buildStyleInterpolator({ + opacity: { + type: 'linear', + from: startStyles.RightButton.opacity, + to: endStyles.RightButton.opacity, + min: 0, + max: 1, + round: opacityRatio, + }, + left: { + type: 'linear', + from: startStyles.RightButton.left, + to: endStyles.RightButton.left, + min: 0, + max: 1, + extrapolate: true, + }, + }), + }; +} + +var Interpolators = { + // Animating *into* the center stage from the right + RightToCenter: buildSceneInterpolators(Stages.Right, Stages.Center), + // Animating out of the center stage, to the left + CenterToLeft: buildSceneInterpolators(Stages.Center, Stages.Left), + // Both stages (animating *past* the center stage) + RightToLeft: buildSceneInterpolators(Stages.Right, Stages.Left), +}; + + +module.exports = { + General: { + NavBarHeight: NAV_BAR_HEIGHT, + StatusBarHeight: STATUS_BAR_HEIGHT, + TotalNavHeight: NAV_HEIGHT, + }, + Interpolators, + Stages, +}; diff --git a/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js new file mode 100644 index 00000000..32cd3363 --- /dev/null +++ b/ios/Pods/React/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js @@ -0,0 +1,621 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. ("Facebook") owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the "Software"). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * ("Your Software"). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @providesModule NavigatorSceneConfigs + */ +'use strict'; + +var Dimensions = require('Dimensions'); +var PixelRatio = require('PixelRatio'); + +var buildStyleInterpolator = require('buildStyleInterpolator'); + +var SCREEN_WIDTH = Dimensions.get('window').width; +var SCREEN_HEIGHT = Dimensions.get('window').height; + +var FadeToTheLeft = { + // Rotate *requires* you to break out each individual component of + // rotation (x, y, z, w) + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: -Math.round(Dimensions.get('window').width * 0.3), y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + // Uncomment to try rotation: + // Quick guide to reasoning about rotations: + // http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#Quaternions + // transformRotateRadians: { + // from: {x: 0, y: 0, z: 0, w: 1}, + // to: {x: 0, y: 0, z: -0.47, w: 0.87}, + // min: 0, + // max: 1, + // type: 'linear', + // extrapolate: true + // }, + transformScale: { + from: {x: 1, y: 1, z: 1}, + to: {x: 0.95, y: 0.95, z: 1}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, + opacity: { + from: 1, + to: 0.3, + min: 0, + max: 1, + type: 'linear', + extrapolate: false, + round: 100, + }, + translateX: { + from: 0, + to: -Math.round(Dimensions.get('window').width * 0.3), + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + scaleX: { + from: 1, + to: 0.95, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, + scaleY: { + from: 1, + to: 0.95, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, +}; + +var FadeToTheRight = { + ...FadeToTheLeft, + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: Math.round(SCREEN_WIDTH * 0.3), y: 0, z: 0}, + }, + translateX: { + from: 0, + to: Math.round(SCREEN_WIDTH * 0.3), + } +}; + +var FadeIn = { + opacity: { + from: 0, + to: 1, + min: 0.5, + max: 1, + type: 'linear', + extrapolate: false, + round: 100, + }, +}; + +var FadeOut = { + opacity: { + from: 1, + to: 0, + min: 0, + max: 0.5, + type: 'linear', + extrapolate: false, + round: 100, + }, +}; + +var ToTheLeft = { + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: -Dimensions.get('window').width, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + opacity: { + value: 1.0, + type: 'constant', + }, + + translateX: { + from: 0, + to: -Dimensions.get('window').width, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var ToTheUp = { + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: 0, y: -Dimensions.get('window').height, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + opacity: { + value: 1.0, + type: 'constant', + }, + translateY: { + from: 0, + to: -Dimensions.get('window').height, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var ToTheDown = { + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: 0, y: Dimensions.get('window').height, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + opacity: { + value: 1.0, + type: 'constant', + }, + translateY: { + from: 0, + to: Dimensions.get('window').height, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var FromTheRight = { + opacity: { + value: 1.0, + type: 'constant', + }, + + transformTranslate: { + from: {x: Dimensions.get('window').width, y: 0, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + + translateX: { + from: Dimensions.get('window').width, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + + scaleX: { + value: 1, + type: 'constant', + }, + scaleY: { + value: 1, + type: 'constant', + }, +}; + +var FromTheLeft = { + ...FromTheRight, + transformTranslate: { + from: {x: -SCREEN_WIDTH, y: 0, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + translateX: { + from: -SCREEN_WIDTH, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var FromTheDown = { + ...FromTheRight, + transformTranslate: { + from: {y: SCREEN_HEIGHT, x: 0, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + translateY: { + from: SCREEN_HEIGHT, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var FromTheTop = { + ...FromTheRight, + transformTranslate: { + from: {y: -SCREEN_HEIGHT, x: 0, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + translateY: { + from: -SCREEN_HEIGHT, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var ToTheBack = { + // Rotate *requires* you to break out each individual component of + // rotation (x, y, z, w) + transformTranslate: { + from: {x: 0, y: 0, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + transformScale: { + from: {x: 1, y: 1, z: 1}, + to: {x: 0.95, y: 0.95, z: 1}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, + opacity: { + from: 1, + to: 0.3, + min: 0, + max: 1, + type: 'linear', + extrapolate: false, + round: 100, + }, + scaleX: { + from: 1, + to: 0.95, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, + scaleY: { + from: 1, + to: 0.95, + min: 0, + max: 1, + type: 'linear', + extrapolate: true + }, +}; + +var FromTheFront = { + opacity: { + value: 1.0, + type: 'constant', + }, + + transformTranslate: { + from: {x: 0, y: Dimensions.get('window').height, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + translateY: { + from: Dimensions.get('window').height, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + scaleX: { + value: 1, + type: 'constant', + }, + scaleY: { + value: 1, + type: 'constant', + }, +}; + +var ToTheBackAndroid = { + opacity: { + value: 1, + type: 'constant', + }, +}; + +var FromTheFrontAndroid = { + opacity: { + from: 0, + to: 1, + min: 0.5, + max: 1, + type: 'linear', + extrapolate: false, + round: 100, + }, + transformTranslate: { + from: {x: 0, y: 100, z: 0}, + to: {x: 0, y: 0, z: 0}, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, + translateY: { + from: 100, + to: 0, + min: 0, + max: 1, + type: 'linear', + extrapolate: true, + round: PixelRatio.get(), + }, +}; + +var BaseOverswipeConfig = { + frictionConstant: 1, + frictionByDistance: 1.5, +}; + +var BaseLeftToRightGesture = { + + // If the gesture can end and restart during one continuous touch + isDetachable: false, + + // How far the swipe must drag to start transitioning + gestureDetectMovement: 2, + + // Amplitude of release velocity that is considered still + notMoving: 0.3, + + // Fraction of directional move required. + directionRatio: 0.66, + + // Velocity to transition with when the gesture release was "not moving" + snapVelocity: 2, + + // Region that can trigger swipe. iOS default is 30px from the left edge + edgeHitWidth: 30, + + // Ratio of gesture completion when non-velocity release will cause action + stillCompletionRatio: 3 / 5, + + fullDistance: SCREEN_WIDTH, + + direction: 'left-to-right', + +}; + +var BaseRightToLeftGesture = { + ...BaseLeftToRightGesture, + direction: 'right-to-left', +}; + +var BaseDownUpGesture = { + ...BaseLeftToRightGesture, + fullDistance: SCREEN_HEIGHT, + direction: 'down-to-up', +}; + +var BaseUpDownGesture = { + ...BaseLeftToRightGesture, + fullDistance: SCREEN_HEIGHT, + direction: 'up-to-down', +}; + +var BaseConfig = { + // A list of all gestures that are enabled on this scene + gestures: { + pop: BaseLeftToRightGesture, + }, + + // Rebound spring parameters when transitioning FROM this scene + springFriction: 26, + springTension: 200, + + // Velocity to start at when transitioning without gesture + defaultTransitionVelocity: 1.5, + + // Animation interpolators for horizontal transitioning: + animationInterpolators: { + into: buildStyleInterpolator(FromTheRight), + out: buildStyleInterpolator(FadeToTheLeft), + }, +}; + +var NavigatorSceneConfigs = { + PushFromRight: { + ...BaseConfig, + // We will want to customize this soon + }, + FloatFromRight: { + ...BaseConfig, + // We will want to customize this soon + }, + FloatFromLeft: { + ...BaseConfig, + animationInterpolators: { + into: buildStyleInterpolator(FromTheLeft), + out: buildStyleInterpolator(FadeToTheRight), + }, + }, + FloatFromBottom: { + ...BaseConfig, + gestures: { + pop: { + ...BaseLeftToRightGesture, + edgeHitWidth: 150, + direction: 'top-to-bottom', + fullDistance: SCREEN_HEIGHT, + } + }, + animationInterpolators: { + into: buildStyleInterpolator(FromTheFront), + out: buildStyleInterpolator(ToTheBack), + }, + }, + FloatFromBottomAndroid: { + ...BaseConfig, + gestures: null, + defaultTransitionVelocity: 3, + springFriction: 20, + animationInterpolators: { + into: buildStyleInterpolator(FromTheFrontAndroid), + out: buildStyleInterpolator(ToTheBackAndroid), + }, + }, + FadeAndroid: { + ...BaseConfig, + gestures: null, + animationInterpolators: { + into: buildStyleInterpolator(FadeIn), + out: buildStyleInterpolator(FadeOut), + }, + }, + HorizontalSwipeJump: { + ...BaseConfig, + gestures: { + jumpBack: { + ...BaseLeftToRightGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + jumpForward: { + ...BaseRightToLeftGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + }, + animationInterpolators: { + into: buildStyleInterpolator(FromTheRight), + out: buildStyleInterpolator(ToTheLeft), + }, + }, + VerticalUpSwipeJump: { + ...BaseConfig, + gestures: { + jumpBack: { + ...BaseDownUpGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + jumpForward: { + ...BaseDownUpGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + }, + animationInterpolators: { + into: buildStyleInterpolator(FromTheDown), + out: buildStyleInterpolator(ToTheUp), + }, + }, + VerticalDownSwipeJump: { + ...BaseConfig, + gestures: { + jumpBack: { + ...BaseUpDownGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + jumpForward: { + ...BaseUpDownGesture, + overswipe: BaseOverswipeConfig, + edgeHitWidth: null, + isDetachable: true, + }, + }, + animationInterpolators: { + into: buildStyleInterpolator(FromTheTop), + out: buildStyleInterpolator(ToTheDown), + }, + }, +}; + +module.exports = NavigatorSceneConfigs; diff --git a/ios/Pods/React/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js b/ios/Pods/React/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js new file mode 100644 index 00000000..4ee5a1f0 --- /dev/null +++ b/ios/Pods/React/Libraries/DebugComponentHierarchy/RCTDebugComponentOwnership.js @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * Utility class to provide the component owner hierarchy to native code for + * debugging purposes. + * + * @providesModule RCTDebugComponentOwnership + * @flow + */ + +'use strict'; + +var DebugComponentOwnershipModule = require('NativeModules').DebugComponentOwnershipModule; +var InspectorUtils = require('InspectorUtils'); +var ReactNativeTagHandles = require('ReactNativeTagHandles'); + +function componentToString(component) { + return component.getName ? component.getName() : 'Unknown'; +} + +function getRootTagForTag(tag: number): ?number { + var rootNodeID = ReactNativeTagHandles.tagToRootNodeID[tag]; + if (!rootNodeID) { + return null; + } + var rootID = ReactNativeTagHandles.getNativeTopRootIDFromNodeID(rootNodeID); + if (!rootID) { + return null; + } + return ReactNativeTagHandles.rootNodeIDToTag[rootID]; +} + +module.exports = { + + /** + * Asynchronously returns the owner hierarchy as an array of strings. Request id is + * passed along to the native module so that the native module can identify the + * particular call instance. + * + * Example returned owner hierarchy: ['RootView', 'Dialog', 'TitleView', 'Text'] + */ + getOwnerHierarchy: function(requestID: number, tag: number) { + var rootTag = getRootTagForTag(tag); + var instance = InspectorUtils.findInstanceByNativeTag(rootTag, tag); + var ownerHierarchy = instance ? + InspectorUtils.getOwnerHierarchy(instance).map(componentToString) : + null; + DebugComponentOwnershipModule.receiveOwnershipHierarchy(requestID, tag, ownerHierarchy); + }, +}; diff --git a/ios/Pods/React/Libraries/Device/RCTDeviceEventEmitter.js b/ios/Pods/React/Libraries/Device/RCTDeviceEventEmitter.js new file mode 100644 index 00000000..586663e3 --- /dev/null +++ b/ios/Pods/React/Libraries/Device/RCTDeviceEventEmitter.js @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule RCTDeviceEventEmitter + * @flow + */ +'use strict'; + +var EventEmitter = require('EventEmitter'); + +var RCTDeviceEventEmitter = new EventEmitter(); + +module.exports = RCTDeviceEventEmitter; diff --git a/ios/Pods/React/Libraries/Devtools/setupDevtools.js b/ios/Pods/React/Libraries/Devtools/setupDevtools.js new file mode 100644 index 00000000..0bd003dc --- /dev/null +++ b/ios/Pods/React/Libraries/Devtools/setupDevtools.js @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule setupDevtools + * @flow + */ +'use strict'; + +function setupDevtools() { + var messageListeners = []; + var closeListeners = []; + var ws = new window.WebSocket('ws://localhost:8081/devtools'); + // this is accessed by the eval'd backend code + var FOR_BACKEND = { // eslint-disable-line no-unused-vars + resolveRNStyle: require('flattenStyle'), + wall: { + listen(fn) { + messageListeners.push(fn); + }, + onClose(fn) { + closeListeners.push(fn); + }, + send(data) { + ws.send(JSON.stringify(data)); + }, + }, + }; + ws.onclose = () => { + console.warn('devtools socket closed'); + closeListeners.forEach(fn => fn()); + }; + ws.onerror = error => { + console.warn('devtools socket errored', error); + closeListeners.forEach(fn => fn()); + }; + ws.onopen = function () { + tryToConnect(); + }; + + function tryToConnect() { + ws.send('attach:agent'); + var _interval = setInterval(() => ws.send('attach:agent'), 500); + ws.onmessage = evt => { + if (evt.data.indexOf('eval:') === 0) { + clearInterval(_interval); + initialize(evt.data.slice('eval:'.length)); + } + }; + } + + function initialize(text) { + try { + // FOR_BACKEND is used by the eval'd code + eval(text); // eslint-disable-line no-eval + } catch (e) { + console.error('Failed to eval' + e.message); + return; + } + window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ + CurrentOwner: require('ReactCurrentOwner'), + InstanceHandles: require('ReactInstanceHandles'), + Mount: require('ReactNativeMount'), + Reconciler: require('ReactReconciler'), + TextComponent: require('ReactNativeTextComponent'), + }); + ws.onmessage = handleMessage; + } + + function handleMessage(evt) { + var data; + try { + data = JSON.parse(evt.data); + } catch (e) { + return console.error('failed to parse json: ' + evt.data); + } + // the devtools closed + if (data.$close || data.$error) { + closeListeners.forEach(fn => fn()); + window.__REACT_DEVTOOLS_GLOBAL_HOOK__.emit('shutdown'); + tryToConnect(); + return; + } + if (data.$open) { + return; // ignore + } + messageListeners.forEach(fn => { + try { + fn(data); + } catch (e) { + // jsc doesn't play so well with tracebacks that go into eval'd code, + // so the stack trace here will stop at the `eval()` call. Getting the + // message that caused the error is the best we can do for now. + console.log(data); + throw e; + } + }); + } +} + +module.exports = setupDevtools; diff --git a/ios/Pods/React/Libraries/Fetch/fetch.js b/ios/Pods/React/Libraries/Fetch/fetch.js new file mode 100644 index 00000000..b5e8b151 --- /dev/null +++ b/ios/Pods/React/Libraries/Fetch/fetch.js @@ -0,0 +1,381 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * This is a third-party polyfill grabbed from: + * https://github.com/github/fetch + * + * @providesModule fetch + * @nolint + */ +/* eslint-disable */ +'use strict'; + +var self = {}; + +/** + * Copyright (c) 2014 GitHub, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @preserve-header + */ +(function() { + 'use strict'; + + if (self.fetch) { + return + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = name.toString(); + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = value.toString(); + } + return value + } + + function Headers(headers) { + this.map = {} + + var self = this + if (headers instanceof Headers) { + headers.forEach(function(name, values) { + values.forEach(function(value) { + self.append(name, value) + }) + }) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + self.append(name, headers[name]) + }) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var list = this.map[name] + if (!list) { + list = [] + this.map[name] = list + } + list.push(value) + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + var values = this.map[normalizeName(name)] + return values ? values[0] : null + } + + Headers.prototype.getAll = function(name) { + return this.map[normalizeName(name)] || [] + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)] + } + + // Instead of iterable for now. + Headers.prototype.forEach = function(callback) { + var self = this + Object.getOwnPropertyNames(this.map).forEach(function(name) { + callback(name, self.map[name]) + }) + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + reader.readAsArrayBuffer(blob) + return fileReaderReady(reader) + } + + function readBlobAsText(blob) { + var reader = new FileReader() + reader.readAsText(blob) + return fileReaderReady(reader) + } + + var support = { + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob(); + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self + } + + function Body() { + this.bodyUsed = false + + + this._initBody = function(body) { + this._bodyInit = body + if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (!body) { + this._bodyText = '' + } else { + throw new Error('unsupported BodyInit type') + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + return this.blob().then(readBlobAsArrayBuffer) + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + } else { + this.text = function() { + var rejected = consumed(this) + return rejected ? rejected : Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(url, options) { + options = options || {} + this.url = url + + this.credentials = options.credentials || 'omit' + this.headers = new Headers(options.headers) + this.method = normalizeMethod(options.method || 'GET') + this.mode = options.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && options.body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(options.body) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function headers(xhr) { + var head = new Headers() + var pairs = xhr.getAllResponseHeaders().trim().split('\n') + pairs.forEach(function(header) { + var split = header.trim().split(':') + var key = split.shift().trim() + var value = split.join(':').trim() + head.append(key, value) + }) + return head + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this._initBody(bodyInit) + this.type = 'default' + this.url = null + this.status = options.status + this.ok = this.status >= 200 && this.status < 300 + this.statusText = options.statusText + this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers) + this.url = options.url || '' + } + + Body.call(Response.prototype) + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function(input, init) { + // TODO: Request constructor should accept input, init + var request + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input + } else { + request = new Request(input, init) + } + + return new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest() + if (request.credentials === 'cors') { + xhr.withCredentials = true; + } + + function responseURL() { + if ('responseURL' in xhr) { + return xhr.responseURL + } + + // Avoid security warnings on getResponseHeader when not allowed by CORS + if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader('X-Request-URL') + } + + return; + } + + xhr.onload = function() { + var status = (xhr.status === 1223) ? 204 : xhr.status + if (status < 100 || status > 599) { + reject(new TypeError('Network request failed')) + return + } + var options = { + status: status, + statusText: xhr.statusText, + headers: headers(xhr), + url: responseURL() + } + var body = 'response' in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)) + } + + xhr.onerror = function() { + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(name, values) { + values.forEach(function(value) { + xhr.setRequestHeader(name, value) + }) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true +})(); + +/** End of the third-party code */ + +module.exports = self; diff --git a/ios/Pods/React/Libraries/Geolocation/Geolocation.js b/ios/Pods/React/Libraries/Geolocation/Geolocation.js new file mode 100644 index 00000000..80dbfa19 --- /dev/null +++ b/ios/Pods/React/Libraries/Geolocation/Geolocation.js @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Geolocation + * @flow + */ +'use strict'; + +var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); +var RCTLocationObserver = require('NativeModules').LocationObserver; + +var invariant = require('invariant'); +var logError = require('logError'); +var warning = require('warning'); + +var subscriptions = []; + +var updatesEnabled = false; + +type GeoOptions = { + timeout: number; + maximumAge: number; + enableHighAccuracy: bool; +} + +/** + * You need to include the `NSLocationWhenInUseUsageDescription` key + * in Info.plist to enable geolocation. Geolocation is enabled by default + * when you create a project with `react-native init`. + * + * Geolocation follows the MDN specification: + * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation + */ +var Geolocation = { + + /* + * Invokes the success callback once with the latest location info. Supported + * options: timeout (ms), maximumAge (ms), enableHighAccuracy (bool) + */ + getCurrentPosition: function( + geo_success: Function, + geo_error?: Function, + geo_options?: GeoOptions + ) { + invariant( + typeof geo_success === 'function', + 'Must provide a valid geo_success callback.' + ); + RCTLocationObserver.getCurrentPosition( + geo_options || {}, + geo_success, + geo_error || logError + ); + }, + + /* + * Invokes the success callback whenever the location changes. Supported + * options: timeout (ms), maximumAge (ms), enableHighAccuracy (bool) + */ + watchPosition: function(success: Function, error?: Function, options?: GeoOptions): number { + if (!updatesEnabled) { + RCTLocationObserver.startObserving(options || {}); + updatesEnabled = true; + } + var watchID = subscriptions.length; + subscriptions.push([ + RCTDeviceEventEmitter.addListener( + 'geolocationDidChange', + success + ), + error ? RCTDeviceEventEmitter.addListener( + 'geolocationError', + error + ) : null, + ]); + return watchID; + }, + + clearWatch: function(watchID: number) { + var sub = subscriptions[watchID]; + if (!sub) { + // Silently exit when the watchID is invalid or already cleared + // This is consistent with timers + return; + } + + sub[0].remove(); + // array element refinements not yet enabled in Flow + var sub1 = sub[1]; sub1 && sub1.remove(); + subscriptions[watchID] = undefined; + var noWatchers = true; + for (var ii = 0; ii < subscriptions.length; ii++) { + if (subscriptions[ii]) { + noWatchers = false; // still valid subscriptions + } + } + if (noWatchers) { + Geolocation.stopObserving(); + } + }, + + stopObserving: function() { + if (updatesEnabled) { + RCTLocationObserver.stopObserving(); + updatesEnabled = false; + for (var ii = 0; ii < subscriptions.length; ii++) { + var sub = subscriptions[ii]; + if (sub) { + warning('Called stopObserving with existing subscriptions.'); + sub[0].remove(); + // array element refinements not yet enabled in Flow + var sub1 = sub[1]; sub1 && sub1.remove(); + } + } + subscriptions = []; + } + } +}; + +module.exports = Geolocation; diff --git a/ios/Pods/React/Libraries/Image/AssetRegistry.js b/ios/Pods/React/Libraries/Image/AssetRegistry.js new file mode 100644 index 00000000..df4173e7 --- /dev/null +++ b/ios/Pods/React/Libraries/Image/AssetRegistry.js @@ -0,0 +1,20 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule AssetRegistry + */ +'use strict'; + +var assets = []; + +function registerAsset(asset) { + // `push` returns new array length, so the first asset will + // get id 1 (not 0) to make the value truthy + return assets.push(asset); +} + +function getAssetByID(assetId) { + return assets[assetId - 1]; +} + +module.exports = { registerAsset, getAssetByID }; diff --git a/ios/Pods/React/Libraries/Image/Image.ios.js b/ios/Pods/React/Libraries/Image/Image.ios.js new file mode 100644 index 00000000..f641167c --- /dev/null +++ b/ios/Pods/React/Libraries/Image/Image.ios.js @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Image + * @flow + */ +'use strict'; + +var EdgeInsetsPropType = require('EdgeInsetsPropType'); +var ImageResizeMode = require('ImageResizeMode'); +var ImageStylePropTypes = require('ImageStylePropTypes'); +var NativeMethodsMixin = require('NativeMethodsMixin'); +var NativeModules = require('NativeModules'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); +var StyleSheet = require('StyleSheet'); +var StyleSheetPropType = require('StyleSheetPropType'); + +var flattenStyle = require('flattenStyle'); +var invariant = require('invariant'); +var requireNativeComponent = require('requireNativeComponent'); +var resolveAssetSource = require('resolveAssetSource'); +var warning = require('warning'); + +/** + * A React component for displaying different types of images, + * including network images, static resources, temporary local images, and + * images from local disk, such as the camera roll. + * + * Example usage: + * + * ``` + * renderImages: function() { + * return ( + * + * + * + * + * ); + * }, + * ``` + */ +var Image = React.createClass({ + propTypes: { + style: StyleSheetPropType(ImageStylePropTypes), + /** + * `uri` is a string representing the resource identifier for the image, which + * could be an http address, a local file path, or the name of a static image + * resource (which should be wrapped in the `require('image!name')` function). + */ + source: PropTypes.oneOfType([ + PropTypes.shape({ + uri: PropTypes.string, + }), + // Opaque type returned by require('./image.jpg') + PropTypes.number, + ]), + /** + * A static image to display while downloading the final image off the + * network. + * @platform ios + */ + defaultSource: PropTypes.shape({ + uri: PropTypes.string, + }), + /** + * When true, indicates the image is an accessibility element. + * @platform ios + */ + accessible: PropTypes.bool, + /** + * The text that's read by the screen reader when the user interacts with + * the image. + * @platform ios + */ + accessibilityLabel: PropTypes.string, + /** + * When the image is resized, the corners of the size specified + * by capInsets will stay a fixed size, but the center content and borders + * of the image will be stretched. This is useful for creating resizable + * rounded buttons, shadows, and other resizable assets. More info on + * [Apple documentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/instm/UIImage/resizableImageWithCapInsets) + * @platform ios + */ + capInsets: EdgeInsetsPropType, + /** + * Determines how to resize the image when the frame doesn't match the raw + * image dimensions. + */ + resizeMode: PropTypes.oneOf(['cover', 'contain', 'stretch']), + /** + * A unique identifier for this element to be used in UI Automation + * testing scripts. + */ + testID: PropTypes.string, + /** + * Invoked on mount and layout changes with + * `{nativeEvent: {layout: {x, y, width, height}}}`. + */ + onLayout: PropTypes.func, + /** + * Invoked on load start + * @platform ios + */ + onLoadStart: PropTypes.func, + /** + * Invoked on download progress with `{nativeEvent: {loaded, total}}` + * @platform ios + */ + onProgress: PropTypes.func, + /** + * Invoked on load error with `{nativeEvent: {error}}` + * @platform ios + */ + onError: PropTypes.func, + /** + * Invoked when load completes successfully + * @platform ios + */ + onLoad: PropTypes.func, + /** + * Invoked when load either succeeds or fails + * @platform ios + */ + onLoadEnd: PropTypes.func, + }, + + statics: { + resizeMode: ImageResizeMode, + }, + + mixins: [NativeMethodsMixin], + + /** + * `NativeMethodsMixin` will look for this when invoking `setNativeProps`. We + * make `this` look like an actual native component class. + */ + viewConfig: { + uiViewClassName: 'UIView', + validAttributes: ReactNativeViewAttributes.UIView + }, + + render: function() { + for (var prop in cfg.nativeOnly) { + if (this.props[prop] !== undefined) { + console.warn('Prop `' + prop + ' = ' + this.props[prop] + '` should ' + + 'not be set directly on Image.'); + } + } + var source = resolveAssetSource(this.props.source) || {}; + var defaultSource = (this.props.defaultSource && resolveAssetSource(this.props.defaultSource)) || {}; + + var {width, height} = source; + var style = flattenStyle([{width, height}, styles.base, this.props.style]) || {}; + + var isNetwork = source.uri && source.uri.match(/^https?:/); + var RawImage = isNetwork ? RCTNetworkImageView : RCTImageView; + var resizeMode = this.props.resizeMode || (style || {}).resizeMode || 'cover'; // Workaround for flow bug t7737108 + var tintColor = (style || {}).tintColor; // Workaround for flow bug t7737108 + + return ( + + ); + } +}); + +var styles = StyleSheet.create({ + base: { + overflow: 'hidden', + }, +}); + +var cfg = { + nativeOnly: { + src: true, + defaultImageSrc: true, + imageTag: true, + progressHandlerRegistered: true, + }, +}; +var RCTImageView = requireNativeComponent('RCTImageView', Image, cfg); +var RCTNetworkImageView = (NativeModules.NetworkImageViewManager) ? requireNativeComponent('RCTNetworkImageView', Image, cfg) : RCTImageView; + +module.exports = Image; diff --git a/ios/Pods/React/Libraries/Image/ImagePickerIOS.js b/ios/Pods/React/Libraries/Image/ImagePickerIOS.js new file mode 100644 index 00000000..9b2f75e5 --- /dev/null +++ b/ios/Pods/React/Libraries/Image/ImagePickerIOS.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ImagePickerIOS + * @flow + */ +'use strict'; + +var RCTImagePicker = require('NativeModules').ImagePickerIOS; + +var ImagePickerIOS = { + canRecordVideos: function(callback: Function) { + return RCTImagePicker.canRecordVideos(callback); + }, + canUseCamera: function(callback: Function) { + return RCTImagePicker.canUseCamera(callback); + }, + openCameraDialog: function(config: Object, successCallback: Function, cancelCallback: Function) { + config = { + videoMode: false, + ...config, + } + return RCTImagePicker.openCameraDialog(config, successCallback, cancelCallback); + }, + openSelectDialog: function(config: Object, successCallback: Function, cancelCallback: Function) { + config = { + showImages: true, + showVideos: false, + ...config, + } + return RCTImagePicker.openSelectDialog(config, successCallback, cancelCallback); + }, +}; + +module.exports = ImagePickerIOS; diff --git a/ios/Pods/React/Libraries/Image/ImageResizeMode.js b/ios/Pods/React/Libraries/Image/ImageResizeMode.js new file mode 100644 index 00000000..b947b952 --- /dev/null +++ b/ios/Pods/React/Libraries/Image/ImageResizeMode.js @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ImageResizeMode + * @flow + */ +'use strict'; + +var keyMirror = require('keyMirror'); + +/** + * ImageResizeMode - Enum for different image resizing modes, set via + * `resizeMode` style property on `` components. + */ +var ImageResizeMode = keyMirror({ + /** + * contain - The image will be resized such that it will be completely + * visible, contained within the frame of the View. + */ + contain: null, + /** + * cover - The image will be resized such that the entire area of the view + * is covered by the image, potentially clipping parts of the image. + */ + cover: null, + /** + * stretch - The image will be stretched to fill the entire frame of the + * view without clipping. This may change the aspect ratio of the image, + * distoring it. + */ + stretch: null, +}); + +module.exports = ImageResizeMode; diff --git a/ios/Pods/React/Libraries/Image/ImageSource.js b/ios/Pods/React/Libraries/Image/ImageSource.js new file mode 100644 index 00000000..c9b3dcac --- /dev/null +++ b/ios/Pods/React/Libraries/Image/ImageSource.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ImageSource + * @flow + */ +'use strict'; + +type ImageSource = { + uri: string; + isStatic: boolean; +}; diff --git a/ios/Pods/React/Libraries/Image/ImageStylePropTypes.js b/ios/Pods/React/Libraries/Image/ImageStylePropTypes.js new file mode 100644 index 00000000..c4ccfb57 --- /dev/null +++ b/ios/Pods/React/Libraries/Image/ImageStylePropTypes.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ImageStylePropTypes + * @flow + */ +'use strict'; + +var ImageResizeMode = require('ImageResizeMode'); +var LayoutPropTypes = require('LayoutPropTypes'); +var ReactPropTypes = require('ReactPropTypes'); +var TransformPropTypes = require('TransformPropTypes'); + +var ImageStylePropTypes = { + ...LayoutPropTypes, + ...TransformPropTypes, + resizeMode: ReactPropTypes.oneOf(Object.keys(ImageResizeMode)), + backgroundColor: ReactPropTypes.string, + borderColor: ReactPropTypes.string, + borderWidth: ReactPropTypes.number, + borderRadius: ReactPropTypes.number, + overflow: ReactPropTypes.oneOf(['visible', 'hidden']), + + // iOS-Specific style to "tint" an image. + // It changes the color of all the non-transparent pixels to the tintColor + tintColor: ReactPropTypes.string, + opacity: ReactPropTypes.number, +}; + +module.exports = ImageStylePropTypes; diff --git a/ios/Pods/React/Libraries/Image/__tests__/resolveAssetSource-test.js b/ios/Pods/React/Libraries/Image/__tests__/resolveAssetSource-test.js new file mode 100644 index 00000000..5854dae0 --- /dev/null +++ b/ios/Pods/React/Libraries/Image/__tests__/resolveAssetSource-test.js @@ -0,0 +1,194 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +jest + .dontMock('AssetRegistry') + .dontMock('../resolveAssetSource'); + +var AssetRegistry; +var Platform; +var SourceCode; +var resolveAssetSource; + +function expectResolvesAsset(input, expectedSource) { + var assetId = AssetRegistry.registerAsset(input); + expect(resolveAssetSource(assetId)).toEqual(expectedSource); +} + +describe('resolveAssetSource', () => { + beforeEach(() => { + jest.resetModuleRegistry(); + AssetRegistry = require('AssetRegistry'); + Platform = require('Platform'); + SourceCode = require('NativeModules').SourceCode; + resolveAssetSource = require('../resolveAssetSource'); + }); + + it('returns same source for simple static and network images', () => { + var source1 = {uri: 'https://www.facebook.com/logo'}; + expect(resolveAssetSource(source1)).toBe(source1); + + var source2 = {isStatic: true, uri: 'logo'}; + expect(resolveAssetSource(source2)).toBe(source2); + }); + + it('does not change deprecated assets', () => { + expect(resolveAssetSource({ + isStatic: true, + deprecated: true, + width: 100, + height: 200, + uri: 'logo', + })).toEqual({ + isStatic: true, + deprecated: true, + width: 100, + height: 200, + uri: 'logo', + }); + }); + + it('ignores any weird data', () => { + expect(resolveAssetSource(null)).toBe(null); + expect(resolveAssetSource(42)).toBe(null); + expect(resolveAssetSource('nonsense')).toBe(null); + }); + + describe('bundle was loaded from network (DEV)', () => { + beforeEach(() => { + SourceCode.scriptURL = 'http://10.0.0.1:8081/main.bundle'; + }); + + it('uses network image', () => { + expectResolvesAsset({ + __packager_asset: true, + fileSystemLocation: '/root/app/module/a', + httpServerLocation: '/assets/module/a', + width: 100, + height: 200, + scales: [1], + hash: '5b6f00f', + name: 'logo', + type: 'png', + }, { + isStatic: false, + width: 100, + height: 200, + uri: 'http://10.0.0.1:8081/assets/module/a/logo.png?hash=5b6f00f', + }); + }); + + it('picks matching scale', () => { + expectResolvesAsset({ + __packager_asset: true, + fileSystemLocation: '/root/app/module/a', + httpServerLocation: '/assets/module/a', + width: 100, + height: 200, + scales: [1, 2, 3], + hash: '5b6f00f', + name: 'logo', + type: 'png', + }, { + isStatic: false, + width: 100, + height: 200, + uri: 'http://10.0.0.1:8081/assets/module/a/logo@2x.png?hash=5b6f00f', + }); + }); + + }); + + describe('bundle was loaded from file (PROD) on iOS', () => { + var originalDevMode; + var originalPlatform; + + beforeEach(() => { + SourceCode.scriptURL = 'file:///Path/To/Simulator/main.bundle'; + originalDevMode = __DEV__; + originalPlatform = Platform.OS; + __DEV__ = false; + Platform.OS = 'ios'; + }); + + afterEach(() => { + __DEV__ = originalDevMode; + Platform.OS = originalPlatform; + }); + + it('uses pre-packed image', () => { + expectResolvesAsset({ + __packager_asset: true, + fileSystemLocation: '/root/app/module/a', + httpServerLocation: '/assets/module/a', + width: 100, + height: 200, + scales: [1], + hash: '5b6f00f', + name: 'logo', + type: 'png', + }, { + isStatic: true, + width: 100, + height: 200, + uri: 'assets/module/a/logo.png', + }); + }); + }); + + describe('bundle was loaded from file (PROD) on Android', () => { + var originalDevMode; + var originalPlatform; + + beforeEach(() => { + SourceCode.scriptURL = 'file:///Path/To/Simulator/main.bundle'; + originalDevMode = __DEV__; + originalPlatform = Platform.OS; + __DEV__ = false; + Platform.OS = 'android'; + }); + + afterEach(() => { + __DEV__ = originalDevMode; + Platform.OS = originalPlatform; + }); + + it('uses pre-packed image', () => { + expectResolvesAsset({ + __packager_asset: true, + fileSystemLocation: '/root/app/module/a', + httpServerLocation: '/assets/AwesomeModule/Subdir', + width: 100, + height: 200, + scales: [1], + hash: '5b6f00f', + name: '!@Logo#1_€', // Invalid chars shouldn't get passed to native + type: 'png', + }, { + isStatic: true, + width: 100, + height: 200, + uri: 'awesomemodule_subdir_logo1_', + }); + }); + }); + +}); + +describe('resolveAssetSource.pickScale', () => { + it('picks matching scale', () => { + expect(resolveAssetSource.pickScale([1], 2)).toBe(1); + expect(resolveAssetSource.pickScale([1, 2, 3], 2)).toBe(2); + expect(resolveAssetSource.pickScale([1, 2], 3)).toBe(2); + expect(resolveAssetSource.pickScale([1, 2, 3, 4], 3.5)).toBe(4); + expect(resolveAssetSource.pickScale([3, 4], 2)).toBe(3); + expect(resolveAssetSource.pickScale([], 2)).toBe(1); + }); +}); diff --git a/ios/Pods/React/Libraries/Image/resolveAssetSource.js b/ios/Pods/React/Libraries/Image/resolveAssetSource.js new file mode 100644 index 00000000..301d70dd --- /dev/null +++ b/ios/Pods/React/Libraries/Image/resolveAssetSource.js @@ -0,0 +1,139 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule resolveAssetSource + * + * Resolves an asset into a `source` for `Image`. + */ +'use strict'; + +var AssetRegistry = require('AssetRegistry'); +var PixelRatio = require('PixelRatio'); +var Platform = require('Platform'); +var SourceCode = require('NativeModules').SourceCode; + +var _serverURL; + +function getDevServerURL() { + if (!__DEV__) { + // In prod we want assets to be loaded from the archive + return null; + } + if (_serverURL === undefined) { + var scriptURL = SourceCode.scriptURL; + var match = scriptURL && scriptURL.match(/^https?:\/\/.*?\//); + if (match) { + // Bundle was loaded from network + _serverURL = match[0]; + } else { + // Bundle was loaded from file + _serverURL = null; + } + } + + return _serverURL; +} + +/** + * Returns the path at which the asset can be found in the archive + */ +function getPathInArchive(asset) { + if (Platform.OS === 'android') { + var assetDir = getBasePath(asset); + // E.g. 'assets_awesomemodule_icon' + // The Android resource system picks the correct scale. + return (assetDir + '/' + asset.name) + .toLowerCase() + .replace(/\//g, '_') // Encode folder structure in file name + .replace(/([^a-z0-9_])/g, '') // Remove illegal chars + .replace(/^assets_/, ''); // Remove "assets_" prefix + } else { + // E.g. 'assets/AwesomeModule/icon@2x.png' + return getScaledAssetPath(asset); + } +} + +/** + * Returns an absolute URL which can be used to fetch the asset + * from the devserver + */ +function getPathOnDevserver(devServerUrl, asset) { + return devServerUrl + getScaledAssetPath(asset) + '?hash=' + asset.hash; +} + +/** + * Returns a path like 'assets/AwesomeModule' + */ +function getBasePath(asset) { + // TODO(frantic): currently httpServerLocation is used both as + // path in http URL and path within IPA. Should we have zipArchiveLocation? + var path = asset.httpServerLocation; + if (path[0] === '/') { + path = path.substr(1); + } + return path; +} + +/** + * Returns a path like 'assets/AwesomeModule/icon@2x.png' + */ +function getScaledAssetPath(asset) { + var scale = pickScale(asset.scales, PixelRatio.get()); + var scaleSuffix = scale === 1 ? '' : '@' + scale + 'x'; + var assetDir = getBasePath(asset); + return assetDir + '/' + asset.name + scaleSuffix + '.' + asset.type; +} + +function pickScale(scales, deviceScale) { + // Packager guarantees that `scales` array is sorted + for (var i = 0; i < scales.length; i++) { + if (scales[i] >= deviceScale) { + return scales[i]; + } + } + + // If nothing matches, device scale is larger than any available + // scales, so we return the biggest one. Unless the array is empty, + // in which case we default to 1 + return scales[scales.length - 1] || 1; +} + +function resolveAssetSource(source) { + if (typeof source === 'object') { + return source; + } + + var asset = AssetRegistry.getAssetByID(source); + if (asset) { + return assetToImageSource(asset); + } + + return null; +} + +function assetToImageSource(asset) { + var devServerURL = getDevServerURL(); + if (devServerURL) { + return { + width: asset.width, + height: asset.height, + uri: getPathOnDevserver(devServerURL, asset), + isStatic: false, + }; + } else { + return { + width: asset.width, + height: asset.height, + uri: getPathInArchive(asset), + isStatic: true, + }; + } +} + +module.exports = resolveAssetSource; +module.exports.pickScale = pickScale; diff --git a/ios/Pods/React/Libraries/Inspector/BorderBox.js b/ios/Pods/React/Libraries/Inspector/BorderBox.js new file mode 100644 index 00000000..caee8ccd --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/BorderBox.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BorderBox + * @flow + */ +'use strict'; + +var React = require('React'); +var View = require('View'); + +class BorderBox extends React.Component { + render() { + var box = this.props.box; + if (!box) { + return this.props.children; + } + var style = { + borderTopWidth: box.top, + borderBottomWidth: box.bottom, + borderLeftWidth: box.left, + borderRightWidth: box.right, + }; + return ( + + {this.props.children} + + ); + } +} + +module.exports = BorderBox; + diff --git a/ios/Pods/React/Libraries/Inspector/BoxInspector.js b/ios/Pods/React/Libraries/Inspector/BoxInspector.js new file mode 100644 index 00000000..e50d9869 --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/BoxInspector.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BoxInspector + * @flow + */ +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); +var resolveBoxStyle = require('resolveBoxStyle'); + +var blank = { + top: 0, + left: 0, + right: 0, + bottom: 0, +}; + +class BoxInspector extends React.Component { + render() { + var frame = this.props.frame; + var style = this.props.style; + var margin = style && resolveBoxStyle('margin', style) || blank; + var padding = style && resolveBoxStyle('padding', style) || blank; + return ( + + + + + ({frame.left}, {frame.top}) + + + {frame.width} × {frame.height} + + + + + ); + } +} + +class BoxContainer extends React.Component { + render() { + var box = this.props.box; + return ( + + + {this.props.title} + {box.top} + + + {box.left} + {this.props.children} + {box.right} + + {box.bottom} + + ); + } +} + +var styles = StyleSheet.create({ + row: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-around', + }, + marginLabel: { + width: 60, + }, + label: { + fontSize: 10, + color: 'rgb(255,100,0)', + marginLeft: 5, + flex: 1, + textAlign: 'left', + top: -3, + }, + buffer: { + fontSize: 10, + color: 'yellow', + flex: 1, + textAlign: 'center', + }, + innerText: { + color: 'yellow', + fontSize: 12, + textAlign: 'center', + width: 70, + }, + box: { + borderWidth: 1, + borderColor: 'grey', + }, + boxText: { + color: 'white', + fontSize: 12, + marginHorizontal: 3, + marginVertical: 2, + textAlign: 'center', + }, +}); + +module.exports = BoxInspector; + diff --git a/ios/Pods/React/Libraries/Inspector/ElementBox.js b/ios/Pods/React/Libraries/Inspector/ElementBox.js new file mode 100644 index 00000000..a3851001 --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/ElementBox.js @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ElementBox + * @flow + */ +'use strict'; + +var React = require('React'); +var View = require('View'); +var StyleSheet = require('StyleSheet'); +var BorderBox = require('BorderBox'); +var resolveBoxStyle = require('resolveBoxStyle'); + +var flattenStyle = require('flattenStyle'); + +class ElementBox extends React.Component { + render() { + var style = flattenStyle(this.props.style) || {}; + var margin = resolveBoxStyle('margin', style); + var padding = resolveBoxStyle('padding', style); + var frameStyle = this.props.frame; + if (margin) { + frameStyle = { + top: frameStyle.top - margin.top, + left: frameStyle.left - margin.left, + height: frameStyle.height + margin.top + margin.bottom, + width: frameStyle.width + margin.left + margin.right, + }; + } + var contentStyle = { + width: this.props.frame.width, + height: this.props.frame.height, + }; + if (padding) { + contentStyle = { + width: contentStyle.width - padding.left - padding.right, + height: contentStyle.height - padding.top - padding.bottom, + }; + } + return ( + + + + + + + + ); + } +} + +var styles = StyleSheet.create({ + frame: { + position: 'absolute', + }, + content: { + backgroundColor: 'rgba(200, 230, 255, 0.8)', + }, + padding: { + borderColor: 'rgba(77, 255, 0, 0.3)', + }, + margin: { + borderColor: 'rgba(255, 132, 0, 0.3)', + }, +}); + +module.exports = ElementBox; + diff --git a/ios/Pods/React/Libraries/Inspector/ElementProperties.js b/ios/Pods/React/Libraries/Inspector/ElementProperties.js new file mode 100644 index 00000000..222da109 --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/ElementProperties.js @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ElementProperties + * @flow + */ +'use strict'; + +var BoxInspector = require('BoxInspector'); +var PropTypes = require('ReactPropTypes'); +var React = require('React'); +var StyleInspector = require('StyleInspector'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var TouchableHighlight = require('TouchableHighlight'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); +var View = require('View'); + +var flattenStyle = require('flattenStyle'); +var mapWithSeparator = require('mapWithSeparator'); + +var ElementProperties = React.createClass({ + propTypes: { + hierarchy: PropTypes.array.isRequired, + style: PropTypes.oneOfType([ + PropTypes.object, + PropTypes.array, + PropTypes.number, + ]), + }, + + render: function() { + var style = flattenStyle(this.props.style); + var selection = this.props.selection; + // Without the `TouchableWithoutFeedback`, taps on this inspector pane + // would change the inspected element to whatever is under the inspector + return ( + + + + {mapWithSeparator( + this.props.hierarchy, + (item, i) => ( + this.props.setSelection(i)}> + + {item.getName ? item.getName() : 'Unknown'} + + + ), + () => + )} + + + + + + + + ); + } +}); + +var styles = StyleSheet.create({ + breadSep: { + fontSize: 8, + color: 'white', + }, + breadcrumb: { + flexDirection: 'row', + flexWrap: 'wrap', + marginBottom: 5, + }, + selected: { + borderColor: 'white', + borderRadius: 5, + }, + breadItem: { + borderWidth: 1, + borderColor: 'transparent', + marginHorizontal: 2, + }, + breadItemText: { + fontSize: 10, + color: 'white', + marginHorizontal: 5, + }, + row: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + info: { + padding: 10, + }, + path: { + color: 'white', + fontSize: 9, + }, +}); + +module.exports = ElementProperties; diff --git a/ios/Pods/React/Libraries/Inspector/Inspector.js b/ios/Pods/React/Libraries/Inspector/Inspector.js new file mode 100644 index 00000000..7dbec744 --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/Inspector.js @@ -0,0 +1,191 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Inspector + * @flow + */ +'use strict'; + +var Dimensions = require('Dimensions'); +var InspectorOverlay = require('InspectorOverlay'); +var InspectorPanel = require('InspectorPanel'); +var InspectorUtils = require('InspectorUtils'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var UIManager = require('NativeModules').UIManager; +var View = require('View'); + +if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) { + // required for devtools to be able to edit react native styles + window.__REACT_DEVTOOLS_GLOBAL_HOOK__.resolveRNStyle = require('flattenStyle'); +} + +class Inspector extends React.Component { + _subs: ?Array<() => void>; + + constructor(props: Object) { + super(props); + + this.state = { + devtoolsAgent: null, + panelPos: 'bottom', + inspecting: true, + perfing: false, + inspected: null, + }; + } + + componentDidMount() { + if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) { + this.attachToDevtools = this.attachToDevtools.bind(this); + window.__REACT_DEVTOOLS_GLOBAL_HOOK__.on('react-devtools', this.attachToDevtools); + // if devtools is already started + if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent) { + this.attachToDevtools(window.__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent); + } + } + } + + componentWillUnmount() { + if (this._subs) { + this._subs.map(fn => fn()); + } + if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) { + window.__REACT_DEVTOOLS_GLOBAL_HOOK__.off('react-devtools', this.attachToDevtools); + } + } + + attachToDevtools(agent: Object) { + var _hideWait = null; + var hlSub = agent.sub('highlight', ({node, name, props}) => { + clearTimeout(_hideWait); + UIManager.measure(node, (x, y, width, height, left, top) => { + this.setState({ + hierarchy: [], + inspected: { + frame: {left, top, width, height}, + style: props ? props.style : {}, + }, + }); + }); + }); + var hideSub = agent.sub('hideHighlight', () => { + if (this.state.inspected === null) { + return; + } + // we wait to actually hide in order to avoid flicker + _hideWait = setTimeout(() => { + this.setState({ + inspected: null, + }); + }, 100); + }); + this._subs = [hlSub, hideSub]; + + agent.on('shutdown', () => { + this.setState({devtoolsAgent: null}); + this._subs = null; + }); + this.setState({ + devtoolsAgent: agent, + }); + } + + setSelection(i: number) { + var instance = this.state.hierarchy[i]; + var publicInstance = instance.getPublicInstance(); + UIManager.measure(React.findNodeHandle(instance), (x, y, width, height, left, top) => { + this.setState({ + inspected: { + frame: {left, top, width, height}, + style: publicInstance.props ? publicInstance.props.style : {}, + }, + selection: i, + }); + }); + } + + onTouchInstance(instance: Object, frame: Object, pointerY: number) { + if (this.state.devtoolsAgent) { + this.state.devtoolsAgent.selectFromReactInstance(instance, true); + } + var hierarchy = InspectorUtils.getOwnerHierarchy(instance); + var publicInstance = instance.getPublicInstance(); + var props = publicInstance.props || {}; + this.setState({ + panelPos: pointerY > Dimensions.get('window').height / 2 ? 'top' : 'bottom', + selection: hierarchy.length - 1, + hierarchy, + inspected: { + style: props.style || {}, + frame, + }, + }); + } + + setPerfing(val: bool) { + this.setState({ + perfing: val, + inspecting: false, + inspected: null, + }); + } + + setInspecting(val: bool) { + this.setState({ + inspecting: val, + inspected: null + }); + } + + render() { + var panelContainerStyle = (this.state.panelPos === 'bottom') ? {bottom: 0} : {top: 0}; + return ( + + {this.state.inspecting && + } + + + + + ); + } +} + +var styles = StyleSheet.create({ + container: { + position: 'absolute', + backgroundColor: 'transparent', + top: 0, + left: 0, + right: 0, + bottom: 0, + }, + panelContainer: { + position: 'absolute', + left: 0, + right: 0, + }, +}); + +module.exports = Inspector; diff --git a/ios/Pods/React/Libraries/Inspector/InspectorOverlay.js b/ios/Pods/React/Libraries/Inspector/InspectorOverlay.js new file mode 100644 index 00000000..172a8c5f --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/InspectorOverlay.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule InspectorOverlay + * @flow + */ +'use strict'; + +var Dimensions = require('Dimensions'); +var InspectorUtils = require('InspectorUtils'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var UIManager = require('NativeModules').UIManager; +var View = require('View'); +var ElementBox = require('ElementBox'); + +var PropTypes = React.PropTypes; + +type EventLike = { + nativeEvent: Object; +}; + +var InspectorOverlay = React.createClass({ + propTypes: { + inspected: PropTypes.shape({ + frame: PropTypes.object, + style: PropTypes.any, + }), + inspectedViewTag: PropTypes.number, + onTouchInstance: PropTypes.func.isRequired, + }, + + findViewForTouchEvent: function(e: EventLike) { + var {locationX, locationY} = e.nativeEvent.touches[0]; + UIManager.findSubviewIn( + this.props.inspectedViewTag, + [locationX, locationY], + (nativeViewTag, left, top, width, height) => { + var instance = InspectorUtils.findInstanceByNativeTag(this.props.rootTag, nativeViewTag); + if (!instance) { + return; + } + this.props.onTouchInstance(instance, {left, top, width, height}, locationY); + } + ); + }, + + shouldSetResponser: function(e: EventLike): bool { + this.findViewForTouchEvent(e); + return true; + }, + + render: function() { + var content = null; + if (this.props.inspected) { + content = ; + } + + return ( + + {content} + + ); + } +}); + +var styles = StyleSheet.create({ + inspector: { + backgroundColor: 'transparent', + position: 'absolute', + left: 0, + top: 0, + right: 0, + }, +}); + +module.exports = InspectorOverlay; diff --git a/ios/Pods/React/Libraries/Inspector/InspectorPanel.js b/ios/Pods/React/Libraries/Inspector/InspectorPanel.js new file mode 100644 index 00000000..b33d973b --- /dev/null +++ b/ios/Pods/React/Libraries/Inspector/InspectorPanel.js @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule InspectorPanel + * @flow + */ +'use strict'; + +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var View = require('View'); +var ElementProperties = require('ElementProperties'); +var PerformanceOverlay = require('PerformanceOverlay'); +var TouchableHighlight = require('TouchableHighlight'); + +var PropTypes = React.PropTypes; + +class InspectorPanel extends React.Component { + renderWaiting() { + if (this.props.inspecting) { + return ( + + Tap something to inspect it + + ); + } + return Nothing is inspected; + } + + render() { + var contents; + if (this.props.inspected) { + contents = ( + + ); + } else if (this.props.perfing) { + contents = ( + + ); + } else { + contents = ( + + {this.renderWaiting()} + + ); + } + return ( + + {!this.props.devtoolsIsOpen && contents} + +