├── .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 | --------------------------------------------------------------------------------