@@ -0,0 +1,4 @@ | |||||
module.exports = { | |||||
root: true, | |||||
extends: '@react-native-community', | |||||
}; |
@@ -5,19 +5,18 @@ | |||||
; Ignore "BUCK" generated dirs | ; Ignore "BUCK" generated dirs | ||||
<PROJECT_ROOT>/\.buckd/ | <PROJECT_ROOT>/\.buckd/ | ||||
; Ignore unexpected extra "@providesModule" | |||||
.*/node_modules/.*/node_modules/fbjs/.* | |||||
; Ignore polyfills | |||||
node_modules/react-native/Libraries/polyfills/.* | |||||
; 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 | |||||
; These should not be required directly | |||||
; require from fbjs/lib instead: require('fbjs/lib/warning') | |||||
node_modules/warning/.* | |||||
; Ignore polyfills | |||||
.*/Libraries/polyfills/.* | |||||
; Flow doesn't support platforms | |||||
.*/Libraries/Utilities/LoadingView.js | |||||
; Ignore metro | |||||
.*/node_modules/metro/.* | |||||
[untyped] | |||||
.*/node_modules/@react-native-community/cli/.*/.* | |||||
[include] | [include] | ||||
@@ -31,39 +30,46 @@ emoji=true | |||||
esproposal.optional_chaining=enable | esproposal.optional_chaining=enable | ||||
esproposal.nullish_coalescing=enable | esproposal.nullish_coalescing=enable | ||||
module.system=haste | |||||
module.system.haste.use_name_reducers=true | |||||
# get basename | |||||
module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' | |||||
# strip .js or .js.flow suffix | |||||
module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' | |||||
# strip .ios suffix | |||||
module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' | |||||
module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' | |||||
module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' | |||||
module.system.haste.paths.blacklist=.*/__tests__/.* | |||||
module.system.haste.paths.blacklist=.*/__mocks__/.* | |||||
module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.* | |||||
module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.* | |||||
module.file_ext=.js | |||||
module.file_ext=.json | |||||
module.file_ext=.ios.js | |||||
munge_underscores=true | munge_underscores=true | ||||
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' | |||||
module.file_ext=.js | |||||
module.file_ext=.jsx | |||||
module.file_ext=.json | |||||
module.file_ext=.native.js | |||||
module.name_mapper='^react-native$' -> '<PROJECT_ROOT>/node_modules/react-native/Libraries/react-native/react-native-implementation' | |||||
module.name_mapper='^react-native/\(.*\)$' -> '<PROJECT_ROOT>/node_modules/react-native/\1' | |||||
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\)$' -> '<PROJECT_ROOT>/node_modules/react-native/Libraries/Image/RelativeImageStub' | |||||
suppress_type=$FlowIssue | suppress_type=$FlowIssue | ||||
suppress_type=$FlowFixMe | suppress_type=$FlowFixMe | ||||
suppress_type=$FlowFixMeProps | suppress_type=$FlowFixMeProps | ||||
suppress_type=$FlowFixMeState | suppress_type=$FlowFixMeState | ||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) | |||||
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ | |||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy | |||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) | |||||
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ | |||||
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError | ||||
[lints] | |||||
sketchy-null-number=warn | |||||
sketchy-null-mixed=warn | |||||
sketchy-number=warn | |||||
untyped-type-import=warn | |||||
nonstrict-import=warn | |||||
deprecated-type=warn | |||||
unsafe-getters-setters=warn | |||||
inexact-spread=warn | |||||
unnecessary-invariant=warn | |||||
signature-verification-failure=warn | |||||
deprecated-utility=error | |||||
[strict] | |||||
deprecated-type | |||||
nonstrict-import | |||||
sketchy-null | |||||
unclear-type | |||||
unsafe-getters-setters | |||||
untyped-import | |||||
untyped-type-import | |||||
[version] | [version] | ||||
^0.92.0 | |||||
^0.105.0 |
@@ -20,7 +20,6 @@ DerivedData | |||||
*.hmap | *.hmap | ||||
*.ipa | *.ipa | ||||
*.xcuserstate | *.xcuserstate | ||||
project.xcworkspace | |||||
# Android/IntelliJ | # Android/IntelliJ | ||||
# | # | ||||
@@ -40,6 +39,7 @@ yarn-error.log | |||||
buck-out/ | buck-out/ | ||||
\.buckd/ | \.buckd/ | ||||
*.keystore | *.keystore | ||||
!debug.keystore | |||||
# fastlane | # fastlane | ||||
# | # | ||||
@@ -54,3 +54,6 @@ buck-out/ | |||||
# Bundle artifact | # Bundle artifact | ||||
*.jsbundle | *.jsbundle | ||||
# CocoaPods | |||||
/ios/Pods/ |
@@ -0,0 +1,33 @@ | |||||
/** | |||||
* Sample React Native App | |||||
* https://github.com/facebook/react-native | |||||
* | |||||
* @format | |||||
* @flow | |||||
*/ | |||||
import React from "react"; | |||||
import { Provider } from "react-redux"; | |||||
import { Provider as PaperProvider } from "react-native-paper"; | |||||
import { PersistGate } from "redux-persist/lib/integration/react"; | |||||
import { persistor, store } from "./src/store"; | |||||
import Theme from "./src/ui/Theme"; | |||||
import Header from "./src/header/Header"; | |||||
import Errors from "./src/errors/Errors"; | |||||
import AppContainer from "./src/AppContainer"; | |||||
const App = () => { | |||||
return ( | |||||
<Provider store={store}> | |||||
<PersistGate persistor={persistor}> | |||||
<PaperProvider theme={Theme}> | |||||
<Header /> | |||||
<Errors /> | |||||
<AppContainer /> | |||||
</PaperProvider> | |||||
</PersistGate> | |||||
</Provider> | |||||
); | |||||
}; | |||||
export default App; |
@@ -18,6 +18,9 @@ import com.android.build.OutputFile | |||||
* // the entry file for bundle generation | * // the entry file for bundle generation | ||||
* entryFile: "index.android.js", | * entryFile: "index.android.js", | ||||
* | * | ||||
* // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format | |||||
* bundleCommand: "ram-bundle", | |||||
* | |||||
* // whether to bundle JS and assets in debug mode | * // whether to bundle JS and assets in debug mode | ||||
* bundleInDebug: false, | * bundleInDebug: false, | ||||
* | * | ||||
@@ -75,7 +78,8 @@ import com.android.build.OutputFile | |||||
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" | apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" | ||||
project.ext.react = [ | project.ext.react = [ | ||||
entryFile: "index.js" | |||||
entryFile: "index.js", | |||||
enableHermes: false, // clean and rebuild if changing | |||||
] | ] | ||||
apply from: "../../node_modules/react-native/react.gradle" | apply from: "../../node_modules/react-native/react.gradle" | ||||
@@ -95,6 +99,28 @@ def enableSeparateBuildPerCPUArchitecture = true | |||||
*/ | */ | ||||
def enableProguardInReleaseBuilds = false | def enableProguardInReleaseBuilds = false | ||||
/** | |||||
* The preferred build flavor of JavaScriptCore. | |||||
* | |||||
* For example, to use the international variant, you can use: | |||||
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'` | |||||
* | |||||
* The international variant includes ICU i18n library and necessary data | |||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that | |||||
* give correct results when using with locales other than en-US. Note that | |||||
* this variant is about 6MiB larger per architecture than default. | |||||
*/ | |||||
def jscFlavor = 'org.webkit:android-jsc:+' | |||||
/** | |||||
* Whether to enable the Hermes VM. | |||||
* | |||||
* This should be set on project.ext.react and mirrored here. If it is not set | |||||
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode | |||||
* and the benefits of using Hermes will therefore be sharply reduced. | |||||
*/ | |||||
def enableHermes = project.ext.react.get("enableHermes", false); | |||||
android { | android { | ||||
compileSdkVersion rootProject.ext.compileSdkVersion | compileSdkVersion rootProject.ext.compileSdkVersion | ||||
@@ -111,6 +137,12 @@ android { | |||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}" | versionName "${versionMajor}.${versionMinor}.${versionPatch}" | ||||
} | } | ||||
signingConfigs { | signingConfigs { | ||||
debug { | |||||
storeFile file('debug.keystore') | |||||
storePassword 'android' | |||||
keyAlias 'androiddebugkey' | |||||
keyPassword 'android' | |||||
} | |||||
release { | release { | ||||
if (project.hasProperty('LESSPASS_RELEASE_STORE_FILE')) { | if (project.hasProperty('LESSPASS_RELEASE_STORE_FILE')) { | ||||
storeFile file(LESSPASS_RELEASE_STORE_FILE) | storeFile file(LESSPASS_RELEASE_STORE_FILE) | ||||
@@ -129,6 +161,9 @@ android { | |||||
} | } | ||||
} | } | ||||
buildTypes { | buildTypes { | ||||
debug { | |||||
signingConfig signingConfigs.debug | |||||
} | |||||
release { | release { | ||||
minifyEnabled enableProguardInReleaseBuilds | minifyEnabled enableProguardInReleaseBuilds | ||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | ||||
@@ -139,25 +174,29 @@ android { | |||||
applicationVariants.all { variant -> | applicationVariants.all { variant -> | ||||
variant.outputs.each { output -> | variant.outputs.each { output -> | ||||
// For each separate APK per architecture, set a unique version code as described here: | // 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, "arm64-v8a": 3, "x86_64": 4] | |||||
// https://developer.android.com/studio/build/configure-apk-splits.html | |||||
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] | |||||
def abi = output.getFilter(OutputFile.ABI) | def abi = output.getFilter(OutputFile.ABI) | ||||
if (abi != null) { // null for the universal-debug, universal-release variants | if (abi != null) { // null for the universal-debug, universal-release variants | ||||
output.versionCodeOverride = | output.versionCodeOverride = | ||||
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
dependencies { | dependencies { | ||||
implementation fileTree(dir: "libs", include: ["*.jar"]) | implementation fileTree(dir: "libs", include: ["*.jar"]) | ||||
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" | |||||
implementation "com.facebook.react:react-native:+" // From node_modules | implementation "com.facebook.react:react-native:+" // From node_modules | ||||
implementation "com.madgag.spongycastle:core:1.58.0.0" | implementation "com.madgag.spongycastle:core:1.58.0.0" | ||||
implementation project(':react-native-touch-id') | |||||
implementation project(':react-native-keychain') | |||||
implementation project(':react-native-gesture-handler') | |||||
if (enableHermes) { | |||||
def hermesPath = "../../node_modules/hermes-engine/android/"; | |||||
debugImplementation files(hermesPath + "hermes-debug.aar") | |||||
releaseImplementation files(hermesPath + "hermes-release.aar") | |||||
} else { | |||||
implementation jscFlavor | |||||
} | |||||
testImplementation "junit:junit:4.12" | testImplementation "junit:junit:4.12" | ||||
} | } | ||||
@@ -175,3 +214,5 @@ task copyDownloadableDepsToLibs(type: Copy) { | |||||
from configurations.compile | from configurations.compile | ||||
into 'libs' | into 'libs' | ||||
} | } | ||||
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) |
@@ -8,10 +8,3 @@ | |||||
# http://developer.android.com/guide/developing/tools/proguard.html | # http://developer.android.com/guide/developing/tools/proguard.html | ||||
# Add any project specific keep options here: | # 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 *; | |||||
#} |
@@ -1,23 +1,11 @@ | |||||
package com.lesspass.android; | package com.lesspass.android; | ||||
import com.facebook.react.ReactActivity; | import com.facebook.react.ReactActivity; | ||||
import com.facebook.react.ReactActivityDelegate; | |||||
import com.facebook.react.ReactRootView; | |||||
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; | |||||
public class MainActivity extends ReactActivity { | public class MainActivity extends ReactActivity { | ||||
@Override | |||||
protected String getMainComponentName() { | |||||
return "LessPass"; | |||||
} | |||||
@Override | |||||
protected ReactActivityDelegate createReactActivityDelegate() { | |||||
return new ReactActivityDelegate(this, getMainComponentName()) { | |||||
@Override | |||||
protected ReactRootView createRootView() { | |||||
return new RNGestureHandlerEnabledRootView(MainActivity.this); | |||||
} | |||||
}; | |||||
} | |||||
@Override | |||||
protected String getMainComponentName() { | |||||
return "LessPass"; | |||||
} | |||||
} | } |
@@ -1,42 +1,37 @@ | |||||
package com.lesspass.android; | package com.lesspass.android; | ||||
import android.app.Application; | import android.app.Application; | ||||
import android.content.Context; | |||||
import com.facebook.react.PackageList; | |||||
import com.facebook.react.ReactApplication; | import com.facebook.react.ReactApplication; | ||||
import com.swmansion.gesturehandler.react.RNGestureHandlerPackage; | |||||
import com.oblador.keychain.KeychainPackage; | |||||
import com.rnfingerprint.FingerprintAuthPackage; | |||||
import com.facebook.react.ReactNativeHost; | import com.facebook.react.ReactNativeHost; | ||||
import com.facebook.react.ReactPackage; | import com.facebook.react.ReactPackage; | ||||
import com.facebook.react.shell.MainReactPackage; | |||||
import com.facebook.soloader.SoLoader; | import com.facebook.soloader.SoLoader; | ||||
import java.util.Arrays; | |||||
import java.lang.reflect.InvocationTargetException; | |||||
import java.util.List; | import java.util.List; | ||||
public class MainApplication extends Application implements ReactApplication { | public class MainApplication extends Application implements ReactApplication { | ||||
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { | |||||
@Override | |||||
public boolean getUseDeveloperSupport() { | |||||
return BuildConfig.DEBUG; | |||||
} | |||||
private final ReactNativeHost mReactNativeHost = | |||||
new ReactNativeHost(this) { | |||||
@Override | |||||
public boolean getUseDeveloperSupport() { | |||||
return BuildConfig.DEBUG; | |||||
} | |||||
@Override | |||||
protected List<ReactPackage> getPackages() { | |||||
return Arrays.<ReactPackage>asList( | |||||
new MainReactPackage(), | |||||
new RNGestureHandlerPackage(), | |||||
new KeychainPackage(), | |||||
new FingerprintAuthPackage(), | |||||
new LessPassReactPackage() | |||||
); | |||||
} | |||||
@Override | |||||
protected List<ReactPackage> getPackages() { | |||||
@SuppressWarnings("UnnecessaryLocalVariable") | |||||
List<ReactPackage> packages = new PackageList(this).getPackages(); | |||||
packages.add(new LessPassReactPackage()); | |||||
return packages; | |||||
} | |||||
@Override | |||||
protected String getJSMainModuleName() { | |||||
return "index"; | |||||
} | |||||
}; | |||||
@Override | |||||
protected String getJSMainModuleName() { | |||||
return "index"; | |||||
} | |||||
}; | |||||
@Override | @Override | ||||
public ReactNativeHost getReactNativeHost() { | public ReactNativeHost getReactNativeHost() { | ||||
@@ -47,5 +42,32 @@ public class MainApplication extends Application implements ReactApplication { | |||||
public void onCreate() { | public void onCreate() { | ||||
super.onCreate(); | super.onCreate(); | ||||
SoLoader.init(this, /* native exopackage */ false); | SoLoader.init(this, /* native exopackage */ false); | ||||
initializeFlipper(this); // Remove this line if you don't want Flipper enabled | |||||
} | |||||
/** | |||||
* Loads Flipper in React Native templates. | |||||
* | |||||
* @param context | |||||
*/ | |||||
private static void initializeFlipper(Context context) { | |||||
if (BuildConfig.DEBUG) { | |||||
try { | |||||
/* | |||||
We use reflection here to pick up the class that initializes Flipper, | |||||
since Flipper library is not available in release mode | |||||
*/ | |||||
Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper"); | |||||
aClass.getMethod("initializeFlipper", Context.class).invoke(null, context); | |||||
} catch (ClassNotFoundException e) { | |||||
e.printStackTrace(); | |||||
} catch (NoSuchMethodException e) { | |||||
e.printStackTrace(); | |||||
} catch (IllegalAccessException e) { | |||||
e.printStackTrace(); | |||||
} catch (InvocationTargetException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} | } | ||||
} | } |
@@ -7,7 +7,7 @@ buildscript { | |||||
jcenter() | jcenter() | ||||
} | } | ||||
dependencies { | dependencies { | ||||
classpath 'com.android.tools.build:gradle:3.3.1' | |||||
classpath("com.android.tools.build:gradle:3.4.2") | |||||
// NOTE: Do not place your application dependencies here; they belong | // NOTE: Do not place your application dependencies here; they belong | ||||
// in the individual module build.gradle files | // in the individual module build.gradle files | ||||
@@ -17,12 +17,18 @@ buildscript { | |||||
allprojects { | allprojects { | ||||
repositories { | repositories { | ||||
mavenLocal() | mavenLocal() | ||||
google() | |||||
jcenter() | |||||
maven { | maven { | ||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm | ||||
url "$rootDir/../node_modules/react-native/android" | |||||
url("$rootDir/../node_modules/react-native/android") | |||||
} | |||||
maven { | |||||
// Android JSC is installed from npm | |||||
url("$rootDir/../node_modules/jsc-android/dist") | |||||
} | } | ||||
google() | |||||
jcenter() | |||||
maven { url 'https://jitpack.io' } | |||||
} | } | ||||
} | } | ||||
@@ -31,7 +37,6 @@ ext { | |||||
minSdkVersion = 21 | minSdkVersion = 21 | ||||
compileSdkVersion = 28 | compileSdkVersion = 28 | ||||
targetSdkVersion = 28 | targetSdkVersion = 28 | ||||
supportLibVersion = "28.0.0" | |||||
def npmVersion = getNpmVersionArray() | def npmVersion = getNpmVersionArray() | ||||
versionMajor = npmVersion[0] | versionMajor = npmVersion[0] | ||||
versionMinor = npmVersion[1] | versionMinor = npmVersion[1] | ||||
@@ -16,5 +16,6 @@ | |||||
# This option should only be used with decoupled projects. More details, visit | # 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 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||||
# org.gradle.parallel=true | # org.gradle.parallel=true | ||||
android.useAndroidX=true | android.useAndroidX=true | ||||
android.enableJetifier=true | |||||
android.enableJetifier=true |
@@ -1,5 +1,5 @@ | |||||
distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||
distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip | |||||
zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||
zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip |
@@ -1,5 +1,21 @@ | |||||
#!/usr/bin/env sh | #!/usr/bin/env sh | ||||
# | |||||
# Copyright 2015 the original author or authors. | |||||
# | |||||
# Licensed under the Apache License, Version 2.0 (the "License"); | |||||
# you may not use this file except in compliance with the License. | |||||
# You may obtain a copy of the License at | |||||
# | |||||
# http://www.apache.org/licenses/LICENSE-2.0 | |||||
# | |||||
# Unless required by applicable law or agreed to in writing, software | |||||
# distributed under the License is distributed on an "AS IS" BASIS, | |||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
# See the License for the specific language governing permissions and | |||||
# limitations under the License. | |||||
# | |||||
############################################################################## | ############################################################################## | ||||
## | ## | ||||
## Gradle start up script for UN*X | ## Gradle start up script for UN*X | ||||
@@ -28,7 +44,7 @@ APP_NAME="Gradle" | |||||
APP_BASE_NAME=`basename "$0"` | APP_BASE_NAME=`basename "$0"` | ||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
DEFAULT_JVM_OPTS="" | |||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |||||
# Use the maximum available, or set MAX_FD != -1 to use that value. | # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
MAX_FD="maximum" | MAX_FD="maximum" | ||||
@@ -1,3 +1,19 @@ | |||||
@rem | |||||
@rem Copyright 2015 the original author or authors. | |||||
@rem | |||||
@rem Licensed under the Apache License, Version 2.0 (the "License"); | |||||
@rem you may not use this file except in compliance with the License. | |||||
@rem You may obtain a copy of the License at | |||||
@rem | |||||
@rem http://www.apache.org/licenses/LICENSE-2.0 | |||||
@rem | |||||
@rem Unless required by applicable law or agreed to in writing, software | |||||
@rem distributed under the License is distributed on an "AS IS" BASIS, | |||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
@rem See the License for the specific language governing permissions and | |||||
@rem limitations under the License. | |||||
@rem | |||||
@if "%DEBUG%" == "" @echo off | @if "%DEBUG%" == "" @echo off | ||||
@rem ########################################################################## | @rem ########################################################################## | ||||
@rem | @rem | ||||
@@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0 | |||||
set APP_HOME=%DIRNAME% | set APP_HOME=%DIRNAME% | ||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | @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 DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |||||
@rem Find java.exe | @rem Find java.exe | ||||
if defined JAVA_HOME goto findJavaFromJavaHome | if defined JAVA_HOME goto findJavaFromJavaHome | ||||
@@ -1,8 +0,0 @@ | |||||
keystore( | |||||
name = "debug", | |||||
properties = "debug.keystore.properties", | |||||
store = "debug.keystore", | |||||
visibility = [ | |||||
"PUBLIC", | |||||
], | |||||
) |
@@ -1,4 +0,0 @@ | |||||
key.store=debug.keystore | |||||
key.alias=androiddebugkey | |||||
key.store.password=android | |||||
key.alias.password=android |
@@ -1,9 +1,3 @@ | |||||
rootProject.name = 'LessPass' | rootProject.name = 'LessPass' | ||||
include ':react-native-gesture-handler' | |||||
project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android') | |||||
include ':react-native-keychain' | |||||
project(':react-native-keychain').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keychain/android') | |||||
include ':react-native-touch-id' | |||||
project(':react-native-touch-id').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-touch-id/android') | |||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) | |||||
include ':app' | include ':app' |
@@ -1,5 +1,9 @@ | |||||
/** | |||||
* @format | |||||
*/ | |||||
import {AppRegistry} from 'react-native'; | import {AppRegistry} from 'react-native'; | ||||
import App from './src/App'; | |||||
import App from './App'; | |||||
import {name as appName} from './app.json'; | import {name as appName} from './app.json'; | ||||
AppRegistry.registerComponent(appName, () => App); | AppRegistry.registerComponent(appName, () => App); |
@@ -7,7 +7,7 @@ | |||||
<key>CFBundleExecutable</key> | <key>CFBundleExecutable</key> | ||||
<string>$(EXECUTABLE_NAME)</string> | <string>$(EXECUTABLE_NAME)</string> | ||||
<key>CFBundleIdentifier</key> | <key>CFBundleIdentifier</key> | ||||
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string> | |||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||||
<key>CFBundleInfoDictionaryVersion</key> | <key>CFBundleInfoDictionaryVersion</key> | ||||
<string>6.0</string> | <string>6.0</string> | ||||
<key>CFBundleName</key> | <key>CFBundleName</key> | ||||
@@ -22,6 +22,19 @@ | |||||
<string>1</string> | <string>1</string> | ||||
<key>LSRequiresIPhoneOS</key> | <key>LSRequiresIPhoneOS</key> | ||||
<true/> | <true/> | ||||
<key>NSAppTransportSecurity</key> | |||||
<dict> | |||||
<key>NSExceptionDomains</key> | |||||
<dict> | |||||
<key>localhost</key> | |||||
<dict> | |||||
<key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
<true/> | |||||
</dict> | |||||
</dict> | |||||
</dict> | |||||
<key>NSLocationWhenInUseUsageDescription</key> | |||||
<string></string> | |||||
<key>UILaunchStoryboardName</key> | <key>UILaunchStoryboardName</key> | ||||
<string>LaunchScreen</string> | <string>LaunchScreen</string> | ||||
<key>UIRequiredDeviceCapabilities</key> | <key>UIRequiredDeviceCapabilities</key> | ||||
@@ -36,19 +49,5 @@ | |||||
</array> | </array> | ||||
<key>UIViewControllerBasedStatusBarAppearance</key> | <key>UIViewControllerBasedStatusBarAppearance</key> | ||||
<false/> | <false/> | ||||
<key>NSLocationWhenInUseUsageDescription</key> | |||||
<string></string> | |||||
<key>NSAppTransportSecurity</key> | |||||
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ --> | |||||
<dict> | |||||
<key>NSExceptionDomains</key> | |||||
<dict> | |||||
<key>localhost</key> | |||||
<dict> | |||||
<key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
<true/> | |||||
</dict> | |||||
</dict> | |||||
</dict> | |||||
</dict> | </dict> | ||||
</plist> | </plist> |
@@ -24,6 +24,19 @@ | |||||
<string>1</string> | <string>1</string> | ||||
<key>LSRequiresIPhoneOS</key> | <key>LSRequiresIPhoneOS</key> | ||||
<true/> | <true/> | ||||
<key>NSAppTransportSecurity</key> | |||||
<dict> | |||||
<key>NSAllowsArbitraryLoads</key> | |||||
<true/> | |||||
<key>NSExceptionDomains</key> | |||||
<dict> | |||||
<key>localhost</key> | |||||
<dict> | |||||
<key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
<true/> | |||||
</dict> | |||||
</dict> | |||||
</dict> | |||||
<key>NSLocationWhenInUseUsageDescription</key> | <key>NSLocationWhenInUseUsageDescription</key> | ||||
<string></string> | <string></string> | ||||
<key>UILaunchStoryboardName</key> | <key>UILaunchStoryboardName</key> | ||||
@@ -40,21 +53,5 @@ | |||||
</array> | </array> | ||||
<key>UIViewControllerBasedStatusBarAppearance</key> | <key>UIViewControllerBasedStatusBarAppearance</key> | ||||
<false/> | <false/> | ||||
<key>NSLocationWhenInUseUsageDescription</key> | |||||
<string></string> | |||||
<key>NSAppTransportSecurity</key> | |||||
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ --> | |||||
<dict> | |||||
<key>NSAllowsArbitraryLoads</key> | |||||
<true/> | |||||
<key>NSExceptionDomains</key> | |||||
<dict> | |||||
<key>localhost</key> | |||||
<dict> | |||||
<key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
<true/> | |||||
</dict> | |||||
</dict> | |||||
</dict> | |||||
</dict> | </dict> | ||||
</plist> | </plist> |
@@ -12,7 +12,7 @@ | |||||
#import <React/RCTRootView.h> | #import <React/RCTRootView.h> | ||||
#define TIMEOUT_SECONDS 600 | #define TIMEOUT_SECONDS 600 | ||||
#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" | |||||
#define TEXT_TO_LOOK_FOR @"Welcome to React" | |||||
@interface LessPassTests : XCTestCase | @interface LessPassTests : XCTestCase | ||||
@@ -40,11 +40,13 @@ | |||||
BOOL foundElement = NO; | BOOL foundElement = NO; | ||||
__block NSString *redboxError = nil; | __block NSString *redboxError = nil; | ||||
#ifdef DEBUG | |||||
RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { | ||||
if (level >= RCTLogLevelError) { | if (level >= RCTLogLevelError) { | ||||
redboxError = message; | redboxError = message; | ||||
} | } | ||||
}); | }); | ||||
#endif | |||||
while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { | ||||
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; | ||||
@@ -57,8 +59,10 @@ | |||||
return NO; | return NO; | ||||
}]; | }]; | ||||
} | } | ||||
#ifdef DEBUG | |||||
RCTSetLogFunction(RCTDefaultLogFunction); | RCTSetLogFunction(RCTDefaultLogFunction); | ||||
#endif | |||||
XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); | ||||
XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); | ||||
@@ -0,0 +1,53 @@ | |||||
platform :ios, '9.0' | |||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' | |||||
target 'LessPass' do | |||||
# Pods for LessPass | |||||
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" | |||||
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" | |||||
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" | |||||
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" | |||||
pod 'React', :path => '../node_modules/react-native/' | |||||
pod 'React-Core', :path => '../node_modules/react-native/' | |||||
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' | |||||
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' | |||||
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' | |||||
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' | |||||
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' | |||||
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' | |||||
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' | |||||
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' | |||||
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' | |||||
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' | |||||
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' | |||||
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' | |||||
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' | |||||
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' | |||||
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' | |||||
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' | |||||
pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon" | |||||
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" | |||||
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' | |||||
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' | |||||
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' | |||||
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' | |||||
target 'LessPassTests' do | |||||
inherit! :search_paths | |||||
# Pods for testing | |||||
end | |||||
use_native_modules! | |||||
end | |||||
target 'LessPass-tvOS' do | |||||
# Pods for LessPass-tvOS | |||||
target 'LessPass-tvOSTests' do | |||||
inherit! :search_paths | |||||
# Pods for testing | |||||
end | |||||
end |
@@ -9,40 +9,44 @@ | |||||
"url": "https://guillaumevincent.com" | "url": "https://guillaumevincent.com" | ||||
}, | }, | ||||
"scripts": { | "scripts": { | ||||
"start": "node node_modules/react-native/local-cli/cli.js start", | |||||
"android": "react-native run-android", | |||||
"ios": "react-native run-ios", | |||||
"start": "react-native start", | |||||
"test": "jest", | "test": "jest", | ||||
"postinstall": "jetify" | |||||
"lint": "eslint ." | |||||
}, | }, | ||||
"dependencies": { | "dependencies": { | ||||
"axios": "0.19.0", | |||||
"debounce": "1.2.0", | |||||
"fuse.js": "^3.4.4", | |||||
"@react-native-community/async-storage": "^1.6.2", | |||||
"axios": "^0.19.0", | |||||
"fuse.js": "^3.4.5", | |||||
"lesspass-fingerprint": "latest", | "lesspass-fingerprint": "latest", | ||||
"lesspass-render-password": "latest", | "lesspass-render-password": "latest", | ||||
"lodash": "^4.17.15", | "lodash": "^4.17.15", | ||||
"memoize-one": "^5.0.4", | |||||
"react": "^16.8.6", | |||||
"react-native": "^0.60.5", | |||||
"react-native-gesture-handler": "^1.1.0", | |||||
"react-native-keychain": "^3.1.1", | |||||
"react-native-paper": "^2.15.2", | |||||
"memoize-one": "^5.1.1", | |||||
"react": "16.9.0", | |||||
"react-native": "0.61.2", | |||||
"react-native-gesture-handler": "^1.4.1", | |||||
"react-native-keychain": "^4.0.1", | |||||
"react-native-paper": "^3.0.0", | |||||
"react-native-touch-id": "^4.4.1", | "react-native-touch-id": "^4.4.1", | ||||
"react-native-vector-icons": "^6.4.2", | |||||
"react-navigation": "^4.0.0", | |||||
"react-navigation-material-bottom-tabs": "^1.1.1", | |||||
"react-redux": "^7.0.1", | |||||
"redux": "^4.0.1", | |||||
"react-native-vector-icons": "^6.6.0", | |||||
"react-navigation": "^4.0.10", | |||||
"react-navigation-material-bottom-tabs": "^2.1.3", | |||||
"react-navigation-stack": "^1.10.2", | |||||
"react-redux": "^7.1.1", | |||||
"redux": "^4.0.4", | |||||
"redux-persist": "^6.0.0", | "redux-persist": "^6.0.0", | ||||
"redux-thunk": "2.3.0" | |||||
"redux-thunk": "^2.3.0" | |||||
}, | }, | ||||
"devDependencies": { | "devDependencies": { | ||||
"@babel/core": "^7.4.3", | |||||
"@babel/runtime": "^7.4.3", | |||||
"babel-jest": "^24.7.1", | |||||
"jest": "^24.7.1", | |||||
"jetifier": "^1.6.4", | |||||
"@babel/core": "^7.6.4", | |||||
"@babel/runtime": "^7.6.3", | |||||
"@react-native-community/eslint-config": "^0.0.5", | |||||
"babel-jest": "^24.9.0", | |||||
"eslint": "^6.5.1", | |||||
"jest": "^24.9.0", | |||||
"metro-react-native-babel-preset": "^0.56.0", | "metro-react-native-babel-preset": "^0.56.0", | ||||
"react-test-renderer": "^16.8.6" | |||||
"react-test-renderer": "16.9.0" | |||||
}, | }, | ||||
"jest": { | "jest": { | ||||
"preset": "react-native" | "preset": "react-native" | ||||
@@ -1,19 +1,13 @@ | |||||
import React, { Component } from "react"; | |||||
import { Provider } from "react-redux"; | |||||
import { Provider as PaperProvider } from "react-native-paper"; | |||||
import React from "react"; | |||||
import { createMaterialBottomTabNavigator } from "react-navigation-material-bottom-tabs"; | import { createMaterialBottomTabNavigator } from "react-navigation-material-bottom-tabs"; | ||||
import Icon from "react-native-vector-icons/FontAwesome"; | import Icon from "react-native-vector-icons/FontAwesome"; | ||||
import { PersistGate } from "redux-persist/lib/integration/react"; | |||||
import { createAppContainer, createSwitchNavigator } from "react-navigation"; | import { createAppContainer, createSwitchNavigator } from "react-navigation"; | ||||
import { persistor, store } from "./store"; | |||||
import AuthStack from "./auth/AuthStack"; | import AuthStack from "./auth/AuthStack"; | ||||
import AuthLoadingScreen from "./auth/AuthLoadingScreen"; | import AuthLoadingScreen from "./auth/AuthLoadingScreen"; | ||||
import HelpScreen from "./help/HelpScreen"; | import HelpScreen from "./help/HelpScreen"; | ||||
import PasswordGeneratorScreen from "./password/PasswordGeneratorScreen"; | import PasswordGeneratorScreen from "./password/PasswordGeneratorScreen"; | ||||
import SettingsScreen from "./settings/SettingsScreen"; | import SettingsScreen from "./settings/SettingsScreen"; | ||||
import Theme from "./ui/Theme"; | import Theme from "./ui/Theme"; | ||||
import Header from "./header/Header"; | |||||
import Errors from "./errors/Errors"; | |||||
const commonTabs = { | const commonTabs = { | ||||
PasswordGenerator: { | PasswordGenerator: { | ||||
@@ -89,20 +83,4 @@ const AppContainer = createAppContainer( | |||||
) | ) | ||||
); | ); | ||||
class App extends Component { | |||||
render() { | |||||
return ( | |||||
<Provider store={store}> | |||||
<PersistGate persistor={persistor}> | |||||
<PaperProvider theme={Theme}> | |||||
<Header /> | |||||
<Errors /> | |||||
<AppContainer /> | |||||
</PaperProvider> | |||||
</PersistGate> | |||||
</Provider> | |||||
); | |||||
} | |||||
} | |||||
export default App; | |||||
export default AppContainer; |
@@ -1,4 +1,4 @@ | |||||
import { createStackNavigator } from "react-navigation"; | |||||
import { createStackNavigator } from "react-navigation-stack"; | |||||
import SignInScreen from "./SignInScreen"; | import SignInScreen from "./SignInScreen"; | ||||
import SignUpScreen from "./SignUpScreen"; | import SignUpScreen from "./SignUpScreen"; | ||||
@@ -1,7 +1,7 @@ | |||||
import React from "react"; | import React from "react"; | ||||
import { createStore, applyMiddleware, combineReducers } from "redux"; | import { createStore, applyMiddleware, combineReducers } from "redux"; | ||||
import { persistStore, persistReducer } from "redux-persist"; | import { persistStore, persistReducer } from "redux-persist"; | ||||
import storage from "redux-persist/lib/storage"; | |||||
import AsyncStorage from "@react-native-community/async-storage"; | |||||
import stateReconciler from "redux-persist/lib/stateReconciler/autoMergeLevel2"; | import stateReconciler from "redux-persist/lib/stateReconciler/autoMergeLevel2"; | ||||
import thunk from "redux-thunk"; | import thunk from "redux-thunk"; | ||||
@@ -19,7 +19,7 @@ const rootReducer = combineReducers({ | |||||
const persistConfig = { | const persistConfig = { | ||||
key: "root", | key: "root", | ||||
storage, | |||||
storage: AsyncStorage, | |||||
stateReconciler, | stateReconciler, | ||||
whitelist: ["settings", "auth"] | whitelist: ["settings", "auth"] | ||||
}; | }; | ||||