├── .buckconfig ├── .eslintrc.json ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .vscode ├── .react │ ├── debuggerWorker.js │ ├── index.bundle │ └── index.map ├── launch.json └── settings.json ├── .watchmanconfig ├── LICENSE.txt ├── README.md ├── android ├── .project ├── .settings │ └── org.eclipse.buildship.core.prefs ├── app │ ├── .classpath │ ├── .project │ ├── .settings │ │ └── org.eclipse.buildship.core.prefs │ ├── BUCK │ ├── build.gradle │ ├── build_defs.bzl │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── blum │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── 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 ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app.json ├── babel.config.js ├── flow-typed └── npm │ ├── @babel │ ├── plugin-proposal-decorators_vx.x.x.js │ └── plugin-proposal-export-namespace-from_vx.x.x.js │ ├── babel-eslint_vx.x.x.js │ ├── babel-jest_vx.x.x.js │ ├── bugsnag-react-native_vx.x.x.js │ ├── eslint-config-airbnb_vx.x.x.js │ ├── eslint-plugin-flowtype_vx.x.x.js │ ├── eslint-plugin-import_vx.x.x.js │ ├── eslint-plugin-jsx-a11y_vx.x.x.js │ ├── eslint-plugin-prettier_vx.x.x.js │ ├── eslint-plugin-react-native_vx.x.x.js │ ├── eslint-plugin-react_vx.x.x.js │ ├── eslint_vx.x.x.js │ ├── flow-bin_v0.x.x.js │ ├── git-validate_vx.x.x.js │ ├── gulp-babel_vx.x.x.js │ ├── gulp-rename_vx.x.x.js │ ├── gulp-replace_vx.x.x.js │ ├── gulp-task-doc_vx.x.x.js │ ├── gulp_vx.x.x.js │ ├── jest_v23.x.x.js │ ├── lodash_v4.x.x.js │ ├── metro-react-native-babel-preset_vx.x.x.js │ ├── minimist_v1.x.x.js │ ├── moment-duration-format_vx.x.x.js │ ├── moment_v2.x.x.js │ ├── prettier_v1.x.x.js │ ├── react-native-fetch-blob_vx.x.x.js │ ├── react-native-image-processor_vx.x.x.js │ ├── react-native-logger_vx.x.x.js │ ├── react-native-sound_vx.x.x.js │ ├── react-navigation_v2.x.x.js │ ├── react-redux_v5.x.x.js │ ├── react-test-renderer_vx.x.x.js │ ├── redux-thunk_vx.x.x.js │ ├── redux_v4.x.x.js │ └── reselect_vx.x.x.js ├── gulp ├── .babelrc ├── bump.js ├── gulpfile.babel.js └── install.js ├── index.js ├── ios-debug.bundle ├── ios-debug.bundle.map ├── ios ├── Blum-Bridging-Header.h ├── Blum-tvOS │ └── Info.plist ├── Blum-tvOSTests │ └── Info.plist ├── Blum.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── Blum-tvOS.xcscheme │ │ └── Blum.xcscheme ├── Blum │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 1024x1024.png │ │ │ ├── 120x120-1.png │ │ │ ├── 120x120.png │ │ │ ├── 180x180.png │ │ │ ├── 40x40.png │ │ │ ├── 58x58.png │ │ │ ├── 60x60.png │ │ │ ├── 80x80.png │ │ │ ├── 87x87.png │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── launch_background.imageset │ │ │ ├── Contents.json │ │ │ ├── loading-1.png │ │ │ ├── loading-2.png │ │ │ └── loading.png │ ├── Info.plist │ ├── fonts │ │ ├── IBMPlexMono-ExtraLight.ttf │ │ ├── IBMPlexMono-Italic.ttf │ │ ├── IBMPlexMono-Medium.ttf │ │ └── IBMPlexMono-Regular.ttf │ └── main.m ├── BlumTests │ ├── BlumTests.m │ └── Info.plist ├── EmptyStab.swift ├── Podfile ├── blum.xcworkspace │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── sounds │ └── sound.mp3 └── web │ ├── kaleidoscope.js │ └── p5.min.js ├── metro.config.js ├── package.json ├── src ├── App.js ├── actions │ ├── CommonActions.js │ ├── DurationActions.js │ ├── GalleryActions.js │ ├── SettingsActions.js │ └── index.js ├── common │ ├── ui │ │ ├── ColorProgress.js │ │ ├── ImageButton.js │ │ ├── PulseButton.js │ │ ├── colors.js │ │ ├── images │ │ │ ├── icons │ │ │ │ ├── ic_battery@2x.png │ │ │ │ ├── ic_battery@3x.png │ │ │ │ ├── ic_close.png │ │ │ │ ├── ic_close_white@2x.png │ │ │ │ ├── ic_close_white@3x.png │ │ │ │ ├── ic_done.png │ │ │ │ ├── ic_download.png │ │ │ │ ├── ic_erase.png │ │ │ │ ├── ic_grid.png │ │ │ │ ├── ic_info.png │ │ │ │ ├── ic_link.png │ │ │ │ ├── ic_mute.png │ │ │ │ ├── ic_print.png │ │ │ │ ├── ic_print2.png │ │ │ │ └── ic_sound.png │ │ │ ├── img_fail.png │ │ │ ├── img_launch.png │ │ │ ├── index.js │ │ │ ├── info │ │ │ │ ├── img_info1@2x.png │ │ │ │ ├── img_info2@2x.png │ │ │ │ ├── img_info3@2x.png │ │ │ │ └── img_info4@2x.png │ │ │ └── old │ │ │ │ ├── error_background@2x.png │ │ │ │ ├── error_background@3x.png │ │ │ │ ├── ic_about.png │ │ │ │ ├── ic_close@2x.png │ │ │ │ ├── ic_close@3x.png │ │ │ │ ├── ic_download@2x.png │ │ │ │ ├── ic_download@3x.png │ │ │ │ ├── ic_gallery@2x.png │ │ │ │ ├── ic_gallery@3x.png │ │ │ │ ├── ic_print.png │ │ │ │ ├── ic_trash.png │ │ │ │ ├── logo.gif │ │ │ │ ├── page1.jpg │ │ │ │ ├── page2.jpg │ │ │ │ ├── page3.jpg │ │ │ │ ├── page4.jpg │ │ │ │ ├── sound_off.png │ │ │ │ └── sound_on.png │ │ └── index.js │ └── utils │ │ ├── index.js │ │ └── saveHelper.js ├── config │ └── routing.js ├── constants │ ├── DurationActionTypes.js │ ├── GalleryActionTypes.js │ ├── SettingsActionTypes.js │ └── index.js ├── flow │ ├── settings-action-flow-types.js │ └── types.js ├── modules │ ├── DownloadPosters │ │ ├── components │ │ │ ├── EmptyState.js │ │ │ └── PicturesGrid.js │ │ └── index.js │ ├── DurationSet │ │ ├── components │ │ │ ├── RoundButton.js │ │ │ └── SetItem.js │ │ └── index.js │ ├── FailScreen │ │ └── index.js │ ├── LaunchScreen │ │ └── index.js │ ├── MeditationScreen │ │ ├── html │ │ │ └── index.js │ │ ├── index.ios.js │ │ └── screens │ │ │ └── BatteryLowModal.js │ ├── OnBoarding │ │ ├── components │ │ │ ├── Ethos.js │ │ │ ├── PageIndicator.js │ │ │ └── PageIndicatorItem.js │ │ └── index.js │ └── SavedGallery │ │ ├── components │ │ ├── GridPicturesList.js │ │ ├── HorizontalPicturesList.js │ │ └── ScrollGridCell.js │ │ └── index.js ├── reducers │ ├── duration.js │ ├── gallery │ │ ├── __tests__ │ │ │ └── gallery.selectors.tests.js │ │ ├── index.js │ │ └── selectors │ │ │ └── index.js │ ├── index.js │ └── settings.js └── web-test │ ├── css │ ├── bootstrap-grid.css │ ├── bootstrap-grid.css.map │ ├── bootstrap-grid.min.css │ ├── bootstrap-grid.min.css.map │ ├── bootstrap-reboot.css │ ├── bootstrap-reboot.css.map │ ├── bootstrap-reboot.min.css │ ├── bootstrap-reboot.min.css.map │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── bootstrap.min.css │ ├── bootstrap.min.css.map │ └── main.css │ ├── index.html │ └── js │ ├── bootstrap.min.js │ ├── jquery-3.1.1.slim.min.js │ ├── kaleidoscope.js │ ├── p5.min.js │ └── tether.min.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.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "airbnb", 4 | "plugin:flowtype/recommended", 5 | "plugin:react/recommended", 6 | "plugin:react-native/all" 7 | ], 8 | 9 | "plugins": [ 10 | "react", 11 | "react-native", 12 | "prettier", 13 | "flowtype" 14 | ], 15 | 16 | "parser": "babel-eslint", 17 | "parserOptions": { 18 | "ecmaVersion": 6, 19 | "sourceType": "module", 20 | "experimentalObjectRestSpread": true, 21 | "classes": true, 22 | "ecmaFeatures": { 23 | "jsx": true 24 | } 25 | }, 26 | 27 | "env": { 28 | "browser": true, 29 | "node": true, 30 | "jest": true, 31 | "react-native/react-native": true 32 | }, 33 | 34 | "rules": { 35 | "react/jsx-filename-extension": [2, { "extensions": [".js", ".jsx"] }], 36 | "react/sort-comp": [2, { 37 | "order": [ 38 | "static-methods", 39 | "type-annotations", 40 | "lifecycle", 41 | "everything-else", 42 | "/^on.+$/", 43 | "/^render.+$/", 44 | "render" 45 | ] 46 | }], 47 | "react-native/no-unused-styles": 2, 48 | "react-native/split-platform-components": 2, 49 | "react-native/no-inline-styles": 2, 50 | "react-native/no-color-literals": 2, 51 | "react/default-props-match-prop-types": ["error", { "allowRequiredDefaults": true }], 52 | 53 | "no-use-before-define": 0, 54 | "comma-dangle": ["error", { 55 | "objects": "always-multiline", 56 | "arrays": "always-multiline", 57 | "imports": "always-multiline", 58 | "exports": "never", 59 | "functions": "never" 60 | }], 61 | "no-unused-vars": ["error", { "varsIgnorePattern": "^React$" }], 62 | "object-curly-newline": ["error", { "consistent": true, "minProperties": 10 }], 63 | "import/no-extraneous-dependencies": ["error", { 64 | "devDependencies": ["gulpfile.babel.js", "./gulp/*.js"] } 65 | ], 66 | "max-len": ["error", { "code": 80, "ignoreUrls": true }] 67 | } 68 | } -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | 16 | ; Ignore polyfills 17 | .*/Libraries/polyfills/.* 18 | 19 | ; Ignore metro 20 | .*/node_modules/metro/.* 21 | 22 | [include] 23 | 24 | [libs] 25 | node_modules/react-native/Libraries/react-native/react-native-interface.js 26 | node_modules/react-native/flow/ 27 | node_modules/react-native/flow-github/ 28 | src/flow/ 29 | 30 | [options] 31 | emoji=true 32 | 33 | esproposal.optional_chaining=enable 34 | esproposal.nullish_coalescing=enable 35 | 36 | module.system=haste 37 | module.system.haste.use_name_reducers=true 38 | # get basename 39 | module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' 40 | # strip .js or .js.flow suffix 41 | module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' 42 | # strip .ios suffix 43 | module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' 44 | module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' 45 | module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' 46 | module.system.haste.paths.blacklist=.*/__tests__/.* 47 | module.system.haste.paths.blacklist=.*/__mocks__/.* 48 | module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* 49 | module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* 50 | 51 | munge_underscores=true 52 | 53 | emoji=true 54 | include_warnings=true 55 | esproposal.decorators=ignore 56 | 57 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 58 | 59 | module.file_ext=.js 60 | module.file_ext=.jsx 61 | module.file_ext=.json 62 | module.file_ext=.native.js 63 | 64 | suppress_type=$FlowIssue 65 | suppress_type=$FlowFixMe 66 | suppress_type=$FlowFixMeProps 67 | suppress_type=$FlowFixMeState 68 | 69 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 70 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 71 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 72 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 73 | 74 | esproposal.export_star_as=enable 75 | 76 | [version] 77 | ^0.78.0 78 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://docs.fastlane.tools/best-practices/source-control/ 50 | 51 | */fastlane/report.xml 52 | */fastlane/Preview.html 53 | */fastlane/screenshots 54 | 55 | # Bundle artifact 56 | *.jsbundle 57 | ios/Pods 58 | Podfile.lock 59 | contents.xcworkspacedata 60 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Attach to packager", 9 | "cwd": "${workspaceFolder}", 10 | "type": "reactnative", 11 | "request": "attach" 12 | }, 13 | { 14 | "name": "Debug iOS", 15 | "cwd": "${workspaceFolder}", 16 | "type": "reactnative", 17 | "request": "launch", 18 | "platform": "ios" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Ilya Yudanov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introvert 2 | 3 | ## Install a development version 4 | 5 | 1. Install Android SDK or Xcode (depending on a target platform). For 6 | more info see [Getting Started ](https://facebook.github.io/react-native/docs/getting-started.html) 7 | section. 8 | 9 | 2. Install [Node.js](http://nodejs.org) 10 | 11 | * on OSX use [homebrew](http://brew.sh) `brew install node` 12 | * on Windows use [chocolatey](https://chocolatey.org/) `choco install nodejs` 13 | * on Debian based linux use `apt-get install nodejs npm` 14 | * or using nvm 15 | 16 | 3. Install react-native 17 | 18 | npm install -g react-native-cli 19 | 20 | 4. Go to the root folder 21 | ``` 22 | cd Introvert 23 | ``` 24 | 25 | 5. Install local dependence: 26 | ``` 27 | yarn install 28 | ``` 29 | 30 | 6. Start the application 31 | ``` 32 | react-native run-android 33 | ``` 34 | or 35 | ``` 36 | react-native run-ios 37 | ``` 38 | 39 | ## Style Guide 40 | 41 | - [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript) 42 | - [Airbnb React/JSX Style Guide](https://github.com/airbnb/javascript/tree/master/react) 43 | 44 | ## Useful information 45 | 46 | ### Logging 47 | 48 | ## Build tools 49 | 50 | ### Increase version: 51 | 52 | yarn bump 53 | 54 | ### Release publishing 55 | -------------------------------------------------------------------------------- /android/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | blum 4 | Project android created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.buildship.core.gradleprojectbuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.buildship.core.gradleprojectnature 16 | 17 | 18 | -------------------------------------------------------------------------------- /android/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | connection.project.dir= 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /android/app/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | app 4 | Project app created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.buildship.core.gradleprojectbuilder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.buildship.core.gradleprojectnature 22 | 23 | 24 | -------------------------------------------------------------------------------- /android/app/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | connection.project.dir=.. 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /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.blum", 39 | ) 40 | 41 | android_resource( 42 | name = "res", 43 | package = "com.blum", 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_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/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 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/blum/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.blum; 2 | 3 | import com.facebook.react.ReactActivity; 4 | import com.facebook.react.ReactActivityDelegate; 5 | import com.facebook.react.ReactRootView; 6 | import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; 7 | 8 | public class MainActivity extends ReactActivity { 9 | 10 | /** 11 | * Returns the name of the main component registered from JavaScript. This is used to schedule 12 | * rendering of the component. 13 | */ 14 | @Override 15 | protected String getMainComponentName() { 16 | return "Blum"; 17 | } 18 | 19 | @Override 20 | protected ReactActivityDelegate createReactActivityDelegate() { 21 | return new ReactActivityDelegate(this, getMainComponentName()) { 22 | @Override 23 | protected ReactRootView createRootView() { 24 | return new RNGestureHandlerEnabledRootView(MainActivity.this); 25 | } 26 | }; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/blum/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.blum; 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.ReactNativeHost; 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.soloader.SoLoader; 10 | import java.lang.reflect.InvocationTargetException; 11 | import java.util.List; 12 | 13 | public class MainApplication extends Application implements ReactApplication { 14 | 15 | private final ReactNativeHost mReactNativeHost = 16 | new ReactNativeHost(this) { 17 | @Override 18 | public boolean getUseDeveloperSupport() { 19 | return BuildConfig.DEBUG; 20 | } 21 | 22 | @Override 23 | protected List getPackages() { 24 | @SuppressWarnings("UnnecessaryLocalVariable") 25 | List packages = new PackageList(this).getPackages(); 26 | // Packages that cannot be autolinked yet can be added manually here, for example: 27 | // packages.add(new MyReactNativePackage()); 28 | return packages; 29 | } 30 | 31 | @Override 32 | protected String getJSMainModuleName() { 33 | return "index"; 34 | } 35 | }; 36 | 37 | @Override 38 | public ReactNativeHost getReactNativeHost() { 39 | return mReactNativeHost; 40 | } 41 | 42 | @Override 43 | public void onCreate() { 44 | super.onCreate(); 45 | SoLoader.init(this, /* native exopackage */ false); 46 | initializeFlipper(this); // Remove this line if you don't want Flipper enabled 47 | } 48 | 49 | /** 50 | * Loads Flipper in React Native templates. 51 | * 52 | * @param context 53 | */ 54 | private static void initializeFlipper(Context context) { 55 | if (BuildConfig.DEBUG) { 56 | try { 57 | /* 58 | We use reflection here to pick up the class that initializes Flipper, 59 | since Flipper library is not available in release mode 60 | */ 61 | Class aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper"); 62 | aClass.getMethod("initializeFlipper", Context.class).invoke(null, context); 63 | } catch (ClassNotFoundException e) { 64 | e.printStackTrace(); 65 | } catch (NoSuchMethodException e) { 66 | e.printStackTrace(); 67 | } catch (IllegalAccessException e) { 68 | e.printStackTrace(); 69 | } catch (InvocationTargetException e) { 70 | e.printStackTrace(); 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/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/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | blum 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 = "28.0.3" 6 | minSdkVersion = 16 7 | compileSdkVersion = 28 8 | targetSdkVersion = 28 9 | } 10 | repositories { 11 | google() 12 | jcenter() 13 | } 14 | dependencies { 15 | classpath("com.android.tools.build:gradle:3.4.2") 16 | 17 | // NOTE: Do not place your application dependencies here; they belong 18 | // in the individual module build.gradle files 19 | } 20 | } 21 | 22 | allprojects { 23 | repositories { 24 | mavenLocal() 25 | maven { 26 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 27 | url("$rootDir/../node_modules/react-native/android") 28 | } 29 | maven { 30 | // Android JSC is installed from npm 31 | url("$rootDir/../node_modules/jsc-android/dist") 32 | } 33 | 34 | google() 35 | jcenter() 36 | maven { url 'https://jitpack.io' } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useAndroidX=true 21 | android.enableJetifier=true 22 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /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 http://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 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 34 | 35 | @rem Find java.exe 36 | if defined JAVA_HOME goto findJavaFromJavaHome 37 | 38 | set JAVA_EXE=java.exe 39 | %JAVA_EXE% -version >NUL 2>&1 40 | if "%ERRORLEVEL%" == "0" goto init 41 | 42 | echo. 43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 44 | echo. 45 | echo Please set the JAVA_HOME variable in your environment to match the 46 | echo location of your Java installation. 47 | 48 | goto fail 49 | 50 | :findJavaFromJavaHome 51 | set JAVA_HOME=%JAVA_HOME:"=% 52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 53 | 54 | if exist "%JAVA_EXE%" goto init 55 | 56 | echo. 57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 58 | echo. 59 | echo Please set the JAVA_HOME variable in your environment to match the 60 | echo location of your Java installation. 61 | 62 | goto fail 63 | 64 | :init 65 | @rem Get command-line arguments, handling Windows variants 66 | 67 | if not "%OS%" == "Windows_NT" goto win9xME_args 68 | 69 | :win9xME_args 70 | @rem Slurp the command line arguments. 71 | set CMD_LINE_ARGS= 72 | set _SKIP=2 73 | 74 | :win9xME_args_slurp 75 | if "x%~1" == "x" goto execute 76 | 77 | set CMD_LINE_ARGS=%* 78 | 79 | :execute 80 | @rem Setup the command line 81 | 82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 83 | 84 | @rem Execute Gradle 85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 86 | 87 | :end 88 | @rem End local scope for the variables with windows NT shell 89 | if "%ERRORLEVEL%"=="0" goto mainEnd 90 | 91 | :fail 92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 93 | rem the _cmd.exe /c_ return code! 94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 95 | exit /b 1 96 | 97 | :mainEnd 98 | if "%OS%"=="Windows_NT" endlocal 99 | 100 | :omega 101 | -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'blum' 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": "blum", 3 | "displayName": "blum" 4 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-decorators_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: ce7e7d2fdff1a0fd3faaa44b0569a81b 2 | // flow-typed version: <>/@babel/plugin-proposal-decorators_v^7.1.2/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-decorators' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-decorators' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-decorators/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module '@babel/plugin-proposal-decorators/lib/transformer-legacy' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module '@babel/plugin-proposal-decorators/lib/transformer' { 34 | declare module.exports: any; 35 | } 36 | 37 | // Filename aliases 38 | declare module '@babel/plugin-proposal-decorators/lib/index.js' { 39 | declare module.exports: $Exports<'@babel/plugin-proposal-decorators/lib/index'>; 40 | } 41 | declare module '@babel/plugin-proposal-decorators/lib/transformer-legacy.js' { 42 | declare module.exports: $Exports<'@babel/plugin-proposal-decorators/lib/transformer-legacy'>; 43 | } 44 | declare module '@babel/plugin-proposal-decorators/lib/transformer.js' { 45 | declare module.exports: $Exports<'@babel/plugin-proposal-decorators/lib/transformer'>; 46 | } 47 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-export-namespace-from_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: a4ed33e4c6fcd5efdbfe7736afa5a679 2 | // flow-typed version: <>/@babel/plugin-proposal-export-namespace-from_v^7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-export-namespace-from' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-export-namespace-from' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-export-namespace-from/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-export-namespace-from/lib/index.js' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-export-namespace-from/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/babel-eslint_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 580fc24689719f721838442635168caf 2 | // flow-typed version: <>/babel-eslint_v^10.0.1/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'babel-eslint' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'babel-eslint' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'babel-eslint/lib/analyze-scope' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'babel-eslint/lib/babylon-to-espree/attachComments' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'babel-eslint/lib/babylon-to-espree/convertComments' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'babel-eslint/lib/babylon-to-espree/convertTemplateType' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'babel-eslint/lib/babylon-to-espree/index' { 42 | declare module.exports: any; 43 | } 44 | 45 | declare module 'babel-eslint/lib/babylon-to-espree/toAST' { 46 | declare module.exports: any; 47 | } 48 | 49 | declare module 'babel-eslint/lib/babylon-to-espree/toToken' { 50 | declare module.exports: any; 51 | } 52 | 53 | declare module 'babel-eslint/lib/babylon-to-espree/toTokens' { 54 | declare module.exports: any; 55 | } 56 | 57 | declare module 'babel-eslint/lib/index' { 58 | declare module.exports: any; 59 | } 60 | 61 | declare module 'babel-eslint/lib/parse-with-scope' { 62 | declare module.exports: any; 63 | } 64 | 65 | declare module 'babel-eslint/lib/parse' { 66 | declare module.exports: any; 67 | } 68 | 69 | declare module 'babel-eslint/lib/visitor-keys' { 70 | declare module.exports: any; 71 | } 72 | 73 | // Filename aliases 74 | declare module 'babel-eslint/lib/analyze-scope.js' { 75 | declare module.exports: $Exports<'babel-eslint/lib/analyze-scope'>; 76 | } 77 | declare module 'babel-eslint/lib/babylon-to-espree/attachComments.js' { 78 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/attachComments'>; 79 | } 80 | declare module 'babel-eslint/lib/babylon-to-espree/convertComments.js' { 81 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/convertComments'>; 82 | } 83 | declare module 'babel-eslint/lib/babylon-to-espree/convertTemplateType.js' { 84 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/convertTemplateType'>; 85 | } 86 | declare module 'babel-eslint/lib/babylon-to-espree/index.js' { 87 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/index'>; 88 | } 89 | declare module 'babel-eslint/lib/babylon-to-espree/toAST.js' { 90 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toAST'>; 91 | } 92 | declare module 'babel-eslint/lib/babylon-to-espree/toToken.js' { 93 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toToken'>; 94 | } 95 | declare module 'babel-eslint/lib/babylon-to-espree/toTokens.js' { 96 | declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toTokens'>; 97 | } 98 | declare module 'babel-eslint/lib/index.js' { 99 | declare module.exports: $Exports<'babel-eslint/lib/index'>; 100 | } 101 | declare module 'babel-eslint/lib/parse-with-scope.js' { 102 | declare module.exports: $Exports<'babel-eslint/lib/parse-with-scope'>; 103 | } 104 | declare module 'babel-eslint/lib/parse.js' { 105 | declare module.exports: $Exports<'babel-eslint/lib/parse'>; 106 | } 107 | declare module 'babel-eslint/lib/visitor-keys.js' { 108 | declare module.exports: $Exports<'babel-eslint/lib/visitor-keys'>; 109 | } 110 | -------------------------------------------------------------------------------- /flow-typed/npm/babel-jest_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 0581fd65da0d60d120a509fe1f76b15a 2 | // flow-typed version: <>/babel-jest_v23.6.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'babel-jest' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'babel-jest' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'babel-jest/build/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'babel-jest/build/index.js' { 31 | declare module.exports: $Exports<'babel-jest/build/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/bugsnag-react-native_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 972d4d33ed33ac13ab62422bb7dca534 2 | // flow-typed version: <>/bugsnag-react-native_v^2.11.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'bugsnag-react-native' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'bugsnag-react-native' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'bugsnag-react-native/lib/Bugsnag' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'bugsnag-react-native/lib/NativeSerializer' { 30 | declare module.exports: any; 31 | } 32 | 33 | // Filename aliases 34 | declare module 'bugsnag-react-native/index' { 35 | declare module.exports: $Exports<'bugsnag-react-native'>; 36 | } 37 | declare module 'bugsnag-react-native/index.js' { 38 | declare module.exports: $Exports<'bugsnag-react-native'>; 39 | } 40 | declare module 'bugsnag-react-native/lib/Bugsnag.js' { 41 | declare module.exports: $Exports<'bugsnag-react-native/lib/Bugsnag'>; 42 | } 43 | declare module 'bugsnag-react-native/lib/NativeSerializer.js' { 44 | declare module.exports: $Exports<'bugsnag-react-native/lib/NativeSerializer'>; 45 | } 46 | -------------------------------------------------------------------------------- /flow-typed/npm/eslint-config-airbnb_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: a1d6ff59f3247842773bf2e6152485af 2 | // flow-typed version: <>/eslint-config-airbnb_v^17.1.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'eslint-config-airbnb' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'eslint-config-airbnb' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'eslint-config-airbnb/base' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'eslint-config-airbnb/legacy' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'eslint-config-airbnb/rules/react-a11y' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'eslint-config-airbnb/rules/react' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'eslint-config-airbnb/test/requires' { 42 | declare module.exports: any; 43 | } 44 | 45 | declare module 'eslint-config-airbnb/test/test-base' { 46 | declare module.exports: any; 47 | } 48 | 49 | declare module 'eslint-config-airbnb/test/test-react-order' { 50 | declare module.exports: any; 51 | } 52 | 53 | declare module 'eslint-config-airbnb/whitespace' { 54 | declare module.exports: any; 55 | } 56 | 57 | // Filename aliases 58 | declare module 'eslint-config-airbnb/base.js' { 59 | declare module.exports: $Exports<'eslint-config-airbnb/base'>; 60 | } 61 | declare module 'eslint-config-airbnb/index' { 62 | declare module.exports: $Exports<'eslint-config-airbnb'>; 63 | } 64 | declare module 'eslint-config-airbnb/index.js' { 65 | declare module.exports: $Exports<'eslint-config-airbnb'>; 66 | } 67 | declare module 'eslint-config-airbnb/legacy.js' { 68 | declare module.exports: $Exports<'eslint-config-airbnb/legacy'>; 69 | } 70 | declare module 'eslint-config-airbnb/rules/react-a11y.js' { 71 | declare module.exports: $Exports<'eslint-config-airbnb/rules/react-a11y'>; 72 | } 73 | declare module 'eslint-config-airbnb/rules/react.js' { 74 | declare module.exports: $Exports<'eslint-config-airbnb/rules/react'>; 75 | } 76 | declare module 'eslint-config-airbnb/test/requires.js' { 77 | declare module.exports: $Exports<'eslint-config-airbnb/test/requires'>; 78 | } 79 | declare module 'eslint-config-airbnb/test/test-base.js' { 80 | declare module.exports: $Exports<'eslint-config-airbnb/test/test-base'>; 81 | } 82 | declare module 'eslint-config-airbnb/test/test-react-order.js' { 83 | declare module.exports: $Exports<'eslint-config-airbnb/test/test-react-order'>; 84 | } 85 | declare module 'eslint-config-airbnb/whitespace.js' { 86 | declare module.exports: $Exports<'eslint-config-airbnb/whitespace'>; 87 | } 88 | -------------------------------------------------------------------------------- /flow-typed/npm/eslint-plugin-prettier_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 26decbbc771a8a7ec835090b9a56960f 2 | // flow-typed version: <>/eslint-plugin-prettier_v^3.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'eslint-plugin-prettier' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'eslint-plugin-prettier' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'eslint-plugin-prettier/eslint-plugin-prettier' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'eslint-plugin-prettier/eslint-plugin-prettier.js' { 31 | declare module.exports: $Exports<'eslint-plugin-prettier/eslint-plugin-prettier'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/eslint-plugin-react-native_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 911f2d23115f5db2485a50519e2a3d05 2 | // flow-typed version: <>/eslint-plugin-react-native_v^3.4.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'eslint-plugin-react-native' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'eslint-plugin-react-native' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'eslint-plugin-react-native/lib/rules/no-color-literals' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'eslint-plugin-react-native/lib/rules/no-inline-styles' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'eslint-plugin-react-native/lib/rules/no-raw-text' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'eslint-plugin-react-native/lib/rules/no-unused-styles' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'eslint-plugin-react-native/lib/rules/split-platform-components' { 42 | declare module.exports: any; 43 | } 44 | 45 | declare module 'eslint-plugin-react-native/lib/util/Components' { 46 | declare module.exports: any; 47 | } 48 | 49 | declare module 'eslint-plugin-react-native/lib/util/stylesheet' { 50 | declare module.exports: any; 51 | } 52 | 53 | declare module 'eslint-plugin-react-native/lib/util/variable' { 54 | declare module.exports: any; 55 | } 56 | 57 | // Filename aliases 58 | declare module 'eslint-plugin-react-native/index' { 59 | declare module.exports: $Exports<'eslint-plugin-react-native'>; 60 | } 61 | declare module 'eslint-plugin-react-native/index.js' { 62 | declare module.exports: $Exports<'eslint-plugin-react-native'>; 63 | } 64 | declare module 'eslint-plugin-react-native/lib/rules/no-color-literals.js' { 65 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/rules/no-color-literals'>; 66 | } 67 | declare module 'eslint-plugin-react-native/lib/rules/no-inline-styles.js' { 68 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/rules/no-inline-styles'>; 69 | } 70 | declare module 'eslint-plugin-react-native/lib/rules/no-raw-text.js' { 71 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/rules/no-raw-text'>; 72 | } 73 | declare module 'eslint-plugin-react-native/lib/rules/no-unused-styles.js' { 74 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/rules/no-unused-styles'>; 75 | } 76 | declare module 'eslint-plugin-react-native/lib/rules/split-platform-components.js' { 77 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/rules/split-platform-components'>; 78 | } 79 | declare module 'eslint-plugin-react-native/lib/util/Components.js' { 80 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/util/Components'>; 81 | } 82 | declare module 'eslint-plugin-react-native/lib/util/stylesheet.js' { 83 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/util/stylesheet'>; 84 | } 85 | declare module 'eslint-plugin-react-native/lib/util/variable.js' { 86 | declare module.exports: $Exports<'eslint-plugin-react-native/lib/util/variable'>; 87 | } 88 | -------------------------------------------------------------------------------- /flow-typed/npm/flow-bin_v0.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 2 | // flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x 3 | 4 | declare module "flow-bin" { 5 | declare module.exports: string; 6 | } 7 | -------------------------------------------------------------------------------- /flow-typed/npm/git-validate_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 29c1d3c6576044fc15433e4a5c38df7e 2 | // flow-typed version: <>/git-validate_v^2.2.4/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'git-validate' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'git-validate' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'git-validate/bin/install' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'git-validate/lib/utils' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'git-validate/test/utils' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'git-validate/test/validate' { 38 | declare module.exports: any; 39 | } 40 | 41 | // Filename aliases 42 | declare module 'git-validate/bin/install.js' { 43 | declare module.exports: $Exports<'git-validate/bin/install'>; 44 | } 45 | declare module 'git-validate/index' { 46 | declare module.exports: $Exports<'git-validate'>; 47 | } 48 | declare module 'git-validate/index.js' { 49 | declare module.exports: $Exports<'git-validate'>; 50 | } 51 | declare module 'git-validate/lib/utils.js' { 52 | declare module.exports: $Exports<'git-validate/lib/utils'>; 53 | } 54 | declare module 'git-validate/test/utils.js' { 55 | declare module.exports: $Exports<'git-validate/test/utils'>; 56 | } 57 | declare module 'git-validate/test/validate.js' { 58 | declare module.exports: $Exports<'git-validate/test/validate'>; 59 | } 60 | -------------------------------------------------------------------------------- /flow-typed/npm/gulp-babel_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6d6bdab356ca6121e5395019cfde7eb9 2 | // flow-typed version: <>/gulp-babel_v^8.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'gulp-babel' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'gulp-babel' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'gulp-babel/index' { 29 | declare module.exports: $Exports<'gulp-babel'>; 30 | } 31 | declare module 'gulp-babel/index.js' { 32 | declare module.exports: $Exports<'gulp-babel'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/gulp-rename_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 0a22cfdfbb4e7812aa23ddb98433c741 2 | // flow-typed version: <>/gulp-rename_v^1.4.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'gulp-rename' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'gulp-rename' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'gulp-rename/index' { 29 | declare module.exports: $Exports<'gulp-rename'>; 30 | } 31 | declare module 'gulp-rename/index.js' { 32 | declare module.exports: $Exports<'gulp-rename'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/gulp-replace_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: e6000be46231bf8768ceb96220395f3a 2 | // flow-typed version: <>/gulp-replace_v^1.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'gulp-replace' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'gulp-replace' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'gulp-replace/index' { 29 | declare module.exports: $Exports<'gulp-replace'>; 30 | } 31 | declare module 'gulp-replace/index.js' { 32 | declare module.exports: $Exports<'gulp-replace'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/gulp-task-doc_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: a38b27716f7257998c0c1a3aa0af0cf3 2 | // flow-typed version: <>/gulp-task-doc_v^1.0.11/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'gulp-task-doc' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'gulp-task-doc' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'gulp-task-doc/lib/models' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'gulp-task-doc/lib/parser' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'gulp-task-doc/lib/printer' { 34 | declare module.exports: any; 35 | } 36 | 37 | // Filename aliases 38 | declare module 'gulp-task-doc/index' { 39 | declare module.exports: $Exports<'gulp-task-doc'>; 40 | } 41 | declare module 'gulp-task-doc/index.js' { 42 | declare module.exports: $Exports<'gulp-task-doc'>; 43 | } 44 | declare module 'gulp-task-doc/lib/models.js' { 45 | declare module.exports: $Exports<'gulp-task-doc/lib/models'>; 46 | } 47 | declare module 'gulp-task-doc/lib/parser.js' { 48 | declare module.exports: $Exports<'gulp-task-doc/lib/parser'>; 49 | } 50 | declare module 'gulp-task-doc/lib/printer.js' { 51 | declare module.exports: $Exports<'gulp-task-doc/lib/printer'>; 52 | } 53 | -------------------------------------------------------------------------------- /flow-typed/npm/gulp_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 2be3580d1418dacf63457d9472119729 2 | // flow-typed version: <>/gulp_v^3.9.1/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'gulp' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'gulp' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'gulp/bin/gulp' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'gulp/lib/completion' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'gulp/lib/taskTree' { 34 | declare module.exports: any; 35 | } 36 | 37 | // Filename aliases 38 | declare module 'gulp/bin/gulp.js' { 39 | declare module.exports: $Exports<'gulp/bin/gulp'>; 40 | } 41 | declare module 'gulp/index' { 42 | declare module.exports: $Exports<'gulp'>; 43 | } 44 | declare module 'gulp/index.js' { 45 | declare module.exports: $Exports<'gulp'>; 46 | } 47 | declare module 'gulp/lib/completion.js' { 48 | declare module.exports: $Exports<'gulp/lib/completion'>; 49 | } 50 | declare module 'gulp/lib/taskTree.js' { 51 | declare module.exports: $Exports<'gulp/lib/taskTree'>; 52 | } 53 | -------------------------------------------------------------------------------- /flow-typed/npm/metro-react-native-babel-preset_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 68dd63aa50fb8f3f2c62ba59fef73d8d 2 | // flow-typed version: <>/metro-react-native-babel-preset_v0.48.1/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'metro-react-native-babel-preset' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'metro-react-native-babel-preset' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'metro-react-native-babel-preset/src/configs/hmr' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'metro-react-native-babel-preset/src/configs/main' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'metro-react-native-babel-preset/src/index' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'metro-react-native-babel-preset/src/transforms/transform-symbol-member' { 38 | declare module.exports: any; 39 | } 40 | 41 | // Filename aliases 42 | declare module 'metro-react-native-babel-preset/src/configs/hmr.js' { 43 | declare module.exports: $Exports<'metro-react-native-babel-preset/src/configs/hmr'>; 44 | } 45 | declare module 'metro-react-native-babel-preset/src/configs/main.js' { 46 | declare module.exports: $Exports<'metro-react-native-babel-preset/src/configs/main'>; 47 | } 48 | declare module 'metro-react-native-babel-preset/src/index.js' { 49 | declare module.exports: $Exports<'metro-react-native-babel-preset/src/index'>; 50 | } 51 | declare module 'metro-react-native-babel-preset/src/transforms/transform-symbol-member.js' { 52 | declare module.exports: $Exports<'metro-react-native-babel-preset/src/transforms/transform-symbol-member'>; 53 | } 54 | -------------------------------------------------------------------------------- /flow-typed/npm/minimist_v1.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 50bc453586282fb18e63201750049659 2 | // flow-typed version: e6f7626e10/minimist_v1.x.x/flow_>=v0.28.x 3 | 4 | declare module 'minimist' { 5 | declare type minimistOptions = { 6 | string?: string | Array, 7 | boolean?: boolean | string | Array, 8 | alias?: { [arg: string]: string | Array }, 9 | default?: { [arg: string]: any }, 10 | stopEarly?: boolean, 11 | // TODO: Strings as keys don't work... 12 | // '--'? boolean, 13 | unknown?: (param: string) => boolean 14 | }; 15 | 16 | declare type minimistOutput = { 17 | _: Array, 18 | [flag: string]: string | boolean 19 | }; 20 | 21 | declare module.exports: (argv: Array, opts?: minimistOptions) => minimistOutput; 22 | } 23 | -------------------------------------------------------------------------------- /flow-typed/npm/moment-duration-format_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6deeeaf11e4054528f01e0e3a09e802b 2 | // flow-typed version: <>/moment-duration-format_v^2.2.2/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'moment-duration-format' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'moment-duration-format' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'moment-duration-format/lib/moment-duration-format' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'moment-duration-format/test/moment-duration-format-tests' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'moment-duration-format/test/vendor/jquery' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'moment-duration-format/test/vendor/moment' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'moment-duration-format/test/vendor/qunit' { 42 | declare module.exports: any; 43 | } 44 | 45 | // Filename aliases 46 | declare module 'moment-duration-format/lib/moment-duration-format.js' { 47 | declare module.exports: $Exports<'moment-duration-format/lib/moment-duration-format'>; 48 | } 49 | declare module 'moment-duration-format/test/moment-duration-format-tests.js' { 50 | declare module.exports: $Exports<'moment-duration-format/test/moment-duration-format-tests'>; 51 | } 52 | declare module 'moment-duration-format/test/vendor/jquery.js' { 53 | declare module.exports: $Exports<'moment-duration-format/test/vendor/jquery'>; 54 | } 55 | declare module 'moment-duration-format/test/vendor/moment.js' { 56 | declare module.exports: $Exports<'moment-duration-format/test/vendor/moment'>; 57 | } 58 | declare module 'moment-duration-format/test/vendor/qunit.js' { 59 | declare module.exports: $Exports<'moment-duration-format/test/vendor/qunit'>; 60 | } 61 | -------------------------------------------------------------------------------- /flow-typed/npm/prettier_v1.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 4eed8da2dc730dc33e7710b465eaa44b 2 | // flow-typed version: cc7a557b34/prettier_v1.x.x/flow_>=v0.56.x 3 | 4 | declare module "prettier" { 5 | declare type AST = Object; 6 | declare type Doc = Object; 7 | declare type FastPath = Object; 8 | 9 | declare type PrettierParserName = 10 | | "babylon" 11 | | "flow" 12 | | "typescript" 13 | | "postcss" 14 | | "css" 15 | | "less" 16 | | "scss" 17 | | "json" 18 | | "graphql" 19 | | "markdown" 20 | | "vue"; 21 | 22 | declare type PrettierParser = { 23 | [name: PrettierParserName]: (text: string, options?: Object) => AST 24 | }; 25 | 26 | declare type CustomParser = ( 27 | text: string, 28 | parsers: PrettierParser, 29 | options: Options 30 | ) => AST; 31 | 32 | declare type Options = {| 33 | printWidth?: number, 34 | tabWidth?: number, 35 | useTabs?: boolean, 36 | semi?: boolean, 37 | singleQuote?: boolean, 38 | trailingComma?: "none" | "es5" | "all", 39 | bracketSpacing?: boolean, 40 | jsxBracketSameLine?: boolean, 41 | arrowParens?: "avoid" | "always", 42 | rangeStart?: number, 43 | rangeEnd?: number, 44 | parser?: PrettierParserName | CustomParser, 45 | filepath?: string, 46 | requirePragma?: boolean, 47 | insertPragma?: boolean, 48 | proseWrap?: "always" | "never" | "preserve", 49 | plugins?: Array 50 | |}; 51 | 52 | declare type Plugin = { 53 | languages: SupportLanguage, 54 | parsers: { [parserName: string]: Parser }, 55 | printers: { [astFormat: string]: Printer } 56 | }; 57 | 58 | declare type Parser = { 59 | parse: ( 60 | text: string, 61 | parsers: { [parserName: string]: Parser }, 62 | options: Object 63 | ) => AST, 64 | astFormat: string 65 | }; 66 | 67 | declare type Printer = { 68 | print: ( 69 | path: FastPath, 70 | options: Object, 71 | print: (path: FastPath) => Doc 72 | ) => Doc, 73 | embed: ( 74 | path: FastPath, 75 | print: (path: FastPath) => Doc, 76 | textToDoc: (text: string, options: Object) => Doc, 77 | options: Object 78 | ) => ?Doc 79 | }; 80 | 81 | declare type CursorOptions = {| 82 | cursorOffset: number, 83 | printWidth?: $PropertyType, 84 | tabWidth?: $PropertyType, 85 | useTabs?: $PropertyType, 86 | semi?: $PropertyType, 87 | singleQuote?: $PropertyType, 88 | trailingComma?: $PropertyType, 89 | bracketSpacing?: $PropertyType, 90 | jsxBracketSameLine?: $PropertyType, 91 | arrowParens?: $PropertyType, 92 | parser?: $PropertyType, 93 | filepath?: $PropertyType, 94 | requirePragma?: $PropertyType, 95 | insertPragma?: $PropertyType, 96 | proseWrap?: $PropertyType, 97 | plugins?: $PropertyType 98 | |}; 99 | 100 | declare type CursorResult = {| 101 | formatted: string, 102 | cursorOffset: number 103 | |}; 104 | 105 | declare type ResolveConfigOptions = {| 106 | useCache?: boolean, 107 | config?: string, 108 | editorconfig?: boolean 109 | |}; 110 | 111 | declare type SupportLanguage = { 112 | name: string, 113 | since: string, 114 | parsers: Array, 115 | group?: string, 116 | tmScope: string, 117 | aceMode: string, 118 | codemirrorMode: string, 119 | codemirrorMimeType: string, 120 | aliases?: Array, 121 | extensions: Array, 122 | filenames?: Array, 123 | linguistLanguageId: number, 124 | vscodeLanguageIds: Array 125 | }; 126 | 127 | declare type SupportOption = {| 128 | since: string, 129 | type: "int" | "boolean" | "choice" | "path", 130 | deprecated?: string, 131 | redirect?: SupportOptionRedirect, 132 | description: string, 133 | oppositeDescription?: string, 134 | default: SupportOptionValue, 135 | range?: SupportOptionRange, 136 | choices?: SupportOptionChoice 137 | |}; 138 | 139 | declare type SupportOptionRedirect = {| 140 | options: string, 141 | value: SupportOptionValue 142 | |}; 143 | 144 | declare type SupportOptionRange = {| 145 | start: number, 146 | end: number, 147 | step: number 148 | |}; 149 | 150 | declare type SupportOptionChoice = {| 151 | value: boolean | string, 152 | description?: string, 153 | since?: string, 154 | deprecated?: string, 155 | redirect?: SupportOptionValue 156 | |}; 157 | 158 | declare type SupportOptionValue = number | boolean | string; 159 | 160 | declare type SupportInfo = {| 161 | languages: Array, 162 | options: Array 163 | |}; 164 | 165 | declare type Prettier = {| 166 | format: (source: string, options?: Options) => string, 167 | check: (source: string, options?: Options) => boolean, 168 | formatWithCursor: (source: string, options: CursorOptions) => CursorResult, 169 | resolveConfig: { 170 | (filePath: string, options?: ResolveConfigOptions): Promise, 171 | sync(filePath: string, options?: ResolveConfigOptions): Promise 172 | }, 173 | clearConfigCache: () => void, 174 | getSupportInfo: (version?: string) => SupportInfo 175 | |}; 176 | 177 | declare export default Prettier; 178 | } 179 | -------------------------------------------------------------------------------- /flow-typed/npm/react-native-image-processor_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: a59ed000ca602d5dccd3ba75f10014db 2 | // flow-typed version: <>/react-native-image-processor_vhttps://github.com/Elf2707/react-native-image-processor.git/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'react-native-image-processor' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'react-native-image-processor' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'react-native-image-processor/index' { 29 | declare module.exports: $Exports<'react-native-image-processor'>; 30 | } 31 | declare module 'react-native-image-processor/index.js' { 32 | declare module.exports: $Exports<'react-native-image-processor'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/react-native-logger_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 1d7ff3fe32ce509a891ac1d5a16ac8cb 2 | // flow-typed version: <>/react-native-logger_v^1.0.3/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'react-native-logger' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'react-native-logger' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'react-native-logger/index' { 29 | declare module.exports: $Exports<'react-native-logger'>; 30 | } 31 | declare module 'react-native-logger/index.js' { 32 | declare module.exports: $Exports<'react-native-logger'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/react-native-sound_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 279af8fd042e66bb75f3525044ca4820 2 | // flow-typed version: <>/react-native-sound_v^0.10.9/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'react-native-sound' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'react-native-sound' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'react-native-sound/sound' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'react-native-sound/sound.js' { 31 | declare module.exports: $Exports<'react-native-sound/sound'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/react-test-renderer_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 7661e153e0b1853297807e8b095e1383 2 | // flow-typed version: <>/react-test-renderer_v16.6.0-alpha.8af6728/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'react-test-renderer' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'react-test-renderer' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'react-test-renderer/cjs/react-test-renderer-shallow.development' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'react-test-renderer/cjs/react-test-renderer-shallow.production.min' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'react-test-renderer/cjs/react-test-renderer.development' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'react-test-renderer/cjs/react-test-renderer.production.min' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'react-test-renderer/shallow' { 42 | declare module.exports: any; 43 | } 44 | 45 | declare module 'react-test-renderer/umd/react-test-renderer-shallow.development' { 46 | declare module.exports: any; 47 | } 48 | 49 | declare module 'react-test-renderer/umd/react-test-renderer-shallow.production.min' { 50 | declare module.exports: any; 51 | } 52 | 53 | declare module 'react-test-renderer/umd/react-test-renderer.development' { 54 | declare module.exports: any; 55 | } 56 | 57 | declare module 'react-test-renderer/umd/react-test-renderer.production.min' { 58 | declare module.exports: any; 59 | } 60 | 61 | // Filename aliases 62 | declare module 'react-test-renderer/cjs/react-test-renderer-shallow.development.js' { 63 | declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer-shallow.development'>; 64 | } 65 | declare module 'react-test-renderer/cjs/react-test-renderer-shallow.production.min.js' { 66 | declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer-shallow.production.min'>; 67 | } 68 | declare module 'react-test-renderer/cjs/react-test-renderer.development.js' { 69 | declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer.development'>; 70 | } 71 | declare module 'react-test-renderer/cjs/react-test-renderer.production.min.js' { 72 | declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer.production.min'>; 73 | } 74 | declare module 'react-test-renderer/index' { 75 | declare module.exports: $Exports<'react-test-renderer'>; 76 | } 77 | declare module 'react-test-renderer/index.js' { 78 | declare module.exports: $Exports<'react-test-renderer'>; 79 | } 80 | declare module 'react-test-renderer/shallow.js' { 81 | declare module.exports: $Exports<'react-test-renderer/shallow'>; 82 | } 83 | declare module 'react-test-renderer/umd/react-test-renderer-shallow.development.js' { 84 | declare module.exports: $Exports<'react-test-renderer/umd/react-test-renderer-shallow.development'>; 85 | } 86 | declare module 'react-test-renderer/umd/react-test-renderer-shallow.production.min.js' { 87 | declare module.exports: $Exports<'react-test-renderer/umd/react-test-renderer-shallow.production.min'>; 88 | } 89 | declare module 'react-test-renderer/umd/react-test-renderer.development.js' { 90 | declare module.exports: $Exports<'react-test-renderer/umd/react-test-renderer.development'>; 91 | } 92 | declare module 'react-test-renderer/umd/react-test-renderer.production.min.js' { 93 | declare module.exports: $Exports<'react-test-renderer/umd/react-test-renderer.production.min'>; 94 | } 95 | -------------------------------------------------------------------------------- /flow-typed/npm/redux-thunk_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 8691b2e73fd16cb4cf269eaf5f4df919 2 | // flow-typed version: <>/redux-thunk_v^2.3.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'redux-thunk' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'redux-thunk' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'redux-thunk/dist/redux-thunk' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'redux-thunk/dist/redux-thunk.min' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'redux-thunk/es/index' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'redux-thunk/lib/index' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'redux-thunk/src/index' { 42 | declare module.exports: any; 43 | } 44 | 45 | // Filename aliases 46 | declare module 'redux-thunk/dist/redux-thunk.js' { 47 | declare module.exports: $Exports<'redux-thunk/dist/redux-thunk'>; 48 | } 49 | declare module 'redux-thunk/dist/redux-thunk.min.js' { 50 | declare module.exports: $Exports<'redux-thunk/dist/redux-thunk.min'>; 51 | } 52 | declare module 'redux-thunk/es/index.js' { 53 | declare module.exports: $Exports<'redux-thunk/es/index'>; 54 | } 55 | declare module 'redux-thunk/lib/index.js' { 56 | declare module.exports: $Exports<'redux-thunk/lib/index'>; 57 | } 58 | declare module 'redux-thunk/src/index.js' { 59 | declare module.exports: $Exports<'redux-thunk/src/index'>; 60 | } 61 | -------------------------------------------------------------------------------- /flow-typed/npm/redux_v4.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: df80bdd535bfed9cf3223e077f3b4543 2 | // flow-typed version: c4c8963c9c/redux_v4.x.x/flow_>=v0.55.x 3 | 4 | declare module 'redux' { 5 | 6 | /* 7 | 8 | S = State 9 | A = Action 10 | D = Dispatch 11 | 12 | */ 13 | 14 | declare export type DispatchAPI = (action: A) => A; 15 | declare export type Dispatch }> = DispatchAPI; 16 | 17 | declare export type MiddlewareAPI> = { 18 | dispatch: D; 19 | getState(): S; 20 | }; 21 | 22 | declare export type Store> = { 23 | // rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages) 24 | dispatch: D; 25 | getState(): S; 26 | subscribe(listener: () => void): () => void; 27 | replaceReducer(nextReducer: Reducer): void 28 | }; 29 | 30 | declare export type Reducer = (state: S | void, action: A) => S; 31 | 32 | declare export type CombinedReducer = (state: $Shape & {} | void, action: A) => S; 33 | 34 | declare export type Middleware> = 35 | (api: MiddlewareAPI) => 36 | (next: D) => D; 37 | 38 | declare export type StoreCreator> = { 39 | (reducer: Reducer, enhancer?: StoreEnhancer): Store; 40 | (reducer: Reducer, preloadedState: S, enhancer?: StoreEnhancer): Store; 41 | }; 42 | 43 | declare export type StoreEnhancer> = (next: StoreCreator) => StoreCreator; 44 | 45 | declare export function createStore(reducer: Reducer, enhancer?: StoreEnhancer): Store; 46 | declare export function createStore(reducer: Reducer, preloadedState?: S, enhancer?: StoreEnhancer): Store; 47 | 48 | declare export function applyMiddleware(...middlewares: Array>): StoreEnhancer; 49 | 50 | declare export type ActionCreator = (...args: Array) => A; 51 | declare export type ActionCreators = { [key: K]: ActionCreator }; 52 | 53 | declare export function bindActionCreators, D: DispatchAPI>(actionCreator: C, dispatch: D): C; 54 | declare export function bindActionCreators, D: DispatchAPI>(actionCreators: C, dispatch: D): C; 55 | 56 | declare export function combineReducers(reducers: O): CombinedReducer<$ObjMap(r: Reducer) => S>, A>; 57 | 58 | declare export var compose: $Compose; 59 | } 60 | -------------------------------------------------------------------------------- /flow-typed/npm/reselect_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: ce7dfda974c7138009c45b0148b04aba 2 | // flow-typed version: <>/reselect_v^4.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'reselect' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'reselect' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'reselect/dist/reselect' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'reselect/dist/reselect.min' { 30 | declare module.exports: any; 31 | } 32 | 33 | declare module 'reselect/es/index' { 34 | declare module.exports: any; 35 | } 36 | 37 | declare module 'reselect/lib/index' { 38 | declare module.exports: any; 39 | } 40 | 41 | declare module 'reselect/src/index' { 42 | declare module.exports: any; 43 | } 44 | 45 | // Filename aliases 46 | declare module 'reselect/dist/reselect.js' { 47 | declare module.exports: $Exports<'reselect/dist/reselect'>; 48 | } 49 | declare module 'reselect/dist/reselect.min.js' { 50 | declare module.exports: $Exports<'reselect/dist/reselect.min'>; 51 | } 52 | declare module 'reselect/es/index.js' { 53 | declare module.exports: $Exports<'reselect/es/index'>; 54 | } 55 | declare module 'reselect/lib/index.js' { 56 | declare module.exports: $Exports<'reselect/lib/index'>; 57 | } 58 | declare module 'reselect/src/index.js' { 59 | declare module.exports: $Exports<'reselect/src/index'>; 60 | } 61 | -------------------------------------------------------------------------------- /gulp/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "module:metro-react-native-babel-preset" 4 | ], 5 | "plugins": [ 6 | [ 7 | "@babel/plugin-proposal-decorators", 8 | { 9 | "legacy": true 10 | } 11 | ], 12 | [ 13 | "@babel/plugin-proposal-export-namespace-from", 14 | { 15 | "legacy": true 16 | } 17 | ] 18 | ] 19 | } -------------------------------------------------------------------------------- /gulp/bump.js: -------------------------------------------------------------------------------- 1 | import gulp from 'gulp-task-doc'; 2 | import replace from 'gulp-replace'; 3 | import minimist from 'minimist'; 4 | import packageJSON from '../package.json'; 5 | 6 | const currentVersion = packageJSON.version; 7 | 8 | /** 9 | * Bump version number 10 | * --version=x.x.x Set the exactly version 11 | */ 12 | gulp.task('bump', ['bump:package', 'bump:android', 'bump:ios']); 13 | 14 | // @internal 15 | gulp.task('bump:package', () => { 16 | const newVersion = getBumped(); 17 | return gulp.src('../package.json') 18 | .pipe(replace(/"version": "[\d.]+"/, `"version": "${newVersion}"`)) 19 | .pipe(replace(/--app-version [\d.]+/, `--app-version ${newVersion}`)) 20 | .pipe(gulp.dest('..')); 21 | }); 22 | 23 | // @internal 24 | gulp.task('bump:android', () => { 25 | const newVersion = getBumped(); 26 | const [major, minor, build] = newVersion.split('.'); 27 | const versionCode = (major * 1000 * 1000) + (minor * 1000) + (build * 1); 28 | 29 | gulp.src('../android/app/build.gradle') 30 | .pipe(replace(/versionName "[\d.]+"/, `versionName "${newVersion}"`)) 31 | .pipe(replace(/versionCode \d+/, `versionCode ${versionCode}`)) 32 | .pipe(gulp.dest('../android/app')); 33 | 34 | return gulp.src('../android/app/src/main/AndroidManifest.xml') 35 | .pipe(replace(/versionName="[\d.]+"/, `versionName="${newVersion}"`)) 36 | .pipe(replace(/versionCode="\d+"/, `versionCode="${versionCode}"`)) 37 | .pipe(gulp.dest('../android/app/src/main')); 38 | }); 39 | 40 | // @internal 41 | gulp.task('bump:ios', () => { 42 | const v = getBumped(); 43 | return gulp.src('../ios/Blum/Info.plist') 44 | .pipe(replace( 45 | /CFBundleShortVersionString<\/key>\n\s+[\d.]+/, 46 | `CFBundleShortVersionString\n\t${v}` 47 | )) 48 | .pipe(replace( 49 | /CFBundleVersion<\/key>\n\s+[\d.]+/, 50 | `CFBundleVersion\n\t${v}` 51 | )) 52 | .pipe(gulp.dest('../ios/Blum')); 53 | }); 54 | 55 | function getBumped() { 56 | const argv = minimist(process.argv.slice(2)); 57 | if (argv.version) { 58 | // eslint-disable-next-line no-console 59 | console.log('NEW VERSION', argv.version); 60 | return argv.version; 61 | } 62 | 63 | const currentSemVer = currentVersion.split('.'); 64 | currentSemVer[2] = +currentSemVer[2] + 1; 65 | 66 | // eslint-disable-next-line no-console 67 | console.log('NEW VERSION', currentSemVer.join('.')); 68 | return currentSemVer.join('.'); 69 | } 70 | -------------------------------------------------------------------------------- /gulp/gulpfile.babel.js: -------------------------------------------------------------------------------- 1 | import gulp from 'gulp-task-doc'; 2 | import './bump'; 3 | import './install'; 4 | 5 | gulp.task('help', gulp.help()); 6 | 7 | // @internal 8 | gulp.task('default', ['help']); 9 | -------------------------------------------------------------------------------- /gulp/install.js: -------------------------------------------------------------------------------- 1 | import gulp from 'gulp-task-doc'; 2 | import Validate from 'git-validate'; 3 | 4 | /** 5 | * Install default git pre-commit hook 6 | */ 7 | gulp.task('hooks-install', () => { 8 | Validate.installScript('lint', 'eslint src'); 9 | Validate.installScript('flow-check', 'yarn flow src'); 10 | Validate.installScript('test', 'test'); 11 | Validate.configureHook('pre-commit', ['lint', 'flow-check', 'test'], true); 12 | Validate.installHooks(['pre-commit']); 13 | }); 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { AppRegistry } from 'react-native'; 4 | import { createStore, combineReducers, applyMiddleware } from 'redux'; 5 | import { Provider } from 'react-redux'; 6 | import thunk from 'redux-thunk'; 7 | 8 | import App from './src/App'; 9 | import reducers from './src/reducers'; 10 | 11 | const appReducer = combineReducers(reducers); 12 | const store = createStore(appReducer, applyMiddleware(thunk)); 13 | 14 | const BlumApp = () => ( 15 | 16 | 17 | 18 | ); 19 | 20 | AppRegistry.registerComponent('Blum', () => BlumApp); 21 | -------------------------------------------------------------------------------- /ios/Blum-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #ifndef RNImageProcessor_Bridging_Header_h 6 | #define RNImageProcessor_Bridging_Header_h 7 | 8 | #import 9 | 10 | #endif /* RNImageProcessor_Bridging_Header_h */ 11 | -------------------------------------------------------------------------------- /ios/Blum-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSAppTransportSecurity 26 | 27 | NSExceptionDomains 28 | 29 | localhost 30 | 31 | NSExceptionAllowsInsecureHTTPLoads 32 | 33 | 34 | 35 | 36 | NSLocationWhenInUseUsageDescription 37 | 38 | UILaunchStoryboardName 39 | LaunchScreen 40 | UIRequiredDeviceCapabilities 41 | 42 | armv7 43 | 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | UIViewControllerBasedStatusBarAppearance 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /ios/Blum-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/Blum.xcodeproj/xcshareddata/xcschemes/Blum-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/Blum.xcodeproj/xcshareddata/xcschemes/Blum.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 65 | 66 | 67 | 68 | 70 | 76 | 77 | 78 | 79 | 80 | 90 | 92 | 98 | 99 | 100 | 101 | 107 | 109 | 115 | 116 | 117 | 118 | 120 | 121 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /ios/Blum/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 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 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (nonatomic, strong) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ios/Blum/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 | #import 13 | #import 14 | #import 15 | #import 16 | 17 | @implementation AppDelegate 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 20 | { 21 | NSURL *jsCodeLocation; 22 | 23 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 24 | 25 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 26 | moduleName:@"Blum" 27 | initialProperties:nil 28 | launchOptions:launchOptions]; 29 | rootView.backgroundColor = [UIColor clearColor]; 30 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 31 | 32 | UIView *backgroundView = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] firstObject]; 33 | backgroundView.frame = self.window.bounds; 34 | 35 | UIView *launchScreenView = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] firstObject]; 36 | rootView.frame = self.window.bounds; 37 | launchScreenView.frame = self.window.bounds; 38 | rootView.loadingView = launchScreenView; 39 | [backgroundView addSubview: rootView]; 40 | 41 | UIViewController *rootViewController = [UIViewController new]; 42 | rootViewController.view = backgroundView; 43 | self.window.rootViewController = rootViewController; 44 | [self.window makeKeyAndVisible]; 45 | 46 | [UIApplication sharedApplication].idleTimerDisabled = YES; 47 | 48 | UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 49 | [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) 50 | completionHandler:^(BOOL granted, NSError * _Nullable error) 51 | { 52 | if (!granted) { 53 | NSLog(@"Permission for notifiations not granted"); 54 | } 55 | }]; 56 | 57 | [UIDevice currentDevice].batteryMonitoringEnabled = true; 58 | [BugsnagReactNative start]; 59 | 60 | return YES; 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ios/Blum/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/1024x1024.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/120x120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/120x120-1.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/120x120.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/180x180.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/40x40.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/58x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/58x58.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/60x60.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/80x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/80x80.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/87x87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/AppIcon.appiconset/87x87.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "40x40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "60x60.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "58x58.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "87x87.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "80x80.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "120x120.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "120x120-1.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "180x180.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "1024x1024", 53 | "idiom" : "ios-marketing", 54 | "filename" : "1024x1024.png", 55 | "scale" : "1x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/launch_background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "loading-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "loading-1.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "loading.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/launch_background.imageset/loading-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/launch_background.imageset/loading-1.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/launch_background.imageset/loading-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/launch_background.imageset/loading-2.png -------------------------------------------------------------------------------- /ios/Blum/Images.xcassets/launch_background.imageset/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/Images.xcassets/launch_background.imageset/loading.png -------------------------------------------------------------------------------- /ios/Blum/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BugsnagAPIKey 6 | 9683ef773a12af3d43244e5b5a116a2c 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleDisplayName 10 | $(PRODUCT_NAME) 11 | CFBundleExecutable 12 | $(EXECUTABLE_NAME) 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | $(PRODUCT_NAME) 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | $(MARKETING_VERSION) 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | $(CURRENT_PROJECT_VERSION) 27 | LSRequiresIPhoneOS 28 | 29 | NSAppTransportSecurity 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSPhotoLibraryAddUsageDescription 41 | Introvert is using Photo Library to save artwork to the gallery 42 | NSPhotoLibraryUsageDescription 43 | Introvert is using Photo Library to save artwork to the gallery 44 | UIAppFonts 45 | 46 | IBMPlexMono-ExtraLight.ttf 47 | IBMPlexMono-Medium.ttf 48 | IBMPlexMono-Regular.ttf 49 | IBMPlexMono-Italic.ttf 50 | 51 | UIBackgroundModes 52 | 53 | audio 54 | 55 | UILaunchStoryboardName 56 | LaunchScreen 57 | UIRequiredDeviceCapabilities 58 | 59 | armv7 60 | 61 | UIStatusBarStyle 62 | UIStatusBarStyleLightContent 63 | UISupportedInterfaceOrientations 64 | 65 | UIInterfaceOrientationPortrait 66 | 67 | UIViewControllerBasedStatusBarAppearance 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /ios/Blum/fonts/IBMPlexMono-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/fonts/IBMPlexMono-ExtraLight.ttf -------------------------------------------------------------------------------- /ios/Blum/fonts/IBMPlexMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/fonts/IBMPlexMono-Italic.ttf -------------------------------------------------------------------------------- /ios/Blum/fonts/IBMPlexMono-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/fonts/IBMPlexMono-Medium.ttf -------------------------------------------------------------------------------- /ios/Blum/fonts/IBMPlexMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/Blum/fonts/IBMPlexMono-Regular.ttf -------------------------------------------------------------------------------- /ios/Blum/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 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 | -------------------------------------------------------------------------------- /ios/BlumTests/BlumTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 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 | #import 10 | 11 | #import 12 | #import 13 | 14 | #define TIMEOUT_SECONDS 600 15 | #define TEXT_TO_LOOK_FOR @"Welcome to React" 16 | 17 | @interface blumTests : XCTestCase 18 | 19 | @end 20 | 21 | @implementation blumTests 22 | 23 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 24 | { 25 | if (test(view)) { 26 | return YES; 27 | } 28 | for (UIView *subview in [view subviews]) { 29 | if ([self findSubviewInView:subview matching:test]) { 30 | return YES; 31 | } 32 | } 33 | return NO; 34 | } 35 | 36 | - (void)testRendersWelcomeScreen 37 | { 38 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 39 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 40 | BOOL foundElement = NO; 41 | 42 | __block NSString *redboxError = nil; 43 | #ifdef DEBUG 44 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 45 | if (level >= RCTLogLevelError) { 46 | redboxError = message; 47 | } 48 | }); 49 | #endif 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | #ifdef DEBUG 64 | RCTSetLogFunction(RCTDefaultLogFunction); 65 | #endif 66 | 67 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 68 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 69 | } 70 | 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /ios/BlumTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/EmptyStab.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyStab.swift 3 | // Blum 4 | // 5 | // Created by Elf on 17.05.2018. 6 | // Copyright © 2018 Facebook. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '9.0' 2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' 3 | 4 | target 'blum' do 5 | # Pods for blum 6 | pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" 7 | pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" 8 | pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" 9 | pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" 10 | pod 'React', :path => '../node_modules/react-native/' 11 | pod 'React-Core', :path => '../node_modules/react-native/' 12 | pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' 13 | pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' 14 | pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' 15 | pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' 16 | pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' 17 | pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' 18 | pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' 19 | pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' 20 | pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' 21 | pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' 22 | pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' 23 | pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' 24 | pod 'React-RCTPushNotification', :path => '../node_modules/react-native/Libraries/PushNotificationIOS' 25 | 26 | pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' 27 | pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' 28 | pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' 29 | pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' 30 | pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon" 31 | pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" 32 | pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' 33 | 34 | pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' 35 | pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' 36 | pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' 37 | 38 | use_native_modules! 39 | end 40 | 41 | -------------------------------------------------------------------------------- /ios/blum.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/blum.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | PreviewsEnabled 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/sounds/sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/ios/sounds/sound.mp3 -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Metro configuration for React Native 3 | * https://github.com/facebook/react-native 4 | * 5 | * @format 6 | */ 7 | 8 | module.exports = { 9 | transformer: { 10 | getTransformOptions: async () => ({ 11 | transform: { 12 | experimentalImportSupport: false, 13 | inlineRequires: false, 14 | }, 15 | }), 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blum", 3 | "version": "0.0.1", 4 | "private": true, 5 | "babel": { 6 | "presets": [ 7 | "module:metro-react-native-babel-preset" 8 | ], 9 | "plugins": [ 10 | [ 11 | "@babel/plugin-proposal-decorators", 12 | { 13 | "legacy": true 14 | } 15 | ], 16 | [ 17 | "@babel/plugin-proposal-export-namespace-from", 18 | { 19 | "legacy": true 20 | } 21 | ] 22 | ] 23 | }, 24 | "scripts": { 25 | "android": "react-native run-android", 26 | "ios": "react-native run-ios", 27 | "start": "node node_modules/react-native/local-cli/cli.js start", 28 | "lint": "eslint .", 29 | "bump": "gulp bump --gulpfile 'gulp/gulpfile.babel.js'", 30 | "log-i": "react-native log-ios", 31 | "ios-src-maps": "react-native bundle --platform ios --dev true --entry-file index.js --bundle-output ios-debug.bundle --sourcemap-output ios-debug.bundle.map", 32 | "android-src-maps": "react-native bundle --platform android --dev true --entry-file index.js --bundle-output android-debug.bundle --sourcemap-output android-debug.bundle.map", 33 | "ios-upload-src-maps": "bugsnag-sourcemaps upload --api-key 9683ef773a12af3d43244e5b5a116a2c --app-version 1.0.30 --minified-file ios-debug.bundle --source-map ios-debug.bundle.map --minified-url \"localhost:8081/main.bundle?platform=ios&dev=true&minify=false\"", 34 | "add-hooks": "gulp install --gulpfile 'gulp/gulpfile.babel.js'", 35 | "fix-3p": "cd node_modules/react-native && scripts/ios-install-third-party.sh && cd third-party/glog-0.3.5/ && ../../scripts/ios-configure-glog.sh && cd ../../../..", 36 | "test": "jest" 37 | }, 38 | "dependencies": { 39 | "@react-native-community/async-storage": "react-native-community/react-native-async-storage", 40 | "@react-native-community/masked-view": "^0.1.6", 41 | "bugsnag-react-native": "^2.23.5", 42 | "lodash": "^4.17.15", 43 | "moment": "^2.24.0", 44 | "moment-duration-format": "^2.3.2", 45 | "react": "16.9.0", 46 | "react-native": "0.61.5", 47 | "react-native-device-info": "^5.4.1", 48 | "react-native-gesture-handler": "^1.5.3", 49 | "react-native-image-processor": "https://github.com/merryejik/react-native-image-processor.git", 50 | "react-native-logger": "^1.0.3", 51 | "react-native-safe-area-context": "^0.6.2", 52 | "react-native-screens": "^2.0.0-alpha.33", 53 | "react-native-sound": "^0.11.0", 54 | "react-native-webview": "^8.0.6", 55 | "react-navigation": "^4.0.10", 56 | "react-navigation-stack": "^2.0.16", 57 | "react-redux": "^7.1.3", 58 | "redux": "^4.0.5", 59 | "redux-thunk": "^2.3.0", 60 | "reselect": "^4.0.0", 61 | "rn-fetch-blob": "^0.12.0" 62 | }, 63 | "devDependencies": { 64 | "@babel/core": "^7.8.3", 65 | "@babel/plugin-proposal-decorators": "^7.8.3", 66 | "@babel/plugin-proposal-export-namespace-from": "^7.8.3", 67 | "@babel/runtime": "^7.8.3", 68 | "@react-native-community/eslint-config": "^0.0.6", 69 | "babel-eslint": "^10.0.3", 70 | "babel-jest": "^25.1.0", 71 | "eslint": "^6.8.0", 72 | "eslint-config-airbnb": "^18.0.1", 73 | "eslint-plugin-flowtype": "^4.6.0", 74 | "eslint-plugin-import": "^2.20.0", 75 | "eslint-plugin-jsx-a11y": "^6.2.3", 76 | "eslint-plugin-prettier": "^3.1.2", 77 | "eslint-plugin-react": "^7.18.0", 78 | "eslint-plugin-react-native": "^3.8.1", 79 | "flow-bin": "^0.116.1", 80 | "git-validate": "^2.2.4", 81 | "gulp": "^3.9.1", 82 | "gulp-babel": "^8.0.0", 83 | "gulp-rename": "^1.4.0", 84 | "gulp-replace": "^1.0.0", 85 | "gulp-task-doc": "^1.0.11", 86 | "jest": "^25.1.0", 87 | "metro-react-native-babel-preset": "^0.58.0", 88 | "minimist": "^1.2.0", 89 | "prettier": "^1.14.3", 90 | "react-test-renderer": "16.9.0" 91 | }, 92 | "jest": { 93 | "preset": "react-native" 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Animated, Easing, Platform, StatusBar } from 'react-native'; 4 | import { createAppContainer } from 'react-navigation'; 5 | import { createStackNavigator } from 'react-navigation-stack'; 6 | import 'react-native-gesture-handler'; 7 | 8 | // eslint-disable-next-line no-unused-vars 9 | import * as momentDuration from 'moment-duration-format'; 10 | 11 | import { colors } from './common/ui'; 12 | import routes from './config/routing'; 13 | 14 | if (Platform.OS === 'android') { 15 | StatusBar.setBackgroundColor(colors.black, true); 16 | StatusBar.setTranslucent(true); 17 | } 18 | 19 | const RootStack = createStackNavigator(routes, { 20 | navigationOptions: { 21 | header: null, 22 | headerPressColorAndroid: colors.rippleColor, 23 | gesturesEnabled: false, 24 | }, 25 | headerMode: 'none', 26 | cardStyle: { 27 | backgroundColor: 'transparent', 28 | }, 29 | 30 | transitionConfig: () => ({ 31 | transitionSpec: { 32 | duration: 300, 33 | easing: Easing.out(Easing.poly(4)), 34 | timing: Animated.timing, 35 | }, 36 | 37 | containerStyle: { 38 | backgroundColor: 'transparent', 39 | }, 40 | 41 | screenInterpolator: (sceneProps) => { 42 | const { position, scene } = sceneProps; 43 | const { index } = scene; 44 | 45 | const opacity = position.interpolate({ 46 | inputRange: [index - 1, index, index + 1], 47 | outputRange: [0, 1, 1], 48 | }); 49 | 50 | const scale = position.interpolate({ 51 | inputRange: [index - 1, index, index + 1], 52 | outputRange: [0.85, 1, 1], 53 | }); 54 | 55 | return { opacity, transform: [{ scale }] }; 56 | }, 57 | }), 58 | }); 59 | 60 | const AppContainer = createAppContainer(RootStack); 61 | export default AppContainer; 62 | -------------------------------------------------------------------------------- /src/actions/CommonActions.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { saveHelper } from '../common/utils'; 3 | 4 | const FIRST_RUN_KEY = 'FIRST_RUN_KEY'; 5 | 6 | export async function saveInstallationFlag(value: boolean) { 7 | await saveHelper.saveFlag(FIRST_RUN_KEY, value); 8 | } 9 | 10 | export async function isFirstRun(): Promise { 11 | return !(await saveHelper.getFlag(FIRST_RUN_KEY)); 12 | } 13 | -------------------------------------------------------------------------------- /src/actions/DurationActions.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { DurationActionTypes } from '../constants'; 3 | 4 | // eslint-disable-next-line 5 | export function setDuration(duration: number) { 6 | return (dispatch: Dispatch) => { 7 | dispatch({ 8 | type: DurationActionTypes.SET_DURATION, 9 | payload: duration, 10 | }); 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /src/actions/GalleryActions.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import RNFetchBlob from 'rn-fetch-blob'; 3 | import RNImageProcessor from 'react-native-image-processor'; 4 | import moment from 'moment'; 5 | 6 | import { GalleryActionTypes } from '../constants'; 7 | import { saveHelper } from '../common/utils'; 8 | import { colors } from '../common/ui'; 9 | 10 | export function loadAllImages() { 11 | return async (dispatch: Dispatch) => { 12 | const filesInfo = await saveHelper.loadAllImages(); 13 | 14 | // Test if images exists and if not delete them and store files; 15 | const filesExistResults = await Promise.all(filesInfo.map( 16 | async file => RNFetchBlob.fs.exists(file.name) 17 | )); 18 | const existingFiles = filesInfo.filter((_, idx) => filesExistResults[idx]) 19 | .sort((f1: FileInfo, f2: FileInfo) => { 20 | if (moment(f1.date).isSame(f2.date)) return 0; 21 | if (moment(f1.date).isBefore(f2.date)) return 1; 22 | 23 | return -1; 24 | }); 25 | 26 | saveHelper.saveAllImages(existingFiles); 27 | 28 | dispatch({ 29 | type: GalleryActionTypes.LOAD_SAVED_IMAGES, 30 | payload: existingFiles, 31 | }); 32 | }; 33 | } 34 | 35 | export function deleteImage(fileName: string) { 36 | return async (dispatch: Dispatch, getState: Function) => { 37 | dispatch({ 38 | type: GalleryActionTypes.DELETE_IMAGE, 39 | payload: fileName, 40 | }); 41 | 42 | const { gallery: { filesInfo } } = getState(); 43 | saveHelper.saveAllImages(filesInfo); 44 | await RNFetchBlob.fs.unlink(`file://${fileName}`); 45 | }; 46 | } 47 | 48 | export function makePoster(files: Array) { 49 | return async (dispatch: Dispatch) => { 50 | dispatch({ type: GalleryActionTypes.TOGGLE_MAKING_POSTER }); 51 | 52 | const posterOptions = { 53 | columnsCount: 5, 54 | imgCellW: 300, 55 | imgCellH: 300, 56 | startX: 210, 57 | startY: 354, 58 | horSpace: 140, 59 | vertSpace: 200, 60 | }; 61 | 62 | const posterName = `poster_${moment().format('YYYYMMDD_HHmmss')}`; 63 | await RNImageProcessor.drawMosaicImage( 64 | files.map(f => f.name), 65 | posterName, 66 | colors.black, 67 | posterOptions 68 | ); 69 | RNImageProcessor.saveToGallery(posterName, 'png'); 70 | dispatch({ type: GalleryActionTypes.TOGGLE_MAKING_POSTER }); 71 | }; 72 | } 73 | -------------------------------------------------------------------------------- /src/actions/SettingsActions.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { SettingsActionTypes } from '../constants'; 3 | import { saveHelper } from '../common/utils'; 4 | 5 | const SOUND_STATE_TAG = 'SOUND_STATE_TAG'; 6 | 7 | export function setSoundStatePref(soundOn: boolean) { 8 | return (dispatch: Function) => { 9 | // Save sound 10 | saveHelper.saveFlag(SOUND_STATE_TAG, soundOn); 11 | 12 | dispatch({ 13 | soundOn, 14 | type: SettingsActionTypes.SET_SOUND_STATE, 15 | }); 16 | }; 17 | } 18 | 19 | export function getSoundStatePref() { 20 | return async (dispatch: Function) => { 21 | const soundOn = await saveHelper.getFlag(SOUND_STATE_TAG); 22 | 23 | dispatch({ 24 | soundOn, 25 | type: SettingsActionTypes.SET_SOUND_STATE, 26 | }); 27 | }; 28 | } 29 | 30 | export function loadAllSettings() { 31 | return async (dispatch: Function) => { 32 | const soundOn = await saveHelper.getFlag(SOUND_STATE_TAG); 33 | 34 | dispatch({ 35 | type: SettingsActionTypes.LOAD_ALL_SETTINGS, 36 | settings: { 37 | soundOn, 38 | }, 39 | }); 40 | }; 41 | } 42 | -------------------------------------------------------------------------------- /src/actions/index.js: -------------------------------------------------------------------------------- 1 | export * as DurationActions from './DurationActions'; 2 | export * as GalleryActions from './GalleryActions'; 3 | export * as CommonActions from './CommonActions'; 4 | export * as SettingsActions from './SettingsActions'; 5 | -------------------------------------------------------------------------------- /src/common/ui/ColorProgress.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Animated, View, StyleSheet } from 'react-native'; 4 | 5 | type Props = { 6 | style: ?Object, 7 | maxValue: number, 8 | value: number, 9 | backgroundColor: string | Object, 10 | fillColor: string | Object, 11 | }; 12 | 13 | export default function ColorProgress({ 14 | style, 15 | maxValue, 16 | value, 17 | backgroundColor, 18 | fillColor, 19 | }: Props) { 20 | let fillWidth = 0; 21 | if (value >= maxValue) { 22 | fillWidth = 100; 23 | } else if (value > 0) { 24 | fillWidth = value * (100 / maxValue); 25 | } 26 | 27 | return ( 28 | 29 | 30 | 36 | 37 | 38 | ); 39 | } 40 | 41 | ColorProgress.defaultProps = { 42 | style: null, 43 | maxValue: 100, 44 | }; 45 | 46 | const styles = StyleSheet.create({ 47 | container: { 48 | height: 1, 49 | width: '100%', 50 | paddingHorizontal: 16, 51 | }, 52 | 53 | progressCont: { 54 | height: 1, 55 | width: '100%', 56 | }, 57 | 58 | fill: { 59 | height: 1, 60 | }, 61 | }); 62 | -------------------------------------------------------------------------------- /src/common/ui/ImageButton.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Easing, Animated, TouchableOpacity, StyleSheet } from 'react-native'; 4 | 5 | type Props = { 6 | style?: Object, 7 | imageStyle?: Object, 8 | source: Object | number, 9 | onPress: () => void, 10 | imgTintColor?: string, 11 | animated?: boolean, 12 | }; 13 | 14 | type State = { 15 | rotateAnim: Animated.Value, 16 | }; 17 | 18 | export default class ImageButton extends React.Component { 19 | static defaultProps = { 20 | style: null, 21 | imageStyle: null, 22 | imgTintColor: null, 23 | animated: false, 24 | }; 25 | 26 | state = { 27 | rotateAnim: new Animated.Value(0), 28 | }; 29 | 30 | onButtonPress = () => { 31 | Animated.timing(this.state.rotateAnim, { 32 | toValue: 10, 33 | duration: 350, 34 | easing: Easing.out(Easing.linear), 35 | }).start(() => this.state.rotateAnim.setValue(0)); 36 | 37 | if (this.props.onPress) { 38 | this.props.onPress(); 39 | } 40 | }; 41 | 42 | render() { 43 | const { animated, style, imageStyle, imgTintColor, source } = this.props; 44 | 45 | const rotate = this.state.rotateAnim.interpolate({ 46 | inputRange: [0, 10], 47 | outputRange: ['0deg', '360deg'], 48 | }); 49 | 50 | return ( 51 | 56 | 67 | 68 | ); 69 | } 70 | } 71 | 72 | const styles = StyleSheet.create({ 73 | button: { 74 | width: 38, 75 | height: 38, 76 | alignItems: 'center', 77 | justifyContent: 'center', 78 | }, 79 | 80 | image: { 81 | width: 32, 82 | height: 32, 83 | }, 84 | }); 85 | -------------------------------------------------------------------------------- /src/common/ui/PulseButton.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { 4 | Animated, Easing, TouchableOpacity, StyleSheet, Text, 5 | } from 'react-native'; 6 | 7 | import colors from './colors'; 8 | 9 | type Props = { 10 | style?: Object, 11 | animated?: boolean, 12 | title: string, 13 | titleStyle?: Object, 14 | onPress: () => void, 15 | }; 16 | 17 | type State = { 18 | animValue: Animated.Value; 19 | }; 20 | 21 | export default class PulseButton extends React.Component { 22 | static defaultProps = { 23 | animated: false, 24 | }; 25 | 26 | state = { 27 | animValue: new Animated.Value(0), 28 | }; 29 | 30 | componentDidMount() { 31 | this.runAnimation(); 32 | } 33 | 34 | componentWillUnmount() { 35 | this.state.animValue.stopAnimation(); 36 | } 37 | 38 | runAnimation() { 39 | const { animated } = this.props; 40 | const { animValue } = this.state; 41 | 42 | if (!animated) return; 43 | 44 | Animated.loop(Animated.sequence([ 45 | Animated.timing(animValue, { 46 | toValue: 0.5, 47 | duration: 150, 48 | easing: Easing.out(Easing.elastic(2)), 49 | }), 50 | Animated.timing(animValue, { 51 | toValue: -0.5, 52 | duration: 150, 53 | easing: Easing.out(Easing.elastic(2)), 54 | }), 55 | ])).start(); 56 | } 57 | 58 | render() { 59 | const { style, title, titleStyle, onPress } = this.props; 60 | const { animValue } = this.state; 61 | 62 | return ( 63 | 67 | 73 | 74 | {title} 75 | 76 | 77 | 78 | ); 79 | } 80 | } 81 | 82 | const styles = StyleSheet.create({ 83 | container: { 84 | alignItems: 'center', 85 | justifyContent: 'center', 86 | }, 87 | 88 | animCont: { 89 | alignItems: 'center', 90 | justifyContent: 'center', 91 | width: 80, 92 | height: 24, 93 | borderColor: colors.white, 94 | borderWidth: 1, 95 | borderRadius: 5, 96 | padding: 4, 97 | }, 98 | 99 | titleText: { 100 | color: colors.white, 101 | fontSize: 12, 102 | fontFamily: 'IBMPlexMono', 103 | fontWeight: 'bold', 104 | backgroundColor: colors.transparent, 105 | }, 106 | }); 107 | -------------------------------------------------------------------------------- /src/common/ui/colors.js: -------------------------------------------------------------------------------- 1 | export default { 2 | timeLineBackground: '#1A1A1A', 3 | timeLineFront: '#FFF', 4 | failTimeLineFront: '#840C0C', 5 | subText: '#CCCCCC', 6 | transparent: 'transparent', 7 | 8 | // White 9 | white: '#FFFFFF', 10 | 11 | // Black 12 | black: '#000000', 13 | blackBBOp: '#000000BB', 14 | 15 | // Gray 16 | gray1: '#424242', 17 | gray2: '#E7E7E7', 18 | 19 | dark1: '#14171B', 20 | dark2: '#191919', 21 | 22 | light1: '#F9F9F9', 23 | }; 24 | -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_battery@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_battery@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_battery@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_battery@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_close.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_close_white@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_close_white@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_close_white@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_close_white@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_done.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_download.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_erase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_erase.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_grid.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_info.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_link.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_mute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_mute.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_print.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_print2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_print2.png -------------------------------------------------------------------------------- /src/common/ui/images/icons/ic_sound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/icons/ic_sound.png -------------------------------------------------------------------------------- /src/common/ui/images/img_fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/img_fail.png -------------------------------------------------------------------------------- /src/common/ui/images/img_launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/img_launch.png -------------------------------------------------------------------------------- /src/common/ui/images/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require, import/no-unresolved */ 2 | export default { 3 | // Icons 4 | closeIcon: require('./icons/ic_close.png'), 5 | closeBackOpIcon: require('./icons/ic_close_white.png'), 6 | doneIcon: require('./icons/ic_done.png'), 7 | downloadIcon: require('./icons/ic_download.png'), 8 | eraseIcon: require('./icons/ic_erase.png'), 9 | gridIcon: require('./icons/ic_grid.png'), 10 | infoIcon: require('./icons/ic_info.png'), 11 | linkIcon: require('./icons/ic_link.png'), 12 | printIcon: require('./icons/ic_print.png'), 13 | soundMuteIcon: require('./icons/ic_mute.png'), 14 | soundOnIcon: require('./icons/ic_sound.png'), 15 | batteryIcon: require('./icons/ic_battery.png'), 16 | 17 | // Info images 18 | info1: require('./info/img_info1.png'), 19 | info2: require('./info/img_info2.png'), 20 | info3: require('./info/img_info3.png'), 21 | info4: require('./info/img_info4.png'), 22 | 23 | // Common 24 | failBackground: require('./img_fail.png'), 25 | launchBackground: require('./img_launch.png'), 26 | }; 27 | -------------------------------------------------------------------------------- /src/common/ui/images/info/img_info1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/info/img_info1@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/info/img_info2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/info/img_info2@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/info/img_info3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/info/img_info3@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/info/img_info4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/info/img_info4@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/error_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/error_background@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/error_background@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/error_background@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_about.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_close@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_close@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_download@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_download@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_download@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_download@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_gallery@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_gallery@2x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_gallery@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_gallery@3x.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_print.png -------------------------------------------------------------------------------- /src/common/ui/images/old/ic_trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/ic_trash.png -------------------------------------------------------------------------------- /src/common/ui/images/old/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/logo.gif -------------------------------------------------------------------------------- /src/common/ui/images/old/page1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/page1.jpg -------------------------------------------------------------------------------- /src/common/ui/images/old/page2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/page2.jpg -------------------------------------------------------------------------------- /src/common/ui/images/old/page3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/page3.jpg -------------------------------------------------------------------------------- /src/common/ui/images/old/page4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/page4.jpg -------------------------------------------------------------------------------- /src/common/ui/images/old/sound_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/sound_off.png -------------------------------------------------------------------------------- /src/common/ui/images/old/sound_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IamIntrovert/Introvert/c39447044604b3f51121489eba78c7e762618150/src/common/ui/images/old/sound_on.png -------------------------------------------------------------------------------- /src/common/ui/index.js: -------------------------------------------------------------------------------- 1 | export colors from './colors'; 2 | export ColorProgress from './ColorProgress'; 3 | export images from './images'; 4 | export ImageButton from './ImageButton'; 5 | export PulseButton from './PulseButton'; 6 | -------------------------------------------------------------------------------- /src/common/utils/index.js: -------------------------------------------------------------------------------- 1 | export saveHelper from './saveHelper'; 2 | -------------------------------------------------------------------------------- /src/common/utils/saveHelper.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AsyncStorage from "@react-native-community/async-storage"; 3 | 4 | const FILE_NAMES_KEY = 'FILE_NAMES_KEY'; 5 | 6 | async function saveImageInfo(fileInfo: FileInfo) { 7 | try { 8 | const files = await loadAllImages(); 9 | files.push(fileInfo); 10 | await AsyncStorage.setItem(FILE_NAMES_KEY, JSON.stringify(files)); 11 | } catch (error) { 12 | // Error saving data 13 | } 14 | } 15 | 16 | async function saveAllImages(filesInfo: FileInfo) { 17 | try { 18 | await AsyncStorage.setItem(FILE_NAMES_KEY, JSON.stringify(filesInfo)); 19 | } catch (error) { 20 | // Error saving data 21 | } 22 | } 23 | 24 | async function loadAllImages() { 25 | try { 26 | const rawValue = await AsyncStorage.getItem(FILE_NAMES_KEY); 27 | if (rawValue !== null) { 28 | return JSON.parse(rawValue) || []; 29 | } 30 | } catch (error) { 31 | // Error retrieving data 32 | } 33 | 34 | return []; 35 | } 36 | 37 | async function saveFlag(keyName: string, value: boolean) { 38 | try { 39 | await AsyncStorage.setItem(keyName, JSON.stringify(value)); 40 | } catch (error) { 41 | // Error saving data 42 | } 43 | } 44 | 45 | async function getFlag(keyName: string) { 46 | try { 47 | const rawValue = await AsyncStorage.getItem(keyName); 48 | if (rawValue !== null) { 49 | return JSON.parse(rawValue) || false; 50 | } 51 | } catch (error) { 52 | // Error saving data 53 | } 54 | 55 | return false; 56 | } 57 | 58 | export default { 59 | saveImageInfo, 60 | saveAllImages, 61 | loadAllImages, 62 | saveFlag, 63 | getFlag, 64 | }; 65 | -------------------------------------------------------------------------------- /src/config/routing.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import LaunchScreen from '../modules/LaunchScreen'; 3 | import OnBoardingScreen from '../modules/OnBoarding'; 4 | import DurationSetScreen from '../modules/DurationSet'; 5 | import SavedGalleryScreen from '../modules/SavedGallery'; 6 | import MeditationScreen from '../modules/MeditationScreen/index.ios'; 7 | import FailScreen from '../modules/FailScreen'; 8 | import DownloadPostersScreen from '../modules/DownloadPosters'; 9 | import BatteryLowModal 10 | from '../modules/MeditationScreen/screens/BatteryLowModal'; 11 | 12 | export default { 13 | LaunchScreen: { screen: LaunchScreen }, 14 | OnBoardingScreen: { screen: OnBoardingScreen }, 15 | SavedGalleryScreen: { screen: SavedGalleryScreen }, 16 | DurationSetScreen: { screen: DurationSetScreen }, 17 | MeditationScreen: { screen: MeditationScreen }, 18 | FailScreen: { screen: FailScreen }, 19 | DownloadPostersScreen: { screen: DownloadPostersScreen }, 20 | BatteryLowModal: { screen: BatteryLowModal }, 21 | }; 22 | -------------------------------------------------------------------------------- /src/constants/DurationActionTypes.js: -------------------------------------------------------------------------------- 1 | export const SET_DURATION = 'SET_DURATION'; 2 | export const GET_DURATION = 'GET_DURATION'; 3 | -------------------------------------------------------------------------------- /src/constants/GalleryActionTypes.js: -------------------------------------------------------------------------------- 1 | export const LOAD_SAVED_IMAGES = 'LOAD_SAVED_IMAGES'; 2 | export const DELETE_IMAGE = 'DELETE_IMAGE'; 3 | export const TOGGLE_MAKING_POSTER = 'TOGGLE_MAKING_POSTER'; 4 | -------------------------------------------------------------------------------- /src/constants/SettingsActionTypes.js: -------------------------------------------------------------------------------- 1 | export const SET_SOUND_STATE = 'SET_SOUND_STATE'; 2 | export const LOAD_ALL_SETTINGS = 'LOAD_ALL_SETTINGS'; 3 | -------------------------------------------------------------------------------- /src/constants/index.js: -------------------------------------------------------------------------------- 1 | export * as DurationActionTypes from './DurationActionTypes'; 2 | export * as GalleryActionTypes from './GalleryActionTypes'; 3 | export * as SettingsActionTypes from './SettingsActionTypes'; 4 | -------------------------------------------------------------------------------- /src/flow/settings-action-flow-types.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { SettingsActionTypes } from '../actions'; 3 | 4 | export type SetSoundStateAction = {| 5 | type: SettingsActionTypes.SET_SOUND_STATE, 6 | soundOn: boolean, 7 | |}; 8 | 9 | export type LoadAllSettingsAction = {| 10 | type: SettingsActionTypes.LOAD_ALL_SETTINGS, 11 | settings: {| 12 | soundOn: boolean, 13 | |}, 14 | |}; 15 | 16 | export type SettingsAction = 17 | | SetSoundStateAction 18 | | LoadAllSettingsAction; 19 | -------------------------------------------------------------------------------- /src/flow/types.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | // eslint-disable-next-line no-unused-vars 3 | import type { NavigationScreenProp } from 'react-navigation'; 4 | 5 | export type FileInfo = { 6 | name: string, 7 | size: number, 8 | location: string, 9 | date: Date, 10 | }; 11 | 12 | // Events 13 | export type ContentOffset = { 14 | x: number, 15 | y: number, 16 | }; 17 | 18 | export type ContentInset = { 19 | bottom: number, 20 | top: number, 21 | left: number, 22 | right: number, 23 | }; 24 | 25 | export type LayoutMeasurement = { 26 | height: number, 27 | width: number, 28 | }; 29 | 30 | export type ContentSize = { 31 | height: number, 32 | width: number, 33 | }; 34 | 35 | export type OnScrollEvent = { 36 | nativeEvent: { 37 | zoomScale: number, 38 | contentInset: ContentInset, 39 | contentOffset: ContentOffset, 40 | layoutMeasurement: LayoutMeasurement, 41 | contentSize: ContentSize, 42 | }, 43 | }; 44 | 45 | export type OnLayoutEvent = { 46 | nativeEvent: { 47 | target: number; 48 | layout: { 49 | width: number; 50 | height: number; 51 | x: number; 52 | y: number; 53 | }; 54 | }; 55 | }; 56 | 57 | export type PanGestureEvent = { 58 | stateID: number, 59 | moveX: number, 60 | moveY: number, 61 | x0: number, 62 | y0: number, 63 | dx: number, 64 | dy: number, 65 | vx: number, 66 | vy: number, 67 | numberActiveTouches: number, 68 | _accountsForMovesUpTo: number, 69 | }; 70 | 71 | export type ReduxAction = { 72 | type: string, 73 | payload: any, 74 | }; 75 | 76 | export type AppStateType = 'active' | 'inactive' | 'background'; 77 | -------------------------------------------------------------------------------- /src/modules/DownloadPosters/components/EmptyState.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, Text, StyleSheet } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | 7 | type Props = { 8 | style?: ?Object; 9 | imagesCount: number; 10 | }; 11 | 12 | export default function EmptyState({ style, imagesCount }: Props) { 13 | return ( 14 | 15 | {imagesCount} / 30 16 | 17 | Collect 30 artworks and you can download it in a poster format. 18 | 19 | 20 | ); 21 | } 22 | 23 | EmptyState.defaultProps = { 24 | style: null, 25 | }; 26 | 27 | const styles = StyleSheet.create({ 28 | container: { 29 | flex: 1, 30 | alignSelf: 'stretch', 31 | justifyContent: 'center', 32 | backgroundColor: colors.black, 33 | }, 34 | 35 | headerText: { 36 | color: colors.white, 37 | fontSize: 24, 38 | fontFamily: 'IBMPlexMono-Medium', 39 | textAlign: 'center', 40 | marginBottom: '30%', 41 | }, 42 | 43 | messageText: { 44 | color: colors.white, 45 | fontSize: 16, 46 | fontFamily: 'IBMPlexMono', 47 | textAlign: 'center', 48 | lineHeight: 26, 49 | paddingHorizontal: 32, 50 | }, 51 | }); 52 | -------------------------------------------------------------------------------- /src/modules/DownloadPosters/components/PicturesGrid.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, Image, StyleSheet, FlatList } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | 7 | const COLUMNS_COUNT = 5; 8 | const ROWS_COUNT = 6; 9 | 10 | type Props = { 11 | style: ?Object, 12 | filesInfo: Array, 13 | }; 14 | 15 | type State = { 16 | itemWidth: number, 17 | itemHeight: number, 18 | }; 19 | 20 | export default class PicturesGrid extends React.Component { 21 | state = { 22 | itemWidth: 0, 23 | itemHeight: 0, 24 | }; 25 | 26 | shouldComponentUpdate(nextProps: Props, nextState: State) { 27 | return this.state.itemWidth !== nextState.itemWidth; 28 | } 29 | 30 | onListLayout = ({ nativeEvent }: OnLayoutEvent) => { 31 | this.setState({ 32 | itemWidth: Math.floor(nativeEvent.layout.width / COLUMNS_COUNT), 33 | itemHeight: Math.floor(nativeEvent.layout.height / ROWS_COUNT), 34 | }); 35 | } 36 | 37 | // eslint-disable-next-line react/no-unused-prop-types 38 | renderItem = ({ item }: { item: FileInfo }) => { 39 | const { itemWidth, itemHeight } = this.state; 40 | const imageWidth = itemWidth * 0.75; 41 | 42 | return ( 43 | 49 | {itemWidth > 0 && ( 50 | 58 | )} 59 | 60 | ); 61 | } 62 | 63 | render() { 64 | const { filesInfo, style } = this.props; 65 | 66 | return ( 67 | 68 | `${i.name}${Math.random() * 1000000}`} 76 | /> 77 | 78 | ); 79 | } 80 | } 81 | 82 | const styles = StyleSheet.create({ 83 | container: { 84 | flex: 1, 85 | backgroundColor: colors.black, 86 | padding: 24, 87 | }, 88 | 89 | itemCont: { 90 | alignItems: 'center', 91 | justifyContent: 'center', 92 | }, 93 | }); 94 | -------------------------------------------------------------------------------- /src/modules/DownloadPosters/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { 4 | ActivityIndicator, View, Text, StyleSheet, TouchableOpacity, 5 | } from 'react-native'; 6 | import { bindActionCreators } from 'redux'; 7 | import { connect } from 'react-redux'; 8 | 9 | import { GalleryActions } from '../../actions'; 10 | 11 | import { colors, images, ImageButton } from '../../common/ui'; 12 | import EmptyState from './components/EmptyState'; 13 | import PicturesGrid from './components/PicturesGrid'; 14 | 15 | const MAX_PICS = 30; 16 | 17 | type Props = { 18 | style: Object, 19 | filesInfo: Array, 20 | isMakingPoster: boolean, 21 | makePoster: (files: Array) => void, 22 | navigation: NavigationScreenProp<*>, 23 | }; 24 | 25 | const mapStateToProps = ({ gallery }) => ({ 26 | filesInfo: gallery.filesInfo, 27 | isMakingPoster: gallery.isMakingPoster, 28 | }); 29 | 30 | const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators( 31 | GalleryActions, 32 | dispatch 33 | ); 34 | 35 | @connect(mapStateToProps, mapDispatchToProps) 36 | export default class DownloadPosters extends React.Component { 37 | static defaultProps = { 38 | style: null, 39 | }; 40 | 41 | onGetPosters = () => { 42 | this.props.makePoster(this.props.filesInfo); 43 | }; 44 | 45 | renderDownloadBtn() { 46 | if (this.props.isMakingPoster) { 47 | return ; 48 | } 49 | 50 | return this.props.filesInfo.length >= MAX_PICS ? ( 51 | 54 | Download 55 | 56 | ) : null; 57 | } 58 | 59 | render() { 60 | const { filesInfo, style } = this.props; 61 | 62 | return ( 63 | 64 | 65 | this.props.navigation.goBack()} 67 | source={images.closeBackOpIcon} 68 | /> 69 | 70 | 71 | {filesInfo.length < MAX_PICS ? ( 72 | 73 | ) : ( 74 | 78 | )} 79 | 80 | 81 | {this.renderDownloadBtn()} 82 | 83 | 84 | ); 85 | } 86 | } 87 | 88 | const styles = StyleSheet.create({ 89 | container: { 90 | flex: 1, 91 | alignItems: 'center', 92 | backgroundColor: colors.dark2, 93 | paddingHorizontal: 32, 94 | }, 95 | 96 | navBar: { 97 | height: 135, 98 | justifyContent: 'center', 99 | alignItems: 'center', 100 | alignSelf: 'stretch', 101 | }, 102 | 103 | galleryView: { 104 | width: '100%', 105 | }, 106 | 107 | footer: { 108 | height: 110, 109 | justifyContent: 'center', 110 | alignItems: 'center', 111 | alignSelf: 'stretch', 112 | }, 113 | 114 | downloadText: { 115 | color: colors.white, 116 | fontSize: 18, 117 | fontFamily: 'IBMPlexMono-Medium', 118 | }, 119 | }); 120 | -------------------------------------------------------------------------------- /src/modules/DurationSet/components/RoundButton.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { TouchableOpacity, StyleSheet, View, Text } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | 7 | type Props = { 8 | style: ?Object, 9 | onPress: () => void, 10 | onPressIn: () => Promise, 11 | }; 12 | 13 | export default function RoundButton({ 14 | style, 15 | onPress, 16 | onPressIn, 17 | }: Props) { 18 | return ( 19 | 24 | 25 | START 26 | 27 | 28 | ); 29 | } 30 | 31 | RoundButton.defaultProps = { 32 | style: null, 33 | onPress: () => {}, 34 | onPressIn: () => {}, 35 | }; 36 | 37 | const styles = StyleSheet.create({ 38 | container: { 39 | position: 'absolute', 40 | width: 120, 41 | height: 120, 42 | borderRadius: 60, 43 | backgroundColor: colors.black, 44 | alignItems: 'center', 45 | justifyContent: 'center', 46 | borderColor: colors.white, 47 | borderWidth: 2, 48 | bottom: '12%', 49 | }, 50 | 51 | text: { 52 | color: colors.white, 53 | fontSize: 17, 54 | fontFamily: 'IBMPlexMono', 55 | }, 56 | }); 57 | -------------------------------------------------------------------------------- /src/modules/DurationSet/components/SetItem.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, Dimensions, StyleSheet, Text } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | 7 | const itemWidth = Dimensions.get('window').width / 2; 8 | 9 | type Props = { 10 | style: ?Object, 11 | value: number, 12 | selected: boolean, 13 | }; 14 | 15 | export default function SetItem({ 16 | style, 17 | value, 18 | selected, 19 | }: Props) { 20 | return ( 21 | 22 | 23 | {value} 24 | 25 | 26 | ); 27 | } 28 | 29 | SetItem.defaultProps = { 30 | style: null, 31 | }; 32 | 33 | const styles = StyleSheet.create({ 34 | container: { 35 | width: itemWidth, 36 | height: 200, 37 | backgroundColor: colors.black, 38 | alignItems: 'center', 39 | justifyContent: 'center', 40 | }, 41 | 42 | text: { 43 | color: colors.dark1, 44 | fontSize: 130, 45 | fontWeight: '100', 46 | fontFamily: 'IBMPlexMono-ExtraLight', 47 | }, 48 | 49 | selectedText: { 50 | color: colors.white, 51 | }, 52 | }); 53 | -------------------------------------------------------------------------------- /src/modules/FailScreen/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { 4 | View, StyleSheet, Text, ImageBackground, TouchableWithoutFeedback, 5 | } from 'react-native'; 6 | import _ from 'lodash'; 7 | 8 | import { colors, ColorProgress, images, ImageButton } from '../../common/ui'; 9 | 10 | const QUOTES = [ 11 | { 12 | author: 'New Philosopher, Jessa Gamble', 13 | text: '“Every great work of culture, be it a scientific ' + 14 | 'breakthrough or a literary masterpiece, was achieved ' + 15 | 'by a person who, at minimum, was able to pay attention.“', 16 | }, 17 | { 18 | author: 'Wired 1197, Michael H. Goldhaber', 19 | text: '“The currency of the New Economy won\'t be money, but ' + 20 | 'attention – A radical theory of value.“', 21 | }, 22 | { 23 | author: 'Aeon, Tom Chatfield', 24 | text: '“If contentment and a sense of control are partial measures ' + 25 | 'of success, many of us are selling ourselves far too cheap“', 26 | }, 27 | { 28 | author: 'Simone Weil', 29 | text: '“L’attention est la forme la plus rare et la plus pure ' 30 | + 'de la générosité.”', 31 | }, 32 | { 33 | author: 'Susan Sontag', 34 | text: '“Attention is vitality. It connects you with others. It makes ' 35 | + 'you eager. Stay eager.”', 36 | }, 37 | ]; 38 | 39 | type Props = { 40 | navigation: NavigationScreenProp<*>, 41 | }; 42 | 43 | export default class FailScreen extends Component { 44 | onClose() { 45 | this.props.navigation.pop(2); 46 | } 47 | 48 | render() { 49 | const { params } = this.props.navigation.state; 50 | const quote = QUOTES[_.random(0, QUOTES.length - 1)]; 51 | 52 | return ( 53 | this.onClose()}> 54 | 55 | 60 | 61 | this.onClose()} 63 | source={images.closeBackOpIcon} 64 | /> 65 | 66 | 67 | 68 | 69 | The artwork was destroyed. 70 | 71 | 72 | {quote.text} 73 | 74 | 75 | 76 | {quote.author} 77 | 78 | 79 | 80 | 87 | 88 | 89 | ); 90 | } 91 | } 92 | 93 | const styles = StyleSheet.create({ 94 | container: { 95 | flex: 1, 96 | backgroundColor: colors.black, 97 | justifyContent: 'space-between', 98 | paddingBottom: 32, 99 | }, 100 | 101 | headerCont: { 102 | width: '100%', 103 | height: '50%', 104 | paddingTop: 32, 105 | paddingLeft: 24, 106 | }, 107 | 108 | navBar: { 109 | height: 50, 110 | alignSelf: 'stretch', 111 | }, 112 | 113 | content: { 114 | flex: 1, 115 | paddingHorizontal: 32, 116 | justifyContent: 'center', 117 | }, 118 | 119 | headerText: { 120 | fontSize: 19, 121 | fontFamily: 'IBMPlexMono-Medium', 122 | color: colors.white, 123 | }, 124 | 125 | messageText: { 126 | fontSize: 13, 127 | lineHeight: 24, 128 | fontFamily: 'IBMPlexMono-Italic', 129 | fontStyle: 'italic', 130 | color: colors.subText, 131 | marginTop: 32, 132 | }, 133 | 134 | authorNameText: { 135 | fontSize: 13, 136 | lineHeight: 24, 137 | fontFamily: 'IBMPlexMono', 138 | color: colors.subText, 139 | marginTop: 20, 140 | marginLeft: 16, 141 | }, 142 | 143 | progress: { 144 | paddingHorizontal: 24, 145 | }, 146 | }); 147 | -------------------------------------------------------------------------------- /src/modules/LaunchScreen/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { StyleSheet, ImageBackground } from 'react-native'; 4 | 5 | import { CommonActions } from '../../actions'; 6 | import { images } from '../../common/ui'; 7 | 8 | const SHOW_TIMEOUT = 3000; 9 | 10 | type Props = { 11 | navigation: NavigationScreenProp<*>, 12 | }; 13 | 14 | export default class LaunchScreen extends React.Component { 15 | showTimer: TimeoutID; 16 | 17 | componentDidMount() { 18 | this.showTimer = setTimeout(async () => { 19 | if (await CommonActions.isFirstRun()) { 20 | this.props.navigation.navigate('OnBoardingScreen', { isAbout: false }); 21 | } else { 22 | this.props.navigation.navigate('DurationSetScreen'); 23 | } 24 | }, SHOW_TIMEOUT); 25 | } 26 | 27 | componentWillUnmount() { 28 | clearTimeout(this.showTimer); 29 | } 30 | 31 | render() { 32 | return ( 33 | 38 | ); 39 | } 40 | } 41 | 42 | const styles = StyleSheet.create({ 43 | container: { 44 | flex: 1, 45 | }, 46 | }); 47 | -------------------------------------------------------------------------------- /src/modules/MeditationScreen/html/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import RNFetchBlob from "rn-fetch-blob"; 3 | 4 | const { dirs } = RNFetchBlob.fs; 5 | 6 | export function getReflectionsCount(duration: number): number { 7 | switch (duration) { 8 | case 600: 9 | case 900: 10 | return 4; 11 | 12 | case 1200: 13 | case 1500: 14 | case 1800: 15 | return 6; 16 | 17 | case 2100: 18 | case 2400: 19 | case 2700: 20 | return 8; 21 | 22 | case 3000: 23 | case 3300: 24 | case 3600: 25 | return 10; 26 | 27 | default: 28 | return 10; 29 | } 30 | } 31 | 32 | export function getHtml( 33 | canvasWidth: number, 34 | canvasHeight: number, 35 | duration: number 36 | ) { 37 | return ` 38 | 39 | 40 | 41 | 42 | 43 | 60 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | `; 74 | } 75 | -------------------------------------------------------------------------------- /src/modules/MeditationScreen/screens/BatteryLowModal.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { 4 | View, StyleSheet, Dimensions, Image, Text, TouchableOpacity, 5 | } from 'react-native'; 6 | 7 | import { colors, images, ImageButton } from '../../../common/ui'; 8 | 9 | const SCREEN_H = Dimensions.get('window').height; 10 | const MODAL_H = 440; 11 | 12 | type Props = { 13 | navigation: NavigationScreenProp<*>, 14 | }; 15 | 16 | export default class BatteryLowModal extends Component { 17 | onClose = () => { 18 | this.props.navigation.pop(); 19 | }; 20 | 21 | onContinue = () => { 22 | this.onClose(); 23 | this.props.navigation.navigate('MeditationScreen'); 24 | }; 25 | 26 | render() { 27 | return ( 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | 42 | 43 | Attention. 44 | 45 | 46 | Your battery is running low. 47 | Do not close the app before time is up. 48 | 49 | 50 | 51 | 55 | Continue 56 | 57 | 58 | 62 | Cancel 63 | 64 | 65 | 66 | 67 | ); 68 | } 69 | } 70 | 71 | const styles = StyleSheet.create({ 72 | container: { 73 | flex: 1, 74 | backgroundColor: colors.transparent, 75 | justifyContent: 'center', 76 | alignItems: 'center', 77 | }, 78 | 79 | backgroundView: { 80 | flex: 1, 81 | width: '100%', 82 | backgroundColor: colors.blackBBOp, 83 | }, 84 | 85 | content: { 86 | position: 'absolute', 87 | top: (SCREEN_H - MODAL_H) / 2, 88 | width: '94%', 89 | maxWidth: 330, 90 | height: MODAL_H, 91 | paddingHorizontal: 32, 92 | paddingVertical: 20, 93 | backgroundColor: colors.dark2, 94 | }, 95 | 96 | modalNavBar: { 97 | height: 50, 98 | alignSelf: 'stretch', 99 | justifyContent: 'center', 100 | }, 101 | 102 | battery: { 103 | width: 60, 104 | height: 60, 105 | transform: [{ rotate: '-90deg' }], 106 | alignSelf: 'center', 107 | }, 108 | 109 | headerText: { 110 | fontSize: 19, 111 | fontFamily: 'IBMPlexMono-Medium', 112 | color: colors.white, 113 | marginVertical: 16, 114 | }, 115 | 116 | messageText: { 117 | fontSize: 13, 118 | lineHeight: 24, 119 | fontFamily: 'IBMPlexMono', 120 | color: colors.subText, 121 | textAlign: 'justify', 122 | }, 123 | 124 | btnsCont: { 125 | flexDirection: 'row', 126 | justifyContent: 'space-around', 127 | alignItems: 'center', 128 | marginTop: 32, 129 | }, 130 | 131 | btn: { 132 | borderColor: colors.white, 133 | borderWidth: 1, 134 | paddingHorizontal: 16, 135 | width: 110, 136 | height: 40, 137 | borderRadius: 4, 138 | alignItems: 'center', 139 | justifyContent: 'center', 140 | }, 141 | 142 | btnText: { 143 | color: colors.white, 144 | fontSize: 15, 145 | fontFamily: 'IBMPlexMono-Medium', 146 | }, 147 | }); 148 | -------------------------------------------------------------------------------- /src/modules/OnBoarding/components/Ethos.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, Text, StyleSheet, Linking } from 'react-native'; 4 | import { Logger } from 'react-native-logger'; 5 | 6 | import { colors, images, ImageButton } from '../../../common/ui'; 7 | 8 | type Props = { 9 | style: ?Object, 10 | }; 11 | 12 | export default class Ethos extends React.Component { 13 | static defaultProps = { 14 | style: null, 15 | }; 16 | 17 | onLinkPress = async () => { 18 | try { 19 | await Linking.openURL('www.iamintrovert.co'); 20 | } catch (err) { 21 | Logger.error(err); 22 | } 23 | } 24 | 25 | render() { 26 | return ( 27 | 28 | Ethos 29 | 30 | Attention, the ability to pay it and where it is directed, is the most 31 | valuable tool, the most accurate compass in navigating through 32 | reality. 33 | 34 | 35 | 36 | Ultimately it will dictate whether one feels in charge of ones´ 37 | reality or helplessly drowned in a ceaseless stream of noise. 38 | 39 | 40 | 41 | Are you still paying attention? You can turn off the noise. 42 | 43 | 44 | 45 | 50 | 51 | 55 | www.iamintrovert.co 56 | 57 | 58 | 59 | ); 60 | } 61 | } 62 | 63 | const styles = StyleSheet.create({ 64 | container: { 65 | width: '100%', 66 | paddingHorizontal: 32, 67 | paddingBottom: 24, 68 | }, 69 | 70 | titleText: { 71 | color: colors.white, 72 | fontSize: 20, 73 | fontFamily: 'IBMPlexMono-Medium', 74 | marginBottom: 16, 75 | }, 76 | 77 | messageText: { 78 | color: colors.subText, 79 | fontFamily: 'IBMPlexMono', 80 | fontSize: 13, 81 | lineHeight: 22, 82 | marginBottom: 16, 83 | }, 84 | 85 | linkCont: { 86 | flexDirection: 'row', 87 | alignItems: 'center', 88 | marginTop: 16, 89 | }, 90 | 91 | linkIcon: { 92 | width: 25, 93 | height: 25, 94 | }, 95 | 96 | linkText: { 97 | color: colors.subText, 98 | fontFamily: 'IBMPlexMono', 99 | fontSize: 13, 100 | marginLeft: 8, 101 | }, 102 | }); 103 | -------------------------------------------------------------------------------- /src/modules/OnBoarding/components/PageIndicator.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, StyleSheet } from 'react-native'; 4 | import _ from 'lodash'; 5 | 6 | import PageIndicatorItem from './PageIndicatorItem'; 7 | 8 | const PAGES_COUNT = 4; 9 | 10 | type Props = { 11 | style?: Object, 12 | selectedIdx?: number, 13 | }; 14 | 15 | export default function PageIndicator(props: Props) { 16 | return ( 17 | 18 | {_.range(PAGES_COUNT).map(i => ( 19 | 23 | ))} 24 | 25 | ); 26 | } 27 | 28 | PageIndicator.defaultProps = { 29 | style: null, 30 | selectedIdx: 0, 31 | }; 32 | 33 | const styles = StyleSheet.create({ 34 | container: { 35 | flexDirection: 'row', 36 | width: '100%', 37 | height: 10, 38 | alignItems: 'center', 39 | justifyContent: 'space-between', 40 | }, 41 | }); 42 | -------------------------------------------------------------------------------- /src/modules/OnBoarding/components/PageIndicatorItem.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Animated, Easing, StyleSheet } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | 7 | type Props = { 8 | style: ?Object, 9 | selected: boolean, 10 | }; 11 | 12 | type State = { 13 | animValue: Animated.Value, 14 | }; 15 | 16 | export default class PageIndicatorItem extends React.Component { 17 | static defaultProps = { 18 | style: null, 19 | }; 20 | 21 | state = { 22 | animValue: new Animated.Value(0), 23 | }; 24 | 25 | componentDidMount() { 26 | this.animateItem(); 27 | } 28 | 29 | componentDidUpdate() { 30 | this.animateItem(); 31 | } 32 | 33 | animateItem() { 34 | Animated.timing(this.state.animValue, { 35 | toValue: this.props.selected ? 1 : 0, 36 | duration: 250, 37 | easing: Easing.linear, 38 | }).start(); 39 | } 40 | 41 | render() { 42 | const { style } = this.props; 43 | 44 | const backgroundColor = this.state.animValue.interpolate({ 45 | inputRange: [0, 1], 46 | outputRange: [colors.gray1, colors.white], 47 | extrapolate: 'clamp', 48 | }); 49 | 50 | return ( 51 | 58 | ); 59 | } 60 | } 61 | 62 | const styles = StyleSheet.create({ 63 | pageIndicator: { 64 | width: '19%', 65 | height: 1, 66 | backgroundColor: colors.gray1, 67 | }, 68 | }); 69 | -------------------------------------------------------------------------------- /src/modules/SavedGallery/components/GridPicturesList.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { StyleSheet, SectionList, Text } from 'react-native'; 4 | 5 | import { colors } from '../../../common/ui'; 6 | import ScrollGridCell from './ScrollGridCell'; 7 | 8 | type Props = { 9 | style: ?Object, 10 | filesInfo: Array, 11 | onImagePress: (fileName: string) => void, 12 | }; 13 | 14 | export default class GridPicturesList extends Component { 15 | static defaultProps = { 16 | style: null, 17 | }; 18 | 19 | shouldComponentUpdate(newProps: Props) { 20 | return newProps.filesInfo !== this.props.filesInfo; 21 | } 22 | 23 | renderSectionHeader = ({ section }: { section: { title: string }}) => ( 24 | 25 | {section.title} 26 | 27 | ); 28 | 29 | // eslint-disable-next-line react/no-unused-prop-types 30 | renderItem = ({ item }: { item: Array }) => ( 31 | 35 | ); 36 | 37 | render() { 38 | const { filesInfo, style } = this.props; 39 | 40 | return ( 41 | 46 | `${file.name}${Math.random() * 100000}`} 47 | renderSectionHeader={this.renderSectionHeader} 48 | sections={filesInfo} 49 | /> 50 | ); 51 | } 52 | } 53 | 54 | const styles = StyleSheet.create({ 55 | container: { 56 | flex: 1, 57 | alignSelf: 'stretch', 58 | backgroundColor: colors.black, 59 | }, 60 | 61 | listContent: { 62 | paddingVertical: 16, 63 | paddingHorizontal: 8, 64 | }, 65 | 66 | sectionTitle: { 67 | color: colors.white, 68 | backgroundColor: colors.black, 69 | fontSize: 19, 70 | fontFamily: 'IBMPlexMono-Medium', 71 | paddingVertical: 8, 72 | paddingHorizontal: 16, 73 | }, 74 | }); 75 | -------------------------------------------------------------------------------- /src/modules/SavedGallery/components/HorizontalPicturesList.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { 4 | View, Text, Image, StyleSheet, ScrollView, TouchableOpacity, Dimensions, 5 | } from 'react-native'; 6 | import moment from 'moment'; 7 | 8 | import { colors } from '../../../common/ui'; 9 | 10 | const ITEM_PADDING = 32; 11 | const itemWidth = Dimensions.get('window').width; 12 | 13 | type Props = { 14 | style: ?Object, 15 | filesInfo: Array, 16 | onImagePress: (name: string) => void, 17 | onSelectedImageChanges: (name: string) => void, 18 | initSelectedName: string, 19 | }; 20 | 21 | type State = { 22 | selectedName: string, 23 | }; 24 | 25 | export default class HorizontalPicturesList extends Component { 26 | static defaultProps = { 27 | style: null, 28 | }; 29 | 30 | static getDerivedStateFromProps(newProps: Props, prevState: State) { 31 | if (newProps.filesInfo.length > 0 && prevState.selectedName === '') { 32 | return { 33 | selectedName: newProps.filesInfo[0].name, 34 | }; 35 | } 36 | 37 | return null; 38 | } 39 | 40 | $scrollView: ScrollView; 41 | 42 | constructor(props: Props) { 43 | super(props); 44 | 45 | this.state = { 46 | selectedName: props.initSelectedName, 47 | }; 48 | } 49 | 50 | componentDidMount() { 51 | setTimeout(() => { 52 | if (this.$scrollView) { 53 | const { filesInfo } = this.props; 54 | const { selectedName } = this.state; 55 | const selectedIdx = filesInfo.findIndex(f => f.name === selectedName); 56 | 57 | this.$scrollView.scrollTo({ 58 | y: 0, 59 | x: selectedIdx > 0 ? selectedIdx * itemWidth : 0, 60 | animated: true, 61 | }); 62 | } 63 | }, 10); 64 | } 65 | 66 | shouldComponentUpdate(newProps: Props) { 67 | return newProps.filesInfo !== this.props.filesInfo; 68 | } 69 | 70 | onImagePress(selectedName: string) { 71 | this.setState({ selectedName }); 72 | 73 | const { onImagePress } = this.props; 74 | if (onImagePress) { 75 | onImagePress(selectedName); 76 | } 77 | } 78 | 79 | onMomentumScrollEnd = (e: OnScrollEvent) => { 80 | const { contentOffset } = e.nativeEvent; 81 | const { filesInfo, onSelectedImageChanges } = this.props; 82 | 83 | const idx = Math.floor(Math.abs(contentOffset.x / itemWidth)); 84 | const selectedName = filesInfo[idx] ? filesInfo[idx].name : ''; 85 | if (onSelectedImageChanges) { 86 | onSelectedImageChanges(selectedName); 87 | } 88 | 89 | this.setState({ selectedName }); 90 | }; 91 | 92 | render() { 93 | const { filesInfo, style } = this.props; 94 | 95 | return ( 96 | 97 | this.$scrollView = r} 103 | onMomentumScrollEnd={this.onMomentumScrollEnd} 104 | > 105 | {filesInfo.map(imageInfo => ( 106 | 110 | this.onImagePress(imageInfo.name)} 113 | activeOpacity={1} 114 | > 115 | 119 | 120 | 121 | {moment(imageInfo.date).format('DD.MM.YYYY')} 122 | 123 | 124 | ))} 125 | 126 | 127 | ); 128 | } 129 | } 130 | 131 | const styles = StyleSheet.create({ 132 | container: { 133 | flex: 1, 134 | backgroundColor: colors.black, 135 | }, 136 | 137 | itemCont: { 138 | width: itemWidth, 139 | alignItems: 'center', 140 | justifyContent: 'center', 141 | }, 142 | 143 | itemImageCont: { 144 | width: itemWidth - ITEM_PADDING, 145 | alignItems: 'center', 146 | justifyContent: 'center', 147 | marginBottom: 40, 148 | }, 149 | 150 | itemImage: { 151 | width: itemWidth - ITEM_PADDING, 152 | height: itemWidth - ITEM_PADDING, 153 | }, 154 | 155 | infoText: { 156 | color: colors.white, 157 | fontSize: 14, 158 | fontFamily: 'IBMPlexMono', 159 | textAlign: 'center', 160 | marginBottom: 4, 161 | }, 162 | }); 163 | -------------------------------------------------------------------------------- /src/modules/SavedGallery/components/ScrollGridCell.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { FlatList, TouchableOpacity, Image, StyleSheet } from 'react-native'; 4 | 5 | const COLUMN_NUM = 3; 6 | const COLUMN_MIN_W = 105; 7 | 8 | type Props = { 9 | style: ?Object, 10 | filesInfo: Array, 11 | onImagePress: (name: string) => void, 12 | }; 13 | 14 | type State = { 15 | itemWidth: number, 16 | layoutDone: boolean, 17 | }; 18 | 19 | export default class ScrollGridCell extends React.Component { 20 | static defaultProps = { 21 | style: null, 22 | }; 23 | 24 | state = { 25 | itemWidth: COLUMN_MIN_W, 26 | layoutDone: false, 27 | }; 28 | 29 | shouldComponentUpdate(newProps: Props, newState: State) { 30 | return newProps.filesInfo !== this.props.filesInfo 31 | || newState.itemWidth !== this.state.itemWidth; 32 | } 33 | 34 | onImagePress(selectedName: string) { 35 | const { onImagePress } = this.props; 36 | if (onImagePress) { 37 | onImagePress(selectedName); 38 | } 39 | } 40 | 41 | onListLayout = ({ nativeEvent }: OnLayoutEvent) => { 42 | this.setState({ 43 | itemWidth: Math.floor(nativeEvent.layout.width / COLUMN_NUM), 44 | layoutDone: true, 45 | }); 46 | } 47 | 48 | // eslint-disable-next-line react/no-unused-prop-types 49 | renderItem = ({ item }: { item: FileInfo }) => { 50 | const { itemWidth, layoutDone } = this.state; 51 | const imageWidth = itemWidth * 0.75; 52 | 53 | return ( 54 | this.onImagePress(item.name)} 65 | > 66 | {layoutDone && ( 67 | 75 | )} 76 | 77 | ); 78 | } 79 | 80 | render() { 81 | const { filesInfo, style } = this.props; 82 | 83 | return ( 84 | `${item.name}${Math.random() * 1000000}`} 89 | renderItem={this.renderItem} 90 | numColumns={COLUMN_NUM} 91 | onLayout={this.onListLayout} 92 | /> 93 | ); 94 | } 95 | } 96 | 97 | const styles = StyleSheet.create({ 98 | container: { 99 | width: '100%', 100 | marginTop: 4, 101 | marginBottom: 16, 102 | }, 103 | 104 | itemCont: { 105 | alignItems: 'center', 106 | justifyContent: 'center', 107 | marginBottom: 8, 108 | }, 109 | }); 110 | -------------------------------------------------------------------------------- /src/modules/SavedGallery/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { View, StyleSheet, LayoutAnimation, CameraRoll } from 'react-native'; 4 | import { connect } from 'react-redux'; 5 | import { bindActionCreators } from 'redux'; 6 | import { logger } from 'react-native-logger'; 7 | 8 | import { colors, images, ImageButton } from '../../common/ui'; 9 | import GridPicturesList from './components/GridPicturesList'; 10 | import HorizontalPicturesList from './components/HorizontalPicturesList'; 11 | 12 | import { GalleryActions } from '../../actions'; 13 | import groupByDateImages from '../../reducers/gallery/selectors'; 14 | 15 | type Props = { 16 | filesInfo: Array, 17 | groupFilesInfo: Array, 18 | loadAllImages: () => void, 19 | deleteImage: (fileName: string) => void, 20 | navigation: NavigationScreenProp<*>, 21 | }; 22 | 23 | type State = { 24 | selectedName: string, 25 | gridMode: boolean, 26 | }; 27 | 28 | const mapStateToProps = state => ({ 29 | filesInfo: state.gallery.filesInfo, 30 | groupFilesInfo: groupByDateImages(state), 31 | }); 32 | 33 | const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators( 34 | GalleryActions, 35 | dispatch 36 | ); 37 | 38 | @connect(mapStateToProps, mapDispatchToProps) 39 | export default class SavedGalleryScreen extends React.Component { 40 | state = { 41 | selectedName: '', 42 | gridMode: true, 43 | }; 44 | 45 | componentDidMount() { 46 | this.props.loadAllImages(); 47 | } 48 | 49 | onImagePress = (selectedName: string) => { 50 | LayoutAnimation.linear(); 51 | this.setState({ 52 | selectedName, 53 | gridMode: !this.state.gridMode, 54 | }); 55 | } 56 | 57 | onSelectedImageChanges = (selectedName: string) => { 58 | this.setState({ selectedName }); 59 | } 60 | 61 | onDeleteImage = () => { 62 | const { filesInfo } = this.props; 63 | const { selectedName } = this.state; 64 | 65 | if (selectedName !== '') { 66 | const selectedIdx = filesInfo 67 | .findIndex(file => file.name === selectedName); 68 | if (selectedIdx !== -1 && filesInfo.length > 1) { 69 | const nextIdx = selectedIdx === (filesInfo.length - 1) 70 | ? selectedIdx - 1 : selectedIdx + 1; 71 | this.setState({ selectedName: filesInfo[nextIdx].name }); 72 | } else { 73 | this.setState({ selectedName: '' }); 74 | } 75 | 76 | this.props.deleteImage(selectedName); 77 | } 78 | } 79 | 80 | onExportToGallery = async () => { 81 | const { selectedName } = this.state; 82 | 83 | if (selectedName === '') return; 84 | 85 | try { 86 | await CameraRoll.saveToCameraRoll(`file://${selectedName}`, 'photo'); 87 | } catch (err) { 88 | logger.log(err); 89 | } 90 | } 91 | 92 | render() { 93 | const { navigation } = this.props; 94 | const { gridMode, selectedName } = this.state; 95 | 96 | const itemAction = gridMode 97 | ? () => navigation.navigate('DownloadPostersScreen') 98 | : this.onExportToGallery; 99 | 100 | return ( 101 | 102 | 103 | this.props.navigation.goBack()} 105 | source={images.closeIcon} 106 | /> 107 | 108 | 109 | {!gridMode && ( 110 | 116 | )} 117 | 118 | 123 | 124 | 125 | 126 | {gridMode ? ( 127 | 131 | ) : ( 132 | 138 | )} 139 | 140 | ); 141 | } 142 | } 143 | 144 | const styles = StyleSheet.create({ 145 | container: { 146 | flex: 1, 147 | alignItems: 'center', 148 | backgroundColor: colors.black, 149 | paddingTop: 24, 150 | }, 151 | 152 | navBar: { 153 | height: 50, 154 | flexDirection: 'row', 155 | paddingHorizontal: 24, 156 | justifyContent: 'space-between', 157 | alignItems: 'center', 158 | alignSelf: 'stretch', 159 | }, 160 | 161 | trashIcon: { 162 | marginRight: 30, 163 | }, 164 | 165 | rightNavItemsCont: { 166 | flexDirection: 'row', 167 | }, 168 | }); 169 | -------------------------------------------------------------------------------- /src/reducers/duration.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { DurationActionTypes } from '../constants'; 3 | 4 | type State = { 5 | duration: number; 6 | }; 7 | 8 | const initialState = { 9 | duration: 0, 10 | }; 11 | 12 | export default function duration( 13 | state: State = initialState, 14 | action: ReduxAction 15 | ): State { 16 | switch (action.type) { 17 | case DurationActionTypes.SET_DURATION: 18 | return { 19 | ...state, 20 | duration: action.payload, 21 | }; 22 | 23 | default: 24 | return state; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/reducers/gallery/__tests__/gallery.selectors.tests.js: -------------------------------------------------------------------------------- 1 | import getGroupedByDateImages from '../selectors'; 2 | 3 | describe(('Gallery selectors tests suits'), () => { 4 | describe('filesInfo grouped by date selectors', () => { 5 | const testObject1 = { 6 | filesInfo: [ 7 | { date: '2017-11-24T16:09:18.664Z' }, 8 | { date: '2017-11-24T16:09:18.664Z' }, 9 | { date: '2017-11-24T16:09:18.664Z' }, 10 | { date: '2017-10-24T16:09:18.664Z' }, 11 | { date: '2018-09-24T16:09:18.664Z' }, 12 | { date: '2018-09-24T16:09:18.664Z' }, 13 | { date: '2018-08-24T16:09:18.664Z' }, 14 | { date: '2018-08-24T16:09:18.664Z' }, 15 | { date: '2019-04-24T16:09:18.664Z' }, 16 | { date: '2019-04-24T16:09:18.664Z' }, 17 | { date: '2019-01-24T16:09:18.664Z' }, 18 | { date: '2019-03-24T16:09:18.664Z' }, 19 | ], 20 | }; 21 | 22 | const testResults = { 23 | October: [{ date: '2017-10-24T16:09:18.664Z' }], 24 | November: [ 25 | { date: '2017-11-24T16:09:18.664Z' }, 26 | { date: '2017-11-24T16:09:18.664Z' }, 27 | { date: '2017-11-24T16:09:18.664Z' }, 28 | ], 29 | August: [ 30 | { date: '2018-08-24T16:09:18.664Z' }, 31 | { date: '2018-08-24T16:09:18.664Z' }, 32 | ], 33 | September: [ 34 | { date: '2018-09-24T16:09:18.664Z' }, 35 | { date: '2018-09-24T16:09:18.664Z' }, 36 | ], 37 | January: [{ date: '2019-01-24T16:09:18.664Z' }], 38 | March: [{ date: '2019-03-24T16:09:18.664Z' }], 39 | April: [ 40 | { date: '2019-04-24T16:09:18.664Z' }, 41 | { date: '2019-04-24T16:09:18.664Z' }, 42 | ], 43 | }; 44 | 45 | it('getGroupedByDateImages should return properly formed sections', () => { 46 | const results = getGroupedByDateImages(testObject1); 47 | 48 | expect(results).toBeTruthy(); 49 | expect(results).toEqual(testResults); 50 | }); 51 | }); 52 | }); 53 | -------------------------------------------------------------------------------- /src/reducers/gallery/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import moment from 'moment'; 3 | 4 | import { GalleryActionTypes } from '../../constants'; 5 | 6 | type State = { 7 | filesInfo: Array, 8 | isMakingPoster: boolean, 9 | }; 10 | 11 | const initialState = { 12 | filesInfo: [], 13 | isMakingPoster: false, 14 | }; 15 | 16 | export default function duration( 17 | state: State = initialState, 18 | action: ReduxAction 19 | ): State { 20 | switch (action.type) { 21 | case GalleryActionTypes.LOAD_SAVED_IMAGES: 22 | return { 23 | ...state, 24 | filesInfo: action.payload.sort((f1: FileInfo, f2: FileInfo) => { 25 | if (moment(f1.date).isSame(f2.date)) return 0; 26 | if (moment(f1.date).isBefore(f2.date)) return 1; 27 | 28 | return -1; 29 | }), 30 | }; 31 | 32 | case GalleryActionTypes.DELETE_IMAGE: 33 | return { 34 | ...state, 35 | filesInfo: state.filesInfo.filter(i => i.name !== action.payload), 36 | }; 37 | 38 | case GalleryActionTypes.TOGGLE_MAKING_POSTER: 39 | return { 40 | ...state, 41 | isMakingPoster: !state.isMakingPoster, 42 | }; 43 | 44 | default: 45 | return state; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/reducers/gallery/selectors/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { createSelector } from 'reselect'; 3 | import _ from 'lodash'; 4 | import moment from 'moment'; 5 | 6 | const getFilesInfo = state => state.gallery.filesInfo; 7 | 8 | export default createSelector( 9 | [getFilesInfo], 10 | filesInfo => _.transform( 11 | _.groupBy(filesInfo, file => moment(file.date).format('YYYY MMMM')), 12 | (result, data, key) => result.push({ 13 | title: key.slice(5), 14 | data: [data], 15 | }), 16 | [] 17 | ) 18 | ); 19 | -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import duration from './duration'; 2 | import gallery from './gallery'; 3 | import settings from './settings'; 4 | 5 | export default { 6 | duration, 7 | gallery, 8 | settings, 9 | }; 10 | -------------------------------------------------------------------------------- /src/reducers/settings.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { SettingsActionTypes } from '../constants'; 3 | 4 | type State = { 5 | soundOn: boolean, 6 | }; 7 | 8 | const initialState = { 9 | soundOn: true, 10 | }; 11 | 12 | export default function duration( 13 | state: State = initialState, 14 | action: SettingsAction 15 | ): State { 16 | switch (action.type) { 17 | case SettingsActionTypes.SET_SOUND_STATE: 18 | return { 19 | ...state, 20 | soundOn: action.soundOn, 21 | }; 22 | 23 | case SettingsActionTypes.LOAD_ALL_SETTINGS: 24 | return { 25 | ...state, 26 | settings: { 27 | ...action.settings, 28 | }, 29 | }; 30 | 31 | default: 32 | return state; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/web-test/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /src/web-test/css/bootstrap-reboot.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../scss/_normalize.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"4EAYA,KACE,YAAA,WACA,YAAA,KACA,qBAAA,KACA,yBAAA,KAUF,KACE,OAAA,EAOF,QAAA,MAAA,OAAA,OAAA,IAAA,QAME,QAAA,MAQF,GACE,UAAA,IACA,OAAA,MAAA,EAWF,WAAA,OAAA,KAGE,QAAA,MAOF,OACE,OAAA,IAAA,KAQF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAQF,IACE,YAAA,UAAA,UACA,UAAA,IAWF,EACE,iBAAA,YACA,6BAAA,QAQF,SAAA,QAEE,cAAA,EAQF,YACE,cAAA,KACA,gBAAA,UACA,gBAAA,UAAA,OAOF,EAAA,OAEE,YAAA,QAOF,EAAA,OAEE,YAAA,OAQF,KAAA,IAAA,KAGE,YAAA,UAAA,UACA,UAAA,IAOF,IACE,WAAA,OAOF,KACE,iBAAA,KACA,MAAA,KAOF,MACE,UAAA,IAQF,IAAA,IAEE,UAAA,IACA,YAAA,EACA,SAAA,SACA,eAAA,SAGF,IACE,OAAA,OAGF,IACE,IAAA,MAUF,MAAA,MAEE,QAAA,aAOF,sBACE,QAAA,KACA,OAAA,EAOF,IACE,aAAA,KAOF,eACE,SAAA,OAWF,OAAA,MAAA,SAAA,OAAA,SAKE,YAAA,WACA,UAAA,KACA,YAAA,KACA,OAAA,EAQF,OAAA,MAEE,SAAA,QAQF,OAAA,OAEE,eAAA,KASF,aAAA,cAAA,OAAA,mBAIE,mBAAA,OAOF,gCAAA,+BAAA,gCAAA,yBAIE,aAAA,KACA,QAAA,EAOF,6BAAA,4BAAA,6BAAA,sBAIE,QAAA,IAAA,OAAA,WAOF,SACE,OAAA,IAAA,MAAA,OACA,OAAA,EAAA,IACA,QAAA,MAAA,OAAA,MAUF,OACE,mBAAA,WAAA,WAAA,WACA,MAAA,QACA,QAAA,MACA,UAAA,KACA,QAAA,EACA,YAAA,OAQF,SACE,QAAA,aACA,eAAA,SAOF,SACE,SAAA,KCrKF,gBAAA,aD+KE,mBAAA,WAAA,WAAA,WACA,QAAA,EC1KF,yCAAA,yCDmLE,OAAA,KC9KF,cDuLE,mBAAA,UACA,eAAA,KCnLF,4CAAA,yCD4LE,mBAAA,KAQF,6BACE,mBAAA,OACA,KAAA,QAWF,QAAA,KAEE,QAAA,MAOF,QACE,QAAA,UAUF,OACE,QAAA,aAOF,SACE,QAAA,KCnNF,SD8NE,QAAA,KEtbF,KACE,mBAAA,WAAA,WAAA,WAGF,EAAA,QAAA,SAGE,mBAAA,QAAA,WAAA,QAoBA,cAAgB,MAAA,aAQlB,KAYE,mBAAA,UAGA,4BAAA,YAGF,KACE,YAAA,cAAA,UAAA,mBAAA,WAAA,OC2K4H,iBD3K5H,MAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IAEA,MAAA,QAEA,iBAAA,KD2LF,sBClLE,QAAA,YAYF,GAAI,GAAI,GAAI,GAAI,GAAI,GAClB,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KAIF,0BAAA,YAGE,OAAA,KAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QAGF,GAAA,GAAA,GAGE,WAAA,EACA,cAAA,KAGF,MAAA,MAAA,MAAA,MAIE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAQF,EACE,MAAA,QACA,gBAAA,KEhJE,QAAA,QFmJA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KEhKE,oCAAA,oCFmKA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EASJ,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAGE,OAAA,EAAA,EAAA,KAQF,IAGE,eAAA,ODsIF,cCzHE,OAAA,QAcF,cAAA,EAAA,KAAA,OAAA,MAAA,MAAA,OAAA,QAAA,SASE,iBAAA,aAAA,aAAA,aAQF,MAEE,gBAAA,SAEA,iBAAA,YAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBAGF,OAAA,MAAA,OAAA,SAME,YAAA,QAGF,8BAAA,2BAMI,OAAA,YAKJ,iBAAA,iBAAA,2BAAA,kBASE,mBAAA,QAGF,SAEE,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAGF,OAEE,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QAGF,mBAKE,mBAAA,KAIF,OACE,QAAA,aDsEF,SC9DE,QAAA"} -------------------------------------------------------------------------------- /src/web-test/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | height: 100vh; 3 | } 4 | 5 | .diagram-block { 6 | background-color: #000; 7 | height: 100%; 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | } 12 | 13 | .settings-block { 14 | background-color: #55A5BF; 15 | height: 100%; 16 | padding-top: 50px; 17 | } 18 | 19 | .apply-btn { 20 | margin-top: 20; 21 | } 22 | 23 | .apply-btn:active { 24 | opacity: 0.5; 25 | transform: scale(0.95); 26 | } 27 | -------------------------------------------------------------------------------- /src/web-test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | 22 |
23 | 24 |
25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 | 41 |
42 | 43 |
44 | 45 |
46 |
47 | 48 |
49 | 50 |
51 | 52 |
53 |
54 | 55 |
56 | 57 |
58 | 59 |
60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 |
68 | 69 |
70 | 71 |
72 | 73 |
74 |
75 | 76 |
77 | 78 |
79 |
80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | --------------------------------------------------------------------------------