├── .babelrc ├── .buckconfig ├── .eslintignore ├── .eslintrc ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .watchmanconfig ├── LICENSE ├── README.md ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ ├── Watermelon.json │ │ ├── fig8.json │ │ ├── fonts │ │ │ └── MaterialIcons.ttf │ │ ├── juggle.json │ │ └── spin.json │ │ ├── java │ │ └── com │ │ │ └── reactnativechat │ │ │ ├── GoogleAnalyticsBridge.java │ │ │ ├── LottieLoaderViewManager.java │ │ │ ├── MainActivity.java │ │ │ ├── MainApplication.java │ │ │ └── RectNativeChatPackage.java │ │ └── res │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app ├── analytics.js ├── client.js ├── components │ ├── Avatar.js │ ├── BaseRow.js │ ├── Invert.js │ ├── KeyboardContainer.js │ ├── KeyboardSpacer.js │ ├── LabeledInput.js │ ├── LiveDate.js │ ├── Loader.js │ ├── LottieLoader.js │ ├── Message.js │ ├── MessageInput.js │ ├── PillButton.js │ ├── PlatformTouchableHighlight.js │ ├── PlatformTouchableOpacity.js │ ├── RoomHeader.js │ ├── RoomRow.js │ ├── Row.js │ ├── Screen.js │ ├── ScrollScreen.js │ ├── SegmentedView.js │ ├── platformTouchable.js │ └── withKeyboardHeight.js ├── devtools │ ├── bridgeDebugger.js │ ├── buildLayoutTree.js │ ├── ensureShallowPurity.js │ ├── findOffscreenViews.js │ ├── getReactRoot.js │ ├── index.js │ ├── logLifecycle.js │ └── purityWarningReduxConnect.js ├── icons │ ├── add.png │ ├── add@2x.png │ ├── add@3x.png │ ├── alarm.png │ ├── alarm@2x.png │ ├── alarm@3x.png │ ├── backup.png │ ├── backup@2x.png │ ├── backup@3x.png │ ├── chat.png │ ├── chat@2x.png │ ├── chat@3x.png │ ├── chevron_right.png │ ├── chevron_right@2x.png │ ├── chevron_right@3x.png │ ├── close.png │ ├── close@2x.png │ ├── close@3x.png │ ├── faces.png │ ├── faces@2x.png │ ├── faces@3x.png │ ├── filter.png │ ├── filter@2x.png │ ├── filter@3x.png │ ├── home.png │ ├── home@2x.png │ ├── home@3x.png │ ├── refresh.png │ ├── refresh@2x.png │ ├── refresh@3x.png │ ├── send.png │ ├── send@2x.png │ ├── send@3x.png │ ├── settings.png │ ├── settings@2x.png │ └── settings@3x.png ├── index.js ├── initialization │ ├── env.js │ ├── errors.js │ ├── layoutAnimation.js │ ├── promises.js │ ├── user.js │ └── warnings.js ├── queries.js ├── reducers │ ├── mainReducer.js │ ├── roomFavoritesReducer.js │ ├── roomViewsReducer.js │ └── userReducer.js ├── registerScreen.js ├── routes.js ├── screens │ ├── AddRoom.js │ ├── Animations.js │ ├── Room.js │ ├── Rooms.js │ └── Settings.js ├── services │ └── UserService.js ├── store.js ├── storeThunk.js ├── theme.js └── utils │ ├── gravatarUrl.js │ ├── oneAtATime.js │ ├── performanceNow.js │ ├── realtime.js │ ├── timeAgo.js │ └── unwrapDefaultExport.js ├── index.js ├── ios ├── Assets │ ├── Watermelon.json │ ├── fig8.json │ ├── juggle.json │ └── spin.json ├── GoogleService-Info.plist ├── Podfile ├── Podfile.lock ├── Pods │ ├── FirebaseAnalytics │ │ └── Frameworks │ │ │ └── FirebaseAnalytics.framework │ │ │ ├── FirebaseAnalytics │ │ │ ├── Headers │ │ │ ├── FIRAnalytics+AppDelegate.h │ │ │ ├── FIRAnalytics.h │ │ │ ├── FIRAnalyticsConfiguration.h │ │ │ ├── FIRApp.h │ │ │ ├── FIRConfiguration.h │ │ │ ├── FIREventNames.h │ │ │ ├── FIROptions.h │ │ │ ├── FIRParameterNames.h │ │ │ ├── FIRUserPropertyNames.h │ │ │ └── FirebaseAnalytics.h │ │ │ └── Modules │ │ │ └── module.modulemap │ ├── FirebaseCore │ │ └── Frameworks │ │ │ └── FirebaseCore.framework │ │ │ ├── FirebaseCore │ │ │ ├── Headers │ │ │ ├── FIRAnalyticsConfiguration.h │ │ │ ├── FIRApp.h │ │ │ ├── FIRConfiguration.h │ │ │ ├── FIRLoggerLevel.h │ │ │ ├── FIROptions.h │ │ │ └── FirebaseCore.h │ │ │ └── Modules │ │ │ └── module.modulemap │ ├── FirebaseInstanceID │ │ ├── CHANGELOG.md │ │ ├── Frameworks │ │ │ └── FirebaseInstanceID.framework │ │ │ │ ├── FirebaseInstanceID │ │ │ │ ├── Headers │ │ │ │ ├── FIRInstanceID.h │ │ │ │ └── FirebaseInstanceID.h │ │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ └── README.md │ ├── Google │ │ ├── Frameworks │ │ │ ├── GGLAnalytics.framework │ │ │ │ ├── GGLAnalytics │ │ │ │ ├── Headers │ │ │ │ │ ├── GGLAnalytics.h │ │ │ │ │ └── GGLContext+Analytics.h │ │ │ │ └── Modules │ │ │ │ │ └── module.modulemap │ │ │ └── GGLCore.framework │ │ │ │ ├── GGLCore │ │ │ │ ├── Headers │ │ │ │ ├── GGLConfiguration.h │ │ │ │ ├── GGLContext.h │ │ │ │ ├── GGLCore.h │ │ │ │ ├── GGLErrorCode.h │ │ │ │ └── GMRConfiguration.h │ │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ ├── Headers │ │ │ ├── Analytics.h │ │ │ ├── Core.h │ │ │ ├── ModuleHeaders │ │ │ │ ├── Analytics-Module.h │ │ │ │ ├── Core-Module.h │ │ │ │ └── SignIn-Module.h │ │ │ └── module.modulemap │ │ └── README.md │ ├── GoogleAnalytics │ │ ├── Libraries │ │ │ └── libGoogleAnalytics.a │ │ └── Sources │ │ │ ├── GAI.h │ │ │ ├── GAIDictionaryBuilder.h │ │ │ ├── GAIEcommerceFields.h │ │ │ ├── GAIEcommerceProduct.h │ │ │ ├── GAIEcommerceProductAction.h │ │ │ ├── GAIEcommercePromotion.h │ │ │ ├── GAIFields.h │ │ │ ├── GAILogger.h │ │ │ ├── GAITrackedViewController.h │ │ │ └── GAITracker.h │ ├── GoogleToolboxForMac │ │ ├── Foundation │ │ │ ├── GTMNSData+zlib.h │ │ │ └── GTMNSData+zlib.m │ │ ├── GTMDefines.h │ │ ├── LICENSE │ │ └── README.md │ ├── Headers │ │ ├── Private │ │ │ ├── Google │ │ │ │ └── Google │ │ │ │ │ ├── Analytics-Module.h │ │ │ │ │ ├── Analytics.h │ │ │ │ │ ├── Core-Module.h │ │ │ │ │ ├── Core.h │ │ │ │ │ └── SignIn-Module.h │ │ │ └── GoogleAnalytics │ │ │ │ ├── GAI.h │ │ │ │ ├── GAIDictionaryBuilder.h │ │ │ │ ├── GAIEcommerceFields.h │ │ │ │ ├── GAIEcommerceProduct.h │ │ │ │ ├── GAIEcommerceProductAction.h │ │ │ │ ├── GAIEcommercePromotion.h │ │ │ │ ├── GAIFields.h │ │ │ │ ├── GAILogger.h │ │ │ │ ├── GAITrackedViewController.h │ │ │ │ └── GAITracker.h │ │ └── Public │ │ │ ├── Google │ │ │ └── Google │ │ │ │ ├── Analytics-Module.h │ │ │ │ ├── Analytics.h │ │ │ │ ├── Core-Module.h │ │ │ │ ├── Core.h │ │ │ │ └── SignIn-Module.h │ │ │ └── GoogleAnalytics │ │ │ ├── GAI.h │ │ │ ├── GAIDictionaryBuilder.h │ │ │ ├── GAIEcommerceFields.h │ │ │ ├── GAIEcommerceProduct.h │ │ │ ├── GAIEcommerceProductAction.h │ │ │ ├── GAIEcommercePromotion.h │ │ │ ├── GAIFields.h │ │ │ ├── GAILogger.h │ │ │ ├── GAITrackedViewController.h │ │ │ └── GAITracker.h │ ├── Local Podspecs │ │ ├── RNVectorIcons.podspec.json │ │ ├── React.podspec.json │ │ ├── Yoga.podspec.json │ │ └── native-navigation.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ ├── Target Support Files │ │ ├── GoogleToolboxForMac │ │ │ ├── GoogleToolboxForMac-dummy.m │ │ │ ├── GoogleToolboxForMac-prefix.pch │ │ │ ├── GoogleToolboxForMac-umbrella.h │ │ │ ├── GoogleToolboxForMac.modulemap │ │ │ ├── GoogleToolboxForMac.xcconfig │ │ │ └── Info.plist │ │ ├── Pods-ReactNativeChat │ │ │ ├── Info.plist │ │ │ ├── Pods-ReactNativeChat-acknowledgements.markdown │ │ │ ├── Pods-ReactNativeChat-acknowledgements.plist │ │ │ ├── Pods-ReactNativeChat-dummy.m │ │ │ ├── Pods-ReactNativeChat-frameworks.sh │ │ │ ├── Pods-ReactNativeChat-resources.sh │ │ │ ├── Pods-ReactNativeChat-umbrella.h │ │ │ ├── Pods-ReactNativeChat.debug.xcconfig │ │ │ ├── Pods-ReactNativeChat.modulemap │ │ │ └── Pods-ReactNativeChat.release.xcconfig │ │ ├── RNVectorIcons │ │ │ ├── Info.plist │ │ │ ├── RNVectorIcons-dummy.m │ │ │ ├── RNVectorIcons-prefix.pch │ │ │ ├── RNVectorIcons-umbrella.h │ │ │ ├── RNVectorIcons.modulemap │ │ │ └── RNVectorIcons.xcconfig │ │ ├── React │ │ │ ├── Info.plist │ │ │ ├── React-dummy.m │ │ │ ├── React-prefix.pch │ │ │ ├── React-umbrella.h │ │ │ ├── React.modulemap │ │ │ └── React.xcconfig │ │ ├── Yoga │ │ │ ├── Info.plist │ │ │ ├── Yoga-dummy.m │ │ │ ├── Yoga-prefix.pch │ │ │ ├── Yoga-umbrella.h │ │ │ ├── Yoga.modulemap │ │ │ └── Yoga.xcconfig │ │ ├── lottie-ios │ │ │ ├── Info.plist │ │ │ ├── lottie-ios-dummy.m │ │ │ ├── lottie-ios-prefix.pch │ │ │ ├── lottie-ios-umbrella.h │ │ │ ├── lottie-ios.modulemap │ │ │ └── lottie-ios.xcconfig │ │ └── native-navigation │ │ │ ├── Info.plist │ │ │ ├── native-navigation-dummy.m │ │ │ ├── native-navigation-prefix.pch │ │ │ ├── native-navigation-umbrella.h │ │ │ ├── native-navigation.modulemap │ │ │ └── native-navigation.xcconfig │ └── lottie-ios │ │ ├── LICENSE │ │ ├── README.md │ │ └── lottie-ios │ │ └── Classes │ │ ├── AnimatableLayers │ │ ├── LOTAnimatableLayer.h │ │ ├── LOTAnimatableLayer.m │ │ ├── LOTCompositionLayer.h │ │ ├── LOTCompositionLayer.m │ │ ├── LOTEllipseShapeLayer.h │ │ ├── LOTEllipseShapeLayer.m │ │ ├── LOTGroupLayerView.h │ │ ├── LOTGroupLayerView.m │ │ ├── LOTLayerView.h │ │ ├── LOTLayerView.m │ │ ├── LOTMaskLayer.h │ │ ├── LOTMaskLayer.m │ │ ├── LOTRectShapeLayer.h │ │ ├── LOTRectShapeLayer.m │ │ ├── LOTShapeLayerView.h │ │ ├── LOTShapeLayerView.m │ │ ├── LOTStrokeShapeLayer.h │ │ └── LOTStrokeShapeLayer.m │ │ ├── AnimatableProperties │ │ ├── LOTAnimatableBoundsValue.h │ │ ├── LOTAnimatableBoundsValue.m │ │ ├── LOTAnimatableColorValue.h │ │ ├── LOTAnimatableColorValue.m │ │ ├── LOTAnimatableNumberValue.h │ │ ├── LOTAnimatableNumberValue.m │ │ ├── LOTAnimatablePointValue.h │ │ ├── LOTAnimatablePointValue.m │ │ ├── LOTAnimatableScaleValue.h │ │ ├── LOTAnimatableScaleValue.m │ │ ├── LOTAnimatableShapeValue.h │ │ ├── LOTAnimatableShapeValue.m │ │ └── LOTAnimatableValue.h │ │ ├── AnimationCache │ │ ├── LOTAnimationCache.h │ │ └── LOTAnimationCache.m │ │ ├── Extensions │ │ ├── CAAnimationGroup+LOTAnimatableGroup.h │ │ ├── CAAnimationGroup+LOTAnimatableGroup.m │ │ ├── CGGeometry+LOTAdditions.h │ │ ├── CGGeometry+LOTAdditions.m │ │ ├── LOTHelpers.h │ │ ├── UIColor+Expanded.h │ │ └── UIColor+Expanded.m │ │ ├── MacCompatability │ │ ├── CADisplayLink.h │ │ ├── CADisplayLink.m │ │ ├── CALayer+Compat.h │ │ ├── CALayer+Compat.m │ │ ├── LOTPlatformCompat.h │ │ ├── NSValue+Compat.h │ │ ├── NSValue+Compat.m │ │ ├── UIBezierPath.h │ │ ├── UIBezierPath.m │ │ ├── UIColor.h │ │ └── UIColor.m │ │ ├── Models │ │ ├── LOTAsset.h │ │ ├── LOTAsset.m │ │ ├── LOTAssetGroup.h │ │ ├── LOTAssetGroup.m │ │ ├── LOTComposition.h │ │ ├── LOTComposition.m │ │ ├── LOTLayer.h │ │ ├── LOTLayer.m │ │ ├── LOTLayerGroup.h │ │ ├── LOTLayerGroup.m │ │ ├── LOTMask.h │ │ ├── LOTMask.m │ │ ├── LOTModels.h │ │ ├── LOTShapeCircle.h │ │ ├── LOTShapeCircle.m │ │ ├── LOTShapeFill.h │ │ ├── LOTShapeFill.m │ │ ├── LOTShapeGroup.h │ │ ├── LOTShapeGroup.m │ │ ├── LOTShapePath.h │ │ ├── LOTShapePath.m │ │ ├── LOTShapeRectangle.h │ │ ├── LOTShapeRectangle.m │ │ ├── LOTShapeStroke.h │ │ ├── LOTShapeStroke.m │ │ ├── LOTShapeTransform.h │ │ ├── LOTShapeTransform.m │ │ ├── LOTShapeTrimPath.h │ │ └── LOTShapeTrimPath.m │ │ ├── Private │ │ ├── LOTAnimationTransitionController.m │ │ ├── LOTAnimationView.m │ │ └── LOTAnimationView_Internal.h │ │ └── PublicHeaders │ │ ├── LOTAnimationTransitionController.h │ │ ├── LOTAnimationView.h │ │ ├── LOTAnimationView_Compat.h │ │ └── Lottie.h ├── ReactNativeChat.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── ReactNativeChat.xcscheme ├── ReactNativeChat.xcworkspace │ └── contents.xcworkspacedata └── ReactNativeChat │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ └── LaunchScreen.xib │ ├── GoogleAnalyticsBridge.h │ ├── GoogleAnalyticsBridge.m │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── LottieContainerView.h │ ├── LottieContainerView.m │ ├── LottieLoaderViewManager.h │ ├── LottieLoaderViewManager.m │ └── main.m ├── lib └── react-native-flat-list │ ├── Batchinator.js │ ├── FillRateHelper.js │ ├── FlatList.js │ ├── ViewabilityHelper.js │ ├── VirtualizeUtils.js │ ├── VirtualizedList.js │ └── index.js └── package.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"], 3 | "plugins": [ 4 | [ 5 | "module-resolver", 6 | { 7 | "root": [ 8 | "./lib" 9 | ], 10 | "alias": { 11 | 12 | } 13 | } 14 | ] 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | lib/react-native-flat-list 2 | node_modules 3 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | experimental.strict_type_args=true 30 | 31 | munge_underscores=true 32 | 33 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 34 | 35 | suppress_type=$FlowIssue 36 | suppress_type=$FlowFixMe 37 | suppress_type=$FixMe 38 | 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-8]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-8]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 41 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 42 | 43 | unsafe.enable_getters_and_setters=true 44 | 45 | [version] 46 | ^0.38.0 47 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | fastlane/report.xml 52 | fastlane/Preview.html 53 | fastlane/screenshots 54 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Leland Richardson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | # To learn about Buck see [Docs](https://buckbuild.com/). 4 | # To run your application with Buck: 5 | # - install Buck 6 | # - `npm start` - to start the packager 7 | # - `cd android` 8 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 9 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 10 | # - `buck install -r android/app` - compile, install and run application 11 | # 12 | 13 | lib_deps = [] 14 | for jarfile in glob(['libs/*.jar']): 15 | name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) 16 | lib_deps.append(':' + name) 17 | prebuilt_jar( 18 | name = name, 19 | binary_jar = jarfile, 20 | ) 21 | 22 | for aarfile in glob(['libs/*.aar']): 23 | name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) 24 | lib_deps.append(':' + name) 25 | android_prebuilt_aar( 26 | name = name, 27 | aar = aarfile, 28 | ) 29 | 30 | android_library( 31 | name = 'all-libs', 32 | exported_deps = lib_deps 33 | ) 34 | 35 | android_library( 36 | name = 'app-code', 37 | srcs = glob([ 38 | 'src/main/java/**/*.java', 39 | ]), 40 | deps = [ 41 | ':all-libs', 42 | ':build_config', 43 | ':res', 44 | ], 45 | ) 46 | 47 | android_build_config( 48 | name = 'build_config', 49 | package = 'com.reactnativechat', 50 | ) 51 | 52 | android_resource( 53 | name = 'res', 54 | res = 'src/main/res', 55 | package = 'com.reactnativechat', 56 | ) 57 | 58 | android_binary( 59 | name = 'app', 60 | package_type = 'debug', 61 | manifest = 'src/main/AndroidManifest.xml', 62 | keystore = '//android/keystores:debug', 63 | deps = [ 64 | ':app-code', 65 | ], 66 | ) 67 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "219559895683", 4 | "project_id": "reactnativechat" 5 | }, 6 | "client": [ 7 | { 8 | "client_info": { 9 | "mobilesdk_app_id": "1:219559895683:android:e50c5dae8eef41ea", 10 | "android_client_info": { 11 | "package_name": "com.reactnativechat" 12 | } 13 | }, 14 | "oauth_client": [], 15 | "api_key": [ 16 | { 17 | "current_key": "AIzaSyA0N7aK9JdHyu7X8_50qjktmSchaBU6Bnw" 18 | } 19 | ], 20 | "services": { 21 | "analytics_service": { 22 | "status": 2, 23 | "analytics_property": { 24 | "tracking_id": "UA-98029628-1" 25 | } 26 | }, 27 | "appinvite_service": { 28 | "status": 1, 29 | "other_platform_oauth_client": [] 30 | }, 31 | "ads_service": { 32 | "status": 1 33 | } 34 | } 35 | } 36 | ], 37 | "configuration_version": "1" 38 | } -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 20 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativechat/LottieLoaderViewManager.java: -------------------------------------------------------------------------------- 1 | package com.reactnativechat; 2 | 3 | 4 | import com.airbnb.lottie.LottieAnimationView; 5 | import com.facebook.react.uimanager.SimpleViewManager; 6 | import com.facebook.react.uimanager.ThemedReactContext; 7 | import com.facebook.react.uimanager.annotations.ReactProp; 8 | 9 | public class LottieLoaderViewManager extends SimpleViewManager { 10 | 11 | private static final String REACT_CLASS = "LottieLoader"; 12 | 13 | @Override 14 | public String getName() { 15 | return REACT_CLASS; 16 | } 17 | 18 | @Override 19 | public LottieAnimationView createViewInstance(ThemedReactContext context) { 20 | return new LottieAnimationView(context); 21 | } 22 | 23 | @ReactProp(name = "sourceName") 24 | public void setSourceName(LottieAnimationView view, String sourceName) { 25 | view.setAnimation(sourceName + ".json"); 26 | view.loop(true); 27 | view.playAnimation(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativechat/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.reactnativechat; 2 | 3 | import com.airbnb.android.react.navigation.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | @Override 8 | protected String getInitialScreenName() { 9 | return "/"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativechat/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.reactnativechat; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.react.ReactApplication; 6 | import com.facebook.react.ReactNativeHost; 7 | import com.facebook.react.ReactPackage; 8 | import com.facebook.react.shell.MainReactPackage; 9 | import com.facebook.soloader.SoLoader; 10 | import com.airbnb.android.react.navigation.NativeNavigationPackage; 11 | import com.airbnb.android.react.navigation.ReactNavigationCoordinator; 12 | 13 | import java.util.Arrays; 14 | import java.util.List; 15 | 16 | public class MainApplication extends Application implements ReactApplication { 17 | 18 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 19 | @Override 20 | public boolean getUseDeveloperSupport() { 21 | return BuildConfig.DEBUG; 22 | } 23 | 24 | @Override 25 | protected List getPackages() { 26 | return Arrays.asList( 27 | new MainReactPackage(), 28 | new NativeNavigationPackage(), 29 | new RectNativeChatPackage() 30 | ); 31 | } 32 | 33 | @Override 34 | protected String getJSMainModuleName() { 35 | return "index"; 36 | } 37 | }; 38 | 39 | @Override 40 | public ReactNativeHost getReactNativeHost() { 41 | return mReactNativeHost; 42 | } 43 | 44 | @Override 45 | public void onCreate() { 46 | super.onCreate(); 47 | SoLoader.init(this, /* native exopackage */ false); 48 | 49 | ReactNavigationCoordinator coordinator = ReactNavigationCoordinator.sharedInstance; 50 | coordinator.injectReactInstanceManager(mReactNativeHost.getReactInstanceManager()); 51 | coordinator.start(this); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativechat/RectNativeChatPackage.java: -------------------------------------------------------------------------------- 1 | package com.reactnativechat; 2 | 3 | import com.facebook.react.ReactPackage; 4 | import com.facebook.react.bridge.JavaScriptModule; 5 | import com.facebook.react.bridge.NativeModule; 6 | import com.facebook.react.bridge.ReactApplicationContext; 7 | import com.facebook.react.uimanager.ViewManager; 8 | 9 | import java.util.Arrays; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | public class RectNativeChatPackage implements ReactPackage { 14 | 15 | @Override 16 | public List createNativeModules(ReactApplicationContext reactContext) { 17 | return Arrays.asList( 18 | new GoogleAnalyticsBridge(reactContext) 19 | ); 20 | } 21 | 22 | @Override 23 | public List> createJSModules() { 24 | return Collections.emptyList(); 25 | } 26 | 27 | @Override 28 | public List createViewManagers(ReactApplicationContext reactContext) { 29 | return Arrays.asList( 30 | new LottieLoaderViewManager() 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ReactNativeChat 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | classpath 'com.google.gms:google-services:3.0.0' 10 | 11 | // NOTE: Do not place your application dependencies here; they belong 12 | // in the individual module build.gradle files 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | mavenLocal() 19 | jcenter() 20 | maven { 21 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 22 | url "$rootDir/../node_modules/react-native/android" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useDeprecatedNdk=true 21 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 6 | -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = 'debug', 3 | store = 'debug.keystore', 4 | properties = 'debug.keystore.properties', 5 | visibility = [ 6 | 'PUBLIC', 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ReactNativeChat' 2 | 3 | include ':app' 4 | include ':native-navigation' 5 | project(':native-navigation').projectDir = new File(rootProject.projectDir, '../node_modules/native-navigation/lib/android') 6 | -------------------------------------------------------------------------------- /app/analytics.js: -------------------------------------------------------------------------------- 1 | import SafeModule from 'react-native-safe-module'; 2 | 3 | const AnalyticsBridge = SafeModule.module({ 4 | moduleName: 'GoogleAnalyticsBridge', 5 | mock: { 6 | trackEvent: (category, action, optionalValues) => {}, 7 | screenView: (screenName) => {}, 8 | setUser: (userName) => {}, 9 | }, 10 | }); 11 | 12 | module.exports = { 13 | trackEvent(category, action, optionalValues = {}) { 14 | AnalyticsBridge.trackEvent(category, action, optionalValues); 15 | }, 16 | screenView(screenName) { 17 | AnalyticsBridge.screenView(screenName); 18 | }, 19 | setUser(userName) { 20 | AnalyticsBridge.setUser(userName); 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /app/client.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-named-as-default 2 | import ApolloClient, { createNetworkInterface } from 'apollo-client'; 3 | import { SubscriptionClient, addGraphQLSubscriptions } from 'subscriptions-transport-ws'; 4 | 5 | // we do a little bit of patchwork with the SubscriptionClient to make it a little more robust 6 | SubscriptionClient.prototype.connect = (original => function connect() { 7 | // eslint-disable-next-line prefer-rest-params 8 | original.apply(this, arguments); 9 | 10 | // this.client has an onmessage method which has a habbit of throwing errors when debugging 11 | // and live reloading etc. Let's just go ahead and wrap it and safely call it instead. 12 | const originalOnMessage = this.client.onmessage; 13 | this.client.onmessage = function onmessage() { 14 | try { 15 | // eslint-disable-next-line prefer-rest-params 16 | return originalOnMessage.apply(this, arguments); 17 | } catch (e) { 18 | // swallow all errors for now. might want to make stricter in the future 19 | console.log('WebSocket Client Error!', e); 20 | return null; 21 | } 22 | }; 23 | })(SubscriptionClient.prototype.connect); 24 | 25 | const wsClient = new SubscriptionClient('wss://subscriptions.graph.cool/v1/rnchat', { 26 | reconnect: true, 27 | }); 28 | 29 | const networkInterface = createNetworkInterface({ 30 | uri: 'https://api.graph.cool/simple/v1/rnchat', 31 | }); 32 | 33 | const networkInterfaceWithSubscriptions = addGraphQLSubscriptions( 34 | networkInterface, 35 | wsClient, 36 | ); 37 | 38 | const client = new ApolloClient({ 39 | networkInterface: networkInterfaceWithSubscriptions, 40 | }); 41 | 42 | module.exports = client; 43 | -------------------------------------------------------------------------------- /app/components/BaseRow.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | View, 4 | StyleSheet, 5 | } from 'react-native'; 6 | 7 | import PlatformTouchableHighlight from './PlatformTouchableHighlight'; 8 | import theme from '../theme'; 9 | 10 | const propTypes = { 11 | children: PropTypes.node, 12 | onPress: PropTypes.func, 13 | }; 14 | 15 | const defaultProps = { 16 | }; 17 | 18 | class BaseRow extends React.Component { 19 | render() { 20 | const { 21 | children, 22 | onPress, 23 | } = this.props; 24 | 25 | const content = ( 26 | 27 | 28 | {children} 29 | 30 | 31 | ); 32 | 33 | if (onPress) { 34 | return ( 35 | 39 | {content} 40 | 41 | ); 42 | } 43 | return content; 44 | } 45 | } 46 | 47 | BaseRow.defaultProps = defaultProps; 48 | BaseRow.propTypes = propTypes; 49 | 50 | const styles = StyleSheet.create({ 51 | container: { 52 | overflow: 'hidden', 53 | paddingHorizontal: theme.size.horizontalPadding, 54 | }, 55 | row: { 56 | paddingVertical: theme.size.verticalPadding, 57 | borderBottomColor: '#dedede', 58 | borderBottomWidth: 1, 59 | }, 60 | }); 61 | 62 | export default BaseRow; 63 | -------------------------------------------------------------------------------- /app/components/Invert.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | View, 4 | StyleSheet, 5 | } from 'react-native'; 6 | 7 | const propTypes = { 8 | ...View.propTypes, 9 | }; 10 | 11 | class Invert extends React.Component { 12 | render() { 13 | return ( 14 | 15 | ); 16 | } 17 | } 18 | 19 | Invert.propTypes = propTypes; 20 | 21 | const styles = StyleSheet.create({ 22 | invert: { 23 | transform: [{ scaleY: -1 }], 24 | }, 25 | }); 26 | 27 | export default Invert; 28 | -------------------------------------------------------------------------------- /app/components/KeyboardContainer.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | LayoutAnimation, 4 | View, 5 | Platform, 6 | } from 'react-native'; 7 | import withKeyboardHeight from './withKeyboardHeight'; 8 | 9 | // From: https://medium.com/man-moon/writing-modern-react-native-ui-e317ff956f02 10 | const defaultAnimation = { 11 | duration: 500, 12 | create: { 13 | duration: 300, 14 | type: LayoutAnimation.Types.easeInEaseOut, 15 | property: LayoutAnimation.Properties.opacity, 16 | }, 17 | update: { 18 | type: LayoutAnimation.Types.spring, 19 | springDamping: 200, 20 | }, 21 | }; 22 | 23 | class KeyboardContainer extends Component { 24 | static propTypes = { 25 | keyboardHeight: PropTypes.number, 26 | children: PropTypes.node, 27 | }; 28 | 29 | componentWillReceiveProps(nextProps) { 30 | if (nextProps.keyboardHeight !== this.props.keyboardHeight) { 31 | let animationConfig = defaultAnimation; 32 | if (Platform.OS === 'ios') { 33 | animationConfig = LayoutAnimation.create( 34 | 250, 35 | LayoutAnimation.Types.keyboard, 36 | LayoutAnimation.Properties.opacity, 37 | ); 38 | } 39 | LayoutAnimation.configureNext(animationConfig); 40 | } 41 | } 42 | 43 | render() { 44 | return ( 45 | 54 | {this.props.children} 55 | 56 | ); 57 | } 58 | } 59 | 60 | module.exports = withKeyboardHeight()(KeyboardContainer); 61 | -------------------------------------------------------------------------------- /app/components/KeyboardSpacer.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { 3 | LayoutAnimation, 4 | View, 5 | Platform, 6 | } from 'react-native'; 7 | import withKeyboardHeight from './withKeyboardHeight'; 8 | 9 | // From: https://medium.com/man-moon/writing-modern-react-native-ui-e317ff956f02 10 | const defaultAnimation = { 11 | duration: 500, 12 | create: { 13 | duration: 300, 14 | type: LayoutAnimation.Types.easeInEaseOut, 15 | property: LayoutAnimation.Properties.opacity, 16 | }, 17 | update: { 18 | type: LayoutAnimation.Types.spring, 19 | springDamping: 200, 20 | }, 21 | }; 22 | 23 | class KeyboardSpacer extends Component { 24 | static propTypes = { 25 | keyboardHeight: PropTypes.number, 26 | }; 27 | 28 | componentWillReceiveProps(nextProps) { 29 | if (nextProps.keyboardHeight !== this.props.keyboardHeight) { 30 | let animationConfig = defaultAnimation; 31 | if (Platform.OS === 'ios') { 32 | animationConfig = LayoutAnimation.create( 33 | 250, 34 | LayoutAnimation.Types.keyboard, 35 | LayoutAnimation.Properties.opacity, 36 | ); 37 | } 38 | LayoutAnimation.configureNext(animationConfig); 39 | } 40 | } 41 | 42 | render() { 43 | return ( 44 | 51 | ); 52 | } 53 | } 54 | 55 | module.exports = withKeyboardHeight()(KeyboardSpacer); 56 | -------------------------------------------------------------------------------- /app/components/LabeledInput.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | View, 4 | StyleSheet, 5 | TextInput, 6 | Text, 7 | } from 'react-native'; 8 | import theme from '../theme'; 9 | 10 | const propTypes = { 11 | label: PropTypes.string.isRequired, 12 | value: PropTypes.any, 13 | onChange: PropTypes.func, 14 | }; 15 | 16 | const defaultProps = { 17 | onChange: () => {}, 18 | }; 19 | 20 | class LabeledInput extends React.Component { 21 | render() { 22 | return ( 23 | 24 | 25 | 26 | {this.props.label} 27 | 28 | 33 | 34 | 35 | ); 36 | } 37 | } 38 | 39 | LabeledInput.defaultProps = defaultProps; 40 | LabeledInput.propTypes = propTypes; 41 | 42 | const styles = StyleSheet.create({ 43 | container: { 44 | overflow: 'hidden', 45 | paddingHorizontal: theme.size.horizontalPadding, 46 | paddingVertical: theme.size.verticalPadding, 47 | }, 48 | label: { 49 | ...theme.font.tiny, 50 | color: theme.color.lightText, 51 | }, 52 | row: { 53 | borderBottomColor: '#dedede', 54 | borderBottomWidth: 1, 55 | }, 56 | input: { 57 | ...theme.font.large, 58 | height: 40, 59 | }, 60 | }); 61 | 62 | module.exports = LabeledInput; 63 | -------------------------------------------------------------------------------- /app/components/LiveDate.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { Text } from 'react-native'; 3 | import timeAgo from '../utils/timeAgo'; 4 | 5 | const propTypes = { 6 | date: PropTypes.oneOfType([ 7 | PropTypes.string, 8 | PropTypes.number, 9 | ]).isRequired, 10 | }; 11 | 12 | const subscribers = []; 13 | 14 | const LOOP_TIME = 1000; // once / second 15 | 16 | function loop() { 17 | subscribers.forEach(sub => sub.updateText()); 18 | setTimeout(loop, LOOP_TIME); 19 | } 20 | 21 | loop(); 22 | 23 | class LiveDate extends React.PureComponent { 24 | constructor(props) { 25 | super(props); 26 | this.state = { 27 | text: timeAgo(new Date(props.date)), 28 | }; 29 | } 30 | updateText() { 31 | const text = timeAgo(new Date(this.props.date)); 32 | if (text !== this.state.text) { 33 | this.setState({ text }); 34 | } 35 | } 36 | componentDidMount() { 37 | subscribers.push(this); 38 | } 39 | componentWillUnmount() { 40 | const index = subscribers.indexOf(this); 41 | if (index !== -1) { 42 | subscribers.splice(index, 1); 43 | } 44 | } 45 | componentWillReceiveProps(nextProps) { 46 | if (nextProps.date !== this.props.date) { 47 | this.updateText(); 48 | } 49 | } 50 | render() { 51 | return ( 52 | 53 | {this.state.text} 54 | 55 | ); 56 | } 57 | } 58 | 59 | LiveDate.propTypes = propTypes; 60 | 61 | export default LiveDate; 62 | -------------------------------------------------------------------------------- /app/components/Loader.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | StyleSheet, 4 | ActivityIndicator, 5 | } from 'react-native'; 6 | 7 | class Loader extends React.Component { 8 | render() { 9 | return ( 10 | 11 | ); 12 | } 13 | } 14 | 15 | const styles = StyleSheet.create({ 16 | container: { 17 | flex: 1, 18 | justifyContent: 'center', 19 | alignItems: 'center', 20 | }, 21 | }); 22 | 23 | export default Loader; 24 | -------------------------------------------------------------------------------- /app/components/LottieLoader.js: -------------------------------------------------------------------------------- 1 | import SafeModule from 'react-native-safe-module'; 2 | import React from 'react'; 3 | import { View } from 'react-native'; 4 | import Loader from './Loader'; 5 | 6 | const NativeLottieLoader = SafeModule.component({ 7 | viewName: 'LottieLoader', 8 | mockComponent: () => console.log('using mock!') || , 9 | }); 10 | 11 | module.exports = () => ( 12 | 13 | 17 | 18 | ); 19 | -------------------------------------------------------------------------------- /app/components/PlatformTouchableHighlight.js: -------------------------------------------------------------------------------- 1 | /* eslint react/prop-types: 0 */ 2 | import React from 'react'; 3 | import { 4 | ColorPropType, 5 | TouchableHighlight, 6 | } from 'react-native'; 7 | import { 8 | createPlatformTouchableComponent, 9 | touchablePropTypes, 10 | } from './platformTouchable'; 11 | 12 | const propTypes = { 13 | ...touchablePropTypes, 14 | color: ColorPropType, 15 | }; 16 | 17 | export default createPlatformTouchableComponent({ 18 | displayName: 'PlatformTouchableHighlight', 19 | renderDefaultTouchable(props, color) { 20 | return ( 21 | 27 | {props.children} 28 | 29 | ); 30 | }, 31 | propTypes, 32 | }); 33 | -------------------------------------------------------------------------------- /app/components/PlatformTouchableOpacity.js: -------------------------------------------------------------------------------- 1 | /* eslint react/prop-types: 0 */ 2 | import React from 'react'; 3 | import { 4 | ColorPropType, 5 | TouchableOpacity, 6 | } from 'react-native'; 7 | import { 8 | createPlatformTouchableComponent, 9 | touchablePropTypes, 10 | } from './platformTouchable'; 11 | 12 | const propTypes = { 13 | ...touchablePropTypes, 14 | color: ColorPropType, 15 | }; 16 | 17 | export default createPlatformTouchableComponent({ 18 | displayName: 'PlatformTouchableOpacity', 19 | renderDefaultTouchable(props) { 20 | return ( 21 | 27 | {props.children} 28 | 29 | ); 30 | }, 31 | propTypes, 32 | warnUntestedRipple: true, 33 | needsViewWrap: true, 34 | }); 35 | -------------------------------------------------------------------------------- /app/components/RoomHeader.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | View, 4 | Text, 5 | StyleSheet, 6 | } from 'react-native'; 7 | import Navigator from 'native-navigation'; 8 | import Loader from './Loader'; 9 | import theme from '../theme'; 10 | 11 | const propTypes = { 12 | // title: PropTypes.string.isRequired, 13 | loading: PropTypes.bool.isRequired, 14 | messages: PropTypes.array, 15 | }; 16 | 17 | const defaultProps = { 18 | }; 19 | 20 | class RoomHeader extends React.Component { 21 | render() { 22 | const { 23 | // title, 24 | loading, 25 | messages, 26 | } = this.props; 27 | 28 | const hasMessages = messages && messages.length > 0; 29 | 30 | // TODO: better loading state... 31 | // TODO: better zero messages state... 32 | // TODO: "load more" button? 33 | 34 | return ( 35 | 36 | 37 | 38 | {loading && ( 39 | 40 | )} 41 | {!loading && !hasMessages && ( 42 | 43 | Nothing here... 44 | 45 | )} 46 | 47 | 48 | ); 49 | } 50 | } 51 | 52 | RoomHeader.defaultProps = defaultProps; 53 | RoomHeader.propTypes = propTypes; 54 | 55 | const styles = StyleSheet.create({ 56 | container: { 57 | paddingHorizontal: 8, 58 | }, 59 | header: { 60 | flex: 1, 61 | alignItems: 'center', 62 | paddingVertical: 16, 63 | borderBottomWidth: 1, 64 | borderBottomColor: '#eee', 65 | }, 66 | text: { 67 | fontWeight: 'bold', 68 | fontSize: 18, 69 | }, 70 | }); 71 | 72 | export default RoomHeader; 73 | -------------------------------------------------------------------------------- /app/components/Row.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | View, 4 | Text, 5 | Image, 6 | StyleSheet, 7 | } from 'react-native'; 8 | 9 | import BaseRow from './BaseRow'; 10 | import theme from '../theme'; 11 | 12 | const propTypes = { 13 | title: PropTypes.string.isRequired, 14 | subtitle: PropTypes.string, 15 | onPress: PropTypes.func, 16 | }; 17 | 18 | const defaultProps = { 19 | }; 20 | 21 | class Row extends React.Component { 22 | render() { 23 | const { 24 | title, 25 | subtitle, 26 | onPress, 27 | } = this.props; 28 | 29 | return ( 30 | 31 | 32 | 33 | 34 | {title} 35 | 36 | {!!subtitle && ( 37 | 38 | {subtitle} 39 | 40 | )} 41 | 42 | {onPress && ( 43 | 51 | )} 52 | 53 | 54 | ); 55 | } 56 | } 57 | 58 | Row.defaultProps = defaultProps; 59 | Row.propTypes = propTypes; 60 | 61 | const styles = StyleSheet.create({ 62 | content: { 63 | flexDirection: 'row', 64 | justifyContent: 'space-between', 65 | alignItems: 'flex-start', 66 | marginVertical: 8, 67 | }, 68 | contentTween: { 69 | marginVertical: 24, 70 | }, 71 | loadingContainer: { 72 | flex: 0, 73 | }, 74 | titleContainer: { 75 | flex: 1, 76 | }, 77 | title: theme.font.large, 78 | subtitle: { 79 | ...theme.font.small, 80 | marginTop: 4, 81 | }, 82 | icon: { 83 | marginTop: 0.4 * 8, 84 | }, 85 | }); 86 | 87 | export default Row; 88 | -------------------------------------------------------------------------------- /app/components/Screen.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import Navigator from 'native-navigation'; 3 | 4 | const propTypes = { 5 | title: PropTypes.string, 6 | children: PropTypes.node, 7 | onPress: PropTypes.func, 8 | }; 9 | 10 | const defaultProps = { 11 | }; 12 | 13 | class Screen extends React.Component { 14 | render() { 15 | const { 16 | children, 17 | title, 18 | } = this.props; 19 | 20 | return ( 21 | 27 | {children} 28 | 29 | ); 30 | } 31 | } 32 | 33 | Screen.defaultProps = defaultProps; 34 | Screen.propTypes = propTypes; 35 | 36 | export default Screen; 37 | -------------------------------------------------------------------------------- /app/components/ScrollScreen.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | ScrollView, 4 | StyleSheet, 5 | Dimensions, 6 | } from 'react-native'; 7 | import Navigator from 'native-navigation'; 8 | import Screen from './Screen'; 9 | 10 | const propTypes = { 11 | title: PropTypes.string, 12 | children: PropTypes.node, 13 | onPress: PropTypes.func, 14 | }; 15 | 16 | const defaultProps = { 17 | }; 18 | 19 | class ScrollScreen extends React.Component { 20 | render() { 21 | return ( 22 | 23 | 27 | 28 | {this.props.children} 29 | 30 | 31 | ); 32 | } 33 | } 34 | 35 | ScrollScreen.defaultProps = defaultProps; 36 | ScrollScreen.propTypes = propTypes; 37 | 38 | export default ScrollScreen; 39 | -------------------------------------------------------------------------------- /app/components/platformTouchable.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { 3 | TouchableNativeFeedback, 4 | View, 5 | Platform, 6 | } from 'react-native'; 7 | 8 | export const touchablePropTypes = { 9 | children: PropTypes.element.isRequired, 10 | disabled: PropTypes.bool, 11 | onPress: PropTypes.func, 12 | }; 13 | 14 | export const touchableDefaultProps = { 15 | disabled: false, 16 | }; 17 | 18 | const supportsRipple = Platform.select({ 19 | android: () => Platform.Version >= 21, 20 | ios: () => false, 21 | }); 22 | 23 | export function createPlatformTouchableComponent(options) { 24 | class PlatformTouchable extends React.Component { 25 | renderNativeFeedback(color) { 26 | let content = this.props.children; 27 | if (this.props.children.type !== View) { 28 | content = {this.props.children}; 29 | } 30 | return ( 31 | 37 | {content} 38 | 39 | ); 40 | } 41 | 42 | render() { 43 | const { color } = this.props; 44 | if (supportsRipple()) { 45 | return this.renderNativeFeedback(color); 46 | } 47 | return options.renderDefaultTouchable(this.props, color); 48 | } 49 | } 50 | 51 | PlatformTouchable.displayName = options.displayName; 52 | PlatformTouchable.propTypes = options.propTypes; 53 | PlatformTouchable.defaultProps = options.defaultProps || touchableDefaultProps; 54 | 55 | return PlatformTouchable; 56 | } 57 | -------------------------------------------------------------------------------- /app/components/withKeyboardHeight.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | Keyboard, 4 | Dimensions, 5 | Platform, 6 | } from 'react-native'; 7 | 8 | const withKeyboardHeight = () => Component => class KeyboardHeight extends React.Component { 9 | constructor(props, context) { 10 | super(props, context); 11 | this.state = { 12 | keyboardHeight: 0, 13 | }; 14 | this.listeners = null; 15 | this.updateKeyboardHeight = this.updateKeyboardHeight.bind(this); 16 | this.resetKeyboardHeight = this.resetKeyboardHeight.bind(this); 17 | } 18 | 19 | componentDidMount() { 20 | const updateListener = Platform.OS === 'android' ? 'keyboardDidShow' : 'keyboardWillShow'; 21 | const resetListener = Platform.OS === 'android' ? 'keyboardDidHide' : 'keyboardWillHide'; 22 | this.listeners = [ 23 | Keyboard.addListener(updateListener, this.updateKeyboardHeight), 24 | Keyboard.addListener(resetListener, this.resetKeyboardHeight), 25 | ]; 26 | } 27 | 28 | componentWillUnmount() { 29 | this.listeners.forEach(listener => listener.remove()); 30 | } 31 | 32 | updateKeyboardHeight(event) { 33 | if (!event.endCoordinates) { 34 | return; 35 | } 36 | 37 | const screenHeight = Dimensions.get('window').height; 38 | const keyboardHeight = +(screenHeight - event.endCoordinates.screenY); 39 | this.setState({ keyboardHeight }); 40 | } 41 | 42 | resetKeyboardHeight() { 43 | this.setState({ keyboardHeight: 0 }); 44 | } 45 | 46 | render() { 47 | return ( 48 | 49 | ); 50 | } 51 | }; 52 | 53 | module.exports = withKeyboardHeight; 54 | -------------------------------------------------------------------------------- /app/devtools/ensureShallowPurity.js: -------------------------------------------------------------------------------- 1 | 2 | /* eslint no-restricted-syntax:0 */ 3 | const hasOwnProperty = Object.prototype.hasOwnProperty; 4 | 5 | function shallowDifferences(a, b) { 6 | const result = []; 7 | if (a === b) { 8 | return result; 9 | } 10 | 11 | for (const key in a) { 12 | if (hasOwnProperty.call(a, key) && a[key] !== b[key]) { 13 | result.push(key); 14 | } 15 | } 16 | 17 | for (const key in b) { 18 | if (hasOwnProperty.call(b, key) && !hasOwnProperty.call(a, key)) { 19 | result.push(key); 20 | } 21 | } 22 | 23 | return result; 24 | } 25 | 26 | function compareAndLogIfDifferent(a, b) { 27 | const keys = shallowDifferences(a, b); 28 | if (keys.length > 0) { 29 | console.group('%cFunction expected to be pure was not!', 'color: red;'); 30 | console.log('{key}, {first result}, {second result}'); 31 | keys.forEach(key => console.log(key, a[key], b[key])); 32 | console.groupEnd(); 33 | } 34 | } 35 | 36 | function ensureShallowPurity(fn) { 37 | return function wrappedFunction() { 38 | // eslint-disable-next-line prefer-rest-params 39 | const result = fn.apply(this, arguments); 40 | // eslint-disable-next-line prefer-rest-params 41 | const testResult = fn.apply(this, arguments); 42 | compareAndLogIfDifferent(result, testResult); 43 | return result; 44 | }; 45 | } 46 | 47 | module.exports = ensureShallowPurity; 48 | -------------------------------------------------------------------------------- /app/devtools/getReactRoot.js: -------------------------------------------------------------------------------- 1 | function getReactRoot() { 2 | // we can't cache a reference to this in a higher scope, because this isn't set initially 3 | // eslint-disable-next-line no-underscore-dangle 4 | const plugin = global.__REACT_DEVTOOLS_GLOBAL_HOOK__; 5 | const agent = plugin.reactDevtoolsAgent; 6 | const roots = Array.from(agent.roots); // roots is a set 7 | if (roots.length === 0) { 8 | return null; 9 | } 10 | const rootId = roots[roots.length - 1]; 11 | const root = agent.reactElements.get(rootId); 12 | return root; 13 | } 14 | 15 | module.exports = getReactRoot; 16 | -------------------------------------------------------------------------------- /app/devtools/logLifecycle.js: -------------------------------------------------------------------------------- 1 | import performanceNow from '../utils/performanceNow'; 2 | 3 | function logProtoMethod(proto, name, cname, all, color) { 4 | const original = proto[name]; 5 | if (original) { 6 | // eslint-disable-next-line no-param-reassign 7 | proto[name] = function logger() { 8 | const start = performanceNow(); 9 | // eslint-disable-next-line prefer-rest-params 10 | const result = original.apply(this, arguments); 11 | const time = performanceNow() - start; 12 | const roundedTime = Math.round(time * 10) / 10; 13 | if (color !== null) { 14 | console.log(`%c${cname}:${name} (${roundedTime}ms)`, `color: ${color};`); 15 | } else { 16 | console.log(`${cname}:${name} (${roundedTime}ms)`); 17 | } 18 | 19 | return result; 20 | }; 21 | } else if (all) { 22 | // eslint-disable-next-line no-param-reassign 23 | proto[name] = () => console.log(`${cname}:${name}`); 24 | } 25 | } 26 | 27 | function logLifecycle(Component, all = false, color = null) { 28 | const name = Component.displayName || Component.name; 29 | const proto = Component.prototype; 30 | logProtoMethod(proto, 'componentWillMount', name, all, color); 31 | logProtoMethod(proto, 'componentDidMount', name, all, color); 32 | logProtoMethod(proto, 'componentWillUnmount', name, all, color); 33 | 34 | logProtoMethod(proto, 'componentWillReceiveProps', name, all, color); 35 | logProtoMethod(proto, 'render', name, all, color); 36 | 37 | logProtoMethod(proto, 'componentWillUpdate', name, all, color); 38 | logProtoMethod(proto, 'componentDidUpdate', name, all, color); 39 | 40 | // only ever log this if it's implemented 41 | logProtoMethod(proto, 'shouldComponentUpdate', name, false, color); 42 | } 43 | 44 | module.exports = logLifecycle; 45 | -------------------------------------------------------------------------------- /app/devtools/purityWarningReduxConnect.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import ensureShallowPurity from './ensureShallowPurity'; 3 | 4 | function purityWarningReduxConnect( 5 | mapStateToProps, 6 | mapDispatchToProps, 7 | mergeProps, 8 | options, 9 | ) { 10 | return connect( 11 | mapStateToProps ? ensureShallowPurity(mapStateToProps) : null, 12 | mapDispatchToProps, 13 | mergeProps, 14 | options, 15 | ); 16 | } 17 | 18 | module.exports = purityWarningReduxConnect; 19 | -------------------------------------------------------------------------------- /app/icons/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/add.png -------------------------------------------------------------------------------- /app/icons/add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/add@2x.png -------------------------------------------------------------------------------- /app/icons/add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/add@3x.png -------------------------------------------------------------------------------- /app/icons/alarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/alarm.png -------------------------------------------------------------------------------- /app/icons/alarm@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/alarm@2x.png -------------------------------------------------------------------------------- /app/icons/alarm@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/alarm@3x.png -------------------------------------------------------------------------------- /app/icons/backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/backup.png -------------------------------------------------------------------------------- /app/icons/backup@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/backup@2x.png -------------------------------------------------------------------------------- /app/icons/backup@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/backup@3x.png -------------------------------------------------------------------------------- /app/icons/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chat.png -------------------------------------------------------------------------------- /app/icons/chat@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chat@2x.png -------------------------------------------------------------------------------- /app/icons/chat@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chat@3x.png -------------------------------------------------------------------------------- /app/icons/chevron_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chevron_right.png -------------------------------------------------------------------------------- /app/icons/chevron_right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chevron_right@2x.png -------------------------------------------------------------------------------- /app/icons/chevron_right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/chevron_right@3x.png -------------------------------------------------------------------------------- /app/icons/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/close.png -------------------------------------------------------------------------------- /app/icons/close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/close@2x.png -------------------------------------------------------------------------------- /app/icons/close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/close@3x.png -------------------------------------------------------------------------------- /app/icons/faces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/faces.png -------------------------------------------------------------------------------- /app/icons/faces@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/faces@2x.png -------------------------------------------------------------------------------- /app/icons/faces@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/faces@3x.png -------------------------------------------------------------------------------- /app/icons/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/filter.png -------------------------------------------------------------------------------- /app/icons/filter@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/filter@2x.png -------------------------------------------------------------------------------- /app/icons/filter@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/filter@3x.png -------------------------------------------------------------------------------- /app/icons/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/home.png -------------------------------------------------------------------------------- /app/icons/home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/home@2x.png -------------------------------------------------------------------------------- /app/icons/home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/home@3x.png -------------------------------------------------------------------------------- /app/icons/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/refresh.png -------------------------------------------------------------------------------- /app/icons/refresh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/refresh@2x.png -------------------------------------------------------------------------------- /app/icons/refresh@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/refresh@3x.png -------------------------------------------------------------------------------- /app/icons/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/send.png -------------------------------------------------------------------------------- /app/icons/send@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/send@2x.png -------------------------------------------------------------------------------- /app/icons/send@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/send@3x.png -------------------------------------------------------------------------------- /app/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/settings.png -------------------------------------------------------------------------------- /app/icons/settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/settings@2x.png -------------------------------------------------------------------------------- /app/icons/settings@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/app/icons/settings@3x.png -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | import { ROOT, ROOM, ROOMS, SETTINGS, ADD_ROOM, ANIMATIONS } from './routes'; 2 | import registerScreen from './registerScreen'; 3 | 4 | registerScreen(ROOT, () => require('./screens/Rooms')); 5 | 6 | registerScreen(ROOM, () => require('./screens/Room')); 7 | registerScreen(ROOMS, () => require('./screens/Rooms')); 8 | registerScreen(SETTINGS, () => require('./screens/Settings')); 9 | registerScreen(ADD_ROOM, () => require('./screens/AddRoom')); 10 | registerScreen(ANIMATIONS, () => require('./screens/Animations')); 11 | -------------------------------------------------------------------------------- /app/initialization/env.js: -------------------------------------------------------------------------------- 1 | // This file should be run first, and allows us to specify some global variables. 2 | // eslint-disable-next-line no-underscore-dangle 3 | global.__TESTENV__ = false; 4 | 5 | // eslint-disable-next-line no-underscore-dangle 6 | global.__DEBUGGING_REMOTELY__ = !!(global.location && global.location.href); 7 | -------------------------------------------------------------------------------- /app/initialization/errors.js: -------------------------------------------------------------------------------- 1 | if (__DEV__) { 2 | // eslint-disable-next-line import/no-extraneous-dependencies 3 | const ExceptionsManager = require('ExceptionsManager'); 4 | 5 | ExceptionsManager.installConsoleErrorReporter(); 6 | 7 | // List of error prefixes that we choose to ignore because they are red herrings or not 8 | // actionable. Error message needs only to start with one of these strings to be ignored 9 | const IGNORED_ERRORS = [ 10 | 'Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN`', 11 | ]; 12 | 13 | // Uncommenting this line turns off redbox entirely 14 | // console.reportErrorsAsExceptions = false; 15 | 16 | // wrap console.error so that it look at our list of ignored errors and swallows if they match 17 | const original = console.error; 18 | console.error = function consoleError(err) { 19 | if (typeof err === 'string') { 20 | const shouldIgnore = IGNORED_ERRORS.some(prefix => err.startsWith(prefix)); 21 | if (shouldIgnore) { 22 | console.log('IGNORING ERROR~!'); 23 | return; 24 | } 25 | } 26 | // eslint-disable-next-line prefer-rest-params 27 | original.apply(console, arguments); 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /app/initialization/layoutAnimation.js: -------------------------------------------------------------------------------- 1 | import { Platform, UIManager } from 'react-native'; 2 | 3 | if (Platform.OS === 'android') { 4 | UIManager.setLayoutAnimationEnabledExperimental(true); 5 | } 6 | -------------------------------------------------------------------------------- /app/initialization/promises.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import RejectionTracking from 'promise/setimmediate/rejection-tracking'; 3 | 4 | RejectionTracking.enable({ 5 | allRejections: true, 6 | onUnhandled: (id, error) => { 7 | // When a promise rejection goes unhandled, this should essentially be considered a crash 8 | // in most cases. 9 | if (__DEV__) { 10 | // in development, we want to just trigger a RedBox 11 | console.error(error); 12 | } else { 13 | // In production we crash the app 14 | throw error; 15 | } 16 | }, 17 | onHandled: () => {}, 18 | }); 19 | -------------------------------------------------------------------------------- /app/initialization/user.js: -------------------------------------------------------------------------------- 1 | import store from '../store'; 2 | import UserService from '../services/UserService'; 3 | 4 | UserService.initialize(store, state => state.user); 5 | -------------------------------------------------------------------------------- /app/initialization/warnings.js: -------------------------------------------------------------------------------- 1 | if (__DEV__) { 2 | // some warnings we don't want to show up as yellow boxes because they aren't helpful or 3 | // actionable. This is a list of prefixes to warning messages that we are disabling. 4 | console.ignoredYellowBox = [ 5 | 'SocketProtocolError', 6 | 'TimeoutError: Event response for \'login\' timed out', 7 | 'Unable to symbolicate stack trace: The stack is null', 8 | 'Calling of `[-RCTUIManager setFrame:forView:]` which is deprecated', 9 | ]; 10 | } 11 | -------------------------------------------------------------------------------- /app/reducers/mainReducer.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import client from '../client'; 3 | 4 | module.exports = combineReducers({ 5 | user: require('./userReducer'), 6 | roomViews: require('./roomViewsReducer'), 7 | roomFavorites: require('./roomFavoritesReducer'), 8 | apollo: client.reducer(), 9 | }); 10 | -------------------------------------------------------------------------------- /app/reducers/roomFavoritesReducer.js: -------------------------------------------------------------------------------- 1 | import { Map } from 'immutable'; 2 | 3 | const initialState = Map(); // Map 4 | 5 | function roomFavoritesReducer(state = initialState, action) { 6 | switch (action.type) { 7 | case 'ROOM_FAVORITE_TOGGLED': 8 | return state.update(action.payload, fav => !fav, false); 9 | default: 10 | return state; 11 | } 12 | } 13 | 14 | module.exports = roomFavoritesReducer; 15 | -------------------------------------------------------------------------------- /app/reducers/roomViewsReducer.js: -------------------------------------------------------------------------------- 1 | import { Map } from 'immutable'; 2 | 3 | const initialState = Map(); // Map 4 | 5 | function roomViewsReducer(state = initialState, action) { 6 | switch (action.type) { 7 | case 'ROOM_VIEWED': 8 | return state.set(action.payload, Date.now()); 9 | default: 10 | return state; 11 | } 12 | } 13 | 14 | module.exports = roomViewsReducer; 15 | -------------------------------------------------------------------------------- /app/reducers/userReducer.js: -------------------------------------------------------------------------------- 1 | import UserService from '../services/UserService'; 2 | 3 | const initialState = { 4 | ...UserService.createDefaultUser(), 5 | }; 6 | 7 | function userReducer(state = initialState, action) { 8 | switch (action.type) { 9 | case UserService.INITIALIZE_ACTION: 10 | return { 11 | ...state, 12 | ...action.payload, 13 | }; 14 | case 'USER_CHANGED': 15 | return { 16 | ...state, 17 | ...action.payload, 18 | }; 19 | default: 20 | return state; 21 | } 22 | } 23 | 24 | module.exports = userReducer; 25 | -------------------------------------------------------------------------------- /app/registerScreen.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Provider } from 'react-redux'; 3 | import { ApolloProvider } from 'react-apollo'; 4 | import { Platform } from 'react-native'; 5 | import Navigator from 'native-navigation'; 6 | import KeyboardContainer from './components/KeyboardContainer'; 7 | import unwrapDefaultExport from './utils/unwrapDefaultExport'; 8 | import store from './store'; 9 | import client from './client'; 10 | import Analytics from './analytics'; 11 | 12 | function wrapComponent(screenName, ScreenThunk) { 13 | class Wrapper extends React.Component { 14 | componentDidMount() { 15 | Analytics.screenView(screenName); 16 | } 17 | render() { 18 | const Component = unwrapDefaultExport(ScreenThunk()); 19 | let screen = ; 20 | 21 | if (Platform.OS === 'ios') { 22 | screen = ( 23 | 24 | {screen} 25 | 26 | ); 27 | } 28 | 29 | screen = ( 30 | 31 | {screen} 32 | 33 | ); 34 | screen = ( 35 | 36 | {screen} 37 | 38 | ); 39 | return screen; 40 | } 41 | } 42 | 43 | return Wrapper; 44 | } 45 | 46 | 47 | export default function registerConnectedScreen(id, ScreenThunk, options = {}) { 48 | const Wrapper = wrapComponent(id, ScreenThunk, options); 49 | Navigator.registerScreen(id, () => Wrapper, options); 50 | } 51 | -------------------------------------------------------------------------------- /app/routes.js: -------------------------------------------------------------------------------- 1 | export const ROOT = '/'; 2 | export const ROOM = '/room'; 3 | export const ROOMS = '/rooms'; 4 | export const SETTINGS = '/settings'; 5 | export const ADD_ROOM = '/add-room'; 6 | export const ANIMATIONS = '/animations'; 7 | -------------------------------------------------------------------------------- /app/services/UserService.js: -------------------------------------------------------------------------------- 1 | import { AsyncStorage } from 'react-native'; 2 | 3 | const KEY = 'RN_CHAT_USER_INFO'; 4 | const INITIALIZE_ACTION = 'USER_INIT'; 5 | 6 | const createDefaultUser = () => { 7 | return clean({ 8 | name: `Anonymous ${Math.round(Math.random() * 1000)}`, 9 | image: null, 10 | email: null, 11 | }); 12 | }; 13 | 14 | const stringOrNull = val => (val == null ? null : String(val)); 15 | const clean = user => ({ 16 | name: stringOrNull(user.name), 17 | image: stringOrNull(user.image), 18 | email: stringOrNull(user.email), 19 | }); 20 | 21 | const get = () => AsyncStorage 22 | .getItem(KEY) 23 | .then(val => (val ? JSON.parse(val) : createDefaultUser())) 24 | .then(clean) 25 | .catch(() => createDefaultUser()); 26 | 27 | const set = (user) => AsyncStorage.setItem(KEY, JSON.stringify(clean(user))); 28 | 29 | const initialize = (store, getUser) => { 30 | let last = null; 31 | 32 | get().then(user => { 33 | last = user; 34 | store.dispatch({ 35 | type: INITIALIZE_ACTION, 36 | payload: user, 37 | }); 38 | }); 39 | 40 | store.subscribe(() => { 41 | const user = getUser(store.getState()); 42 | if (user !== last) { 43 | last = user; 44 | set(user); 45 | } 46 | }); 47 | }; 48 | 49 | const UserService = { 50 | INITIALIZE_ACTION, 51 | createDefaultUser, 52 | get, 53 | set, 54 | initialize, 55 | }; 56 | 57 | module.exports = UserService; 58 | -------------------------------------------------------------------------------- /app/store.js: -------------------------------------------------------------------------------- 1 | /* flow */ 2 | /* eslint-disable global-require */ 3 | import { applyMiddleware, compose, createStore } from 'redux'; 4 | import thunk from 'redux-thunk'; 5 | import pack from 'redux-pack'; 6 | import unwrapDefaultExport from './utils/unwrapDefaultExport'; 7 | import client from './client'; 8 | 9 | const middlewares = [ 10 | thunk, 11 | pack.middleware, 12 | client.middleware(), 13 | ]; 14 | 15 | if (__DEV__) { 16 | if (__DEBUGGING_REMOTELY__) { 17 | // eslint-disable-next-line import/newline-after-import 18 | middlewares.push(require('redux-logger').createLogger({ collapsed: true, duration: true })); 19 | } 20 | } 21 | 22 | let devTools = () => next => (...args) => next(...args); 23 | 24 | if (__DEV__ && !__TESTENV__) { 25 | // eslint-disable-next-line no-underscore-dangle 26 | if (global.__REDUX_DEVTOOLS_EXTENSION__) { 27 | // For the standalone "React Native Debugger" desktop app. 28 | // eslint-disable-next-line no-underscore-dangle 29 | devTools = global.__REDUX_DEVTOOLS_EXTENSION__; 30 | } 31 | } 32 | 33 | const enhancer = compose( 34 | applyMiddleware(...middlewares), 35 | devTools(), 36 | ); 37 | 38 | // Generate our Redux store 39 | const store = createStore( 40 | unwrapDefaultExport(require('./reducers/mainReducer')), 41 | {}, // initial state 42 | enhancer, 43 | ); 44 | 45 | if (__DEV__) { 46 | if (module && module.hot) { 47 | // Enable Webpack hot module replacement for reducers 48 | module.hot.accept(() => { 49 | store.replaceReducer(unwrapDefaultExport(require('./reducers/mainReducer'))); 50 | }); 51 | } 52 | } 53 | 54 | export default store; 55 | -------------------------------------------------------------------------------- /app/storeThunk.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | import unwrapDefaultExport from './utils/unwrapDefaultExport'; 3 | 4 | export default function storeThunk() { 5 | return unwrapDefaultExport(require('./store')); 6 | } 7 | -------------------------------------------------------------------------------- /app/theme.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from 'react-native'; 2 | 3 | const size = { 4 | horizontalPadding: 24, 5 | verticalPadding: 16, 6 | }; 7 | 8 | const color = { 9 | lightText: '#999999', 10 | darkText: '#484848', 11 | image: '#484848', 12 | lightGray: '#f7f7f7', 13 | accent: '#44B7E1', 14 | }; 15 | 16 | const font = { 17 | title: { 18 | color: color.darkText, 19 | fontSize: 32, 20 | lineHeight: 36, 21 | fontWeight: 'bold', 22 | }, 23 | large: { 24 | color: color.darkText, 25 | fontSize: 19, 26 | lineHeight: 24, 27 | }, 28 | small: { 29 | color: color.darkText, 30 | fontSize: 15, 31 | lineHeight: 18, 32 | }, 33 | tiny: { 34 | color: color.darkText, 35 | fontSize: 13, 36 | lineHeight: 16, 37 | }, 38 | }; 39 | 40 | const styles = StyleSheet.create({ 41 | invert: { 42 | transform: [{ scaleY: -1 }], 43 | }, 44 | }); 45 | 46 | module.exports = { 47 | bp: 8, 48 | size, 49 | font, 50 | color, 51 | styles, 52 | aspectRatio: 1 / 1.6, 53 | }; 54 | -------------------------------------------------------------------------------- /app/utils/gravatarUrl.js: -------------------------------------------------------------------------------- 1 | import { PixelRatio } from 'react-native'; 2 | import md5 from 'md5'; 3 | 4 | function gravatarUrl(email, size) { 5 | if (!email) return null; 6 | const s = Math.round(PixelRatio.get() * size); 7 | return `https://www.gravatar.com/avatar/${md5(email.toLowerCase())}.png?s=${s}&d=retro`; 8 | } 9 | 10 | module.exports = gravatarUrl; 11 | -------------------------------------------------------------------------------- /app/utils/oneAtATime.js: -------------------------------------------------------------------------------- 1 | // This function wraps another function and returns a new function that will execute the wrapped 2 | // function, but ensure that the function is not executed again until a passed in `done` callback 3 | // is invoked. This is useful for async actions that we want to make sure we don't have 4 | // multiple versions of in flight at any given time. 5 | function oneAtATime(fn) { 6 | let running = false; 7 | const done = () => { running = false; }; 8 | return () => { 9 | if (running) return; 10 | running = true; 11 | fn(done); 12 | }; 13 | } 14 | module.exports = oneAtATime; 15 | -------------------------------------------------------------------------------- /app/utils/performanceNow.js: -------------------------------------------------------------------------------- 1 | let performanceNow = () => Date.now(); 2 | 3 | // React Native provides some native-clock-driven performance.now functions that are 4 | // provided on the global with `nativePerformanceNow` 5 | if (global.nativePerformanceNow) { 6 | performanceNow = () => global.nativePerformanceNow(); 7 | } else if (global.performance && global.performance.now) { 8 | performanceNow = () => global.performance.now(); 9 | } 10 | 11 | module.exports = performanceNow; 12 | -------------------------------------------------------------------------------- /app/utils/timeAgo.js: -------------------------------------------------------------------------------- 1 | const MONTHS = [ 2 | 'Jan', 3 | 'Feb', 4 | 'Mar', 5 | 'Apr', 6 | 'May', 7 | 'Jun', 8 | 'Jul', 9 | 'Aug', 10 | 'Sep', 11 | 'Oct', 12 | 'Nov', 13 | 'Dec', 14 | ]; 15 | 16 | const MS_IN_DAY = 86400; 17 | 18 | module.exports = function timeAgo(date) { 19 | const seconds = Math.floor((+new Date() - date.getTime()) / 1e3); 20 | const minutes = Math.floor(seconds / 60); 21 | const days = Math.floor(seconds / MS_IN_DAY); 22 | 23 | return ( 24 | (seconds < 15 && ['now']) || 25 | (seconds < 60 && [seconds, 's ago']) || 26 | (seconds < 3600 && [minutes, 'm ago']) || 27 | (days < 1 && [Math.floor(minutes / 60), 'h ago']) || 28 | (days < 30 && [days, 'd ago']) || 29 | (days < 365 && [MONTHS[date.getMonth()], ' ', date.getDate()]) || 30 | [Math.floor(days / 365), 'y ago'] 31 | ).join(''); 32 | }; 33 | -------------------------------------------------------------------------------- /app/utils/unwrapDefaultExport.js: -------------------------------------------------------------------------------- 1 | export default function unwrapDefaultExport(module) { 2 | /* eslint no-underscore-dangle: 0 */ 3 | if (module != null && module.__esModule === true) { 4 | return module.default; 5 | } 6 | return module; 7 | } 8 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // set up some global environment variables 2 | import './app/initialization/env'; 3 | 4 | // set up proper unhandled promise rejection handling 5 | import './app/initialization/promises'; 6 | 7 | // configure which warnings we can safely ignore 8 | import './app/initialization/warnings'; 9 | 10 | // configure which errors we can safely ignore 11 | import './app/initialization/errors'; 12 | 13 | // we need to turn on LayoutAnimation for android 14 | import './app/initialization/layoutAnimation'; 15 | 16 | // initialize the user service, which has some data persistence, etc. 17 | import './app/initialization/user'; 18 | 19 | // in debug mode, expose some dev tools on the global 20 | import './app/devtools'; 21 | 22 | // the main app, including all screen registrations 23 | import './app'; 24 | 25 | 26 | import { UIManager, NativeModules } from 'react-native'; 27 | 28 | global.UIManager = UIManager; 29 | global.NativeModules = NativeModules; 30 | -------------------------------------------------------------------------------- /ios/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TRACKING_ID 6 | UA-98029628-1 7 | PLIST_VERSION 8 | 1 9 | BUNDLE_ID 10 | org.reactjs.native.example.ReactNativeChat 11 | PROJECT_ID 12 | reactnativechat 13 | IS_ADS_ENABLED 14 | 15 | IS_ANALYTICS_ENABLED 16 | 17 | IS_APPINVITE_ENABLED 18 | 19 | IS_GCM_ENABLED 20 | 21 | IS_SIGNIN_ENABLED 22 | 23 | GOOGLE_APP_ID 24 | 1:219559895683:ios:b12c5c58c1962263 25 | 26 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | target 'ReactNativeChat' do 2 | # Native Navigation uses Swift, so this line is required! 3 | use_frameworks! 4 | 5 | # Native Navigation! 6 | pod 'native-navigation', :path => '../node_modules/native-navigation' 7 | pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons' 8 | pod 'Google/Analytics' 9 | pod 'lottie-ios' 10 | 11 | # To use CocoaPods with React Native, you need to add this specific Yoga spec as well 12 | pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga/Yoga.podspec' 13 | 14 | # You don't necessarily need all of these subspecs, but this would be a typical setup. 15 | pod 'React', :path => '../node_modules/react-native', :subspecs => [ 16 | 'Core', 17 | 'RCTText', 18 | 'RCTNetwork', 19 | 'RCTWebSocket', # needed for debugging 20 | 'RCTAnimation', 21 | 'RCTImage', 22 | 'RCTNetwork', 23 | # Add any other subspecs you want to use in your project 24 | ] 25 | 26 | # Add any other dependencies here, including any 3rd party native libraries that you depend on for 27 | # React Native. 28 | end 29 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h: -------------------------------------------------------------------------------- 1 | #import 2 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h: -------------------------------------------------------------------------------- 1 | #import 2 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h: -------------------------------------------------------------------------------- 1 | /// @file FIRUserPropertyNames.h 2 | /// 3 | /// Predefined user property names. 4 | /// 5 | /// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can 6 | /// later analyze different behaviors of various segments of your userbase. You may supply up to 25 7 | /// unique UserProperties per app, and you can use the name and value of your choosing for each one. 8 | /// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and 9 | /// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to 10 | /// 36 characters long. The "firebase_" prefix is reserved and should not be used. 11 | 12 | /// The method used to sign in. For example, "google", "facebook" or "twitter". 13 | static NSString *const kFIRUserPropertySignUpMethod = @"sign_up_method"; 14 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h: -------------------------------------------------------------------------------- 1 | #import "FIRAnalyticsConfiguration.h" 2 | #import "FIRApp.h" 3 | #import "FIRConfiguration.h" 4 | #import "FIROptions.h" 5 | #import "FIRAnalytics+AppDelegate.h" 6 | #import "FIRAnalytics.h" 7 | #import "FIREventNames.h" 8 | #import "FIRParameterNames.h" 9 | #import "FIRUserPropertyNames.h" 10 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module FirebaseAnalytics { 2 | umbrella header "FirebaseAnalytics.h" 3 | export * 4 | module * { export *} 5 | link "sqlite3" 6 | link "z" 7 | link framework "CoreGraphics" 8 | link framework "Foundation" 9 | link framework "UIKit" 10 | } -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/FirebaseCore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/FirebaseCore -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * This class provides configuration fields for Firebase Analytics. 5 | */ 6 | @interface FIRAnalyticsConfiguration : NSObject 7 | 8 | /** 9 | * Returns the shared instance of FIRAnalyticsConfiguration. 10 | */ 11 | + (FIRAnalyticsConfiguration *)sharedInstance; 12 | 13 | /** 14 | * Sets the minimum engagement time in seconds required to start a new session. The default value 15 | * is 10 seconds. 16 | */ 17 | - (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval; 18 | 19 | /** 20 | * Sets the interval of inactivity in seconds that terminates the current session. The default 21 | * value is 1800 seconds (30 minutes). 22 | */ 23 | - (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; 24 | 25 | /** 26 | * Sets whether analytics collection is enabled for this app on this device. This setting is 27 | * persisted across app sessions. By default it is enabled. 28 | */ 29 | - (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; 30 | 31 | /** 32 | * Deprecated. Sets whether measurement and reporting are enabled for this app on this device. By 33 | * default they are enabled. 34 | */ 35 | - (void)setIsEnabled:(BOOL)isEnabled 36 | DEPRECATED_MSG_ATTRIBUTE("Use setAnalyticsCollectionEnabled: instead."); 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "FIRAnalyticsConfiguration.h" 4 | #import "FIRLoggerLevel.h" 5 | 6 | /** 7 | * The log levels used by FIRConfiguration. 8 | */ 9 | typedef NS_ENUM(NSInteger, FIRLogLevel) { 10 | /** Error */ 11 | kFIRLogLevelError __deprecated = 0, 12 | /** Warning */ 13 | kFIRLogLevelWarning __deprecated, 14 | /** Info */ 15 | kFIRLogLevelInfo __deprecated, 16 | /** Debug */ 17 | kFIRLogLevelDebug __deprecated, 18 | /** Assert */ 19 | kFIRLogLevelAssert __deprecated, 20 | /** Max */ 21 | kFIRLogLevelMax __deprecated = kFIRLogLevelAssert 22 | } DEPRECATED_MSG_ATTRIBUTE( 23 | "Use -FIRDebugEnabled and -FIRDebugDisabled or setLoggerLevel. See FIRApp.h for more details."); 24 | 25 | /** 26 | * This interface provides global level properties that the developer can tweak, and the singleton 27 | * of the Firebase Analytics configuration class. 28 | */ 29 | @interface FIRConfiguration : NSObject 30 | 31 | /** Returns the shared configuration object. */ 32 | + (FIRConfiguration *)sharedInstance; 33 | 34 | /** The configuration class for Firebase Analytics. */ 35 | @property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; 36 | 37 | /** Global log level. Defaults to kFIRLogLevelError. */ 38 | @property(nonatomic, readwrite, assign) FIRLogLevel logLevel DEPRECATED_MSG_ATTRIBUTE( 39 | "Use -FIRDebugEnabled and -FIRDebugDisabled or setLoggerLevel. See FIRApp.h for more details."); 40 | 41 | /** 42 | * Sets the logging level for internal Firebase logging. Firebase will only log messages 43 | * that are logged at or below loggerLevel. The messages are logged both to the Xcode 44 | * console and to the device's log. Note that if an app is running from AppStore, it will 45 | * never log above FIRLoggerLevelNotice even if loggerLevel is set to a higher (more verbose) 46 | * setting. 47 | * 48 | * @param loggerLevel The maximum logging level. The default level is set to FIRLoggerLevelNotice. 49 | */ 50 | - (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel; 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRLoggerLevel.h: -------------------------------------------------------------------------------- 1 | /** 2 | * The log levels used by internal logging. 3 | */ 4 | typedef NS_ENUM(NSInteger, FIRLoggerLevel) { 5 | FIRLoggerLevelError = 3 /*ASL_LEVEL_ERR*/, 6 | FIRLoggerLevelWarning = 4 /*ASL_LEVEL_WARNING*/, 7 | FIRLoggerLevelNotice = 5 /*ASL_LEVEL_NOTICE*/, 8 | FIRLoggerLevelInfo = 6 /*ASL_LEVEL_INFO*/, 9 | FIRLoggerLevelDebug = 7 /*ASL_LEVEL_DEBUG*/, 10 | FIRLoggerLevelMin = FIRLoggerLevelError, 11 | FIRLoggerLevelMax = FIRLoggerLevelDebug 12 | }; 13 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FirebaseCore.h: -------------------------------------------------------------------------------- 1 | #import "FIRAnalyticsConfiguration.h" 2 | #import "FIRApp.h" 3 | #import "FIRConfiguration.h" 4 | #import "FIRLoggerLevel.h" 5 | #import "FIROptions.h" 6 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module FirebaseCore { 2 | umbrella header "FirebaseCore.h" 3 | export * 4 | module * { export *} 5 | link "z" 6 | link framework "Foundation" 7 | link framework "UIKit" 8 | } -------------------------------------------------------------------------------- /ios/Pods/FirebaseInstanceID/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 2017-01-31 -- v1.0.9 2 | 3 | - Removed an error being mistakenly logged to the console. 4 | 5 | # 2016-07-06 -- v1.0.8 6 | 7 | - Don't store InstanceID plists in Documents folder. 8 | 9 | # 2016-06-19 -- v1.0.7 10 | 11 | - Fix remote-notifications warning on app submission. 12 | 13 | # 2016-05-16 -- v1.0.6 14 | 15 | - Fix CocoaPod linter issues for InstanceID pod. 16 | 17 | # 2016-05-13 -- v1.0.5 18 | 19 | - Fix Authorization errors for InstanceID tokens. 20 | 21 | # 2016-05-11 -- v1.0.4 22 | 23 | - Reduce wait for InstanceID token during parallel requests. 24 | 25 | # 2016-04-18 -- v1.0.3 26 | 27 | - Change flag to disable swizzling to *FirebaseAppDelegateProxyEnabled*. 28 | - Fix incessant Keychain errors while accessing InstanceID. 29 | - Fix max retries for fetching IID token. 30 | 31 | # 2016-04-18 -- v1.0.2 32 | 33 | - Register for remote notifications on iOS8+ in the SDK itself. 34 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID -------------------------------------------------------------------------------- /ios/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h: -------------------------------------------------------------------------------- 1 | #import "FIRInstanceID.h" 2 | -------------------------------------------------------------------------------- /ios/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module FirebaseInstanceID { 2 | umbrella header "FirebaseInstanceID.h" 3 | export * 4 | module * { export *} 5 | link framework "Foundation" 6 | link framework "UIKit" 7 | } -------------------------------------------------------------------------------- /ios/Pods/FirebaseInstanceID/README.md: -------------------------------------------------------------------------------- 1 | # InstanceID SDK for iOS 2 | 3 | Instance ID provides a unique ID per instance of your apps and also provides a 4 | mechanism to authenticate and authorize actions, like sending messages via 5 | Firebase Cloud Messaging (FCM). 6 | 7 | 8 | Please visit [our developer 9 | site](https://developers.google.com/instance-id/) for integration instructions, 10 | documentation, support information, and terms of service. 11 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLAnalytics.framework/GGLAnalytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/Google/Frameworks/GGLAnalytics.framework/GGLAnalytics -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLAnalytics.framework/Headers/GGLAnalytics.h: -------------------------------------------------------------------------------- 1 | // Generated umbrella header for GGLAnalytics. 2 | 3 | #import "GGLContext+Analytics.h" 4 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLAnalytics.framework/Headers/GGLContext+Analytics.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @protocol GAITracker; 4 | 5 | /** 6 | * The Google Analytic dispatch time interval in seconds when using a simulator. Setting it to one 7 | * second by default means the tracking information will be automatically dispatched every second 8 | * when using an iPhone simulator. 9 | * 10 | * If running on a device, uses the default time interval set by Google 11 | * Analytics, which is two minutes. 12 | */ 13 | extern const NSTimeInterval kSimulatorDispatchIntervalInSeconds; 14 | 15 | /** 16 | * This category extends |GGLContext| with the analytics service. Import 17 | * GGLContext+Analytics to use Google Analytics in your app. 18 | * 19 | * [GAI sharedInstance] and [[GAI sharedInstance] defaultTracker] should be ready to use after 20 | * -[[GGLContext sharedInstance] configureWithError:] is called. The defaultTracker can also be 21 | * fetched here through [GGLContext sharedInstance].tracker. The tracking ID of the tracker is the 22 | * one defined in GoogleService-Info.plist. 23 | * 24 | * @see GGLContext 25 | */ 26 | @interface GGLContext (Analytics) 27 | 28 | /** 29 | * Retrieve a configured GAITracker instance. 30 | * 31 | * Note that [[GAI sharedInstance] defaultTracker] is the first initialized tracker. If a developer 32 | * initializes a tracker before calling -[[GGLContext sharedInstance] configureWithError:], 33 | * -[[GAI sharedInstance] defaultTracker] is the one initialized first. The one initialized through 34 | * GGLContext can be accessed by either [[GAI sharedInstance] trackerWithTrackingId:@"UA-XXXX-Y"] 35 | * or [GGLContext sharedInstance].tracker. 36 | */ 37 | @property(nonatomic, readonly, strong) id tracker; 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLAnalytics.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module GGLAnalytics { 2 | 3 | export * 4 | 5 | umbrella header "GGLAnalytics.h" 6 | 7 | header "GGLContext+Analytics.h" 8 | } 9 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/GGLCore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/Google/Frameworks/GGLCore.framework/GGLCore -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Headers/GGLConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * This class provides configuration fields of Google APIs. 5 | */ 6 | @interface GGLConfiguration : NSObject 7 | 8 | /** 9 | * The OAuth2 client ID for the iOS application, used to authenticate Google users. For example 10 | * @"12345.apps.googleusercontent.com". 11 | */ 12 | @property(nonatomic, readonly, copy) NSString *clientID; 13 | 14 | /** 15 | * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics. 16 | */ 17 | @property(nonatomic, readonly, copy) NSString *trackingID; 18 | 19 | /** 20 | * The Google App ID that is used to uniquely identify an instance of an app. 21 | */ 22 | @property(nonatomic, readonly, copy) NSString *googleAppID; 23 | 24 | /** 25 | * Whether or not Analytics was enabled in the developer console. 26 | */ 27 | @property(nonatomic, readonly) BOOL isAnalyticsEnabled; 28 | 29 | /** 30 | * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in 31 | * GoogleService-Info.plist. 32 | */ 33 | @property(nonatomic, readonly) BOOL isMeasurementEnabled; 34 | 35 | /** 36 | * Whether or not SignIn was enabled in the developer console. 37 | */ 38 | @property(nonatomic, readonly) BOOL isSignInEnabled; 39 | 40 | /** 41 | * The version ID of the client library, e.g. @"1100000". 42 | */ 43 | @property(nonatomic, readonly, copy) NSString *libraryVersionID; 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Headers/GGLContext.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class GGLConfiguration; 4 | 5 | /** 6 | * Main entry point for Google API core configuration. Google services including Analytics and 7 | * SignIn can be configured via this class and its categories. See GGLContext+ for 8 | * details on the individual APIs. 9 | * 10 | * Once the appropriate categories are imported, you can configure all services via the 11 | * |configureWithError:| method. For example: 12 | * 13 | *
14 |  * NSError *configureError;
15 |  * [[GGLContext sharedInstance] configureWithError:&configureError];
16 |  * if (configureError != nil) {
17 |  *   NSLog(@"Error configuring the Google context: %@", configureError);
18 |  * }
19 |  * 
20 | * 21 | * The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with 22 | * your app target for the keys to configure each individual API. To generate your 23 | * GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add 24 | * 25 | * @see GGLContext (Analytics) 26 | * @see GGLContext (SignIn) 27 | */ 28 | @interface GGLContext : NSObject 29 | 30 | /** 31 | * The configuration details for various Google APIs. 32 | */ 33 | @property(nonatomic, readonly) GGLConfiguration *configuration; 34 | 35 | /** 36 | * Gets the singleton context. 37 | * @return The singleton context. 38 | */ 39 | + (instancetype)sharedInstance; 40 | 41 | /** 42 | * Configures integrated Google services Google Sign In and Google Analytics. 43 | * 44 | * This method should be called after the app is launched and before using other Google services. 45 | * The services will be available in categories that extend this class, such as 46 | * GGLContext+Analytics. 47 | * 48 | * @param error An ouput error, which will be populated if there was an error configuring the Google 49 | * services. Must not be nil. 50 | * 51 | * @warning error must not be nil. 52 | */ 53 | - (void)configureWithError:(NSError **)error; 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Headers/GGLCore.h: -------------------------------------------------------------------------------- 1 | // Generated umbrella header for GGLCore. 2 | 3 | #import "GGLConfiguration.h" 4 | #import "GGLContext.h" 5 | #import "GGLErrorCode.h" 6 | #import "GMRConfiguration.h" 7 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Headers/GGLErrorCode.h: -------------------------------------------------------------------------------- 1 | /** Error codes in Greenhouse error domain. */ 2 | typedef enum { 3 | /** 4 | * Operation succeeded. 5 | */ 6 | kGGLErrorCodeSucceeded = 0, 7 | /** 8 | * Default failure error code. This is a catch all error and indicates something has gone very 9 | * wrong. There is no remediation for this case. 10 | **/ 11 | kGGLErrorCodeUnknownFailure = -1, 12 | 13 | /** 14 | * Indicates that the calling method did not do anything in response to the call. This occurs in 15 | * situations where the caller asked state to be mutated into its current state or selector wasn't 16 | * present but it isn't considered a critical failure. 17 | */ 18 | kGGLErrorCodeNoOp = -2, 19 | 20 | /** 21 | * Indicates that configuration failed. The userInfo dictionary will contain more information 22 | * about the failure. 23 | */ 24 | kGGLErrorCodeConfigurationFailed = -3, 25 | 26 | // 100 series error codes are for GGLContext 27 | 28 | /** 29 | * Configuration of Analytics subspec failed. Additional details on the reason for the failure 30 | * appear in the related NSError. 31 | */ 32 | kGGLErrorCodeAnalyticsSubspecConfigFailed = -102, 33 | 34 | /** 35 | * Configuration of SignIn subspec failed. Additional details on the reason for the failure appear 36 | * in the related NSError. 37 | */ 38 | kGGLErrorCodeSignInSubspecConfigFailed = -105, 39 | 40 | /** 41 | * Missing expected subspec error. 42 | */ 43 | kGGLErrorCodeMissingExpectedSubspec = -106, 44 | 45 | } GGLErrorCode; 46 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Headers/GMRConfiguration.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * This class provides configuration fields for Google Measurement. 5 | */ 6 | @interface GMRConfiguration : NSObject 7 | 8 | /** 9 | * Returns the shared instance of GMRConfiguration. 10 | */ 11 | + (GMRConfiguration *)sharedInstance; 12 | 13 | /** 14 | * Sets whether measurement and reporting are enabled for this app on this device. By default they 15 | * are enabled. 16 | */ 17 | - (void)setIsEnabled:(BOOL)isEnabled; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/Google/Frameworks/GGLCore.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module GGLCore { 2 | 3 | export * 4 | 5 | umbrella header "GGLCore.h" 6 | 7 | header "GGLConfiguration.h" 8 | header "GGLContext.h" 9 | header "GGLErrorCode.h" 10 | header "GMRConfiguration.h" 11 | 12 | link framework "SystemConfiguration" 13 | link framework "UIKit" 14 | } 15 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/Analytics.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import 4 | 5 | #import "GAI.h" 6 | #import "GAIDictionaryBuilder.h" 7 | #import "GAIEcommerceFields.h" 8 | #import "GAIEcommerceProduct.h" 9 | #import "GAIEcommerceProductAction.h" 10 | #import "GAIEcommercePromotion.h" 11 | #import "GAIFields.h" 12 | #import "GAILogger.h" 13 | #import "GAITrackedViewController.h" 14 | #import "GAITracker.h" 15 | 16 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/Core.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | #import 5 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/ModuleHeaders/Analytics-Module.h: -------------------------------------------------------------------------------- 1 | #if defined(__has_include) 2 | # if __has_include() 3 | # include 4 | # endif 5 | #endif 6 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/ModuleHeaders/Core-Module.h: -------------------------------------------------------------------------------- 1 | #if defined(__has_include) 2 | # if __has_include() 3 | # include 4 | # endif 5 | #endif 6 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/ModuleHeaders/SignIn-Module.h: -------------------------------------------------------------------------------- 1 | #if defined(__has_include) 2 | # if __has_include() 3 | # include 4 | # endif 5 | #endif 6 | -------------------------------------------------------------------------------- /ios/Pods/Google/Headers/module.modulemap: -------------------------------------------------------------------------------- 1 | module Google { 2 | export * 3 | module Analytics { 4 | header "ModuleHeaders/Analytics-Module.h" 5 | export * 6 | } 7 | module Core { 8 | header "ModuleHeaders/Core-Module.h" 9 | export * 10 | } 11 | module SignIn { 12 | header "ModuleHeaders/SignIn-Module.h" 13 | export * 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ios/Pods/GoogleAnalytics/Libraries/libGoogleAnalytics.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lelandrichardson/react-native-in-depth/11c3f5948cf11b9489bd56d2faae358dc4f35802/ios/Pods/GoogleAnalytics/Libraries/libGoogleAnalytics.a -------------------------------------------------------------------------------- /ios/Pods/GoogleAnalytics/Sources/GAIEcommercePromotion.h: -------------------------------------------------------------------------------- 1 | /*! 2 | @header GAIEcommercePromotion.h 3 | @abstract Google Analytics iOS SDK Hit Format Header 4 | @copyright Copyright 2014 Google Inc. All rights reserved. 5 | */ 6 | 7 | #import 8 | 9 | /*! 10 | * Class to construct promotion related fields for Google Analytics hits. The fields from this class 11 | * can be used to represent internal promotions that run within an app, such as banners, banner ads 12 | * etc. 13 | * 14 | * Typical usage: 15 | * 16 | * GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createScreenView]; 17 | * GAIEcommercePromotion *promotion = [[GAIEcommercePromotion alloc] init]; 18 | * [promotion setId:@"PROMO-ID1234"]; 19 | * [promotion setName:@"Home screen banner"]; 20 | * [builder set:kGAIPromotionClick forKey:kGAIPromotionAction]; 21 | * [builder addPromotion:promotion]; 22 | * [tracker send:builder.build]]; 23 | * 24 | */ 25 | @interface GAIEcommercePromotion : NSObject 26 | 27 | /*! 28 | Sets the id that is used to identify a promotion in GA reports. 29 | */ 30 | - (GAIEcommercePromotion *)setId:(NSString *)pid; 31 | 32 | /*! 33 | Sets the name that is used to identify a promotion in GA reports. 34 | */ 35 | - (GAIEcommercePromotion *)setName:(NSString *)name; 36 | 37 | /*! 38 | Sets the name of the creative associated with the promotion. 39 | */ 40 | - (GAIEcommercePromotion *)setCreative:(NSString *)creative; 41 | 42 | /*! 43 | Sets the position of the promotion. 44 | */ 45 | - (GAIEcommercePromotion *)setPosition:(NSString *)position; 46 | 47 | /*! 48 | Builds an NSDictionary of fields stored in this instance. The index parameter is the 49 | index of this promotion in that promotion list. 50 |
51 | Normally, users will have no need to call this method. 52 | */ 53 | - (NSDictionary *)buildWithIndex:(NSUInteger)index; 54 | @end 55 | -------------------------------------------------------------------------------- /ios/Pods/GoogleAnalytics/Sources/GAILogger.h: -------------------------------------------------------------------------------- 1 | /*! 2 | @header GAILogger.h 3 | @abstract Google Analytics iOS SDK Source 4 | @copyright Copyright 2011 Google Inc. All rights reserved. 5 | */ 6 | 7 | #import 8 | 9 | typedef NS_ENUM(NSUInteger, GAILogLevel) { 10 | kGAILogLevelNone = 0, 11 | kGAILogLevelError = 1, 12 | kGAILogLevelWarning = 2, 13 | kGAILogLevelInfo = 3, 14 | kGAILogLevelVerbose = 4 15 | }; 16 | 17 | /*! 18 | Protocol to be used for logging debug and informational messages from the SDK. 19 | Implementations of this protocol can be provided to the |GAI| class, 20 | to be used as the logger by the SDK. See the |logger| property in GAI.h. 21 | */ 22 | @protocol GAILogger 23 | @required 24 | 25 | /*! 26 | Only messages of |logLevel| and below are logged. 27 | */ 28 | @property (nonatomic, assign) GAILogLevel logLevel; 29 | 30 | /*! 31 | Logs message with log level |kGAILogLevelVerbose|. 32 | */ 33 | - (void)verbose:(NSString *)message; 34 | 35 | /*! 36 | Logs message with log level |kGAILogLevelInfo|. 37 | */ 38 | - (void)info:(NSString *)message; 39 | 40 | /*! 41 | Logs message with log level |kGAILogLevelWarning|. 42 | */ 43 | - (void)warning:(NSString *)message; 44 | 45 | /*! 46 | Logs message with log level |kGAILogLevelError|. 47 | */ 48 | - (void)error:(NSString *)message; 49 | @end 50 | -------------------------------------------------------------------------------- /ios/Pods/GoogleAnalytics/Sources/GAITrackedViewController.h: -------------------------------------------------------------------------------- 1 | /*! 2 | @header GAITrackedViewController.h 3 | @abstract Google Analytics for iOS Tracked View Controller Header 4 | @copyright Copyright 2012 Google Inc. All rights reserved. 5 | */ 6 | 7 | #import 8 | #import 9 | 10 | @protocol GAITracker; 11 | 12 | /*! 13 | Extends UIViewController to generate Google Analytics screenview calls 14 | whenever the view appears; this is done by overriding the `viewDidAppear:` 15 | method. The screen name must be set for any tracking calls to be made. 16 | 17 | By default, this will use [GAI defaultTracker] for tracking calls, but one can 18 | override this by setting the tracker property. 19 | */ 20 | @interface GAITrackedViewController : UIViewController 21 | 22 | /*! 23 | The tracker on which view tracking calls are be made, or `nil`, in which case 24 | [GAI defaultTracker] will be used. 25 | */ 26 | @property(nonatomic, assign) id tracker; 27 | /*! 28 | The screen name, for purposes of Google Analytics tracking. If this is `nil`, 29 | no tracking calls will be made. 30 | */ 31 | @property(nonatomic, copy) NSString *screenName; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /ios/Pods/GoogleAnalytics/Sources/GAITracker.h: -------------------------------------------------------------------------------- 1 | /*! 2 | @header GAITracker.h 3 | @abstract Google Analytics iOS SDK Tracker Header 4 | @copyright Copyright 2013 Google Inc. All rights reserved. 5 | */ 6 | 7 | #import 8 | 9 | /*! 10 | Google Analytics tracking interface. Obtain instances of this interface from 11 | [GAI trackerWithTrackingId:] to track screens, events, transactions, timing, 12 | and exceptions. The implementation of this interface is thread-safe, and no 13 | calls are expected to block or take a long time. All network and disk activity 14 | will take place in the background. 15 | */ 16 | @protocol GAITracker 17 | 18 | /*! 19 | Name of this tracker. 20 | */ 21 | @property(nonatomic, readonly) NSString *name; 22 | 23 | /*! 24 | Allow collection of IDFA and related fields if set to true. Default is false. 25 | */ 26 | @property(nonatomic) BOOL allowIDFACollection; 27 | 28 | /*! 29 | Set a tracking parameter. 30 | 31 | @param parameterName The parameter name. 32 | 33 | @param value The value to set for the parameter. If this is nil, the 34 | value for the parameter will be cleared. 35 | */ 36 | - (void)set:(NSString *)parameterName 37 | value:(NSString *)value; 38 | 39 | /*! 40 | Get a tracking parameter. 41 | 42 | @param parameterName The parameter name. 43 | 44 | @returns The parameter value, or nil if no value for the given parameter is 45 | set. 46 | */ 47 | - (NSString *)get:(NSString *)parameterName; 48 | 49 | /*! 50 | Queue tracking information with the given parameter values. 51 | 52 | @param parameters A map from parameter names to parameter values which will be 53 | set just for this piece of tracking information, or nil for none. 54 | */ 55 | - (void)send:(NSDictionary *)parameters; 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /ios/Pods/GoogleToolboxForMac/README.md: -------------------------------------------------------------------------------- 1 | # GTM: Google Toolbox for Mac # 2 | 3 | **Project site**
4 | **Discussion group** 5 | 6 | # Google Toolbox for Mac # 7 | 8 | A collection of source from different Google projects that may be of use to 9 | developers working other iOS or OS X projects. 10 | 11 | If you find a problem/bug or want a new feature to be included in the Google 12 | Toolbox for Mac, please join the 13 | [discussion group](http://groups.google.com/group/google-toolbox-for-mac) 14 | or submit an 15 | [issue](https://github.com/google/google-toolbox-for-mac/issues). 16 | -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/Google/Google/Analytics-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/Analytics-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/Google/Google/Analytics.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/Analytics.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/Google/Google/Core-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/Core-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/Google/Google/Core.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/Core.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/Google/Google/SignIn-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/SignIn-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAI.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAI.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIDictionaryBuilder.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIDictionaryBuilder.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIEcommerceFields.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceFields.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIEcommerceProduct.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceProduct.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIEcommerceProductAction.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceProductAction.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIEcommercePromotion.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommercePromotion.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAIFields.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIFields.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAILogger.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAILogger.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAITrackedViewController.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAITrackedViewController.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Private/GoogleAnalytics/GAITracker.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAITracker.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/Google/Google/Analytics-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/Analytics-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/Google/Google/Analytics.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/Analytics.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/Google/Google/Core-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/Core-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/Google/Google/Core.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/Core.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/Google/Google/SignIn-Module.h: -------------------------------------------------------------------------------- 1 | ../../../../Google/Headers/ModuleHeaders/SignIn-Module.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAI.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAI.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIDictionaryBuilder.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIDictionaryBuilder.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIEcommerceFields.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceFields.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIEcommerceProduct.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceProduct.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIEcommerceProductAction.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommerceProductAction.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIEcommercePromotion.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIEcommercePromotion.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAIFields.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAIFields.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAILogger.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAILogger.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAITrackedViewController.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAITrackedViewController.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/GoogleAnalytics/GAITracker.h: -------------------------------------------------------------------------------- 1 | ../../../GoogleAnalytics/Sources/GAITracker.h -------------------------------------------------------------------------------- /ios/Pods/Local Podspecs/RNVectorIcons.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "RNVectorIcons", 3 | "version": "4.0.1", 4 | "summary": "Customizable Icons for React Native with support for NavBar/TabBar, image source and full styling.", 5 | "homepage": "https://github.com/oblador/react-native-vector-icons", 6 | "license": "MIT", 7 | "authors": { 8 | "Joel Arvidsson": "joel@oblador.se" 9 | }, 10 | "platforms": { 11 | "ios": "7.0" 12 | }, 13 | "source": { 14 | "git": "https://github.com/oblador/react-native-vector-icons.git", 15 | "tag": "v4.0.1" 16 | }, 17 | "source_files": "RNVectorIconsManager/**/*.{h,m}", 18 | "resources": "Fonts/*.ttf", 19 | "preserve_paths": "**/*.js", 20 | "dependencies": { 21 | "React": [ 22 | 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ios/Pods/Local Podspecs/Yoga.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Yoga", 3 | "version": "0.42.3.React", 4 | "license": { 5 | "type": "BSD" 6 | }, 7 | "homepage": "https://facebook.github.io/yoga/", 8 | "documentation_url": "https://facebook.github.io/yoga/docs/api/c/", 9 | "summary": "Yoga is a cross-platform layout engine which implements Flexbox.", 10 | "description": "Yoga is a cross-platform layout engine enabling maximum collaboration within your team by implementing an API many designers are familiar with, and opening it up to developers across different platforms.", 11 | "authors": "Facebook", 12 | "source": { 13 | "git": "https://github.com/facebook/react-native.git", 14 | "tag": "v0.42.3" 15 | }, 16 | "module_name": "yoga", 17 | "requires_arc": false, 18 | "compiler_flags": [ 19 | "-fno-omit-frame-pointer", 20 | "-fexceptions", 21 | "-Wall", 22 | "-Werror", 23 | "-std=c11", 24 | "-fPIC" 25 | ], 26 | "platforms": { 27 | "ios": "8.0" 28 | }, 29 | "source_files": "yoga/**/*.{c,h}" 30 | } 31 | -------------------------------------------------------------------------------- /ios/Pods/Local Podspecs/native-navigation.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "native-navigation", 3 | "version": "0.2.1", 4 | "summary": "React Native Mapview component for iOS + Android", 5 | "authors": { 6 | "intelligibabble": "leland.m.richardson@gmail.com" 7 | }, 8 | "homepage": "https://github.com/airbnb/native-navigation#readme", 9 | "license": "MIT", 10 | "platforms": { 11 | "ios": "8.0" 12 | }, 13 | "module_name": "NativeNavigation", 14 | "source": { 15 | "git": "https://github.com/airbnb/native-navigation.git", 16 | "tag": "v0.2.1" 17 | }, 18 | "source_files": "lib/ios/native-navigation/*.{h,m,swift}", 19 | "dependencies": { 20 | "React": [ 21 | 22 | ] 23 | }, 24 | "frameworks": "UIKit" 25 | } 26 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_GoogleToolboxForMac : NSObject 3 | @end 4 | @implementation PodsDummy_GoogleToolboxForMac 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "GTMDefines.h" 14 | #import "GTMNSData+zlib.h" 15 | 16 | FOUNDATION_EXPORT double GoogleToolboxForMacVersionNumber; 17 | FOUNDATION_EXPORT const unsigned char GoogleToolboxForMacVersionString[]; 18 | 19 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac.modulemap: -------------------------------------------------------------------------------- 1 | framework module GoogleToolboxForMac { 2 | umbrella header "GoogleToolboxForMac-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GoogleToolboxForMac 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" 4 | OTHER_LDFLAGS = -l"z" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleToolboxForMac 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/GoogleToolboxForMac/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-ReactNativeChat/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-ReactNativeChat/Pods-ReactNativeChat-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ReactNativeChat : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ReactNativeChat 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-ReactNativeChat/Pods-ReactNativeChat-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ReactNativeChatVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ReactNativeChatVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-ReactNativeChat/Pods-ReactNativeChat.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ReactNativeChat { 2 | umbrella header "Pods-ReactNativeChat-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/RNVectorIcons-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_RNVectorIcons : NSObject 3 | @end 4 | @implementation PodsDummy_RNVectorIcons 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/RNVectorIcons-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/RNVectorIcons-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "RNVectorIconsManager.h" 14 | 15 | FOUNDATION_EXPORT double RNVectorIconsVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char RNVectorIconsVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/RNVectorIcons.modulemap: -------------------------------------------------------------------------------- 1 | framework module RNVectorIcons { 2 | umbrella header "RNVectorIcons-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/RNVectorIcons/RNVectorIcons.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RNVectorIcons 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/React" "$PODS_CONFIGURATION_BUILD_DIR/Yoga" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../node_modules/react-native-vector-icons 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/React/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.42.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/React/React-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_React : NSObject 3 | @end 4 | @implementation PodsDummy_React 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/React/React-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/React/React.modulemap: -------------------------------------------------------------------------------- 1 | framework module React { 2 | umbrella header "React-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/React/React.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_CXX_LANGUAGE_STANDARD = c++14 2 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/React 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Yoga" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" $(PODS_TARGET_SRCROOT)/ReactCommon 6 | OTHER_LDFLAGS = -l"stdc++" -framework "JavaScriptCore" 7 | PODS_BUILD_DIR = $BUILD_DIR 8 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../node_modules/react-native 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.42.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Yoga-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Yoga : NSObject 3 | @end 4 | @implementation PodsDummy_Yoga 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Yoga-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Yoga-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "YGEnums.h" 14 | #import "YGMacros.h" 15 | #import "YGNodeList.h" 16 | #import "Yoga.h" 17 | 18 | FOUNDATION_EXPORT double yogaVersionNumber; 19 | FOUNDATION_EXPORT const unsigned char yogaVersionString[]; 20 | 21 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Yoga.modulemap: -------------------------------------------------------------------------------- 1 | framework module yoga { 2 | umbrella header "Yoga-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Yoga/Yoga.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Yoga 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" 4 | PODS_BUILD_DIR = $BUILD_DIR 5 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../node_modules/react-native/ReactCommon/yoga 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.5.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/lottie-ios-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_lottie_ios : NSObject 3 | @end 4 | @implementation PodsDummy_lottie_ios 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/lottie-ios-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/lottie-ios-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "LOTAnimationTransitionController.h" 14 | #import "LOTAnimationView.h" 15 | #import "LOTAnimationView_Compat.h" 16 | #import "Lottie.h" 17 | 18 | FOUNDATION_EXPORT double LottieVersionNumber; 19 | FOUNDATION_EXPORT const unsigned char LottieVersionString[]; 20 | 21 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/lottie-ios.modulemap: -------------------------------------------------------------------------------- 1 | framework module Lottie { 2 | umbrella header "lottie-ios-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/lottie-ios/lottie-ios.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/lottie-ios 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" 4 | OTHER_LDFLAGS = -framework "UIKit" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/lottie-ios 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.2.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/native-navigation-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_native_navigation : NSObject 3 | @end 4 | @implementation PodsDummy_native_navigation 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/native-navigation-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/native-navigation-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double NativeNavigationVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char NativeNavigationVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/native-navigation.modulemap: -------------------------------------------------------------------------------- 1 | framework module NativeNavigation { 2 | umbrella header "native-navigation-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/native-navigation/native-navigation.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/native-navigation 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/React" "$PODS_CONFIGURATION_BUILD_DIR/Yoga" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/Google" "${PODS_ROOT}/Headers/Public/GoogleAnalytics" 5 | OTHER_LDFLAGS = -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 7 | PODS_BUILD_DIR = $BUILD_DIR 8 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../node_modules/native-navigation 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTAnimatableLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableLayer.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/21/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LOTAnimatableLayer : CALayer 12 | 13 | - (instancetype)initWithLayerDuration:(NSTimeInterval)duration NS_DESIGNATED_INITIALIZER; 14 | 15 | @property (nonatomic, readonly) NSTimeInterval layerDuration; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTAnimatableLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableLayer.m 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/21/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimatableLayer.h" 10 | 11 | @implementation LOTAnimatableLayer 12 | 13 | - (instancetype)initWithLayerDuration:(NSTimeInterval)duration { 14 | self = [super init]; 15 | if (self) { 16 | _layerDuration = duration; 17 | } 18 | return self; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTCompositionLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTCompositionLayer.h 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/17/17. 6 | // 7 | // 8 | 9 | #import 10 | #import "LOTAnimationView_Compat.h" 11 | 12 | @class LOTLayerGroup; 13 | @class LOTAssetGroup; 14 | 15 | @interface LOTCompositionLayer : CALayer 16 | 17 | - (instancetype)initWithLayerGroup:(LOTLayerGroup *)layerGroup 18 | withAssetGroup:(LOTAssetGroup *)assetGroup 19 | withBounds:(CGRect)bounds; 20 | 21 | - (void)addSublayer:(LOTView *)view 22 | toLayerNamed:(NSString *)layer; 23 | 24 | - (void)layoutCustomChildLayers; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTEllipseShapeLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTEllipseShapeLayer.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/26/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimatableLayer.h" 10 | #import "LOTModels.h" 11 | 12 | @interface LOTEllipseShapeLayer : LOTAnimatableLayer 13 | 14 | - (instancetype)initWithEllipseShape:(LOTShapeCircle *)circleShape 15 | fill:(LOTShapeFill *)fill 16 | stroke:(LOTShapeStroke *)stroke 17 | trim:(LOTShapeTrimPath *)trim 18 | transform:(LOTShapeTransform *)transform 19 | withLayerDuration:(NSTimeInterval)duration; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTGroupLayerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTGroupLayerView.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/14/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTAnimatableLayer.h" 11 | 12 | @class LOTShapeGroup; 13 | @class LOTShapeTransform; 14 | @class LOTShapeFill; 15 | @class LOTShapeStroke; 16 | @class LOTShapeTrimPath; 17 | 18 | @interface LOTGroupLayerView : LOTAnimatableLayer 19 | 20 | - (instancetype)initWithShapeGroup:(LOTShapeGroup *)shapeGroup 21 | transform:(LOTShapeTransform *)previousTransform 22 | fill:(LOTShapeFill *)previousFill 23 | stroke:(LOTShapeStroke *)previousStroke 24 | trimPath:(LOTShapeTrimPath *)previousTrimPath 25 | withLayerDuration:(NSTimeInterval)duration; 26 | 27 | @property (nonatomic, readonly) LOTShapeGroup *shapeGroup; 28 | @property (nonatomic, readonly) LOTShapeTransform *shapeTransform; 29 | @property (nonatomic, assign) BOOL debugModeOn; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTLayerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTLayerView.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTPlatformCompat.h" 10 | #import "LOTAnimatableLayer.h" 11 | 12 | #import "LOTModels.h" 13 | 14 | @interface LOTLayerView : LOTAnimatableLayer 15 | 16 | - (instancetype)initWithModel:(LOTLayer *)model inLayerGroup:(LOTLayerGroup *)layerGroup; 17 | 18 | - (void)LOT_addChildLayer:(CALayer *)childLayer; 19 | 20 | @property (nonatomic, readonly) LOTLayer *layerModel; 21 | @property (nonatomic, assign) BOOL debugModeOn; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTMaskLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTMaskLayer.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/22/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimatableLayer.h" 10 | #import "LOTModels.h" 11 | 12 | @interface LOTMaskLayer : LOTAnimatableLayer 13 | 14 | - (instancetype)initWithMasks:(NSArray *)masks inLayer:(LOTLayer *)layer; 15 | 16 | @property (nonatomic, readonly) NSArray *masks; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTMaskLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTMaskLayer.m 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/22/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTMaskLayer.h" 10 | #import "CAAnimationGroup+LOTAnimatableGroup.h" 11 | 12 | @implementation LOTMaskLayer { 13 | LOTLayer *_layer; 14 | NSArray *_maskLayers; 15 | } 16 | 17 | - (instancetype)initWithMasks:(NSArray *)masks inLayer:(LOTLayer *)layer { 18 | self = [super initWithLayerDuration:layer.layerDuration]; 19 | if (self) { 20 | _masks = masks; 21 | _layer = layer; 22 | [self _setupViewFromModel]; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)_setupViewFromModel { 28 | NSMutableArray *maskLayers = [NSMutableArray array]; 29 | 30 | for (LOTMask *mask in _masks) { 31 | CAShapeLayer *maskLayer = [CAShapeLayer new]; 32 | maskLayer.path = mask.maskPath.initialShape.CGPath; 33 | maskLayer.fillColor = [UIColor whiteColor].CGColor; 34 | maskLayer.opacity = mask.opacity.initialValue.floatValue; 35 | [self addSublayer:maskLayer]; 36 | CAAnimationGroup *animGroup = [CAAnimationGroup LOT_animationGroupForAnimatablePropertiesWithKeyPaths:@{@"opacity" : mask.opacity, 37 | @"path" : mask.maskPath}]; 38 | if (animGroup) { 39 | [maskLayer addAnimation:animGroup forKey:@""]; 40 | } 41 | [maskLayers addObject:maskLayer]; 42 | } 43 | _maskLayers = maskLayers; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTRectShapeLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTRectShapeLayer.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/20/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTModels.h" 11 | #import "LOTAnimatableLayer.h" 12 | 13 | @interface LOTRectShapeLayer : LOTAnimatableLayer 14 | 15 | - (instancetype)initWithRectShape:(LOTShapeRectangle *)rectShape 16 | fill:(LOTShapeFill *)fill 17 | stroke:(LOTShapeStroke *)stroke 18 | trim:(LOTShapeTrimPath *)trim 19 | transform:(LOTShapeTransform *)transform 20 | withLayerDuration:(NSTimeInterval)duration; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTShapeLayerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeLayerView.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 7/13/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimatableLayer.h" 10 | #import "LOTModels.h" 11 | 12 | @interface LOTShapeLayerView : LOTAnimatableLayer 13 | 14 | - (instancetype)initWithShape:(LOTShapePath *)shape 15 | fill:(LOTShapeFill *)fill 16 | stroke:(LOTShapeStroke *)stroke 17 | trim:(LOTShapeTrimPath *)trim 18 | transform:(LOTShapeTransform *)transform 19 | withLayerDuration:(NSTimeInterval)duration; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableLayers/LOTStrokeShapeLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTStrokeShapeLayer.h 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/7/17. 6 | // 7 | // 8 | 9 | #import 10 | 11 | @interface LOTStrokeShapeLayer : CAShapeLayer 12 | 13 | @property CGFloat trimStart; 14 | @property CGFloat trimEnd; 15 | @property CGFloat trimOffset; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableBoundsValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableBoundsValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/20/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "LOTAnimatableValue.h" 12 | 13 | @interface LOTAnimatableBoundsValue : NSObject 14 | 15 | - (instancetype)initWithSizeValues:(NSDictionary *)sizeValue frameRate:(NSNumber *)frameRate; 16 | 17 | @property (nonatomic, readonly) CGRect initialBounds; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableColorValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableColorValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 6/23/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "LOTAnimatableValue.h" 12 | #import "LOTPlatformCompat.h" 13 | 14 | @interface LOTAnimatableColorValue : NSObject 15 | 16 | - (instancetype)initWithColorValues:(NSDictionary *)colorValues frameRate:(NSNumber *)frameRate; 17 | 18 | @property (nonatomic, readonly) UIColor *initialColor; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableNumberValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableNumberValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 6/23/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "LOTAnimatableValue.h" 12 | 13 | @interface LOTAnimatableNumberValue : NSObject 14 | 15 | - (instancetype)initWithNumberValues:(NSDictionary *)numberValues frameRate:(NSNumber *)frameRate; 16 | - (void)remapValuesFromMin:(NSNumber *)fromMin 17 | fromMax:(NSNumber *)fromMax 18 | toMin:(NSNumber *)toMin 19 | toMax:(NSNumber *)toMax; 20 | 21 | - (void)remapValueWithBlock:(CGFloat (^)(CGFloat inValue))remapBlock; 22 | 23 | @property (nonatomic, readonly) NSNumber *initialValue; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatablePointValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatablePointValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 6/23/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "LOTAnimatableValue.h" 12 | 13 | @interface LOTAnimatablePointValue : NSObject 14 | 15 | - (instancetype)initWithPointValues:(NSDictionary *)pointValues frameRate:(NSNumber *)frameRate; 16 | - (void)remapPointsFromBounds:(CGRect)frombounds toBounds:(CGRect)toBounds; 17 | 18 | @property (nonatomic, readonly) CGPoint initialPoint; 19 | @property (nonatomic, assign) BOOL usePathAnimation; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableScaleValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableScaleValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/11/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTAnimatableValue.h" 11 | 12 | @interface LOTAnimatableScaleValue : NSObject 13 | 14 | - (instancetype)initWithScaleValues:(NSDictionary *)scaleValues frameRate:(NSNumber *)frameRate; 15 | 16 | @property (nonatomic, readonly) CATransform3D initialScale; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableShapeValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableShapeValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 6/23/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTPlatformCompat.h" 11 | #import "LOTAnimatableValue.h" 12 | 13 | @interface LOTAnimatableShapeValue : NSObject 14 | 15 | - (instancetype)initWithShapeValues:(NSDictionary *)shapeValues frameRate:(NSNumber *)frameRate closed:(BOOL)closed; 16 | 17 | @property (nonatomic, readonly) UIBezierPath *initialShape; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimatableProperties/LOTAnimatableValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimatableValue.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/19/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LOTAnimatableValue 13 | 14 | - (CAKeyframeAnimation *)animationForKeyPath:(NSString *)keypath; 15 | - (BOOL)hasAnimation; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimationCache/LOTAnimationCache.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationCache.h 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 1/9/17. 6 | // Copyright © 2017 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class LOTComposition; 12 | 13 | @interface LOTAnimationCache : NSObject 14 | 15 | + (instancetype)sharedCache; 16 | 17 | - (void)addAnimation:(LOTComposition *)animation forKey:(NSString *)key; 18 | - (LOTComposition *)animationForKey:(NSString *)key; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/AnimationCache/LOTAnimationCache.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationCache.m 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 1/9/17. 6 | // Copyright © 2017 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimationCache.h" 10 | 11 | const NSInteger kLOTCacheSize = 50; 12 | 13 | @implementation LOTAnimationCache { 14 | NSMutableDictionary *animationsCache_; 15 | NSMutableArray *lruOrderArray_; 16 | } 17 | 18 | + (instancetype)sharedCache { 19 | static LOTAnimationCache *sharedCache = nil; 20 | static dispatch_once_t onceToken; 21 | dispatch_once(&onceToken, ^{ 22 | sharedCache = [[self alloc] init]; 23 | }); 24 | return sharedCache; 25 | } 26 | 27 | - (instancetype)init { 28 | self = [super init]; 29 | if (self) { 30 | animationsCache_ = [[NSMutableDictionary alloc] init]; 31 | lruOrderArray_ = [[NSMutableArray alloc] init]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)addAnimation:(LOTComposition *)animation forKey:(NSString *)key { 37 | if (lruOrderArray_.count >= kLOTCacheSize) { 38 | NSString *oldKey = lruOrderArray_[0]; 39 | [animationsCache_ removeObjectForKey:oldKey]; 40 | [lruOrderArray_ removeObject:oldKey]; 41 | } 42 | [lruOrderArray_ removeObject:key]; 43 | [lruOrderArray_ addObject:key]; 44 | [animationsCache_ setObject:animation forKey:key]; 45 | } 46 | 47 | - (LOTComposition *)animationForKey:(NSString *)key { 48 | LOTComposition *animation = [animationsCache_ objectForKey:key]; 49 | [lruOrderArray_ removeObject:key]; 50 | [lruOrderArray_ addObject:key]; 51 | return animation; 52 | } 53 | 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Extensions/CAAnimationGroup+LOTAnimatableGroup.h: -------------------------------------------------------------------------------- 1 | // 2 | // CAAnimationGroup+LOTAnimatableGroup.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/19/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTAnimatableValue.h" 11 | 12 | @interface CAAnimationGroup (LOTAnimatableGroup) 13 | 14 | + (nullable CAAnimationGroup *)LOT_animationGroupForAnimatablePropertiesWithKeyPaths:(nonnull NSDictionary> *)properties; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Extensions/CAAnimationGroup+LOTAnimatableGroup.m: -------------------------------------------------------------------------------- 1 | // 2 | // CAAnimationGroup+LOTAnimatableGroup.m 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/19/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "CAAnimationGroup+LOTAnimatableGroup.h" 10 | 11 | @implementation CAAnimationGroup (LOTAnimatableGroup) 12 | 13 | + (nullable CAAnimationGroup *)LOT_animationGroupForAnimatablePropertiesWithKeyPaths:(nonnull NSDictionary> *)properties { 14 | NSMutableArray *animations = [NSMutableArray array]; 15 | NSTimeInterval animduration = 0; 16 | for (NSString *keyPath in properties.allKeys) { 17 | id property = properties[keyPath]; 18 | if ([property hasAnimation]) { 19 | CAKeyframeAnimation *animation = [property animationForKeyPath:keyPath]; 20 | [animations addObject:animation]; 21 | 22 | if (animation.duration + animation.beginTime > animduration) { 23 | animduration = animation.duration + animation.beginTime; 24 | } 25 | } 26 | } 27 | 28 | if (animations.count) { 29 | CAAnimationGroup *animation = [CAAnimationGroup new]; 30 | animation.animations = animations; 31 | animation.duration = animduration; 32 | animation.fillMode = kCAFillModeForwards; 33 | animation.removedOnCompletion = NO; 34 | return animation; 35 | } 36 | return nil; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Extensions/LOTHelpers.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTHelpers.h 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 7/28/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #ifndef LOTHelpers_h 10 | #define LOTHelpers_h 11 | 12 | #import "UIColor+Expanded.h" 13 | #import "CGGeometry+LOTAdditions.h" 14 | 15 | #endif /* LOTHelpers_h */ 16 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/CADisplayLink.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import 8 | 9 | @interface CADisplayLink : NSObject 10 | 11 | + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel; 12 | - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode; 13 | - (void)invalidate; 14 | 15 | @end 16 | #endif 17 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/CADisplayLink.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import "CADisplayLink.h" 8 | #import 9 | 10 | @interface CADisplayLink() 11 | 12 | @property (nonatomic, weak) id target; 13 | @property (nonatomic, assign) SEL action; 14 | 15 | - (void)tick; 16 | 17 | @end 18 | 19 | CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, 20 | const CVTimeStamp *_, const CVTimeStamp *__, 21 | CVOptionFlags ___, CVOptionFlags *____, 22 | void *context) { 23 | @autoreleasepool { 24 | CADisplayLink *self = (__bridge CADisplayLink *)context; 25 | [self tick]; 26 | } 27 | return kCVReturnSuccess; 28 | } 29 | 30 | @implementation CADisplayLink { 31 | CVDisplayLinkRef _displayLink; 32 | } 33 | 34 | + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel { 35 | CADisplayLink *displayLink = [self new]; 36 | displayLink.target = target; 37 | displayLink.action = sel; 38 | return displayLink; 39 | } 40 | 41 | - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode { 42 | CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); 43 | CVDisplayLinkSetOutputCallback(_displayLink, displayLinkCallback, (__bridge void *)self); 44 | CVDisplayLinkStart(_displayLink); 45 | } 46 | 47 | - (void)invalidate { 48 | if (_displayLink) 49 | CVDisplayLinkStop(_displayLink); 50 | } 51 | 52 | - (void)dealloc { 53 | if (_displayLink) 54 | CVDisplayLinkRelease(_displayLink); 55 | } 56 | 57 | #pragma clang diagnostic push 58 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 59 | - (void)tick { 60 | if (self.action && [self.target respondsToSelector:self.action]) 61 | [self.target performSelector:self.action]; 62 | } 63 | #pragma clang diagnostic pop 64 | 65 | @end 66 | 67 | #endif 68 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/CALayer+Compat.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import 8 | #import 9 | 10 | @interface CALayer (Compat) 11 | 12 | @property (nonatomic, assign) BOOL allowsEdgeAntialiasing; 13 | 14 | @end 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/CALayer+Compat.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import "CALayer+Compat.h" 8 | 9 | @implementation CALayer (Compat) 10 | 11 | - (BOOL)allowsEdgeAntialiasing { return NO; } 12 | - (void)setAllowsEdgeAntialiasing:(BOOL)allowsEdgeAntialiasing { } 13 | 14 | @end 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/LOTPlatformCompat.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTPlatformCompat.h 3 | // Lottie 4 | // 5 | // Created by Oleksii Pavlovskyi on 2/2/17. 6 | // Copyright (c) 2017 Airbnb. All rights reserved. 7 | // 8 | 9 | #ifndef LOTPlatformCompat_h 10 | #define LOTPlatformCompat_h 11 | 12 | #import "TargetConditionals.h" 13 | 14 | #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 15 | 16 | #import 17 | 18 | #else 19 | 20 | #import 21 | #import "UIColor.h" 22 | #import "UIBezierPath.h" 23 | #import "CADisplayLink.h" 24 | #import "CALayer+Compat.h" 25 | #import "NSValue+Compat.h" 26 | 27 | NS_INLINE NSString *NSStringFromCGRect(CGRect rect) { 28 | return NSStringFromRect(rect); 29 | } 30 | 31 | NS_INLINE NSString *NSStringFromCGPoint(CGPoint point) { 32 | return NSStringFromPoint(point); 33 | } 34 | 35 | typedef NSEdgeInsets UIEdgeInsets; 36 | 37 | #endif 38 | #endif 39 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/NSValue+Compat.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import 8 | 9 | @interface NSValue (Compat) 10 | 11 | + (NSValue *)valueWithCGRect:(CGRect)rect; 12 | + (NSValue *)valueWithCGPoint:(CGPoint)point; 13 | 14 | @property (nonatomic, readonly) CGRect CGRectValue; 15 | @property(nonatomic, readonly) CGPoint CGPointValue; 16 | 17 | @end 18 | 19 | #endif 20 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/NSValue+Compat.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Oleksii Pavlovskyi on 2/2/17. 3 | // Copyright (c) 2017 Airbnb. All rights reserved. 4 | // 5 | 6 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 7 | #import "NSValue+Compat.h" 8 | 9 | @implementation NSValue (Compat) 10 | 11 | + (NSValue *)valueWithCGRect:(CGRect)rect { 12 | return [self valueWithRect:rect]; 13 | } 14 | 15 | + (NSValue *)valueWithCGPoint:(CGPoint)point { 16 | return [self valueWithPoint:point]; 17 | } 18 | 19 | - (CGRect)CGRectValue { 20 | return self.rectValue; 21 | } 22 | 23 | - (CGPoint)CGPointValue { 24 | return self.pointValue; 25 | } 26 | 27 | @end 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/MacCompatability/UIColor.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor.h 3 | // Lottie 4 | // 5 | // Created by Oleksii Pavlovskyi on 2/2/17. 6 | // Copyright © 2017 Airbnb. All rights reserved. 7 | // 8 | 9 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 10 | #import 11 | #import 12 | 13 | @interface UIColor : NSObject 14 | 15 | + (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha; 16 | + (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha; 17 | + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 18 | + (UIColor *)colorWithCGColor:(CGColorRef)cgColor; 19 | 20 | + (UIColor *)blackColor; 21 | + (UIColor *)darkGrayColor; 22 | + (UIColor *)lightGrayColor; 23 | + (UIColor *)whiteColor; 24 | + (UIColor *)grayColor; 25 | + (UIColor *)redColor; 26 | + (UIColor *)greenColor; 27 | + (UIColor *)blueColor; 28 | + (UIColor *)cyanColor; 29 | + (UIColor *)yellowColor; 30 | + (UIColor *)magentaColor; 31 | + (UIColor *)orangeColor; 32 | + (UIColor *)purpleColor; 33 | + (UIColor *)brownColor; 34 | + (UIColor *)clearColor; 35 | 36 | - (UIColor *)colorWithAlphaComponent:(CGFloat)alpha; 37 | 38 | @property (nonatomic, readonly) CGColorRef CGColor; 39 | 40 | @end 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTAsset.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAsset.h 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/16/17. 6 | // 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class LOTLayerGroup; 15 | @class LOTLayer; 16 | @class LOTAssetGroup; 17 | 18 | @interface LOTAsset : NSObject 19 | 20 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary 21 | withBounds:(CGRect)bounds 22 | withFramerate:(NSNumber * _Nullable)framerate 23 | withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup; 24 | 25 | @property (nonatomic, readonly, nullable) NSString *referenceID; 26 | @property (nonatomic, readonly, nullable) NSNumber *assetWidth; 27 | @property (nonatomic, readonly, nullable) NSNumber *assetHeight; 28 | 29 | @property (nonatomic, readonly, nullable) NSString *imageName; 30 | @property (nonatomic, readonly, nullable) NSString *imageDirectory; 31 | 32 | @property (nonatomic, readonly, nullable) LOTLayerGroup *layerGroup; 33 | 34 | @end 35 | 36 | NS_ASSUME_NONNULL_END 37 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTAsset.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAsset.m 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/16/17. 6 | // 7 | // 8 | 9 | #import "LOTAsset.h" 10 | #import "LOTLayer.h" 11 | #import "LOTLayerGroup.h" 12 | #import "LOTAssetGroup.h" 13 | 14 | @implementation LOTAsset 15 | 16 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary 17 | withBounds:(CGRect)bounds 18 | withFramerate:(NSNumber *)framerate 19 | withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup{ 20 | self = [super init]; 21 | if (self) { 22 | [self _mapFromJSON:jsonDictionary 23 | withBounds:bounds 24 | withFramerate:framerate 25 | withAssetGroup:assetGroup]; 26 | } 27 | return self; 28 | } 29 | 30 | 31 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary 32 | withBounds:(CGRect)bounds 33 | withFramerate:(NSNumber *)framerate 34 | withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup{ 35 | _referenceID = [jsonDictionary[@"id"] copy]; 36 | 37 | if (jsonDictionary[@"w"]) { 38 | _assetWidth = [jsonDictionary[@"w"] copy]; 39 | } 40 | 41 | if (jsonDictionary[@"h"]) { 42 | _assetHeight = [jsonDictionary[@"h"] copy]; 43 | } 44 | 45 | if (jsonDictionary[@"u"]) { 46 | _imageDirectory = [jsonDictionary[@"u"] copy]; 47 | } 48 | 49 | if (jsonDictionary[@"p"]) { 50 | _imageName = [jsonDictionary[@"p"] copy]; 51 | } 52 | 53 | NSArray *layersJSON = jsonDictionary[@"layers"]; 54 | if (layersJSON) { 55 | _layerGroup = [[LOTLayerGroup alloc] initWithLayerJSON:layersJSON 56 | withBounds:bounds 57 | withFramerate:framerate 58 | withAssetGroup:assetGroup]; 59 | } 60 | 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTAssetGroup.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAssetGroup.h 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/17/17. 6 | // 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class LOTAsset; 13 | @class LOTLayerGroup; 14 | @interface LOTAssetGroup : NSObject 15 | 16 | - (instancetype _Nonnull)initWithJSON:(NSArray * _Nonnull)jsonArray; 17 | 18 | - (void)buildAssetNamed:(NSString * _Nonnull)refID 19 | withBounds:(CGRect)bounds 20 | andFramerate:(NSNumber * _Nullable)framerate; 21 | 22 | - (void)finalizeInitialization; 23 | 24 | - (LOTAsset * _Nullable)assetModelForID:(NSString * _Nonnull)assetID; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTAssetGroup.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAssetGroup.m 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/17/17. 6 | // 7 | // 8 | 9 | #import "LOTAssetGroup.h" 10 | #import "LOTAsset.h" 11 | 12 | @implementation LOTAssetGroup { 13 | NSMutableDictionary *_assetMap; 14 | NSDictionary *_assetJSONMap; 15 | } 16 | 17 | - (instancetype)initWithJSON:(NSArray *)jsonArray { 18 | self = [super init]; 19 | if (self) { 20 | _assetMap = [NSMutableDictionary dictionary]; 21 | NSMutableDictionary *assetJSONMap = [NSMutableDictionary dictionary]; 22 | for (NSDictionary *assetDictionary in jsonArray) { 23 | NSString *referenceID = assetDictionary[@"id"]; 24 | if (referenceID) { 25 | assetJSONMap[referenceID] = assetDictionary; 26 | } 27 | } 28 | _assetJSONMap = assetJSONMap; 29 | } 30 | return self; 31 | } 32 | 33 | - (void)buildAssetNamed:(NSString *)refID 34 | withBounds:(CGRect)bounds 35 | andFramerate:(NSNumber * _Nullable)framerate { 36 | 37 | if ([self assetModelForID:refID]) { 38 | return; 39 | } 40 | 41 | NSDictionary *assetDictionary = _assetJSONMap[refID]; 42 | if (assetDictionary) { 43 | LOTAsset *asset = [[LOTAsset alloc] initWithJSON:assetDictionary 44 | withBounds:bounds 45 | withFramerate:framerate 46 | withAssetGroup:self]; 47 | _assetMap[refID] = asset; 48 | } 49 | } 50 | 51 | - (void)finalizeInitialization { 52 | for (NSString *refID in _assetJSONMap.allKeys) { 53 | [self buildAssetNamed:refID withBounds:CGRectZero andFramerate:nil]; 54 | } 55 | _assetJSONMap = nil; 56 | } 57 | 58 | - (LOTAsset *)assetModelForID:(NSString *)assetID { 59 | return _assetMap[assetID]; 60 | } 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTComposition.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTScene.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class LOTLayerGroup; 13 | @class LOTLayer; 14 | @class LOTAssetGroup; 15 | 16 | @interface LOTComposition : NSObject 17 | 18 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary; 19 | 20 | @property (nonatomic, readonly) CGRect compBounds; 21 | @property (nonatomic, readonly) NSNumber *startFrame; 22 | @property (nonatomic, readonly) NSNumber *endFrame; 23 | @property (nonatomic, readonly) NSNumber *framerate; 24 | @property (nonatomic, readonly) NSTimeInterval timeDuration; 25 | @property (nonatomic, readonly) LOTLayerGroup *layerGroup; 26 | @property (nonatomic, readonly) LOTAssetGroup *assetGroup; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTComposition.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTScene.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTComposition.h" 10 | #import "LOTLayer.h" 11 | #import "LOTAssetGroup.h" 12 | #import "LOTLayerGroup.h" 13 | 14 | @implementation LOTComposition 15 | 16 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary { 17 | self = [super init]; 18 | if (self) { 19 | [self _mapFromJSON:jsonDictionary]; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary { 25 | NSNumber *width = jsonDictionary[@"w"]; 26 | NSNumber *height = jsonDictionary[@"h"]; 27 | if (width && height) { 28 | CGRect bounds = CGRectMake(0, 0, width.floatValue, height.floatValue); 29 | _compBounds = bounds; 30 | } 31 | 32 | _startFrame = [jsonDictionary[@"ip"] copy]; 33 | _endFrame = [jsonDictionary[@"op"] copy]; 34 | _framerate = [jsonDictionary[@"fr"] copy]; 35 | 36 | if (_startFrame && _endFrame && _framerate) { 37 | NSInteger frameDuration = _endFrame.integerValue - _startFrame.integerValue; 38 | NSTimeInterval timeDuration = frameDuration / _framerate.floatValue; 39 | _timeDuration = timeDuration; 40 | } 41 | 42 | NSArray *assetArray = jsonDictionary[@"assets"]; 43 | if (assetArray.count) { 44 | _assetGroup = [[LOTAssetGroup alloc] initWithJSON:assetArray]; 45 | } 46 | 47 | NSArray *layersJSON = jsonDictionary[@"layers"]; 48 | if (layersJSON) { 49 | _layerGroup = [[LOTLayerGroup alloc] initWithLayerJSON:layersJSON 50 | withBounds:_compBounds 51 | withFramerate:_framerate 52 | withAssetGroup:_assetGroup]; 53 | } 54 | 55 | [_assetGroup finalizeInitialization]; 56 | 57 | } 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTLayerGroup.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTLayerGroup.h 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/16/17. 6 | // 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class LOTLayer; 15 | @class LOTAssetGroup; 16 | 17 | @interface LOTLayerGroup : NSObject 18 | 19 | - (instancetype)initWithLayerJSON:(NSArray *)layersJSON 20 | withBounds:(CGRect)bounds 21 | withFramerate:(NSNumber * _Nullable)framerate 22 | withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup; 23 | 24 | @property (nonatomic, readonly) NSArray *layers; 25 | 26 | - (LOTLayer *)layerModelForID:(NSNumber *)layerID; 27 | - (LOTLayer *)layerForReferenceID:(NSString *)referenceID; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTLayerGroup.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTLayerGroup.m 3 | // Pods 4 | // 5 | // Created by Brandon Withrow on 2/16/17. 6 | // 7 | // 8 | 9 | #import "LOTLayerGroup.h" 10 | #import "LOTLayer.h" 11 | #import "LOTAssetGroup.h" 12 | 13 | @implementation LOTLayerGroup { 14 | CGRect _bounds; 15 | NSNumber *_framerate; 16 | NSDictionary *_modelMap; 17 | NSDictionary *_referenceIDMap; 18 | } 19 | 20 | - (instancetype)initWithLayerJSON:(NSArray *)layersJSON 21 | withBounds:(CGRect)bounds 22 | withFramerate:(NSNumber *)framerate 23 | withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup { 24 | self = [super init]; 25 | if (self) { 26 | _framerate = framerate; 27 | _bounds = bounds; 28 | [self _mapFromJSON:layersJSON withAssetGroup:assetGroup]; 29 | } 30 | return self; 31 | } 32 | 33 | - (void)_mapFromJSON:(NSArray *)layersJSON withAssetGroup:(LOTAssetGroup * _Nullable)assetGroup { 34 | NSMutableArray *layers = [NSMutableArray array]; 35 | NSMutableDictionary *modelMap = [NSMutableDictionary dictionary]; 36 | NSMutableDictionary *referenceMap = [NSMutableDictionary dictionary]; 37 | 38 | for (NSDictionary *layerJSON in layersJSON) { 39 | LOTLayer *layer = [[LOTLayer alloc] initWithJSON:layerJSON 40 | withCompBounds:_bounds 41 | withFramerate:_framerate 42 | withAssetGroup:assetGroup]; 43 | [layers addObject:layer]; 44 | modelMap[layer.layerID] = layer; 45 | if (layer.referenceID) { 46 | referenceMap[layer.referenceID] = layer; 47 | } 48 | } 49 | 50 | _referenceIDMap = referenceMap; 51 | _modelMap = modelMap; 52 | _layers = layers; 53 | } 54 | 55 | - (LOTLayer *)layerModelForID:(NSNumber *)layerID { 56 | return _modelMap[layerID]; 57 | } 58 | 59 | - (LOTLayer *)layerForReferenceID:(NSString *)referenceID { 60 | return _referenceIDMap[referenceID]; 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTMask.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTMask.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LOTAnimatableShapeValue; 11 | @class LOTAnimatableNumberValue; 12 | 13 | typedef enum : NSUInteger { 14 | LOTMaskModeAdd, 15 | LOTMaskModeSubtract, 16 | LOTMaskModeIntersect, 17 | LOTMaskModeUnknown 18 | } LOTMaskMode; 19 | 20 | @interface LOTMask : NSObject 21 | 22 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 23 | 24 | @property (nonatomic, readonly) BOOL closed; 25 | @property (nonatomic, readonly) BOOL inverted; 26 | @property (nonatomic, readonly) LOTMaskMode maskMode; 27 | @property (nonatomic, readonly) LOTAnimatableShapeValue *maskPath; 28 | @property (nonatomic, readonly) LOTAnimatableNumberValue *opacity; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTMask.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTMask.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTMask.h" 10 | #import "LOTAnimatableShapeValue.h" 11 | #import "LOTAnimatableNumberValue.h" 12 | 13 | @implementation LOTMask 14 | 15 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 16 | self = [super init]; 17 | if (self) { 18 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 19 | } 20 | return self; 21 | } 22 | 23 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 24 | NSNumber *closed = jsonDictionary[@"cl"]; 25 | _closed = closed.boolValue; 26 | 27 | NSNumber *inverted = jsonDictionary[@"inv"]; 28 | _inverted = inverted.boolValue; 29 | 30 | NSString *mode = jsonDictionary[@"mode"]; 31 | if ([mode isEqualToString:@"a"]) { 32 | _maskMode = LOTMaskModeAdd; 33 | } else if ([mode isEqualToString:@"s"]) { 34 | _maskMode = LOTMaskModeSubtract; 35 | } else if ([mode isEqualToString:@"i"]) { 36 | _maskMode = LOTMaskModeIntersect; 37 | } else { 38 | _maskMode = LOTMaskModeUnknown; 39 | } 40 | 41 | NSDictionary *maskshape = jsonDictionary[@"pt"]; 42 | if (maskshape) { 43 | _maskPath = [[LOTAnimatableShapeValue alloc] initWithShapeValues:maskshape frameRate:frameRate closed:_closed]; 44 | } 45 | 46 | NSDictionary *opacity = jsonDictionary[@"o"]; 47 | if (opacity) { 48 | _opacity = [[LOTAnimatableNumberValue alloc] initWithNumberValues:opacity frameRate:frameRate]; 49 | [_opacity remapValuesFromMin:@0 fromMax:@100 toMin:@0 toMax:@1]; 50 | } 51 | } 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTModels.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTModels.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #ifndef LOTModels_h 10 | #define LOTModels_h 11 | 12 | #import "CAAnimationGroup+LOTAnimatableGroup.h" 13 | #import "LOTAnimatableBoundsValue.h" 14 | #import "LOTAnimatableColorValue.h" 15 | #import "LOTAnimatableNumberValue.h" 16 | #import "LOTAnimatablePointValue.h" 17 | #import "LOTAnimatableScaleValue.h" 18 | #import "LOTAnimatableShapeValue.h" 19 | #import "LOTAnimatableValue.h" 20 | #import "LOTComposition.h" 21 | #import "LOTLayer.h" 22 | #import "LOTMask.h" 23 | #import "LOTShapeCircle.h" 24 | #import "LOTShapeFill.h" 25 | #import "LOTShapeGroup.h" 26 | #import "LOTShapePath.h" 27 | #import "LOTShapeRectangle.h" 28 | #import "LOTShapeStroke.h" 29 | #import "LOTShapeTransform.h" 30 | #import "LOTShapeTrimPath.h" 31 | #import "LOTLayerGroup.h" 32 | #import "LOTAsset.h" 33 | 34 | #endif /* LOTModels_h */ 35 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeCircle.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeCircle.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LOTAnimatablePointValue; 11 | @class LOTAnimatableScaleValue; 12 | 13 | @interface LOTShapeCircle : NSObject 14 | 15 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 16 | 17 | @property (nonatomic, readonly) LOTAnimatablePointValue *position; 18 | @property (nonatomic, readonly) LOTAnimatablePointValue *size; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeCircle.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeCircle.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTShapeCircle.h" 10 | #import "LOTAnimatablePointValue.h" 11 | #import "LOTAnimatableScaleValue.h" 12 | 13 | @implementation LOTShapeCircle 14 | 15 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 16 | self = [super init]; 17 | if (self) { 18 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 19 | } 20 | return self; 21 | } 22 | 23 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 24 | NSDictionary *position = jsonDictionary[@"p"]; 25 | if (position) { 26 | _position = [[LOTAnimatablePointValue alloc] initWithPointValues:position frameRate:frameRate]; 27 | _position.usePathAnimation = NO; 28 | } 29 | 30 | NSDictionary *size= jsonDictionary[@"s"]; 31 | if (size) { 32 | _size = [[LOTAnimatablePointValue alloc] initWithPointValues:size frameRate:frameRate]; 33 | _size.usePathAnimation = NO; 34 | } 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeFill.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeFill.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class LOTAnimatableColorValue; 12 | @class LOTAnimatableNumberValue; 13 | 14 | @interface LOTShapeFill : NSObject 15 | 16 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 17 | 18 | @property (nonatomic, readonly) BOOL fillEnabled; 19 | @property (nonatomic, readonly) LOTAnimatableColorValue *color; 20 | @property (nonatomic, readonly) LOTAnimatableNumberValue *opacity; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeFill.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeFill.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTShapeFill.h" 10 | #import "LOTAnimatableNumberValue.h" 11 | #import "LOTAnimatableColorValue.h" 12 | 13 | @implementation LOTShapeFill 14 | 15 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 16 | self = [super init]; 17 | if (self) { 18 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 19 | } 20 | return self; 21 | } 22 | 23 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 24 | NSDictionary *color = jsonDictionary[@"c"]; 25 | if (color) { 26 | _color = [[LOTAnimatableColorValue alloc] initWithColorValues:color frameRate:frameRate]; 27 | } 28 | 29 | NSDictionary *opacity = jsonDictionary[@"o"]; 30 | if (opacity) { 31 | _opacity = [[LOTAnimatableNumberValue alloc] initWithNumberValues:opacity frameRate:frameRate]; 32 | [_opacity remapValuesFromMin:@0 fromMax:@100 toMin:@0 toMax:@1]; 33 | } 34 | 35 | NSNumber *fillEnabled = jsonDictionary[@"fillEnabled"]; 36 | _fillEnabled = fillEnabled.boolValue; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeGroup.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShape.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface LOTShapeGroup : NSObject 13 | 14 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds; 15 | 16 | @property (nonatomic, readonly) NSArray *items; 17 | 18 | + (id)shapeItemWithJSON:(NSDictionary *)itemJSON frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapePath.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapePath.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class LOTAnimatableShapeValue; 12 | 13 | @interface LOTShapePath : NSObject 14 | 15 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 16 | 17 | @property (nonatomic, readonly) BOOL closed; 18 | @property (nonatomic, readonly) NSNumber *index; 19 | @property (nonatomic, readonly) LOTAnimatableShapeValue *shapePath; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapePath.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapePath.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTShapePath.h" 10 | #import "LOTAnimatableShapeValue.h" 11 | 12 | @implementation LOTShapePath 13 | 14 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 15 | self = [super init]; 16 | if (self) { 17 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 18 | } 19 | return self; 20 | } 21 | 22 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 23 | _index = jsonDictionary[@"ind"]; 24 | _closed = [jsonDictionary[@"closed"] boolValue]; 25 | NSDictionary *shape = jsonDictionary[@"ks"]; 26 | if (shape) { 27 | _shapePath = [[LOTAnimatableShapeValue alloc] initWithShapeValues:shape frameRate:frameRate closed:_closed]; 28 | } 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeRectangle.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeRectangle.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LOTAnimatableBoundsValue; 11 | @class LOTAnimatablePointValue; 12 | @class LOTAnimatableNumberValue; 13 | 14 | @interface LOTShapeRectangle : NSObject 15 | 16 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 17 | 18 | @property (nonatomic, readonly) LOTAnimatablePointValue *position; 19 | @property (nonatomic, readonly) LOTAnimatablePointValue *size; 20 | @property (nonatomic, readonly) LOTAnimatableNumberValue *cornerRadius; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeRectangle.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeRectangle.m 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTShapeRectangle.h" 10 | #import "LOTAnimatableBoundsValue.h" 11 | #import "LOTAnimatablePointValue.h" 12 | #import "LOTAnimatableNumberValue.h" 13 | 14 | @implementation LOTShapeRectangle 15 | 16 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 17 | self = [super init]; 18 | if (self) { 19 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 25 | NSDictionary *position = jsonDictionary[@"p"]; 26 | if (position) { 27 | _position = [[LOTAnimatablePointValue alloc] initWithPointValues:position frameRate:frameRate]; 28 | _position.usePathAnimation = NO; 29 | } 30 | 31 | NSDictionary *cornerRadius = jsonDictionary[@"r"]; 32 | if (cornerRadius) { 33 | _cornerRadius = [[LOTAnimatableNumberValue alloc] initWithNumberValues:cornerRadius frameRate:frameRate]; 34 | } 35 | 36 | NSDictionary *size = jsonDictionary[@"s"]; 37 | if (size) { 38 | _size = [[LOTAnimatablePointValue alloc] initWithPointValues:size frameRate:frameRate]; 39 | } 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeStroke.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeStroke.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class LOTAnimatableColorValue; 12 | @class LOTAnimatableNumberValue; 13 | 14 | typedef enum : NSUInteger { 15 | LOTLineCapTypeButt, 16 | LOTLineCapTypeRound, 17 | LOTLineCapTypeUnknown 18 | } LOTLineCapType; 19 | 20 | typedef enum : NSUInteger { 21 | LOTLineJoinTypeMiter, 22 | LOTLineJoinTypeRound, 23 | LOTLineJoinTypeBevel 24 | } LOTLineJoinType; 25 | 26 | @interface LOTShapeStroke : NSObject 27 | 28 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 29 | 30 | @property (nonatomic, readonly) BOOL fillEnabled; 31 | @property (nonatomic, readonly) LOTAnimatableColorValue *color; 32 | @property (nonatomic, readonly) LOTAnimatableNumberValue *opacity; 33 | @property (nonatomic, readonly) LOTAnimatableNumberValue *width; 34 | @property (nonatomic, readonly) LOTLineCapType capType; 35 | @property (nonatomic, readonly) LOTLineJoinType joinType; 36 | 37 | @property (nonatomic, readonly) NSArray *lineDashPattern; 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeTransform.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeTransform.h 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/15/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class LOTAnimatableNumberValue; 13 | @class LOTAnimatablePointValue; 14 | @class LOTAnimatableScaleValue; 15 | 16 | @interface LOTShapeTransform : NSObject 17 | 18 | + (instancetype)transformIdentityWithCompBounds:(CGRect)compBounds; 19 | 20 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds; 21 | 22 | @property (nonatomic, readonly) CGRect compBounds; 23 | @property (nonatomic, readonly) LOTAnimatablePointValue *position; 24 | @property (nonatomic, readonly) LOTAnimatablePointValue *anchor; 25 | @property (nonatomic, readonly) LOTAnimatableScaleValue *scale; 26 | @property (nonatomic, readonly) LOTAnimatableNumberValue *rotation; 27 | @property (nonatomic, readonly) LOTAnimatableNumberValue *opacity; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeTrimPath.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeTrimPath.h 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/26/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LOTAnimatableNumberValue; 11 | 12 | @interface LOTShapeTrimPath : NSObject 13 | 14 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate; 15 | 16 | @property (nonatomic, readonly) LOTAnimatableNumberValue *start; 17 | @property (nonatomic, readonly) LOTAnimatableNumberValue *end; 18 | @property (nonatomic, readonly) LOTAnimatableNumberValue *offset; 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Models/LOTShapeTrimPath.m: -------------------------------------------------------------------------------- 1 | // 2 | // LOTShapeTrimPath.m 3 | // LottieAnimator 4 | // 5 | // Created by brandon_withrow on 7/26/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTShapeTrimPath.h" 10 | #import "LOTAnimatableNumberValue.h" 11 | 12 | @implementation LOTShapeTrimPath 13 | 14 | - (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 15 | self = [super init]; 16 | if (self) { 17 | [self _mapFromJSON:jsonDictionary frameRate:frameRate]; 18 | } 19 | return self; 20 | } 21 | 22 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate { 23 | NSDictionary *start = jsonDictionary[@"s"]; 24 | if (start) { 25 | _start = [[LOTAnimatableNumberValue alloc] initWithNumberValues:start frameRate:frameRate]; 26 | [_start remapValuesFromMin:@0 fromMax:@100 toMin:@0 toMax:@1]; 27 | } 28 | 29 | NSDictionary *end = jsonDictionary[@"e"]; 30 | if (end) { 31 | _end = [[LOTAnimatableNumberValue alloc] initWithNumberValues:end frameRate:frameRate]; 32 | [_end remapValuesFromMin:@0 fromMax:@100 toMin:@0 toMax:@1]; 33 | } 34 | 35 | NSDictionary *offset = jsonDictionary[@"o"]; 36 | if (offset) { 37 | _offset = [[LOTAnimatableNumberValue alloc] initWithNumberValues:offset frameRate:frameRate]; 38 | } 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/Private/LOTAnimationView_Internal.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationView_Internal.h 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 12/7/16. 6 | // Copyright © 2016 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import "LOTAnimationView.h" 10 | 11 | typedef enum : NSUInteger { 12 | LOTConstraintTypeAlignToBounds, 13 | LOTConstraintTypeAlignToLayer, 14 | LOTConstraintTypeNone 15 | } LOTConstraintType; 16 | 17 | @interface LOTAnimationState : NSObject 18 | 19 | - (instancetype _Nonnull)initWithDuration:(CGFloat)duration layer:(CALayer * _Nullable)layer frameRate:(NSNumber * _Nullable)framerate; 20 | 21 | - (void)setAnimationIsPlaying:(BOOL)animationIsPlaying; 22 | - (void)setAnimationDoesLoop:(BOOL)loopAnimation; 23 | - (void)setAnimatedProgress:(CGFloat)progress; 24 | - (void)setAnimationSpeed:(CGFloat)speed; 25 | 26 | @property (nonatomic, readonly) BOOL loopAnimation; 27 | @property (nonatomic, readonly) BOOL animationIsPlaying; 28 | 29 | // Model Properties 30 | @property (nonatomic, readonly) CGFloat animatedProgress; 31 | @property (nonatomic, readonly) CGFloat animationDuration; 32 | @property (nonatomic, readonly) CGFloat animationSpeed; 33 | 34 | @property (nonatomic, readonly) CALayer * _Nullable layer; 35 | 36 | @end 37 | 38 | @interface LOTAnimationView () 39 | 40 | @property (nonatomic, readonly) LOTComposition * _Nonnull sceneModel; 41 | @property (nonatomic, strong) LOTAnimationState *_Nonnull animationState; 42 | @property (nonatomic, copy, nullable) LOTAnimationCompletionBlock completionBlock; 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/PublicHeaders/LOTAnimationTransitionController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationTransitionController.h 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 1/18/17. 6 | // Copyright © 2017 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 10 | 11 | #import 12 | #import 13 | 14 | /** LOTAnimationTransitionController 15 | * 16 | * This class creates a custom UIViewController transisiton animation 17 | * using a Lottie animation to transition between two view controllers 18 | * The transition can use custom defined layers in After Effects for to/from 19 | * 20 | * When referencing After Effects layers the animator masks the to/from viewController 21 | * with the referenced layer. 22 | * 23 | */ 24 | 25 | @interface LOTAnimationTransitionController : NSObject 26 | 27 | /** 28 | The initializer to create a new transition animation. 29 | 30 | @param animation The name of the Lottie Animation to load for the transition 31 | 32 | @param fromLayer The name of the custom layer to mask the fromVC screenshot with. 33 | If no layer is specified then the screenshot is added behind the Lottie Animation 34 | 35 | @param toLayer The name of the custom layer to mask the toVC screenshot with. 36 | If no layer is specified then the screenshot is added behind the Lottie Animation 37 | and a fade transition is performed along with the Lottie animation. 38 | 39 | */ 40 | - (instancetype)initWithAnimationNamed:(NSString *)animation 41 | fromLayerNamed:(NSString *)fromLayer 42 | toLayerNamed:(NSString *)toLayer; 43 | 44 | @end 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/PublicHeaders/LOTAnimationView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationView 3 | // LottieAnimator 4 | // 5 | // Created by Brandon Withrow on 12/14/15. 6 | // Copyright © 2015 Brandon Withrow. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LOTAnimationView_Compat.h" 11 | 12 | typedef void (^LOTAnimationCompletionBlock)(BOOL animationFinished); 13 | 14 | @interface LOTAnimationView : LOTView 15 | 16 | + (instancetype)animationNamed:(NSString *)animationName NS_SWIFT_NAME(init(name:)); 17 | + (instancetype)animationNamed:(NSString *)animationName inBundle:(NSBundle *)bundle NS_SWIFT_NAME(init(name:bundle:)); 18 | + (instancetype)animationFromJSON:(NSDictionary *)animationJSON NS_SWIFT_NAME(init(json:)); 19 | 20 | - (instancetype)initWithContentsOfURL:(NSURL *)url; 21 | 22 | @property (nonatomic, readonly) BOOL isAnimationPlaying; 23 | @property (nonatomic, assign) BOOL loopAnimation; 24 | @property (nonatomic, assign) CGFloat animationProgress; 25 | @property (nonatomic, assign) CGFloat animationSpeed; 26 | @property (nonatomic, readonly) CGFloat animationDuration; 27 | 28 | - (void)playWithCompletion:(LOTAnimationCompletionBlock)completion; 29 | - (void)play; 30 | - (void)pause; 31 | 32 | - (void)addSubview:(LOTView *)view 33 | toLayerNamed:(NSString *)layer; 34 | 35 | #if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 36 | @property (nonatomic) LOTViewContentMode contentMode; 37 | #endif 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/PublicHeaders/LOTAnimationView_Compat.h: -------------------------------------------------------------------------------- 1 | // 2 | // LOTAnimationView_Compat.h 3 | // Lottie 4 | // 5 | // Created by Oleksii Pavlovskyi on 2/2/17. 6 | // Copyright (c) 2017 Airbnb. All rights reserved. 7 | // 8 | 9 | #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 10 | 11 | #import 12 | @compatibility_alias LOTView UIView; 13 | 14 | #else 15 | 16 | #import 17 | @compatibility_alias LOTView NSView; 18 | 19 | typedef NS_ENUM(NSInteger, LOTViewContentMode) { 20 | LOTViewContentModeScaleToFill, 21 | LOTViewContentModeScaleAspectFit, 22 | LOTViewContentModeScaleAspectFill, 23 | LOTViewContentModeRedraw, 24 | LOTViewContentModeCenter, 25 | LOTViewContentModeTop, 26 | LOTViewContentModeBottom, 27 | LOTViewContentModeLeft, 28 | LOTViewContentModeRight, 29 | LOTViewContentModeTopLeft, 30 | LOTViewContentModeTopRight, 31 | LOTViewContentModeBottomLeft, 32 | LOTViewContentModeBottomRight, 33 | }; 34 | 35 | #endif 36 | 37 | -------------------------------------------------------------------------------- /ios/Pods/lottie-ios/lottie-ios/Classes/PublicHeaders/Lottie.h: -------------------------------------------------------------------------------- 1 | // 2 | // Lottie.h 3 | // Pods 4 | // 5 | // Created by brandon_withrow on 1/27/17. 6 | // 7 | // 8 | @import Foundation; 9 | #ifndef Lottie_h 10 | #define Lottie_h 11 | 12 | //! Project version number for Lottie. 13 | FOUNDATION_EXPORT double LottieVersionNumber; 14 | 15 | //! Project version string for Lottie. 16 | FOUNDATION_EXPORT const unsigned char LottieVersionString[]; 17 | 18 | #import "LOTAnimationTransitionController.h" 19 | #import "LOTAnimationView.h" 20 | 21 | #endif /* Lottie_h */ 22 | -------------------------------------------------------------------------------- /ios/ReactNativeChat.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | @import NativeNavigation; 13 | 14 | @interface AppDelegate : UIResponder 15 | 16 | @property (nonatomic, strong) UIWindow *window; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/GoogleAnalyticsBridge.h: -------------------------------------------------------------------------------- 1 | // 2 | // GoogleAnalyticsBridge.h 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/24/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | #import 9 | 10 | @interface GoogleAnalyticsBridge : NSObject 11 | @end 12 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/GoogleAnalyticsBridge.m: -------------------------------------------------------------------------------- 1 | // 2 | // GoogleAnalyticsBridge.m 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/24/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | #import "GoogleAnalyticsBridge.h" 9 | #import 10 | #import 11 | 12 | 13 | @implementation GoogleAnalyticsBridge { 14 | 15 | } 16 | 17 | RCT_EXPORT_MODULE(); 18 | 19 | RCT_EXPORT_METHOD(screenView:(NSString *)screenName) 20 | { 21 | id tracker = [[GAI sharedInstance] defaultTracker]; 22 | [tracker set:kGAIScreenName value:screenName]; 23 | [tracker send:[[GAIDictionaryBuilder createScreenView] build]]; 24 | } 25 | 26 | RCT_EXPORT_METHOD(trackEvent:(NSString *)category action:(NSString *)action optionalValues:(NSDictionary *)optionalValues) 27 | { 28 | id tracker = [[GAI sharedInstance] defaultTracker]; 29 | NSString *label = [RCTConvert NSString:optionalValues[@"label"]]; 30 | NSNumber *value = [RCTConvert NSNumber:optionalValues[@"value"]]; 31 | [tracker send:[[GAIDictionaryBuilder createEventWithCategory:category 32 | action:action 33 | label:label 34 | value:value] build]]; 35 | } 36 | 37 | RCT_EXPORT_METHOD(setUser:(NSString *)user) 38 | { 39 | id tracker = [[GAI sharedInstance] defaultTracker]; 40 | [tracker set:kGAIUserId value:user]; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /ios/ReactNativeChat/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIAppFonts 6 | 7 | MaterialIcons.ttf 8 | 9 | CFBundleDevelopmentRegion 10 | en 11 | CFBundleExecutable 12 | $(EXECUTABLE_NAME) 13 | CFBundleIdentifier 14 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | $(PRODUCT_NAME) 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1 27 | LSRequiresIPhoneOS 28 | 29 | UILaunchStoryboardName 30 | LaunchScreen 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UIViewControllerBasedStatusBarAppearance 42 | 43 | NSLocationWhenInUseUsageDescription 44 | 45 | NSAppTransportSecurity 46 | 47 | NSExceptionDomains 48 | 49 | localhost 50 | 51 | NSExceptionAllowsInsecureHTTPLoads 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/LottieContainerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LottieContainerView.h 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/25/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | #import 9 | #import 10 | 11 | @interface LottieContainerView : RCTView 12 | 13 | @property (nonatomic, strong) NSString *sourceName; 14 | 15 | - (void)play; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/LottieContainerView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LottieContainerView.m 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/25/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | // import RCTView.h 9 | #import "LottieContainerView.h" 10 | 11 | #import 12 | 13 | @implementation LottieContainerView { 14 | LOTAnimationView *_animationView; 15 | } 16 | 17 | - (void)reactSetFrame:(CGRect)frame 18 | { 19 | [super reactSetFrame:frame]; 20 | if (_animationView != nil) { 21 | _animationView.frame = CGRectMake(0, 0, frame.size.width, frame.size.height); 22 | } 23 | } 24 | 25 | - (void)setSourceName:(NSString *)name { 26 | LOTAnimationView *next = [LOTAnimationView animationNamed:name]; 27 | if (_animationView != nil) { 28 | [_animationView removeFromSuperview]; 29 | } 30 | 31 | _animationView = next; 32 | _animationView.bounds = self.bounds; 33 | _animationView.loopAnimation = YES; 34 | [self addSubview: next]; 35 | _animationView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 36 | [self play]; 37 | } 38 | 39 | - (void)play { 40 | if (_animationView != nil) { 41 | [_animationView play]; 42 | } 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/LottieLoaderViewManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // LottieLoaderViewManager.h 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/25/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | 9 | 10 | #import 11 | 12 | @interface LottieLoaderViewManager : RCTViewManager 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/LottieLoaderViewManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // LottieLoaderViewManager.m 3 | // ReactNativeChat 4 | // 5 | // Created by Leland Richardson on 4/25/17. 6 | // Copyright © 2017 Facebook. All rights reserved. 7 | // 8 | 9 | #import "LottieLoaderViewManager.h" 10 | 11 | #import 12 | #import 13 | #import 14 | #import 15 | #import "LottieContainerView.h" 16 | 17 | @implementation LottieLoaderViewManager { 18 | 19 | } 20 | 21 | RCT_EXPORT_MODULE(LottieLoader) 22 | 23 | - (UIView *)view 24 | { 25 | return [LottieContainerView new]; 26 | } 27 | 28 | RCT_EXPORT_VIEW_PROPERTY(sourceName, NSString); 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /ios/ReactNativeChat/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/react-native-flat-list/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./FlatList'); 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-chat", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "rmbabelrc": "(find node_modules -type f -name .babelrc | grep -v /react-native/ | xargs rm) || true", 7 | "podinstall": "cd ios; pod install; cd -;", 8 | "postinstall": "npm run --silent rmbabelrc", 9 | "start": "node node_modules/react-native/local-cli/cli.js start", 10 | "lint": "eslint --ignore-path=.eslintignore .", 11 | "test": "jest" 12 | }, 13 | "dependencies": { 14 | "apollo-client": "^1.0.2", 15 | "babel-eslint": "^7.1.1", 16 | "babel-plugin-module-resolver": "^2.3.0", 17 | "babel-preset-airbnb": "^2.2.3", 18 | "eslint": "^3.15.0", 19 | "eslint-config-airbnb": "^12.0.0", 20 | "eslint-import-resolver-babel-module": "^2.2.1", 21 | "eslint-plugin-flowtype": "^2.3.0", 22 | "eslint-plugin-import": "^1.16.0", 23 | "eslint-plugin-jsx-a11y": "^2.2.3", 24 | "eslint-plugin-prefer-object-spread": "^1.0.0", 25 | "eslint-plugin-react": "^6.4.1", 26 | "eslint-plugin-react-with-styles": "^1.0.0", 27 | "graphql": "^0.9.2", 28 | "graphql-tag": "^2.0.0", 29 | "immutable": "^3.8.1", 30 | "invariant": "^2.2.2", 31 | "md5": "^2.2.1", 32 | "native-navigation": "^0.2.1", 33 | "react": "15.4.2", 34 | "react-apollo": "^1.0.1", 35 | "react-native": "^0.42.0", 36 | "react-native-invertible-scroll-view": "^1.0.0", 37 | "react-native-keyboard-spacer": "^0.3.1", 38 | "react-native-safe-module": "^1.1.1", 39 | "react-native-vector-icons": "^4.0.1", 40 | "react-redux": "^5.0.4", 41 | "redux": "^3.6.0", 42 | "redux-logger": "^3.0.1", 43 | "redux-pack": "^0.1.5", 44 | "redux-thunk": "^2.2.0", 45 | "reselect": "^3.0.0", 46 | "subscriptions-transport-ws": "^0.5.5-alpha.0", 47 | "warning": "^3.0.0" 48 | }, 49 | "devDependencies": { 50 | "babel-jest": "19.0.0", 51 | "babel-preset-react-native": "1.9.1", 52 | "eslint-plugin-flowtype": "^2.30.4", 53 | "jest": "19.0.2", 54 | "react-test-renderer": "15.4.2" 55 | }, 56 | "jest": { 57 | "preset": "react-native" 58 | } 59 | } 60 | --------------------------------------------------------------------------------