├── .babelrc ├── .buckconfig ├── .eslintrc.js ├── .gitignore ├── .watchmanconfig ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── fonts │ │ │ ├── Entypo.ttf │ │ │ ├── EvilIcons.ttf │ │ │ ├── FontAwesome.ttf │ │ │ ├── Foundation.ttf │ │ │ ├── Ionicons.ttf │ │ │ ├── MaterialIcons.ttf │ │ │ ├── Octicons.ttf │ │ │ └── Zocial.ttf │ │ ├── java │ │ └── com │ │ │ └── awesomeproject │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.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 ├── api-db.js ├── api-routes.json ├── assets └── preview.gif ├── gps-samples ├── St_Louis_Zoo_sample.gpx ├── champs-elysees.gpx └── ndl-to-ndc.gpx ├── index.android.js ├── index.ios.js ├── ios ├── AwesomeProject.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── AwesomeProject.xcscheme ├── AwesomeProject │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── main.m └── AwesomeProjectTests │ ├── AwesomeProjectTests.m │ └── Info.plist ├── package.json ├── readme.md ├── src ├── actions │ ├── comments.js │ └── users.js ├── assets │ └── markers │ │ └── comment-map-icon.png ├── components │ ├── ActionButton.js │ ├── CommentForm.js │ ├── CommentItem.js │ ├── CommentsList.js │ ├── MapScreen.js │ └── TopBar.js ├── containers │ ├── AddCommentModal.js │ ├── AddReply.js │ ├── CommentPage.js │ ├── CommentsList.js │ ├── LoginForm.js │ ├── MapScreen.js │ ├── TabBar.js │ ├── TakePicture.js │ ├── UserProfile.js │ └── UsersSeen.js ├── index.js ├── reducers │ ├── comments.js │ ├── index.js │ ├── layout.js │ └── users.js └── utils │ ├── api.js │ ├── colors.js │ ├── constants.js │ └── server-configuration.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } 4 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "jest": true 7 | }, 8 | "parserOptions": { 9 | "ecmaFeatures": { 10 | "experimentalObjectRestSpread": true, 11 | "jsx": true 12 | }, 13 | "sourceType": "module" 14 | }, 15 | "plugins": [ 16 | "react", 17 | "react-native" 18 | ], 19 | "extends": ["eslint:recommended", "plugin:react/recommended", "airbnb", "react-native"], 20 | "parser": "babel-eslint", 21 | "rules": { 22 | "react/jsx-handler-names": 0, 23 | "react/require-extension": "off", // https://github.com/AtomLinter/linter-eslint/issues/579#issuecomment-239143599 24 | "react/no-unused-prop-types": [1, { skipShapeProps: true }], 25 | "import/no-namespace": 0, 26 | "react-native/no-inline-styles": 1, 27 | "react-native/no-unused-styles": 1, 28 | "react-native/no-color-literals": 1, 29 | "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], 30 | "class-methods-use-this": 0, 31 | "indent": [2, 2, {"SwitchCase": 1}], 32 | "linebreak-style": [ 33 | "error", 34 | "windows" 35 | ], 36 | "semi": [ 37 | "error", 38 | "always" 39 | ], 40 | "max-len": ["error", 80, 2], 41 | "no-use-before-define": 0, 42 | "jsx-quotes": 1, 43 | "no-unused-vars": 1, 44 | "import/extensions": 1, 45 | "import/no-extraneous-dependencies": 0, 46 | "import/no-unresolved": 0, 47 | "comma-dangle": 0, 48 | "no-underscore-dangle": ["error", { "allow": ["_id", "_rev"] }], 49 | "import/imports-first": 0, 50 | "react/prefer-stateless-function": 1, 51 | "react/sort-comp": [2, { 52 | order: [ 53 | 'render', 54 | 'static-methods', 55 | 'lifecycle', 56 | 'everything-else' 57 | ], 58 | groups: { 59 | lifecycle: [ 60 | 'displayName', 61 | 'propTypes', 62 | 'contextTypes', 63 | 'childContextTypes', 64 | 'mixins', 65 | 'statics', 66 | 'defaultProps', 67 | 'constructor', 68 | 'getDefaultProps', 69 | 'getInitialState', 70 | 'state', 71 | 'getChildContext', 72 | 'componentWillMount', 73 | 'componentDidMount', 74 | 'componentWillReceiveProps', 75 | 'shouldComponentUpdate', 76 | 'componentWillUpdate', 77 | 'componentDidUpdate', 78 | 'componentWillUnmount' 79 | ] 80 | } 81 | }] 82 | } 83 | }; 84 | -------------------------------------------------------------------------------- /.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/IJ 26 | # 27 | *.iml 28 | .idea 29 | .gradle 30 | local.properties 31 | 32 | # node.js 33 | # 34 | node_modules/ 35 | npm-debug.log 36 | 37 | # BUCK 38 | buck-out/ 39 | \.buckd/ 40 | android/app/libs 41 | android/keystores/debug.keystore 42 | 43 | # VSCode 44 | .vscode/** 45 | tsconfig.json 46 | typings/** 47 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /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.awesomeproject', 50 | ) 51 | 52 | android_resource( 53 | name = 'res', 54 | res = 'src/main/res', 55 | package = 'com.awesomeproject', 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/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // the root of your project, i.e. where "package.json" lives 37 | * root: "../../", 38 | * 39 | * // where to put the JS bundle asset in debug mode 40 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 41 | * 42 | * // where to put the JS bundle asset in release mode 43 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 44 | * 45 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 46 | * // require('./image.png')), in debug mode 47 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 48 | * 49 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 50 | * // require('./image.png')), in release mode 51 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 52 | * 53 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 54 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 55 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 56 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 57 | * // for example, you might want to remove it from here. 58 | * inputExcludes: ["android/**", "ios/**"], 59 | * 60 | * // override which node gets called and with what additional arguments 61 | * nodeExecutableAndArgs: ["node"] 62 | * 63 | * // supply additional arguments to the packager 64 | * extraPackagerArgs: [] 65 | * ] 66 | */ 67 | 68 | apply from: "../../node_modules/react-native/react.gradle" 69 | 70 | /** 71 | * Set this to true to create two separate APKs instead of one: 72 | * - An APK that only works on ARM devices 73 | * - An APK that only works on x86 devices 74 | * The advantage is the size of the APK is reduced by about 4MB. 75 | * Upload all the APKs to the Play Store and people will download 76 | * the correct one based on the CPU architecture of their device. 77 | */ 78 | def enableSeparateBuildPerCPUArchitecture = false 79 | 80 | /** 81 | * Run Proguard to shrink the Java bytecode in release builds. 82 | */ 83 | def enableProguardInReleaseBuilds = false 84 | 85 | android { 86 | compileSdkVersion 23 87 | buildToolsVersion "23.0.1" 88 | 89 | defaultConfig { 90 | applicationId "com.awesomeproject" 91 | minSdkVersion 16 92 | targetSdkVersion 22 93 | versionCode 1 94 | versionName "1.0" 95 | ndk { 96 | abiFilters "armeabi-v7a", "x86" 97 | } 98 | } 99 | splits { 100 | abi { 101 | reset() 102 | enable enableSeparateBuildPerCPUArchitecture 103 | universalApk false // If true, also generate a universal APK 104 | include "armeabi-v7a", "x86" 105 | } 106 | } 107 | buildTypes { 108 | release { 109 | minifyEnabled enableProguardInReleaseBuilds 110 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 111 | } 112 | } 113 | // applicationVariants are e.g. debug, release 114 | applicationVariants.all { variant -> 115 | variant.outputs.each { output -> 116 | // For each separate APK per architecture, set a unique version code as described here: 117 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 118 | def versionCodes = ["armeabi-v7a":1, "x86":2] 119 | def abi = output.getFilter(OutputFile.ABI) 120 | if (abi != null) { // null for the universal-debug, universal-release variants 121 | output.versionCodeOverride = 122 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 123 | } 124 | } 125 | } 126 | } 127 | 128 | dependencies { 129 | compile project(':react-native-vector-icons') 130 | compile fileTree(dir: "libs", include: ["*.jar"]) 131 | compile "com.android.support:appcompat-v7:23.0.1" 132 | compile "com.facebook.react:react-native:+" // From node_modules 133 | compile project(':react-native-maps') 134 | compile project(':react-native-camera') 135 | } 136 | 137 | // Run this once to be able to run the application with BUCK 138 | // puts all compile dependencies into folder libs for BUCK to use 139 | task copyDownloadableDepsToLibs(type: Copy) { 140 | from configurations.compile 141 | into 'libs' 142 | } 143 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Disabling obfuscation is useful if you collect stack traces from production crashes 20 | # (unless you are using a system that supports de-obfuscate the stack traces). 21 | -dontobfuscate 22 | 23 | # React Native 24 | 25 | # Keep our interfaces so they can be used by other ProGuard rules. 26 | # See http://sourceforge.net/p/proguard/bugs/466/ 27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip 28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters 29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip 30 | 31 | # Do not strip any method/class that is annotated with @DoNotStrip 32 | -keep @com.facebook.proguard.annotations.DoNotStrip class * 33 | -keep @com.facebook.common.internal.DoNotStrip class * 34 | -keepclassmembers class * { 35 | @com.facebook.proguard.annotations.DoNotStrip *; 36 | @com.facebook.common.internal.DoNotStrip *; 37 | } 38 | 39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { 40 | void set*(***); 41 | *** get*(); 42 | } 43 | 44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } 45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; } 46 | -keepclassmembers,includedescriptorclasses class * { native ; } 47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } 48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } 49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } 50 | 51 | -dontwarn com.facebook.react.** 52 | 53 | # okhttp 54 | 55 | -keepattributes Signature 56 | -keepattributes *Annotation* 57 | -keep class okhttp3.** { *; } 58 | -keep interface okhttp3.** { *; } 59 | -dontwarn okhttp3.** 60 | 61 | # okio 62 | 63 | -keep class sun.misc.Unsafe { *; } 64 | -dontwarn java.nio.file.* 65 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 66 | -dontwarn okio.** 67 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/java/com/awesomeproject/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.awesomeproject; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "AwesomeProject"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/awesomeproject/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.awesomeproject; 2 | 3 | import android.app.Application; 4 | import android.util.Log; 5 | 6 | import com.facebook.react.ReactApplication; 7 | import com.oblador.vectoricons.VectorIconsPackage; 8 | import com.airbnb.android.react.maps.MapsPackage; 9 | import com.oblador.vectoricons.VectorIconsPackage; 10 | import com.facebook.react.ReactInstanceManager; 11 | import com.facebook.react.ReactNativeHost; 12 | import com.facebook.react.ReactPackage; 13 | import com.facebook.react.shell.MainReactPackage; 14 | import com.lwansbrough.RCTCamera.RCTCameraPackage; 15 | 16 | import java.util.Arrays; 17 | import java.util.List; 18 | 19 | public class MainApplication extends Application implements ReactApplication { 20 | 21 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 22 | @Override 23 | protected boolean getUseDeveloperSupport() { 24 | return BuildConfig.DEBUG; 25 | } 26 | 27 | @Override 28 | protected List getPackages() { 29 | return Arrays.asList( 30 | new MainReactPackage(), 31 | new VectorIconsPackage(), 32 | new MapsPackage(), 33 | new RCTCameraPackage() 34 | ); 35 | } 36 | }; 37 | 38 | @Override 39 | public ReactNativeHost getReactNativeHost() { 40 | return mReactNativeHost; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | AwesomeProject 4 | 5 | -------------------------------------------------------------------------------- /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:1.3.1' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | mavenLocal() 18 | jcenter() 19 | maven { 20 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 21 | url "$rootDir/../node_modules/react-native/android" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /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/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/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.4-all.zip 6 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /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 = 'AwesomeProject' 2 | 3 | include ':app' 4 | include ':react-native-vector-icons' 5 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 6 | include ':react-native-maps' 7 | project(':react-native-maps').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-maps/android') 8 | include ':react-native-camera' 9 | project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android') 10 | -------------------------------------------------------------------------------- /api-db.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | // API docs: https://indigoapp.restlet.io/ 4 | 5 | const faker = require('faker'); 6 | const fs = require('fs'); 7 | 8 | // TODO: Improve performances in the app bcz if usersNb / commentsNb increase 9 | // it becomes a nightmare 10 | const usersNb = 50; 11 | const friendsNb = 30; 12 | const commentsNb = 30; 13 | const maxRepliesNb = 20; 14 | const chatroomsNb = 5; 15 | 16 | const generateUser = (id) => ({ 17 | id, 18 | firstName: faker.name.firstName(), 19 | lastName: faker.name.lastName(), 20 | avatar: faker.image.avatar(), 21 | description: faker.lorem.words() 22 | }) 23 | 24 | const usersBase = [...Array(usersNb)].map((e, id) => generateUser(id)); 25 | 26 | const users = usersBase.map((user, id) => 27 | Object.assign({}, user, { 28 | seen: [...Array(Math.floor(Math.random() * friendsNb))].map(() => 29 | usersBase[Math.floor(Math.random() * usersNb)] 30 | ) 31 | }) 32 | ); 33 | 34 | const comments = [...Array(commentsNb)].map((e, id) => { 35 | const author = users[Math.floor(Math.random() * usersNb)]; 36 | return ( 37 | { 38 | id, 39 | userId: Math.floor(Math.random() * usersNb), 40 | description: faker.lorem.sentences(), 41 | coordinate: { 42 | latitude: 48.8245 + (Math.random() - 0.5) * 0.01, 43 | longitude: 2.2798 + (Math.random() - 0.5) * 0.01, 44 | latitudeDelta: 0.005, 45 | longitudeDelta: 0.005 46 | }, 47 | liked: false 48 | } 49 | ); 50 | }); 51 | 52 | const replies = comments 53 | .map(comment => 54 | [...Array(Math.floor(Math.random() * maxRepliesNb)) + 3].map(() => { 55 | const replier = users[Math.floor(Math.random() * usersNb)]; 56 | return ({ 57 | id: faker.random.uuid(), 58 | user: replier, 59 | description: faker.lorem.sentences(), 60 | liked: false, 61 | 62 | commentId: comment.id 63 | }); 64 | }) 65 | ) 66 | .reduce((prev, next) => [...prev, ...next], []); 67 | 68 | const chatrooms = [...Array(chatroomsNb)].map(() => { 69 | const chatUsers = users.filter(() => faker.random.boolean()); 70 | return { 71 | id: faker.random.uuid(), 72 | name: faker.company.companyName(), 73 | description: faker.lorem.words(), 74 | users: chatUsers, 75 | color: faker.internet.color(), 76 | coordinate: { 77 | latitude: 48.8245 + (Math.random() - 0.5) * 0.01, 78 | longitude: 2.2798 + (Math.random() - 0.5) * 0.01, 79 | latitudeDelta: 0.005, 80 | longitudeDelta: 0.005 81 | } 82 | } 83 | }); 84 | 85 | // User management 86 | const userToken = { token: 'mKfeazoJjfezafoJfhezifuhJ' }; 87 | 88 | const checkUserToken = { status: 'OK' }; 89 | 90 | const getCurrentUser = { 91 | id: 'currentUserId', 92 | firstName: faker.name.firstName(), 93 | lastName: faker.name.lastName(), 94 | avatar: faker.image.avatar(), 95 | description: faker.lorem.words(), 96 | seen: [...Array(Math.floor(Math.random() * friendsNb))].map(() => 97 | usersBase[Math.floor(Math.random() * usersNb)] 98 | ) 99 | }; 100 | 101 | // TODO: Remove when create user form will be OK 102 | users.push(getCurrentUser); 103 | 104 | const currentUserPicture = { 105 | avatar: faker.image.avatar() 106 | }; 107 | 108 | const db = { 109 | users, 110 | comments, 111 | replies, 112 | chatrooms, 113 | userToken, 114 | checkUserToken, 115 | getCurrentUser, 116 | currentUserPicture 117 | }; 118 | 119 | module.exports = function() { 120 | return db; 121 | } 122 | 123 | // fs.writeFile("./db.json", JSON.stringify(db)); 124 | -------------------------------------------------------------------------------- /api-routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "/comments/:id/like": "/comments/:id?_expand=user", 3 | "/comments/:id": "/comments/:id?_embed=replies&_expand=user", 4 | "/uaa/users/current/seen": "/currentUserSeen", 5 | "/uaa/oauth/token": "/userToken", 6 | "/uaa/oauth/check_token": "/checkUserToken", 7 | "/uaa/users/current/picture": "/currentUserPicture", 8 | "/uaa/users/current": "/getCurrentUser", 9 | "/register": "/users" 10 | } 11 | -------------------------------------------------------------------------------- /assets/preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/assets/preview.gif -------------------------------------------------------------------------------- /gps-samples/St_Louis_Zoo_sample.gpx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | St Louis Zoo sample 6 | This self guided,GPS enabled tour of the world famous St. Louis Zoo, has 85 points of interest. Narratives in english,explaining each exhibit and provides guidance to zoo facilities.This audio tour guide can enhance your next visit. 7 | 8 | wizardone, using GeoTours 9 | 10 | St Louis Zoo sample 11 | 12 | 13 | 14 | St Louis Zoo sample 15 | 16 | 17 | Audio tour guide 18 | St.Louis Mo. 19 | Zoo 20 | Forest Park 21 | Animals 22 | 23 | 24 | 25 | 26 | Asian Elephant 27 | elephant 28 | 29 | Waypoint 30 | 31 | 32 | 15.24 33 | SymbolAndName 34 | 35 | 36 | 37 | 38 | 39 | Bactrian Camel 40 | camel 41 | 42 | Waypoint 43 | 44 | 45 | 15.24 46 | SymbolAndName 47 | 48 | 49 | 50 | 51 | 52 | Black Rhinoceros 53 | black rhino 54 | 55 | Waypoint 56 | 57 | 58 | 15.24 59 | SymbolAndName 60 | 61 | 62 | 63 | 64 | 65 | Cafe Restroom 66 | cafe restroom 67 | 68 | Waypoint 69 | 70 | 71 | 15.24 72 | SymbolAndName 73 | 74 | 75 | 76 | 77 | 78 | Polar Bear 79 | polar bear 80 | 81 | Waypoint 82 | 83 | 84 | 15.24 85 | SymbolAndName 86 | 87 | 88 | 89 | 90 | 91 | California Sea Lion 92 | sea lion 93 | 94 | Waypoint 95 | 96 | 97 | 15.24 98 | SymbolAndName 99 | 100 | 101 | 102 | 103 | 104 | Cheetah 105 | cheetah 106 | 107 | Waypoint 108 | 109 | 110 | 15.24 111 | SymbolAndName 112 | 113 | 114 | 115 | 116 | 117 | Grizzley Bear 118 | grizzly bear 119 | 120 | Waypoint 121 | 122 | 123 | 15.24 124 | SymbolAndName 125 | 126 | 127 | 128 | 129 | 130 | Jaguar 131 | jaguar 132 | 133 | Waypoint 134 | 135 | 136 | 15.24 137 | SymbolAndName 138 | 139 | 140 | 141 | 142 | 143 | Lion 144 | African lions live in a number of different habitats: grassy plains, open woodlands, semi-desert areas, even high mountains. 145 | 146 | Waypoint 147 | 148 | 149 | 15.24 150 | SymbolAndName 151 | 152 | 153 | 154 | 155 | -------------------------------------------------------------------------------- /gps-samples/champs-elysees.gpx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | champs-elysees 16 | 1 17 | 18 | 0 19 | 20 | pt1 21 | 22 | 23 | 0 24 | 25 | pt2 26 | 27 | 28 | 0 29 | 30 | pt3 31 | 32 | 33 | 0 34 | 35 | pt4 36 | 37 | 38 | 0 39 | 40 | pt5 41 | 42 | 43 | 0 44 | 45 | pt6 46 | 47 | 48 | 0 49 | 50 | pt7 51 | 52 | 53 | 0 54 | 55 | pt8 56 | 57 | 58 | 0 59 | 60 | pt9 61 | 62 | 63 | 0 64 | 65 | pt10 66 | 67 | 68 | 0 69 | 70 | pt11 71 | 72 | 73 | 0 74 | 75 | pt12 76 | 77 | 78 | 0 79 | 80 | pt13 81 | 82 | 83 | 0 84 | 85 | pt14 86 | 87 | 88 | 0 89 | 90 | pt15 91 | 92 | 93 | 0 94 | 95 | pt16 96 | 97 | 98 | 0 99 | 100 | pt17 101 | 102 | 103 | 0 104 | 105 | pt18 106 | 107 | 108 | 0 109 | 110 | pt19 111 | 112 | 113 | 0 114 | 115 | pt20 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /gps-samples/ndl-to-ndc.gpx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ndl-to-ndc 16 | 1 17 | 18 | 0 19 | 20 | pt0 21 | 22 | 23 | 0 24 | 25 | pt1 26 | 27 | 28 | 0 29 | 30 | pt2 31 | 32 | 33 | 0 34 | 35 | pt3 36 | 37 | 38 | 0 39 | 40 | pt4 41 | 42 | 43 | 0 44 | 45 | pt5 46 | 47 | 48 | 0 49 | 50 | pt6 51 | 52 | 53 | 0 54 | 55 | pt7 56 | 57 | 58 | 0 59 | 60 | pt8 61 | 62 | 63 | 0 64 | 65 | pt9 66 | 67 | 68 | 0 69 | 70 | pt10 71 | 72 | 73 | 0 74 | 75 | pt11 76 | 77 | 78 | 0 79 | 80 | pt12 81 | 82 | 83 | 0 84 | 85 | pt13 86 | 87 | 88 | 0 89 | 90 | pt14 91 | 92 | 93 | 0 94 | 95 | pt15 96 | 97 | 98 | 0 99 | 100 | pt16 101 | 102 | 103 | 0 104 | 105 | pt17 106 | 107 | 108 | 0 109 | 110 | pt18 111 | 112 | 113 | 0 114 | 115 | pt19 116 | 117 | 118 | 0 119 | 120 | pt20 121 | 122 | 123 | 0 124 | 125 | pt21 126 | 127 | 128 | 0 129 | 130 | pt22 131 | 132 | 133 | 0 134 | 135 | pt23 136 | 137 | 138 | 0 139 | 140 | pt24 141 | 142 | 143 | 0 144 | 145 | pt25 146 | 147 | 148 | 0 149 | 150 | pt26 151 | 152 | 153 | 0 154 | 155 | pt27 156 | 157 | 158 | 0 159 | 160 | pt28 161 | 162 | 163 | 0 164 | 165 | pt29 166 | 167 | 168 | 0 169 | 170 | pt30 171 | 172 | 173 | 0 174 | 175 | pt31 176 | 177 | 178 | 0 179 | 180 | pt32 181 | 182 | 183 | 0 184 | 185 | pt33 186 | 187 | 188 | 0 189 | 190 | pt34 191 | 192 | 193 | 0 194 | 195 | pt35 196 | 197 | 198 | 0 199 | 200 | pt36 201 | 202 | 203 | 0 204 | 205 | pt37 206 | 207 | 208 | 0 209 | 210 | pt38 211 | 212 | 213 | 0 214 | 215 | pt39 216 | 217 | 218 | 0 219 | 220 | pt40 221 | 222 | 223 | 0 224 | 225 | pt41 226 | 227 | 228 | 0 229 | 230 | pt42 231 | 232 | 233 | 0 234 | 235 | pt43 236 | 237 | 238 | 0 239 | 240 | pt44 241 | 242 | 243 | 0 244 | 245 | pt45 246 | 247 | 248 | 0 249 | 250 | pt46 251 | 252 | 253 | 0 254 | 255 | pt47 256 | 257 | 258 | 0 259 | 260 | pt48 261 | 262 | 263 | 0 264 | 265 | pt49 266 | 267 | 268 | 0 269 | 270 | pt50 271 | 272 | 273 | 0 274 | 275 | pt51 276 | 277 | 278 | 0 279 | 280 | pt52 281 | 282 | 283 | 0 284 | 285 | pt53 286 | 287 | 288 | 0 289 | 290 | pt54 291 | 292 | 293 | 0 294 | 295 | pt55 296 | 297 | 298 | 0 299 | 300 | pt56 301 | 302 | 303 | 0 304 | 305 | pt57 306 | 307 | 308 | 0 309 | 310 | pt58 311 | 312 | 313 | 0 314 | 315 | pt59 316 | 317 | 318 | 0 319 | 320 | pt60 321 | 322 | 323 | 0 324 | 325 | pt61 326 | 327 | 328 | 0 329 | 330 | pt62 331 | 332 | 333 | 0 334 | 335 | pt63 336 | 337 | 338 | 0 339 | 340 | pt64 341 | 342 | 343 | 0 344 | 345 | pt65 346 | 347 | 348 | 0 349 | 350 | pt66 351 | 352 | 353 | 0 354 | 355 | pt67 356 | 357 | 358 | 0 359 | 360 | pt68 361 | 362 | 363 | 0 364 | 365 | pt69 366 | 367 | 368 | 0 369 | 370 | pt70 371 | 372 | 373 | 0 374 | 375 | pt71 376 | 377 | 378 | 0 379 | 380 | pt72 381 | 382 | 383 | 0 384 | 385 | pt73 386 | 387 | 388 | 0 389 | 390 | pt74 391 | 392 | 393 | 0 394 | 395 | pt75 396 | 397 | 398 | 0 399 | 400 | pt76 401 | 402 | 403 | 0 404 | 405 | pt77 406 | 407 | 408 | 0 409 | 410 | pt78 411 | 412 | 413 | 0 414 | 415 | pt79 416 | 417 | 418 | 0 419 | 420 | pt80 421 | 422 | 423 | 0 424 | 425 | pt81 426 | 427 | 428 | 0 429 | 430 | pt82 431 | 432 | 433 | 0 434 | 435 | pt83 436 | 437 | 438 | 0 439 | 440 | pt84 441 | 442 | 443 | 0 444 | 445 | pt85 446 | 447 | 448 | 0 449 | 450 | pt86 451 | 452 | 453 | 0 454 | 455 | pt87 456 | 457 | 458 | 0 459 | 460 | pt88 461 | 462 | 463 | 0 464 | 465 | pt89 466 | 467 | 468 | 0 469 | 470 | pt90 471 | 472 | 473 | 0 474 | 475 | pt91 476 | 477 | 478 | 0 479 | 480 | pt92 481 | 482 | 483 | 0 484 | 485 | pt93 486 | 487 | 488 | 0 489 | 490 | pt94 491 | 492 | 493 | 0 494 | 495 | pt95 496 | 497 | 498 | 0 499 | 500 | pt96 501 | 502 | 503 | 0 504 | 505 | pt97 506 | 507 | 508 | 0 509 | 510 | pt98 511 | 512 | 513 | 0 514 | 515 | pt99 516 | 517 | 518 | 0 519 | 520 | pt100 521 | 522 | 523 | 524 | -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * @flow 5 | */ 6 | 7 | import Root from './src'; 8 | import { 9 | AppRegistry 10 | } from 'react-native'; 11 | 12 | AppRegistry.registerComponent('AwesomeProject', () => Root); 13 | -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * @flow 5 | */ 6 | 7 | import React, { Component } from 'react'; 8 | import { 9 | AppRegistry, 10 | StyleSheet, 11 | Text, 12 | View 13 | } from 'react-native'; 14 | 15 | class AwesomeProject extends Component { 16 | render() { 17 | return ( 18 | 19 | 20 | Welcome to React Native! 21 | 22 | 23 | To get started, edit index.ios.js 24 | 25 | 26 | Press Cmd+R to reload,{'\n'} 27 | Cmd+D or shake for dev menu 28 | 29 | 30 | ); 31 | } 32 | } 33 | 34 | const styles = StyleSheet.create({ 35 | container: { 36 | flex: 1, 37 | justifyContent: 'center', 38 | alignItems: 'center', 39 | backgroundColor: '#F5FCFF', 40 | }, 41 | welcome: { 42 | fontSize: 20, 43 | textAlign: 'center', 44 | margin: 10, 45 | }, 46 | instructions: { 47 | textAlign: 'center', 48 | color: '#333333', 49 | marginBottom: 5, 50 | }, 51 | }); 52 | 53 | AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject); 54 | -------------------------------------------------------------------------------- /ios/AwesomeProject.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | /* Begin PBXBuildFile section */ 9 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 10 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 11 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 12 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 13 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 14 | 00E356F31AD99517003FC87E /* AwesomeProjectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */; }; 15 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 16 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 17 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 18 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 19 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 20 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 21 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 22 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 23 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 24 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 25 | 7147968A15F4474FA5899172 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B01A3E6AF84543BAB0318F9B /* libRNVectorIcons.a */; }; 26 | 59774DE3470A44B0A49A3773 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F9DD917799884DA8A47B4425 /* Entypo.ttf */; }; 27 | 3C83CF79CA9C4EC6B0FD74FE /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 96AEF1BDA9D745D9A404E910 /* EvilIcons.ttf */; }; 28 | A66558DEF807434D80F2445D /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 404548CEA5514B2AB062BB51 /* FontAwesome.ttf */; }; 29 | A4B84D207A2E4A6C81C630CF /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0CBC2C248BCC463E964F5A30 /* Foundation.ttf */; }; 30 | 1DBD91B43B3B48D1BDF2619A /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8FB303DA3C414A4790DA168B /* Ionicons.ttf */; }; 31 | F581D5BC35F74B4194DCEFA3 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D0A9A978AD943C099141BDC /* MaterialIcons.ttf */; }; 32 | 821CFB59CFCE4C6C91EE4EDC /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7532FB0E90EB4058ADFF85BD /* Octicons.ttf */; }; 33 | 1FEB7D7EF63C4549A5FD2859 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BCD83CA1077A48F293E7C6B7 /* Zocial.ttf */; }; 34 | 46F31A69C4684E459B5A4821 /* libAirMaps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E40C5D0E6B44D1E817E91D4 /* libAirMaps.a */; }; 35 | /* End PBXBuildFile section */ 36 | 37 | /* Begin PBXContainerItemProxy section */ 38 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 41 | proxyType = 2; 42 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 43 | remoteInfo = RCTActionSheet; 44 | }; 45 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 46 | isa = PBXContainerItemProxy; 47 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 48 | proxyType = 2; 49 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 50 | remoteInfo = RCTGeolocation; 51 | }; 52 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 53 | isa = PBXContainerItemProxy; 54 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 55 | proxyType = 2; 56 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 57 | remoteInfo = RCTImage; 58 | }; 59 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 60 | isa = PBXContainerItemProxy; 61 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 62 | proxyType = 2; 63 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 64 | remoteInfo = RCTNetwork; 65 | }; 66 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 67 | isa = PBXContainerItemProxy; 68 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 69 | proxyType = 2; 70 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 71 | remoteInfo = RCTVibration; 72 | }; 73 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 74 | isa = PBXContainerItemProxy; 75 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 76 | proxyType = 1; 77 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 78 | remoteInfo = AwesomeProject; 79 | }; 80 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 81 | isa = PBXContainerItemProxy; 82 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 83 | proxyType = 2; 84 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 85 | remoteInfo = RCTSettings; 86 | }; 87 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 88 | isa = PBXContainerItemProxy; 89 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 90 | proxyType = 2; 91 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 92 | remoteInfo = RCTWebSocket; 93 | }; 94 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 95 | isa = PBXContainerItemProxy; 96 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 97 | proxyType = 2; 98 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 99 | remoteInfo = React; 100 | }; 101 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 102 | isa = PBXContainerItemProxy; 103 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 104 | proxyType = 2; 105 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 106 | remoteInfo = RCTLinking; 107 | }; 108 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 109 | isa = PBXContainerItemProxy; 110 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 111 | proxyType = 2; 112 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 113 | remoteInfo = RCTText; 114 | }; 115 | /* End PBXContainerItemProxy section */ 116 | 117 | /* Begin PBXFileReference section */ 118 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = main.jsbundle; path = main.jsbundle; sourceTree = ""; }; 119 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = ""; }; 120 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = ../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj; sourceTree = ""; }; 121 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = ../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj; sourceTree = ""; }; 122 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = ../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj; sourceTree = ""; }; 123 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = ""; }; 124 | 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AwesomeProjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 125 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 126 | 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AwesomeProjectTests.m; sourceTree = ""; }; 127 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = ../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj; sourceTree = ""; }; 128 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = ../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj; sourceTree = ""; }; 129 | 13B07F961A680F5B00A75B9A /* AwesomeProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AwesomeProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = AwesomeProject/AppDelegate.h; sourceTree = ""; }; 131 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = AwesomeProject/AppDelegate.m; sourceTree = ""; }; 132 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 133 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AwesomeProject/Images.xcassets; sourceTree = ""; }; 134 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = AwesomeProject/Info.plist; sourceTree = ""; }; 135 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = AwesomeProject/main.m; sourceTree = ""; }; 136 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = ../node_modules/react-native/React/React.xcodeproj; sourceTree = ""; }; 137 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = ../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj; sourceTree = ""; }; 138 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = ../node_modules/react-native/Libraries/Text/RCTText.xcodeproj; sourceTree = ""; }; 139 | 59A2D550BF3F43F1911B355D /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; name = "RNVectorIcons.xcodeproj"; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; 140 | B01A3E6AF84543BAB0318F9B /* libRNVectorIcons.a */ = {isa = PBXFileReference; name = "libRNVectorIcons.a"; path = "libRNVectorIcons.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; 141 | F9DD917799884DA8A47B4425 /* Entypo.ttf */ = {isa = PBXFileReference; name = "Entypo.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 142 | 96AEF1BDA9D745D9A404E910 /* EvilIcons.ttf */ = {isa = PBXFileReference; name = "EvilIcons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 143 | 404548CEA5514B2AB062BB51 /* FontAwesome.ttf */ = {isa = PBXFileReference; name = "FontAwesome.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 144 | 0CBC2C248BCC463E964F5A30 /* Foundation.ttf */ = {isa = PBXFileReference; name = "Foundation.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 145 | 8FB303DA3C414A4790DA168B /* Ionicons.ttf */ = {isa = PBXFileReference; name = "Ionicons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 146 | 5D0A9A978AD943C099141BDC /* MaterialIcons.ttf */ = {isa = PBXFileReference; name = "MaterialIcons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 147 | 7532FB0E90EB4058ADFF85BD /* Octicons.ttf */ = {isa = PBXFileReference; name = "Octicons.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 148 | BCD83CA1077A48F293E7C6B7 /* Zocial.ttf */ = {isa = PBXFileReference; name = "Zocial.ttf"; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; 149 | 3786D7D832BA4A71B85E31DA /* AirMaps.xcodeproj */ = {isa = PBXFileReference; name = "AirMaps.xcodeproj"; path = "../node_modules/react-native-maps/ios/AirMaps.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; 150 | 1E40C5D0E6B44D1E817E91D4 /* libAirMaps.a */ = {isa = PBXFileReference; name = "libAirMaps.a"; path = "libAirMaps.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; 151 | /* End PBXFileReference section */ 152 | 153 | /* Begin PBXFrameworksBuildPhase section */ 154 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 155 | isa = PBXFrameworksBuildPhase; 156 | buildActionMask = 2147483647; 157 | files = ( 158 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 159 | ); 160 | runOnlyForDeploymentPostprocessing = 0; 161 | }; 162 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 163 | isa = PBXFrameworksBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 167 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 168 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 169 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 170 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 171 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 172 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 173 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 174 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 175 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 176 | 7147968A15F4474FA5899172 /* libRNVectorIcons.a in Frameworks */, 177 | 46F31A69C4684E459B5A4821 /* libAirMaps.a in Frameworks */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | /* End PBXFrameworksBuildPhase section */ 182 | 183 | /* Begin PBXGroup section */ 184 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 188 | ); 189 | name = Products; 190 | sourceTree = ""; 191 | }; 192 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 193 | isa = PBXGroup; 194 | children = ( 195 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 196 | ); 197 | name = Products; 198 | sourceTree = ""; 199 | }; 200 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 204 | ); 205 | name = Products; 206 | sourceTree = ""; 207 | }; 208 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 212 | ); 213 | name = Products; 214 | sourceTree = ""; 215 | }; 216 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 217 | isa = PBXGroup; 218 | children = ( 219 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 220 | ); 221 | name = Products; 222 | sourceTree = ""; 223 | }; 224 | 00E356EF1AD99517003FC87E /* AwesomeProjectTests */ = { 225 | isa = PBXGroup; 226 | children = ( 227 | 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */, 228 | 00E356F01AD99517003FC87E /* Supporting Files */, 229 | ); 230 | path = AwesomeProjectTests; 231 | sourceTree = ""; 232 | }; 233 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | 00E356F11AD99517003FC87E /* Info.plist */, 237 | ); 238 | name = "Supporting Files"; 239 | sourceTree = ""; 240 | }; 241 | 139105B71AF99BAD00B5F7CC /* Products */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 245 | ); 246 | name = Products; 247 | sourceTree = ""; 248 | }; 249 | 139FDEE71B06529A00C62182 /* Products */ = { 250 | isa = PBXGroup; 251 | children = ( 252 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 253 | ); 254 | name = Products; 255 | sourceTree = ""; 256 | }; 257 | 13B07FAE1A68108700A75B9A /* AwesomeProject */ = { 258 | isa = PBXGroup; 259 | children = ( 260 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 261 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 262 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 263 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 264 | 13B07FB61A68108700A75B9A /* Info.plist */, 265 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 266 | 13B07FB71A68108700A75B9A /* main.m */, 267 | ); 268 | name = AwesomeProject; 269 | sourceTree = ""; 270 | }; 271 | 146834001AC3E56700842450 /* Products */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | 146834041AC3E56700842450 /* libReact.a */, 275 | ); 276 | name = Products; 277 | sourceTree = ""; 278 | }; 279 | 78C398B11ACF4ADC00677621 /* Products */ = { 280 | isa = PBXGroup; 281 | children = ( 282 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 283 | ); 284 | name = Products; 285 | sourceTree = ""; 286 | }; 287 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 288 | isa = PBXGroup; 289 | children = ( 290 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 291 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 292 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 293 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 294 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 295 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 296 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 297 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 298 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 299 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 300 | 59A2D550BF3F43F1911B355D /* RNVectorIcons.xcodeproj */, 301 | 3786D7D832BA4A71B85E31DA /* AirMaps.xcodeproj */, 302 | ); 303 | name = Libraries; 304 | sourceTree = ""; 305 | }; 306 | 832341B11AAA6A8300B99B32 /* Products */ = { 307 | isa = PBXGroup; 308 | children = ( 309 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 310 | ); 311 | name = Products; 312 | sourceTree = ""; 313 | }; 314 | 83CBB9F61A601CBA00E9B192 = { 315 | isa = PBXGroup; 316 | children = ( 317 | 13B07FAE1A68108700A75B9A /* AwesomeProject */, 318 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 319 | 00E356EF1AD99517003FC87E /* AwesomeProjectTests */, 320 | 83CBBA001A601CBA00E9B192 /* Products */, 321 | 862A2C02B4644409A0EFCC15 /* Resources */, 322 | ); 323 | indentWidth = 2; 324 | sourceTree = ""; 325 | tabWidth = 2; 326 | }; 327 | 83CBBA001A601CBA00E9B192 /* Products */ = { 328 | isa = PBXGroup; 329 | children = ( 330 | 13B07F961A680F5B00A75B9A /* AwesomeProject.app */, 331 | 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */, 332 | ); 333 | name = Products; 334 | sourceTree = ""; 335 | }; 336 | 862A2C02B4644409A0EFCC15 /* Resources */ = { 337 | isa = PBXGroup; 338 | children = ( 339 | F9DD917799884DA8A47B4425 /* Entypo.ttf */, 340 | 96AEF1BDA9D745D9A404E910 /* EvilIcons.ttf */, 341 | 404548CEA5514B2AB062BB51 /* FontAwesome.ttf */, 342 | 0CBC2C248BCC463E964F5A30 /* Foundation.ttf */, 343 | 8FB303DA3C414A4790DA168B /* Ionicons.ttf */, 344 | 5D0A9A978AD943C099141BDC /* MaterialIcons.ttf */, 345 | 7532FB0E90EB4058ADFF85BD /* Octicons.ttf */, 346 | BCD83CA1077A48F293E7C6B7 /* Zocial.ttf */, 347 | ); 348 | name = Resources; 349 | path = ""; 350 | sourceTree = ""; 351 | }; 352 | /* End PBXGroup section */ 353 | 354 | /* Begin PBXNativeTarget section */ 355 | 00E356ED1AD99517003FC87E /* AwesomeProjectTests */ = { 356 | isa = PBXNativeTarget; 357 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AwesomeProjectTests" */; 358 | buildPhases = ( 359 | 00E356EA1AD99517003FC87E /* Sources */, 360 | 00E356EB1AD99517003FC87E /* Frameworks */, 361 | 00E356EC1AD99517003FC87E /* Resources */, 362 | ); 363 | buildRules = ( 364 | ); 365 | dependencies = ( 366 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 367 | ); 368 | name = AwesomeProjectTests; 369 | productName = AwesomeProjectTests; 370 | productReference = 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */; 371 | productType = "com.apple.product-type.bundle.unit-test"; 372 | }; 373 | 13B07F861A680F5B00A75B9A /* AwesomeProject */ = { 374 | isa = PBXNativeTarget; 375 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AwesomeProject" */; 376 | buildPhases = ( 377 | 13B07F871A680F5B00A75B9A /* Sources */, 378 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 379 | 13B07F8E1A680F5B00A75B9A /* Resources */, 380 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 381 | ); 382 | buildRules = ( 383 | ); 384 | dependencies = ( 385 | ); 386 | name = AwesomeProject; 387 | productName = "Hello World"; 388 | productReference = 13B07F961A680F5B00A75B9A /* AwesomeProject.app */; 389 | productType = "com.apple.product-type.application"; 390 | }; 391 | /* End PBXNativeTarget section */ 392 | 393 | /* Begin PBXProject section */ 394 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 395 | isa = PBXProject; 396 | attributes = { 397 | LastUpgradeCheck = 610; 398 | ORGANIZATIONNAME = Facebook; 399 | TargetAttributes = { 400 | 00E356ED1AD99517003FC87E = { 401 | CreatedOnToolsVersion = 6.2; 402 | TestTargetID = 13B07F861A680F5B00A75B9A; 403 | }; 404 | }; 405 | }; 406 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AwesomeProject" */; 407 | compatibilityVersion = "Xcode 3.2"; 408 | developmentRegion = English; 409 | hasScannedForEncodings = 0; 410 | knownRegions = ( 411 | en, 412 | Base, 413 | ); 414 | mainGroup = 83CBB9F61A601CBA00E9B192; 415 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 416 | projectDirPath = ""; 417 | projectReferences = ( 418 | { 419 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 420 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 421 | }, 422 | { 423 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 424 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 425 | }, 426 | { 427 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 428 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 429 | }, 430 | { 431 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 432 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 433 | }, 434 | { 435 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 436 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 437 | }, 438 | { 439 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 440 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 441 | }, 442 | { 443 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 444 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 445 | }, 446 | { 447 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 448 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 449 | }, 450 | { 451 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 452 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 453 | }, 454 | { 455 | ProductGroup = 146834001AC3E56700842450 /* Products */; 456 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 457 | }, 458 | ); 459 | projectRoot = ""; 460 | targets = ( 461 | 13B07F861A680F5B00A75B9A /* AwesomeProject */, 462 | 00E356ED1AD99517003FC87E /* AwesomeProjectTests */, 463 | ); 464 | }; 465 | /* End PBXProject section */ 466 | 467 | /* Begin PBXReferenceProxy section */ 468 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 469 | isa = PBXReferenceProxy; 470 | fileType = archive.ar; 471 | path = libRCTActionSheet.a; 472 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 473 | sourceTree = BUILT_PRODUCTS_DIR; 474 | }; 475 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 476 | isa = PBXReferenceProxy; 477 | fileType = archive.ar; 478 | path = libRCTGeolocation.a; 479 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 480 | sourceTree = BUILT_PRODUCTS_DIR; 481 | }; 482 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 483 | isa = PBXReferenceProxy; 484 | fileType = archive.ar; 485 | path = libRCTImage.a; 486 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 487 | sourceTree = BUILT_PRODUCTS_DIR; 488 | }; 489 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 490 | isa = PBXReferenceProxy; 491 | fileType = archive.ar; 492 | path = libRCTNetwork.a; 493 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 494 | sourceTree = BUILT_PRODUCTS_DIR; 495 | }; 496 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 497 | isa = PBXReferenceProxy; 498 | fileType = archive.ar; 499 | path = libRCTVibration.a; 500 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 501 | sourceTree = BUILT_PRODUCTS_DIR; 502 | }; 503 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 504 | isa = PBXReferenceProxy; 505 | fileType = archive.ar; 506 | path = libRCTSettings.a; 507 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 508 | sourceTree = BUILT_PRODUCTS_DIR; 509 | }; 510 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 511 | isa = PBXReferenceProxy; 512 | fileType = archive.ar; 513 | path = libRCTWebSocket.a; 514 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 515 | sourceTree = BUILT_PRODUCTS_DIR; 516 | }; 517 | 146834041AC3E56700842450 /* libReact.a */ = { 518 | isa = PBXReferenceProxy; 519 | fileType = archive.ar; 520 | path = libReact.a; 521 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 522 | sourceTree = BUILT_PRODUCTS_DIR; 523 | }; 524 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 525 | isa = PBXReferenceProxy; 526 | fileType = archive.ar; 527 | path = libRCTLinking.a; 528 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 529 | sourceTree = BUILT_PRODUCTS_DIR; 530 | }; 531 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 532 | isa = PBXReferenceProxy; 533 | fileType = archive.ar; 534 | path = libRCTText.a; 535 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 536 | sourceTree = BUILT_PRODUCTS_DIR; 537 | }; 538 | /* End PBXReferenceProxy section */ 539 | 540 | /* Begin PBXResourcesBuildPhase section */ 541 | 00E356EC1AD99517003FC87E /* Resources */ = { 542 | isa = PBXResourcesBuildPhase; 543 | buildActionMask = 2147483647; 544 | files = ( 545 | ); 546 | runOnlyForDeploymentPostprocessing = 0; 547 | }; 548 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 549 | isa = PBXResourcesBuildPhase; 550 | buildActionMask = 2147483647; 551 | files = ( 552 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 553 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 554 | 59774DE3470A44B0A49A3773 /* Entypo.ttf in Resources */, 555 | 3C83CF79CA9C4EC6B0FD74FE /* EvilIcons.ttf in Resources */, 556 | A66558DEF807434D80F2445D /* FontAwesome.ttf in Resources */, 557 | A4B84D207A2E4A6C81C630CF /* Foundation.ttf in Resources */, 558 | 1DBD91B43B3B48D1BDF2619A /* Ionicons.ttf in Resources */, 559 | F581D5BC35F74B4194DCEFA3 /* MaterialIcons.ttf in Resources */, 560 | 821CFB59CFCE4C6C91EE4EDC /* Octicons.ttf in Resources */, 561 | 1FEB7D7EF63C4549A5FD2859 /* Zocial.ttf in Resources */, 562 | ); 563 | runOnlyForDeploymentPostprocessing = 0; 564 | }; 565 | /* End PBXResourcesBuildPhase section */ 566 | 567 | /* Begin PBXShellScriptBuildPhase section */ 568 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 569 | isa = PBXShellScriptBuildPhase; 570 | buildActionMask = 2147483647; 571 | files = ( 572 | ); 573 | inputPaths = ( 574 | ); 575 | name = "Bundle React Native code and images"; 576 | outputPaths = ( 577 | ); 578 | runOnlyForDeploymentPostprocessing = 0; 579 | shellPath = /bin/sh; 580 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 581 | showEnvVarsInLog = 1; 582 | }; 583 | /* End PBXShellScriptBuildPhase section */ 584 | 585 | /* Begin PBXSourcesBuildPhase section */ 586 | 00E356EA1AD99517003FC87E /* Sources */ = { 587 | isa = PBXSourcesBuildPhase; 588 | buildActionMask = 2147483647; 589 | files = ( 590 | 00E356F31AD99517003FC87E /* AwesomeProjectTests.m in Sources */, 591 | ); 592 | runOnlyForDeploymentPostprocessing = 0; 593 | }; 594 | 13B07F871A680F5B00A75B9A /* Sources */ = { 595 | isa = PBXSourcesBuildPhase; 596 | buildActionMask = 2147483647; 597 | files = ( 598 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 599 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 600 | ); 601 | runOnlyForDeploymentPostprocessing = 0; 602 | }; 603 | /* End PBXSourcesBuildPhase section */ 604 | 605 | /* Begin PBXTargetDependency section */ 606 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 607 | isa = PBXTargetDependency; 608 | target = 13B07F861A680F5B00A75B9A /* AwesomeProject */; 609 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 610 | }; 611 | /* End PBXTargetDependency section */ 612 | 613 | /* Begin PBXVariantGroup section */ 614 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 615 | isa = PBXVariantGroup; 616 | children = ( 617 | 13B07FB21A68108700A75B9A /* Base */, 618 | ); 619 | name = LaunchScreen.xib; 620 | path = AwesomeProject; 621 | sourceTree = ""; 622 | }; 623 | /* End PBXVariantGroup section */ 624 | 625 | /* Begin XCBuildConfiguration section */ 626 | 00E356F61AD99517003FC87E /* Debug */ = { 627 | isa = XCBuildConfiguration; 628 | buildSettings = { 629 | BUNDLE_LOADER = "$(TEST_HOST)"; 630 | GCC_PREPROCESSOR_DEFINITIONS = ( 631 | "DEBUG=1", 632 | "$(inherited)", 633 | ); 634 | INFOPLIST_FILE = AwesomeProjectTests/Info.plist; 635 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 636 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 637 | PRODUCT_NAME = "$(TARGET_NAME)"; 638 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AwesomeProject.app/AwesomeProject"; 639 | LIBRARY_SEARCH_PATHS = ( 640 | "$(inherited)", 641 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 642 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 643 | ); 644 | }; 645 | name = Debug; 646 | }; 647 | 00E356F71AD99517003FC87E /* Release */ = { 648 | isa = XCBuildConfiguration; 649 | buildSettings = { 650 | BUNDLE_LOADER = "$(TEST_HOST)"; 651 | COPY_PHASE_STRIP = NO; 652 | INFOPLIST_FILE = AwesomeProjectTests/Info.plist; 653 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 654 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 655 | PRODUCT_NAME = "$(TARGET_NAME)"; 656 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AwesomeProject.app/AwesomeProject"; 657 | LIBRARY_SEARCH_PATHS = ( 658 | "$(inherited)", 659 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 660 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 661 | ); 662 | }; 663 | name = Release; 664 | }; 665 | 13B07F941A680F5B00A75B9A /* Debug */ = { 666 | isa = XCBuildConfiguration; 667 | buildSettings = { 668 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 669 | DEAD_CODE_STRIPPING = NO; 670 | HEADER_SEARCH_PATHS = ( 671 | "$(inherited)", 672 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 673 | "$(SRCROOT)/../node_modules/react-native/React/**", 674 | "$(SRCROOT)\..\node_modules\react-native-vector-icons\RNVectorIconsManager", 675 | "$(SRCROOT)\..\node_modules\react-native-maps\ios/**", 676 | ); 677 | INFOPLIST_FILE = "AwesomeProject/Info.plist"; 678 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 679 | OTHER_LDFLAGS = ( 680 | "$(inherited)", 681 | "-ObjC", 682 | "-lc++", 683 | ); 684 | PRODUCT_NAME = AwesomeProject; 685 | }; 686 | name = Debug; 687 | }; 688 | 13B07F951A680F5B00A75B9A /* Release */ = { 689 | isa = XCBuildConfiguration; 690 | buildSettings = { 691 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 692 | HEADER_SEARCH_PATHS = ( 693 | "$(inherited)", 694 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 695 | "$(SRCROOT)/../node_modules/react-native/React/**", 696 | "$(SRCROOT)\..\node_modules\react-native-vector-icons\RNVectorIconsManager", 697 | "$(SRCROOT)\..\node_modules\react-native-maps\ios/**", 698 | ); 699 | INFOPLIST_FILE = "AwesomeProject/Info.plist"; 700 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 701 | OTHER_LDFLAGS = ( 702 | "$(inherited)", 703 | "-ObjC", 704 | "-lc++", 705 | ); 706 | PRODUCT_NAME = AwesomeProject; 707 | }; 708 | name = Release; 709 | }; 710 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 711 | isa = XCBuildConfiguration; 712 | buildSettings = { 713 | ALWAYS_SEARCH_USER_PATHS = NO; 714 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 715 | CLANG_CXX_LIBRARY = "libc++"; 716 | CLANG_ENABLE_MODULES = YES; 717 | CLANG_ENABLE_OBJC_ARC = YES; 718 | CLANG_WARN_BOOL_CONVERSION = YES; 719 | CLANG_WARN_CONSTANT_CONVERSION = YES; 720 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 721 | CLANG_WARN_EMPTY_BODY = YES; 722 | CLANG_WARN_ENUM_CONVERSION = YES; 723 | CLANG_WARN_INT_CONVERSION = YES; 724 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 725 | CLANG_WARN_UNREACHABLE_CODE = YES; 726 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 727 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 728 | COPY_PHASE_STRIP = NO; 729 | ENABLE_STRICT_OBJC_MSGSEND = YES; 730 | GCC_C_LANGUAGE_STANDARD = gnu99; 731 | GCC_DYNAMIC_NO_PIC = NO; 732 | GCC_OPTIMIZATION_LEVEL = 0; 733 | GCC_PREPROCESSOR_DEFINITIONS = ( 734 | "DEBUG=1", 735 | "$(inherited)", 736 | ); 737 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 738 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 739 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 740 | GCC_WARN_UNDECLARED_SELECTOR = YES; 741 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 742 | GCC_WARN_UNUSED_FUNCTION = YES; 743 | GCC_WARN_UNUSED_VARIABLE = YES; 744 | HEADER_SEARCH_PATHS = ( 745 | "$(inherited)", 746 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 747 | "$(SRCROOT)/../node_modules/react-native/React/**", 748 | "$(SRCROOT)\..\node_modules\react-native-vector-icons\RNVectorIconsManager", 749 | "$(SRCROOT)\..\node_modules\react-native-maps\ios/**", 750 | ); 751 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 752 | MTL_ENABLE_DEBUG_INFO = YES; 753 | ONLY_ACTIVE_ARCH = YES; 754 | SDKROOT = iphoneos; 755 | }; 756 | name = Debug; 757 | }; 758 | 83CBBA211A601CBA00E9B192 /* Release */ = { 759 | isa = XCBuildConfiguration; 760 | buildSettings = { 761 | ALWAYS_SEARCH_USER_PATHS = NO; 762 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 763 | CLANG_CXX_LIBRARY = "libc++"; 764 | CLANG_ENABLE_MODULES = YES; 765 | CLANG_ENABLE_OBJC_ARC = YES; 766 | CLANG_WARN_BOOL_CONVERSION = YES; 767 | CLANG_WARN_CONSTANT_CONVERSION = YES; 768 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 769 | CLANG_WARN_EMPTY_BODY = YES; 770 | CLANG_WARN_ENUM_CONVERSION = YES; 771 | CLANG_WARN_INT_CONVERSION = YES; 772 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 773 | CLANG_WARN_UNREACHABLE_CODE = YES; 774 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 775 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 776 | COPY_PHASE_STRIP = YES; 777 | ENABLE_NS_ASSERTIONS = NO; 778 | ENABLE_STRICT_OBJC_MSGSEND = YES; 779 | GCC_C_LANGUAGE_STANDARD = gnu99; 780 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 781 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 782 | GCC_WARN_UNDECLARED_SELECTOR = YES; 783 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 784 | GCC_WARN_UNUSED_FUNCTION = YES; 785 | GCC_WARN_UNUSED_VARIABLE = YES; 786 | HEADER_SEARCH_PATHS = ( 787 | "$(inherited)", 788 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 789 | "$(SRCROOT)/../node_modules/react-native/React/**", 790 | "$(SRCROOT)\..\node_modules\react-native-vector-icons\RNVectorIconsManager", 791 | "$(SRCROOT)\..\node_modules\react-native-maps\ios/**", 792 | ); 793 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 794 | MTL_ENABLE_DEBUG_INFO = NO; 795 | SDKROOT = iphoneos; 796 | VALIDATE_PRODUCT = YES; 797 | }; 798 | name = Release; 799 | }; 800 | /* End XCBuildConfiguration section */ 801 | 802 | /* Begin XCConfigurationList section */ 803 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AwesomeProjectTests" */ = { 804 | isa = XCConfigurationList; 805 | buildConfigurations = ( 806 | 00E356F61AD99517003FC87E /* Debug */, 807 | 00E356F71AD99517003FC87E /* Release */, 808 | ); 809 | defaultConfigurationIsVisible = 0; 810 | defaultConfigurationName = Release; 811 | }; 812 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AwesomeProject" */ = { 813 | isa = XCConfigurationList; 814 | buildConfigurations = ( 815 | 13B07F941A680F5B00A75B9A /* Debug */, 816 | 13B07F951A680F5B00A75B9A /* Release */, 817 | ); 818 | defaultConfigurationIsVisible = 0; 819 | defaultConfigurationName = Release; 820 | }; 821 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AwesomeProject" */ = { 822 | isa = XCConfigurationList; 823 | buildConfigurations = ( 824 | 83CBBA201A601CBA00E9B192 /* Debug */, 825 | 83CBBA211A601CBA00E9B192 /* Release */, 826 | ); 827 | defaultConfigurationIsVisible = 0; 828 | defaultConfigurationName = Release; 829 | }; 830 | /* End XCConfigurationList section */ 831 | }; 832 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 833 | } 834 | -------------------------------------------------------------------------------- /ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /ios/AwesomeProject/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 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ios/AwesomeProject/AppDelegate.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 "AppDelegate.h" 11 | 12 | #import "RCTBundleURLProvider.h" 13 | #import "RCTRootView.h" 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"AwesomeProject" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /ios/AwesomeProject/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ios/AwesomeProject/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/AwesomeProject/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | NSExceptionDomains 44 | 45 | localhost 46 | 47 | NSTemporaryExceptionAllowsInsecureHTTPLoads 48 | 49 | 50 | 51 | 52 | UIAppFonts 53 | 54 | Entypo.ttf 55 | EvilIcons.ttf 56 | FontAwesome.ttf 57 | Foundation.ttf 58 | Ionicons.ttf 59 | MaterialIcons.ttf 60 | Octicons.ttf 61 | Zocial.ttf 62 | 63 | 64 | -------------------------------------------------------------------------------- /ios/AwesomeProject/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 | -------------------------------------------------------------------------------- /ios/AwesomeProjectTests/AwesomeProjectTests.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 | #import 12 | 13 | #import "RCTLog.h" 14 | #import "RCTRootView.h" 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface AwesomeProjectTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation AwesomeProjectTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /ios/AwesomeProjectTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-sample", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest", 8 | "api-mock": "json-server --watch api-db.js --routes api-routes.json", 9 | "test:watch": "jest --watch", 10 | "coverage": "jest --coverage" 11 | }, 12 | "dependencies": { 13 | "faker": "3.1.0", 14 | "lodash": "^4.16.4", 15 | "node-uuid": "^1.4.7", 16 | "react": "15.3.2", 17 | "react-native": "^0.36.1", 18 | "react-native-action-button": "^2.0.14", 19 | "react-native-camera": "https://github.com/lwansbrough/react-native-camera.git", 20 | "react-native-elements": "^0.7.1", 21 | "react-native-maps": "^0.11.0", 22 | "react-native-router-flux": "^3.36.0", 23 | "react-native-scrollable-tab-view": "^0.7.0", 24 | "react-native-vector-icons": "^2.1.0", 25 | "react-redux": "^4.4.5", 26 | "redux": "^3.6.0", 27 | "redux-thunk": "^2.1.0", 28 | "remote-redux-devtools": "^0.5.3", 29 | "styled-components": "^1.0.10" 30 | }, 31 | "devDependencies": { 32 | "babel-jest": "^16.0.0", 33 | "babel-preset-react-native": "^1.9.0", 34 | "enzyme": "^2.5.1", 35 | "eslint": "^3.6.0", 36 | "eslint-config-airbnb": "^12.0.0", 37 | "eslint-config-react-native": "^1.6.0", 38 | "eslint-loader": "^1.3.0", 39 | "eslint-plugin-babel": "^3.2.0", 40 | "eslint-plugin-import": "^2.0.1", 41 | "eslint-plugin-jsx-a11y": "^2.2.3", 42 | "eslint-plugin-react": "^6.3.0", 43 | "eslint-plugin-react-native": "^2.0.0", 44 | "jest": "^16.0.1", 45 | "jest-react-native": "^16.0.0", 46 | "react-addons-test-utils": "^15.3.2", 47 | "react-dom": "^15.3.2", 48 | "react-test-renderer": "^15.3.2" 49 | }, 50 | "jest": { 51 | "preset": "jest-react-native" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Context and goal 2 | 3 | I have done this application for a school project and wanted to try to do a mobile app in using web technologies I am familiar with. Having none mobile background, it was a leap in the dark but in the same time it was really exciting. 4 | 5 | This app is made to be simple and may help people knowing React & Redux to get into creating mobile apps. It's made with React Native, coupled with some extra nice packages to handle routing, dataflow and UI elements. 6 | 7 | ## Preview 8 | 9 | ![gif preview](https://raw.githubusercontent.com/mbeaudru/react-native-sample/master/assets/preview.gif) 10 | 11 | > Note: 6MB size GIF, might take some time to load 12 | 13 | ## Main technologies used 14 | 15 | - [React Native](https://github.com/facebook/react-native) 16 | 17 | > A framework for building native apps with React. 18 | 19 | - [Redux](http://redux.js.org/) 20 | 21 | > Redux is a predictable state container for JavaScript apps. 22 | 23 | - [React Native Elements](https://github.com/react-native-community/react-native-elements) 24 | 25 | > Cross Platform React Native UI Toolkit 26 | 27 | - [React Native Router Flux](https://github.com/aksonov/react-native-router-flux) 28 | 29 | > React Native Router based on new React Native Navigation API 30 | 31 | ## Running the project 32 | 33 | - Clone this project 34 | ``` 35 | git clone < project-url.git > 36 | ``` 37 | 38 | - [Install NodeJS](https://nodejs.org/en/) on your computer. 39 | 40 | - [Install yarn](https://yarnpkg.com/en/docs/install) on your computer 41 | > Yarn is a dependency manager built by facebook and google. It is a more efficient and reliable (thanks to yarn.lock) alternative of npm. 42 | 43 | - Launch ``` yarn ``` command in a terminal opened in the project folder. 44 | > This command will look into the *package.json* file and install all the dependencies listed here. 45 | 46 | - Install react-native-cli globally on your computer 47 | ``` 48 | yarn global add react-native-cli 49 | ``` 50 | 51 | ### Android steps 52 | 53 | - Launch a virtual android device [(through *Android Studio* for instance)](https://developer.android.com/studio/run/managing-avds.html#viewing) 54 | 55 | > If you have never installed any android virtual device, [follow those instructions](https://developer.android.com/studio/run/managing-avds.html#createavd) 56 | 57 | - Then, run the project in executing on your project folder: 58 | 59 | ``` 60 | react-native run-android 61 | ``` 62 | 63 | ## Troubleshooting 64 | 65 | **Note:** Each time you pull commits from others, run the **yarn** command to install dependencies that may have been introduced. 66 | 67 | ### react-native is not recognized as an internal or external command 68 | - If your terminal is telling you react-native is not known, try to install it globally with npm: ```npm install -g react-native-cli``` and re-run the above command. 69 | 70 | ### 'adb' is not recognized as an internal or external command 71 | 72 | If you have a build error with this message on Windows, it means that you must add the Android sdk platform tools to your environment PATH. 73 | 74 | [How to add an environment variable on your computer.](https://www.java.com/en/download/help/path.xml) 75 | 76 | My value on windows: *```C:\Users\Manuel\AppData\Local\Android\sdk\platform-tools```* 77 | 78 | ### failed to find target with hash string 'android-23' 79 | 80 | React Native needs this to be installed in order to work, and the default target installed by *Android Studio* is the 24th. To solve this issue, open android studio and click on SDK Manager Icon: 81 | 82 | ![SDK Manager](https://i.snag.gy/bxQd0z.jpg) 83 | 84 | Then click on the line with API Level of value 23 and apply. 85 | 86 | ![Install API 23 Instructions](https://i.snag.gy/LtYAR7.jpg) 87 | 88 | ### failed to find Build Tools revision *XX.X.X* 89 | 90 | It seems you are missing the build tools at specific revision *XX.X.X*, so you need to install them. Go to Android Studio SDK Settings (see images above) and click on the SDK Tools snippet. 91 | 92 | Then, click on **Show Package Details** and look for Android SDK Build Tools *XX.X.X*. Then check if it is installed. If not, install it and this issue should be solved then. 93 | 94 | ![SDK Manager Standalone](https://i.snag.gy/Y3X58Z.jpg) 95 | 96 | ### Execution failed for task ':app:dexDebug' 97 | 98 | Go into the **android** project's folder in your terminal and run 99 | 100 | *Windows* 101 | ``` 102 | gradlew clean 103 | ``` 104 | 105 | *Linux & Mac* 106 | ``` 107 | ./gradlew clean 108 | ``` 109 | 110 | Then delete the build folder, go back to the project's root folder and try again, this error should be solved. 111 | 112 | > **Note:** If it doesn't work as expected, try checking you have not forgotten any of the steps above. If not, please **open an issue and describe your problem**. 113 | 114 | ## Contributing to the project 115 | 116 | Since the linting is done through [**eslint**](http://eslint.org/), you will need to configure your text editor to use the coding rules defined in the *.eslint.js* project file. 117 | 118 | > A code that contains unjustified errors won't be merged to the master branch. 119 | 120 | ### Atom 121 | 122 | - [Install Atom](https://atom.io/) if it's not done yet. 123 | 124 | - [Open the Atom settings](http://flight-manual.atom.io/getting-started/sections/atom-basics/#settings-and-preferences) (*"Ctrl + ,"* shortcut) and go to *Install* section 125 | 126 | ![install-section](http://www.codeblocq.com/img/atom-prefs-install-tab.png) 127 | 128 | - Then look for the linter package and install it 129 | 130 | ![linter-package](http://www.codeblocq.com/img/atom-linter-package.png) 131 | 132 | - Then look for the linter-eslint package and install it 133 | 134 | ![linter-eslint-package](http://www.codeblocq.com/img/atom-linter-eslint-package.png) 135 | 136 | - Open a javascript file (ending with *.js*) and paste 137 | 138 | ```js 139 | console.log('raises two errors') 140 | ``` 141 | As you can guess, your editor should raise two errors because console.log is forbidden and there is a semi-column missing. Congrats ! 142 | 143 | > **Note:** If it doesn't work as expected, try checking you have not forgotten any of the steps above. If not, please open an issue and describe your problem. 144 | 145 | ## Testing 146 | 147 | We will use [Jest](https://facebook.github.io/jest/) testing library because it allows us to test both components and functions in an easy and efficient way. 148 | 149 | To run the tests, execute ```yarn test``` in a terminal opened in the project folder. 150 | If you want to re-test each time you modify a test file, run ```yarn run test:watch```. Jest will watch for file changes and relaunch the tests for you. 151 | 152 | ### Files location 153 | 154 | All tests are written in a \_\_tests\_\_ folder, alongside to what you want to test. For instance, there is a \_\_test\_\_ folder in the components folder, one other in actions, reducers and so on. 155 | 156 | Jest will look for tests into those \_\_tests\_\_ folders, so you can't name it another way. 157 | 158 | > **Note:** \_\_snapshots\_\_ folders are automatically generated, don't create them on your own. 159 | 160 | ### Unit testing redux (actions, reducers) 161 | 162 | Dan Abramov, one of the main creator of Redux, [has written a very nice documentation](http://redux.js.org/docs/recipes/WritingTests.html#action-creators) that cover how to test actions and reducers with Jest. 163 | 164 | ### Components testing 165 | 166 | Jest has a nice feature called [*snapshots*](https://facebook.github.io/jest/docs/tutorial-react-native.html#snapshot-test) that allow developers to pass inputs (props) to components and to test what the rendered result is. 167 | 168 | Here are resources for you to understand deeper how it works: 169 | - [Jest - React Tree Snapshot Testing](http://facebook.github.io/jest/blog/2016/07/27/jest-14.html) 170 | - [Jest - Snapshot documentation](http://facebook.github.io/jest/docs/tutorial-react-native.html#snapshot-test) 171 | - [Jest - Facebook quick live tutorial](https://www.facebook.com/react/videos/1035427199869020/) 172 | - [...and many others](http://facebook.github.io/jest/blog/2016/10/03/jest-16.html#community-update) 173 | 174 | To sum snapshots tests up, it consist in this workflow: 175 | 176 | - Create your component until you are satisfied with it 177 | - Write snapshots tests in passing all kind of props to your component 178 | - If you are satisfied with the produced snapshot, keep it. If not, fix your component. 179 | - Next time you modify your component, your saved snapshot will be compared to the produced result and it is up to you to determine if you are satisfied or not. If you are, *update* your snapshot with -u. 180 | 181 | In this project, we separate snapshot testing from the rest. Snapshot tests are written in files that follow this convention: 182 | 183 | ``` 184 | < ComponentName >Snap.js 185 | ``` 186 | 187 | Jest doesn't provide a proper way to test user interactions, nor a way to test methods inside components. To do so, you have to use something else among: 188 | 189 | - [React Test Utilities](https://facebook.github.io/react/docs/test-utils.html) 190 | - [Enzyme](http://airbnb.io/enzyme/) 191 | 192 | In this project, we have decided to use **Enzyme** to test the components methods. The naming convention for those tests is: 193 | 194 | ``` 195 | < ComponentName >.js 196 | ``` 197 | -------------------------------------------------------------------------------- /src/actions/comments.js: -------------------------------------------------------------------------------- 1 | import * as types from '../utils/constants'; 2 | import * as api from '../utils/api'; 3 | import _ from 'lodash'; 4 | 5 | /* eslint-disable no-console */ 6 | 7 | // TODO: Use args to fetch near comments, because right now we are fetching 8 | // all the comments in the DB. 9 | export function fetchNearComments() { 10 | return (dispatch, getState) => { 11 | fetch(api.NEAR_COMMENTS(), api.headerToken(getState())) 12 | .then(res => res.json()) 13 | .then(comments => dispatch({ 14 | type: types.FETCH_COMMENTS, 15 | comments 16 | })) 17 | .catch(err => console.error(err)); 18 | }; 19 | } 20 | 21 | export function fetchCommentById(commentId) { 22 | return (dispatch, getState) => { 23 | fetch(api.COMMENTS_$ID(commentId), api.headerToken(getState())) 24 | .then(res => res.json()) 25 | .then(comment => dispatch({ 26 | type: types.FETCH_COMMENT, 27 | comment 28 | })) 29 | .catch(err => console.error(err)); 30 | }; 31 | } 32 | 33 | export function addComment(comment = {}) { 34 | return (dispatch, getState) => { 35 | const queryParams = _.merge({}, api.headerToken(getState()), { 36 | method: "POST", 37 | body: JSON.stringify(comment), 38 | headers: { 39 | "Content-Type": "application/json" 40 | } 41 | }); 42 | 43 | fetch(api.NEAR_COMMENTS(), queryParams) 44 | .then(() => { 45 | fetch(api.COMMENTS_$ID(comment.id)) 46 | .then(res => res.json()) 47 | .then(comment => dispatch({ 48 | type: types.FETCH_COMMENT, 49 | comment 50 | })) 51 | .catch(err => console.error(err)); 52 | }) 53 | .catch(err => console.error(err)); 54 | }; 55 | } 56 | 57 | /* 58 | TODO: Note: All this logic should be in server side and doesn't make sense 59 | in a production app. We have to do this to compile with JSON-SERVER but 60 | it should be done another way with a real API server. 61 | */ 62 | export function likeComment(commentToUpdate) { 63 | return (dispatch, getState) => { 64 | const comment = _.merge({}, commentToUpdate, { 65 | liked: !commentToUpdate.liked 66 | }); 67 | 68 | const queryParams = _.merge({}, api.headerToken(getState()), { 69 | method: "PUT", 70 | body: JSON.stringify(comment), 71 | headers: { 72 | "Content-Type": "application/json" 73 | } 74 | }); 75 | 76 | dispatch({ 77 | type: types.FETCH_COMMENT, 78 | comment 79 | }); 80 | 81 | fetch(api.COMMENTS_$ID(comment.id), queryParams) 82 | .then(res => res.json()) 83 | .then(comment => dispatch({ 84 | type: types.FETCH_COMMENT, 85 | comment 86 | })) 87 | .catch(err => console.error(err)); 88 | }; 89 | } 90 | 91 | /* 92 | TODO: Note: All this logic should be in server side and doesn't make sense 93 | in a production app. We have to do this to compile with JSON-SERVER but 94 | it should be done another way with a real API server. 95 | */ 96 | export function likeReply(replyToUpdate) { 97 | return (dispatch, getState) => { 98 | const reply = _.merge({}, replyToUpdate, { 99 | liked: !replyToUpdate.liked 100 | }); 101 | 102 | const queryParams = _.merge({}, api.headerToken(getState()), { 103 | method: "PUT", 104 | body: JSON.stringify(reply), 105 | headers: { 106 | "Content-Type": "application/json" 107 | } 108 | }); 109 | 110 | fetch(api.REPLIES_$ID(reply.id), queryParams) 111 | .then(() => { 112 | fetch(api.COMMENTS_$ID(reply.commentId)) 113 | .then(res => res.json()) 114 | .then(comment => dispatch({ 115 | type: types.FETCH_COMMENT, 116 | comment 117 | })) 118 | .catch(err => console.error(err)); 119 | }) 120 | .catch(err => console.error(err)); 121 | }; 122 | } 123 | 124 | /* 125 | TODO: Note: All this logic should be in server side and doesn't make sense 126 | in a production app. We have to do this to compile with JSON-SERVER but 127 | it should be done another way with a real API server. 128 | */ 129 | export function addReply(reply) { 130 | return (dispatch, getState) => { 131 | const queryParams = _.merge({}, api.headerToken(getState()), { 132 | method: "POST", 133 | body: JSON.stringify(reply), 134 | headers: { 135 | "Content-Type": "application/json" 136 | } 137 | }); 138 | 139 | fetch(api.REPLIES(), queryParams) 140 | .then(() => { 141 | fetch(api.COMMENTS_$ID(reply.commentId)) 142 | .then(res => res.json()) 143 | .then(comment => dispatch({ 144 | type: types.FETCH_COMMENT, 145 | comment 146 | })) 147 | .catch(err => console.error(err)); 148 | }) 149 | .catch(err => console.error(err)); 150 | }; 151 | } 152 | 153 | export function toggleAddCommentModalVisibility() { 154 | return { 155 | type: types.TOGGLE_ADD_COMMENT_MODAL_VISIBILITY 156 | }; 157 | } 158 | 159 | export function deleteComment(comment) { 160 | return { 161 | type: types.DELETE_COMMENT, 162 | comment 163 | }; 164 | } 165 | -------------------------------------------------------------------------------- /src/actions/users.js: -------------------------------------------------------------------------------- 1 | import * as types from '../utils/constants'; 2 | import * as api from '../utils/api'; 3 | import _ from 'lodash'; 4 | 5 | /* 6 | TODO: All the user management/auth must be done with Auth0. 7 | */ 8 | export function registerUser(user) { 9 | return dispatch => { 10 | const queryParams = { 11 | method: "POST", 12 | body: JSON.stringify(user), 13 | headers: { 14 | "Content-Type": "application/json" 15 | } 16 | }; 17 | 18 | fetch(api.USERS(), queryParams) 19 | .then(() => { 20 | dispatch({ 21 | type: types.FETCH_USER, 22 | user 23 | }); 24 | 25 | dispatch({ 26 | type: types.SET_CURRENT_USER, 27 | user 28 | }); 29 | }) 30 | .catch(err => console.warn(err)); 31 | }; 32 | } 33 | 34 | export function loginUser(user) { 35 | return dispatch => { 36 | fetch(api.USERS_$FIRSTNAME_$LASTNAME(user.firstName, user.lastName)) 37 | .then(res => res.json()) 38 | .then(usersFetched => { 39 | for (const userFetched of usersFetched) { 40 | if (userFetched.password === user.password) { 41 | dispatch({ 42 | type: types.FETCH_USER, 43 | user: userFetched 44 | }); 45 | 46 | dispatch({ 47 | type: types.SET_CURRENT_USER, 48 | user: userFetched 49 | }); 50 | break; 51 | } 52 | } 53 | }) 54 | .catch(err => console.warn(err)); 55 | }; 56 | } 57 | 58 | export function updateUser(user) { 59 | return dispatch => { 60 | const queryParams = { 61 | method: "PUT", 62 | body: JSON.stringify(user), 63 | headers: { 64 | "Content-Type": "application/json" 65 | } 66 | }; 67 | 68 | fetch(api.USERS_$ID(user.id), queryParams) 69 | .then(() => { 70 | dispatch({ 71 | type: types.FETCH_USER, 72 | user 73 | }); 74 | 75 | dispatch({ 76 | type: types.SET_CURRENT_USER, 77 | user 78 | }); 79 | }) 80 | .catch(err => console.warn(err)); 81 | }; 82 | } 83 | 84 | export function fetchUserById(userId) { 85 | return (dispatch, getState) => { 86 | fetch(api.USERS_$ID(userId), api.headerToken(getState())) 87 | .then(res => res.json()) 88 | .then((user = {}) => dispatch({ 89 | type: types.FETCH_USER, 90 | user 91 | })) 92 | .catch(err => console.error(err)); 93 | }; 94 | } 95 | 96 | /* 97 | TODO: Note: All this logic should be in server side and doesn't make sense 98 | in a production app. We have to do this to compile with JSON-SERVER but 99 | it should be done another way with a real API server. 100 | */ 101 | export function followUser(userToFollow) { 102 | return (dispatch, getState) => { 103 | const followed = !userToFollow.followed; 104 | const user = _.merge({}, userToFollow, { followed }); 105 | 106 | // First query -> Set the user boolean status "followed" 107 | // This change is used for the button 'follow / unfollow' 108 | const queryParams = _.merge({}, api.headerToken(getState()), { 109 | method: "PUT", 110 | body: JSON.stringify(user), 111 | headers: { 112 | "Content-Type": "application/json" 113 | } 114 | }); 115 | 116 | fetch(api.USERS_$ID(user.id), queryParams) 117 | .then(res => res.json()) 118 | .then(() => { 119 | dispatch({ 120 | type: types.FETCH_USER, 121 | user 122 | }); 123 | }) 124 | .catch(err => console.error(err)); 125 | 126 | // This step is made to add/remove the user from the currentUser followed 127 | // user list whether he is followed or not. 128 | const currentUserId = _.get(getState(), 'users.currentUser.id', null); 129 | const currentUser = _.get( 130 | getState(), ['users', 'hashMap', currentUserId], {} 131 | ); 132 | const usersSeen = _.get(currentUser, 'seen', []); 133 | if (followed) { 134 | currentUser.seen = [...usersSeen, user]; 135 | } else { 136 | const newUsersSeen = usersSeen.filter(usr => usr.id !== user.id); 137 | currentUser.seen = newUsersSeen; 138 | } 139 | 140 | const queryParams2 = _.merge({}, api.headerToken(getState()), { 141 | method: "PUT", 142 | body: JSON.stringify(currentUser), 143 | headers: { 144 | "Content-Type": "application/json" 145 | } 146 | }); 147 | 148 | fetch(api.USERS_$ID(currentUserId), queryParams2) 149 | .then(res => res.json()) 150 | .then(() => { 151 | dispatch({ 152 | type: types.FETCH_USER, 153 | user: currentUser 154 | }); 155 | }) 156 | .catch(err => console.error(err)); 157 | }; 158 | } 159 | -------------------------------------------------------------------------------- /src/assets/markers/comment-map-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbeaudru/react-native-sample/c9c7f964c416824d5f27879da02777a2b61f8de4/src/assets/markers/comment-map-icon.png -------------------------------------------------------------------------------- /src/components/ActionButton.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { View, Text, TouchableHighlight } from 'react-native'; 3 | import { Icon } from 'react-native-elements'; 4 | 5 | class ActionButton extends React.Component { 6 | 7 | render() { 8 | const sizeStyle = this.getSize(this.props.size); 9 | return ( 10 | 14 | 15 | 20 | {!this.props.hideLabel && 21 | {this.props.text} 22 | } 23 | 24 | 25 | ); 26 | } 27 | 28 | static propTypes = { 29 | icon: React.PropTypes.string, 30 | text: React.PropTypes.string, 31 | size: React.PropTypes.string, 32 | hideLabel: React.PropTypes.bool, 33 | textColor: React.PropTypes.string, 34 | 35 | onPress: React.PropTypes.func, 36 | backgroundColor: React.PropTypes.string 37 | } 38 | 39 | static defaultProps = { 40 | textColor: 'black' 41 | } 42 | 43 | getSize(size) { 44 | /* eslint-disable */ 45 | const normalSize = { icon: { size: 26 }, text: { fontSize: 14, color: this.props.textColor } }; 46 | const smallSize = { icon: { size: 23 }, text: { fontSize: 12, color: this.props.textColor } }; 47 | switch (size) { 48 | case 'normal': return normalSize; 49 | case 'small': return smallSize; 50 | default: return normalSize; 51 | } 52 | } 53 | 54 | } 55 | 56 | export default ActionButton; 57 | -------------------------------------------------------------------------------- /src/components/CommentForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Modal, View, StyleSheet } from 'react-native'; 3 | import { FormLabel, FormInput, Button } from 'react-native-elements'; 4 | import TopBar from './TopBar'; 5 | import colors from '../utils/colors'; 6 | 7 | class AddCommentModal extends React.Component { 8 | 9 | render() { 10 | return ( 11 | {}} 16 | > 17 | 18 | 22 | Description 23 | this.updateCommentForm('description', value) 27 | } 28 | /> 29 |