├── .buckconfig ├── .eslintrc.js ├── .flowconfig ├── .gitignore ├── .prettierrc.js ├── .ruby-version ├── .vscode └── settings.json ├── .watchmanconfig ├── App.js ├── Gemfile ├── Gemfile.lock ├── android ├── app │ ├── _BUCK │ ├── build.gradle │ ├── build_defs.bzl │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── react-native-otp │ │ │ └── ReactNativeFlipper.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── reactnativeotp │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── drawable │ │ └── rn_edit_text_material.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── babel.config.js ├── images ├── 1.jpg ├── 2.jpg └── 3.jpg ├── index.js ├── ios ├── Podfile ├── Podfile.lock ├── reactnativeotp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ ├── react-native-otp-tvOS.xcscheme │ │ └── react-native-otp.xcscheme ├── reactnativeotp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── reactnativeotp │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ └── LaunchScreen.xib │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ └── Icon-App-60x60@3x.png │ └── Contents.json │ ├── Info.plist │ └── main.m ├── package.json ├── readme.md ├── shim.js ├── src ├── animations │ ├── graminsta │ │ ├── graminsta-gem-border.json │ │ └── images │ │ │ ├── 1circle_active.png │ │ │ └── circle_active.png │ ├── loader_spinner.json │ ├── love_it.json │ └── package.json ├── assets │ ├── images │ │ ├── logo.png │ │ └── splash.png │ └── package.json ├── components │ ├── Icon-Entypo.js │ ├── Icon-Ionicons.js │ ├── Icon-Text.js │ ├── Icon.js │ ├── index.js │ └── package.json ├── index.js ├── lib │ ├── async-helpers.js │ ├── authorize-service.js │ ├── constants.js │ ├── icon-types.js │ ├── otp.js │ ├── package.json │ ├── settings.js │ └── storage.js ├── navigations │ ├── Root-Navigation.js │ └── package.json └── screens │ ├── barcode │ ├── Layout.js │ ├── index.js │ └── style.js │ ├── home │ ├── Layout.js │ ├── index.js │ └── style.js │ ├── otp │ ├── Layout.js │ ├── index.js │ └── style.js │ ├── package.json │ └── unauthorized │ ├── Layout.js │ ├── index.js │ └── style.js └── yarn.lock /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: '@react-native-community', 4 | }; -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore polyfills 9 | node_modules/react-native/Libraries/polyfills/.* 10 | 11 | ; Flow doesn't support platforms 12 | .*/Libraries/Utilities/LoadingView.js 13 | [untyped] 14 | .*/node_modules/@react-native-community/cli/.*/.* 15 | 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/interface.js 21 | node_modules/react-native/flow/ 22 | node_modules/react-native/flow-github/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | esproposal.optional_chaining=enable 28 | esproposal.nullish_coalescing=enable 29 | 30 | module.system=haste 31 | module.system.haste.use_name_reducers=true 32 | # get basename 33 | module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' 34 | # strip .js or .js.flow suffix 35 | module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' 36 | # strip .ios suffix 37 | module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' 38 | module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' 39 | module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' 40 | module.system.haste.paths.blacklist=.*/__tests__/.* 41 | module.system.haste.paths.blacklist=.*/__mocks__/.* 42 | module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* 43 | module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* 44 | 45 | exact_by_default=true 46 | format.bracket_spacing=false 47 | 48 | module.file_ext=.js 49 | module.file_ext=.json 50 | module.file_ext=.ios.js 51 | 52 | munge_underscores=true 53 | module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' 54 | 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\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' 55 | 56 | suppress_type=$FlowIssue 57 | suppress_type=$FlowFixMe 58 | suppress_type=$FlowFixMeProps 59 | suppress_type=$FlowFixMeState 60 | 61 | [lints] 62 | sketchy-null-number=warn 63 | sketchy-null-mixed=warn 64 | sketchy-number=warn 65 | untyped-type-import=warn 66 | nonstrict-import=warn 67 | deprecated-type=warn 68 | unsafe-getters-setters=warn 69 | unnecessary-invariant=warn 70 | signature-verification-failure=warn 71 | [strict] 72 | deprecated-type 73 | nonstrict-import 74 | sketchy-null 75 | unclear-type 76 | unsafe-getters-setters 77 | untyped-import 78 | untyped-type-import 79 | 80 | [version] 81 | ^0.162.0 82 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | 24 | # Android/IntelliJ 25 | # 26 | build/ 27 | .idea 28 | .gradle 29 | local.properties 30 | *.iml 31 | *.hprof 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | !debug.keystore 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://docs.fastlane.tools/best-practices/source-control/ 51 | 52 | */fastlane/report.xml 53 | */fastlane/Preview.html 54 | */fastlane/screenshots 55 | 56 | # Bundle artifact 57 | *.jsbundle 58 | 59 | # CocoaPods 60 | /ios/Pods/ -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: false, 3 | jsxBracketSameLine: true, 4 | singleQuote: true, 5 | trailingComma: 'all', 6 | arrowParens: 'avoid', 7 | }; -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.7.4 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "java.configuration.updateBuildConfiguration": "automatic" 3 | } -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import Root from "./src"; 3 | 4 | export default class App extends Component { 5 | render() { 6 | return ( 7 | 8 | ); 9 | } 10 | } -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 4 | ruby '2.7.4' 5 | 6 | gem 'cocoapods', '~> 1.11', '>= 1.11.2' -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | dden comment 2 | GEM 3 | remote: https://rubygems.org/ 4 | specs: 5 | CFPropertyList (3.0.5) 6 | rexml 7 | activesupport (6.1.4.4) 8 | concurrent-ruby (~> 1.0, >= 1.0.2) 9 | i18n (>= 1.6, < 2) 10 | minitest (>= 5.1) 11 | tzinfo (~> 2.0) 12 | zeitwerk (~> 2.3) 13 | addressable (2.8.0) 14 | public_suffix (>= 2.0.2, < 5.0) 15 | algoliasearch (1.27.5) 16 | httpclient (~> 2.8, >= 2.8.3) 17 | json (>= 1.5.1) 18 | atomos (0.1.3) 19 | claide (1.1.0) 20 | cocoapods (1.11.2) 21 | addressable (~> 2.8) 22 | claide (>= 1.0.2, < 2.0) 23 | cocoapods-core (= 1.11.2) 24 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 25 | cocoapods-downloader (>= 1.4.0, < 2.0) 26 | cocoapods-plugins (>= 1.0.0, < 2.0) 27 | cocoapods-search (>= 1.0.0, < 2.0) 28 | cocoapods-trunk (>= 1.4.0, < 2.0) 29 | cocoapods-try (>= 1.1.0, < 2.0) 30 | colored2 (~> 3.1) 31 | escape (~> 0.0.4) 32 | fourflusher (>= 2.3.0, < 3.0) 33 | gh_inspector (~> 1.0) 34 | molinillo (~> 0.8.0) 35 | nap (~> 1.0) 36 | ruby-macho (>= 1.0, < 3.0) 37 | xcodeproj (>= 1.21.0, < 2.0) 38 | cocoapods-core (1.11.2) 39 | activesupport (>= 5.0, < 7) 40 | addressable (~> 2.8) 41 | algoliasearch (~> 1.0) 42 | concurrent-ruby (~> 1.1) 43 | fuzzy_match (~> 2.0.4) 44 | nap (~> 1.0) 45 | netrc (~> 0.11) 46 | public_suffix (~> 4.0) 47 | typhoeus (~> 1.0) 48 | cocoapods-deintegrate (1.0.5) 49 | cocoapods-downloader (1.5.1) 50 | cocoapods-plugins (1.0.0) 51 | nap 52 | cocoapods-search (1.0.1) 53 | cocoapods-trunk (1.6.0) 54 | nap (>= 0.8, < 2.0) 55 | netrc (~> 0.11) 56 | cocoapods-try (1.2.0) 57 | colored2 (3.1.2) 58 | concurrent-ruby (1.1.9) 59 | escape (0.0.4) 60 | ethon (0.15.0) 61 | ffi (>= 1.15.0) 62 | ffi (1.15.5) 63 | fourflusher (2.3.1) 64 | fuzzy_match (2.0.4) 65 | gh_inspector (1.1.3) 66 | httpclient (2.8.3) 67 | i18n (1.9.1) 68 | concurrent-ruby (~> 1.0) 69 | json (2.6.1) 70 | minitest (5.15.0) 71 | molinillo (0.8.0) 72 | nanaimo (0.3.0) 73 | nap (1.1.0) 74 | netrc (0.11.0) 75 | public_suffix (4.0.6) 76 | rexml (3.2.5) 77 | ruby-macho (2.5.1) 78 | typhoeus (1.4.0) 79 | ethon (>= 0.9.0) 80 | tzinfo (2.0.4) 81 | concurrent-ruby (~> 1.0) 82 | xcodeproj (1.21.0) 83 | CFPropertyList (>= 2.3.3, < 4.0) 84 | atomos (~> 0.1.3) 85 | claide (>= 1.0.2, < 2.0) 86 | colored2 (~> 3.1) 87 | nanaimo (~> 0.3.0) 88 | rexml (~> 3.2.4) 89 | zeitwerk (2.5.4) 90 | PLATFORMS 91 | ruby 92 | DEPENDENCIES 93 | cocoapods (~> 1.11, >= 1.11.2) 94 | RUBY VERSION 95 | ruby 2.7.4p191 96 | BUNDLED WITH 97 | 2.2.27 -------------------------------------------------------------------------------- /android/app/_BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") 12 | 13 | lib_deps = [] 14 | 15 | create_aar_targets(glob(["libs/*.aar"])) 16 | 17 | create_jar_targets(glob(["libs/*.jar"])) 18 | 19 | android_library( 20 | name = "all-libs", 21 | exported_deps = lib_deps, 22 | ) 23 | 24 | android_library( 25 | name = "app-code", 26 | srcs = glob([ 27 | "src/main/java/**/*.java", 28 | ]), 29 | deps = [ 30 | ":all-libs", 31 | ":build_config", 32 | ":res", 33 | ], 34 | ) 35 | 36 | android_build_config( 37 | name = "build_config", 38 | package = "com.reactnativeotp", 39 | ) 40 | 41 | android_resource( 42 | name = "res", 43 | package = "com.reactnativeotp", 44 | res = "src/main/res", 45 | ) 46 | 47 | android_binary( 48 | name = "app", 49 | keystore = "//android/keystores:debug", 50 | manifest = "src/main/AndroidManifest.xml", 51 | package_type = "debug", 52 | deps = [ 53 | ":app-code", 54 | ], 55 | ) 56 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation. If none specified and 19 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is 20 | * // default. Can be overridden with ENTRY_FILE environment variable. 21 | * entryFile: "index.android.js", 22 | * 23 | * // https://reactnative.dev/docs/performance#enable-the-ram-format 24 | * bundleCommand: "ram-bundle", 25 | * 26 | * // whether to bundle JS and assets in debug mode 27 | * bundleInDebug: false, 28 | * 29 | * // whether to bundle JS and assets in release mode 30 | * bundleInRelease: true, 31 | * 32 | * // whether to bundle JS and assets in another build variant (if configured). 33 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 34 | * // The configuration property can be in the following formats 35 | * // 'bundleIn${productFlavor}${buildType}' 36 | * // 'bundleIn${buildType}' 37 | * // bundleInFreeDebug: true, 38 | * // bundleInPaidRelease: true, 39 | * // bundleInBeta: true, 40 | * 41 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 42 | * // for example: to disable dev mode in the staging build type (if configured) 43 | * devDisabledInStaging: true, 44 | * // The configuration property can be in the following formats 45 | * // 'devDisabledIn${productFlavor}${buildType}' 46 | * // 'devDisabledIn${buildType}' 47 | * 48 | * // the root of your project, i.e. where "package.json" lives 49 | * root: "../../", 50 | * 51 | * // where to put the JS bundle asset in debug mode 52 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 53 | * 54 | * // where to put the JS bundle asset in release mode 55 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 56 | * 57 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 58 | * // require('./image.png')), in debug mode 59 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 60 | * 61 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 62 | * // require('./image.png')), in release mode 63 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 64 | * 65 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 66 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 67 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 68 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 69 | * // for example, you might want to remove it from here. 70 | * inputExcludes: ["android/**", "ios/**"], 71 | * 72 | * // override which node gets called and with what additional arguments 73 | * nodeExecutableAndArgs: ["node"], 74 | * 75 | * // supply additional arguments to the packager 76 | * extraPackagerArgs: [] 77 | * ] 78 | */ 79 | 80 | project.ext.react = [ 81 | enableHermes: true, // clean and rebuild if changing 82 | ] 83 | 84 | apply from: "../../node_modules/react-native/react.gradle" 85 | 86 | /** 87 | * Set this to true to create two separate APKs instead of one: 88 | * - An APK that only works on ARM devices 89 | * - An APK that only works on x86 devices 90 | * The advantage is the size of the APK is reduced by about 4MB. 91 | * Upload all the APKs to the Play Store and people will download 92 | * the correct one based on the CPU architecture of their device. 93 | */ 94 | def enableSeparateBuildPerCPUArchitecture = false 95 | 96 | /** 97 | * Run Proguard to shrink the Java bytecode in release builds. 98 | */ 99 | def enableProguardInReleaseBuilds = false 100 | 101 | /** 102 | * The preferred build flavor of JavaScriptCore. 103 | * 104 | * For example, to use the international variant, you can use: 105 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 106 | * 107 | * The international variant includes ICU i18n library and necessary data 108 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 109 | * give correct results when using with locales other than en-US. Note that 110 | * this variant is about 6MiB larger per architecture than default. 111 | */ 112 | def jscFlavor = 'org.webkit:android-jsc:+' 113 | 114 | /** 115 | * Whether to enable the Hermes VM. 116 | * 117 | * This should be set on project.ext.react and that value will be read here. If it is not set 118 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode 119 | * and the benefits of using Hermes will therefore be sharply reduced. 120 | */ 121 | def enableHermes = project.ext.react.get("enableHermes", false); 122 | 123 | /** 124 | * Architectures to build native code for in debug. 125 | */ 126 | def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures") 127 | 128 | android { 129 | ndkVersion rootProject.ext.ndkVersion 130 | 131 | compileSdkVersion rootProject.ext.compileSdkVersion 132 | 133 | defaultConfig { 134 | applicationId "com.reactnativeotp" 135 | minSdkVersion rootProject.ext.minSdkVersion 136 | targetSdkVersion rootProject.ext.targetSdkVersion 137 | versionCode 1 138 | versionName "1.0" 139 | manifestPlaceholders = [auth0Domain: "mortitotti.auth0.com", auth0Scheme: "${applicationId}"] 140 | missingDimensionStrategy 'react-native-camera', 'general' 141 | } 142 | splits { 143 | abi { 144 | reset() 145 | enable enableSeparateBuildPerCPUArchitecture 146 | universalApk false // If true, also generate a universal APK 147 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" 148 | } 149 | } 150 | signingConfigs { 151 | debug { 152 | storeFile file('debug.keystore') 153 | storePassword 'android' 154 | keyAlias 'androiddebugkey' 155 | keyPassword 'android' 156 | } 157 | } 158 | buildTypes { 159 | debug { 160 | signingConfig signingConfigs.debug 161 | if (nativeArchitectures) { 162 | ndk { 163 | abiFilters nativeArchitectures.split(',') 164 | } 165 | } 166 | } 167 | release { 168 | // Caution! In production, you need to generate your own keystore file. 169 | // see https://reactnative.dev/docs/signed-apk-android. 170 | signingConfig signingConfigs.debug 171 | minifyEnabled enableProguardInReleaseBuilds 172 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 173 | } 174 | } 175 | 176 | // applicationVariants are e.g. debug, release 177 | applicationVariants.all { variant -> 178 | variant.outputs.each { output -> 179 | // For each separate APK per architecture, set a unique version code as described here: 180 | // https://developer.android.com/studio/build/configure-apk-splits.html 181 | // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. 182 | def versionCodes = ["armeabi-v7a":1, "x86":2,"arm64-v8a": 3, "x86_64": 4] 183 | def abi = output.getFilter(OutputFile.ABI) 184 | if (abi != null) { // null for the universal-debug, universal-release variants 185 | output.versionCodeOverride = 186 | defaultConfig.versionCode * 1000 + versionCodes.get(abi) 187 | } 188 | } 189 | } 190 | } 191 | 192 | dependencies { 193 | implementation fileTree(dir: "libs", include: ["*.jar"]) 194 | 195 | //noinspection GradleDynamicVersion 196 | implementation "com.facebook.react:react-native:+" // From node_modules 197 | 198 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" 199 | 200 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { 201 | exclude group:'com.facebook.fbjni' 202 | } 203 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { 204 | exclude group:'com.facebook.flipper' 205 | exclude group:'com.squareup.okhttp3', module:'okhttp' 206 | } 207 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { 208 | exclude group:'com.facebook.flipper' 209 | } 210 | if (enableHermes) { 211 | def hermesPath = "../../node_modules/hermes-engine/android/"; 212 | debugImplementation files(hermesPath + "hermes-debug.aar") 213 | releaseImplementation files(hermesPath + "hermes-release.aar") 214 | } else { 215 | implementation jscFlavor 216 | } 217 | } 218 | 219 | // Run this once to be able to run the application with BUCK 220 | // puts all compile dependencies into folder libs for BUCK to use 221 | task copyDownloadableDepsToLibs(type: Copy) { 222 | from configurations.implementation 223 | into 'libs' 224 | } 225 | 226 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) 227 | apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" 228 | -------------------------------------------------------------------------------- /android/app/build_defs.bzl: -------------------------------------------------------------------------------- 1 | """Helper definitions to glob .aar and .jar targets""" 2 | 3 | def create_aar_targets(aarfiles): 4 | for aarfile in aarfiles: 5 | name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] 6 | lib_deps.append(":" + name) 7 | android_prebuilt_aar( 8 | name = name, 9 | aar = aarfile, 10 | ) 11 | 12 | def create_jar_targets(jarfiles): 13 | for jarfile in jarfiles: 14 | name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] 15 | lib_deps.append(":" + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/debug.keystore -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /android/app/src/debug/java/com/react-native-otp/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | package com.reactnativeotp; 2 | 3 | import android.content.Context; 4 | import com.facebook.flipper.android.AndroidFlipperClient; 5 | import com.facebook.flipper.android.utils.FlipperUtils; 6 | import com.facebook.flipper.core.FlipperClient; 7 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; 8 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; 9 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; 10 | import com.facebook.flipper.plugins.inspector.DescriptorMapping; 11 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 12 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; 13 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; 14 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin; 15 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; 16 | import com.facebook.react.ReactInstanceManager; 17 | import com.facebook.react.bridge.ReactContext; 18 | import com.facebook.react.modules.network.NetworkingModule; 19 | import okhttp3.OkHttpClient; 20 | 21 | public class ReactNativeFlipper { 22 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 23 | if (FlipperUtils.shouldEnableFlipper(context)) { 24 | final FlipperClient client = AndroidFlipperClient.getInstance(context); 25 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); 26 | client.addPlugin(new ReactFlipperPlugin()); 27 | client.addPlugin(new DatabasesFlipperPlugin(context)); 28 | client.addPlugin(new SharedPreferencesFlipperPlugin(context)); 29 | client.addPlugin(CrashReporterPlugin.getInstance()); 30 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); 31 | NetworkingModule.setCustomClientBuilder( 32 | new NetworkingModule.CustomClientBuilder() { 33 | @Override 34 | public void apply(OkHttpClient.Builder builder) { 35 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); 36 | } 37 | }); 38 | client.addPlugin(networkFlipperPlugin); 39 | client.start(); 40 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized 41 | // Hence we run if after all native modules have been initialized 42 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); 43 | if (reactContext == null) { 44 | reactInstanceManager.addReactInstanceEventListener( 45 | new ReactInstanceManager.ReactInstanceEventListener() { 46 | @Override 47 | public void onReactContextInitialized(ReactContext reactContext) { 48 | reactInstanceManager.removeReactInstanceEventListener(this); 49 | reactContext.runOnNativeModulesQueueThread( 50 | new Runnable() { 51 | @Override 52 | public void run() { 53 | client.addPlugin(new FrescoFlipperPlugin()); 54 | } 55 | }); 56 | } 57 | }); 58 | } else { 59 | client.addPlugin(new FrescoFlipperPlugin()); 60 | } 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 18 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativeotp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.reactnativeotp; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. This is used to schedule 9 | * rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "reactnativeotp"; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactnativeotp/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.reactnativeotp; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import com.facebook.react.PackageList; 6 | import com.facebook.react.ReactApplication; 7 | import com.facebook.react.ReactInstanceManager; 8 | import com.facebook.react.ReactNativeHost; 9 | import com.facebook.react.ReactPackage; 10 | import com.facebook.soloader.SoLoader; 11 | import java.lang.reflect.InvocationTargetException; 12 | import com.facebook.react.bridge.JSIModulePackage; // reanimated 13 | import com.swmansion.reanimated.ReanimatedJSIModulePackage; //reanimated 14 | import java.util.List; 15 | 16 | public class MainApplication extends Application implements ReactApplication { 17 | 18 | private final ReactNativeHost mReactNativeHost = 19 | new ReactNativeHost(this) { 20 | @Override 21 | public boolean getUseDeveloperSupport() { 22 | return BuildConfig.DEBUG; 23 | } 24 | 25 | @Override 26 | protected List getPackages() { 27 | @SuppressWarnings("UnnecessaryLocalVariable") 28 | List packages = new PackageList(this).getPackages(); 29 | // Packages that cannot be autolinked yet can be added manually here, for example: 30 | // packages.add(new MyReactNativePackage()); 31 | return packages; 32 | } 33 | 34 | @Override 35 | protected String getJSMainModuleName() { 36 | return "index"; 37 | } 38 | 39 | @Override 40 | protected JSIModulePackage getJSIModulePackage() { 41 | return new ReanimatedJSIModulePackage(); // reanimated 42 | } 43 | 44 | }; 45 | 46 | 47 | @Override 48 | public ReactNativeHost getReactNativeHost() { 49 | return mReactNativeHost; 50 | } 51 | 52 | @Override 53 | public void onCreate() { 54 | super.onCreate(); 55 | SoLoader.init(this, /* native exopackage */ false); 56 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 57 | } 58 | 59 | /** 60 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like 61 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 62 | * 63 | * @param context 64 | * @param reactInstanceManager 65 | */ 66 | private static void initializeFlipper( 67 | Context context, ReactInstanceManager reactInstanceManager) { 68 | if (BuildConfig.DEBUG) { 69 | try { 70 | /* 71 | We use reflection here to pick up the class that initializes Flipper, 72 | since Flipper library is not available in release mode 73 | */ 74 | Class aClass = Class.forName("com.reactnativeotp.ReactNativeFlipper"); 75 | aClass 76 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) 77 | .invoke(null, context, reactInstanceManager); 78 | } catch (ClassNotFoundException e) { 79 | e.printStackTrace(); 80 | } catch (NoSuchMethodException e) { 81 | e.printStackTrace(); 82 | } catch (IllegalAccessException e) { 83 | e.printStackTrace(); 84 | } catch (InvocationTargetException e) { 85 | e.printStackTrace(); 86 | } 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/rn_edit_text_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 21 | 22 | 23 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | reactnativeotp 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | // buildToolsVersion = "30.0.2" 6 | minSdkVersion = 21 7 | compileSdkVersion = 30 8 | targetSdkVersion = 30 9 | ndkVersion = "21.4.7075529" 10 | } 11 | repositories { 12 | google() 13 | mavenCentral() 14 | } 15 | dependencies { 16 | classpath("com.android.tools.build:gradle:4.2.2") 17 | 18 | // NOTE: Do not place your application dependencies here; they belong 19 | // in the individual module build.gradle files 20 | } 21 | } 22 | 23 | allprojects { 24 | repositories { 25 | 26 | maven { 27 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 28 | 29 | url("$rootDir/../node_modules/react-native/android") 30 | } 31 | maven { 32 | // Android JSC is installed from npm 33 | url("$rootDir/../node_modules/jsc-android/dist") 34 | } 35 | mavenCentral { 36 | // We don't want to fetch react-native from Maven Central as there are 37 | // older versions over there. 38 | content { 39 | excludeGroup "com.facebook.react" 40 | } 41 | } 42 | google() 43 | maven { url 'https://www.jitpack.io' } 44 | } 45 | } -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | 21 | # AndroidX package structure to make it clearer which packages are bundled with the 22 | # Android operating system, and which are packaged with your app's APK 23 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 24 | android.useAndroidX=true 25 | # Automatically convert third-party libraries to use AndroidX 26 | android.enableJetifier=true 27 | # Version of flipper SDK to use with React Native 28 | FLIPPER_VERSION=0.99.0 29 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip 6 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | ############################################################################## 18 | 19 | # Attempt to set APP_HOME 20 | # Resolve links: $0 may be a link 21 | PRG="$0" 22 | # Need this for relative symlinks. 23 | while [ -h "$PRG" ] ; do 24 | ls=`ls -ld "$PRG"` 25 | link=`expr "$ls" : '.*-> \(.*\)$'` 26 | if expr "$link" : '/.*' > /dev/null; then 27 | PRG="$link" 28 | else 29 | PRG=`dirname "$PRG"`"/$link" 30 | fi 31 | done 32 | SAVED="`pwd`" 33 | cd "`dirname \"$PRG\"`/" >/dev/null 34 | APP_HOME="`pwd -P`" 35 | cd "$SAVED" >/dev/null 36 | 37 | APP_NAME="Gradle" 38 | APP_BASE_NAME=`basename "$0"` 39 | 40 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 41 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 42 | 43 | # Use the maximum available, or set MAX_FD != -1 to use that value. 44 | MAX_FD="maximum" 45 | 46 | warn () { 47 | echo "$*" 48 | } 49 | 50 | die () { 51 | echo 52 | echo "$*" 53 | echo 54 | exit 1 55 | } 56 | 57 | # OS specific support (must be 'true' or 'false'). 58 | cygwin=false 59 | msys=false 60 | darwin=false 61 | nonstop=false 62 | case "`uname`" in 63 | CYGWIN* ) 64 | cygwin=true 65 | ;; 66 | Darwin* ) 67 | darwin=true 68 | ;; 69 | MINGW* ) 70 | msys=true 71 | ;; 72 | NONSTOP* ) 73 | nonstop=true 74 | ;; 75 | esac 76 | 77 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 78 | 79 | # Determine the Java command to use to start the JVM. 80 | if [ -n "$JAVA_HOME" ] ; then 81 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 82 | # IBM's JDK on AIX uses strange locations for the executables 83 | JAVACMD="$JAVA_HOME/jre/sh/java" 84 | else 85 | JAVACMD="$JAVA_HOME/bin/java" 86 | fi 87 | if [ ! -x "$JAVACMD" ] ; then 88 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 89 | 90 | Please set the JAVA_HOME variable in your environment to match the 91 | location of your Java installation." 92 | fi 93 | else 94 | JAVACMD="java" 95 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | 101 | # Increase the maximum file descriptors if we can. 102 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 103 | MAX_FD_LIMIT=`ulimit -H -n` 104 | if [ $? -eq 0 ] ; then 105 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 106 | MAX_FD="$MAX_FD_LIMIT" 107 | fi 108 | ulimit -n $MAX_FD 109 | if [ $? -ne 0 ] ; then 110 | warn "Could not set maximum file descriptor limit: $MAX_FD" 111 | fi 112 | else 113 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 114 | fi 115 | fi 116 | 117 | # For Darwin, add options to specify how the application appears in the dock 118 | if $darwin; then 119 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 120 | fi 121 | 122 | # For Cygwin or MSYS, switch paths to Windows format before running java 123 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 124 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 125 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 126 | 127 | JAVACMD=`cygpath --unix "$JAVACMD"` 128 | 129 | # We build the pattern for arguments to be converted via cygpath 130 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 131 | SEP="" 132 | for dir in $ROOTDIRSRAW ; do 133 | ROOTDIRS="$ROOTDIRS$SEP$dir" 134 | SEP="|" 135 | done 136 | OURCYGPATTERN="(^($ROOTDIRS))" 137 | # Add a user-defined pattern to the cygpath arguments 138 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 139 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 140 | fi 141 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 142 | i=0 143 | for arg in "$@" ; do 144 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 145 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 146 | 147 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 148 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 149 | else 150 | eval `echo args$i`="\"$arg\"" 151 | fi 152 | i=`expr $i + 1` 153 | done 154 | case $i in 155 | 0) set -- ;; 156 | 1) set -- "$args0" ;; 157 | 2) set -- "$args0" "$args1" ;; 158 | 3) set -- "$args0" "$args1" "$args2" ;; 159 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 160 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 161 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 162 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 163 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 164 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 165 | esac 166 | fi 167 | 168 | # Escape application args 169 | save () { 170 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 171 | echo " " 172 | } 173 | APP_ARGS=`save "$@"` 174 | 175 | # Collect all arguments for the java command, following the shell quoting and substitution rules 176 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 177 | 178 | exec "$JAVACMD" "$@" 179 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | @if "%DEBUG%" == "" @echo off 17 | @rem ########################################################################## 18 | @rem 19 | @rem Gradle startup script for Windows 20 | @rem 21 | @rem ########################################################################## 22 | @rem Set local scope for the variables with windows NT shell 23 | if "%OS%"=="Windows_NT" setlocal 24 | set DIRNAME=%~dp0 25 | if "%DIRNAME%" == "" set DIRNAME=. 26 | set APP_BASE_NAME=%~n0 27 | set APP_HOME=%DIRNAME% 28 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 29 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 30 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 32 | @rem Find java.exe 33 | if defined JAVA_HOME goto findJavaFromJavaHome 34 | set JAVA_EXE=java.exe 35 | %JAVA_EXE% -version >NUL 2>&1 36 | if "%ERRORLEVEL%" == "0" goto execute 37 | echo. 38 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 39 | echo. 40 | echo Please set the JAVA_HOME variable in your environment to match the 41 | echo location of your Java installation. 42 | goto fail 43 | :findJavaFromJavaHome 44 | set JAVA_HOME=%JAVA_HOME:"=% 45 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 46 | if exist "%JAVA_EXE%" goto execute 47 | echo. 48 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 49 | echo. 50 | echo Please set the JAVA_HOME variable in your environment to match the 51 | echo location of your Java installation. 52 | goto fail 53 | :execute 54 | @rem Setup the command line 55 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 56 | @rem Execute Gradle 57 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 58 | :end 59 | @rem End local scope for the variables with windows NT shell 60 | if "%ERRORLEVEL%"=="0" goto mainEnd 61 | :fail 62 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 63 | rem the _cmd.exe /c_ return code! 64 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 65 | exit /b 1 66 | :mainEnd 67 | if "%OS%"=="Windows_NT" endlocal 68 | :omega -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'reactnativeotp' 2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 3 | include ':app' 4 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactnativeotp", 3 | "displayName": "reactnativeotp" 4 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | plugins: [ 4 | [ 5 | 'react-native-reanimated/plugin' 6 | ], 7 | ] 8 | }; -------------------------------------------------------------------------------- /images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/images/1.jpg -------------------------------------------------------------------------------- /images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/images/2.jpg -------------------------------------------------------------------------------- /images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/images/3.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** @format */ 2 | 3 | import {AppRegistry} from 'react-native'; 4 | import './shim.js'; 5 | import App from './App'; 6 | import {name as appName} from './app.json'; 7 | 8 | AppRegistry.registerComponent(appName, () => App); 9 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | ENV['SWIFT_VERSION'] = '5.5.1' 2 | 3 | require_relative '../node_modules/react-native/scripts/react_native_pods' 4 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' 5 | 6 | platform :ios, '11.0' 7 | 8 | target 'reactnativeotp' do 9 | config = use_native_modules! 10 | 11 | use_react_native!( 12 | :path => config[:reactNativePath], 13 | # to enable hermes on iOS, change `false` to `true` and then install pods 14 | :hermes_enabled => false 15 | ) 16 | 17 | # Enables Flipper. 18 | # 19 | # Note that if you have use_frameworks! enabled, Flipper will not work and 20 | # you should disable the next line. 21 | use_flipper!() 22 | 23 | post_install do |installer| 24 | react_native_post_install(installer) 25 | __apply_Xcode_12_5_M1_post_install_workaround(installer) 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - A0Auth0 (2.13.0): 3 | - React 4 | - boost (1.76.0) 5 | - CocoaAsyncSocket (7.6.5) 6 | - DoubleConversion (1.1.6) 7 | - FBLazyVector (0.67.2) 8 | - FBReactNativeSpec (0.67.2): 9 | - RCT-Folly (= 2021.06.28.00-v2) 10 | - RCTRequired (= 0.67.2) 11 | - RCTTypeSafety (= 0.67.2) 12 | - React-Core (= 0.67.2) 13 | - React-jsi (= 0.67.2) 14 | - ReactCommon/turbomodule/core (= 0.67.2) 15 | - Flipper (0.99.0): 16 | - Flipper-Folly (~> 2.6) 17 | - Flipper-RSocket (~> 1.4) 18 | - Flipper-Boost-iOSX (1.76.0.1.11) 19 | - Flipper-DoubleConversion (3.1.7) 20 | - Flipper-Fmt (7.1.7) 21 | - Flipper-Folly (2.6.7): 22 | - Flipper-Boost-iOSX 23 | - Flipper-DoubleConversion 24 | - Flipper-Fmt (= 7.1.7) 25 | - Flipper-Glog 26 | - libevent (~> 2.1.12) 27 | - OpenSSL-Universal (= 1.1.180) 28 | - Flipper-Glog (0.3.6) 29 | - Flipper-PeerTalk (0.0.4) 30 | - Flipper-RSocket (1.4.3): 31 | - Flipper-Folly (~> 2.6) 32 | - FlipperKit (0.99.0): 33 | - FlipperKit/Core (= 0.99.0) 34 | - FlipperKit/Core (0.99.0): 35 | - Flipper (~> 0.99.0) 36 | - FlipperKit/CppBridge 37 | - FlipperKit/FBCxxFollyDynamicConvert 38 | - FlipperKit/FBDefines 39 | - FlipperKit/FKPortForwarding 40 | - FlipperKit/CppBridge (0.99.0): 41 | - Flipper (~> 0.99.0) 42 | - FlipperKit/FBCxxFollyDynamicConvert (0.99.0): 43 | - Flipper-Folly (~> 2.6) 44 | - FlipperKit/FBDefines (0.99.0) 45 | - FlipperKit/FKPortForwarding (0.99.0): 46 | - CocoaAsyncSocket (~> 7.6) 47 | - Flipper-PeerTalk (~> 0.0.4) 48 | - FlipperKit/FlipperKitHighlightOverlay (0.99.0) 49 | - FlipperKit/FlipperKitLayoutHelpers (0.99.0): 50 | - FlipperKit/Core 51 | - FlipperKit/FlipperKitHighlightOverlay 52 | - FlipperKit/FlipperKitLayoutTextSearchable 53 | - FlipperKit/FlipperKitLayoutIOSDescriptors (0.99.0): 54 | - FlipperKit/Core 55 | - FlipperKit/FlipperKitHighlightOverlay 56 | - FlipperKit/FlipperKitLayoutHelpers 57 | - YogaKit (~> 1.18) 58 | - FlipperKit/FlipperKitLayoutPlugin (0.99.0): 59 | - FlipperKit/Core 60 | - FlipperKit/FlipperKitHighlightOverlay 61 | - FlipperKit/FlipperKitLayoutHelpers 62 | - FlipperKit/FlipperKitLayoutIOSDescriptors 63 | - FlipperKit/FlipperKitLayoutTextSearchable 64 | - YogaKit (~> 1.18) 65 | - FlipperKit/FlipperKitLayoutTextSearchable (0.99.0) 66 | - FlipperKit/FlipperKitNetworkPlugin (0.99.0): 67 | - FlipperKit/Core 68 | - FlipperKit/FlipperKitReactPlugin (0.99.0): 69 | - FlipperKit/Core 70 | - FlipperKit/FlipperKitUserDefaultsPlugin (0.99.0): 71 | - FlipperKit/Core 72 | - FlipperKit/SKIOSNetworkPlugin (0.99.0): 73 | - FlipperKit/Core 74 | - FlipperKit/FlipperKitNetworkPlugin 75 | - fmt (6.2.1) 76 | - glog (0.3.5) 77 | - libevent (2.1.12) 78 | - OpenSSL-Universal (1.1.180) 79 | - RCT-Folly (2021.06.28.00-v2): 80 | - boost 81 | - DoubleConversion 82 | - fmt (~> 6.2.1) 83 | - glog 84 | - RCT-Folly/Default (= 2021.06.28.00-v2) 85 | - RCT-Folly/Default (2021.06.28.00-v2): 86 | - boost 87 | - DoubleConversion 88 | - fmt (~> 6.2.1) 89 | - glog 90 | - RCTRequired (0.67.2) 91 | - RCTTypeSafety (0.67.2): 92 | - FBLazyVector (= 0.67.2) 93 | - RCT-Folly (= 2021.06.28.00-v2) 94 | - RCTRequired (= 0.67.2) 95 | - React-Core (= 0.67.2) 96 | - React (0.67.2): 97 | - React-Core (= 0.67.2) 98 | - React-Core/DevSupport (= 0.67.2) 99 | - React-Core/RCTWebSocket (= 0.67.2) 100 | - React-RCTActionSheet (= 0.67.2) 101 | - React-RCTAnimation (= 0.67.2) 102 | - React-RCTBlob (= 0.67.2) 103 | - React-RCTImage (= 0.67.2) 104 | - React-RCTLinking (= 0.67.2) 105 | - React-RCTNetwork (= 0.67.2) 106 | - React-RCTSettings (= 0.67.2) 107 | - React-RCTText (= 0.67.2) 108 | - React-RCTVibration (= 0.67.2) 109 | - React-callinvoker (0.67.2) 110 | - React-Core (0.67.2): 111 | - glog 112 | - RCT-Folly (= 2021.06.28.00-v2) 113 | - React-Core/Default (= 0.67.2) 114 | - React-cxxreact (= 0.67.2) 115 | - React-jsi (= 0.67.2) 116 | - React-jsiexecutor (= 0.67.2) 117 | - React-perflogger (= 0.67.2) 118 | - Yoga 119 | - React-Core/CoreModulesHeaders (0.67.2): 120 | - glog 121 | - RCT-Folly (= 2021.06.28.00-v2) 122 | - React-Core/Default 123 | - React-cxxreact (= 0.67.2) 124 | - React-jsi (= 0.67.2) 125 | - React-jsiexecutor (= 0.67.2) 126 | - React-perflogger (= 0.67.2) 127 | - Yoga 128 | - React-Core/Default (0.67.2): 129 | - glog 130 | - RCT-Folly (= 2021.06.28.00-v2) 131 | - React-cxxreact (= 0.67.2) 132 | - React-jsi (= 0.67.2) 133 | - React-jsiexecutor (= 0.67.2) 134 | - React-perflogger (= 0.67.2) 135 | - Yoga 136 | - React-Core/DevSupport (0.67.2): 137 | - glog 138 | - RCT-Folly (= 2021.06.28.00-v2) 139 | - React-Core/Default (= 0.67.2) 140 | - React-Core/RCTWebSocket (= 0.67.2) 141 | - React-cxxreact (= 0.67.2) 142 | - React-jsi (= 0.67.2) 143 | - React-jsiexecutor (= 0.67.2) 144 | - React-jsinspector (= 0.67.2) 145 | - React-perflogger (= 0.67.2) 146 | - Yoga 147 | - React-Core/RCTActionSheetHeaders (0.67.2): 148 | - glog 149 | - RCT-Folly (= 2021.06.28.00-v2) 150 | - React-Core/Default 151 | - React-cxxreact (= 0.67.2) 152 | - React-jsi (= 0.67.2) 153 | - React-jsiexecutor (= 0.67.2) 154 | - React-perflogger (= 0.67.2) 155 | - Yoga 156 | - React-Core/RCTAnimationHeaders (0.67.2): 157 | - glog 158 | - RCT-Folly (= 2021.06.28.00-v2) 159 | - React-Core/Default 160 | - React-cxxreact (= 0.67.2) 161 | - React-jsi (= 0.67.2) 162 | - React-jsiexecutor (= 0.67.2) 163 | - React-perflogger (= 0.67.2) 164 | - Yoga 165 | - React-Core/RCTBlobHeaders (0.67.2): 166 | - glog 167 | - RCT-Folly (= 2021.06.28.00-v2) 168 | - React-Core/Default 169 | - React-cxxreact (= 0.67.2) 170 | - React-jsi (= 0.67.2) 171 | - React-jsiexecutor (= 0.67.2) 172 | - React-perflogger (= 0.67.2) 173 | - Yoga 174 | - React-Core/RCTImageHeaders (0.67.2): 175 | - glog 176 | - RCT-Folly (= 2021.06.28.00-v2) 177 | - React-Core/Default 178 | - React-cxxreact (= 0.67.2) 179 | - React-jsi (= 0.67.2) 180 | - React-jsiexecutor (= 0.67.2) 181 | - React-perflogger (= 0.67.2) 182 | - Yoga 183 | - React-Core/RCTLinkingHeaders (0.67.2): 184 | - glog 185 | - RCT-Folly (= 2021.06.28.00-v2) 186 | - React-Core/Default 187 | - React-cxxreact (= 0.67.2) 188 | - React-jsi (= 0.67.2) 189 | - React-jsiexecutor (= 0.67.2) 190 | - React-perflogger (= 0.67.2) 191 | - Yoga 192 | - React-Core/RCTNetworkHeaders (0.67.2): 193 | - glog 194 | - RCT-Folly (= 2021.06.28.00-v2) 195 | - React-Core/Default 196 | - React-cxxreact (= 0.67.2) 197 | - React-jsi (= 0.67.2) 198 | - React-jsiexecutor (= 0.67.2) 199 | - React-perflogger (= 0.67.2) 200 | - Yoga 201 | - React-Core/RCTSettingsHeaders (0.67.2): 202 | - glog 203 | - RCT-Folly (= 2021.06.28.00-v2) 204 | - React-Core/Default 205 | - React-cxxreact (= 0.67.2) 206 | - React-jsi (= 0.67.2) 207 | - React-jsiexecutor (= 0.67.2) 208 | - React-perflogger (= 0.67.2) 209 | - Yoga 210 | - React-Core/RCTTextHeaders (0.67.2): 211 | - glog 212 | - RCT-Folly (= 2021.06.28.00-v2) 213 | - React-Core/Default 214 | - React-cxxreact (= 0.67.2) 215 | - React-jsi (= 0.67.2) 216 | - React-jsiexecutor (= 0.67.2) 217 | - React-perflogger (= 0.67.2) 218 | - Yoga 219 | - React-Core/RCTVibrationHeaders (0.67.2): 220 | - glog 221 | - RCT-Folly (= 2021.06.28.00-v2) 222 | - React-Core/Default 223 | - React-cxxreact (= 0.67.2) 224 | - React-jsi (= 0.67.2) 225 | - React-jsiexecutor (= 0.67.2) 226 | - React-perflogger (= 0.67.2) 227 | - Yoga 228 | - React-Core/RCTWebSocket (0.67.2): 229 | - glog 230 | - RCT-Folly (= 2021.06.28.00-v2) 231 | - React-Core/Default (= 0.67.2) 232 | - React-cxxreact (= 0.67.2) 233 | - React-jsi (= 0.67.2) 234 | - React-jsiexecutor (= 0.67.2) 235 | - React-perflogger (= 0.67.2) 236 | - Yoga 237 | - React-CoreModules (0.67.2): 238 | - FBReactNativeSpec (= 0.67.2) 239 | - RCT-Folly (= 2021.06.28.00-v2) 240 | - RCTTypeSafety (= 0.67.2) 241 | - React-Core/CoreModulesHeaders (= 0.67.2) 242 | - React-jsi (= 0.67.2) 243 | - React-RCTImage (= 0.67.2) 244 | - ReactCommon/turbomodule/core (= 0.67.2) 245 | - React-cxxreact (0.67.2): 246 | - boost (= 1.76.0) 247 | - DoubleConversion 248 | - glog 249 | - RCT-Folly (= 2021.06.28.00-v2) 250 | - React-callinvoker (= 0.67.2) 251 | - React-jsi (= 0.67.2) 252 | - React-jsinspector (= 0.67.2) 253 | - React-logger (= 0.67.2) 254 | - React-perflogger (= 0.67.2) 255 | - React-runtimeexecutor (= 0.67.2) 256 | - React-jsi (0.67.2): 257 | - boost (= 1.76.0) 258 | - DoubleConversion 259 | - glog 260 | - RCT-Folly (= 2021.06.28.00-v2) 261 | - React-jsi/Default (= 0.67.2) 262 | - React-jsi/Default (0.67.2): 263 | - boost (= 1.76.0) 264 | - DoubleConversion 265 | - glog 266 | - RCT-Folly (= 2021.06.28.00-v2) 267 | - React-jsiexecutor (0.67.2): 268 | - DoubleConversion 269 | - glog 270 | - RCT-Folly (= 2021.06.28.00-v2) 271 | - React-cxxreact (= 0.67.2) 272 | - React-jsi (= 0.67.2) 273 | - React-perflogger (= 0.67.2) 274 | - React-jsinspector (0.67.2) 275 | - React-logger (0.67.2): 276 | - glog 277 | - react-native-randombytes (3.6.1): 278 | - React-Core 279 | - react-native-safe-area-context (3.3.2): 280 | - React-Core 281 | - react-native-udp (2.7.0): 282 | - React 283 | - React-perflogger (0.67.2) 284 | - React-RCTActionSheet (0.67.2): 285 | - React-Core/RCTActionSheetHeaders (= 0.67.2) 286 | - React-RCTAnimation (0.67.2): 287 | - FBReactNativeSpec (= 0.67.2) 288 | - RCT-Folly (= 2021.06.28.00-v2) 289 | - RCTTypeSafety (= 0.67.2) 290 | - React-Core/RCTAnimationHeaders (= 0.67.2) 291 | - React-jsi (= 0.67.2) 292 | - ReactCommon/turbomodule/core (= 0.67.2) 293 | - React-RCTBlob (0.67.2): 294 | - FBReactNativeSpec (= 0.67.2) 295 | - RCT-Folly (= 2021.06.28.00-v2) 296 | - React-Core/RCTBlobHeaders (= 0.67.2) 297 | - React-Core/RCTWebSocket (= 0.67.2) 298 | - React-jsi (= 0.67.2) 299 | - React-RCTNetwork (= 0.67.2) 300 | - ReactCommon/turbomodule/core (= 0.67.2) 301 | - React-RCTImage (0.67.2): 302 | - FBReactNativeSpec (= 0.67.2) 303 | - RCT-Folly (= 2021.06.28.00-v2) 304 | - RCTTypeSafety (= 0.67.2) 305 | - React-Core/RCTImageHeaders (= 0.67.2) 306 | - React-jsi (= 0.67.2) 307 | - React-RCTNetwork (= 0.67.2) 308 | - ReactCommon/turbomodule/core (= 0.67.2) 309 | - React-RCTLinking (0.67.2): 310 | - FBReactNativeSpec (= 0.67.2) 311 | - React-Core/RCTLinkingHeaders (= 0.67.2) 312 | - React-jsi (= 0.67.2) 313 | - ReactCommon/turbomodule/core (= 0.67.2) 314 | - React-RCTNetwork (0.67.2): 315 | - FBReactNativeSpec (= 0.67.2) 316 | - RCT-Folly (= 2021.06.28.00-v2) 317 | - RCTTypeSafety (= 0.67.2) 318 | - React-Core/RCTNetworkHeaders (= 0.67.2) 319 | - React-jsi (= 0.67.2) 320 | - ReactCommon/turbomodule/core (= 0.67.2) 321 | - React-RCTSettings (0.67.2): 322 | - FBReactNativeSpec (= 0.67.2) 323 | - RCT-Folly (= 2021.06.28.00-v2) 324 | - RCTTypeSafety (= 0.67.2) 325 | - React-Core/RCTSettingsHeaders (= 0.67.2) 326 | - React-jsi (= 0.67.2) 327 | - ReactCommon/turbomodule/core (= 0.67.2) 328 | - React-RCTText (0.67.2): 329 | - React-Core/RCTTextHeaders (= 0.67.2) 330 | - React-RCTVibration (0.67.2): 331 | - FBReactNativeSpec (= 0.67.2) 332 | - RCT-Folly (= 2021.06.28.00-v2) 333 | - React-Core/RCTVibrationHeaders (= 0.67.2) 334 | - React-jsi (= 0.67.2) 335 | - ReactCommon/turbomodule/core (= 0.67.2) 336 | - React-runtimeexecutor (0.67.2): 337 | - React-jsi (= 0.67.2) 338 | - ReactCommon/turbomodule/core (0.67.2): 339 | - DoubleConversion 340 | - glog 341 | - RCT-Folly (= 2021.06.28.00-v2) 342 | - React-callinvoker (= 0.67.2) 343 | - React-Core (= 0.67.2) 344 | - React-cxxreact (= 0.67.2) 345 | - React-jsi (= 0.67.2) 346 | - React-logger (= 0.67.2) 347 | - React-perflogger (= 0.67.2) 348 | - RNCAsyncStorage (1.16.1): 349 | - React-Core 350 | - RNOS (1.2.6): 351 | - React 352 | - RNScreens (3.11.1): 353 | - React-Core 354 | - React-RCTImage 355 | - RNSVG (12.1.1): 356 | - React 357 | - RNVectorIcons (9.0.0): 358 | - React-Core 359 | - TcpSockets (4.0.0): 360 | - React 361 | - VisionCamera (2.12.0): 362 | - React 363 | - React-callinvoker 364 | - React-Core 365 | - Yoga (1.14.0) 366 | - YogaKit (1.18.1): 367 | - Yoga (~> 1.14) 368 | 369 | DEPENDENCIES: 370 | - A0Auth0 (from `../node_modules/react-native-auth0/ios`) 371 | - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) 372 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 373 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 374 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) 375 | - Flipper (= 0.99.0) 376 | - Flipper-Boost-iOSX (= 1.76.0.1.11) 377 | - Flipper-DoubleConversion (= 3.1.7) 378 | - Flipper-Fmt (= 7.1.7) 379 | - Flipper-Folly (= 2.6.7) 380 | - Flipper-Glog (= 0.3.6) 381 | - Flipper-PeerTalk (= 0.0.4) 382 | - Flipper-RSocket (= 1.4.3) 383 | - FlipperKit (= 0.99.0) 384 | - FlipperKit/Core (= 0.99.0) 385 | - FlipperKit/CppBridge (= 0.99.0) 386 | - FlipperKit/FBCxxFollyDynamicConvert (= 0.99.0) 387 | - FlipperKit/FBDefines (= 0.99.0) 388 | - FlipperKit/FKPortForwarding (= 0.99.0) 389 | - FlipperKit/FlipperKitHighlightOverlay (= 0.99.0) 390 | - FlipperKit/FlipperKitLayoutPlugin (= 0.99.0) 391 | - FlipperKit/FlipperKitLayoutTextSearchable (= 0.99.0) 392 | - FlipperKit/FlipperKitNetworkPlugin (= 0.99.0) 393 | - FlipperKit/FlipperKitReactPlugin (= 0.99.0) 394 | - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.99.0) 395 | - FlipperKit/SKIOSNetworkPlugin (= 0.99.0) 396 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 397 | - OpenSSL-Universal (= 1.1.180) 398 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 399 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) 400 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 401 | - React (from `../node_modules/react-native/`) 402 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 403 | - React-Core (from `../node_modules/react-native/`) 404 | - React-Core/DevSupport (from `../node_modules/react-native/`) 405 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 406 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 407 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 408 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 409 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 410 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) 411 | - React-logger (from `../node_modules/react-native/ReactCommon/logger`) 412 | - react-native-randombytes (from `../node_modules/react-native-randombytes`) 413 | - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) 414 | - react-native-udp (from `../node_modules/react-native-udp`) 415 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 416 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 417 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 418 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 419 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 420 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 421 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 422 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 423 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 424 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 425 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 426 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 427 | - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" 428 | - RNOS (from `../node_modules/react-native-os`) 429 | - RNScreens (from `../node_modules/react-native-screens`) 430 | - RNSVG (from `../node_modules/react-native-svg`) 431 | - RNVectorIcons (from `../node_modules/react-native-vector-icons`) 432 | - TcpSockets (from `../node_modules/react-native-tcp`) 433 | - VisionCamera (from `../node_modules/react-native-vision-camera`) 434 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 435 | 436 | SPEC REPOS: 437 | trunk: 438 | - CocoaAsyncSocket 439 | - Flipper 440 | - Flipper-Boost-iOSX 441 | - Flipper-DoubleConversion 442 | - Flipper-Fmt 443 | - Flipper-Folly 444 | - Flipper-Glog 445 | - Flipper-PeerTalk 446 | - Flipper-RSocket 447 | - FlipperKit 448 | - fmt 449 | - libevent 450 | - OpenSSL-Universal 451 | - YogaKit 452 | 453 | EXTERNAL SOURCES: 454 | A0Auth0: 455 | :path: "../node_modules/react-native-auth0/ios" 456 | boost: 457 | :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" 458 | DoubleConversion: 459 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 460 | FBLazyVector: 461 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 462 | FBReactNativeSpec: 463 | :path: "../node_modules/react-native/React/FBReactNativeSpec" 464 | glog: 465 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 466 | RCT-Folly: 467 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 468 | RCTRequired: 469 | :path: "../node_modules/react-native/Libraries/RCTRequired" 470 | RCTTypeSafety: 471 | :path: "../node_modules/react-native/Libraries/TypeSafety" 472 | React: 473 | :path: "../node_modules/react-native/" 474 | React-callinvoker: 475 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 476 | React-Core: 477 | :path: "../node_modules/react-native/" 478 | React-CoreModules: 479 | :path: "../node_modules/react-native/React/CoreModules" 480 | React-cxxreact: 481 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 482 | React-jsi: 483 | :path: "../node_modules/react-native/ReactCommon/jsi" 484 | React-jsiexecutor: 485 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 486 | React-jsinspector: 487 | :path: "../node_modules/react-native/ReactCommon/jsinspector" 488 | React-logger: 489 | :path: "../node_modules/react-native/ReactCommon/logger" 490 | react-native-randombytes: 491 | :path: "../node_modules/react-native-randombytes" 492 | react-native-safe-area-context: 493 | :path: "../node_modules/react-native-safe-area-context" 494 | react-native-udp: 495 | :path: "../node_modules/react-native-udp" 496 | React-perflogger: 497 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 498 | React-RCTActionSheet: 499 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 500 | React-RCTAnimation: 501 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 502 | React-RCTBlob: 503 | :path: "../node_modules/react-native/Libraries/Blob" 504 | React-RCTImage: 505 | :path: "../node_modules/react-native/Libraries/Image" 506 | React-RCTLinking: 507 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 508 | React-RCTNetwork: 509 | :path: "../node_modules/react-native/Libraries/Network" 510 | React-RCTSettings: 511 | :path: "../node_modules/react-native/Libraries/Settings" 512 | React-RCTText: 513 | :path: "../node_modules/react-native/Libraries/Text" 514 | React-RCTVibration: 515 | :path: "../node_modules/react-native/Libraries/Vibration" 516 | React-runtimeexecutor: 517 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 518 | ReactCommon: 519 | :path: "../node_modules/react-native/ReactCommon" 520 | RNCAsyncStorage: 521 | :path: "../node_modules/@react-native-async-storage/async-storage" 522 | RNOS: 523 | :path: "../node_modules/react-native-os" 524 | RNScreens: 525 | :path: "../node_modules/react-native-screens" 526 | RNSVG: 527 | :path: "../node_modules/react-native-svg" 528 | RNVectorIcons: 529 | :path: "../node_modules/react-native-vector-icons" 530 | TcpSockets: 531 | :path: "../node_modules/react-native-tcp" 532 | VisionCamera: 533 | :path: "../node_modules/react-native-vision-camera" 534 | Yoga: 535 | :path: "../node_modules/react-native/ReactCommon/yoga" 536 | 537 | SPEC CHECKSUMS: 538 | A0Auth0: 964f704797b63e15ca7233be0e23650144ebb863 539 | boost: a7c83b31436843459a1961bfd74b96033dc77234 540 | CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 541 | DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 542 | FBLazyVector: 244195e30d63d7f564c55da4410b9a24e8fbceaa 543 | FBReactNativeSpec: c94002c1d93da3658f4d5119c6994d19961e3d52 544 | Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 545 | Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c 546 | Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c 547 | Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b 548 | Flipper-Folly: 83af37379faa69497529e414bd43fbfc7cae259a 549 | Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 550 | Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 551 | Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 552 | FlipperKit: d8d346844eca5d9120c17d441a2f38596e8ed2b9 553 | fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 554 | glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85 555 | libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 556 | OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b 557 | RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685 558 | RCTRequired: cd47794163052d2b8318c891a7a14fcfaccc75ab 559 | RCTTypeSafety: 393bb40b3e357b224cde53d3fec26813c52428b1 560 | React: dec6476bc27155b250eeadfc11ea779265f53ebf 561 | React-callinvoker: e5047929e80aea942e6fdd96482504ef0189ca63 562 | React-Core: e382655566b2b9a6e3b4f641d777b7bfdbe52358 563 | React-CoreModules: cf262e82fa101c0aee022b6f90d1a5b612038b64 564 | React-cxxreact: 69d53de3b30c7c161ba087ca1ecdffed9ccb1039 565 | React-jsi: ce9a2d804adf75809ce2fe2374ba3fbbf5d59b03 566 | React-jsiexecutor: 52beb652bbc61201bd70cbe4f0b8edb607e8da4f 567 | React-jsinspector: 595f76eba2176ebd8817a1fffd47b84fbdab9383 568 | React-logger: 23de8ea0f44fa00ee77e96060273225607fd4d78 569 | react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846 570 | react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057 571 | react-native-udp: ff9d13e523f2b58e6bc5d4d32321ac60671b5dc9 572 | React-perflogger: 3c9bb7372493e49036f07a82c44c8cf65cbe88db 573 | React-RCTActionSheet: 052606483045a408693aa7e864410b4a052f541a 574 | React-RCTAnimation: 08d4cac13222bb1348c687a0158dfd3b577cdb63 575 | React-RCTBlob: 928ad1df65219c3d9e2ac80983b943a75b5c3629 576 | React-RCTImage: 524d7313b142a39ee0e20fa312b67277917fe076 577 | React-RCTLinking: 44036ea6f13a2e46238be07a67566247fee35244 578 | React-RCTNetwork: 9b6faacf1e0789253e319ca53b1f8d92c2ac5455 579 | React-RCTSettings: ecd8094f831130a49581d5112a8607220e5d12a5 580 | React-RCTText: 14ba976fb48ed283cfdb1a754a5d4276471e0152 581 | React-RCTVibration: 99c7f67fba7a5ade46e98e870c6ff2444484f995 582 | React-runtimeexecutor: 2450b43df7ffe8e805a0b3dcb2abd4282f1f1836 583 | ReactCommon: d98c6c96b567f9b3a15f9fd4cc302c1eda8e3cf2 584 | RNCAsyncStorage: b49b4e38a1548d03b74b30e558a1d18465b94be7 585 | RNOS: 6f2f9a70895bbbfbdad7196abd952e7b01d45027 586 | RNScreens: 4d83613b50b74ed277026375dc0810893b0c347f 587 | RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f 588 | RNVectorIcons: 4143ba35feebab8fdbe6bc43d1e776b393d47ac8 589 | TcpSockets: 4ef55305239923b343ed0a378b1fac188b1373b0 590 | VisionCamera: e4bfae7f6858a2cd8ecb96a70fe31e8332ab62aa 591 | Yoga: 9b6696970c3289e8dea34b3eda93f23e61fb8121 592 | YogaKit: f782866e155069a2cca2517aafea43200b01fd5a 593 | 594 | PODFILE CHECKSUM: 618d4e55f04544e39ed5135631f40e4c0799d9b6 595 | 596 | COCOAPODS: 1.11.2 597 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcodeproj/xcshareddata/xcschemes/react-native-otp-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcodeproj/xcshareddata/xcschemes/react-native-otp.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/reactnativeotp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/reactnativeotp/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | @property (nonatomic, strong) UIWindow *window; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ios/reactnativeotp/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import "AppDelegate.h" 9 | 10 | #import 11 | #import 12 | 13 | @implementation AppDelegate 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 16 | { 17 | NSURL *jsCodeLocation; 18 | //for debug 19 | // jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 20 | // for production 21 | jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"reactnativeotp" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /ios/reactnativeotp/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-40x40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-60x60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "idiom" : "ios-marketing", 53 | "size" : "1024x1024", 54 | "scale" : "1x" 55 | } 56 | ], 57 | "info" : { 58 | "version" : 1, 59 | "author" : "xcode" 60 | } 61 | } -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/ios/reactnativeotp/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/reactnativeotp/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/reactnativeotp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | OTP 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSCameraUsageDescription 41 | camera is needed 42 | NSLocationWhenInUseUsageDescription 43 | 44 | NSPhotoLibraryAddUsageDescription 45 | camera is needed 46 | NSPhotoLibraryUsageDescription 47 | photo lib is needed 48 | UIAppFonts 49 | 50 | UILaunchStoryboardName 51 | LaunchScreen 52 | UIRequiredDeviceCapabilities 53 | 54 | armv7 55 | 56 | UISupportedInterfaceOrientations 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationLandscapeLeft 60 | UIInterfaceOrientationLandscapeRight 61 | 62 | UIViewControllerBasedStatusBarAppearance 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /ios/reactnativeotp/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactnativeotp", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "android": "react-native run-android", 7 | "ios": "react-native run-ios", 8 | "start": "react-native start", 9 | "test": "jest", 10 | "lint": "eslint ." 11 | }, 12 | "dependencies": { 13 | "@react-native-async-storage/async-storage": "^1.16.1", 14 | "@react-navigation/native": "^6.0.8", 15 | "@react-navigation/native-stack": "^6.5.0", 16 | "@tradle/react-native-http": "^2.0.0", 17 | "assert": "^1.1.1", 18 | "browserify-zlib": "~0.1.4", 19 | "buffer": "^4.9.1", 20 | "console-browserify": "^1.1.0", 21 | "constants-browserify": "^1.0.0", 22 | "dns.js": "^1.0.1", 23 | "domain-browser": "^1.1.1", 24 | "https-browserify": "~0.0.0", 25 | "path-browserify": "0.0.0", 26 | "punycode": "^1.2.4", 27 | "querystring-es3": "~0.2.0", 28 | "react": "17.0.2", 29 | "react-native": "0.67.2", 30 | "react-native-auth0": "^2.13.0", 31 | "react-native-camera": "^4.2.1", 32 | "react-native-circular-progress": "^1.3.7", 33 | "react-native-crypto": "^2.2.0", 34 | "react-native-http": "^0.0.3", 35 | "react-native-level-fs": "^3.0.1", 36 | "react-native-masked-text": "^1.13.0", 37 | "react-native-os": "^1.2.6", 38 | "react-native-randombytes": "^3.6.1", 39 | "react-native-reanimated": "^2.4.1", 40 | "react-native-safe-area-context": "^3.3.2", 41 | "react-native-screens": "^3.11.1", 42 | "react-native-svg": "^12.1.1", 43 | "react-native-tcp": "^4.0.0", 44 | "react-native-udp": "^2.1.0", 45 | "react-native-vector-icons": "^9.0.0", 46 | "readable-stream": "1.0.33", 47 | "stream-browserify": "^3.0.0", 48 | "thirty-two": "^1.0.2", 49 | "timers-browserify": "^1.0.1", 50 | "tty-browserify": "0.0.0", 51 | "url": "~0.10.1", 52 | "vm-browserify": "0.0.4" 53 | }, 54 | "devDependencies": { 55 | "@babel/core": "^7.12.9", 56 | "@babel/runtime": "^7.12.5", 57 | "@react-native-community/eslint-config": "^2.0.0", 58 | "babel-jest": "^26.6.3", 59 | "eslint": "7.14.0", 60 | "jest": "^26.6.3", 61 | "metro-react-native-babel-preset": "^0.66.2", 62 | "react-test-renderer": "17.0.2", 63 | "rn-nodeify": "^10.3.0" 64 | }, 65 | "jest": { 66 | "preset": "react-native" 67 | }, 68 | "react-native": { 69 | "zlib": "browserify-zlib", 70 | "console": "console-browserify", 71 | "constants": "constants-browserify", 72 | "crypto": "react-native-crypto", 73 | "dns": "dns.js", 74 | "net": "react-native-tcp", 75 | "domain": "domain-browser", 76 | "http": "@tradle/react-native-http", 77 | "https": "https-browserify", 78 | "os": "react-native-os", 79 | "path": "path-browserify", 80 | "querystring": "querystring-es3", 81 | "fs": "react-native-level-fs", 82 | "_stream_transform": "readable-stream/transform", 83 | "_stream_readable": "readable-stream/readable", 84 | "_stream_writable": "readable-stream/writable", 85 | "_stream_duplex": "readable-stream/duplex", 86 | "_stream_passthrough": "readable-stream/passthrough", 87 | "dgram": "react-native-udp", 88 | "stream": "stream-browserify", 89 | "timers": "timers-browserify", 90 | "tty": "tty-browserify", 91 | "vm": "vm-browserify", 92 | "tls": false 93 | }, 94 | "browser": { 95 | "zlib": "browserify-zlib", 96 | "console": "console-browserify", 97 | "constants": "constants-browserify", 98 | "crypto": "react-native-crypto", 99 | "dns": "dns.js", 100 | "net": "react-native-tcp", 101 | "domain": "domain-browser", 102 | "http": "@tradle/react-native-http", 103 | "https": "https-browserify", 104 | "os": "react-native-os", 105 | "path": "path-browserify", 106 | "querystring": "querystring-es3", 107 | "fs": "react-native-level-fs", 108 | "_stream_transform": "readable-stream/transform", 109 | "_stream_readable": "readable-stream/readable", 110 | "_stream_writable": "readable-stream/writable", 111 | "_stream_duplex": "readable-stream/duplex", 112 | "_stream_passthrough": "readable-stream/passthrough", 113 | "dgram": "react-native-udp", 114 | "stream": "stream-browserify", 115 | "timers": "timers-browserify", 116 | "tty": "tty-browserify", 117 | "vm": "vm-browserify", 118 | "tls": false 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## Explanation 2 | Two implement a two factor authentication you can use several ways. One of them is a one time passoword. 3 | One time password based on two types: 4 | - TOTP 5 | - HOTP 6 | 7 | 8 | This is a react native application which demonstrates similar functionality same as Google Authentiocator 9 | 10 | 11 | In this application, also you can find a OAuth authentication flow. The idea behind this is that user authenticates by an authentication server and secret key could return in a claim to the application and automatically user redirects to OTP screen. 12 | It's under implementation. 13 | 14 | 15 | ### Installation 16 | 17 | 18 | - Run **`npm i`**. 19 | - To setup the crypto libraries run this command 20 | **`./node_modules/.bin/rn-nodeify --hack --install`** 21 | 22 | ### Run 23 | - android: **`react-native run-android`** 24 | 25 | 26 | ### Config 27 | you can find all the application configs in **`src/lib/settings`**. 28 | ##### options 29 | ``` 30 | options: { 31 | name: 'whatever you like', 32 | keySize: 32, // secret key is 32 characters long 33 | codeLength: 6, // authentication code is 6 digits long 34 | epoch: 0, 35 | timeSlice: 60 // each code is valid for 60 seconds 36 | } 37 | ``` 38 | 39 | ### Screen shots 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /shim.js: -------------------------------------------------------------------------------- 1 | if (typeof __dirname === 'undefined') global.__dirname = '/' 2 | if (typeof __filename === 'undefined') global.__filename = '' 3 | if (typeof process === 'undefined') { 4 | global.process = require('process') 5 | } else { 6 | const bProcess = require('process') 7 | for (var p in bProcess) { 8 | if (!(p in process)) { 9 | process[p] = bProcess[p] 10 | } 11 | } 12 | } 13 | 14 | process.browser = false 15 | if (typeof Buffer === 'undefined') global.Buffer = require('buffer').Buffer 16 | 17 | // global.location = global.location || { port: 80 } 18 | const isDev = typeof __DEV__ === 'boolean' && __DEV__ 19 | process.env['NODE_ENV'] = isDev ? 'development' : 'production' 20 | if (typeof localStorage !== 'undefined') { 21 | localStorage.debug = isDev ? '*' : '' 22 | } 23 | -------------------------------------------------------------------------------- /src/animations/graminsta/graminsta-gem-border.json: -------------------------------------------------------------------------------- 1 | {"v":"5.1.5","fr":25,"ip":0,"op":48,"w":1080,"h":1080,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":1080,"h":1080,"u":"images/","p":"circle_active.png"}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gem-color Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[341.45,277.219,0],"ix":2},"a":{"a":0,"k":[-174.702,5.382,0],"ix":1},"s":{"a":0,"k":[71.631,74.16,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-29.11,-5.382],[-51.656,-2.773],[-29.11,5.382],[0.11,5.382],[30.078,5.382],[51.656,-2.773],[30.078,-5.382]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.517647087574,0.827450990677,0.850980401039,1],"e":[0.396078437567,0.784313738346,0.815686285496,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0.396078437567,0.784313738346,0.815686285496,1],"e":[0.75686275959,0.913725495338,0.92549020052,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[0.75686275959,0.913725495338,0.92549020052,1],"e":[0.54509806633,0.800000011921,0.866666674614,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0.54509806633,0.800000011921,0.866666674614,1],"e":[0.43137255311,0.749019622803,0.835294127464,1]},{"t":40}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.498,5.382],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[537,537],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"top","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"gem-Asset 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,584.219,0],"ix":2},"a":{"a":0,"k":[540,435.5,0],"ix":1},"s":{"a":0,"k":[72.889,72.889,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[132.656,-132.656],[-132.656,132.656],[75.292,132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.585],"y":[1]},"o":{"x":[0.167],"y":[0.252]},"n":["0p585_1_0p167_0p252"],"t":0,"s":[0.396078437567,0.784313738346,0.815686285496,1],"e":[0.450980395079,0.730565130711,0.847058832645,1]},{"i":{"x":[0.701],"y":[1]},"o":{"x":[0.348],"y":[0]},"n":["0p701_1_0p348_0"],"t":5,"s":[0.450980395079,0.730565130711,0.847058832645,1],"e":[0.396078437567,0.784313738346,0.815686285496,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0.396078437567,0.784313738346,0.815686285496,1],"e":[0.396078437567,0.784313738346,0.815686285496,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p833_1_0p333_0"],"t":35,"s":[0.396078437567,0.784313738346,0.815686285496,1],"e":[0.396078437567,0.784313738346,0.815686285496,1]},{"t":40}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.656,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-44.403,-132.656],[-101.767,132.656],[101.767,132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[-0.167]},"n":["0p667_1_0p167_-0p167"],"t":0,"s":[0.638999998569,0.870999991894,0.889999985695,1],"e":[0.638999938965,0.870999991894,0.889999985695,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":5,"s":[0.638999938965,0.870999991894,0.889999985695,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.639215707779,0.870588243008,0.890196084976,1]},{"t":15}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[309.714,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-137.345,-132.656],[8.825,132.656],[137.344,-132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":0,"s":[0.757000029087,0.913999974728,0.925000011921,1],"e":[0.757000029087,0.913999974728,0.925000011921,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0.757000029087,0.913999974728,0.925000011921,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.75686275959,0.913725495338,0.92549020052,1]},{"t":20}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[402.656,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-0.276,-132.656],[-128.795,132.656],[128.795,132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[0.517999947071,0.827000021935,0.851000010967,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.517647087574,0.827450990677,0.850980401039,1]},{"t":25}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[540.276,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-137.62,-132.656],[-8.549,132.656],[137.62,-132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[0.75686275959,0.913725495338,0.92549020052,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":25,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.75686275959,0.913725495338,0.92549020052,1]},{"t":30}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[677.62,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[44.678,-132.656],[-101.491,132.656],[101.491,132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":25,"s":[0.638999938965,0.870999991894,0.889999985695,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.639215707779,0.870588243008,0.890196084976,1]},{"t":35}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[770.562,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-132.38,-132.656],[-75.567,132.656],[132.38,132.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[0.395999997854,0.783999979496,0.815999984741,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[1.254]},"o":{"x":[0.333],"y":[0]},"n":["0p833_1p254_0p333_0"],"t":35,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.396078437567,0.784313738346,0.815686285496,1]},{"t":40}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[947.62,132.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"act-7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-270,-302.543],[269.999,302.544],[270,302.544],[-62.053,-302.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.638999998569,0.870999991894,0.889999985695,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.639215707779,0.870588243008,0.890196084976,1]},{"t":16}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[270,567.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b-act-1","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-166.026,-302.543],[166.027,302.544],[37.508,-302.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[0.518000006676,0.827000021935,0.851000010967,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.517647087574,0.827450990677,0.850980401039,1]},{"t":24}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[373.973,567.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b-act-2","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-128.795,-302.543],[-0.276,302.544],[128.795,-302.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[0.638999998569,0.870999991894,0.889999985695,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.639215707779,0.870588243008,0.890196084976,1]},{"t":32}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[540.276,567.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b-act-3","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-36.955,-302.543],[-166.026,302.544],[-166.025,302.544],[166.027,-302.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0.395999997854,0.783999979496,0.815999984741,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.395999997854,0.783999979496,0.815999984741,1]},{"t":40}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[706.026,567.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b-act-4","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[62.053,-302.543],[-270,302.544],[-269.999,302.544],[270,-302.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[0.638999998569,0.870999991894,0.889999985695,1],"e":[0.450980395079,0.729411780834,0.847058832645,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[0.450980395079,0.729411780834,0.847058832645,1],"e":[0.639215707779,0.870588243008,0.890196084976,1]},{"t":48}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[810,567.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b-act-5","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"circle_active.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":47}],"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[540,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":48,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /src/animations/graminsta/images/1circle_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/src/animations/graminsta/images/1circle_active.png -------------------------------------------------------------------------------- /src/animations/graminsta/images/circle_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/src/animations/graminsta/images/circle_active.png -------------------------------------------------------------------------------- /src/animations/loader_spinner.json: -------------------------------------------------------------------------------- 1 | {"v":"4.11.1","fr":29.9700012207031,"ip":0,"op":80.0000032584668,"w":90,"h":90,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.855,89.855],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[36],"e":[28]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[28],"e":[36]},{"t":80.0000032584668}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[4],"e":[16]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[16],"e":[4]},{"t":80.0000032584668}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[394],"e":[754]},{"t":80.0000032584668}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.072,-0.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,60,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.855,89.855],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[28],"e":[36]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[36],"e":[28]},{"t":80.0000032584668}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[16],"e":[4]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[4],"e":[16]},{"t":80.0000032584668}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[216],"e":[576]},{"t":80.0000032584668}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.072,-0.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[93.333,93.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.855,89.855],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[38],"e":[26]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":20,"s":[26],"e":[38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[38],"e":[26]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[26],"e":[38]},{"t":80.0000032584668}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[6],"e":[18]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":20,"s":[18],"e":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[6],"e":[18]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[18],"e":[6]},{"t":80.0000032584668}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[124],"e":[484]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[484],"e":[844]},{"t":80.0000032584668}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.072,-0.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[93.333,93.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.855,89.855],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[26],"e":[38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":20,"s":[38],"e":[26]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[26],"e":[38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[38],"e":[26]},{"t":80.0000032584668}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[18],"e":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":20,"s":[6],"e":[18]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":40,"s":[18],"e":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[6],"e":[18]},{"t":80.0000032584668}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-55],"e":[305]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[305],"e":[665]},{"t":80.0000032584668}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.072,-0.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0}]} -------------------------------------------------------------------------------- /src/animations/love_it.json: -------------------------------------------------------------------------------- 1 | {"v":"5.1.1","fr":59.9400024414062,"ip":0,"op":93.0000037879676,"w":500,"h":500,"nm":"heart_test","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.375,250.125,0],"ix":2},"a":{"a":0,"k":[-125,30,0],"ix":1},"s":{"a":0,"k":[36.957,36.957,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[21.75,21.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.40000000596,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-124.375,-136.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":-1,"s":[100,100],"e":[200,200]},{"t":0}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-1,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[100],"e":[0]},{"t":105.000004276738}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":301.000012259981,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[100],"e":[0]},{"t":101.000004113814}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[232.874,232.874,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[68.752,68.752],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.400000035763,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[17.126,17.126],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[177.99,177.99],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"t":90.0000036657751}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":301.000012259981,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"loading","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-41,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":500,"h":500,"ip":0,"op":301.000012259981,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.25,0.125],[-0.25,-39.875]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[0],"e":[100]},{"t":20.0000008146167}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[0],"e":[100]},{"t":26.0000010590017}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.400000035763,0,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[100],"e":[0]},{"t":40.0000016292334}],"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"rp","c":{"a":0,"k":7,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":5,"tr":{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":103,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[100],"e":[0]},{"t":40.0000016292334}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":301.000012259981,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"heart Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.494,249.678,0],"ix":2},"a":{"a":0,"k":[60,58.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[0,0,100],"e":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":37,"s":[130,130,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":46,"s":[100,100,100],"e":[140,140,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":55,"s":[140,140,100],"e":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":64,"s":[110,110,100],"e":[120,120,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":77,"s":[120,120,100],"e":[0,0,100]},{"t":92.0000037472368}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.38,-3.651],[4.138,0],[0.251,-5.415],[0,0],[-0.376,-1.007],[0,0],[-1.631,10.828],[0,0],[0.126,0.378],[5.015,0]],"o":[[-1.756,-3.777],[-5.392,0],[0,0],[0,1.134],[3.26,10.2],[0,0],[0,0],[0,-0.504],[-0.751,-4.911],[-4.264,0]],"v":[[-0.063,-10.578],[-9.969,-17],[-20,-7.429],[-20,-7.052],[-19.373,-3.652],[0.063,17],[20,-5.792],[20,-7.052],[19.874,-8.311],[9.342,-17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784316063,0.388235300779,0.227450981736,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[100],"e":[99]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[99],"e":[0]},{"t":92.0000037472368}],"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.693,58.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":301.000012259981,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /src/animations/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Animations" 3 | } -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mo0rti/react-native-authenticator/a5cc2f09804a7e3ee32a886ece4fdbd8fcb56f77/src/assets/images/splash.png -------------------------------------------------------------------------------- /src/assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Assets" 3 | } -------------------------------------------------------------------------------- /src/components/Icon-Entypo.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Icon from "react-native-vector-icons/Entypo"; 3 | 4 | export default ({ name, ...props }) => ( 5 | 9 | ); -------------------------------------------------------------------------------- /src/components/Icon-Ionicons.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Platform } from "react-native"; 3 | import Icon from "react-native-vector-icons/Ionicons"; 4 | 5 | export default ({ name, ...props }) => ( 6 | 10 | ); -------------------------------------------------------------------------------- /src/components/Icon-Text.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { View, StyleSheet, Text } from "react-native"; 3 | import Icon from "./Icon"; 4 | 5 | const IconText = ({ type, title, iconName, textColor, size }) => 6 | 7 | 13 | {title} 14 | 15 | 16 | const styles = StyleSheet.create({ 17 | container: { 18 | flex: 1, 19 | flexDirection: 'row', 20 | alignItems: 'center', 21 | paddingLeft: 10, 22 | paddingRight: 10 23 | }, 24 | title: { 25 | paddingLeft: 5 26 | } 27 | }); 28 | 29 | export default IconText; -------------------------------------------------------------------------------- /src/components/Icon.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import IconEntypo from "./Icon-Entypo"; 3 | import IconIonicons from "./Icon-Ionicons"; 4 | import IconTypes from "@Lib/icon-types"; 5 | 6 | const Icon = ({ type, name, ...props }) => { 7 | type = (type) ? type : IconTypes.ENTYPO; 8 | return (type == IconTypes.ENTYPO) ? 9 | : 10 | 11 | } 12 | 13 | export default Icon; -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | import IconEntypo from './Icon-Entypo'; 2 | import IconIonicons from './Icon-Ionicons'; 3 | import Icon from './Icon'; 4 | import IconText from './Icon-Text'; 5 | 6 | export { 7 | IconEntypo, 8 | IconIonicons, 9 | Icon, 10 | IconText 11 | } -------------------------------------------------------------------------------- /src/components/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Components" 3 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import RootNavigation from "@Navigations/Root-Navigation"; 3 | import CONSTANTS from "@Lib/constants"; 4 | import settings from "@Lib/settings"; 5 | import { authorize, checkIfAuthorizedBefore } from "@Lib/authorize-service"; 6 | import UnAuthorizedScreen from '@Screens/unauthorized'; 7 | 8 | export default class Root extends Component { 9 | 10 | constructor(props) { 11 | super(props); 12 | this.state = { 13 | isAuthorized: false, 14 | needAuthorizeFlow: settings.authFlowType != CONSTANTS.AUTH_FLOW.NONE 15 | } 16 | } 17 | 18 | async componentDidMount() { 19 | if (settings.authFlowType == CONSTANTS.AUTHORIZE_TYPE.OAUTH2) { 20 | let isAuthorizedBefore = await checkIfAuthorizedBefore(); 21 | if (!isAuthorizedBefore) { 22 | authorize(CONSTANTS.AUTHORIZE_TYPE.IDENTITY_SERVER) 23 | .then(credentials => { 24 | this.setState({ isAuthorized: true }); 25 | this.setState({ token: JSON.stringify(credentials) }); 26 | }) 27 | .catch(error => { 28 | console.log(error); 29 | }) 30 | } else { 31 | this.setState({ isAuthorized: true }); 32 | } 33 | } 34 | } 35 | 36 | render() { 37 | const { isAuthorized, needAuthorizeFlow } = this.state; 38 | return ( 39 | (needAuthorizeFlow && !isAuthorized) ? 40 | 41 | : 42 | 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/lib/async-helpers.js: -------------------------------------------------------------------------------- 1 | // a simple memoize function that takes in a function and returns a memoized function 2 | export const memoize = (fn) => { 3 | let cache = {}; 4 | return (...args) => { 5 | let n = args[0]; // just taking one argument here 6 | if (n in cache) { 7 | return cache[n]; 8 | } 9 | else { 10 | let result = fn(n); 11 | cache[n] = result; 12 | return result; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/lib/authorize-service.js: -------------------------------------------------------------------------------- 1 | import Auth0 from 'react-native-auth0'; 2 | import CONSTANTS from "@Lib/constants"; 3 | import settings from "@Lib/settings"; 4 | import { storeData, retrieveData } from "@Lib/storage"; 5 | 6 | export const authorize = (authorizeType) => { 7 | switch (authorizeType) { 8 | case CONSTANTS.AUTHORIZE_TYPE.AUTH0: { 9 | return new Promise((resolve, reject) => { 10 | _auth0().then(credentials => { 11 | resolve(credentials); 12 | }, error => { 13 | reject(error); 14 | }) 15 | }); 16 | } 17 | case CONSTANTS.AUTHORIZE_TYPE.IDENTITY_SERVER: { 18 | return new Promise((resolve, reject) => { 19 | _identityServer().then(credentials => { 20 | resolve(credentials); 21 | }, error => { 22 | reject(error); 23 | }) 24 | }); 25 | } 26 | default: return Promise.reject("AUTHORIZE_TYPE is unknown"); 27 | } 28 | } 29 | 30 | export const checkIfAuthorizedBefore = async () => { 31 | let data = await retrieveData(); 32 | return Promise.resolve(data.token != ""); 33 | } 34 | 35 | const auth0 = new Auth0(settings.authorizeServersSetting.auth0.credential); 36 | const _auth0 = () => auth0.webAuth.authorize(settings.authorizeServersSetting.auth0.consent); 37 | 38 | const _identityServer = () => auth0.webAuth.authorize(settings.authorizeServersSetting.auth0.consent); 39 | -------------------------------------------------------------------------------- /src/lib/constants.js: -------------------------------------------------------------------------------- 1 | const DEV_URL = "https://mywebsite.com/endpoint/"; 2 | const PROD_URL = "https://mywebsite.com/endpoint/"; 3 | 4 | const URL = (__DEV__) ? DEV_URL : PROD_URL; 5 | const CLIENT_ID = '572236995712-oodp2kqsob1l7qbt5cpiq2pcmpa5cua1.apps.googleusercontent.com'; 6 | 7 | const AUTH_FLOW = { 8 | NONE: 'none', 9 | OAUTH2: 'oauth2' 10 | } 11 | 12 | const AUTHORIZE_TYPE = { 13 | AUTH0: 'auth0', 14 | IDENTITY_SERVER: 'indentity-server' 15 | } 16 | 17 | export default { 18 | URL, 19 | CLIENT_ID, 20 | AUTHORIZE_TYPE, 21 | AUTH_FLOW 22 | } -------------------------------------------------------------------------------- /src/lib/icon-types.js: -------------------------------------------------------------------------------- 1 | const ENTYPO = 'Entypo'; 2 | const IONICONS = 'Ionicons'; 3 | 4 | export default { 5 | ENTYPO, 6 | IONICONS 7 | } -------------------------------------------------------------------------------- /src/lib/otp.js: -------------------------------------------------------------------------------- 1 | import * as Crypto from "react-native-crypto"; 2 | 3 | module.exports = OTP; 4 | 5 | var Base32 = require('thirty-two'); 6 | 7 | function OTP(options) { 8 | if ('string' === typeof options) return OTP.parse(options); 9 | if (!(this instanceof OTP)) return new OTP(options); 10 | options = clone(options || {}); 11 | options.name = String(options.name || 'OTP-Authentication').split(/[^\w|_|-|@]/).join(''); 12 | options.keySize = isNaN(options.keySize) ? 32 : options.keySize; 13 | options.codeLength = isNaN(options.codeLength) ? 6 : options.codeLength; 14 | options.secret = options.secret || generateKey(options.keySize); 15 | options.epoch = (isNaN(options.epoch) ? 0 : options.epoch) * 1000; 16 | options.timeSlice = (isNaN(options.timeSlice) ? 30 : options.timeSlice) * 1000; 17 | Object.keys(OTP.prototype).forEach(function(method) { 18 | if ('function' !== typeof OTP.prototype[method]) return; 19 | Object.defineProperty(this, method, { 20 | value: OTP.prototype[method].bind(this, options) 21 | }); 22 | }.bind(this)); 23 | 24 | Object.defineProperty(this, 'secret', { 25 | value:options.secret, 26 | enumerable:true 27 | }); 28 | Object.defineProperty(this, 'totpURL', { 29 | value:['otpauth://totp/', options.name, '?secret=', encodeURIComponent(this.secret) ].join(''), 30 | enumerable:true 31 | }); 32 | Object.defineProperty(this, 'hotpURL', { 33 | value:['otpauth://hotp/', options.name, '?secret=', encodeURIComponent(this.secret) ].join(''), 34 | enumerable:true 35 | }); 36 | } 37 | 38 | function generateKey(length) { 39 | var set = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz!@#$%^&*()<>?/[]{},.:;'; 40 | var res = ''; 41 | while(res.length < length) { 42 | res += set[Math.floor(Math.random() * set.length)]; 43 | } 44 | return Base32.encode(res).toString().replace(/=/g, ''); 45 | } 46 | 47 | OTP.parse = function(str, options) { 48 | options = clone(options || {}); 49 | str = String(str || ''); 50 | var url = /^otpauth:\/\/[t|h]opt\/([\s|\S]+?)\?secret=([\s|\S]+)$/.exec(str); 51 | if (url) { 52 | options.name = url[1]; 53 | options.secret = url[2]; 54 | } else { 55 | options.secret = str; 56 | } 57 | return new OTP(options); 58 | }; 59 | 60 | OTP.prototype.hotp = function(options, counter) { 61 | var hmac = Crypto.createHmac('sha1', new Buffer(Base32.decode(options.secret))); 62 | hmac = new Buffer(hmac.update(UInt64Buffer(counter)).digest('hex'), 'hex'); 63 | var offset = hmac[19] & 0xf; 64 | var code = String((hmac[offset] & 0x7f) << 24 | (hmac[offset + 1] & 0xff) << 16 | (hmac[offset + 2] & 0xff) << 8 | (hmac[offset + 3] & 0xff)); 65 | code = ((new Array(options.codeLength + 1)).join('0')+code).slice(-1 * options.codeLength); 66 | return code; 67 | }; 68 | 69 | function UInt64Buffer(num) { 70 | var res = []; 71 | while (res.length < 8) { 72 | res.unshift(num & 0xFF); 73 | num = num >> 8; 74 | } 75 | return new Buffer(res); 76 | } 77 | 78 | OTP.prototype.totp = function(options) { 79 | var now = isNaN(options.now) ? Date.now() : options.now; 80 | var counter = Math.floor((now - options.epoch) / options.timeSlice); 81 | return this.hotp(counter); 82 | }; 83 | OTP.prototype.toString = function() { 84 | return '[object OTP]'; 85 | }; 86 | OTP.classID = 'OTP{@phidelta}'; 87 | OTP.prototype.toJSON = function(options) { 88 | var res = { 89 | 'class':OTP.classID, 90 | name:options.name, 91 | keySize:options.keySize, 92 | codeLength:options.codeLength, 93 | secret:this.secret, 94 | epoch:options.epoch / 1000, 95 | timeSlice:options.timeSlice / 1000 96 | }; 97 | return res; 98 | }; 99 | OTP.reviveJSON = function(key, val) { 100 | if (('object' !== typeof val) || (null === val) || (val['class'] !== OTP.classID)) return val; 101 | return OTP(val); 102 | }; 103 | 104 | function clone(obj) { 105 | if ('object' !== typeof obj) { 106 | return obj; 107 | } else if (Array.isArray(obj)) { 108 | return obj.map(clone); 109 | } else if (obj instanceof Date) { 110 | return new Date(obj.getTime()); 111 | } 112 | 113 | var res = {}; 114 | Object.keys(obj).forEach(function(key) { 115 | res[key] = clone(obj[key]); 116 | }); 117 | return res; 118 | } -------------------------------------------------------------------------------- /src/lib/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Lib" 3 | } -------------------------------------------------------------------------------- /src/lib/settings.js: -------------------------------------------------------------------------------- 1 | import CONSTANTS from "@Lib/constants"; 2 | 3 | export default { 4 | authFlowType: CONSTANTS.AUTH_FLOW.NONE, 5 | authorizeServersSetting: { 6 | auth0: { 7 | credential: { domain: 'mortitotti.auth0.com', clientId: 'ObQ5dKtrHSqTfaLD5ZKfJDR3mpEC7Bbc' }, 8 | consent: { scope: 'openid profile email', audience: 'https://mortitotti.auth0.com/userinfo' } 9 | }, 10 | indentityServer: { scope: 'openid profile email', audience: 'https://mortitotti.auth0.com/userinfo' } 11 | }, 12 | otp: { 13 | options: { 14 | name: 'SSP', 15 | keySize: 32, // secret key is 32 characters long 16 | codeLength: 6, // authentication code is 6 digits long 17 | epoch: 0, 18 | timeSlice: 60 // each code is valid for 60 seconds 19 | } 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/lib/storage.js: -------------------------------------------------------------------------------- 1 | import AsyncStorage from '@react-native-async-storage/async-storage'; 2 | 3 | export const storeData = async (data) => { 4 | try { 5 | return await AsyncStorage.setItem('data', JSON.stringify(data)); 6 | } catch (error) { 7 | console.log(error); 8 | } 9 | } 10 | 11 | export const retrieveData = async () => { 12 | try { 13 | const value = await AsyncStorage.getItem('data'); 14 | if (value !== null) { 15 | return Promise.resolve(JSON.parse(value)); 16 | } else 17 | return Promise.resolve({ token: '', secret: '' }); 18 | } catch (error) { 19 | console.log(error); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/navigations/Root-Navigation.js: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { NavigationContainer } from '@react-navigation/native'; 3 | import { createNativeStackNavigator } from '@react-navigation/native-stack'; 4 | 5 | import HomeScreen from '@Screens/home'; 6 | import OtpScreen from '@Screens/otp'; 7 | import BarcodeScreen from '@Screens/barcode'; 8 | const Stack = createNativeStackNavigator(); 9 | 10 | export default function RootNavigation() { 11 | return ( 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ) 20 | } -------------------------------------------------------------------------------- /src/navigations/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Navigations" 3 | } -------------------------------------------------------------------------------- /src/screens/barcode/Layout.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Text, View, TouchableOpacity } from 'react-native'; 3 | import { RNCamera } from "react-native-camera"; 4 | import { IconText } from '@Components'; 5 | import styles from "./style"; 6 | 7 | const PendingView = () => 8 | 16 | Waiting 17 | 18 | 19 | const Layout = ({ setCameraRef, onBarCodeRead, camera, maskColWidth, maskRowHeight, back }) => 20 | 21 | 22 | { }} 34 | onZoomChanged={() => { }} 35 | androidCameraPermissionOptions={{ 36 | title: 'Permission to use camera', 37 | message: 'We need your permission to use your camera phone', 38 | buttonPositive: 'Ok', 39 | buttonNegative: 'Cancel', 40 | }} 41 | 42 | style={styles.preview} 43 | type={camera.type} 44 | captureAudio={false} 45 | /> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | Please scan the barcode. 58 | 59 | 60 | 61 | 62 | 63 | 64 | export default Layout; 65 | -------------------------------------------------------------------------------- /src/screens/barcode/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Layout from "./Layout"; 3 | import { Dimensions } from "react-native"; 4 | import { RNCamera } from "react-native-camera"; 5 | import { storeData } from "@Lib/storage"; 6 | 7 | class BarcodeScreen extends Component { 8 | 9 | constructor(props) { 10 | super(props); 11 | this.state = { 12 | camera: { 13 | type: RNCamera.Constants.Type.back, 14 | flashMode: RNCamera.Constants.FlashMode.auto, 15 | barcodeFinderVisible: true 16 | } 17 | }; 18 | } 19 | 20 | _onBarCodeRead = (scanResult) => { 21 | if (scanResult.data != null && scanResult.type == RNCamera.Constants.BarCodeType.qr) { 22 | let secretKey = scanResult.data; 23 | if (secretKey.length < 32) { 24 | alert('The Secret Key must be 32 characters long'); 25 | return; 26 | } 27 | 28 | storeData({ 29 | secret: secretKey 30 | }).then(() => this.props.navigation.navigate('Otp')); 31 | } 32 | } 33 | 34 | _setCameraRef = ref => this.camera = ref; 35 | 36 | _back = ()=>{ 37 | this.props.navigation.goBack(); 38 | } 39 | 40 | render() { 41 | const { camera } = this.state; 42 | 43 | const { height, width } = Dimensions.get('window'); 44 | const maskRowHeight = Math.round((height - 300) / 20); 45 | const maskColWidth = (width - 300) / 2; 46 | 47 | return ( 48 | 56 | ); 57 | } 58 | } 59 | 60 | export default BarcodeScreen; -------------------------------------------------------------------------------- /src/screens/barcode/style.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet, Platform } from 'react-native'; 2 | 3 | const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1 6 | }, 7 | preview: { 8 | flex: 1, 9 | justifyContent: 'flex-end', 10 | alignItems: 'center' 11 | }, 12 | overlay: { 13 | position: 'absolute', 14 | width:'100%', 15 | padding: 16, 16 | alignItems: 'center' 17 | }, 18 | topOverlay: { 19 | top: 0, 20 | justifyContent: 'center' 21 | }, 22 | scanScreenMessage: { 23 | fontSize: 14, 24 | paddingTop: Platform.OS === 'ios' ? 20 :0, 25 | color: 'white', 26 | textAlign: 'center' 27 | }, 28 | maskOutter: { 29 | position: 'absolute', 30 | top: 0, 31 | left: 0, 32 | width: '100%', 33 | height: '100%', 34 | alignItems: 'center', 35 | justifyContent: 'space-around', 36 | }, 37 | maskInner: { 38 | width: 300, 39 | backgroundColor: 'transparent', 40 | borderColor: 'white', 41 | borderWidth: 1, 42 | }, 43 | maskFrame: { 44 | backgroundColor: 'rgba(1,1,1,0.6)', 45 | }, 46 | maskRow: { 47 | width: '100%', 48 | }, 49 | maskCenter: { flexDirection: 'row' }, 50 | backButton:{ 51 | position:'absolute', 52 | top:30, 53 | left:0, 54 | } 55 | }); 56 | 57 | export default styles; 58 | -------------------------------------------------------------------------------- /src/screens/home/Layout.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Text, View, TextInput, TouchableOpacity } from 'react-native'; 3 | import { TextInputMask } from 'react-native-masked-text'; 4 | import styles from "./style"; 5 | 6 | const ProvidedKeyLayout = ({ secretKey, onChangeText, onAddKeyButtonClick }) => 7 | 8 | 18 | 19 | 20 | Add Key 21 | 22 | 23 | 24 | 25 | 26 | const Layout = ({ type, onItemClicked, secretKey, onChangeText, onAddKeyButtonClick }) => 27 | 28 | You can add an account selecting one of the following options: 29 | onItemClicked('barcode')}> 30 | Scan a barcode 31 | 32 | {} 33 | onItemClicked('key')}> 34 | Enter a provided key 35 | 36 | { 37 | (type == "key") ? : null 38 | } 39 | 40 | 41 | export default Layout; -------------------------------------------------------------------------------- /src/screens/home/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Layout from "./Layout"; 3 | import { retrieveData, storeData } from "@Lib/storage"; 4 | 5 | class HomeScreen extends Component { 6 | 7 | constructor(props) { 8 | super(props); 9 | this.state = { 10 | type: 'none', 11 | secretKey: '' 12 | }; 13 | } 14 | 15 | componentDidMount() { 16 | retrieveData().then((data) => { 17 | if (data.secret) 18 | this.props.navigation.navigate('Otp'); 19 | }); 20 | } 21 | 22 | _onItemClicked = (type) => { 23 | this.setState({ type }); 24 | if (type == 'barcode') 25 | this.props.navigation.navigate('Barcode'); 26 | } 27 | 28 | _onChangeText = (secretKey) => { 29 | this.setState({ secretKey }); 30 | } 31 | 32 | _onAddKeyButtonClick = () => { 33 | let secretKey = this.state.secretKey.split('-').join(''); 34 | if (secretKey.length < 32) { 35 | alert('The Secret Key must be 32 characters long'); 36 | return; 37 | } 38 | 39 | storeData({ 40 | secret: secretKey 41 | }).then(() => this.setState({ type: 'none', secretKey: '' }, () => this.props.navigation.navigate('Otp'))); 42 | } 43 | 44 | render() { 45 | const { type, secretKey } = this.state; 46 | 47 | return ( 48 | 55 | ); 56 | } 57 | } 58 | 59 | export default HomeScreen; -------------------------------------------------------------------------------- /src/screens/home/style.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet, Platform } from 'react-native'; 2 | 3 | const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | paddingTop: Platform.OS === 'ios' ? 30 :0, 7 | justifyContent: 'center', 8 | alignItems: 'center', 9 | backgroundColor: '#FFFFFF', 10 | }, 11 | caption: { 12 | fontSize: 15, 13 | textAlign: 'center', 14 | margin: 10, 15 | }, 16 | itemCaption: { 17 | fontSize: 20, 18 | textAlign: 'center', 19 | margin: 10, 20 | }, 21 | providerKeyContainer: { 22 | flex: 1, 23 | width: '100%', 24 | justifyContent: 'center', 25 | alignItems: 'center' 26 | }, 27 | providerKeyInput: { 28 | width: '70%', 29 | borderWidth: 1, 30 | borderRadius: 5, 31 | padding: 10, 32 | textAlign: 'center', 33 | fontSize: 17 34 | }, 35 | addKeyButton: { 36 | width: '45%', 37 | justifyContent: 'center', 38 | alignItems: 'center', 39 | backgroundColor: 'green', 40 | padding: 20, 41 | borderRadius: 15, 42 | margin: 10 43 | }, 44 | addKeyButtonCaption: { 45 | color: 'white', 46 | fontWeight: 'bold' 47 | } 48 | }); 49 | 50 | export default styles; 51 | -------------------------------------------------------------------------------- /src/screens/otp/Layout.js: -------------------------------------------------------------------------------- 1 | 2 | import React from "react"; 3 | import { Text, View, TouchableOpacity } from 'react-native'; 4 | import { AnimatedCircularProgress } from 'react-native-circular-progress'; 5 | import { IconText } from '@Components'; 6 | import styles from "./style"; 7 | 8 | const Layout = ({ authCode, progress, remainingTime, logout }) => 9 | 10 | 11 | Authentication Code 12 | {authCode} 13 | 14 | {remainingTime} 15 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | export default Layout; -------------------------------------------------------------------------------- /src/screens/otp/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Layout from "./Layout"; 3 | import OTP from "@Lib/otp"; 4 | import settings from "@Lib/settings"; 5 | import { storeData, retrieveData } from "@Lib/storage"; 6 | 7 | class Home extends Component { 8 | 9 | constructor(props) { 10 | super(props); 11 | this.state = { 12 | progress: 100, 13 | authCode: 0, 14 | secretKey: '', 15 | remainingTime: settings.otp.options.timeSlice 16 | }; 17 | } 18 | 19 | componentDidMount() { 20 | retrieveData().then((data) => { 21 | let secret = data.secret; 22 | this.setState({ secretKey: secret }, () => { 23 | this._startTheTimer(); 24 | }); 25 | }); 26 | } 27 | 28 | componentWillUnmount() { 29 | this.timerInterval && clearInterval(this.timerInterval); 30 | this.timerInterval = false; 31 | } 32 | 33 | _generateNewCode = () => { 34 | let options = { ...settings.otp.options, secret: this.state.secretKey }; 35 | let otp = OTP(options); 36 | // HOTP: let newAuthCode = otp.hotp(`pas the counter here`); 37 | let newAuthCode = otp.totp(); 38 | // console.log(newAuthCode); 39 | this.setState({ authCode: newAuthCode }); 40 | } 41 | 42 | _getRemainingTime = (epoch, timeSlice) => { 43 | return Math.floor(timeSlice + ((timeSlice - ((new Date().getTime() - epoch) % (timeSlice * 1000))) / 1000)); 44 | } 45 | 46 | _startTheTimer() { 47 | this._generateNewCode(); 48 | this.timerInterval = setInterval(() => { 49 | remainingTime = this._getRemainingTime(settings.otp.options.epoch, settings.otp.options.timeSlice); 50 | this._generateNewCode(); 51 | 52 | let progress = 100 - ((100 * remainingTime) / settings.otp.options.timeSlice); 53 | // console.log(progress, remainingTime); 54 | this.setState({ progress, remainingTime }); 55 | }, 1000); 56 | } 57 | 58 | _logout = () => { 59 | storeData({ token: '', secret: '' }).then(() => this.props.navigation.navigate('Home')); 60 | } 61 | 62 | render() { 63 | const { authCode, progress, remainingTime } = this.state; 64 | return ( 65 | 71 | ); 72 | } 73 | } 74 | 75 | export default Home; -------------------------------------------------------------------------------- /src/screens/otp/style.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from 'react-native'; 2 | 3 | const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | justifyContent: 'center', 7 | alignItems: 'center', 8 | backgroundColor: '#FFFFFF', 9 | }, 10 | logout: { 11 | width: '100%', 12 | height: 50, 13 | position: 'absolute', 14 | alignItems: 'center', 15 | bottom: 0, 16 | backgroundColor: 'transparent', 17 | }, 18 | remainingTime: { 19 | position: 'absolute', 20 | alignSelf: 'center' 21 | }, 22 | progressPanel: { 23 | justifyContent: 'center', 24 | alignItems: 'center' 25 | }, 26 | welcome: { 27 | fontSize: 20, 28 | textAlign: 'center', 29 | margin: 10, 30 | }, 31 | circles: { 32 | flexDirection: 'row', 33 | alignItems: 'center', 34 | }, 35 | progress: { 36 | margin: 10, 37 | }, 38 | }); 39 | 40 | export default styles; 41 | -------------------------------------------------------------------------------- /src/screens/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Screens" 3 | } -------------------------------------------------------------------------------- /src/screens/unauthorized/Layout.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Text, View, TouchableOpacity } from 'react-native'; 3 | import styles from "./style"; 4 | 5 | const Layout = () => 6 | 7 | 8 | You are not Authorized 9 | 10 | 11 | 12 | export default Layout; -------------------------------------------------------------------------------- /src/screens/unauthorized/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Layout from "./Layout"; 3 | 4 | class UnAuthorizedScreen extends Component { 5 | 6 | constructor(props) { 7 | super(props); 8 | } 9 | 10 | render() { 11 | return ( 12 | 13 | ); 14 | } 15 | } 16 | 17 | export default UnAuthorizedScreen; -------------------------------------------------------------------------------- /src/screens/unauthorized/style.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from 'react-native'; 2 | 3 | const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | justifyContent: 'center', 7 | alignItems: 'center', 8 | backgroundColor: '#FFFFFF', 9 | }, 10 | error: { 11 | fontSize: 20, 12 | textAlign: 'center', 13 | color: 'red', 14 | margin: 10, 15 | } 16 | }); 17 | 18 | export default styles; 19 | --------------------------------------------------------------------------------