diff --git a/.buckconfig b/.buckconfig new file mode 100644 index 000000000..934256cb2 --- /dev/null +++ b/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..e69de29bb diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..40c4b0dc1 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,21 @@ +{ + "parser": "babel-eslint", + "extends": "airbnb", + "plugins": [ + "react", + "jsx-a11y", + "import", + "react-native" + ], + "rules": { + "no-underscore-dangle": "off", + "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }] + }, + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".android.js", ".ios.js"] + } + } + } +} diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 000000000..b69d071bc --- /dev/null +++ b/.flowconfig @@ -0,0 +1,58 @@ +[ignore] + +# We fork some components by platform. +.*/*.android.js + +# Ignore templates with `@flow` in header +.*/local-cli/generator.* + +# Ignore malformed json +.*/node_modules/y18n/test/.*\.json + +# Ignore the website subdir +/website/.* + +# Ignore BUCK generated dirs +/\.buckd/ + +# Ignore unexpected extra @providesModule +.*/node_modules/commoner/test/source/widget/share.js + +# Ignore duplicate module providers +# For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root +.*/Libraries/react-native/React.js +.*/Libraries/react-native/ReactNative.js +.*/node_modules/jest-runtime/build/__tests__/.* + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow +flow/ + +[options] +module.system=haste + +esproposal.class_static_fields=enable +esproposal.class_instance_fields=enable + +experimental.strict_type_args=true + +munge_underscores=true + +module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' +module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FixMe + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(30\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(30\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy + +unsafe.enable_getters_and_setters=true + +[version] +^0.30.0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..eb1535e41 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IJ +# +*.iml +.idea +.gradle +local.properties + +# node.js +# +node_modules/ +npm-debug.log + +# BUCK +buck-out/ +\.buckd/ +android/app/libs +android/keystores/debug.keystore diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/android/app/BUCK b/android/app/BUCK new file mode 100644 index 000000000..fdb386411 --- /dev/null +++ b/android/app/BUCK @@ -0,0 +1,66 @@ +import re + +# To learn about Buck see [Docs](https://buckbuild.com/). +# To run your application with Buck: +# - install Buck +# - `npm start` - to start the packager +# - `cd android` +# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` +# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck +# - `buck install -r android/app` - compile, install and run application +# + +lib_deps = [] +for jarfile in glob(['libs/*.jar']): + name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) + lib_deps.append(':' + name) + prebuilt_jar( + name = name, + binary_jar = jarfile, + ) + +for aarfile in glob(['libs/*.aar']): + name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) + lib_deps.append(':' + name) + android_prebuilt_aar( + name = name, + aar = aarfile, + ) + +android_library( + name = 'all-libs', + exported_deps = lib_deps +) + +android_library( + name = 'app-code', + srcs = glob([ + 'src/main/java/**/*.java', + ]), + deps = [ + ':all-libs', + ':build_config', + ':res', + ], +) + +android_build_config( + name = 'build_config', + package = 'com.nativebasehackathon', +) + +android_resource( + name = 'res', + res = 'src/main/res', + package = 'com.nativebasehackathon', +) + +android_binary( + name = 'app', + package_type = 'debug', + manifest = 'src/main/AndroidManifest.xml', + keystore = '//android/keystores:debug', + deps = [ + ':app-code', + ], +) diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 000000000..4fc03e892 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,142 @@ +apply plugin: "com.android.application" + +import com.android.build.OutputFile + +/** + * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets + * and bundleReleaseJsAndAssets). + * These basically call `react-native bundle` with the correct arguments during the Android build + * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the + * bundle directly from the development server. Below you can see all the possible configurations + * and their defaults. If you decide to add a configuration block, make sure to add it before the + * `apply from: "../../node_modules/react-native/react.gradle"` line. + * + * project.ext.react = [ + * // the name of the generated asset file containing your JS bundle + * bundleAssetName: "index.android.bundle", + * + * // the entry file for bundle generation + * entryFile: "index.android.js", + * + * // whether to bundle JS and assets in debug mode + * bundleInDebug: false, + * + * // whether to bundle JS and assets in release mode + * bundleInRelease: true, + * + * // whether to bundle JS and assets in another build variant (if configured). + * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants + * // The configuration property can be in the following formats + * // 'bundleIn${productFlavor}${buildType}' + * // 'bundleIn${buildType}' + * // bundleInFreeDebug: true, + * // bundleInPaidRelease: true, + * // bundleInBeta: true, + * + * // the root of your project, i.e. where "package.json" lives + * root: "../../", + * + * // where to put the JS bundle asset in debug mode + * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", + * + * // where to put the JS bundle asset in release mode + * jsBundleDirRelease: "$buildDir/intermediates/assets/release", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in debug mode + * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in release mode + * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", + * + * // by default the gradle tasks are skipped if none of the JS files or assets change; this means + * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to + * // date; if you have any other folders that you want to ignore for performance reasons (gradle + * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ + * // for example, you might want to remove it from here. + * inputExcludes: ["android/**", "ios/**"], + * + * // override which node gets called and with what additional arguments + * nodeExecutableAndArgs: ["node"] + * + * // supply additional arguments to the packager + * extraPackagerArgs: [] + * ] + */ + +apply from: "../../node_modules/react-native/react.gradle" +apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" + +/** + * Set this to true to create two separate APKs instead of one: + * - An APK that only works on ARM devices + * - An APK that only works on x86 devices + * The advantage is the size of the APK is reduced by about 4MB. + * Upload all the APKs to the Play Store and people will download + * the correct one based on the CPU architecture of their device. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Run Proguard to shrink the Java bytecode in release builds. + */ +def enableProguardInReleaseBuilds = false + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.nativebasehackathon" + minSdkVersion 16 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + ndk { + abiFilters "armeabi-v7a", "x86" + } + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86" + } + } + buildTypes { + release { + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits + def versionCodes = ["armeabi-v7a":1, "x86":2] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } + } + } +} + +dependencies { + compile project(':react-native-vector-icons') + compile project(':react-native-code-push') + compile fileTree(dir: "libs", include: ["*.jar"]) + compile "com.android.support:appcompat-v7:23.0.1" + compile "com.facebook.react:react-native:+" // From node_modules +} + +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task copyDownloadableDepsToLibs(type: Copy) { + from configurations.compile + into 'libs' +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 000000000..48361a901 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,66 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Disabling obfuscation is useful if you collect stack traces from production crashes +# (unless you are using a system that supports de-obfuscate the stack traces). +-dontobfuscate + +# React Native + +# Keep our interfaces so they can be used by other ProGuard rules. +# See http://sourceforge.net/p/proguard/bugs/466/ +-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip +-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip + +# Do not strip any method/class that is annotated with @DoNotStrip +-keep @com.facebook.proguard.annotations.DoNotStrip class * +-keep @com.facebook.common.internal.DoNotStrip class * +-keepclassmembers class * { + @com.facebook.proguard.annotations.DoNotStrip *; + @com.facebook.common.internal.DoNotStrip *; +} + +-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { + void set*(***); + *** get*(); +} + +-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } +-keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } +-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** + +# okhttp + +-keepattributes Signature +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** + +# okio + +-keep class sun.misc.Unsafe { *; } +-dontwarn java.nio.file.* +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-dontwarn okio.** diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8e916cc11 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/assets/fonts/Andale Mono.ttf b/android/app/src/main/assets/fonts/Andale Mono.ttf new file mode 100644 index 000000000..e766a6e18 Binary files /dev/null and b/android/app/src/main/assets/fonts/Andale Mono.ttf differ diff --git a/android/app/src/main/assets/fonts/Arial Black.ttf b/android/app/src/main/assets/fonts/Arial Black.ttf new file mode 100644 index 000000000..88772774d Binary files /dev/null and b/android/app/src/main/assets/fonts/Arial Black.ttf differ diff --git a/android/app/src/main/assets/fonts/Arial.ttf b/android/app/src/main/assets/fonts/Arial.ttf new file mode 100644 index 000000000..ab68fb197 Binary files /dev/null and b/android/app/src/main/assets/fonts/Arial.ttf differ diff --git a/android/app/src/main/assets/fonts/Comic Sans MS.ttf b/android/app/src/main/assets/fonts/Comic Sans MS.ttf new file mode 100644 index 000000000..831e3d867 Binary files /dev/null and b/android/app/src/main/assets/fonts/Comic Sans MS.ttf differ diff --git a/android/app/src/main/assets/fonts/Courier New.ttf b/android/app/src/main/assets/fonts/Courier New.ttf new file mode 100644 index 000000000..633899d82 Binary files /dev/null and b/android/app/src/main/assets/fonts/Courier New.ttf differ diff --git a/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf new file mode 100644 index 000000000..1c8f5e910 Binary files /dev/null and b/android/app/src/main/assets/fonts/Entypo.ttf differ diff --git a/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf new file mode 100644 index 000000000..b270f9851 Binary files /dev/null and b/android/app/src/main/assets/fonts/EvilIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf new file mode 100644 index 000000000..f221e50a2 Binary files /dev/null and b/android/app/src/main/assets/fonts/FontAwesome.ttf differ diff --git a/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf new file mode 100644 index 000000000..6cce217dd Binary files /dev/null and b/android/app/src/main/assets/fonts/Foundation.ttf differ diff --git a/android/app/src/main/assets/fonts/Georgia.ttf b/android/app/src/main/assets/fonts/Georgia.ttf new file mode 100644 index 000000000..d15700612 Binary files /dev/null and b/android/app/src/main/assets/fonts/Georgia.ttf differ diff --git a/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf new file mode 100644 index 000000000..307ad889a Binary files /dev/null and b/android/app/src/main/assets/fonts/Ionicons.ttf differ diff --git a/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf new file mode 100644 index 000000000..7015564ad Binary files /dev/null and b/android/app/src/main/assets/fonts/MaterialIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Microsoft Sans Serif.ttf b/android/app/src/main/assets/fonts/Microsoft Sans Serif.ttf new file mode 100644 index 000000000..8cb1d92f0 Binary files /dev/null and b/android/app/src/main/assets/fonts/Microsoft Sans Serif.ttf differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf new file mode 100644 index 000000000..0a62bb9ea Binary files /dev/null and b/android/app/src/main/assets/fonts/Octicons.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto.ttf b/android/app/src/main/assets/fonts/Roboto.ttf new file mode 100755 index 000000000..3e6e2e761 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto_medium.ttf b/android/app/src/main/assets/fonts/Roboto_medium.ttf new file mode 100755 index 000000000..aa00de0ef Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto_medium.ttf differ diff --git a/android/app/src/main/assets/fonts/SF-UI-Text-Regular.otf b/android/app/src/main/assets/fonts/SF-UI-Text-Regular.otf new file mode 100644 index 000000000..a36c8f62b Binary files /dev/null and b/android/app/src/main/assets/fonts/SF-UI-Text-Regular.otf differ diff --git a/android/app/src/main/assets/fonts/Skia.ttf b/android/app/src/main/assets/fonts/Skia.ttf new file mode 100644 index 000000000..8bb197b99 Binary files /dev/null and b/android/app/src/main/assets/fonts/Skia.ttf differ diff --git a/android/app/src/main/assets/fonts/Times New Roman.ttf b/android/app/src/main/assets/fonts/Times New Roman.ttf new file mode 100644 index 000000000..d7969c39c Binary files /dev/null and b/android/app/src/main/assets/fonts/Times New Roman.ttf differ diff --git a/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf new file mode 100644 index 000000000..e4ae46c62 Binary files /dev/null and b/android/app/src/main/assets/fonts/Zocial.ttf differ diff --git a/android/app/src/main/java/com/nativebasehackathon/MainActivity.java b/android/app/src/main/java/com/nativebasehackathon/MainActivity.java new file mode 100644 index 000000000..79c774ee6 --- /dev/null +++ b/android/app/src/main/java/com/nativebasehackathon/MainActivity.java @@ -0,0 +1,15 @@ +package com.nativebasehackathon; + +import com.facebook.react.ReactActivity; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. + * This is used to schedule rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "NativebaseHackathon"; + } +} diff --git a/android/app/src/main/java/com/nativebasehackathon/MainApplication.java b/android/app/src/main/java/com/nativebasehackathon/MainApplication.java new file mode 100644 index 000000000..2e87f60bc --- /dev/null +++ b/android/app/src/main/java/com/nativebasehackathon/MainApplication.java @@ -0,0 +1,45 @@ +package com.nativebasehackathon; + +import android.app.Application; +import android.util.Log; + +import com.facebook.react.ReactApplication; +import com.oblador.vectoricons.VectorIconsPackage; +import com.microsoft.codepush.react.CodePush; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; + +import java.util.Arrays; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + + @Override + protected String getJSBundleFile() { + return CodePush.getJSBundleFile(); + } + + @Override + protected boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new VectorIconsPackage(), + new CodePush(null, getApplicationContext(), BuildConfig.DEBUG) + ); + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } +} diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..cde69bccc Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c133a0cbd Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..bfa42f0e7 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..324e72cdd Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..9c9ea48b3 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + + NativebaseHackathon + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..319eb0ca1 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..fcba4c587 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,24 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.3.1' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$rootDir/../node_modules/react-native/android" + } + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..1fd964e90 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +android.useDeprecatedNdk=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..b5166dad4 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..b9fbfaba0 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 000000000..91a7e269e --- /dev/null +++ b/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 000000000..aec99730b --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/keystores/BUCK b/android/keystores/BUCK new file mode 100644 index 000000000..15da20e6b --- /dev/null +++ b/android/keystores/BUCK @@ -0,0 +1,8 @@ +keystore( + name = 'debug', + store = 'debug.keystore', + properties = 'debug.keystore.properties', + visibility = [ + 'PUBLIC', + ], +) diff --git a/android/keystores/debug.keystore.properties b/android/keystores/debug.keystore.properties new file mode 100644 index 000000000..121bfb49f --- /dev/null +++ b/android/keystores/debug.keystore.properties @@ -0,0 +1,4 @@ +key.store=debug.keystore +key.alias=androiddebugkey +key.store.password=android +key.alias.password=android diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..a68e85980 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,7 @@ +rootProject.name = 'NativebaseHackathon' + +include ':app' +include ':react-native-vector-icons' +project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') +include ':react-native-code-push' +project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app') diff --git a/img/purple-flower.jpg b/img/purple-flower.jpg new file mode 100644 index 000000000..ae23b4577 Binary files /dev/null and b/img/purple-flower.jpg differ diff --git a/index.android.js b/index.android.js new file mode 100644 index 000000000..9629e56f0 --- /dev/null +++ b/index.android.js @@ -0,0 +1,6 @@ +'use strict'; + +import {AppRegistry} from 'react-native'; +import setup from './js/setup'; + +AppRegistry.registerComponent('NativebaseHackathon', setup); diff --git a/index.ios.js b/index.ios.js new file mode 100644 index 000000000..c9fdfa89d --- /dev/null +++ b/index.ios.js @@ -0,0 +1,7 @@ +'use strict'; + +import {AppRegistry, StatusBar} from 'react-native'; +import setup from './js/setup'; + +StatusBar.setBarStyle('default'); +AppRegistry.registerComponent('NativebaseHackathon', setup); diff --git a/ios/NativebaseHackathon.xcodeproj/project.pbxproj b/ios/NativebaseHackathon.xcodeproj/project.pbxproj new file mode 100644 index 000000000..c10b72e5a --- /dev/null +++ b/ios/NativebaseHackathon.xcodeproj/project.pbxproj @@ -0,0 +1,943 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { +/* Begin PBXBuildFile section */ + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* NativebaseHackathonTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* NativebaseHackathonTests.m */; }; + 017C1918B0764F328D98BFB6 /* Arial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1B42634CB14A485787BB7574 /* Arial.ttf */; }; + 023C126D45134A1B9B10BBF8 /* Skia.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CC7DB8EF4DF54D88BCBC2D1F /* Skia.ttf */; }; + 04560ADC999F49C395AD195C /* Courier New.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2044F057213F4DDF80DE902B /* Courier New.ttf */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 150D848BE1D74CA1AF6C1121 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82C5CF3C6DA946E7970A9D85 /* Foundation.ttf */; }; + 236FA69581D24C4F9CD46A6A /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 332DC99F9EE44E7AA801D143 /* FontAwesome.ttf */; }; + 29CF641D1B7248D0838DFD84 /* Arial Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 780D3F8CF6834C08BE12E736 /* Arial Black.ttf */; }; + 3D8B13DF836040C5A40C890E /* Andale Mono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5AD1228D66D7465690CB0381 /* Andale Mono.ttf */; }; + 4461ECA6E8AB44E2A2187AEA /* Times New Roman.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 732DA08CE8B94C608C065A2B /* Times New Roman.ttf */; }; + 4F8D7648E97546B4B56ACE97 /* Microsoft Sans Serif.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C05AD01EDA954B2FBFE55D17 /* Microsoft Sans Serif.ttf */; }; + 58E7F9BA3621470E9B813A65 /* Comic Sans MS.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 75ED74A2B4A54661BDC9CCC2 /* Comic Sans MS.ttf */; }; + 5AD82B9471764AB6A021A9B9 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ACC84A1F3D1A422580142FBD /* Zocial.ttf */; }; + 62CF6178294E4EE1BF9BEF89 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A1C26B91F69549E3AB223550 /* Octicons.ttf */; }; + 6B12CFDD1E1B49CF9FEB2C53 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEF46559A10B42BA8FD2EEEC /* MaterialIcons.ttf */; }; + 6EDF34E960A846D4A2A97E3F /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D32D90C832FA4CD69EECDD72 /* Entypo.ttf */; }; + 70427DC4108B4B748111AC72 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5DA4B25E074A4F409E29043C /* Ionicons.ttf */; }; + 77A3D84B37CD45A989B77AF6 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3D05DBDB83EF4E3BB4302BC1 /* EvilIcons.ttf */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 90BC218F66ED4F79B5C73CB7 /* Roboto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AAC3E81BCB4340D0ACA88990 /* Roboto.ttf */; }; + 929247CE6922430EA1828818 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FC78308EFB41B3B896A6A8 /* libz.tbd */; }; + 9EE5765216194F6F860FB255 /* Roboto_medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 26012C9A7895484F8415BE3E /* Roboto_medium.ttf */; }; + A0D09D8EEF3E4F638A992D74 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C448E829B8C840A6BAD54DF4 /* libRNVectorIcons.a */; }; + AE9DADC8D4634B218989D46C /* libCodePush.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C7EBEE5A9EC431A993E5276 /* libCodePush.a */; }; + DE9E5D914107411881423EE9 /* SF-UI-Text-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 05D011F5A2C7475B9605FA74 /* SF-UI-Text-Regular.otf */; }; + E19DE32F0F764A00953C248D /* Georgia.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CA46A429C62543E8AAB3E6B4 /* Georgia.ttf */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTGeolocation; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = NativebaseHackathon; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; + 94D2B0421D94195F003C08BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5076FCBB2C754070994B1D65 /* CodePush.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = CodePush; + }; + 94D2B0511D94195F003C08BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A4165D04011B40959CDF9612 /* RNVectorIcons.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 5DBEB1501B18CEA900B34395; + remoteInfo = RNVectorIcons; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* NativebaseHackathonTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NativebaseHackathonTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* NativebaseHackathonTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NativebaseHackathonTests.m; sourceTree = ""; }; + 05D011F5A2C7475B9605FA74 /* SF-UI-Text-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "SF-UI-Text-Regular.otf"; path = "../node_modules/native-base/Fonts/SF-UI-Text-Regular.otf"; sourceTree = ""; }; + 08FC78308EFB41B3B896A6A8 /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 0C7EBEE5A9EC431A993E5276 /* libCodePush.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libCodePush.a; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* NativebaseHackathon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NativebaseHackathon.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = NativebaseHackathon/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = NativebaseHackathon/AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NativebaseHackathon/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NativebaseHackathon/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NativebaseHackathon/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 1B42634CB14A485787BB7574 /* Arial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Arial.ttf; path = "../node_modules/native-base/Fonts/Arial.ttf"; sourceTree = ""; }; + 2044F057213F4DDF80DE902B /* Courier New.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Courier New.ttf"; path = "../node_modules/native-base/Fonts/Courier New.ttf"; sourceTree = ""; }; + 26012C9A7895484F8415BE3E /* Roboto_medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Roboto_medium.ttf; path = "../node_modules/native-base/Fonts/Roboto_medium.ttf"; sourceTree = ""; }; + 332DC99F9EE44E7AA801D143 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; + 3D05DBDB83EF4E3BB4302BC1 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; + 5076FCBB2C754070994B1D65 /* CodePush.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = CodePush.xcodeproj; path = "../node_modules/react-native-code-push/ios/CodePush.xcodeproj"; sourceTree = ""; }; + 5AD1228D66D7465690CB0381 /* Andale Mono.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Andale Mono.ttf"; path = "../node_modules/native-base/Fonts/Andale Mono.ttf"; sourceTree = ""; }; + 5DA4B25E074A4F409E29043C /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; + 732DA08CE8B94C608C065A2B /* Times New Roman.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Times New Roman.ttf"; path = "../node_modules/native-base/Fonts/Times New Roman.ttf"; sourceTree = ""; }; + 75ED74A2B4A54661BDC9CCC2 /* Comic Sans MS.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Comic Sans MS.ttf"; path = "../node_modules/native-base/Fonts/Comic Sans MS.ttf"; sourceTree = ""; }; + 780D3F8CF6834C08BE12E736 /* Arial Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Arial Black.ttf"; path = "../node_modules/native-base/Fonts/Arial Black.ttf"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 82C5CF3C6DA946E7970A9D85 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + A1C26B91F69549E3AB223550 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; + A4165D04011B40959CDF9612 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; + AAC3E81BCB4340D0ACA88990 /* Roboto.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Roboto.ttf; path = "../node_modules/native-base/Fonts/Roboto.ttf"; sourceTree = ""; }; + ACC84A1F3D1A422580142FBD /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; + C05AD01EDA954B2FBFE55D17 /* Microsoft Sans Serif.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Microsoft Sans Serif.ttf"; path = "../node_modules/native-base/Fonts/Microsoft Sans Serif.ttf"; sourceTree = ""; }; + C448E829B8C840A6BAD54DF4 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; + CA46A429C62543E8AAB3E6B4 /* Georgia.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Georgia.ttf; path = "../node_modules/native-base/Fonts/Georgia.ttf"; sourceTree = ""; }; + CC7DB8EF4DF54D88BCBC2D1F /* Skia.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Skia.ttf; path = "../node_modules/native-base/Fonts/Skia.ttf"; sourceTree = ""; }; + D32D90C832FA4CD69EECDD72 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; + EEF46559A10B42BA8FD2EEEC /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + AE9DADC8D4634B218989D46C /* libCodePush.a in Frameworks */, + 929247CE6922430EA1828818 /* libz.tbd in Frameworks */, + A0D09D8EEF3E4F638A992D74 /* libRNVectorIcons.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302B61ABCB90400DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 00E356EF1AD99517003FC87E /* NativebaseHackathonTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* NativebaseHackathonTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = NativebaseHackathonTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* NativebaseHackathon */ = { + isa = PBXGroup; + children = ( + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = NativebaseHackathon; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + 5076FCBB2C754070994B1D65 /* CodePush.xcodeproj */, + A4165D04011B40959CDF9612 /* RNVectorIcons.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* NativebaseHackathon */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* NativebaseHackathonTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + C2548FACB81F416C83EC29B7 /* Resources */, + E97F391D3227481E904052C1 /* Frameworks */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* NativebaseHackathon.app */, + 00E356EE1AD99517003FC87E /* NativebaseHackathonTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 94D2B03F1D94195F003C08BD /* Products */ = { + isa = PBXGroup; + children = ( + 94D2B0431D94195F003C08BD /* libCodePush.a */, + ); + name = Products; + sourceTree = ""; + }; + 94D2B04E1D94195F003C08BD /* Products */ = { + isa = PBXGroup; + children = ( + 94D2B0521D94195F003C08BD /* libRNVectorIcons.a */, + ); + name = Products; + sourceTree = ""; + }; + C2548FACB81F416C83EC29B7 /* Resources */ = { + isa = PBXGroup; + children = ( + 5AD1228D66D7465690CB0381 /* Andale Mono.ttf */, + 780D3F8CF6834C08BE12E736 /* Arial Black.ttf */, + 1B42634CB14A485787BB7574 /* Arial.ttf */, + 75ED74A2B4A54661BDC9CCC2 /* Comic Sans MS.ttf */, + 2044F057213F4DDF80DE902B /* Courier New.ttf */, + CA46A429C62543E8AAB3E6B4 /* Georgia.ttf */, + C05AD01EDA954B2FBFE55D17 /* Microsoft Sans Serif.ttf */, + 26012C9A7895484F8415BE3E /* Roboto_medium.ttf */, + AAC3E81BCB4340D0ACA88990 /* Roboto.ttf */, + 05D011F5A2C7475B9605FA74 /* SF-UI-Text-Regular.otf */, + CC7DB8EF4DF54D88BCBC2D1F /* Skia.ttf */, + 732DA08CE8B94C608C065A2B /* Times New Roman.ttf */, + D32D90C832FA4CD69EECDD72 /* Entypo.ttf */, + 3D05DBDB83EF4E3BB4302BC1 /* EvilIcons.ttf */, + 332DC99F9EE44E7AA801D143 /* FontAwesome.ttf */, + 82C5CF3C6DA946E7970A9D85 /* Foundation.ttf */, + 5DA4B25E074A4F409E29043C /* Ionicons.ttf */, + EEF46559A10B42BA8FD2EEEC /* MaterialIcons.ttf */, + A1C26B91F69549E3AB223550 /* Octicons.ttf */, + ACC84A1F3D1A422580142FBD /* Zocial.ttf */, + ); + name = Resources; + sourceTree = ""; + }; + E97F391D3227481E904052C1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 08FC78308EFB41B3B896A6A8 /* libz.tbd */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* NativebaseHackathonTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "NativebaseHackathonTests" */; + buildPhases = ( + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = NativebaseHackathonTests; + productName = NativebaseHackathonTests; + productReference = 00E356EE1AD99517003FC87E /* NativebaseHackathonTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* NativebaseHackathon */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "NativebaseHackathon" */; + buildPhases = ( + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NativebaseHackathon; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* NativebaseHackathon.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 610; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "NativebaseHackathon" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 94D2B03F1D94195F003C08BD /* Products */; + ProjectRef = 5076FCBB2C754070994B1D65 /* CodePush.xcodeproj */; + }, + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; + ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + { + ProductGroup = 94D2B04E1D94195F003C08BD /* Products */; + ProjectRef = A4165D04011B40959CDF9612 /* RNVectorIcons.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* NativebaseHackathon */, + 00E356ED1AD99517003FC87E /* NativebaseHackathonTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTGeolocation.a; + remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 94D2B0431D94195F003C08BD /* libCodePush.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libCodePush.a; + remoteRef = 94D2B0421D94195F003C08BD /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 94D2B0521D94195F003C08BD /* libRNVectorIcons.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNVectorIcons.a; + remoteRef = 94D2B0511D94195F003C08BD /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + 3D8B13DF836040C5A40C890E /* Andale Mono.ttf in Resources */, + 29CF641D1B7248D0838DFD84 /* Arial Black.ttf in Resources */, + 017C1918B0764F328D98BFB6 /* Arial.ttf in Resources */, + 58E7F9BA3621470E9B813A65 /* Comic Sans MS.ttf in Resources */, + 04560ADC999F49C395AD195C /* Courier New.ttf in Resources */, + E19DE32F0F764A00953C248D /* Georgia.ttf in Resources */, + 4F8D7648E97546B4B56ACE97 /* Microsoft Sans Serif.ttf in Resources */, + 9EE5765216194F6F860FB255 /* Roboto_medium.ttf in Resources */, + 90BC218F66ED4F79B5C73CB7 /* Roboto.ttf in Resources */, + DE9E5D914107411881423EE9 /* SF-UI-Text-Regular.otf in Resources */, + 023C126D45134A1B9B10BBF8 /* Skia.ttf in Resources */, + 4461ECA6E8AB44E2A2187AEA /* Times New Roman.ttf in Resources */, + 6EDF34E960A846D4A2A97E3F /* Entypo.ttf in Resources */, + 77A3D84B37CD45A989B77AF6 /* EvilIcons.ttf in Resources */, + 236FA69581D24C4F9CD46A6A /* FontAwesome.ttf in Resources */, + 150D848BE1D74CA1AF6C1121 /* Foundation.ttf in Resources */, + 70427DC4108B4B748111AC72 /* Ionicons.ttf in Resources */, + 6B12CFDD1E1B49CF9FEB2C53 /* MaterialIcons.ttf in Resources */, + 62CF6178294E4EE1BF9BEF89 /* Octicons.ttf in Resources */, + 5AD82B9471764AB6A021A9B9 /* Zocial.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* NativebaseHackathonTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* NativebaseHackathon */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + path = NativebaseHackathon; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = NativebaseHackathonTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NativebaseHackathon.app/NativebaseHackathon"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = NativebaseHackathonTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NativebaseHackathon.app/NativebaseHackathon"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEAD_CODE_STRIPPING = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + ); + INFOPLIST_FILE = NativebaseHackathon/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = NativebaseHackathon; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + ); + INFOPLIST_FILE = NativebaseHackathon/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = NativebaseHackathon; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "NativebaseHackathonTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "NativebaseHackathon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "NativebaseHackathon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/ios/NativebaseHackathon.xcodeproj/xcshareddata/xcschemes/NativebaseHackathon.xcscheme b/ios/NativebaseHackathon.xcodeproj/xcshareddata/xcschemes/NativebaseHackathon.xcscheme new file mode 100644 index 000000000..323d65ade --- /dev/null +++ b/ios/NativebaseHackathon.xcodeproj/xcshareddata/xcschemes/NativebaseHackathon.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/NativebaseHackathon/AppDelegate.h b/ios/NativebaseHackathon/AppDelegate.h new file mode 100644 index 000000000..a9654d5e0 --- /dev/null +++ b/ios/NativebaseHackathon/AppDelegate.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/ios/NativebaseHackathon/AppDelegate.m b/ios/NativebaseHackathon/AppDelegate.m new file mode 100644 index 000000000..85186a6a1 --- /dev/null +++ b/ios/NativebaseHackathon/AppDelegate.m @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AppDelegate.h" +#import "CodePush.h" + +#import "RCTBundleURLProvider.h" +#import "RCTRootView.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + NSURL *jsCodeLocation; + + +#ifdef DEBUG + jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; +#else + jsCodeLocation = [CodePush bundleURL]; +#endif + + RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation + moduleName:@"NativebaseHackathon" + initialProperties:nil + launchOptions:launchOptions]; + rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/ios/NativebaseHackathon/Base.lproj/LaunchScreen.xib b/ios/NativebaseHackathon/Base.lproj/LaunchScreen.xib new file mode 100644 index 000000000..d8a27bf77 --- /dev/null +++ b/ios/NativebaseHackathon/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/NativebaseHackathon/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/NativebaseHackathon/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..118c98f74 --- /dev/null +++ b/ios/NativebaseHackathon/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/NativebaseHackathon/Info.plist b/ios/NativebaseHackathon/Info.plist new file mode 100644 index 000000000..dc4942056 --- /dev/null +++ b/ios/NativebaseHackathon/Info.plist @@ -0,0 +1,78 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSTemporaryExceptionAllowsInsecureHTTPLoads + + + + + UIAppFonts + + Andale Mono.ttf + Arial Black.ttf + Arial.ttf + Comic Sans MS.ttf + Courier New.ttf + Georgia.ttf + Microsoft Sans Serif.ttf + Roboto_medium.ttf + Roboto.ttf + SF-UI-Text-Regular.otf + Skia.ttf + Times New Roman.ttf + Entypo.ttf + EvilIcons.ttf + FontAwesome.ttf + Foundation.ttf + Ionicons.ttf + MaterialIcons.ttf + Octicons.ttf + Zocial.ttf + + CodePushDeploymentKey + deployment-key-here + + \ No newline at end of file diff --git a/ios/NativebaseHackathon/main.m b/ios/NativebaseHackathon/main.m new file mode 100644 index 000000000..3d767fcbb --- /dev/null +++ b/ios/NativebaseHackathon/main.m @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/ios/NativebaseHackathonTests/Info.plist b/ios/NativebaseHackathonTests/Info.plist new file mode 100644 index 000000000..886825ccc --- /dev/null +++ b/ios/NativebaseHackathonTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/ios/NativebaseHackathonTests/NativebaseHackathonTests.m b/ios/NativebaseHackathonTests/NativebaseHackathonTests.m new file mode 100644 index 000000000..84d230bf6 --- /dev/null +++ b/ios/NativebaseHackathonTests/NativebaseHackathonTests.m @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import "RCTLog.h" +#import "RCTRootView.h" + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface NativebaseHackathonTests : XCTestCase + +@end + +@implementation NativebaseHackathonTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + RCTSetLogFunction(RCTDefaultLogFunction); + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/js/App.js b/js/App.js new file mode 100644 index 000000000..797e781ed --- /dev/null +++ b/js/App.js @@ -0,0 +1,101 @@ + +import React, { Component } from 'react'; +import { StyleSheet } from 'react-native'; +import CodePush from 'react-native-code-push'; + +import { Container, Content, Text, View } from 'native-base'; +import Modal from 'react-native-modalbox'; + +import AppNavigator from './AppNavigator'; +import ProgressBar from './components/loaders/ProgressBar'; + +import theme from './themes/base-theme'; + +const styles = StyleSheet.create({ + container: { + flex: 1, + width: null, + height: null, + }, + modal: { + justifyContent: 'center', + alignItems: 'center', + }, + modal1: { + height: 300, + + }, +}); + +class App extends Component { + + constructor(props) { + super(props); + this.state = { + showDownloadingModal: false, + showInstalling: false, + downloadProgress: 0, + }; + } + + componentDidMount() { + CodePush.sync({ updateDialog: true, installMode: CodePush.InstallMode.IMMEDIATE }, + (status) => { + switch (status) { + case CodePush.SyncStatus.DOWNLOADING_PACKAGE: + this.setState({ showDownloadingModal: true }); + this._modal.open(); + break; + case CodePush.SyncStatus.INSTALLING_UPDATE: + this.setState({ showInstalling: true }); + break; + case CodePush.SyncStatus.UPDATE_INSTALLED: + this._modal.close(); + this.setState({ showDownloadingModal: false }); + break; + default: + break; + } + }, + ({ receivedBytes, totalBytes }) => { + this.setState({ downloadProgress: (receivedBytes / totalBytes) * 100 }); + } + ); + } + + render() { + if (this.state.showDownloadingModal) { + return ( + + + { this._modal = c; }} + swipeToClose={false} + > + + {this.state.showInstalling ? + + Installing update... + : + + + Downloading update... {`${parseInt(this.state.downloadProgress, 10)} %`} + + + + } + + + + + + ); + } + + return ; + } +} + +export default App; diff --git a/js/AppNavigator.js b/js/AppNavigator.js new file mode 100644 index 000000000..b6e34636a --- /dev/null +++ b/js/AppNavigator.js @@ -0,0 +1,186 @@ + +import React, { Component } from 'react'; +import { BackAndroid, Platform, StatusBar, Navigator } from 'react-native'; +import { connect } from 'react-redux'; +import { Drawer } from 'native-base'; + +import { closeDrawer } from './actions/drawer'; +import { popRoute } from './actions/route'; + +import Login from './components/login/'; +import Anatomy from './components/anatomy/'; +import NHBadge from './components/badge/'; +import NHButton from './components/button/'; +import NHCard from './components/card/'; +import NHCheckbox from './components/checkbox/'; +import NHForm from './components/form/'; +import NHIcon from './components/icon/'; +import NHInputGroup from './components/inputgroup/'; +import NHLayout from './components/layout/'; +import NHList from './components/list/'; +import NHPicker from './components/picker/'; +import NHRadio from './components/radio/'; +import NHSearchbar from './components/searchbar/'; +import NHSpinner from './components/spinner/'; +import NHTabs from './components/tabs/'; +import NHThumbnail from './components/thumbnail/'; +import SplashPage from './components/splashscreen/'; +import SideBar from './components/sideBar'; +import { statusBarColor } from './themes/base-theme'; + +Navigator.prototype.replaceWithAnimation = function replaceWithAnimation(route) { + const activeLength = this.state.presentedIndex + 1; + const activeStack = this.state.routeStack.slice(0, activeLength); + const activeAnimationConfigStack = this.state.sceneConfigStack.slice(0, activeLength); + const nextStack = activeStack.concat([route]); + const destIndex = nextStack.length - 1; + const nextSceneConfig = this.props.configureScene(route, nextStack); + const nextAnimationConfigStack = activeAnimationConfigStack.concat([nextSceneConfig]); + + const replacedStack = activeStack.slice(0, activeLength - 1).concat([route]); + this._emitWillFocus(nextStack[destIndex]); + this.setState({ + routeStack: nextStack, + sceneConfigStack: nextAnimationConfigStack, + }, () => { + this._enableScene(destIndex); + this._transitionTo(destIndex, nextSceneConfig.defaultTransitionVelocity, null, () => { + this.immediatelyResetRouteStack(replacedStack); + }); + }); +}; + +export const globalNav = {}; + +class AppNavigator extends Component { + + static propTypes = { + drawerState: React.PropTypes.string, + popRoute: React.PropTypes.func, + closeDrawer: React.PropTypes.func, + } + + componentDidMount() { + globalNav.navigator = this._navigator; + + BackAndroid.addEventListener('hardwareBackPress', () => { + const routes = this._navigator.getCurrentRoutes(); + + if (routes[routes.length - 1].id === 'anatomy' || routes[routes.length - 1].id === 'login') { + // CLose the app + return false; + } + this.popRoute(); + return true; + }); + } + + componentDidUpdate() { + // console.log(this.props.routes, 'wdwdwd'); + if (this.props.drawerState === 'opened') { + this.openDrawer(); + } + + if (this.props.drawerState === 'closed') { + this._drawer.close(); + } + } + + popRoute() { + this.props.popRoute(); + } + + openDrawer() { + this._drawer.open(); + } + + closeDrawer() { + if (this.props.drawerState === 'opened') { + this._drawer.close(); + this.props.closeDrawer(); + } + } + + renderScene(route, navigator) { // eslint-disable-line class-methods-use-this + switch (route.id) { + case 'splashscreen': + return ; + case 'login': + return ; + case 'anatomy': + return ; + case 'badge': + return ; + case 'button': + return ; + case 'card': + return ; + case 'checkbox': + return ; + case 'form': + return ; + case 'icon': + return ; + case 'inputgroup': + return ; + case 'layout': + return ; + case 'list': + return ; + case 'picker': + return ; + case 'radio': + return ; + case 'searchbar': + return ; + case 'spinner': + return ; + case 'tabs': + return ; + case 'thumbnail': + return ; + default : + return ; + } + } + + render() { + return ( + { this._drawer = ref; }} + type="overlay" + content={} + tapToClose + acceptPan={false} + onClose={() => this.closeDrawer()} + openDrawerOffset={0.2} + panCloseMask={0.2} + negotiatePan + > + + { + this._navigator = ref; + }} + configureScene={() => Navigator.SceneConfigs.FloatFromRight} + initialRoute={{ id: (Platform.OS === 'android') ? 'splashscreen' : 'login', statusBarHidden: true }} + renderScene={this.renderScene} + /> + + ); + } +} + +const bindAction = dispatch => ({ + closeDrawer: () => dispatch(closeDrawer()), + popRoute: () => dispatch(popRoute()), +}); + +const mapStateToProps = state => ({ + drawerState: state.drawer.drawerState, +}); + +export default connect(mapStateToProps, bindAction)(AppNavigator); diff --git a/js/actions/drawer.js b/js/actions/drawer.js new file mode 100644 index 000000000..7328d16b0 --- /dev/null +++ b/js/actions/drawer.js @@ -0,0 +1,17 @@ + +import type { Action } from './types'; + +export const OPEN_DRAWER = 'OPEN_DRAWER'; +export const CLOSE_DRAWER = 'CLOSE_DRAWER'; + +export function openDrawer():Action { + return { + type: OPEN_DRAWER, + }; +} + +export function closeDrawer():Action { + return { + type: CLOSE_DRAWER, + }; +} diff --git a/js/actions/route.js b/js/actions/route.js new file mode 100644 index 000000000..404e4272b --- /dev/null +++ b/js/actions/route.js @@ -0,0 +1,47 @@ + +import type { Action } from './types'; + +export const PUSH_NEW_ROUTE = 'PUSH_NEW_ROUTE'; +export const REPLACE_ROUTE = 'REPLACE_ROUTE'; +export const REPLACE_OR_PUSH_ROUTE = 'REPLACE_OR_PUSH_ROUTE'; +export const POP_ROUTE = 'POP_ROUTE'; +export const POP_TO_ROUTE = 'POP_TO_ROUTE'; + +export function replaceRoute(route:string, passProps:any):Action { + return { + type: REPLACE_ROUTE, + route, + passProps, + }; +} + +export function pushNewRoute(route:string, passProps:any):Action { + return { + type: PUSH_NEW_ROUTE, + route, + passProps, + }; +} + +export function replaceOrPushRoute(route:string, passProps:any):Action { + return { + type: REPLACE_OR_PUSH_ROUTE, + route, + passProps, + }; +} + +export function popRoute(passProps:any):Action { + return { + type: POP_ROUTE, + passProps, + }; +} + +export function popToRoute(route:string, passProps:any):Action { + return { + type: POP_TO_ROUTE, + route, + passProps, + }; +} diff --git a/js/actions/types.js b/js/actions/types.js new file mode 100644 index 000000000..8d5eb61f9 --- /dev/null +++ b/js/actions/types.js @@ -0,0 +1,16 @@ + +export type Action = + { type: 'PUSH_NEW_ROUTE', route: string } + | { type: 'POP_ROUTE' } + | { type: 'POP_TO_ROUTE', route: string } + | { type: 'REPLACE_ROUTE', route: string } + | { type: 'REPLACE_OR_PUSH_ROUTE', route: string } + | { type: 'OPEN_DRAWER'} + | { type: 'CLOSE_DRAWER'} + | { type: 'SET_USER', name: string} + | { type: 'SET_LIST', list: string} + +export type GetState = () => Object; +export type PromiseAction = Promise; +export type Dispatch = (action:Action | PromiseAction | Array) => any; +export type ThunkAction = (dispatch:Dispatch, getState:GetState) => any; diff --git a/js/components/anatomy/index.js b/js/components/anatomy/index.js new file mode 100644 index 000000000..5e9ba0816 --- /dev/null +++ b/js/components/anatomy/index.js @@ -0,0 +1,81 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Text, Button, Icon, Footer, FooterTab } from 'native-base'; + +import { openDrawer, closeDrawer } from '../../actions/drawer'; +import { replaceRoute, replaceOrPushRoute } from '../../actions/route'; +import myTheme from '../../themes/base-theme'; +import styles from './styles'; + +class Anatomy extends Component { + + static propTypes = { + openDrawer: React.PropTypes.func, + closeDrawer: React.PropTypes.func, + replaceRoute: React.PropTypes.func, + replaceOrPushRoute: React.PropTypes.func, + } + + replaceRoute(route) { + this.props.replaceRoute(route); + } + + navigateTo(route) { + this.props.closeDrawer(); + this.props.replaceOrPushRoute(route); + } + + render() { + return ( + + +
+ + Header + +
+ + + This is content section + + +
+ + + + + + +
+
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + closeDrawer: () => dispatch(closeDrawer()), + replaceRoute: route => dispatch(replaceRoute(route)), + replaceOrPushRoute: route => dispatch(replaceOrPushRoute(route)), + }; +} + +export default connect(null, bindAction)(Anatomy); diff --git a/js/components/anatomy/styles.js b/js/components/anatomy/styles.js new file mode 100644 index 000000000..e7d533f76 --- /dev/null +++ b/js/components/anatomy/styles.js @@ -0,0 +1,10 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + container: { + // backgroundColor: '#565051', + }, +}); diff --git a/js/components/badge/index.js b/js/components/badge/index.js new file mode 100644 index 000000000..2648e7f6f --- /dev/null +++ b/js/components/badge/index.js @@ -0,0 +1,69 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Badge } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import styles from './styles'; + +class NHBadge extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Badge + + +
+ + + 2 + 2 + 2 + 2 + 2 + 2 + + + + + 1866 + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHBadge); diff --git a/js/components/badge/styles.js b/js/components/badge/styles.js new file mode 100644 index 000000000..1db56e0b2 --- /dev/null +++ b/js/components/badge/styles.js @@ -0,0 +1,10 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + mb: { + marginBottom: 10, + }, +}); diff --git a/js/components/button/index.js b/js/components/button/index.js new file mode 100644 index 000000000..9660864f5 --- /dev/null +++ b/js/components/button/index.js @@ -0,0 +1,65 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Card, CardItem, Text, View } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import styles from './styles'; + +class NHButton extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Button + + +
+ + + + + Button Theme + + + + + + + + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHButton); diff --git a/js/components/button/styles.js b/js/components/button/styles.js new file mode 100644 index 000000000..f08c346b1 --- /dev/null +++ b/js/components/button/styles.js @@ -0,0 +1,10 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + mb: { + marginBottom: 15, + }, +}); diff --git a/js/components/card/index.js b/js/components/card/index.js new file mode 100644 index 000000000..000cae136 --- /dev/null +++ b/js/components/card/index.js @@ -0,0 +1,77 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Card, CardItem, Text } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import styles from './styles'; + +class NHCard extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Card + + +
+ + + + + NativeBase + + + + NativeBase is a free and open source framework that enables developers to build + high-quality mobile apps using React Native iOS and Android apps + with a fusion of ES6. + + + + + NativeBase builds a layer on top of React Native that provides you with + basic set of components for mobile application development. + + + + + Get on the mobile fast track with NativeBase, the fastest-growing platform + and tool set for iOS and Android development. + + + + GeekyAnts + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHCard); diff --git a/js/components/card/styles.js b/js/components/card/styles.js new file mode 100644 index 000000000..f08c346b1 --- /dev/null +++ b/js/components/card/styles.js @@ -0,0 +1,10 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + mb: { + marginBottom: 15, + }, +}); diff --git a/js/components/checkbox/index.js b/js/components/checkbox/index.js new file mode 100644 index 000000000..ce282c707 --- /dev/null +++ b/js/components/checkbox/index.js @@ -0,0 +1,67 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, List, ListItem, CheckBox, Text } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHCheckbox extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Check Box + + +
+ + + + + + Daily Stand Up + + + + Finish list Screen + + + + Lunch Break + + + + Discussion with Client + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHCheckbox); diff --git a/js/components/form/index.js b/js/components/form/index.js new file mode 100644 index 000000000..62b47f65a --- /dev/null +++ b/js/components/form/index.js @@ -0,0 +1,74 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, List, ListItem, InputGroup, Input } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHForm extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Form + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHForm); diff --git a/js/components/icon/index.js b/js/components/icon/index.js new file mode 100644 index 000000000..48c733e32 --- /dev/null +++ b/js/components/icon/index.js @@ -0,0 +1,136 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, View } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import styles from './styles'; + +class NHForm extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Icons + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHForm); diff --git a/js/components/icon/styles.js b/js/components/icon/styles.js new file mode 100644 index 000000000..87241da79 --- /dev/null +++ b/js/components/icon/styles.js @@ -0,0 +1,23 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + container: { + flex: 1, + width: null, + height: null, + }, + iconContainer: { + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: 'space-around', + paddingLeft: 15, + }, + icon: { + width: 45, + height: 45, + justifyContent: 'center', + }, +}); diff --git a/js/components/inputgroup/index.js b/js/components/inputgroup/index.js new file mode 100644 index 000000000..3e794c65f --- /dev/null +++ b/js/components/inputgroup/index.js @@ -0,0 +1,79 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, InputGroup, Input } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import styles from './styles'; + +class NHInputGroup extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + InputGroup + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHInputGroup); diff --git a/js/components/inputgroup/styles.js b/js/components/inputgroup/styles.js new file mode 100644 index 000000000..f08c346b1 --- /dev/null +++ b/js/components/inputgroup/styles.js @@ -0,0 +1,10 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + mb: { + marginBottom: 15, + }, +}); diff --git a/js/components/layout/index.js b/js/components/layout/index.js new file mode 100644 index 000000000..b9beda563 --- /dev/null +++ b/js/components/layout/index.js @@ -0,0 +1,54 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon } from 'native-base'; +import { Grid, Col } from 'react-native-easy-grid'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHLayout extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Layout + + +
+ + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHLayout); diff --git a/js/components/list/index.js b/js/components/list/index.js new file mode 100644 index 000000000..42eae7d88 --- /dev/null +++ b/js/components/list/index.js @@ -0,0 +1,75 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, List, ListItem, Text } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHList extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + List + + +
+ + + + + Simon Mignolet + + + Nathaniel Clyne + + + Dejan Lovren + + + Mama Sakho + + + Alberto Moreno + + + Emre Can + + + Joe Allen + + + Phil Coutinho + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHList); diff --git a/js/components/loaders/ProgressBar.android.js b/js/components/loaders/ProgressBar.android.js new file mode 100644 index 000000000..1f1e4704d --- /dev/null +++ b/js/components/loaders/ProgressBar.android.js @@ -0,0 +1,45 @@ + +import React from 'react'; +import ProgressBar from 'ProgressBarAndroid'; +import NativeBaseComponent from 'native-base/Components/Base/NativeBaseComponent'; +import computeProps from 'native-base/Utils/computeProps'; + + +export default class SpinnerNB extends NativeBaseComponent { + + prepareRootProps() { + const type = { + height: 40, + }; + + const defaultProps = { + style: type, + }; + + return computeProps(this.props, defaultProps); + } + + + render() { + const getColor = () => { + if (this.props.color) { + return this.props.color; + } else if (this.props.inverse) { + return this.getTheme().inverseProgressColor; + } + + return this.getTheme().defaultProgressColor; + }; + + return ( + + ); + } + +} diff --git a/js/components/loaders/ProgressBar.ios.js b/js/components/loaders/ProgressBar.ios.js new file mode 100644 index 000000000..0f5c17aef --- /dev/null +++ b/js/components/loaders/ProgressBar.ios.js @@ -0,0 +1,28 @@ + +import React from 'react'; +import { ProgressViewIOS } from 'react-native'; +import NativeBaseComponent from 'native-base/Components/Base/NativeBaseComponent'; + +export default class ProgressBarNB extends NativeBaseComponent { + + + render() { + const getColor = () => { + if (this.props.color) { + return this.props.color; + } else if (this.props.inverse) { + return this.getTheme().inverseProgressColor; + } + + return this.getTheme().defaultProgressColor; + }; + + return ( + + ); + } + +} diff --git a/js/components/loaders/Spinner.android.js b/js/components/loaders/Spinner.android.js new file mode 100644 index 000000000..66d20a924 --- /dev/null +++ b/js/components/loaders/Spinner.android.js @@ -0,0 +1,42 @@ + +import React from 'react'; +import ProgressBar from 'ProgressBarAndroid'; +import NativeBaseComponent from 'native-base/Components/Base/NativeBaseComponent'; +import computeProps from 'native-base/Utils/computeProps'; + +export default class SpinnerNB extends NativeBaseComponent { + + prepareRootProps() { + const type = { + height: 40, + }; + + const defaultProps = { + style: type, + }; + + return computeProps(this.props, defaultProps); + } + + + render() { + const getColor = () => { + if (this.props.color) { + return this.props.color; + } else if (this.props.inverse) { + return this.getTheme().inverseSpinnerColor; + } + + return this.getTheme().defaultSpinnerColor; + }; + + return ( + + ); + } + +} diff --git a/js/components/loaders/Spinner.ios.js b/js/components/loaders/Spinner.ios.js new file mode 100644 index 000000000..e3ffcc7ef --- /dev/null +++ b/js/components/loaders/Spinner.ios.js @@ -0,0 +1,43 @@ + +import React from 'react'; +import { ActivityIndicatorIOS } from 'react-native'; +import NativeBaseComponent from 'native-base/Components/Base/NativeBaseComponent'; +import computeProps from 'native-base/Utils/computeProps'; + + +export default class SpinnerNB extends NativeBaseComponent { + + prepareRootProps() { + const type = { + height: 80, + }; + + const defaultProps = { + style: type, + }; + + return computeProps(this.props, defaultProps); + } + + + render() { + const getColor = () => { + if (this.props.color) { + return this.props.color; + } else if (this.props.inverse) { + return this.getTheme().inverseSpinnerColor; + } + + return this.getTheme().defaultSpinnerColor; + }; + + return ( + + ); + } + +} diff --git a/js/components/login/index.js b/js/components/login/index.js new file mode 100644 index 000000000..a6a7db9c1 --- /dev/null +++ b/js/components/login/index.js @@ -0,0 +1,43 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Content, Header, Title, Button } from 'native-base'; + +import { replaceRoute } from '../../actions/route'; +import myTheme from '../../themes/base-theme'; + +// const background = require('../../../images/shadow.png'); + +class Login extends Component { + + static propTypes = { + replaceRoute: React.PropTypes.func, + } + + replaceRoute(route) { + this.props.replaceRoute(route); + } + + render() { + return ( + +
+ Login +
+ + + +
+ ); + } +} + +function bindActions(dispatch) { + return { + replaceRoute: route => dispatch(replaceRoute(route)), + }; +} + +export default connect(null, bindActions)(Login); diff --git a/js/components/login/styles.js b/js/components/login/styles.js new file mode 100644 index 000000000..065ffba41 --- /dev/null +++ b/js/components/login/styles.js @@ -0,0 +1,17 @@ + +const React = require('react-native'); + +const { StyleSheet, Dimensions } = React; + +const deviceHeight = Dimensions.get('window').height; + +module.exports = StyleSheet.create({ + container: { + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0, + backgroundColor: '#453F41', + }, +}); diff --git a/js/components/picker/index.js b/js/components/picker/index.js new file mode 100644 index 000000000..25c85cb8e --- /dev/null +++ b/js/components/picker/index.js @@ -0,0 +1,79 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Picker } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +const Item = Picker.Item; + +class NHPicker extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + constructor(props) { + super(props); + this.state = { + selectedItem: undefined, + selected1: 'key1', + results: { + items: [], + }, + }; + } + + onValueChange(value: string) { + this.setState({ + selected1: value, + }); + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Picker + + +
+ + + + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHPicker); diff --git a/js/components/radio/index.js b/js/components/radio/index.js new file mode 100644 index 000000000..bdeaad8b5 --- /dev/null +++ b/js/components/radio/index.js @@ -0,0 +1,67 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, List, ListItem, Radio, Text } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHRadio extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Radio + + +
+ + + + + + Daily Stand Up + + + + Finish list Screen + + + + Lunch Break + + + + Discussion with Client + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHRadio); diff --git a/js/components/searchbar/index.js b/js/components/searchbar/index.js new file mode 100644 index 000000000..215613610 --- /dev/null +++ b/js/components/searchbar/index.js @@ -0,0 +1,45 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Button, Icon, InputGroup, Input } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHSearchbar extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + + + + +
+
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHSearchbar); diff --git a/js/components/sideBar/index.js b/js/components/sideBar/index.js new file mode 100644 index 000000000..5ca92cf8c --- /dev/null +++ b/js/components/sideBar/index.js @@ -0,0 +1,90 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Content, Text, List, ListItem } from 'native-base'; + +import { closeDrawer } from '../../actions/drawer'; +import { replaceOrPushRoute } from '../../actions/route'; +import styles from './style'; + +class SideBar extends Component { + + static propTypes = { + closeDrawer: React.PropTypes.func, + replaceOrPushRoute: React.PropTypes.func, + } + + navigateTo(route) { + this.props.closeDrawer(); + this.props.replaceOrPushRoute(route); + } + + render() { + return ( + + + this.navigateTo('anatomy')} > + Anatomy + + this.navigateTo('badge')} > + Badge + + this.navigateTo('button')} > + Button + + this.navigateTo('card')} > + Card + + this.navigateTo('checkbox')} > + Check Box + + this.navigateTo('form')} > + Form + + this.navigateTo('icon')} > + Icon + + this.navigateTo('inputgroup')} > + InputGroup + + this.navigateTo('layout')} > + Layout + + this.navigateTo('list')} > + List + + this.navigateTo('picker')} > + Picker + + this.navigateTo('radio')} > + Radio + + this.navigateTo('searchbar')} > + Searchbar + + this.navigateTo('spinner')} > + Spinner + + this.navigateTo('tabs')} > + Tabs + + this.navigateTo('thumbnail')} > + Thumbnail + + this.navigateTo('spinner')} > + Test + + + + ); + } +} + +function bindAction(dispatch) { + return { + closeDrawer: () => dispatch(closeDrawer()), + replaceOrPushRoute: route => dispatch(replaceOrPushRoute(route)), + }; +} + +export default connect(null, bindAction)(SideBar); diff --git a/js/components/sideBar/style.js b/js/components/sideBar/style.js new file mode 100644 index 000000000..d1e4c66ac --- /dev/null +++ b/js/components/sideBar/style.js @@ -0,0 +1,13 @@ + +const React = require('react-native'); + +const { StyleSheet } = React; + +module.exports = StyleSheet.create({ + sidebar: { + flex: 1, + paddingTop: 30, + paddingBottom: 30, + backgroundColor: '#fff', + }, +}); diff --git a/js/components/spinner/index.js b/js/components/spinner/index.js new file mode 100644 index 000000000..d6fb4733d --- /dev/null +++ b/js/components/spinner/index.js @@ -0,0 +1,53 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Spinner } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +class NHSpinner extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Spinner + + +
+ + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHSpinner); diff --git a/js/components/splashscreen/index.js b/js/components/splashscreen/index.js new file mode 100644 index 000000000..4ce4cc9a3 --- /dev/null +++ b/js/components/splashscreen/index.js @@ -0,0 +1,25 @@ + +import React, { Component } from 'react'; +import { View } from 'native-base'; + +export default class SplashPage extends Component { + + static propTypes = { + navigator: React.PropTypes.shape({}), + } + + componentWillMount() { + const navigator = this.props.navigator; + setTimeout(() => { + navigator.replace({ + id: 'index', + }); + }, 1500); + } + + render() { // eslint-disable-line class-methods-use-this + return ( + + ); + } +} diff --git a/js/components/tabs/index.js b/js/components/tabs/index.js new file mode 100644 index 000000000..2942c362e --- /dev/null +++ b/js/components/tabs/index.js @@ -0,0 +1,55 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Tabs } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; +import NHCheckbox from '../checkbox/'; +import NHRadio from '../radio/'; + +class NHTabs extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Tabs + + +
+ + + + + + + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHTabs); diff --git a/js/components/thumbnail/index.js b/js/components/thumbnail/index.js new file mode 100644 index 000000000..f85d6ea8b --- /dev/null +++ b/js/components/thumbnail/index.js @@ -0,0 +1,61 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Container, Header, Title, Content, Button, Icon, Thumbnail, Text } from 'native-base'; + +import { openDrawer } from '../../actions/drawer'; +import { popRoute } from '../../actions/route'; + +const imgURI = 'http://www.onenov.in/users_content/users_images/images/f5f8d64aef421b809647a120ab133b7b.jpg'; +const imgPath = require('../../../img/purple-flower.jpg'); + +class NHThumbnail extends Component { + + static propTypes = { + popRoute: React.PropTypes.func, + openDrawer: React.PropTypes.func, + } + + popRoute() { + this.props.popRoute(); + } + + render() { + return ( + +
+ + + Thumbnail + + +
+ + + + + Using Url + + + Relative Path + + + Using require + +
+ ); + } +} + +function bindAction(dispatch) { + return { + openDrawer: () => dispatch(openDrawer()), + popRoute: () => dispatch(popRoute()), + }; +} + +export default connect(null, bindAction)(NHThumbnail); diff --git a/js/configureStore.js b/js/configureStore.js new file mode 100644 index 000000000..a3b778b94 --- /dev/null +++ b/js/configureStore.js @@ -0,0 +1,22 @@ + +import { AsyncStorage } from 'react-native'; +import devTools from 'remote-redux-devtools'; +import { createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; +import { persistStore } from 'redux-persist'; +import reducer from './reducers'; +import promise from './promise'; + +export default function configureStore(onCompletion:()=>void):any { + const enhancer = compose( + applyMiddleware(thunk, promise), + devTools({ + name: 'nativestarterproseed', realtime: true, + }), + ); + + const store = createStore(reducer, enhancer); + persistStore(store, { storage: AsyncStorage }, onCompletion); + + return store; +} diff --git a/js/promise.js b/js/promise.js new file mode 100644 index 000000000..fe3ceb9ad --- /dev/null +++ b/js/promise.js @@ -0,0 +1,10 @@ + +function warn(error) { + throw error; // To let the caller handle the rejection +} + +module.exports = () => next => action => ( + typeof action.then === 'function' + ? Promise.resolve(action).then(next, warn) + : next(action) +); diff --git a/js/reducers/drawer.js b/js/reducers/drawer.js new file mode 100644 index 000000000..5dec1de7e --- /dev/null +++ b/js/reducers/drawer.js @@ -0,0 +1,28 @@ + +import type { Action } from '../actions/types'; +import { OPEN_DRAWER, CLOSE_DRAWER } from '../actions/drawer'; + +export type State = { + drawerState: string +} + +const initialState = { + drawerState: 'closed', +}; + +export default function (state:State = initialState, action:Action): State { + if (action.type === OPEN_DRAWER) { + return { + ...state, + drawerState: 'opened', + }; + } + + if (action.type === CLOSE_DRAWER) { + return { + ...state, + drawerState: 'closed', + }; + } + return state; +} diff --git a/js/reducers/index.js b/js/reducers/index.js new file mode 100644 index 000000000..e09a24698 --- /dev/null +++ b/js/reducers/index.js @@ -0,0 +1,12 @@ + +import { combineReducers } from 'redux'; + +import drawer from './drawer'; +import route from './route'; + +export default combineReducers({ + + drawer, + route, + +}); diff --git a/js/reducers/route.js b/js/reducers/route.js new file mode 100644 index 000000000..fd81bf87e --- /dev/null +++ b/js/reducers/route.js @@ -0,0 +1,86 @@ + +import { REHYDRATE } from 'redux-persist/constants'; +import type { Action } from '../actions/types'; +import { globalNav } from '../AppNavigator'; +import { PUSH_NEW_ROUTE, POP_ROUTE, POP_TO_ROUTE, REPLACE_ROUTE, REPLACE_OR_PUSH_ROUTE } from '../actions/route'; + +export type State = { + routes: Array +} + +const initialState = { + routes: ['login'], +}; + +export default function (state:State = initialState, action:Action): State { + // console.log(state, "route state *()*(*&77"); + if (action.type === PUSH_NEW_ROUTE) { + // console.log(action.route, "route"); + globalNav.navigator.push({ id: action.route }); + return { + routes: [...state.routes, action.route], + }; + } + + if (action.type === REPLACE_ROUTE) { + globalNav.navigator.replaceWithAnimation({ id: action.route }); + const routes = state.routes; + routes.pop(); + return { + routes: [...routes, action.route], + }; + } + + // For sidebar navigation + if (action.type === REPLACE_OR_PUSH_ROUTE) { + let routes = state.routes; + + if (routes[routes.length - 1] === 'home') { + // If top route is home and user navigates to a route other than home, then push + if (action.route !== 'home') { + globalNav.navigator.push({ id: action.route }); + } else { // If top route is home and user navigates to home, do nothing + routes = []; + } + } else if (action.route === 'home') { + globalNav.navigator.resetTo({ id: 'home' }); + routes = []; + } else { + globalNav.navigator.replaceWithAnimation({ id: action.route }); + routes.pop(); + } + + return { + routes: [...routes, action.route], + }; + } + + if (action.type === POP_ROUTE) { + globalNav.navigator.pop(); + const routes = state.routes; + routes.pop(); + return { + routes, + }; + } + + if (action.type === POP_TO_ROUTE) { + globalNav.navigator.popToRoute({ id: action.route }); + const routes = state.routes; + while (routes.pop() !== action.route) { + // keep popping till you get to the route + } + return { + routes: [...routes, action.route], + }; + } + + if (action.type === REHYDRATE) { + const savedData = action.payload.route || state; + return { + ...savedData, + }; + } + + return state; +} diff --git a/js/setup.js b/js/setup.js new file mode 100644 index 000000000..656b4e411 --- /dev/null +++ b/js/setup.js @@ -0,0 +1,29 @@ + +import React, { Component } from 'react'; +import { Provider } from 'react-redux'; +import App from './App'; +import configureStore from './configureStore'; + +function setup():React.Component { + class Root extends Component { + + constructor() { + super(); + this.state = { + isLoading: false, + store: configureStore(() => this.setState({ isLoading: false })), + }; + } + + render() { + return ( + + + + ); + } + } + return Root; +} + +export default setup; diff --git a/js/themes/base-theme.js b/js/themes/base-theme.js new file mode 100644 index 000000000..1fc3fa83c --- /dev/null +++ b/js/themes/base-theme.js @@ -0,0 +1,223 @@ +import color from 'color'; + +import { Platform } from 'react-native'; + +export default { + + // Badge + badgeBg: '#ED1727', + badgeColor: '#fff', + + + // Button + btnFontFamily: (Platform.OS === 'ios') ? 'HelveticaNeue' : 'Roboto_medium', + btnDisabledBg: '#b5b5b5', + btnDisabledClr: '#f1f1f1', + + get btnPrimaryBg() { + return this.brandPrimary; + }, + get btnPrimaryColor() { + return this.inverseTextColor; + }, + get btnInfoBg() { + return this.brandInfo; + }, + get btnInfoColor() { + return this.inverseTextColor; + }, + get btnSuccessBg() { + return this.brandSuccess; + }, + get btnSuccessColor() { + return this.inverseTextColor; + }, + get btnDangerBg() { + return this.brandDanger; + }, + get btnDangerColor() { + return this.inverseTextColor; + }, + get btnWarningBg() { + return this.brandWarning; + }, + get btnWarningColor() { + return this.inverseTextColor; + }, + get btnTextSize() { + return (Platform.OS === 'ios') ? this.fontSizeBase * 1.1 : + this.fontSizeBase - 1; + }, + get btnTextSizeLarge() { + return this.fontSizeBase * 1.5; + }, + get btnTextSizeSmall() { + return this.fontSizeBase * 0.8; + }, + get borderRadiusLarge() { + return this.fontSizeBase * 3.8; + }, + + buttonPadding: 6, + + get iconSizeLarge() { + return this.iconFontSize * 1.5; + }, + get iconSizeSmall() { + return this.iconFontSize * 0.6; + }, + + + // Card + cardDefaultBg: '#fff', + + + // Check Box + checkboxBgColor: '#039BE5', + checkboxSize: 23, + checkboxTickColor: '#fff', + + + // Color + brandPrimary: '#5067FF', + brandInfo: '#5bc0de', + brandSuccess: '#5cb85c', + brandDanger: '#d9534f', + brandWarning: '#f0ad4e', + brandSidebar: '#252932', + + + // Font + fontFamily: (Platform.OS === 'ios') ? 'HelveticaNeue' : 'Roboto', + fontSizeBase: 15, + + get fontSizeH1() { + return this.fontSizeBase * 1.8; + }, + get fontSizeH2() { + return this.fontSizeBase * 1.6; + }, + get fontSizeH3() { + return this.fontSizeBase * 1.4; + }, + + + // Footer + footerHeight: 55, + footerDefaultBg: (Platform.OS === 'ios') ? '#F8F8F8' : '#4179F7', + + // FooterTab + tabBarTextColor: (Platform.OS === 'ios') ? '#6b6b6b' : '#b3c7f9', + tabBarActiveTextColor: (Platform.OS === 'ios') ? '#007aff' : '#fff', + tabActiveBgColor: (Platform.OS === 'ios') ? '#e4f0fe' : undefined, + + // Header + iosToolbarBtnColor: '#007aff', + toolbarDefaultBg: (Platform.OS === 'ios') ? '#F8F8F8' : '#4179F7', + toolbarHeight: (Platform.OS === 'ios') ? 64 : 56, + toolbarIconSize: (Platform.OS === 'ios') ? 20 : 22, + toolbarInputColor: '#CECDD2', + toolbarInverseBg: '#222', + toolbarTextColor: (Platform.OS === 'ios') ? '#000' : '#fff', + get statusBarColor() { + return color(this.toolbarDefaultBg).darken(0.2).hexString(); + }, + + + // Icon + iconFamily: 'Ionicons', + iconFontSize: (Platform.OS === 'ios') ? 30 : 28, + iconMargin: 7, + + + // InputGroup + inputFontSize: 15, + inputBorderColor: '#D9D5DC', + inputSuccessBorderColor: '#2b8339', + inputErrorBorderColor: '#ed2f2f', + + get inputColor() { + return this.textColor; + }, + get inputColorPlaceholder() { + return '#575757'; + }, + + inputGroupMarginBottom: 10, + inputHeightBase: 40, + inputPaddingLeft: 5, + + get inputPaddingLeftIcon() { + return this.inputPaddingLeft * 8; + }, + + + // Line Height + btnLineHeight: 19, + lineHeightH1: 32, + lineHeightH2: 27, + lineHeightH3: 22, + iconLineHeight: (Platform.OS === 'ios') ? 37 : 30, + lineHeight: (Platform.OS === 'ios') ? 20 : 24, + + + // List + listBorderColor: '#ACAAAB', + listDividerBg: '#ddd', + listItemHeight: 45, + listItemPadding: 9, + listNoteColor: '#808080', + listNoteSize: 13, + + + // Progress Bar + defaultProgressColor: '#E4202D', + inverseProgressColor: '#1A191B', + + + // Radio Button + radioBtnSize: (Platform.OS === 'ios') ? 25 : 23, + radioColor: '#7e7e7e', + + get radioSelectedColor() { + return color(this.radioColor).darken(0.2).hexString(); + }, + + + // Spinner + defaultSpinnerColor: '#45D56E', + inverseSpinnerColor: '#1A191B', + + + // Tabs + tabBgColor: '#F8F8F8', + tabFontSize: 15, + tabTextColor: '#fff', + + + // Text + textColor: '#000', + inverseTextColor: '#fff', + + + // Title + titleFontSize: (Platform.OS === 'ios') ? 17 : 19, + subTitleFontSize: (Platform.OS === 'ios') ? 12 : 14, + subtitleColor: '#8e8e93', + + + // Other + borderRadiusBase: (Platform.OS === 'ios') ? 5 : 2, + borderWidth: 1, + contentPadding: 10, + + get darkenHeader() { + return color(this.tabBgColor).darken(0.03).hexString(); + }, + + dropdownBg: '#000', + dropdownLinkColor: '#414142', + inputLineHeight: 24, + jumbotronBg: '#C9C9CE', + jumbotronPadding: 30, +}; diff --git a/package.json b/package.json new file mode 100644 index 000000000..756dc76b1 --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "NativebaseHackathon", + "version": "0.0.1", + "private": true, + "scripts": { + "postinstall": "remotedev-debugger", + "start": "node node_modules/react-native/local-cli/cli.js start", + "eslint": "eslint" + }, + "dependencies": { + "color": "~0.11.1", + "lodash": "^4.13.1", + "moment": "^2.13.0", + "native-base": "^0.5.8", + "react": "15.3.2", + "react-native": "0.33.0", + "react-native-code-push": "1.14.6-beta", + "react-native-easy-grid": "^0.1.6", + "react-native-modalbox": "^1.3.4", + "react-native-vector-icons": "^2.0.3", + "react-redux": "^4.4.5", + "redux": "^3.5.2", + "redux-persist": "^3.2.2", + "redux-thunk": "^2.1.0", + "remote-redux-devtools": "^0.3.3" + }, + "devDependencies": { + "babel-eslint": "^6.1.2", + "chai": "^3.5.0", + "eslint": "^3.5.0", + "eslint-config-airbnb": "^11.1.0", + "eslint-plugin-import": "^1.14.0", + "eslint-plugin-jsx-a11y": "^2.2.1", + "eslint-plugin-react": "^6.2.0", + "eslint-plugin-react-native": "^2.0.0", + "mocha": "^2.5.3", + "remote-redux-devtools-on-debugger": "^0.4.6", + "remotedev-server": "^0.1.2" + }, + "keywords": [ + "android", + "ios", + "react", + "native", + "react-native", + "native-base", + "native-modules", + "react-component", + "navbar", + "packager", + "rnpm", + "es6", + "redux", + "react-native-code-push", + "react-native boilerplate", + "react-native with redux", + "react-native with redux boilerplate", + "native-base boilerplate", + "react-native with native-base" + ] +}