├── .watchmanconfig
├── .eslintignore
├── .prettierignore
├── .gitattributes
├── src
├── core
│ ├── infrastructure
│ │ ├── navigation
│ │ │ ├── index.js
│ │ │ └── navigator.js
│ │ ├── api
│ │ │ ├── apiClient.js
│ │ │ ├── server.js
│ │ │ └── __tests__
│ │ │ │ ├── __fixtures__
│ │ │ │ └── usersFixture.json
│ │ │ │ └── apiClient.spec.js
│ │ ├── domain
│ │ │ └── model
│ │ │ │ └── User
│ │ │ │ ├── ApiUserRepository.ts
│ │ │ │ └── __tests__
│ │ │ │ └── ApiUserRepository.spec.ts
│ │ ├── locale
│ │ │ └── i18n.js
│ │ └── __mocks__
│ │ │ └── mockReactNativeLocalize.js
│ ├── services
│ │ └── User
│ │ │ ├── index.js
│ │ │ └── GetAllUsers.js
│ └── domain
│ │ └── model
│ │ └── User
│ │ ├── UserRepository.js
│ │ ├── __builders__
│ │ └── UserBuilder.js
│ │ └── User.js
└── ui
│ ├── screens
│ ├── _components
│ │ ├── Header
│ │ │ ├── index.js
│ │ │ └── Header.js
│ │ └── ConnectComponent.js
│ ├── Users
│ │ ├── index.js
│ │ ├── Users.presenter.js
│ │ ├── Users.view.js
│ │ ├── __tests__
│ │ │ └── Users.ispec.js
│ │ └── Users.js
│ ├── routes.ts
│ ├── _context
│ │ ├── LocaleContext.js
│ │ └── LocaleProvider.js
│ ├── App.js
│ ├── __tests__
│ │ └── utils.js
│ └── Root.js
│ ├── theme
│ ├── color.js
│ ├── index.js
│ ├── fonts
│ │ └── ProximaNova-Regular.otf
│ ├── size.js
│ └── mixins
│ │ └── font.js
│ └── components
│ └── _base
│ ├── StyleSheet.js
│ ├── index.js
│ └── Text.js
├── app.json
├── locales
└── es
│ ├── general.json
│ ├── index.js
│ └── screens.json
├── android
├── app
│ ├── debug.keystore
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── values
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ └── mipmap-xxxhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ └── ic_launcher_round.png
│ │ │ ├── assets
│ │ │ │ └── fonts
│ │ │ │ │ └── ProximaNova-Regular.otf
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── reactnativestarterkit
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ └── MainApplication.java
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── androidTest
│ │ │ └── java
│ │ │ └── com
│ │ │ └── reactnativestarterkit
│ │ │ └── DetoxTest.java
│ ├── proguard-rules.pro
│ ├── build_defs.bzl
│ ├── BUCK
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── settings.gradle
├── gradle.properties
├── build.gradle
├── gradlew.bat
└── gradlew
├── .lintstagedrc
├── ios
├── ReactNativeStarterKit
│ ├── Images.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── AppDelegate.h
│ ├── main.m
│ ├── AppDelegate.m
│ ├── Info.plist
│ └── Base.lproj
│ │ └── LaunchScreen.xib
├── ReactNativeStarterKit.xcworkspace
│ └── contents.xcworkspacedata
├── ReactNativeStarterKit-tvOSTests
│ └── Info.plist
├── ReactNativeStarterKit-tvOS
│ └── Info.plist
├── Podfile
├── ReactNativeStarterKit.xcodeproj
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ ├── ReactNativeStarterKit.xcscheme
│ │ │ └── ReactNativeStarterKit-tvOS.xcscheme
│ └── project.pbxproj
└── Podfile.lock
├── .buckconfig
├── react-native.config.js
├── .huskyrc
├── e2e
├── config.json
├── Users.spec.js
└── init.js
├── index.js
├── setupJestUnit.js
├── .prettierrc.js
├── jest.config.unit.js
├── .editorconfig
├── jest.config.integration.js
├── metro.config.js
├── fakeapi
├── package.json
├── responses
│ └── users.json
└── index.js
├── .babelrc
├── .eslintrc.js
├── tsconfig.json
├── setupJestIntegration.js
├── jest.config.js
├── .gitignore
├── .flowconfig
└── package.json
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.json
2 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | *.json
2 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.pbxproj -text
2 |
--------------------------------------------------------------------------------
/src/core/infrastructure/navigation/index.js:
--------------------------------------------------------------------------------
1 | export * from './navigator'
2 |
--------------------------------------------------------------------------------
/src/ui/screens/_components/Header/index.js:
--------------------------------------------------------------------------------
1 | export { Header } from './Header'
2 |
--------------------------------------------------------------------------------
/src/ui/theme/color.js:
--------------------------------------------------------------------------------
1 | export const color = {
2 | brand: '#61942E',
3 | black: '#111'
4 | }
5 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ReactNativeStarterKit",
3 | "displayName": "ReactNativeStarterKit"
4 | }
--------------------------------------------------------------------------------
/locales/es/general.json:
--------------------------------------------------------------------------------
1 | {
2 | "error": "Ha ocurrido un error. Por favor, vuelve a intentarlo."
3 | }
4 |
--------------------------------------------------------------------------------
/src/ui/theme/index.js:
--------------------------------------------------------------------------------
1 | export * from './color'
2 | export * from './size'
3 | export * from './mixins/font'
4 |
--------------------------------------------------------------------------------
/android/app/debug.keystore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/debug.keystore
--------------------------------------------------------------------------------
/.lintstagedrc:
--------------------------------------------------------------------------------
1 | {
2 | "src/**/*.{ts,tsx,js,jsx}": [
3 | "prettier --write",
4 | "eslint --fix",
5 | "git add"
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ReactNativeStarterKit
3 |
4 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/Images.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/src/core/services/User/index.js:
--------------------------------------------------------------------------------
1 | import { GetAllUsers } from './GetAllUsers'
2 |
3 | export const UserService = {
4 | all: GetAllUsers
5 | }
6 |
--------------------------------------------------------------------------------
/.buckconfig:
--------------------------------------------------------------------------------
1 |
2 | [android]
3 | target = Google Inc.:Google APIs:23
4 |
5 | [maven_repositories]
6 | central = https://repo1.maven.org/maven2
7 |
--------------------------------------------------------------------------------
/react-native.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | project: {
3 | ios: {},
4 | android: {}
5 | },
6 | assets: ['./src/ui/theme/fonts']
7 | }
8 |
--------------------------------------------------------------------------------
/src/ui/theme/fonts/ProximaNova-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/src/ui/theme/fonts/ProximaNova-Regular.otf
--------------------------------------------------------------------------------
/.huskyrc:
--------------------------------------------------------------------------------
1 | {
2 | "hooks": {
3 | "pre-commit": "yarn tsc --project tsconfig.json --noEmit --skipLibCheck && lint-staged && yarn test"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/locales/es/index.js:
--------------------------------------------------------------------------------
1 | import general from './general.json'
2 | import screens from './screens.json'
3 |
4 | export const es = { ...general, ...screens }
5 |
--------------------------------------------------------------------------------
/locales/es/screens.json:
--------------------------------------------------------------------------------
1 | {
2 | "users": {
3 | "header_title": "Lista de usuarios",
4 | "title": "Usuarios",
5 | "name": "Nombre"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/src/core/services/User/GetAllUsers.js:
--------------------------------------------------------------------------------
1 | import { UserRepository } from 'domain/model/User/UserRepository'
2 |
3 | export const GetAllUsers = async () => UserRepository.all()
4 |
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/ProximaNova-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/assets/fonts/ProximaNova-Regular.otf
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/540/react-native-starter-kit/master/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/src/core/domain/model/User/UserRepository.js:
--------------------------------------------------------------------------------
1 | import { ApiUserRepository } from 'infrastructure/domain/model/User/ApiUserRepository'
2 |
3 | export const UserRepository = ApiUserRepository
4 |
--------------------------------------------------------------------------------
/e2e/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "setupFilesAfterEnv": ["./init.js"],
3 | "testEnvironment": "node",
4 | "reporters": ["detox/runners/jest/streamlineReporter"],
5 | "verbose": true
6 | }
7 |
--------------------------------------------------------------------------------
/src/core/domain/model/User/__builders__/UserBuilder.js:
--------------------------------------------------------------------------------
1 | import { User } from 'domain/model/User/User'
2 |
3 | export const aUserCollection = () => [new User(1, 'name_1'), new User(2, 'name_2')]
4 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | import { AppRegistry } from 'react-native'
2 | import { App } from 'screens/App'
3 | import { name as appName } from './app.json'
4 |
5 | AppRegistry.registerComponent(appName, () => App)
6 |
--------------------------------------------------------------------------------
/src/ui/components/_base/StyleSheet.js:
--------------------------------------------------------------------------------
1 | import StyleSheet from 'react-native-extended-stylesheet'
2 |
3 | export const remBase = 15
4 | export { StyleSheet }
5 | StyleSheet.build({
6 | $rem: remBase
7 | })
8 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'ReactNativeStarterKit'
2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
3 | include ':app'
4 |
--------------------------------------------------------------------------------
/setupJestUnit.js:
--------------------------------------------------------------------------------
1 | import { mockReactNativeLocalize } from './src/core/infrastructure/__mocks__/mockReactNativeLocalize'
2 |
3 | global.fetch = require('jest-fetch-mock')
4 |
5 | jest.mock('react-native-localize', () => mockReactNativeLocalize)
6 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/core/domain/model/User/User.js:
--------------------------------------------------------------------------------
1 | export class User {
2 | constructor(id, name) {
3 | this.id = id
4 | this.name = name
5 | }
6 |
7 | getId() {
8 | return this.id
9 | }
10 |
11 | getName() {
12 | return this.name
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | bracketSpacing: true,
3 | jsxBracketSameLine: true,
4 | singleQuote: true,
5 | trailingComma: 'none',
6 | semi: false,
7 | useTabs: false,
8 | tabWidth: 2,
9 | arrowParens: 'avoid',
10 | printWidth: 120
11 | }
12 |
--------------------------------------------------------------------------------
/jest.config.unit.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | var config = require('./jest.config')
4 | config.testRegex = '/__tests__/.*\\.spec\\.(ts|js)$'
5 | config.setupFilesAfterEnv = ['./setupJestUnit.js']
6 |
7 | console.log('RUNNING UNIT TESTS')
8 |
9 | module.exports = config
10 |
--------------------------------------------------------------------------------
/src/ui/screens/Users/index.js:
--------------------------------------------------------------------------------
1 | import { ConnectComponent } from 'screens/_components/ConnectComponent'
2 | import { UsersReactView } from './Users.view'
3 | import { UsersPresenter } from './Users.presenter'
4 |
5 | export const Users = ConnectComponent(UsersReactView, UsersPresenter)
6 |
--------------------------------------------------------------------------------
/src/ui/theme/size.js:
--------------------------------------------------------------------------------
1 | import { rem } from './mixins/font'
2 |
3 | const SMALL_GRID_SIZE = 4
4 | const BASE_GRID_SIZE = 8
5 |
6 | export const size = {
7 | base: rem(16),
8 | smallScale: factor => rem(factor * SMALL_GRID_SIZE),
9 | baseScale: factor => rem(factor * BASE_GRID_SIZE)
10 | }
11 |
--------------------------------------------------------------------------------
/src/ui/screens/routes.ts:
--------------------------------------------------------------------------------
1 | import isUndefined from 'lodash/isUndefined'
2 |
3 | export const routes = {
4 | USERS: { name: 'User' }
5 | }
6 |
7 | export const routeName = (route: { name: string }): string => {
8 | if (isUndefined(route)) {
9 | return ''
10 | }
11 |
12 | return route.name
13 | }
14 |
--------------------------------------------------------------------------------
/src/ui/screens/_context/LocaleContext.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const defaultContext = {
4 | language: undefined,
5 | translate: () => ''
6 | }
7 |
8 | export const LocaleContext = React.createContext(defaultContext)
9 |
10 | export const useTrans = () => React.useContext(LocaleContext).translate
11 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/ui/screens/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { LocaleProvider } from './_context/LocaleProvider'
3 | import { Root } from './Root'
4 |
5 | export const WithProviders = props => {props.children}
6 |
7 | export const App = () => (
8 |
9 |
10 |
11 | )
12 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | end_of_line = lf
7 | indent_size = 2
8 | indent_style = space
9 | insert_final_newline = true
10 | max_line_length = 120
11 | trim_trailing_whitespace = true
12 |
13 | [*.md]
14 | max_line_length = 0
15 | trim_trailing_whitespace = false
16 |
17 | [COMMIT_EDITMSG]
18 | max_line_length = 0
19 |
--------------------------------------------------------------------------------
/jest.config.integration.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | var config = require('./jest.config')
4 | config.testRegex = '\\.ispec\\.(ts|tsx|js)$'
5 | config.setupFilesAfterEnv = ['@testing-library/react-native/cleanup-after-each', './setupJestIntegration.js']
6 | config.preset = '@testing-library/react-native'
7 |
8 | console.log('RUNNING INTEGRATION TESTS')
9 |
10 | module.exports = config
11 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/core/infrastructure/api/apiClient.js:
--------------------------------------------------------------------------------
1 | import { server } from './server'
2 | import { Platform } from 'components/_base'
3 |
4 | const apiServer = () =>
5 | server().baseUrl(Platform.select({ ios: 'http://localhost:8080', android: 'http://10.0.2.2:8080' }))
6 |
7 | export const apiClient = {
8 | users: () =>
9 | apiServer()
10 | .url('/users')
11 | .get()
12 | }
13 |
--------------------------------------------------------------------------------
/e2e/Users.spec.js:
--------------------------------------------------------------------------------
1 | describe('Users', () => {
2 | beforeEach(async () => {
3 | await device.reloadReactNative()
4 | })
5 |
6 | it('should have two items', async () => {
7 | await expect(element(by.text('Leanne Graham'))).toBeVisible()
8 | await expect(element(by.text('Ervin Howell'))).toBeVisible()
9 | await expect(element(by.text('Clementine Bauch'))).toBeVisible()
10 | })
11 | })
12 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/fakeapi/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "fakeapi",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "start": "nodemon --watch responses ./index.js"
7 | },
8 | "dependencies": {
9 | "body-parser": "^1.18.3",
10 | "cors": "^2.8.5",
11 | "errorhandler": "^1.5.0",
12 | "express": "^4.16.4",
13 | "morgan": "^1.9.1",
14 | "nodemon": "^1.18.11",
15 | "glob": "^7.1.4"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/core/infrastructure/domain/model/User/ApiUserRepository.ts:
--------------------------------------------------------------------------------
1 | import { apiClient } from 'infrastructure/api/apiClient'
2 | import { User } from 'domain/model/User/User'
3 |
4 | const all = async (): Promise => {
5 | const usersDTO: { id: string; name: string }[] = await apiClient.users()
6 |
7 | return usersDTO.map(userDTO => new User(userDTO.id, userDTO.name))
8 | }
9 |
10 | export const ApiUserRepository = {
11 | all
12 | }
13 |
--------------------------------------------------------------------------------
/src/ui/screens/Users/Users.presenter.js:
--------------------------------------------------------------------------------
1 | import { i18n } from 'infrastructure/locale/i18n'
2 | import { UserService } from 'services/User'
3 |
4 | export class UsersPresenter {
5 | initialize = view => (this.view = view)
6 |
7 | onLifecycleStart = async () => {
8 | try {
9 | this.view.showUsers(await UserService.all())
10 | } catch (error) {
11 | this.view.showError(i18n.translate('error'))
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/ui/components/_base/index.js:
--------------------------------------------------------------------------------
1 | export { remBase, StyleSheet } from './StyleSheet'
2 | export { Text } from './Text'
3 |
4 | export {
5 | AppState,
6 | BackHandler,
7 | Button,
8 | Dimensions,
9 | Image,
10 | FlatList,
11 | Platform,
12 | SafeAreaView,
13 | SectionList,
14 | ScrollView,
15 | TextInput,
16 | TouchableNativeFeedback,
17 | TouchableHighlight,
18 | TouchableOpacity,
19 | View,
20 | WebView
21 | } from 'react-native'
22 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/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/ReactNativeStarterKit/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 |
--------------------------------------------------------------------------------
/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/main/java/com/reactnativestarterkit/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.reactnativestarterkit;
2 |
3 | import com.facebook.react.ReactActivity;
4 |
5 | public class MainActivity extends ReactActivity {
6 |
7 | /**
8 | * Returns the name of the main component registered from JavaScript.
9 | * This is used to schedule rendering of the component.
10 | */
11 | @Override
12 | protected String getMainComponentName() {
13 | return "ReactNativeStarterKit";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/ui/components/_base/Text.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Text as BaseText } from 'react-native'
3 | import { color as colorMap, mapFontSizeStyles, mapFontTypeStyles } from 'theme'
4 |
5 | export const Text = ({ type, size = 'base', color, style, children, ...props }) => {
6 | return (
7 |
11 | {children}
12 |
13 | )
14 | }
15 |
--------------------------------------------------------------------------------
/src/ui/screens/__tests__/utils.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { createAppContainer } from 'react-navigation'
3 | import { render } from '@testing-library/react-native'
4 | import { WithProviders } from 'screens/App'
5 | import { createRootNavigator } from 'screens/Root'
6 | import { routeName } from 'screens/routes'
7 |
8 | export const renderScreen = route => {
9 | const Root = createAppContainer(createRootNavigator(routeName(route)))
10 | return render(
11 |
12 |
13 |
14 | )
15 | }
16 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["module:metro-react-native-babel-preset"],
3 | "plugins": [
4 | [
5 | "module-resolver", {
6 | "root": ["./"],
7 | "alias": {
8 | "domain": "./src/core/domain",
9 | "infrastructure": "./src/core/infrastructure",
10 | "services": "./src/core/services",
11 | "screens": "./src/ui/screens",
12 | "theme": "./src/ui/theme",
13 | "components": "./src/ui/components"
14 | }
15 | },
16 | "@babel/plugin-transform-runtime"
17 | ]
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/src/ui/theme/mixins/font.js:
--------------------------------------------------------------------------------
1 | import { remBase, StyleSheet } from 'components/_base'
2 |
3 | export const rem = px => `${px / remBase}rem`
4 |
5 | const fontSizeStyles = StyleSheet.create({
6 | base: {
7 | fontSize: rem(16),
8 | lineHeight: rem(19)
9 | }
10 | })
11 |
12 | export const mapFontSizeStyles = {
13 | base: fontSizeStyles.base
14 | }
15 |
16 | const fontTypeStyles = StyleSheet.create({
17 | proximaNova: {
18 | fontFamily: 'ProximaNova-Regular'
19 | }
20 | })
21 |
22 | export const mapFontTypeStyles = {
23 | regular: fontTypeStyles.proximaNova
24 | }
25 |
--------------------------------------------------------------------------------
/src/core/infrastructure/api/server.js:
--------------------------------------------------------------------------------
1 | import wretch from 'wretch'
2 |
3 | export const server = () => {
4 | let wretchInstance = wretch()
5 | .headers({ Accept: 'application/json', 'Content-Type': 'application/json' })
6 | .resolve(resolver => resolver.json())
7 |
8 | const self = {
9 | baseUrl: baseUrl => {
10 | wretchInstance = wretchInstance.url(baseUrl, true)
11 | return self
12 | },
13 | url: (url, replace) => {
14 | wretchInstance = wretchInstance.url(url, replace)
15 | return self
16 | },
17 | get: options => {
18 | return wretchInstance.get(options)
19 | }
20 | }
21 |
22 | return self
23 | }
24 |
--------------------------------------------------------------------------------
/src/ui/screens/Users/Users.view.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Users } from './Users'
3 |
4 | export class UsersReactView extends React.Component {
5 | constructor(props) {
6 | super(props)
7 |
8 | this.presenter = props.presenter
9 | this.presenter.initialize(this)
10 |
11 | this.state = {
12 | users: [],
13 | error: undefined
14 | }
15 | }
16 |
17 | showError = error => {
18 | this.setState({ error })
19 | }
20 |
21 | showUsers = users => {
22 | this.setState({ users })
23 | }
24 |
25 | render() {
26 | const { error, users } = this.state
27 | return
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | plugins: ['import', 'jest', '@typescript-eslint'],
4 | parserOptions: {
5 | project: './tsconfig.json'
6 | },
7 | extends: [
8 | '@react-native-community',
9 | 'plugin:prettier/recommended',
10 | 'prettier/react',
11 | 'prettier/standard',
12 | 'plugin:jest/recommended',
13 | 'plugin:@typescript-eslint/recommended',
14 | 'prettier/@typescript-eslint'
15 | ],
16 | rules: {
17 | 'import/no-default-export': 2,
18 | '@typescript-eslint/camelcase': 'off',
19 | '@typescript-eslint/explicit-function-return-type': 'off'
20 | },
21 | env: {
22 | 'jest/globals': true
23 | },
24 | parser: '@typescript-eslint/parser'
25 | }
26 |
--------------------------------------------------------------------------------
/android/app/src/androidTest/java/com/reactnativestarterkit/DetoxTest.java:
--------------------------------------------------------------------------------
1 | package com.reactnativestarterkit;
2 |
3 | import com.wix.detox.Detox;
4 |
5 | import org.junit.Rule;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 |
9 | import androidx.test.ext.junit.runners.AndroidJUnit4;
10 | import androidx.test.filters.LargeTest;
11 | import androidx.test.rule.ActivityTestRule;
12 |
13 | @RunWith(AndroidJUnit4.class)
14 | @LargeTest
15 | public class DetoxTest {
16 |
17 | @Rule
18 | public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false);
19 |
20 | @Test
21 | public void runDetoxTests() {
22 | Detox.runTests(mActivityRule);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/ui/screens/_components/Header/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { StyleSheet, Text, SafeAreaView } from 'components/_base'
3 | import { color } from 'theme'
4 | import { useTrans } from 'screens/_context/LocaleContext'
5 |
6 | export const Header = ({ title }) => {
7 | const trans = useTrans()
8 |
9 | return (
10 |
11 |
12 | {trans(title)}
13 |
14 |
15 | )
16 | }
17 |
18 | const styles = StyleSheet.create({
19 | header: {
20 | height: 80,
21 | justifyContent: 'center',
22 | alignItems: 'center',
23 | backgroundColor: color.brand
24 | }
25 | })
26 |
--------------------------------------------------------------------------------
/e2e/init.js:
--------------------------------------------------------------------------------
1 | const detox = require('detox')
2 | const config = require('../package.json').detox
3 | const adapter = require('detox/runners/jest/adapter')
4 | const specReporter = require('detox/runners/jest/specReporter')
5 |
6 | // Set the default timeout
7 | jest.setTimeout(120000)
8 | jasmine.getEnv().addReporter(adapter)
9 |
10 | // This takes care of generating status logs on a per-spec basis. By default, jest only reports at file-level.
11 | // This is strictly optional.
12 | jasmine.getEnv().addReporter(specReporter)
13 |
14 | beforeAll(async () => {
15 | await detox.init(config)
16 | })
17 |
18 | beforeEach(async () => {
19 | await adapter.beforeEach()
20 | })
21 |
22 | afterAll(async () => {
23 | await adapter.afterAll()
24 | await detox.cleanup()
25 | })
26 |
--------------------------------------------------------------------------------
/src/ui/screens/Root.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { createAppContainer } from 'react-navigation'
3 | import { routes, routeName } from './routes'
4 | import { createStackNavigator } from 'react-navigation-stack'
5 | import { Users } from './Users'
6 | import { Header } from 'screens/_components/Header'
7 |
8 | export const createRootNavigator = initialRouteName =>
9 | createStackNavigator(
10 | {
11 | [routeName(routes.USERS)]: {
12 | screen: Users,
13 | navigationOptions: {
14 | header: () =>
15 | }
16 | }
17 | },
18 | {
19 | initialRouteName,
20 | headerMode: 'screen'
21 | }
22 | )
23 |
24 | export const Root = createAppContainer(createRootNavigator())
25 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/src/core/infrastructure/navigation/navigator.js:
--------------------------------------------------------------------------------
1 | import { NavigationActions, StackActions } from 'react-navigation'
2 | import { routeName, routes } from 'screens/routes'
3 |
4 | export const navigator = (() => {
5 | let navigation
6 |
7 | return {
8 | setNavigator: navigationDispatcher => {
9 | navigation = navigationDispatcher
10 | },
11 |
12 | goBack: () => navigation.dispatch(NavigationActions.back()),
13 |
14 | goToUsers: () => navigation.dispatch(resetActionTo(routes.USERS))
15 | }
16 | })()
17 |
18 | const actionTo = (route, params = {}) => NavigationActions.navigate({ routeName: routeName(route), params })
19 |
20 | const resetActionTo = (route, params = {}) =>
21 | StackActions.reset({
22 | index: 0,
23 | actions: [NavigationActions.navigate({ routeName: routeName(route), params })],
24 | key: null
25 | })
26 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit-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 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "allowJs": true,
4 | "allowSyntheticDefaultImports": true,
5 | "esModuleInterop": true,
6 | "isolatedModules": true,
7 | "jsx": "react",
8 | "lib": [
9 | "es6"
10 | ],
11 | "module": "commonjs",
12 | "noEmit": true,
13 | "strict": true,
14 | "target": "esnext",
15 | "baseUrl": "./",
16 | "paths": {
17 | "domain/*": ["./src/core/domain/*"],
18 | "infrastructure/*": ["./src/core/infrastructure/*"],
19 | "services/*": ["./src/core/services/*"],
20 | "screens/*": ["./src/ui/screens/*"],
21 | "components/*": ["./src/ui/components/*"],
22 | "theme/*": ["./src/ui/theme/*"]
23 | }
24 | },
25 | "exclude": [
26 | "node_modules",
27 | "babel.config.js",
28 | "metro.config.js",
29 | "jest.config.js",
30 | "android",
31 | "ios"
32 | ],
33 | "linterOptions": {
34 | "typeCheck": true
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/ui/screens/Users/__tests__/Users.ispec.js:
--------------------------------------------------------------------------------
1 | import { UserService } from 'services/User'
2 | import { routes } from 'screens/routes'
3 | import { renderScreen } from 'screens/__tests__/utils'
4 | import { aUserCollection } from 'domain/model/User/__builders__/UserBuilder'
5 |
6 | describe('Users', () => {
7 | afterEach(() => {
8 | jest.resetAllMocks()
9 | })
10 |
11 | it('shows an error message', async () => {
12 | jest.spyOn(UserService, 'all').mockRejectedValue(new Error())
13 |
14 | const { findByText } = renderUsersScreen()
15 |
16 | expect(await findByText('Ha ocurrido un error. Por favor, vuelve a intentarlo.')).toBeDefined()
17 | })
18 |
19 | it('shows users list', async () => {
20 | jest.spyOn(UserService, 'all').mockResolvedValue(aUserCollection())
21 |
22 | const { findAllByTestId } = renderUsersScreen()
23 |
24 | expect(await findAllByTestId('user-item')).toHaveLength(2)
25 | })
26 | })
27 |
28 | const renderUsersScreen = () => {
29 | return renderScreen(routes.USERS)
30 | }
31 |
--------------------------------------------------------------------------------
/setupJestIntegration.js:
--------------------------------------------------------------------------------
1 | import { NativeModules } from 'react-native'
2 | import { mockReactNativeLocalize } from './src/core/infrastructure/__mocks__/mockReactNativeLocalize'
3 |
4 | jest.mock('react-native-localize', () => mockReactNativeLocalize)
5 |
6 | jest.mock('react-native/Libraries/Utilities/NativePlatformConstantsIOS', () => ({
7 | ...require.requireActual('react-native/Libraries/Utilities/NativePlatformConstantsIOS'),
8 | getConstants: () => ({
9 | forceTouchAvailable: false,
10 | interfaceIdiom: 'en',
11 | isTesting: false,
12 | osVersion: 'ios',
13 | reactNativeVersion: { major: 60, minor: 1, patch: 0 },
14 | systemName: 'ios'
15 | })
16 | }))
17 |
18 | NativeModules.RNGestureHandlerModule = {
19 | attachGestureHandler: jest.fn(),
20 | createGestureHandler: jest.fn(),
21 | dropGestureHandler: jest.fn(),
22 | updateGestureHandler: jest.fn(),
23 | forceTouchAvailable: jest.fn(),
24 | State: {},
25 | Directions: {}
26 | }
27 |
28 | NativeModules.PlatformConstants = {
29 | forceTouchAvailable: false
30 | }
31 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | module.exports = {
4 | preset: 'react-native',
5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
6 | testRegex: 'spec\\.(ts|tsx|js)$',
7 | moduleNameMapper: {
8 | '^@(.*)/(.*)$': '/node_modules/@$1/$2',
9 | '^domain/(.*)$': '/src/core/domain/$1',
10 | '^infrastructure/(.*)$': '/src/core/infrastructure/$1',
11 | '^services/(.*)$': '/src/core/services/$1',
12 | '^screens/(.*)$': '/src/ui/screens/$1',
13 | '^theme': '/src/ui/theme',
14 | '^components/(.*)$': '/src/ui/components/$1'
15 | },
16 | setupFilesAfterEnv: ['./setupJest.js'],
17 | transform: {
18 | '^.+\\.(ts|tsx)$': 'ts-jest',
19 | '^.+\\.js$': '/node_modules/react-native/jest/preprocessor.js'
20 | },
21 | transformIgnorePatterns: [
22 | 'node_modules/(?!(react-native|react-navigation|@react-navigation|@react-native-community))'
23 | ],
24 | globals: {
25 | 'ts-jest': {
26 | babelConfig: true,
27 | diagnostics: true
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/ui/screens/_context/LocaleProvider.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import isUndefined from 'lodash/isUndefined'
3 | import { i18n, Languages } from 'infrastructure/locale/i18n'
4 | import { LocaleContext } from './LocaleContext'
5 |
6 | export class LocaleProvider extends React.Component {
7 | constructor(props) {
8 | super(props)
9 |
10 | this.state = {
11 | languageCode: undefined
12 | }
13 | this.fetchLocale()
14 | }
15 |
16 | render() {
17 | const currentLanguage = isUndefined(this.state.languageCode) ? undefined : Languages[this.state.languageCode]
18 |
19 | return (
20 | (isUndefined(currentLanguage) ? '' : i18n.translate(scope, options))
24 | }}>
25 | {this.props.children}
26 |
27 | )
28 | }
29 |
30 | fetchLocale = async () => {
31 | await i18n.init()
32 | this.setState({
33 | languageCode: i18n.locale()
34 | })
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
13 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/core/infrastructure/locale/i18n.js:
--------------------------------------------------------------------------------
1 | import i18nJs from 'i18n-js'
2 | import { findBestAvailableLanguage, getLocales } from 'react-native-localize'
3 | import { es } from '../../../../locales/es'
4 |
5 | export const i18n = {
6 | init: async () => {
7 | i18nJs.fallbacks = true
8 | i18nJs.translations = { es }
9 | i18nJs.defaultLocale = 'es'
10 |
11 | const locale = findBestAvailableLanguage(getLocales().map(l => l.languageTag))
12 | const language = languageForLocale(locale.languageTag)
13 |
14 | i18nJs.locale = language.code
15 | },
16 | locale: () => i18nJs.locale,
17 | translate: (scope, options) => i18nJs.translate(scope, options)
18 | }
19 |
20 | const buildLanguage = (code, includedLocales) => ({
21 | code,
22 | includedLocales
23 | })
24 |
25 | export const Languages = {
26 | es: buildLanguage('es', ['es', 'ca', 'gl'])
27 | }
28 |
29 | export const languageForLocale = locale => {
30 | const languageCode =
31 | Object.keys(Languages).find(code => Languages[code].includedLocales.includes(locale.substr(0, 2))) || 'es'
32 |
33 | return Languages[languageCode]
34 | }
35 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OSX
2 | #
3 | .DS_Store
4 |
5 | # Xcode
6 | #
7 | build/
8 | *.pbxuser
9 | !default.pbxuser
10 | *.mode1v3
11 | !default.mode1v3
12 | *.mode2v3
13 | !default.mode2v3
14 | *.perspectivev3
15 | !default.perspectivev3
16 | xcuserdata
17 | *.xccheckout
18 | *.moved-aside
19 | DerivedData
20 | *.hmap
21 | *.ipa
22 | *.xcuserstate
23 |
24 | # Android/IntelliJ
25 | #
26 | build/
27 | .idea
28 | .gradle
29 | local.properties
30 | *.iml
31 |
32 | # node.js
33 | #
34 | node_modules/
35 | npm-debug.log
36 | yarn-error.log
37 |
38 | # BUCK
39 | buck-out/
40 | \.buckd/
41 | *.keystore
42 | !debug.keystore
43 |
44 |
45 | # fastlane
46 | #
47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
48 | # screenshots whenever they are needed.
49 | # For more information about the recommended setup visit:
50 | # https://docs.fastlane.tools/best-practices/source-control/
51 |
52 | */fastlane/report.xml
53 | */fastlane/Preview.html
54 | */fastlane/screenshots
55 |
56 | # Bundle artifact
57 | *.jsbundle
58 |
59 | # CocoaPods
60 | /ios/Pods/
61 |
62 | # Bundle artifact
63 | *.jsbundle
64 |
65 | .jest/
66 |
--------------------------------------------------------------------------------
/src/core/infrastructure/__mocks__/mockReactNativeLocalize.js:
--------------------------------------------------------------------------------
1 | const getLocales = () => [
2 | { countryCode: 'US', languageTag: 'en-US', languageCode: 'en', isRTL: false },
3 | { countryCode: 'ES', languageTag: 'es-ES', languageCode: 'es', isRTL: false }
4 | ]
5 |
6 | const findBestAvailableLanguage = () => ({ languageTag: 'es-ES', isRTL: false })
7 |
8 | const getNumberFormatSettings = () => ({
9 | decimalSeparator: '.',
10 | groupingSeparator: ','
11 | })
12 |
13 | const getCalendar = () => 'gregorian'
14 | const getCountry = () => 'ES'
15 | const getCurrencies = () => []
16 | const getTemperatureUnit = () => 'celsius'
17 | const getTimeZone = () => 'Europe/Madrid'
18 | const uses24HourClock = () => true
19 | const usesMetricSystem = () => true
20 |
21 | const addEventListener = jest.fn()
22 | const removeEventListener = jest.fn()
23 |
24 | export const mockReactNativeLocalize = {
25 | findBestAvailableLanguage,
26 | getLocales,
27 | getNumberFormatSettings,
28 | getCalendar,
29 | getCountry,
30 | getCurrencies,
31 | getTemperatureUnit,
32 | getTimeZone,
33 | uses24HourClock,
34 | usesMetricSystem,
35 | addEventListener,
36 | removeEventListener
37 | }
38 |
--------------------------------------------------------------------------------
/src/core/infrastructure/api/__tests__/__fixtures__/usersFixture.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": 1,
4 | "name": "Leanne Graham",
5 | "username": "Bret",
6 | "email": "Sincere@april.biz",
7 | "address": {
8 | "street": "Kulas Light",
9 | "suite": "Apt. 556",
10 | "city": "Gwenborough",
11 | "zip_code": "92998-3874",
12 | "geo": {
13 | "lat": "-37.3159",
14 | "lng": "81.1496"
15 | }
16 | },
17 | "phone": "1-770-736-8031 x56442",
18 | "website": "hildegard.org",
19 | "company": {
20 | "name": "Romaguera-Crona",
21 | "description": "Multi-layered client-server neural-net"
22 | }
23 | },
24 | {
25 | "id": 2,
26 | "name": "Ervin Howell",
27 | "username": "Antonette",
28 | "email": "Shanna@melissa.tv",
29 | "address": {
30 | "street": "Victor Plains",
31 | "suite": "Suite 879",
32 | "city": "Wisokyburgh",
33 | "zip_code": "90566-7771",
34 | "geo": {
35 | "lat": "-43.9509",
36 | "lng": "-34.4618"
37 | }
38 | },
39 | "phone": "010-692-6593 x09125",
40 | "website": "anastasia.net",
41 | "company": {
42 | "name": "Deckow-Crist",
43 | "description": "Proactive didactic contingency"
44 | }
45 | }
46 | ]
47 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | ext {
4 | buildToolsVersion = "28.0.3"
5 | minSdkVersion = 16
6 | compileSdkVersion = 28
7 | targetSdkVersion = 28
8 | kotlinVersion = '1.3.50'
9 | }
10 | repositories {
11 | google()
12 | maven {
13 | url "https://jitpack.io"
14 | }
15 | maven {
16 | // All of Detox' artifacts are provided via the npm module
17 | url "$rootDir/../node_modules/detox/Detox-android"
18 | }
19 | jcenter()
20 | }
21 | dependencies {
22 | classpath("com.android.tools.build:gradle:3.4.2")
23 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
24 |
25 | // NOTE: Do not place your application dependencies here; they belong
26 | // in the individual module build.gradle files
27 | }
28 | }
29 |
30 | allprojects {
31 | repositories {
32 | mavenLocal()
33 | maven {
34 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
35 | url("$rootDir/../node_modules/react-native/android")
36 | }
37 | maven {
38 | // Android JSC is installed from npm
39 | url("$rootDir/../node_modules/jsc-android/dist")
40 | }
41 |
42 | google()
43 | jcenter()
44 | maven { url 'https://jitpack.io' }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/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.reactnativestarterkit",
39 | )
40 |
41 | android_resource(
42 | name = "res",
43 | package = "com.reactnativestarterkit",
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 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/AppDelegate.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 "AppDelegate.h"
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | @implementation AppDelegate
15 |
16 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
17 | {
18 | RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
19 | RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
20 | moduleName:@"ReactNativeStarterKit"
21 | initialProperties:nil];
22 |
23 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
24 |
25 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
26 | UIViewController *rootViewController = [UIViewController new];
27 | rootViewController.view = rootView;
28 | self.window.rootViewController = rootViewController;
29 | [self.window makeKeyAndVisible];
30 | return YES;
31 | }
32 |
33 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
34 | {
35 | #if DEBUG
36 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
37 | #else
38 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
39 | #endif
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/src/ui/screens/Users/Users.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FlatList, StyleSheet, Text, View } from 'components/_base'
3 | import { useTrans } from 'screens/_context/LocaleContext'
4 | import isUndefined from 'lodash/isUndefined'
5 | import { size } from 'theme'
6 |
7 | export const Users = ({ users, error }) => {
8 | const trans = useTrans()
9 |
10 | if (!isUndefined(error)) {
11 | return (
12 |
13 | {error}
14 |
15 | )
16 | }
17 |
18 | return (
19 |
20 |
21 | {trans('users.title')}
22 |
23 | }
26 | keyExtractor={user => user.getId().toString()}
27 | />
28 |
29 | )
30 | }
31 |
32 | const UserItem = ({ user }) => {
33 | const trans = useTrans()
34 |
35 | return (
36 |
37 | {`${trans('users.name')}:`}
38 |
39 | {user.getName()}
40 |
41 |
42 | )
43 | }
44 |
45 | const styles = StyleSheet.create({
46 | title: {
47 | marginVertical: size.base,
48 | paddingLeft: size.baseScale(1)
49 | },
50 | userItem: {
51 | flexDirection: 'row',
52 | marginVertical: size.base,
53 | paddingLeft: size.baseScale(2)
54 | },
55 | nameLabel: {
56 | marginRight: size.smallScale(1)
57 | }
58 | })
59 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit-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 |
--------------------------------------------------------------------------------
/src/core/infrastructure/domain/model/User/__tests__/ApiUserRepository.spec.ts:
--------------------------------------------------------------------------------
1 | import { ApiUserRepository } from '../ApiUserRepository'
2 | import { apiClient } from 'infrastructure/api/apiClient'
3 | import { User } from 'domain/model/User/User'
4 |
5 | const usersDTO = [
6 | {
7 | id: 1,
8 | address: {
9 | city: 'Gwenborough',
10 | geo: {
11 | lat: '-37.3159',
12 | lng: '81.1496'
13 | },
14 | street: 'Kulas Light',
15 | suite: 'Apt. 556',
16 | zip_code: '92998-3874'
17 | },
18 | company: {
19 | description: 'Multi-layered client-server neural-net',
20 | name: 'Romaguera-Crona'
21 | },
22 | email: 'Sincere@april.biz',
23 | name: 'Leanne Graham',
24 | phone: '1-770-736-8031 x56442',
25 | username: 'Bret',
26 | website: 'hildegard.org'
27 | },
28 | {
29 | id: 2,
30 | address: {
31 | city: 'Wisokyburgh',
32 | geo: {
33 | lat: '-43.9509',
34 | lng: '-34.4618'
35 | },
36 | street: 'Victor Plains',
37 | suite: 'Suite 879',
38 | zip_code: '90566-7771'
39 | },
40 | company: {
41 | description: 'Proactive didactic contingency',
42 | name: 'Deckow-Crist'
43 | },
44 | email: 'Shanna@melissa.tv',
45 | name: 'Ervin Howell',
46 | phone: '010-692-6593 x09125',
47 | username: 'Antonette',
48 | website: 'anastasia.net'
49 | }
50 | ]
51 |
52 | describe('ApiUserRepository', () => {
53 | afterEach(() => {
54 | jest.resetAllMocks()
55 | })
56 |
57 | it('finds comic by character id', async () => {
58 | jest.spyOn(apiClient, 'users').mockResolvedValue(usersDTO)
59 |
60 | const users = await ApiUserRepository.all()
61 |
62 | expect(users).toEqual([new User(1, 'Leanne Graham'), new User(2, 'Ervin Howell')])
63 | })
64 | })
65 |
--------------------------------------------------------------------------------
/fakeapi/responses/users.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": 1,
4 | "name": "Leanne Graham",
5 | "username": "Bret",
6 | "email": "Sincere@april.biz",
7 | "address": {
8 | "street": "Kulas Light",
9 | "suite": "Apt. 556",
10 | "city": "Gwenborough",
11 | "zip_code": "92998-3874",
12 | "geo": {
13 | "lat": "-37.3159",
14 | "lng": "81.1496"
15 | }
16 | },
17 | "phone": "1-770-736-8031 x56442",
18 | "website": "hildegard.org",
19 | "company": {
20 | "name": "Romaguera-Crona",
21 | "description": "Multi-layered client-server neural-net"
22 | }
23 | },
24 | {
25 | "id": 2,
26 | "name": "Ervin Howell",
27 | "username": "Antonette",
28 | "email": "Shanna@melissa.tv",
29 | "address": {
30 | "street": "Victor Plains",
31 | "suite": "Suite 879",
32 | "city": "Wisokyburgh",
33 | "zip_code": "90566-7771",
34 | "geo": {
35 | "lat": "-43.9509",
36 | "lng": "-34.4618"
37 | }
38 | },
39 | "phone": "010-692-6593 x09125",
40 | "website": "anastasia.net",
41 | "company": {
42 | "name": "Deckow-Crist",
43 | "description": "Proactive didactic contingency"
44 | }
45 | },
46 | {
47 | "id": 3,
48 | "name": "Clementine Bauch",
49 | "username": "Samantha",
50 | "email": "Nathan@yesenia.net",
51 | "address": {
52 | "street": "Douglas Extension",
53 | "suite": "Suite 847",
54 | "city": "McKenziehaven",
55 | "zip_code": "59590-4157",
56 | "geo": {
57 | "lat": "-68.6102",
58 | "lng": "-47.0653"
59 | }
60 | },
61 | "phone": "1-463-123-4447",
62 | "website": "ramiro.info",
63 | "company": {
64 | "name": "Romaguera-Jacobson",
65 | "description": "Face to face bifurcated interface"
66 | }
67 | }
68 | ]
69 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | ReactNativeStarterKit
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSRequiresIPhoneOS
26 |
27 | NSAppTransportSecurity
28 |
29 | NSAllowsArbitraryLoads
30 |
31 | NSExceptionDomains
32 |
33 | localhost
34 |
35 | NSExceptionAllowsInsecureHTTPLoads
36 |
37 |
38 |
39 |
40 | NSLocationWhenInUseUsageDescription
41 |
42 | UILaunchStoryboardName
43 | LaunchScreen
44 | UIRequiredDeviceCapabilities
45 |
46 | armv7
47 |
48 | UISupportedInterfaceOrientations
49 |
50 | UIInterfaceOrientationPortrait
51 | UIInterfaceOrientationLandscapeLeft
52 | UIInterfaceOrientationLandscapeRight
53 |
54 | UIViewControllerBasedStatusBarAppearance
55 |
56 | UIAppFonts
57 |
58 | ProximaNova-Regular.otf
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/core/infrastructure/api/__tests__/apiClient.spec.js:
--------------------------------------------------------------------------------
1 | import { apiClient } from '../apiClient'
2 | import usersFixture from './__fixtures__/usersFixture.json'
3 |
4 | describe('apiClient', () => {
5 | afterEach(async () => {
6 | jest.resetAllMocks()
7 | fetch.resetMocks()
8 | })
9 |
10 | it('makes fleetInRegion request and parses response', async () => {
11 | fetch.mockResponse(JSON.stringify(usersFixture))
12 |
13 | const users = await apiClient.users()
14 |
15 | expect(users).toEqual([
16 | {
17 | id: 1,
18 | address: {
19 | city: 'Gwenborough',
20 | geo: {
21 | lat: '-37.3159',
22 | lng: '81.1496'
23 | },
24 | street: 'Kulas Light',
25 | suite: 'Apt. 556',
26 | zip_code: '92998-3874'
27 | },
28 | company: {
29 | description: 'Multi-layered client-server neural-net',
30 | name: 'Romaguera-Crona'
31 | },
32 | email: 'Sincere@april.biz',
33 | name: 'Leanne Graham',
34 | phone: '1-770-736-8031 x56442',
35 | username: 'Bret',
36 | website: 'hildegard.org'
37 | },
38 | {
39 | id: 2,
40 | address: {
41 | city: 'Wisokyburgh',
42 | geo: {
43 | lat: '-43.9509',
44 | lng: '-34.4618'
45 | },
46 | street: 'Victor Plains',
47 | suite: 'Suite 879',
48 | zip_code: '90566-7771'
49 | },
50 | company: {
51 | description: 'Proactive didactic contingency',
52 | name: 'Deckow-Crist'
53 | },
54 | email: 'Shanna@melissa.tv',
55 | name: 'Ervin Howell',
56 | phone: '010-692-6593 x09125',
57 | username: 'Antonette',
58 | website: 'anastasia.net'
59 | }
60 | ])
61 | expect(fetch).toHaveBeenCalledWith(expect.stringContaining('/users'), expect.objectContaining({ method: 'GET' }))
62 | })
63 | })
64 |
--------------------------------------------------------------------------------
/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 | ; We fork some components by platform
3 | .*/*[.]android.js
4 |
5 | ; Ignore "BUCK" generated dirs
6 | /\.buckd/
7 |
8 | ; Ignore polyfills
9 | node_modules/react-native/Libraries/polyfills/.*
10 |
11 | ; These should not be required directly
12 | ; require from fbjs/lib instead: require('fbjs/lib/warning')
13 | node_modules/warning/.*
14 |
15 | ; Flow doesn't support platforms
16 | .*/Libraries/Utilities/LoadingView.js
17 |
18 | [untyped]
19 | .*/node_modules/@react-native-community/cli/.*/.*
20 |
21 | [include]
22 |
23 | [libs]
24 | node_modules/react-native/Libraries/react-native/react-native-interface.js
25 | node_modules/react-native/flow/
26 |
27 | [options]
28 | emoji=true
29 |
30 | esproposal.optional_chaining=enable
31 | esproposal.nullish_coalescing=enable
32 |
33 | module.file_ext=.js
34 | module.file_ext=.json
35 | module.file_ext=.ios.js
36 |
37 | munge_underscores=true
38 |
39 | module.name_mapper='^react-native$' -> '/node_modules/react-native/Libraries/react-native/react-native-implementation'
40 | module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1'
41 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub'
42 |
43 | suppress_type=$FlowIssue
44 | suppress_type=$FlowFixMe
45 | suppress_type=$FlowFixMeProps
46 | suppress_type=$FlowFixMeState
47 |
48 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)
49 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+
50 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
51 |
52 | [lints]
53 | sketchy-null-number=warn
54 | sketchy-null-mixed=warn
55 | sketchy-number=warn
56 | untyped-type-import=warn
57 | nonstrict-import=warn
58 | deprecated-type=warn
59 | unsafe-getters-setters=warn
60 | inexact-spread=warn
61 | unnecessary-invariant=warn
62 | signature-verification-failure=warn
63 | deprecated-utility=error
64 |
65 | [strict]
66 | deprecated-type
67 | nonstrict-import
68 | sketchy-null
69 | unclear-type
70 | unsafe-getters-setters
71 | untyped-import
72 | untyped-type-import
73 |
74 | [version]
75 | ^0.105.0
76 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/reactnativestarterkit/MainApplication.java:
--------------------------------------------------------------------------------
1 | package com.reactnativestarterkit;
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 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | platform :ios, '9.0'
2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
3 |
4 | target 'ReactNativeStarterKit' do
5 | # Pods for RnDiffApp
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 |
25 | pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
26 | pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
27 | pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
28 | pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
29 | pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon"
30 | pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
31 | pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
32 |
33 | pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
34 | pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
35 | pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
36 |
37 | target 'ReactNativeStarterKitTests' do
38 | inherit! :search_paths
39 | # Pods for testing
40 | end
41 |
42 | use_native_modules!
43 | end
44 |
45 | target 'ReactNativeStarterKit-tvOS' do
46 | # Pods for ReactNativeStarterKit-tvOS
47 |
48 | target 'ReactNativeStarterKit-tvOSTests' do
49 | inherit! :search_paths
50 | # Pods for testing
51 | end
52 |
53 | end
54 |
--------------------------------------------------------------------------------
/fakeapi/index.js:
--------------------------------------------------------------------------------
1 | var applicationRoot = __dirname.replace(/\\/g, '/')
2 | var ipaddress = process.env.FAKEAPI_IP || '127.0.0.1'
3 | var port = 8080
4 | var mockRoot = applicationRoot + '/responses'
5 | var mockFilePattern = '.json|.js'
6 | var mockRootPattern = mockRoot + '/**/*' + '@(' + mockFilePattern + ')'
7 | var apiRoot = ''
8 | var glob = require('glob')
9 |
10 | var morgan = require('morgan')
11 | var errorhandler = require('errorhandler')
12 | var express = require('express')
13 | var app = express()
14 | var bodyParser = require('body-parser')
15 | var cors = require('cors')
16 |
17 | app.use(morgan('tiny'))
18 | app.use(errorhandler({ dumpExceptions: true, showStack: true }))
19 | app.use(cors())
20 |
21 | let byDepthDesc = function(a, b) {
22 | return b.split('/').length - a.split('/').length
23 | }
24 |
25 | var files = glob.sync(mockRootPattern).sort(byDepthDesc)
26 |
27 | if (files && files.length > 0) {
28 | files.forEach(function(fileName) {
29 | var mapping = apiRoot + fileName.replace(mockRoot, '').replace(new RegExp(mockFilePattern), '')
30 |
31 | app.use(bodyParser.urlencoded({ extended: false }))
32 | app.use(bodyParser.json())
33 |
34 | var data = require(fileName)
35 |
36 | if (fileName.endsWith('.json')) {
37 | app.get(mapping, function(request, response) {
38 | response.set('Content-Type', 'application/json')
39 | response.write(JSON.stringify(data))
40 | response.send()
41 | })
42 |
43 | console.log('Registered mapping: %s -> GET %s', mapping, fileName)
44 | } else if (Object.keys(data).length === 0 && fileName.endsWith('video.js')) {
45 | app.get(mapping, function(request, response) {
46 | data(request, response)
47 | })
48 |
49 | console.log('Registered video mapping: %s -> GET %s', mapping, fileName)
50 | } else if (Object.keys(data).length === 0) {
51 | app.get(mapping, function(request, response) {
52 | response.set('Content-Type', 'application/json')
53 | var content = data(request, response)
54 | if (content) {
55 | response.write(JSON.stringify(content))
56 | }
57 | response.send()
58 | })
59 |
60 | console.log('Registered mapping: %s -> GET %s', mapping, fileName)
61 | } else {
62 | Object.keys(data).forEach(function(method) {
63 | app[method](mapping, function(request, response) {
64 | response.set('Content-Type', 'application/json')
65 | var content = data[method](request, response)
66 | if (content) {
67 | response.write(JSON.stringify(content))
68 | }
69 | response.send()
70 | })
71 |
72 | console.log('Registered mapping: %s -> ' + method.toUpperCase() + ' %s', mapping, fileName)
73 | })
74 | }
75 | })
76 | } else {
77 | console.log('No mappings found! Please check the configuration.')
78 | }
79 |
80 | console.log('Application root directory: [' + applicationRoot + ']')
81 | console.log('Mock Api Server listening: [http://' + ipaddress + ':' + port + ']')
82 | app.listen(port, ipaddress)
83 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-native-starter-kit",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "install:all": "yarn install && (cd fakeapi && yarn install)",
7 | "start": "react-native start",
8 | "start:fakeapi": "cd ./fakeapi && yarn start",
9 | "test": "yarn test:unit && yarn test:integration",
10 | "test:unit": "TZ=UTC jest -c jest.config.unit.js",
11 | "test:integration": "TZ=UTC jest -c jest.config.integration.js",
12 | "build:e2e:android": "detox build -c android.emu.release",
13 | "test:e2e:android": "detox test -c android.emu.release --cleanup",
14 | "build:e2e:ios": "detox build -c ios.sim.release",
15 | "test:e2e:ios": "detox test -c ios.sim.release --cleanup"
16 | },
17 | "dependencies": {
18 | "@react-native-community/masked-view": "^0.1.6",
19 | "@types/jest": "^24.0.25",
20 | "@types/lodash": "^4.14.149",
21 | "@types/react": "^16.9.17",
22 | "@types/react-native": "^0.60.30",
23 | "@types/react-test-renderer": "^16.9.1",
24 | "i18n-js": "^3.5.1",
25 | "lodash": "^4.17.15",
26 | "react": "16.9.0",
27 | "react-native": "0.61.5",
28 | "react-native-extended-stylesheet": "^0.12.0",
29 | "react-native-gesture-handler": "^1.5.3",
30 | "react-native-localize": "^1.3.2",
31 | "react-native-safe-area-context": "^0.6.2",
32 | "react-navigation": "^4.0.10",
33 | "react-navigation-stack": "^2.0.14",
34 | "typescript": "^3.7.4",
35 | "wretch": "^1.6.0"
36 | },
37 | "devDependencies": {
38 | "@babel/core": "^7.8.0",
39 | "@babel/plugin-transform-runtime": "^7.8.0",
40 | "@babel/runtime": "^7.8.0",
41 | "@react-native-community/eslint-config": "^0.0.6",
42 | "@react-native-community/eslint-plugin": "^1.0.0",
43 | "@testing-library/react-native": "^5.0.3",
44 | "@typescript-eslint/eslint-plugin": "^2.15.0",
45 | "@typescript-eslint/parser": "^2.15.0",
46 | "babel-jest": "^24.9.0",
47 | "babel-plugin-module-resolver": "^4.0.0",
48 | "detox": "^15.1.1",
49 | "eslint": "^6.8.0",
50 | "eslint-config-prettier": "^6.9.0",
51 | "eslint-plugin-import": "^2.20.0",
52 | "eslint-plugin-jest": "^23.6.0",
53 | "eslint-plugin-prettier": "^3.1.2",
54 | "husky": "^4.0.7",
55 | "jest": "^24.9.0",
56 | "jest-fetch-mock": "^3.0.1",
57 | "lint-staged": "^9.5.0",
58 | "metro-react-native-babel-preset": "^0.56.4",
59 | "prettier": "^1.19.1",
60 | "react-test-renderer": "16.9.0",
61 | "ts-jest": "^24.3.0"
62 | },
63 | "jest": {
64 | "preset": "react-native"
65 | },
66 | "detox": {
67 | "configurations": {
68 | "ios.sim.release": {
69 | "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/ReactNativeStarterKit.app",
70 | "build": "xcodebuild -UseModernBuildSystem=NO -workspace ios/ReactNativeStarterKit.xcworkspace -scheme ReactNativeStarterKit -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
71 | "type": "ios.simulator",
72 | "name": "iPhone X"
73 | },
74 | "android.emu.release": {
75 | "binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
76 | "build": "cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..",
77 | "type": "android.emulator",
78 | "name": "Nexus_5X_API_26"
79 | }
80 | },
81 | "test-runner": "jest"
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/ui/screens/_components/ConnectComponent.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { AppState, BackHandler } from 'components/_base'
3 | import { navigator } from 'infrastructure/navigation'
4 | import defaultTo from 'lodash/defaultTo'
5 | import get from 'lodash/get'
6 |
7 | export const ConnectComponent = (View, Presenter) => {
8 | class ConnectedComponent extends React.Component {
9 | static displayName = `ConnectComponent(${View.name}, ${Presenter.name})`
10 |
11 | constructor(props) {
12 | super(props)
13 |
14 | this.presenter = new Presenter()
15 |
16 | this.state = {
17 | appState: AppState.currentState
18 | }
19 |
20 | if (props.navigation) {
21 | navigator.setNavigator(props.navigation)
22 |
23 | this.didFocusSubscription = props.navigation.addListener('didFocus', () =>
24 | BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
25 | )
26 | }
27 | }
28 |
29 | onBackButtonPressAndroid = () => {
30 | if (this.props.navigation.isFocused() && typeof this.presenter.onHardwareBack === 'function') {
31 | return this.presenter.onHardwareBack()
32 | }
33 |
34 | return false
35 | }
36 |
37 | componentDidMount() {
38 | AppState.addEventListener('change', this.onAppStateChanged)
39 |
40 | if (typeof this.presenter.onLifecycleStart === 'function') {
41 | this.presenter.onLifecycleStart(defaultTo(get(this.props.navigation, 'state.params'), {}))
42 | }
43 |
44 | if (typeof this.presenter.onLifecycleResume === 'function') {
45 | this.presenter.onLifecycleResume()
46 | }
47 |
48 | if (this.props.navigation) {
49 | this.willBlurSubscription = this.props.navigation.addListener('willBlur', () =>
50 | BackHandler.removeEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
51 | )
52 | }
53 | }
54 |
55 | componentWillUnmount() {
56 | AppState.removeEventListener('change', this.onAppStateChanged)
57 |
58 | if (typeof this.presenter.onLifecyclePause === 'function') {
59 | this.presenter.onLifecyclePause()
60 | }
61 |
62 | if (typeof this.presenter.onLifecycleStop === 'function') {
63 | this.presenter.onLifecycleStop()
64 | }
65 |
66 | BackHandler.removeEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
67 | this.didFocusSubscription && this.didFocusSubscription.remove()
68 | this.willBlurSubscription && this.willBlurSubscription.remove()
69 | }
70 |
71 | onAppStateChanged = async nextAppState => {
72 | if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
73 | if (typeof this.presenter.onLifecycleResume === 'function') {
74 | this.presenter.onLifecycleResume()
75 | }
76 | }
77 |
78 | if (this.state.appState === 'active' && nextAppState.match(/inactive|background/)) {
79 | if (typeof this.presenter.onLifecyclePause === 'function') {
80 | this.presenter.onLifecyclePause()
81 | }
82 | }
83 |
84 | this.setState({ appState: nextAppState })
85 | }
86 |
87 | render() {
88 | const propsWithPresenter = { ...this.props, presenter: this.presenter }
89 |
90 | return
91 | }
92 | }
93 |
94 | const ForwardedConnectedComponent = React.forwardRef((props, ref) => {
95 | return
96 | })
97 |
98 | ForwardedConnectedComponent.navigationOptions = View.navigationOptions
99 |
100 | return ForwardedConnectedComponent
101 | }
102 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit.xcodeproj/xcshareddata/xcschemes/ReactNativeStarterKit.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
46 |
47 |
53 |
54 |
55 |
56 |
57 |
58 |
68 |
70 |
76 |
77 |
78 |
79 |
80 |
81 |
87 |
89 |
95 |
96 |
97 |
98 |
100 |
101 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit.xcodeproj/xcshareddata/xcschemes/ReactNativeStarterKit-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 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # http://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 | # Determine the Java command to use to start the JVM.
86 | if [ -n "$JAVA_HOME" ] ; then
87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88 | # IBM's JDK on AIX uses strange locations for the executables
89 | JAVACMD="$JAVA_HOME/jre/sh/java"
90 | else
91 | JAVACMD="$JAVA_HOME/bin/java"
92 | fi
93 | if [ ! -x "$JAVACMD" ] ; then
94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95 |
96 | Please set the JAVA_HOME variable in your environment to match the
97 | location of your Java installation."
98 | fi
99 | else
100 | JAVACMD="java"
101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102 |
103 | Please set the JAVA_HOME variable in your environment to match the
104 | location of your Java installation."
105 | fi
106 |
107 | # Increase the maximum file descriptors if we can.
108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109 | MAX_FD_LIMIT=`ulimit -H -n`
110 | if [ $? -eq 0 ] ; then
111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112 | MAX_FD="$MAX_FD_LIMIT"
113 | fi
114 | ulimit -n $MAX_FD
115 | if [ $? -ne 0 ] ; then
116 | warn "Could not set maximum file descriptor limit: $MAX_FD"
117 | fi
118 | else
119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120 | fi
121 | fi
122 |
123 | # For Darwin, add options to specify how the application appears in the dock
124 | if $darwin; then
125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126 | fi
127 |
128 | # For Cygwin, switch paths to Windows format before running java
129 | if $cygwin ; then
130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132 | JAVACMD=`cygpath --unix "$JAVACMD"`
133 |
134 | # We build the pattern for arguments to be converted via cygpath
135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136 | SEP=""
137 | for dir in $ROOTDIRSRAW ; do
138 | ROOTDIRS="$ROOTDIRS$SEP$dir"
139 | SEP="|"
140 | done
141 | OURCYGPATTERN="(^($ROOTDIRS))"
142 | # Add a user-defined pattern to the cygpath arguments
143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145 | fi
146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
147 | i=0
148 | for arg in "$@" ; do
149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151 |
152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154 | else
155 | eval `echo args$i`="\"$arg\""
156 | fi
157 | i=$((i+1))
158 | done
159 | case $i in
160 | (0) set -- ;;
161 | (1) set -- "$args0" ;;
162 | (2) set -- "$args0" "$args1" ;;
163 | (3) set -- "$args0" "$args1" "$args2" ;;
164 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170 | esac
171 | fi
172 |
173 | # Escape application args
174 | save () {
175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176 | echo " "
177 | }
178 | APP_ARGS=$(save "$@")
179 |
180 | # Collect all arguments for the java command, following the shell quoting and substitution rules
181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182 |
183 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185 | cd "$(dirname "$0")"
186 | fi
187 |
188 | exec "$JAVACMD" "$@"
189 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 |
5 | /**
6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7 | * and bundleReleaseJsAndAssets).
8 | * These basically call `react-native bundle` with the correct arguments during the Android build
9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10 | * bundle directly from the development server. Below you can see all the possible configurations
11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
12 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
13 | *
14 | * project.ext.react = [
15 | * // the name of the generated asset file containing your JS bundle
16 | * bundleAssetName: "index.android.bundle",
17 | *
18 | * // the entry file for bundle generation
19 | * entryFile: "index.android.js",
20 | *
21 | * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
22 | * bundleCommand: "ram-bundle",
23 | *
24 | * // whether to bundle JS and assets in debug mode
25 | * bundleInDebug: false,
26 | *
27 | * // whether to bundle JS and assets in release mode
28 | * bundleInRelease: true,
29 | *
30 | * // whether to bundle JS and assets in another build variant (if configured).
31 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
32 | * // The configuration property can be in the following formats
33 | * // 'bundleIn${productFlavor}${buildType}'
34 | * // 'bundleIn${buildType}'
35 | * // bundleInFreeDebug: true,
36 | * // bundleInPaidRelease: true,
37 | * // bundleInBeta: true,
38 | *
39 | * // whether to disable dev mode in custom build variants (by default only disabled in release)
40 | * // for example: to disable dev mode in the staging build type (if configured)
41 | * devDisabledInStaging: true,
42 | * // The configuration property can be in the following formats
43 | * // 'devDisabledIn${productFlavor}${buildType}'
44 | * // 'devDisabledIn${buildType}'
45 | *
46 | * // the root of your project, i.e. where "package.json" lives
47 | * root: "../../",
48 | *
49 | * // where to put the JS bundle asset in debug mode
50 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
51 | *
52 | * // where to put the JS bundle asset in release mode
53 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
54 | *
55 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
56 | * // require('./image.png')), in debug mode
57 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
58 | *
59 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
60 | * // require('./image.png')), in release mode
61 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
62 | *
63 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
64 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
65 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
66 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
67 | * // for example, you might want to remove it from here.
68 | * inputExcludes: ["android/**", "ios/**"],
69 | *
70 | * // override which node gets called and with what additional arguments
71 | * nodeExecutableAndArgs: ["node"],
72 | *
73 | * // supply additional arguments to the packager
74 | * extraPackagerArgs: []
75 | * ]
76 | */
77 |
78 | project.ext.react = [
79 | entryFile: "index.js",
80 | enableHermes: false, // clean and rebuild if changing
81 | ]
82 |
83 | apply from: "../../node_modules/react-native/react.gradle"
84 |
85 | /**
86 | * Set this to true to create two separate APKs instead of one:
87 | * - An APK that only works on ARM devices
88 | * - An APK that only works on x86 devices
89 | * The advantage is the size of the APK is reduced by about 4MB.
90 | * Upload all the APKs to the Play Store and people will download
91 | * the correct one based on the CPU architecture of their device.
92 | */
93 | def enableSeparateBuildPerCPUArchitecture = false
94 |
95 | /**
96 | * Run Proguard to shrink the Java bytecode in release builds.
97 | */
98 | def enableProguardInReleaseBuilds = false
99 |
100 | /**
101 | * The preferred build flavor of JavaScriptCore.
102 | *
103 | * For example, to use the international variant, you can use:
104 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
105 | *
106 | * The international variant includes ICU i18n library and necessary data
107 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
108 | * give correct results when using with locales other than en-US. Note that
109 | * this variant is about 6MiB larger per architecture than default.
110 | */
111 | def jscFlavor = 'org.webkit:android-jsc:+'
112 |
113 | /**
114 | * Whether to enable the Hermes VM.
115 | *
116 | * This should be set on project.ext.react and mirrored here. If it is not set
117 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
118 | * and the benefits of using Hermes will therefore be sharply reduced.
119 | */
120 | def enableHermes = project.ext.react.get("enableHermes", false);
121 |
122 | android {
123 | compileSdkVersion rootProject.ext.compileSdkVersion
124 |
125 | compileOptions {
126 | sourceCompatibility JavaVersion.VERSION_1_8
127 | targetCompatibility JavaVersion.VERSION_1_8
128 | }
129 |
130 | defaultConfig {
131 | applicationId "com.reactnativestarterkit"
132 | minSdkVersion rootProject.ext.minSdkVersion
133 | targetSdkVersion rootProject.ext.targetSdkVersion
134 | versionCode 1
135 | versionName "1.0"
136 | testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type
137 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
138 | }
139 | splits {
140 | abi {
141 | reset()
142 | enable enableSeparateBuildPerCPUArchitecture
143 | universalApk false // If true, also generate a universal APK
144 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
145 | }
146 | }
147 | signingConfigs {
148 | debug {
149 | storeFile file('debug.keystore')
150 | storePassword 'android'
151 | keyAlias 'androiddebugkey'
152 | keyPassword 'android'
153 | }
154 | }
155 | buildTypes {
156 | debug {
157 | signingConfig signingConfigs.debug
158 | }
159 | release {
160 | // Caution! In production, you need to generate your own keystore file.
161 | // see https://facebook.github.io/react-native/docs/signed-apk-android.
162 | signingConfig signingConfigs.debug
163 | minifyEnabled enableProguardInReleaseBuilds
164 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
165 | }
166 | }
167 | // applicationVariants are e.g. debug, release
168 | applicationVariants.all { variant ->
169 | variant.outputs.each { output ->
170 | // For each separate APK per architecture, set a unique version code as described here:
171 | // https://developer.android.com/studio/build/configure-apk-splits.html
172 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
173 | def abi = output.getFilter(OutputFile.ABI)
174 | if (abi != null) { // null for the universal-debug, universal-release variants
175 | output.versionCodeOverride =
176 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
177 | }
178 |
179 | }
180 | }
181 | }
182 |
183 | dependencies {
184 | implementation fileTree(dir: "libs", include: ["*.jar"])
185 | implementation "com.facebook.react:react-native:+" // From node_modules
186 |
187 | androidTestImplementation('com.wix:detox:+') { transitive = true }
188 | androidTestImplementation 'junit:junit:4.12'
189 |
190 | if (enableHermes) {
191 | def hermesPath = "../../node_modules/hermes-engine/android/";
192 | debugImplementation files(hermesPath + "hermes-debug.aar")
193 | releaseImplementation files(hermesPath + "hermes-release.aar")
194 | } else {
195 | implementation jscFlavor
196 | }
197 | }
198 |
199 | // Run this once to be able to run the application with BUCK
200 | // puts all compile dependencies into folder libs for BUCK to use
201 | task copyDownloadableDepsToLibs(type: Copy) {
202 | from configurations.compile
203 | into 'libs'
204 | }
205 |
206 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
207 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - boost-for-react-native (1.63.0)
3 | - DoubleConversion (1.1.6)
4 | - FBLazyVector (0.61.5)
5 | - FBReactNativeSpec (0.61.5):
6 | - Folly (= 2018.10.22.00)
7 | - RCTRequired (= 0.61.5)
8 | - RCTTypeSafety (= 0.61.5)
9 | - React-Core (= 0.61.5)
10 | - React-jsi (= 0.61.5)
11 | - ReactCommon/turbomodule/core (= 0.61.5)
12 | - Folly (2018.10.22.00):
13 | - boost-for-react-native
14 | - DoubleConversion
15 | - Folly/Default (= 2018.10.22.00)
16 | - glog
17 | - Folly/Default (2018.10.22.00):
18 | - boost-for-react-native
19 | - DoubleConversion
20 | - glog
21 | - glog (0.3.5)
22 | - RCTRequired (0.61.5)
23 | - RCTTypeSafety (0.61.5):
24 | - FBLazyVector (= 0.61.5)
25 | - Folly (= 2018.10.22.00)
26 | - RCTRequired (= 0.61.5)
27 | - React-Core (= 0.61.5)
28 | - React (0.61.5):
29 | - React-Core (= 0.61.5)
30 | - React-Core/DevSupport (= 0.61.5)
31 | - React-Core/RCTWebSocket (= 0.61.5)
32 | - React-RCTActionSheet (= 0.61.5)
33 | - React-RCTAnimation (= 0.61.5)
34 | - React-RCTBlob (= 0.61.5)
35 | - React-RCTImage (= 0.61.5)
36 | - React-RCTLinking (= 0.61.5)
37 | - React-RCTNetwork (= 0.61.5)
38 | - React-RCTSettings (= 0.61.5)
39 | - React-RCTText (= 0.61.5)
40 | - React-RCTVibration (= 0.61.5)
41 | - React-Core (0.61.5):
42 | - Folly (= 2018.10.22.00)
43 | - glog
44 | - React-Core/Default (= 0.61.5)
45 | - React-cxxreact (= 0.61.5)
46 | - React-jsi (= 0.61.5)
47 | - React-jsiexecutor (= 0.61.5)
48 | - Yoga
49 | - React-Core/CoreModulesHeaders (0.61.5):
50 | - Folly (= 2018.10.22.00)
51 | - glog
52 | - React-Core/Default
53 | - React-cxxreact (= 0.61.5)
54 | - React-jsi (= 0.61.5)
55 | - React-jsiexecutor (= 0.61.5)
56 | - Yoga
57 | - React-Core/Default (0.61.5):
58 | - Folly (= 2018.10.22.00)
59 | - glog
60 | - React-cxxreact (= 0.61.5)
61 | - React-jsi (= 0.61.5)
62 | - React-jsiexecutor (= 0.61.5)
63 | - Yoga
64 | - React-Core/DevSupport (0.61.5):
65 | - Folly (= 2018.10.22.00)
66 | - glog
67 | - React-Core/Default (= 0.61.5)
68 | - React-Core/RCTWebSocket (= 0.61.5)
69 | - React-cxxreact (= 0.61.5)
70 | - React-jsi (= 0.61.5)
71 | - React-jsiexecutor (= 0.61.5)
72 | - React-jsinspector (= 0.61.5)
73 | - Yoga
74 | - React-Core/RCTActionSheetHeaders (0.61.5):
75 | - Folly (= 2018.10.22.00)
76 | - glog
77 | - React-Core/Default
78 | - React-cxxreact (= 0.61.5)
79 | - React-jsi (= 0.61.5)
80 | - React-jsiexecutor (= 0.61.5)
81 | - Yoga
82 | - React-Core/RCTAnimationHeaders (0.61.5):
83 | - Folly (= 2018.10.22.00)
84 | - glog
85 | - React-Core/Default
86 | - React-cxxreact (= 0.61.5)
87 | - React-jsi (= 0.61.5)
88 | - React-jsiexecutor (= 0.61.5)
89 | - Yoga
90 | - React-Core/RCTBlobHeaders (0.61.5):
91 | - Folly (= 2018.10.22.00)
92 | - glog
93 | - React-Core/Default
94 | - React-cxxreact (= 0.61.5)
95 | - React-jsi (= 0.61.5)
96 | - React-jsiexecutor (= 0.61.5)
97 | - Yoga
98 | - React-Core/RCTImageHeaders (0.61.5):
99 | - Folly (= 2018.10.22.00)
100 | - glog
101 | - React-Core/Default
102 | - React-cxxreact (= 0.61.5)
103 | - React-jsi (= 0.61.5)
104 | - React-jsiexecutor (= 0.61.5)
105 | - Yoga
106 | - React-Core/RCTLinkingHeaders (0.61.5):
107 | - Folly (= 2018.10.22.00)
108 | - glog
109 | - React-Core/Default
110 | - React-cxxreact (= 0.61.5)
111 | - React-jsi (= 0.61.5)
112 | - React-jsiexecutor (= 0.61.5)
113 | - Yoga
114 | - React-Core/RCTNetworkHeaders (0.61.5):
115 | - Folly (= 2018.10.22.00)
116 | - glog
117 | - React-Core/Default
118 | - React-cxxreact (= 0.61.5)
119 | - React-jsi (= 0.61.5)
120 | - React-jsiexecutor (= 0.61.5)
121 | - Yoga
122 | - React-Core/RCTSettingsHeaders (0.61.5):
123 | - Folly (= 2018.10.22.00)
124 | - glog
125 | - React-Core/Default
126 | - React-cxxreact (= 0.61.5)
127 | - React-jsi (= 0.61.5)
128 | - React-jsiexecutor (= 0.61.5)
129 | - Yoga
130 | - React-Core/RCTTextHeaders (0.61.5):
131 | - Folly (= 2018.10.22.00)
132 | - glog
133 | - React-Core/Default
134 | - React-cxxreact (= 0.61.5)
135 | - React-jsi (= 0.61.5)
136 | - React-jsiexecutor (= 0.61.5)
137 | - Yoga
138 | - React-Core/RCTVibrationHeaders (0.61.5):
139 | - Folly (= 2018.10.22.00)
140 | - glog
141 | - React-Core/Default
142 | - React-cxxreact (= 0.61.5)
143 | - React-jsi (= 0.61.5)
144 | - React-jsiexecutor (= 0.61.5)
145 | - Yoga
146 | - React-Core/RCTWebSocket (0.61.5):
147 | - Folly (= 2018.10.22.00)
148 | - glog
149 | - React-Core/Default (= 0.61.5)
150 | - React-cxxreact (= 0.61.5)
151 | - React-jsi (= 0.61.5)
152 | - React-jsiexecutor (= 0.61.5)
153 | - Yoga
154 | - React-CoreModules (0.61.5):
155 | - FBReactNativeSpec (= 0.61.5)
156 | - Folly (= 2018.10.22.00)
157 | - RCTTypeSafety (= 0.61.5)
158 | - React-Core/CoreModulesHeaders (= 0.61.5)
159 | - React-RCTImage (= 0.61.5)
160 | - ReactCommon/turbomodule/core (= 0.61.5)
161 | - React-cxxreact (0.61.5):
162 | - boost-for-react-native (= 1.63.0)
163 | - DoubleConversion
164 | - Folly (= 2018.10.22.00)
165 | - glog
166 | - React-jsinspector (= 0.61.5)
167 | - React-jsi (0.61.5):
168 | - boost-for-react-native (= 1.63.0)
169 | - DoubleConversion
170 | - Folly (= 2018.10.22.00)
171 | - glog
172 | - React-jsi/Default (= 0.61.5)
173 | - React-jsi/Default (0.61.5):
174 | - boost-for-react-native (= 1.63.0)
175 | - DoubleConversion
176 | - Folly (= 2018.10.22.00)
177 | - glog
178 | - React-jsiexecutor (0.61.5):
179 | - DoubleConversion
180 | - Folly (= 2018.10.22.00)
181 | - glog
182 | - React-cxxreact (= 0.61.5)
183 | - React-jsi (= 0.61.5)
184 | - React-jsinspector (0.61.5)
185 | - react-native-safe-area-context (0.6.2):
186 | - React
187 | - React-RCTActionSheet (0.61.5):
188 | - React-Core/RCTActionSheetHeaders (= 0.61.5)
189 | - React-RCTAnimation (0.61.5):
190 | - React-Core/RCTAnimationHeaders (= 0.61.5)
191 | - React-RCTBlob (0.61.5):
192 | - React-Core/RCTBlobHeaders (= 0.61.5)
193 | - React-Core/RCTWebSocket (= 0.61.5)
194 | - React-jsi (= 0.61.5)
195 | - React-RCTNetwork (= 0.61.5)
196 | - React-RCTImage (0.61.5):
197 | - React-Core/RCTImageHeaders (= 0.61.5)
198 | - React-RCTNetwork (= 0.61.5)
199 | - React-RCTLinking (0.61.5):
200 | - React-Core/RCTLinkingHeaders (= 0.61.5)
201 | - React-RCTNetwork (0.61.5):
202 | - React-Core/RCTNetworkHeaders (= 0.61.5)
203 | - React-RCTSettings (0.61.5):
204 | - React-Core/RCTSettingsHeaders (= 0.61.5)
205 | - React-RCTText (0.61.5):
206 | - React-Core/RCTTextHeaders (= 0.61.5)
207 | - React-RCTVibration (0.61.5):
208 | - React-Core/RCTVibrationHeaders (= 0.61.5)
209 | - ReactCommon/jscallinvoker (0.61.5):
210 | - DoubleConversion
211 | - Folly (= 2018.10.22.00)
212 | - glog
213 | - React-cxxreact (= 0.61.5)
214 | - ReactCommon/turbomodule/core (0.61.5):
215 | - DoubleConversion
216 | - Folly (= 2018.10.22.00)
217 | - glog
218 | - React-Core (= 0.61.5)
219 | - React-cxxreact (= 0.61.5)
220 | - React-jsi (= 0.61.5)
221 | - ReactCommon/jscallinvoker (= 0.61.5)
222 | - RNCMaskedView (0.1.6):
223 | - React
224 | - RNGestureHandler (1.5.3):
225 | - React
226 | - RNLocalize (1.3.2):
227 | - React
228 | - Yoga (1.14.0)
229 |
230 | DEPENDENCIES:
231 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
232 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
233 | - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
234 | - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
235 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
236 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
237 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
238 | - React (from `../node_modules/react-native/`)
239 | - React-Core (from `../node_modules/react-native/`)
240 | - React-Core/DevSupport (from `../node_modules/react-native/`)
241 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
242 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
243 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
244 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
245 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
246 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
247 | - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
248 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
249 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
250 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
251 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
252 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
253 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
254 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
255 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
256 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
257 | - ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`)
258 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
259 | - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
260 | - RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
261 | - RNLocalize (from `../node_modules/react-native-localize`)
262 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
263 |
264 | SPEC REPOS:
265 | https://github.com/CocoaPods/Specs.git:
266 | - boost-for-react-native
267 |
268 | EXTERNAL SOURCES:
269 | DoubleConversion:
270 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
271 | FBLazyVector:
272 | :path: "../node_modules/react-native/Libraries/FBLazyVector"
273 | FBReactNativeSpec:
274 | :path: "../node_modules/react-native/Libraries/FBReactNativeSpec"
275 | Folly:
276 | :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec"
277 | glog:
278 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
279 | RCTRequired:
280 | :path: "../node_modules/react-native/Libraries/RCTRequired"
281 | RCTTypeSafety:
282 | :path: "../node_modules/react-native/Libraries/TypeSafety"
283 | React:
284 | :path: "../node_modules/react-native/"
285 | React-Core:
286 | :path: "../node_modules/react-native/"
287 | React-CoreModules:
288 | :path: "../node_modules/react-native/React/CoreModules"
289 | React-cxxreact:
290 | :path: "../node_modules/react-native/ReactCommon/cxxreact"
291 | React-jsi:
292 | :path: "../node_modules/react-native/ReactCommon/jsi"
293 | React-jsiexecutor:
294 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
295 | React-jsinspector:
296 | :path: "../node_modules/react-native/ReactCommon/jsinspector"
297 | react-native-safe-area-context:
298 | :path: "../node_modules/react-native-safe-area-context"
299 | React-RCTActionSheet:
300 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
301 | React-RCTAnimation:
302 | :path: "../node_modules/react-native/Libraries/NativeAnimation"
303 | React-RCTBlob:
304 | :path: "../node_modules/react-native/Libraries/Blob"
305 | React-RCTImage:
306 | :path: "../node_modules/react-native/Libraries/Image"
307 | React-RCTLinking:
308 | :path: "../node_modules/react-native/Libraries/LinkingIOS"
309 | React-RCTNetwork:
310 | :path: "../node_modules/react-native/Libraries/Network"
311 | React-RCTSettings:
312 | :path: "../node_modules/react-native/Libraries/Settings"
313 | React-RCTText:
314 | :path: "../node_modules/react-native/Libraries/Text"
315 | React-RCTVibration:
316 | :path: "../node_modules/react-native/Libraries/Vibration"
317 | ReactCommon:
318 | :path: "../node_modules/react-native/ReactCommon"
319 | RNCMaskedView:
320 | :path: "../node_modules/@react-native-community/masked-view"
321 | RNGestureHandler:
322 | :path: "../node_modules/react-native-gesture-handler"
323 | RNLocalize:
324 | :path: "../node_modules/react-native-localize"
325 | Yoga:
326 | :path: "../node_modules/react-native/ReactCommon/yoga"
327 |
328 | SPEC CHECKSUMS:
329 | boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
330 | DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
331 | FBLazyVector: aaeaf388755e4f29cd74acbc9e3b8da6d807c37f
332 | FBReactNativeSpec: 118d0d177724c2d67f08a59136eb29ef5943ec75
333 | Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
334 | glog: 1f3da668190260b06b429bb211bfbee5cd790c28
335 | RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1
336 | RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320
337 | React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78
338 | React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04
339 | React-CoreModules: d04f8494c1a328b69ec11db9d1137d667f916dcb
340 | React-cxxreact: d0f7bcafa196ae410e5300736b424455e7fb7ba7
341 | React-jsi: cb2cd74d7ccf4cffb071a46833613edc79cdf8f7
342 | React-jsiexecutor: d5525f9ed5f782fdbacb64b9b01a43a9323d2386
343 | React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0
344 | react-native-safe-area-context: 25260c5d0b9c53fd7aa88e569e2edae72af1f6a3
345 | React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76
346 | React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360
347 | React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72
348 | React-RCTImage: 6b8e8df449eb7c814c99a92d6b52de6fe39dea4e
349 | React-RCTLinking: 121bb231c7503cf9094f4d8461b96a130fabf4a5
350 | React-RCTNetwork: fb353640aafcee84ca8b78957297bd395f065c9a
351 | React-RCTSettings: 8db258ea2a5efee381fcf7a6d5044e2f8b68b640
352 | React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe
353 | React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad
354 | ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd
355 | RNCMaskedView: a88953beefbd347a29072d9eba90e42945fe291e
356 | RNGestureHandler: 02905abe54e1f6e59c081a10b4bd689721e17aa6
357 | RNLocalize: 08eb68476e1f2d8cacd75fa919bf5e219fb03b19
358 | Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b
359 |
360 | PODFILE CHECKSUM: cd5565e9f559d0febd3f8907f34f67664e58662b
361 |
362 | COCOAPODS: 1.8.4
363 |
--------------------------------------------------------------------------------
/ios/ReactNativeStarterKit.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
11 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
12 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
14 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
15 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
16 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
17 | 4A844A777E2CBFF1930B438E /* libPods-ReactNativeStarterKit-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C660CB6F7D6F1059C4240BFD /* libPods-ReactNativeStarterKit-tvOS.a */; };
18 | 5CF2A4ED5720F929B63250DD /* libPods-ReactNativeStarterKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 25109736A1C10ED2E9B49823 /* libPods-ReactNativeStarterKit.a */; };
19 | 9B36D86ADC4811A49CA32149 /* libPods-ReactNativeStarterKitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1406E0750E8D0DF76F1E63A1 /* libPods-ReactNativeStarterKitTests.a */; };
20 | D061883D75884BB38EF80D6F /* ProximaNova-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 4F1EB273FC644B37BB1206EA /* ProximaNova-Regular.otf */; };
21 | D7A50369781FF84FB1DED36C /* libPods-ReactNativeStarterKit-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BAF6391172B01E6B1DAA98B /* libPods-ReactNativeStarterKit-tvOSTests.a */; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXContainerItemProxy section */
25 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
26 | isa = PBXContainerItemProxy;
27 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
28 | proxyType = 1;
29 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
30 | remoteInfo = ReactNativeStarterKit;
31 | };
32 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
35 | proxyType = 1;
36 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
37 | remoteInfo = "ReactNativeStarterKit-tvOS";
38 | };
39 | /* End PBXContainerItemProxy section */
40 |
41 | /* Begin PBXFileReference section */
42 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
43 | 00E356EE1AD99517003FC87E /* ReactNativeStarterKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactNativeStarterKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
44 | 13B07F961A680F5B00A75B9A /* ReactNativeStarterKit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReactNativeStarterKit.app; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ReactNativeStarterKit/AppDelegate.h; sourceTree = ""; };
46 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ReactNativeStarterKit/AppDelegate.m; sourceTree = ""; };
47 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
48 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ReactNativeStarterKit/Images.xcassets; sourceTree = ""; };
49 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ReactNativeStarterKit/Info.plist; sourceTree = ""; };
50 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ReactNativeStarterKit/main.m; sourceTree = ""; };
51 | 1406E0750E8D0DF76F1E63A1 /* libPods-ReactNativeStarterKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeStarterKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
52 | 25109736A1C10ED2E9B49823 /* libPods-ReactNativeStarterKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeStarterKit.a"; sourceTree = BUILT_PRODUCTS_DIR; };
53 | 2D02E47B1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ReactNativeStarterKit-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
54 | 2D02E4901E0B4A5D006451C7 /* ReactNativeStarterKit-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ReactNativeStarterKit-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
55 | 32B33B769C22FEF2250BB768 /* Pods-ReactNativeStarterKit-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit-tvOSTests/Pods-ReactNativeStarterKit-tvOSTests.release.xcconfig"; sourceTree = ""; };
56 | 3BAF6391172B01E6B1DAA98B /* libPods-ReactNativeStarterKit-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeStarterKit-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
57 | 4F1EB273FC644B37BB1206EA /* ProximaNova-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ProximaNova-Regular.otf"; path = "../src/ui/theme/fonts/ProximaNova-Regular.otf"; sourceTree = ""; };
58 | 6CFD40E65EA016590148490C /* Pods-ReactNativeStarterKit-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit-tvOS.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit-tvOS/Pods-ReactNativeStarterKit-tvOS.release.xcconfig"; sourceTree = ""; };
59 | 8385959B4238D87A3C9BBEDA /* Pods-ReactNativeStarterKitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKitTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKitTests/Pods-ReactNativeStarterKitTests.release.xcconfig"; sourceTree = ""; };
60 | 88B2B521E1142C1F242F74DB /* Pods-ReactNativeStarterKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKitTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKitTests/Pods-ReactNativeStarterKitTests.debug.xcconfig"; sourceTree = ""; };
61 | 8FCA91BBAA8A8F78A59857D1 /* Pods-ReactNativeStarterKit-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit-tvOS/Pods-ReactNativeStarterKit-tvOS.debug.xcconfig"; sourceTree = ""; };
62 | 9456AE937081B5434F6593BB /* Pods-ReactNativeStarterKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit/Pods-ReactNativeStarterKit.debug.xcconfig"; sourceTree = ""; };
63 | A6E93484B2099F52A19017C4 /* Pods-ReactNativeStarterKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit/Pods-ReactNativeStarterKit.release.xcconfig"; sourceTree = ""; };
64 | BC17072C38DEA934C3106DB3 /* Pods-ReactNativeStarterKit-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeStarterKit-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeStarterKit-tvOSTests/Pods-ReactNativeStarterKit-tvOSTests.debug.xcconfig"; sourceTree = ""; };
65 | C660CB6F7D6F1059C4240BFD /* libPods-ReactNativeStarterKit-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeStarterKit-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
66 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
67 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
68 | /* End PBXFileReference section */
69 |
70 | /* Begin PBXFrameworksBuildPhase section */
71 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
72 | isa = PBXFrameworksBuildPhase;
73 | buildActionMask = 2147483647;
74 | files = (
75 | 9B36D86ADC4811A49CA32149 /* libPods-ReactNativeStarterKitTests.a in Frameworks */,
76 | );
77 | runOnlyForDeploymentPostprocessing = 0;
78 | };
79 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
80 | isa = PBXFrameworksBuildPhase;
81 | buildActionMask = 2147483647;
82 | files = (
83 | 5CF2A4ED5720F929B63250DD /* libPods-ReactNativeStarterKit.a in Frameworks */,
84 | );
85 | runOnlyForDeploymentPostprocessing = 0;
86 | };
87 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
88 | isa = PBXFrameworksBuildPhase;
89 | buildActionMask = 2147483647;
90 | files = (
91 | 4A844A777E2CBFF1930B438E /* libPods-ReactNativeStarterKit-tvOS.a in Frameworks */,
92 | );
93 | runOnlyForDeploymentPostprocessing = 0;
94 | };
95 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
96 | isa = PBXFrameworksBuildPhase;
97 | buildActionMask = 2147483647;
98 | files = (
99 | D7A50369781FF84FB1DED36C /* libPods-ReactNativeStarterKit-tvOSTests.a in Frameworks */,
100 | );
101 | runOnlyForDeploymentPostprocessing = 0;
102 | };
103 | /* End PBXFrameworksBuildPhase section */
104 |
105 | /* Begin PBXGroup section */
106 | 13B07FAE1A68108700A75B9A /* ReactNativeStarterKit */ = {
107 | isa = PBXGroup;
108 | children = (
109 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
110 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
111 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
112 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
113 | 13B07FB61A68108700A75B9A /* Info.plist */,
114 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
115 | 13B07FB71A68108700A75B9A /* main.m */,
116 | );
117 | name = ReactNativeStarterKit;
118 | sourceTree = "";
119 | };
120 | 1625B2D581CB48959FE9B4A2 /* Resources */ = {
121 | isa = PBXGroup;
122 | children = (
123 | 4F1EB273FC644B37BB1206EA /* ProximaNova-Regular.otf */,
124 | );
125 | name = Resources;
126 | sourceTree = "";
127 | };
128 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
129 | isa = PBXGroup;
130 | children = (
131 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
132 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
133 | 25109736A1C10ED2E9B49823 /* libPods-ReactNativeStarterKit.a */,
134 | C660CB6F7D6F1059C4240BFD /* libPods-ReactNativeStarterKit-tvOS.a */,
135 | 3BAF6391172B01E6B1DAA98B /* libPods-ReactNativeStarterKit-tvOSTests.a */,
136 | 1406E0750E8D0DF76F1E63A1 /* libPods-ReactNativeStarterKitTests.a */,
137 | );
138 | name = Frameworks;
139 | sourceTree = "";
140 | };
141 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
142 | isa = PBXGroup;
143 | children = (
144 | );
145 | name = Libraries;
146 | sourceTree = "";
147 | };
148 | 83CBB9F61A601CBA00E9B192 = {
149 | isa = PBXGroup;
150 | children = (
151 | 13B07FAE1A68108700A75B9A /* ReactNativeStarterKit */,
152 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
153 | 83CBBA001A601CBA00E9B192 /* Products */,
154 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
155 | B62DC8FE081D3944E8709FE0 /* Pods */,
156 | 1625B2D581CB48959FE9B4A2 /* Resources */,
157 | );
158 | indentWidth = 2;
159 | sourceTree = "";
160 | tabWidth = 2;
161 | usesTabs = 0;
162 | };
163 | 83CBBA001A601CBA00E9B192 /* Products */ = {
164 | isa = PBXGroup;
165 | children = (
166 | 13B07F961A680F5B00A75B9A /* ReactNativeStarterKit.app */,
167 | 00E356EE1AD99517003FC87E /* ReactNativeStarterKitTests.xctest */,
168 | 2D02E47B1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS.app */,
169 | 2D02E4901E0B4A5D006451C7 /* ReactNativeStarterKit-tvOSTests.xctest */,
170 | );
171 | name = Products;
172 | sourceTree = "";
173 | };
174 | B62DC8FE081D3944E8709FE0 /* Pods */ = {
175 | isa = PBXGroup;
176 | children = (
177 | 9456AE937081B5434F6593BB /* Pods-ReactNativeStarterKit.debug.xcconfig */,
178 | A6E93484B2099F52A19017C4 /* Pods-ReactNativeStarterKit.release.xcconfig */,
179 | 8FCA91BBAA8A8F78A59857D1 /* Pods-ReactNativeStarterKit-tvOS.debug.xcconfig */,
180 | 6CFD40E65EA016590148490C /* Pods-ReactNativeStarterKit-tvOS.release.xcconfig */,
181 | BC17072C38DEA934C3106DB3 /* Pods-ReactNativeStarterKit-tvOSTests.debug.xcconfig */,
182 | 32B33B769C22FEF2250BB768 /* Pods-ReactNativeStarterKit-tvOSTests.release.xcconfig */,
183 | 88B2B521E1142C1F242F74DB /* Pods-ReactNativeStarterKitTests.debug.xcconfig */,
184 | 8385959B4238D87A3C9BBEDA /* Pods-ReactNativeStarterKitTests.release.xcconfig */,
185 | );
186 | path = Pods;
187 | sourceTree = "";
188 | };
189 | /* End PBXGroup section */
190 |
191 | /* Begin PBXNativeTarget section */
192 | 00E356ED1AD99517003FC87E /* ReactNativeStarterKitTests */ = {
193 | isa = PBXNativeTarget;
194 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ReactNativeStarterKitTests" */;
195 | buildPhases = (
196 | 6CEAA6A661925E43B1048562 /* [CP] Check Pods Manifest.lock */,
197 | 00E356EA1AD99517003FC87E /* Sources */,
198 | 00E356EB1AD99517003FC87E /* Frameworks */,
199 | 00E356EC1AD99517003FC87E /* Resources */,
200 | );
201 | buildRules = (
202 | );
203 | dependencies = (
204 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
205 | );
206 | name = ReactNativeStarterKitTests;
207 | productName = ReactNativeStarterKitTests;
208 | productReference = 00E356EE1AD99517003FC87E /* ReactNativeStarterKitTests.xctest */;
209 | productType = "com.apple.product-type.bundle.unit-test";
210 | };
211 | 13B07F861A680F5B00A75B9A /* ReactNativeStarterKit */ = {
212 | isa = PBXNativeTarget;
213 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit" */;
214 | buildPhases = (
215 | E3382C7BF2766EF1F76F05B7 /* [CP] Check Pods Manifest.lock */,
216 | FD10A7F022414F080027D42C /* Start Packager */,
217 | 13B07F871A680F5B00A75B9A /* Sources */,
218 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
219 | 13B07F8E1A680F5B00A75B9A /* Resources */,
220 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
221 | );
222 | buildRules = (
223 | );
224 | dependencies = (
225 | );
226 | name = ReactNativeStarterKit;
227 | productName = ReactNativeStarterKit;
228 | productReference = 13B07F961A680F5B00A75B9A /* ReactNativeStarterKit.app */;
229 | productType = "com.apple.product-type.application";
230 | };
231 | 2D02E47A1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS */ = {
232 | isa = PBXNativeTarget;
233 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit-tvOS" */;
234 | buildPhases = (
235 | CD72915E66888EBA86AC46BF /* [CP] Check Pods Manifest.lock */,
236 | FD10A7F122414F3F0027D42C /* Start Packager */,
237 | 2D02E4771E0B4A5D006451C7 /* Sources */,
238 | 2D02E4781E0B4A5D006451C7 /* Frameworks */,
239 | 2D02E4791E0B4A5D006451C7 /* Resources */,
240 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
241 | );
242 | buildRules = (
243 | );
244 | dependencies = (
245 | );
246 | name = "ReactNativeStarterKit-tvOS";
247 | productName = "ReactNativeStarterKit-tvOS";
248 | productReference = 2D02E47B1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS.app */;
249 | productType = "com.apple.product-type.application";
250 | };
251 | 2D02E48F1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOSTests */ = {
252 | isa = PBXNativeTarget;
253 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit-tvOSTests" */;
254 | buildPhases = (
255 | A3FB9B7C4CBD7EC9A6D3F0A4 /* [CP] Check Pods Manifest.lock */,
256 | 2D02E48C1E0B4A5D006451C7 /* Sources */,
257 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */,
258 | 2D02E48E1E0B4A5D006451C7 /* Resources */,
259 | );
260 | buildRules = (
261 | );
262 | dependencies = (
263 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
264 | );
265 | name = "ReactNativeStarterKit-tvOSTests";
266 | productName = "ReactNativeStarterKit-tvOSTests";
267 | productReference = 2D02E4901E0B4A5D006451C7 /* ReactNativeStarterKit-tvOSTests.xctest */;
268 | productType = "com.apple.product-type.bundle.unit-test";
269 | };
270 | /* End PBXNativeTarget section */
271 |
272 | /* Begin PBXProject section */
273 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
274 | isa = PBXProject;
275 | attributes = {
276 | LastUpgradeCheck = 940;
277 | ORGANIZATIONNAME = Facebook;
278 | TargetAttributes = {
279 | 00E356ED1AD99517003FC87E = {
280 | CreatedOnToolsVersion = 6.2;
281 | TestTargetID = 13B07F861A680F5B00A75B9A;
282 | };
283 | 2D02E47A1E0B4A5D006451C7 = {
284 | CreatedOnToolsVersion = 8.2.1;
285 | ProvisioningStyle = Automatic;
286 | };
287 | 2D02E48F1E0B4A5D006451C7 = {
288 | CreatedOnToolsVersion = 8.2.1;
289 | ProvisioningStyle = Automatic;
290 | TestTargetID = 2D02E47A1E0B4A5D006451C7;
291 | };
292 | };
293 | };
294 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ReactNativeStarterKit" */;
295 | compatibilityVersion = "Xcode 3.2";
296 | developmentRegion = English;
297 | hasScannedForEncodings = 0;
298 | knownRegions = (
299 | English,
300 | en,
301 | Base,
302 | );
303 | mainGroup = 83CBB9F61A601CBA00E9B192;
304 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
305 | projectDirPath = "";
306 | projectRoot = "";
307 | targets = (
308 | 13B07F861A680F5B00A75B9A /* ReactNativeStarterKit */,
309 | 00E356ED1AD99517003FC87E /* ReactNativeStarterKitTests */,
310 | 2D02E47A1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS */,
311 | 2D02E48F1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOSTests */,
312 | );
313 | };
314 | /* End PBXProject section */
315 |
316 | /* Begin PBXResourcesBuildPhase section */
317 | 00E356EC1AD99517003FC87E /* Resources */ = {
318 | isa = PBXResourcesBuildPhase;
319 | buildActionMask = 2147483647;
320 | files = (
321 | );
322 | runOnlyForDeploymentPostprocessing = 0;
323 | };
324 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
325 | isa = PBXResourcesBuildPhase;
326 | buildActionMask = 2147483647;
327 | files = (
328 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
329 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
330 | D061883D75884BB38EF80D6F /* ProximaNova-Regular.otf in Resources */,
331 | );
332 | runOnlyForDeploymentPostprocessing = 0;
333 | };
334 | 2D02E4791E0B4A5D006451C7 /* Resources */ = {
335 | isa = PBXResourcesBuildPhase;
336 | buildActionMask = 2147483647;
337 | files = (
338 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
339 | );
340 | runOnlyForDeploymentPostprocessing = 0;
341 | };
342 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = {
343 | isa = PBXResourcesBuildPhase;
344 | buildActionMask = 2147483647;
345 | files = (
346 | );
347 | runOnlyForDeploymentPostprocessing = 0;
348 | };
349 | /* End PBXResourcesBuildPhase section */
350 |
351 | /* Begin PBXShellScriptBuildPhase section */
352 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
353 | isa = PBXShellScriptBuildPhase;
354 | buildActionMask = 2147483647;
355 | files = (
356 | );
357 | inputPaths = (
358 | );
359 | name = "Bundle React Native code and images";
360 | outputPaths = (
361 | );
362 | runOnlyForDeploymentPostprocessing = 0;
363 | shellPath = /bin/sh;
364 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
365 | };
366 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
367 | isa = PBXShellScriptBuildPhase;
368 | buildActionMask = 2147483647;
369 | files = (
370 | );
371 | inputPaths = (
372 | );
373 | name = "Bundle React Native Code And Images";
374 | outputPaths = (
375 | );
376 | runOnlyForDeploymentPostprocessing = 0;
377 | shellPath = /bin/sh;
378 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
379 | };
380 | 6CEAA6A661925E43B1048562 /* [CP] Check Pods Manifest.lock */ = {
381 | isa = PBXShellScriptBuildPhase;
382 | buildActionMask = 2147483647;
383 | files = (
384 | );
385 | inputFileListPaths = (
386 | );
387 | inputPaths = (
388 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
389 | "${PODS_ROOT}/Manifest.lock",
390 | );
391 | name = "[CP] Check Pods Manifest.lock";
392 | outputFileListPaths = (
393 | );
394 | outputPaths = (
395 | "$(DERIVED_FILE_DIR)/Pods-ReactNativeStarterKitTests-checkManifestLockResult.txt",
396 | );
397 | runOnlyForDeploymentPostprocessing = 0;
398 | shellPath = /bin/sh;
399 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
400 | showEnvVarsInLog = 0;
401 | };
402 | A3FB9B7C4CBD7EC9A6D3F0A4 /* [CP] Check Pods Manifest.lock */ = {
403 | isa = PBXShellScriptBuildPhase;
404 | buildActionMask = 2147483647;
405 | files = (
406 | );
407 | inputFileListPaths = (
408 | );
409 | inputPaths = (
410 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
411 | "${PODS_ROOT}/Manifest.lock",
412 | );
413 | name = "[CP] Check Pods Manifest.lock";
414 | outputFileListPaths = (
415 | );
416 | outputPaths = (
417 | "$(DERIVED_FILE_DIR)/Pods-ReactNativeStarterKit-tvOSTests-checkManifestLockResult.txt",
418 | );
419 | runOnlyForDeploymentPostprocessing = 0;
420 | shellPath = /bin/sh;
421 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
422 | showEnvVarsInLog = 0;
423 | };
424 | CD72915E66888EBA86AC46BF /* [CP] Check Pods Manifest.lock */ = {
425 | isa = PBXShellScriptBuildPhase;
426 | buildActionMask = 2147483647;
427 | files = (
428 | );
429 | inputFileListPaths = (
430 | );
431 | inputPaths = (
432 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
433 | "${PODS_ROOT}/Manifest.lock",
434 | );
435 | name = "[CP] Check Pods Manifest.lock";
436 | outputFileListPaths = (
437 | );
438 | outputPaths = (
439 | "$(DERIVED_FILE_DIR)/Pods-ReactNativeStarterKit-tvOS-checkManifestLockResult.txt",
440 | );
441 | runOnlyForDeploymentPostprocessing = 0;
442 | shellPath = /bin/sh;
443 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
444 | showEnvVarsInLog = 0;
445 | };
446 | E3382C7BF2766EF1F76F05B7 /* [CP] Check Pods Manifest.lock */ = {
447 | isa = PBXShellScriptBuildPhase;
448 | buildActionMask = 2147483647;
449 | files = (
450 | );
451 | inputFileListPaths = (
452 | );
453 | inputPaths = (
454 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
455 | "${PODS_ROOT}/Manifest.lock",
456 | );
457 | name = "[CP] Check Pods Manifest.lock";
458 | outputFileListPaths = (
459 | );
460 | outputPaths = (
461 | "$(DERIVED_FILE_DIR)/Pods-ReactNativeStarterKit-checkManifestLockResult.txt",
462 | );
463 | runOnlyForDeploymentPostprocessing = 0;
464 | shellPath = /bin/sh;
465 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
466 | showEnvVarsInLog = 0;
467 | };
468 | FD10A7F022414F080027D42C /* Start Packager */ = {
469 | isa = PBXShellScriptBuildPhase;
470 | buildActionMask = 2147483647;
471 | files = (
472 | );
473 | inputFileListPaths = (
474 | );
475 | inputPaths = (
476 | );
477 | name = "Start Packager";
478 | outputFileListPaths = (
479 | );
480 | outputPaths = (
481 | );
482 | runOnlyForDeploymentPostprocessing = 0;
483 | shellPath = /bin/sh;
484 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
485 | showEnvVarsInLog = 0;
486 | };
487 | FD10A7F122414F3F0027D42C /* Start Packager */ = {
488 | isa = PBXShellScriptBuildPhase;
489 | buildActionMask = 2147483647;
490 | files = (
491 | );
492 | inputFileListPaths = (
493 | );
494 | inputPaths = (
495 | );
496 | name = "Start Packager";
497 | outputFileListPaths = (
498 | );
499 | outputPaths = (
500 | );
501 | runOnlyForDeploymentPostprocessing = 0;
502 | shellPath = /bin/sh;
503 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
504 | showEnvVarsInLog = 0;
505 | };
506 | /* End PBXShellScriptBuildPhase section */
507 |
508 | /* Begin PBXSourcesBuildPhase section */
509 | 00E356EA1AD99517003FC87E /* Sources */ = {
510 | isa = PBXSourcesBuildPhase;
511 | buildActionMask = 2147483647;
512 | files = (
513 | );
514 | runOnlyForDeploymentPostprocessing = 0;
515 | };
516 | 13B07F871A680F5B00A75B9A /* Sources */ = {
517 | isa = PBXSourcesBuildPhase;
518 | buildActionMask = 2147483647;
519 | files = (
520 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
521 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
522 | );
523 | runOnlyForDeploymentPostprocessing = 0;
524 | };
525 | 2D02E4771E0B4A5D006451C7 /* Sources */ = {
526 | isa = PBXSourcesBuildPhase;
527 | buildActionMask = 2147483647;
528 | files = (
529 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
530 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
531 | );
532 | runOnlyForDeploymentPostprocessing = 0;
533 | };
534 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = {
535 | isa = PBXSourcesBuildPhase;
536 | buildActionMask = 2147483647;
537 | files = (
538 | );
539 | runOnlyForDeploymentPostprocessing = 0;
540 | };
541 | /* End PBXSourcesBuildPhase section */
542 |
543 | /* Begin PBXTargetDependency section */
544 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
545 | isa = PBXTargetDependency;
546 | target = 13B07F861A680F5B00A75B9A /* ReactNativeStarterKit */;
547 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
548 | };
549 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
550 | isa = PBXTargetDependency;
551 | target = 2D02E47A1E0B4A5D006451C7 /* ReactNativeStarterKit-tvOS */;
552 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
553 | };
554 | /* End PBXTargetDependency section */
555 |
556 | /* Begin PBXVariantGroup section */
557 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
558 | isa = PBXVariantGroup;
559 | children = (
560 | 13B07FB21A68108700A75B9A /* Base */,
561 | );
562 | name = LaunchScreen.xib;
563 | path = ReactNativeStarterKit;
564 | sourceTree = "";
565 | };
566 | /* End PBXVariantGroup section */
567 |
568 | /* Begin XCBuildConfiguration section */
569 | 00E356F61AD99517003FC87E /* Debug */ = {
570 | isa = XCBuildConfiguration;
571 | baseConfigurationReference = 88B2B521E1142C1F242F74DB /* Pods-ReactNativeStarterKitTests.debug.xcconfig */;
572 | buildSettings = {
573 | BUNDLE_LOADER = "$(TEST_HOST)";
574 | GCC_PREPROCESSOR_DEFINITIONS = (
575 | "DEBUG=1",
576 | "$(inherited)",
577 | );
578 | INFOPLIST_FILE = ReactNativeStarterKitTests/Info.plist;
579 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
580 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
581 | OTHER_LDFLAGS = (
582 | "-ObjC",
583 | "-lc++",
584 | "$(inherited)",
585 | );
586 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
587 | PRODUCT_NAME = "$(TARGET_NAME)";
588 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNativeStarterKit.app/ReactNativeStarterKit";
589 | };
590 | name = Debug;
591 | };
592 | 00E356F71AD99517003FC87E /* Release */ = {
593 | isa = XCBuildConfiguration;
594 | baseConfigurationReference = 8385959B4238D87A3C9BBEDA /* Pods-ReactNativeStarterKitTests.release.xcconfig */;
595 | buildSettings = {
596 | BUNDLE_LOADER = "$(TEST_HOST)";
597 | COPY_PHASE_STRIP = NO;
598 | INFOPLIST_FILE = ReactNativeStarterKitTests/Info.plist;
599 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
600 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
601 | OTHER_LDFLAGS = (
602 | "-ObjC",
603 | "-lc++",
604 | "$(inherited)",
605 | );
606 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
607 | PRODUCT_NAME = "$(TARGET_NAME)";
608 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNativeStarterKit.app/ReactNativeStarterKit";
609 | };
610 | name = Release;
611 | };
612 | 13B07F941A680F5B00A75B9A /* Debug */ = {
613 | isa = XCBuildConfiguration;
614 | baseConfigurationReference = 9456AE937081B5434F6593BB /* Pods-ReactNativeStarterKit.debug.xcconfig */;
615 | buildSettings = {
616 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
617 | CURRENT_PROJECT_VERSION = 1;
618 | DEAD_CODE_STRIPPING = NO;
619 | INFOPLIST_FILE = ReactNativeStarterKit/Info.plist;
620 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
621 | OTHER_LDFLAGS = (
622 | "$(inherited)",
623 | "-ObjC",
624 | "-lc++",
625 | );
626 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
627 | PRODUCT_NAME = ReactNativeStarterKit;
628 | VERSIONING_SYSTEM = "apple-generic";
629 | };
630 | name = Debug;
631 | };
632 | 13B07F951A680F5B00A75B9A /* Release */ = {
633 | isa = XCBuildConfiguration;
634 | baseConfigurationReference = A6E93484B2099F52A19017C4 /* Pods-ReactNativeStarterKit.release.xcconfig */;
635 | buildSettings = {
636 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
637 | CURRENT_PROJECT_VERSION = 1;
638 | INFOPLIST_FILE = ReactNativeStarterKit/Info.plist;
639 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
640 | OTHER_LDFLAGS = (
641 | "$(inherited)",
642 | "-ObjC",
643 | "-lc++",
644 | );
645 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
646 | PRODUCT_NAME = ReactNativeStarterKit;
647 | VERSIONING_SYSTEM = "apple-generic";
648 | };
649 | name = Release;
650 | };
651 | 2D02E4971E0B4A5E006451C7 /* Debug */ = {
652 | isa = XCBuildConfiguration;
653 | baseConfigurationReference = 8FCA91BBAA8A8F78A59857D1 /* Pods-ReactNativeStarterKit-tvOS.debug.xcconfig */;
654 | buildSettings = {
655 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
656 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
657 | CLANG_ANALYZER_NONNULL = YES;
658 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
659 | CLANG_WARN_INFINITE_RECURSION = YES;
660 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
661 | DEBUG_INFORMATION_FORMAT = dwarf;
662 | ENABLE_TESTABILITY = YES;
663 | GCC_NO_COMMON_BLOCKS = YES;
664 | INFOPLIST_FILE = "ReactNativeStarterKit-tvOS/Info.plist";
665 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
666 | OTHER_LDFLAGS = (
667 | "$(inherited)",
668 | "-ObjC",
669 | "-lc++",
670 | );
671 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.ReactNativeStarterKit-tvOS";
672 | PRODUCT_NAME = "$(TARGET_NAME)";
673 | SDKROOT = appletvos;
674 | TARGETED_DEVICE_FAMILY = 3;
675 | TVOS_DEPLOYMENT_TARGET = 9.2;
676 | };
677 | name = Debug;
678 | };
679 | 2D02E4981E0B4A5E006451C7 /* Release */ = {
680 | isa = XCBuildConfiguration;
681 | baseConfigurationReference = 6CFD40E65EA016590148490C /* Pods-ReactNativeStarterKit-tvOS.release.xcconfig */;
682 | buildSettings = {
683 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
684 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
685 | CLANG_ANALYZER_NONNULL = YES;
686 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
687 | CLANG_WARN_INFINITE_RECURSION = YES;
688 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
689 | COPY_PHASE_STRIP = NO;
690 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
691 | GCC_NO_COMMON_BLOCKS = YES;
692 | INFOPLIST_FILE = "ReactNativeStarterKit-tvOS/Info.plist";
693 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
694 | OTHER_LDFLAGS = (
695 | "$(inherited)",
696 | "-ObjC",
697 | "-lc++",
698 | );
699 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.ReactNativeStarterKit-tvOS";
700 | PRODUCT_NAME = "$(TARGET_NAME)";
701 | SDKROOT = appletvos;
702 | TARGETED_DEVICE_FAMILY = 3;
703 | TVOS_DEPLOYMENT_TARGET = 9.2;
704 | };
705 | name = Release;
706 | };
707 | 2D02E4991E0B4A5E006451C7 /* Debug */ = {
708 | isa = XCBuildConfiguration;
709 | baseConfigurationReference = BC17072C38DEA934C3106DB3 /* Pods-ReactNativeStarterKit-tvOSTests.debug.xcconfig */;
710 | buildSettings = {
711 | BUNDLE_LOADER = "$(TEST_HOST)";
712 | CLANG_ANALYZER_NONNULL = YES;
713 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
714 | CLANG_WARN_INFINITE_RECURSION = YES;
715 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
716 | DEBUG_INFORMATION_FORMAT = dwarf;
717 | ENABLE_TESTABILITY = YES;
718 | GCC_NO_COMMON_BLOCKS = YES;
719 | INFOPLIST_FILE = "ReactNativeStarterKit-tvOSTests/Info.plist";
720 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
721 | OTHER_LDFLAGS = (
722 | "$(inherited)",
723 | "-ObjC",
724 | "-lc++",
725 | );
726 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.ReactNativeStarterKit-tvOSTests";
727 | PRODUCT_NAME = "$(TARGET_NAME)";
728 | SDKROOT = appletvos;
729 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNativeStarterKit-tvOS.app/ReactNativeStarterKit-tvOS";
730 | TVOS_DEPLOYMENT_TARGET = 10.1;
731 | };
732 | name = Debug;
733 | };
734 | 2D02E49A1E0B4A5E006451C7 /* Release */ = {
735 | isa = XCBuildConfiguration;
736 | baseConfigurationReference = 32B33B769C22FEF2250BB768 /* Pods-ReactNativeStarterKit-tvOSTests.release.xcconfig */;
737 | buildSettings = {
738 | BUNDLE_LOADER = "$(TEST_HOST)";
739 | CLANG_ANALYZER_NONNULL = YES;
740 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
741 | CLANG_WARN_INFINITE_RECURSION = YES;
742 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
743 | COPY_PHASE_STRIP = NO;
744 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
745 | GCC_NO_COMMON_BLOCKS = YES;
746 | INFOPLIST_FILE = "ReactNativeStarterKit-tvOSTests/Info.plist";
747 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
748 | OTHER_LDFLAGS = (
749 | "$(inherited)",
750 | "-ObjC",
751 | "-lc++",
752 | );
753 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.ReactNativeStarterKit-tvOSTests";
754 | PRODUCT_NAME = "$(TARGET_NAME)";
755 | SDKROOT = appletvos;
756 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNativeStarterKit-tvOS.app/ReactNativeStarterKit-tvOS";
757 | TVOS_DEPLOYMENT_TARGET = 10.1;
758 | };
759 | name = Release;
760 | };
761 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
762 | isa = XCBuildConfiguration;
763 | buildSettings = {
764 | ALWAYS_SEARCH_USER_PATHS = NO;
765 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
766 | CLANG_CXX_LIBRARY = "libc++";
767 | CLANG_ENABLE_MODULES = YES;
768 | CLANG_ENABLE_OBJC_ARC = YES;
769 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
770 | CLANG_WARN_BOOL_CONVERSION = YES;
771 | CLANG_WARN_COMMA = YES;
772 | CLANG_WARN_CONSTANT_CONVERSION = YES;
773 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
774 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
775 | CLANG_WARN_EMPTY_BODY = YES;
776 | CLANG_WARN_ENUM_CONVERSION = YES;
777 | CLANG_WARN_INFINITE_RECURSION = YES;
778 | CLANG_WARN_INT_CONVERSION = YES;
779 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
780 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
781 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
782 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
783 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
784 | CLANG_WARN_STRICT_PROTOTYPES = YES;
785 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
786 | CLANG_WARN_UNREACHABLE_CODE = YES;
787 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
788 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
789 | COPY_PHASE_STRIP = NO;
790 | ENABLE_STRICT_OBJC_MSGSEND = YES;
791 | ENABLE_TESTABILITY = YES;
792 | GCC_C_LANGUAGE_STANDARD = gnu99;
793 | GCC_DYNAMIC_NO_PIC = NO;
794 | GCC_NO_COMMON_BLOCKS = YES;
795 | GCC_OPTIMIZATION_LEVEL = 0;
796 | GCC_PREPROCESSOR_DEFINITIONS = (
797 | "DEBUG=1",
798 | "$(inherited)",
799 | );
800 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
801 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
802 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
803 | GCC_WARN_UNDECLARED_SELECTOR = YES;
804 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
805 | GCC_WARN_UNUSED_FUNCTION = YES;
806 | GCC_WARN_UNUSED_VARIABLE = YES;
807 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
808 | MTL_ENABLE_DEBUG_INFO = YES;
809 | ONLY_ACTIVE_ARCH = YES;
810 | SDKROOT = iphoneos;
811 | };
812 | name = Debug;
813 | };
814 | 83CBBA211A601CBA00E9B192 /* Release */ = {
815 | isa = XCBuildConfiguration;
816 | buildSettings = {
817 | ALWAYS_SEARCH_USER_PATHS = NO;
818 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
819 | CLANG_CXX_LIBRARY = "libc++";
820 | CLANG_ENABLE_MODULES = YES;
821 | CLANG_ENABLE_OBJC_ARC = YES;
822 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
823 | CLANG_WARN_BOOL_CONVERSION = YES;
824 | CLANG_WARN_COMMA = YES;
825 | CLANG_WARN_CONSTANT_CONVERSION = YES;
826 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
827 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
828 | CLANG_WARN_EMPTY_BODY = YES;
829 | CLANG_WARN_ENUM_CONVERSION = YES;
830 | CLANG_WARN_INFINITE_RECURSION = YES;
831 | CLANG_WARN_INT_CONVERSION = YES;
832 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
833 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
834 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
835 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
836 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
837 | CLANG_WARN_STRICT_PROTOTYPES = YES;
838 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
839 | CLANG_WARN_UNREACHABLE_CODE = YES;
840 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
841 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
842 | COPY_PHASE_STRIP = YES;
843 | ENABLE_NS_ASSERTIONS = NO;
844 | ENABLE_STRICT_OBJC_MSGSEND = YES;
845 | GCC_C_LANGUAGE_STANDARD = gnu99;
846 | GCC_NO_COMMON_BLOCKS = YES;
847 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
848 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
849 | GCC_WARN_UNDECLARED_SELECTOR = YES;
850 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
851 | GCC_WARN_UNUSED_FUNCTION = YES;
852 | GCC_WARN_UNUSED_VARIABLE = YES;
853 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
854 | MTL_ENABLE_DEBUG_INFO = NO;
855 | SDKROOT = iphoneos;
856 | VALIDATE_PRODUCT = YES;
857 | };
858 | name = Release;
859 | };
860 | /* End XCBuildConfiguration section */
861 |
862 | /* Begin XCConfigurationList section */
863 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ReactNativeStarterKitTests" */ = {
864 | isa = XCConfigurationList;
865 | buildConfigurations = (
866 | 00E356F61AD99517003FC87E /* Debug */,
867 | 00E356F71AD99517003FC87E /* Release */,
868 | );
869 | defaultConfigurationIsVisible = 0;
870 | defaultConfigurationName = Release;
871 | };
872 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit" */ = {
873 | isa = XCConfigurationList;
874 | buildConfigurations = (
875 | 13B07F941A680F5B00A75B9A /* Debug */,
876 | 13B07F951A680F5B00A75B9A /* Release */,
877 | );
878 | defaultConfigurationIsVisible = 0;
879 | defaultConfigurationName = Release;
880 | };
881 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit-tvOS" */ = {
882 | isa = XCConfigurationList;
883 | buildConfigurations = (
884 | 2D02E4971E0B4A5E006451C7 /* Debug */,
885 | 2D02E4981E0B4A5E006451C7 /* Release */,
886 | );
887 | defaultConfigurationIsVisible = 0;
888 | defaultConfigurationName = Release;
889 | };
890 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeStarterKit-tvOSTests" */ = {
891 | isa = XCConfigurationList;
892 | buildConfigurations = (
893 | 2D02E4991E0B4A5E006451C7 /* Debug */,
894 | 2D02E49A1E0B4A5E006451C7 /* Release */,
895 | );
896 | defaultConfigurationIsVisible = 0;
897 | defaultConfigurationName = Release;
898 | };
899 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ReactNativeStarterKit" */ = {
900 | isa = XCConfigurationList;
901 | buildConfigurations = (
902 | 83CBBA201A601CBA00E9B192 /* Debug */,
903 | 83CBBA211A601CBA00E9B192 /* Release */,
904 | );
905 | defaultConfigurationIsVisible = 0;
906 | defaultConfigurationName = Release;
907 | };
908 | /* End XCConfigurationList section */
909 | };
910 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
911 | }
912 |
--------------------------------------------------------------------------------