├── .watchmanconfig ├── .gitattributes ├── index.ios.js ├── index.android.js ├── app.json ├── start_react_native_android.sh ├── rebuild.sh ├── design ├── wireframes.png ├── flexbox layout.png ├── wireframes.sketch ├── react native design V1.002.png ├── react native design V1.003.png └── weatherapp-MainActivity-04262017141529.png ├── fonts ├── NotoSans-Bold.ttf ├── NotoSans-Italic.ttf ├── NotoSans-Regular.ttf └── NotoSans-BoldItalic.ttf ├── android ├── app │ ├── src │ │ └── main │ │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ └── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── assets │ │ │ └── fonts │ │ │ │ ├── Entypo.ttf │ │ │ │ ├── Zocial.ttf │ │ │ │ ├── EvilIcons.ttf │ │ │ │ ├── Ionicons.ttf │ │ │ │ ├── Octicons.ttf │ │ │ │ ├── FontAwesome.ttf │ │ │ │ ├── Foundation.ttf │ │ │ │ ├── MaterialIcons.ttf │ │ │ │ ├── NotoSans-Bold.ttf │ │ │ │ ├── NotoSans-Italic.ttf │ │ │ │ ├── NotoSans-Regular.ttf │ │ │ │ ├── SimpleLineIcons.ttf │ │ │ │ ├── NotoSans-BoldItalic.ttf │ │ │ │ └── MaterialCommunityIcons.ttf │ │ │ ├── java │ │ │ └── com │ │ │ │ └── weatherapp │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── AndroidManifest.xml │ ├── BUCK │ ├── proguard-rules.pro │ └── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── keystores │ ├── debug.keystore.properties │ └── BUCK ├── settings.gradle ├── build.gradle ├── gradle.properties ├── gradlew.bat └── gradlew ├── .babelrc ├── .buckconfig ├── app ├── persistence │ └── FirebaseStuff.js ├── state │ ├── Context.js │ ├── Middlewares.js │ ├── Actions.js │ ├── Types.js │ └── Reducers.js ├── SettingsScreen.js ├── DetailsScreen2.js ├── DetailsScreen1.js ├── navigation │ └── Router.js ├── HomeScreen.js ├── Styles.js └── Data.js ├── android_rage_menu.sh ├── __tests__ ├── index.ios.js └── index.android.js ├── ios ├── WeatherApp │ ├── AppDelegate.h │ ├── main.m │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.m │ ├── Info.plist │ └── Base.lproj │ │ └── LaunchScreen.xib ├── WeatherAppTests │ ├── Info.plist │ └── WeatherAppTests.m ├── WeatherApp-tvOSTests │ └── Info.plist ├── WeatherApp-tvOS │ └── Info.plist └── WeatherApp.xcodeproj │ ├── xcshareddata │ └── xcschemes │ │ ├── WeatherApp.xcscheme │ │ └── WeatherApp-tvOS.xcscheme │ └── project.pbxproj ├── .github └── FUNDING.yml ├── README.md ├── .gitignore ├── package.json ├── TODO.md └── .flowconfig /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import './app/navigation/Router'; -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import './app/navigation/Router'; -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "WeatherApp", 3 | "displayName": "WeatherApp" 4 | } -------------------------------------------------------------------------------- /start_react_native_android.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | react-native run-android 3 | 4 | -------------------------------------------------------------------------------- /rebuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rm -rf node_modules/ && npm i && react-native run-android 3 | -------------------------------------------------------------------------------- /design/wireframes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/wireframes.png -------------------------------------------------------------------------------- /design/flexbox layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/flexbox layout.png -------------------------------------------------------------------------------- /design/wireframes.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/wireframes.sketch -------------------------------------------------------------------------------- /fonts/NotoSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/fonts/NotoSans-Bold.ttf -------------------------------------------------------------------------------- /fonts/NotoSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/fonts/NotoSans-Italic.ttf -------------------------------------------------------------------------------- /fonts/NotoSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/fonts/NotoSans-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | WeatherApp 3 | 4 | -------------------------------------------------------------------------------- /fonts/NotoSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/fonts/NotoSans-BoldItalic.ttf -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "react-native" 4 | ], 5 | "plugins": [ 6 | "transform-decorators-legacy" 7 | ] 8 | } -------------------------------------------------------------------------------- /design/react native design V1.002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/react native design V1.002.png -------------------------------------------------------------------------------- /design/react native design V1.003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/react native design V1.003.png -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /design/weatherapp-MainActivity-04262017141529.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/design/weatherapp-MainActivity-04262017141529.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/NotoSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/NotoSans-Bold.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/NotoSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/NotoSans-Italic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/NotoSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/NotoSans-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SimpleLineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/SimpleLineIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/NotoSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/NotoSans-BoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nazmulidris/react-native-weather/HEAD/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /app/persistence/FirebaseStuff.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | /** 4 | * Firebase stuff will go here soon 5 | * 1) writes to firebase 6 | * 2) listeners to changes in firebase that need to dispatch actions to the redux store 7 | */ 8 | -------------------------------------------------------------------------------- /android_rage_menu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # adb shell am force-stop com.weatherapp 3 | # adb shell am start -n com.weatherapp/com.weatherapp.MainActivity 4 | adb shell input keyevent 82 5 | adb shell input keyevent 46 6 | adb shell input keyevent 66 66 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'WeatherApp' 2 | include ':react-native-vector-icons' 3 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 4 | 5 | include ':app' 6 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 6 | -------------------------------------------------------------------------------- /__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.ios.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /__tests__/index.android.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.android.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/weatherapp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.weatherapp; 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 "WeatherApp"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ios/WeatherApp/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /app/state/Context.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import {applyMiddleware, combineReducers, createStore} from 'redux'; 4 | import {appReducer} from './Reducers'; 5 | import {mainMiddleware} from './Middlewares'; 6 | 7 | /** 8 | * This is where the redux store is created and connected to the initState, the reducer 9 | * and the middleware 10 | */ 11 | 12 | // export the create_store function (call this to create a new store) 13 | export const store = createStore( 14 | combineReducers({ 15 | app: appReducer, 16 | }, 17 | ), 18 | applyMiddleware(mainMiddleware), 19 | ); -------------------------------------------------------------------------------- /ios/WeatherApp/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | mavenLocal() 18 | jcenter() 19 | maven { 20 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 21 | url "$rootDir/../node_modules/react-native/android" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: nazmulidris # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-weather 2 | This project is to explore React Navigation (Drawer, Tab, and Stack Navigators). And explore best practices around styling, design, and collaborating with designers for better UX for building great apps. 3 | Please checkout these tutorials to learn more about this project 4 | - https://developerlife.com/2017/04/15/navigation-and-styling-with-react-native/ 5 | - https://developerlife.com/2017/04/26/flexbox-layouts-and-lists-with-react-native/ 6 | 7 | You can watch a video of the app running below - 8 | 9 | [![Alt text for your video](https://img.youtube.com/vi/gm5tIFRMWX0/0.jpg)](http://www.youtube.com/watch?v=gm5tIFRMWX0) 10 | 11 | [![Alt text for your video](https://img.youtube.com/vi/QGxv8efnkaQ/0.jpg)](http://www.youtube.com/watch?v=QGxv8efnkaQ) 12 | -------------------------------------------------------------------------------- /app/SettingsScreen.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, {Component} from 'react'; 4 | import {StatusBar, Text, View} from 'react-native'; 5 | import * as css from './Styles'; 6 | 7 | export class SettingsScreen extends Component { 8 | 9 | static navigationOptions = { 10 | title: `App Settings`, 11 | }; 12 | 13 | constructor(props) { 14 | super(props); 15 | } 16 | 17 | render() { 18 | const msg1 = `Settings Screen`; 19 | 20 | return ( 21 | 22 | 32 | ); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /ios/WeatherAppTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/WeatherApp-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 | -------------------------------------------------------------------------------- /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.useDeprecatedNdk=true 21 | -------------------------------------------------------------------------------- /ios/WeatherApp/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom": "iphone", 5 | "size": "20x20", 6 | "scale": "2x" 7 | }, 8 | { 9 | "idiom": "iphone", 10 | "size": "20x20", 11 | "scale": "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | } 43 | ], 44 | "info" : { 45 | "version" : 1, 46 | "author" : "xcode" 47 | } 48 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | fastlane/report.xml 52 | fastlane/Preview.html 53 | fastlane/screenshots 54 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "WeatherApp", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest", 8 | "flow": "node_modules/.bin/flow", 9 | "flow-stop": "node_modules/.bin/flow stop" 10 | }, 11 | "dependencies": { 12 | "babel-plugin-transform-decorators-legacy": "^1.3.4", 13 | "lodash": "^4.17.4", 14 | "react": "16.0.0-alpha.6", 15 | "react-native": "0.43.3", 16 | "react-native-elements": "^0.10.3", 17 | "react-native-material-ui": "^1.10.0", 18 | "react-native-vector-icons": "^4.0.1", 19 | "react-navigation": "^1.0.0-beta.9", 20 | "react-redux": "^5.0.4", 21 | "redux": "^3.6.0" 22 | }, 23 | "devDependencies": { 24 | "babel-jest": "19.0.0", 25 | "babel-preset-react-native": "1.9.1", 26 | "flow-bin": "^0.40.0", 27 | "jest": "19.0.2", 28 | "react-test-renderer": "16.0.0-alpha.6" 29 | }, 30 | "jest": { 31 | "preset": "react-native" 32 | }, 33 | "rnpm": { 34 | "assets": [ 35 | "./fonts" 36 | ] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/weatherapp/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.weatherapp; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.react.ReactApplication; 6 | import com.oblador.vectoricons.VectorIconsPackage; 7 | import com.facebook.react.ReactNativeHost; 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.shell.MainReactPackage; 10 | import com.facebook.soloader.SoLoader; 11 | 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | public class MainApplication extends Application implements ReactApplication { 16 | 17 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 18 | @Override 19 | public boolean getUseDeveloperSupport() { 20 | return BuildConfig.DEBUG; 21 | } 22 | 23 | @Override 24 | protected List getPackages() { 25 | return Arrays.asList( 26 | new MainReactPackage(), 27 | new VectorIconsPackage() 28 | ); 29 | } 30 | }; 31 | 32 | @Override 33 | public ReactNativeHost getReactNativeHost() { 34 | return mReactNativeHost; 35 | } 36 | 37 | @Override 38 | public void onCreate() { 39 | super.onCreate(); 40 | SoLoader.init(this, /* native exopackage */ false); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/state/Middlewares.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import * as actions from './Actions'; 4 | import type * as Types from './Types'; 5 | 6 | /** 7 | * main_middleware responds to all the action names that begin with "request". 8 | * 9 | * It writes to Firebase, and that triggers Firebase listeners to fire 10 | * actions that are processed by the main_reducer (in Reducers.js). 11 | * 12 | * more info (middleware) - https://goo.gl/ZSeGji 13 | * more info (currying syntax) - https://goo.gl/Y2kEkq 14 | */ 15 | export const mainMiddleware = function (store) { 16 | return function (next) { 17 | return function (action: Types.Action) { 18 | if (action.type === actions.TYPES.request_refresh_weather_data) { 19 | requestRefreshWeatherData(action.payload); 20 | } 21 | else if (action.type === actions.TYPES.request_add_to_watchlist) { 22 | requestAddToWatchlist(action.payload); 23 | } 24 | else { 25 | return next(action); // must return this in order to invoke reducer functions 26 | } 27 | 28 | }; 29 | }; 30 | }; 31 | 32 | /** 33 | * todo save the watchlist to firebase 34 | */ 35 | function requestAddToWatchlist(location: string): void { 36 | } 37 | 38 | /** 39 | * todo cause the weather to be refreshed server side 40 | */ 41 | function requestRefreshWeatherData(userid: string): void { 42 | } -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | Project goals 2 | ============= 3 | - Build a weather app that showcases react navigation and redux state machine. 4 | - Create a backend to serve JSON weather data to app. 5 | - Backend choice 1 - Firebase functions 6 | - Backend choice 2 - Node.js and Express on Heroku 7 | - Integrate with Firebase for persistence and offline storage needs. 8 | 9 | Open links 10 | ========== 11 | - [R Color Picker](https://casesandberg.github.io/react-color/) 12 | - [RN Vector Icons](https://oblador.github.io/react-native-vector-icons/) 13 | - [RN Elements UI toolkit](https://github.com/react-native-training/react-native-elements#components-included) 14 | - [RN Vector Icons](https://github.com/oblador/react-native-vector-icons#bundled-icon-sets) 15 | 16 | Docs 17 | ==== 18 | - [Doc - App arch, redux, backend](https://goo.gl/QfbSHV) 19 | - [Doc - Notes on RN, backend](https://goo.gl/Be1WVh) 20 | 21 | Next steps 22 | ========== 23 | 24 | - Research firebase functions vs. node.js server & make the fake list 25 |   data remote 26 | - Swap the fake data with real data for the hardcoded locations 27 | - Add functionality in the app to do a place search and generate a WGRS 28 |   value that will be added to the watchlist of location 29 | 30 | Related projects 31 | ================ 32 | - [Firebase Functions backend test](https://github.com/nazmulidris/firebase-functions-react-native-weather/blob/master/TODO.md) 33 | - [Node and Express backend test](https://github.com/r3bl-alliance/endpoint_learning/blob/master/TODO.md) -------------------------------------------------------------------------------- /ios/WeatherApp/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import 13 | #import 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"WeatherApp" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | experimental.strict_type_args=true 30 | 31 | munge_underscores=true 32 | 33 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 34 | 35 | suppress_type=$FlowIssue 36 | suppress_type=$FlowFixMe 37 | suppress_type=$FixMe 38 | 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 41 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 42 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 43 | 44 | unsafe.enable_getters_and_setters=true 45 | 46 | [version] 47 | ^0.40.0 48 | -------------------------------------------------------------------------------- /app/DetailsScreen2.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, {Component} from 'react'; 4 | import {FlatList, Text, View} from 'react-native'; 5 | import * as css from './Styles'; 6 | import {Icon} from 'react-native-elements'; 7 | 8 | export class DetailsScreen2 extends Component { 9 | 10 | static navigationOptions = { 11 | title: `WEEKLY`, 12 | }; 13 | 14 | constructor(props) { 15 | super(props); 16 | } 17 | 18 | renderRow({item}) { 19 | 20 | let {day, icon, key, temp} = item; 21 | const {iconName, iconFont, iconColor} = icon; 22 | temp = css.addDegreesToEnd(temp); 23 | 24 | return ( 25 | 26 | {day} 27 | 29 | {temp} 30 | 31 | ); 32 | 33 | } 34 | 35 | render() { 36 | 37 | const {currentTemp, icon, key, place, time, weeklyForecast} = 38 | this.props.navigation.state.params; 39 | 40 | const {iconName, iconFont, iconColor} = icon; 41 | 42 | return ( 43 | 44 | {place} 45 | 51 | 52 | ); 53 | 54 | } 55 | 56 | } -------------------------------------------------------------------------------- /ios/WeatherApp-tvOS/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /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 | lib_deps = [] 12 | 13 | for jarfile in glob(['libs/*.jar']): 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 | 21 | for aarfile in glob(['libs/*.aar']): 22 | name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] 23 | lib_deps.append(':' + name) 24 | android_prebuilt_aar( 25 | name = name, 26 | aar = aarfile, 27 | ) 28 | 29 | android_library( 30 | name = "all-libs", 31 | exported_deps = lib_deps, 32 | ) 33 | 34 | android_library( 35 | name = "app-code", 36 | srcs = glob([ 37 | "src/main/java/**/*.java", 38 | ]), 39 | deps = [ 40 | ":all-libs", 41 | ":build_config", 42 | ":res", 43 | ], 44 | ) 45 | 46 | android_build_config( 47 | name = "build_config", 48 | package = "com.weatherapp", 49 | ) 50 | 51 | android_resource( 52 | name = "res", 53 | package = "com.weatherapp", 54 | res = "src/main/res", 55 | ) 56 | 57 | android_binary( 58 | name = "app", 59 | keystore = "//android/keystores:debug", 60 | manifest = "src/main/AndroidManifest.xml", 61 | package_type = "debug", 62 | deps = [ 63 | ":app-code", 64 | ], 65 | ) 66 | -------------------------------------------------------------------------------- /app/DetailsScreen1.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, {Component} from 'react'; 4 | import {FlatList, Text, View} from 'react-native'; 5 | import {Icon} from 'react-native-elements'; 6 | 7 | import * as css from './Styles'; 8 | 9 | export class DetailsScreen1 extends Component { 10 | 11 | static navigationOptions = { 12 | title: `TODAY`, 13 | }; 14 | 15 | constructor(props) { 16 | super(props); 17 | } 18 | 19 | renderRow({item}) { 20 | 21 | let {key, time, icon, temp} = item; 22 | 23 | const {iconName, iconFont, iconColor} = icon; 24 | 25 | temp = css.addDegreesToEnd(temp); 26 | 27 | return ( 28 | 29 | {time} 30 | 32 | {temp} 33 | 34 | ); 35 | } 36 | 37 | render() { 38 | 39 | const {description, currentTemp, icon, key, place, time, dailyForecast} = 40 | this.props.navigation.state.params; 41 | 42 | const {iconName, iconFont, iconColor} = icon; 43 | 44 | const temp = css.addDegreesToEnd(currentTemp); 45 | 46 | return ( 47 | 48 | {place} 49 | {description} 50 | 52 | {temp} 53 | 54 | 59 | 60 | ); 61 | 62 | } 63 | 64 | } -------------------------------------------------------------------------------- /app/state/Actions.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import type * as Types from './Types'; 4 | import * as _ from 'lodash'; 5 | 6 | /** 7 | * All things related to the Actions are stored in this file. 8 | * 9 | * TYPES - this is an enumeration of all the different types of actions in the app 10 | * VERBS - this contains a set of actions that can be dispatched. Internally, each 11 | * verb has a function in this file which generates it's action object. 12 | */ 13 | 14 | // 15 | // enumeration of all the kinds of action 16 | // 17 | 18 | export const TYPES = { 19 | request_refresh_weather_data: 0, 20 | request_add_to_watchlist : 1, 21 | set_watchlist : 2, 22 | set_weather_data : 3, 23 | set_user_object : 4, 24 | }; 25 | 26 | // 27 | // action function for each type of action 28 | // 29 | 30 | export function request_refresh_weather_data_action(userid: string): Types.Action { 31 | return { 32 | type : TYPES.request_refresh_weather_data, 33 | payload: userid, 34 | }; 35 | } 36 | 37 | export function request_add_to_watchlist_action(location: string): Types.Action { 38 | return { 39 | type : TYPES.request_add_to_watchlist, 40 | payload: location, 41 | }; 42 | } 43 | 44 | export function set_watch_action(locations: Array): Types.Action { 45 | return { 46 | type : TYPES.set_watchlist, 47 | payload: locations, 48 | }; 49 | } 50 | 51 | export function set_weather_data_action(weatherreports: WeatherReports): Types.Action { 52 | return { 53 | type : TYPES.set_weather_data, 54 | payload: weatherreports, 55 | }; 56 | } 57 | 58 | export function set_user_object_action(user: User): Types.Action { 59 | let retval = {}; 60 | if (_.isNil(user)) { 61 | // this is for debug purposes only! 62 | retval = { 63 | type : TYPES.set_user_object, 64 | payload: { 65 | isAnon : false, 66 | name : Math.random().toString(36).substring(7), 67 | userid : Math.random().toString(36).substring(7), 68 | profilePictureUrl: Math.random().toString(36).substring(7), 69 | }, 70 | }; 71 | } 72 | else { 73 | retval = { 74 | type : TYPES.set_user_object, 75 | payload: user, 76 | }; 77 | } 78 | return retval; 79 | } -------------------------------------------------------------------------------- /ios/WeatherAppTests/WeatherAppTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | 13 | #import 14 | #import 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface WeatherAppTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation WeatherAppTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /app/state/Types.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | /* 4 | more info on flow & redux 5 | - https://goo.gl/jPgimk 6 | 7 | more info on flow 8 | - https://flow.org/en/docs/types/arrays/ 9 | - https://flow.org/en/docs/types/aliases/ 10 | - https://flow.org/en/docs/types/interfaces/ 11 | 12 | test the code here 13 | - https://flow.org/try/ 14 | 15 | sample code that I wrote 16 | - https://goo.gl/3wYVfw 17 | */ 18 | 19 | // 20 | // types 21 | // 22 | 23 | export type Action = { 24 | type: number, 25 | payload: any, 26 | } 27 | 28 | export type State = { 29 | app: AppState, 30 | } 31 | 32 | export type AppState = { 33 | user: User, 34 | locations: LocationWatchList, 35 | reports: WeatherReports, 36 | } 37 | 38 | export type User = { 39 | isAnon: boolean, 40 | name: string, 41 | userid: string, 42 | profilePictureUrl: string, 43 | } 44 | 45 | export type LocationWatchList = Array; 46 | 47 | export type WeatherReports = Array; 48 | 49 | export type WeatherReport = { 50 | location: string, 51 | current: CurrentConditions, 52 | forecast: WeeklyForecast, 53 | } 54 | 55 | export type CurrentConditions = { 56 | temp: number, 57 | humidity: number, 58 | wind: number, 59 | uvindex: number, 60 | sunrise: number, 61 | sunset: number, 62 | } 63 | 64 | export type WeeklyForecast = { 65 | days: Array, 66 | } 67 | 68 | export type DailyForecast = { 69 | day: string, 70 | hi: number, 71 | lo: number, 72 | } 73 | 74 | // 75 | // objects 76 | // 77 | 78 | let initState: State = { 79 | user : null, 80 | locations: null, 81 | reports : null, 82 | }; 83 | 84 | let myUser: User = { 85 | isAnon : true, 86 | name : 'naz', 87 | userid : '123', 88 | profilePictureUrl: 'http://boo', 89 | }; 90 | 91 | let myLocations: LocationWatchList = ['12', '13', '14']; 92 | 93 | let myReports: WeatherReports = 94 | [ 95 | { 96 | location: '12', 97 | current : { 98 | temp : 12, 99 | humidity: 80, 100 | wind : 3, 101 | uvindex : 5, 102 | sunrise : 12, 103 | sunset : 18, 104 | }, 105 | forecast: { 106 | days: [ 107 | { 108 | day: 'mon', 109 | hi : 70, 110 | lo : 60, 111 | }, 112 | ], 113 | }, 114 | }, 115 | ]; -------------------------------------------------------------------------------- /ios/WeatherApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | WeatherApp 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 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 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UIViewControllerBasedStatusBarAppearance 40 | 41 | NSLocationWhenInUseUsageDescription 42 | 43 | NSAppTransportSecurity 44 | 45 | NSExceptionDomains 46 | 47 | localhost 48 | 49 | NSExceptionAllowsInsecureHTTPLoads 50 | 51 | 52 | 53 | 54 | UIAppFonts 55 | 56 | NotoSans-Bold.ttf 57 | NotoSans-BoldItalic.ttf 58 | NotoSans-Italic.ttf 59 | NotoSans-Regular.ttf 60 | Entypo.ttf 61 | EvilIcons.ttf 62 | FontAwesome.ttf 63 | Foundation.ttf 64 | Ionicons.ttf 65 | MaterialCommunityIcons.ttf 66 | MaterialIcons.ttf 67 | Octicons.ttf 68 | SimpleLineIcons.ttf 69 | Zocial.ttf 70 | 71 | 72 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /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 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Disabling obfuscation is useful if you collect stack traces from production crashes 20 | # (unless you are using a system that supports de-obfuscate the stack traces). 21 | -dontobfuscate 22 | 23 | # React Native 24 | 25 | # Keep our interfaces so they can be used by other ProGuard rules. 26 | # See http://sourceforge.net/p/proguard/bugs/466/ 27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip 28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters 29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip 30 | 31 | # Do not strip any method/class that is annotated with @DoNotStrip 32 | -keep @com.facebook.proguard.annotations.DoNotStrip class * 33 | -keep @com.facebook.common.internal.DoNotStrip class * 34 | -keepclassmembers class * { 35 | @com.facebook.proguard.annotations.DoNotStrip *; 36 | @com.facebook.common.internal.DoNotStrip *; 37 | } 38 | 39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { 40 | void set*(***); 41 | *** get*(); 42 | } 43 | 44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } 45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; } 46 | -keepclassmembers,includedescriptorclasses class * { native ; } 47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } 48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } 49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } 50 | 51 | -dontwarn com.facebook.react.** 52 | 53 | # okhttp 54 | 55 | -keepattributes Signature 56 | -keepattributes *Annotation* 57 | -keep class okhttp3.** { *; } 58 | -keep interface okhttp3.** { *; } 59 | -dontwarn okhttp3.** 60 | 61 | # okio 62 | 63 | -keep class sun.misc.Unsafe { *; } 64 | -dontwarn java.nio.file.* 65 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 66 | -dontwarn okio.** 67 | -------------------------------------------------------------------------------- /app/state/Reducers.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import type * as Types from './Types'; 4 | import * as actions from './Actions'; 5 | import {ToastAndroid} from 'react-native'; 6 | import * as _ from 'lodash'; 7 | 8 | // todo define the empty startup state by creating a const for an empty user object 9 | const EMPTY_USER: User = { 10 | isAnon : true, 11 | name : 'anonymous', 12 | userid : '123', 13 | profilePictureUrl: 'http://123.com/', 14 | }; 15 | const INIT_STATE: AppState = { 16 | user : EMPTY_USER, 17 | locations: [], 18 | reports : [], 19 | }; 20 | 21 | /** 22 | * main_reducer is responsible for processing state changes for all the action names that 23 | * start with "set". 24 | * 25 | * more info - https://goo.gl/JdPDWJ 26 | */ 27 | export const appReducer = (state: Types.AppState = INIT_STATE, 28 | action: Types.Action, 29 | ): Types.AppState => { 30 | switch (action.type) { 31 | case actions.TYPES.set_watchlist: { 32 | return setWatchlist(state, action.payload); 33 | } 34 | case actions.TYPES.set_weather_data: { 35 | return setWeatherData(state, action.payload); 36 | } 37 | case actions.TYPES.set_user_object: { 38 | return setUserObject(state, action.payload); 39 | } 40 | } 41 | // in case nothing matched, just return the old state 42 | return state; 43 | }; 44 | 45 | /** 46 | * generate a new state given the new watchlist 47 | */ 48 | function setWatchlist(state: Types.AppState, 49 | locations: LocationWatchList, 50 | ): Types.AppState { 51 | ToastAndroid.show("REDUCER: SET WATCH LIST", ToastAndroid.SHORT); 52 | return { 53 | ...state, 54 | locations: _.cloneDeep(locations), 55 | }; 56 | } 57 | 58 | /** 59 | * Generate a new state given the new reports. 60 | * 61 | * The weather data has to be deep cloned since FlatList is a PureComponent and only 62 | * does a shallow compare ... meaning that if a deep clone isn't done then it won't 63 | * register that the data has changed and the UI won't update! 64 | * 65 | * More info: 66 | * https://lodash.com/docs/4.17.4#cloneDeep 67 | * https://stackoverflow.com/questions/43397803/how-to-re-render-flatlist/43398395 68 | */ 69 | function setWeatherData(state: Types.AppState, reports: WeatherReports) { 70 | ToastAndroid.show("REDUCER: SET WEATHER DATA", ToastAndroid.SHORT); 71 | return { 72 | ...state, 73 | reports: _.cloneDeep(reports), 74 | }; 75 | } 76 | 77 | /** 78 | * generate a new state given the new user 79 | */ 80 | function setUserObject(state: Types.AppState, user: User) { 81 | ToastAndroid.show("REDUCER: SET USER OBJECT", ToastAndroid.SHORT); 82 | return { 83 | ...state, // syntax : http://es6-features.org/#SpreadOperator 84 | user: _.cloneDeep(user), // syntax : http://es6-features.org/#PropertyShorthand 85 | }; 86 | } -------------------------------------------------------------------------------- /ios/WeatherApp/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 | -------------------------------------------------------------------------------- /app/navigation/Router.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, {Component} from 'react'; 4 | import {AppRegistry, ScrollView, Text, View} from 'react-native'; 5 | import { 6 | DrawerItems, 7 | DrawerNavigator, 8 | StackNavigator, 9 | TabNavigator 10 | } from 'react-navigation'; 11 | import {HomeScreen} from '../HomeScreen'; 12 | import {DetailsScreen1} from '../DetailsScreen1'; 13 | import {DetailsScreen2} from '../DetailsScreen2'; 14 | import {SettingsScreen} from '../SettingsScreen'; 15 | import * as css from '../Styles'; 16 | import {Icon} from 'react-native-elements'; 17 | import {Provider} from 'react-redux'; 18 | import {store} from '../state/Context'; 19 | 20 | /** 21 | * This is where the navigation hierarchy for the app is setup using DrawerNavigator, 22 | * StackNavigator, and TabNavigator. 23 | * 24 | * The Redux store is also wired into the Provider, which sits at the root of the view 25 | * hierarchy. 26 | */ 27 | 28 | // 29 | // TABS 30 | // 31 | 32 | const NavTab = TabNavigator( 33 | // route config 34 | { 35 | DetailsRoute1: {screen: DetailsScreen1}, 36 | DetailsRoute2: {screen: DetailsScreen2}, 37 | }, 38 | // navigator config 39 | { 40 | lazyLoad : false, // render the tabs lazily 41 | tabBarPosition: 'bottom', // where are the tabs shown 42 | backBehavior : 'none', // back button doesn't take you to the initial tab 43 | tabBarOptions : css.tabs, 44 | }, 45 | ); 46 | 47 | // 48 | // STACK 49 | // 50 | 51 | const titleAndIcon = 52 | 53 | 54 | Weather App 55 | ; 56 | 57 | const NavStack = StackNavigator( 58 | // route config 59 | { 60 | HomeRoute : {screen: HomeScreen}, // this is displayed first 61 | DetailsRoute: {screen: NavTab}, 62 | }, 63 | // navigator config 64 | { 65 | //headerMode: 'none', // this removes the navigation header 66 | navigationOptions: { 67 | // labe l text 68 | headerTitle: titleAndIcon, 69 | // other styling 70 | ...css.header, 71 | }, 72 | }, 73 | ); 74 | 75 | // 76 | // DRAWER 77 | // 78 | 79 | /** 80 | * drawer ... more info https://goo.gl/2Dnmtl 81 | */ 82 | const customDrawerComponent = (props) => 83 | 88 | 89 | ; 90 | 91 | /** 92 | * more info on why this variable name must begin with CAPITAL letters due to JSX syntax 93 | * https://goo.gl/nGRaAl 94 | */ 95 | const NavDrawer = DrawerNavigator( 96 | // route config 97 | { 98 | HomeRoute : { 99 | screen : NavStack, 100 | navigationOptions: { 101 | drawerLabel: 'Main App', 102 | drawerIcon : ({tintColor}) => , 103 | }, 104 | }, 105 | SettingsRoute: { 106 | screen : SettingsScreen, 107 | navigationOptions: { 108 | drawerLabel: 'Settings', 109 | drawerIcon : ({tintColor}) => , 110 | }, 111 | }, 112 | }, 113 | // navigator config 114 | { 115 | contentComponent: customDrawerComponent, 116 | drawerPosition : 'left', 117 | // styling for for DrawerView.Items in contentOptions 118 | contentOptions : css.drawer, 119 | }, 120 | ); 121 | 122 | /** 123 | * Place the Provider at the root of the view hierarchy for Redux. 124 | * 125 | * Note that JSX syntax requires the name to start with an uppercase letter! 126 | * more info - https://goo.gl/nGRaAl 127 | */ 128 | class Root extends Component { 129 | render() { 130 | return ( 131 | 132 | 133 | 134 | ); 135 | } 136 | } 137 | 138 | // wire the WeatherApp to the AppRegistry 139 | AppRegistry.registerComponent('WeatherApp', () => Root); -------------------------------------------------------------------------------- /ios/WeatherApp.xcodeproj/xcshareddata/xcschemes/WeatherApp.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/WeatherApp.xcodeproj/xcshareddata/xcschemes/WeatherApp-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 bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /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 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // the root of your project, i.e. where "package.json" lives 37 | * root: "../../", 38 | * 39 | * // where to put the JS bundle asset in debug mode 40 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 41 | * 42 | * // where to put the JS bundle asset in release mode 43 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 44 | * 45 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 46 | * // require('./image.png')), in debug mode 47 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 48 | * 49 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 50 | * // require('./image.png')), in release mode 51 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 52 | * 53 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 54 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 55 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 56 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 57 | * // for example, you might want to remove it from here. 58 | * inputExcludes: ["android/**", "ios/**"], 59 | * 60 | * // override which node gets called and with what additional arguments 61 | * nodeExecutableAndArgs: ["node"] 62 | * 63 | * // supply additional arguments to the packager 64 | * extraPackagerArgs: [] 65 | * ] 66 | */ 67 | 68 | apply from: "../../node_modules/react-native/react.gradle" 69 | 70 | /** 71 | * Set this to true to create two separate APKs instead of one: 72 | * - An APK that only works on ARM devices 73 | * - An APK that only works on x86 devices 74 | * The advantage is the size of the APK is reduced by about 4MB. 75 | * Upload all the APKs to the Play Store and people will download 76 | * the correct one based on the CPU architecture of their device. 77 | */ 78 | def enableSeparateBuildPerCPUArchitecture = false 79 | 80 | /** 81 | * Run Proguard to shrink the Java bytecode in release builds. 82 | */ 83 | def enableProguardInReleaseBuilds = false 84 | 85 | android { 86 | compileSdkVersion 23 87 | buildToolsVersion "23.0.1" 88 | 89 | defaultConfig { 90 | applicationId "com.weatherapp" 91 | minSdkVersion 16 92 | targetSdkVersion 22 93 | versionCode 1 94 | versionName "1.0" 95 | ndk { 96 | abiFilters "armeabi-v7a", "x86" 97 | } 98 | } 99 | splits { 100 | abi { 101 | reset() 102 | enable enableSeparateBuildPerCPUArchitecture 103 | universalApk false // If true, also generate a universal APK 104 | include "armeabi-v7a", "x86" 105 | } 106 | } 107 | buildTypes { 108 | release { 109 | minifyEnabled enableProguardInReleaseBuilds 110 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 111 | } 112 | } 113 | // applicationVariants are e.g. debug, release 114 | applicationVariants.all { variant -> 115 | variant.outputs.each { output -> 116 | // For each separate APK per architecture, set a unique version code as described here: 117 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 118 | def versionCodes = ["armeabi-v7a":1, "x86":2] 119 | def abi = output.getFilter(OutputFile.ABI) 120 | if (abi != null) { // null for the universal-debug, universal-release variants 121 | output.versionCodeOverride = 122 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 123 | } 124 | } 125 | } 126 | } 127 | 128 | dependencies { 129 | compile project(':react-native-vector-icons') 130 | compile fileTree(dir: "libs", include: ["*.jar"]) 131 | compile "com.android.support:appcompat-v7:23.0.1" 132 | compile "com.facebook.react:react-native:+" // From node_modules 133 | } 134 | 135 | // Run this once to be able to run the application with BUCK 136 | // puts all compile dependencies into folder libs for BUCK to use 137 | task copyDownloadableDepsToLibs(type: Copy) { 138 | from configurations.compile 139 | into 'libs' 140 | } 141 | -------------------------------------------------------------------------------- /app/HomeScreen.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, {Component} from 'react'; 4 | import { 5 | FlatList, 6 | StatusBar, 7 | Text, 8 | TouchableHighlight, 9 | TouchableNativeFeedback, 10 | View, 11 | } from 'react-native'; 12 | import {ActionButton, COLOR, ThemeProvider} from 'react-native-material-ui'; 13 | import {Icon} from 'react-native-elements'; 14 | import * as css from './Styles'; 15 | import {listData} from './Data'; 16 | import {connect} from 'react-redux'; 17 | import * as actions from './state/Actions'; 18 | import {store} from './state/Context'; 19 | 20 | // 21 | // NOTE - if you don't use @connect ... 22 | // 23 | // /* 24 | // * mapStateToProps & mapDispatchToProps more info: 25 | // * http://www.sohamkamani.com/blog/2017/03/31/react-redux-connect-explained/ 26 | // * https://goo.gl/VNQAOZ 27 | // */ 28 | // const mapStateToProps = (state) => { 29 | // return {app: state.app}; 30 | // }; 31 | // 32 | // const mapDispatchToProps = (dispatch) => { 33 | // return bindActionCreators(actions, dispatch); 34 | // }; 35 | // 36 | // // exports HomeScreen as the connected component 37 | // // more info - http://redux.js.org/docs/basics/UsageWithReact.html 38 | // export const ConnectedHomeScreen = 39 | // connect(mapStateToProps, mapDispatchToProps) 40 | // (HomeScreen); 41 | // 42 | 43 | /** 44 | * This React component is bound to the Redux store. Redux Provider saves the redux store 45 | * in the Component.Context, which is then available to any React Component that is 46 | * wired up to Redux using @connect. 47 | */ 48 | @connect( 49 | (state) => { 50 | return {app: state.app}; 51 | }, 52 | ) 53 | export class HomeScreen extends Component { 54 | 55 | // reference to redux dispatch function 56 | _dispatchFunction; 57 | 58 | // reference to navigator 59 | _navigation; 60 | 61 | // only renders each list item 62 | renderRow({item}) { 63 | 64 | const time = `${item.time}`; 65 | const place = `${item.place}`; 66 | const temp = css.addDegreesToEnd(item.currentTemp); 67 | const {iconName, iconFont, iconColor} = item.icon; 68 | 69 | let actualRowComponent = 70 | 71 | 72 | {time} 73 | {place} 74 | 75 | 77 | {temp} 78 | ; 79 | 80 | // fixed animation bug that didn't allow ripples to be drawn on UI component 81 | // https://johnresig.com/blog/how-javascript-timers-work/ 82 | // https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Timers 83 | let pressed = () => { 84 | setTimeout(() => { 85 | this._navigation.navigate('DetailsRoute', {...item}); 86 | }, 100); 87 | }; 88 | 89 | let touchableWrapperIos = 90 | 94 | {actualRowComponent} 95 | ; 96 | 97 | let touchableWrapperAndroid = 98 | 102 | {actualRowComponent} 103 | ; 104 | 105 | if (require('react-native').Platform.OS === 'ios') { 106 | return touchableWrapperIos; 107 | } 108 | else { 109 | return touchableWrapperAndroid; 110 | } 111 | 112 | }; 113 | 114 | /** 115 | * Set up the landing screen of the app. This component uses 116 | * react-native-material-ui and it sets up a theme object for this library that is 117 | * passed at the root using a ThemeProvider. 118 | */ 119 | render() { 120 | 121 | const {app} = this.props; 122 | 123 | _dispatchFunction = this.props.dispatch; 124 | _navigation = this.props.navigation; 125 | 126 | const uiTheme = { 127 | palette: { 128 | primaryColor: COLOR.green500, 129 | }, 130 | }; 131 | 132 | // DEBUG-START 133 | // let debugMsg; 134 | // try { 135 | // debugMsg = `#Reports ${app.reports.length}`; 136 | // console.log(":: HomeScreen.render ::"); 137 | // // console.log(JSON.stringify(app.reports, null, '\t')); 138 | // console.log(app); 139 | // } 140 | // catch (e) { 141 | // debugMsg = 'No data set in state'; 142 | // } 143 | // DEBUG-END 144 | 145 | 146 | return ( 147 | 148 | 149 | 169 | 170 | ); 171 | 172 | }// end render() 173 | 174 | actionButtonPressed() { 175 | 176 | let path: number = 1; 177 | 178 | if (path === 0) { 179 | 180 | // This was just to test the set user object action 181 | this._dispatchFunction(actions.set_user_object_action(null)); 182 | 183 | } 184 | else if (path === 1) { 185 | 186 | // This is just mocked up so that it feeds the mock data to the app one row at a 187 | // time 188 | try { 189 | 190 | let app = store.getState().app; 191 | let reports = app.reports; 192 | let numOfCurrentReports = reports.length; 193 | if (numOfCurrentReports === listData.length) { 194 | // noop 195 | } 196 | else { 197 | // add another item to the stack 198 | let report = listData[numOfCurrentReports]; 199 | reports.push(report); 200 | this._dispatchFunction(actions.set_weather_data_action(reports)); 201 | } 202 | 203 | } 204 | catch (e) { 205 | console.log(e); 206 | } 207 | 208 | } 209 | else if (path === 2) { 210 | 211 | // Interact with the cloud to get fake weather data into the app ... instead of 212 | // directly setting weather data (as done above) 213 | 214 | } 215 | 216 | } 217 | 218 | }// end class HomeScreen -------------------------------------------------------------------------------- /app/Styles.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React from 'react'; 4 | import {StyleSheet} from 'react-native'; 5 | 6 | export const colors = { 7 | "secondary" : '#0686E4', 8 | "tertiary" : '#ffffff', 9 | "background_dark" : '#F0F0F0', 10 | "text_light" : '#ffffff', 11 | "text_medium" : '#464646', 12 | "text_dark" : '#263238', 13 | "weather_text_color" : '#464646', 14 | "transparent_white" : '#FFFFFF00', 15 | "separator_background": '#E2E2E2', 16 | }; 17 | 18 | // workaround since on iOS NotoSans works, but not NotoSans-Regular 19 | // on Android it works as expected (ie NotoSans-Regular) 20 | export const getFont = () => { 21 | if (require('react-native').Platform.OS === 'ios') { 22 | return 'NotoSans'; 23 | } 24 | else { 25 | return 'NotoSans-Regular'; 26 | } 27 | }; 28 | 29 | export const values = { 30 | "font_body" : getFont(), 31 | "font_body_size" : 14, 32 | "font_title_size": 20, 33 | "font_time_size" : 12, 34 | "font_place_size": 20, 35 | "font_temp_size" : 27, 36 | 'border_radius' : 2, 37 | "tiny_icon_size" : 22, 38 | "small_icon_size": 40, 39 | "large_icon_size": 110, 40 | }; 41 | 42 | export const addDegreesToEnd = (temp) => { 43 | return `${temp}${String.fromCharCode(176)}`; 44 | }; 45 | 46 | export const home_screen_list = StyleSheet.create( 47 | { 48 | container : { 49 | marginTop: 14, 50 | alignSelf: "stretch", 51 | }, 52 | row : { 53 | elevation : 1, 54 | borderRadius : 2, 55 | backgroundColor: colors.tertiary, 56 | flex : 1, 57 | flexDirection : 'row', // main axis 58 | justifyContent : 'flex-start', // main axis 59 | alignItems : 'center', // cross axis 60 | paddingTop : 10, 61 | paddingBottom : 10, 62 | paddingLeft : 18, 63 | paddingRight : 16, 64 | marginLeft : 14, 65 | marginRight : 14, 66 | marginTop : 0, 67 | marginBottom : 6, 68 | }, 69 | row_cell_timeplace: { 70 | flex : 1, 71 | flexDirection: 'column', 72 | }, 73 | row_cell_temp : { 74 | color : colors.weather_text_color, 75 | paddingLeft: 16, 76 | flex : 0, 77 | fontSize : values.font_temp_size, 78 | fontFamily : values.font_body, 79 | }, 80 | row_time : { 81 | color : colors.weather_text_color, 82 | textAlignVertical : 'bottom', 83 | includeFontPadding: false, 84 | flex : 0, 85 | fontSize : values.font_time_size, 86 | fontFamily : values.font_body, 87 | }, 88 | row_place : { 89 | color : colors.weather_text_color, 90 | textAlignVertical : 'top', 91 | includeFontPadding: false, 92 | flex : 0, 93 | fontSize : values.font_place_size, 94 | fontFamily : values.font_body, 95 | }, 96 | }); 97 | 98 | export const fab = { 99 | // key - value pairs needed to decorate the FAB 100 | icon : 'library-add', // May 16 '17 only MaterialIcons can be used in material-ui 101 | // lib 102 | // StyleSheet needed to style the FAB 103 | stylesheet: StyleSheet.create( 104 | { 105 | container: { 106 | backgroundColor: colors.secondary, //COLORS can be used here as well 107 | }, 108 | }, 109 | ), 110 | }; 111 | 112 | export const home_screen = StyleSheet.create( 113 | { 114 | v_container: { 115 | flex : 1, 116 | padding : 8, 117 | flexDirection : 'column', // main axis 118 | justifyContent : 'center', // main axis 119 | alignItems : 'center', // cross axis 120 | backgroundColor: colors.background_dark, 121 | }, 122 | }); 123 | 124 | export const details_screen_2 = StyleSheet.create( 125 | { 126 | v_container: { 127 | flex : 1, 128 | flexDirection : 'column', // main axis 129 | alignItems : 'center', // cross axis 130 | backgroundColor: colors.tertiary, 131 | padding : 8, 132 | }, 133 | day : { 134 | //backgroundColor: 'lavender', 135 | fontSize: 14, 136 | color : colors.weather_text_color, 137 | }, 138 | temp : { 139 | fontSize: 24, 140 | color : colors.weather_text_color, 141 | }, 142 | row : { 143 | alignItems : 'center', 144 | //backgroundColor: 'lightblue', 145 | marginLeft : 20, 146 | marginRight: 20, 147 | }, 148 | list : { 149 | //backgroundColor: 'lightyellow', 150 | paddingTop: 20, 151 | }, 152 | }, 153 | ); 154 | 155 | export const details_screen_1 = StyleSheet.create( 156 | { 157 | v_container : { 158 | flex : 1, 159 | padding : 8, 160 | flexDirection : 'column', // main axis 161 | justifyContent : 'center', // main axis 162 | alignItems : 'center', // cross axis 163 | backgroundColor: colors.tertiary, 164 | }, 165 | separator : { 166 | alignSelf : 'stretch', 167 | backgroundColor: colors.separator_background, 168 | height : 1, 169 | marginLeft : 10, 170 | marginRight : 10, 171 | marginTop : 10, 172 | marginBottom : 10, 173 | }, 174 | place : { 175 | paddingTop : 20, 176 | paddingBottom: 20, 177 | color : colors.weather_text_color, 178 | fontFamily : values.font_body, 179 | fontSize : 35, 180 | }, 181 | description : { 182 | color : colors.weather_text_color, 183 | fontFamily: values.font_body, 184 | fontSize : 14, 185 | }, 186 | current_temp : { 187 | color : colors.weather_text_color, 188 | fontFamily: values.font_body, 189 | fontSize : 45, 190 | }, 191 | list_container: { 192 | marginTop: 14, 193 | alignSelf: "stretch", 194 | }, 195 | list_row : { 196 | flexDirection: 'row', 197 | paddingLeft : 16, 198 | paddingRight : 16, 199 | paddingBottom: 12, 200 | }, 201 | list_row_time : {flex: 1}, 202 | list_row_temp : {paddingLeft: 12}, 203 | }, 204 | ); 205 | 206 | export const settings_screen = StyleSheet.create( 207 | { 208 | v_container: { 209 | flex : 1, 210 | padding : 8, 211 | flexDirection : 'column', // main axis 212 | justifyContent : 'flex-start', // main axis 213 | alignItems : 'center', // cross axis 214 | backgroundColor: colors.tertiary, 215 | }, 216 | text : { 217 | color : colors.weather_text_color, 218 | fontFamily: values.font_body, 219 | fontSize : 20, 220 | }, 221 | }, 222 | ); 223 | 224 | // more info https://goo.gl/dqw4jF 225 | export const header = { 226 | // background 227 | headerStyle : { 228 | backgroundColor: colors.secondary, 229 | }, 230 | // arrows 231 | headerTintColor: colors.text_light, 232 | // my own styles for titleAndIcon 233 | container : { 234 | flex : 1, 235 | flexDirection : 'row', 236 | justifyContent: 'flex-start', 237 | alignItems : 'center', 238 | paddingLeft : 8, 239 | }, 240 | // my own styles for titleAndIcon 241 | text : { 242 | paddingLeft: 8, 243 | color : colors.text_light, 244 | fontFamily : values.font_body, 245 | fontSize : values.font_title_size, 246 | }, 247 | 248 | }; 249 | 250 | // more info https://goo.gl/eawcVg 251 | export const tabs = { 252 | // text 253 | labelStyle : { 254 | fontFamily: values.font_body, 255 | fontSize : values.font_body_size, 256 | }, 257 | activeTintColor : colors.secondary, // text color active tab 258 | inactiveTintColor: colors.text_medium, // text color inactive tab 259 | indicatorStyle : {backgroundColor: colors.secondary}, // active tab highlight top 260 | style : { 261 | backgroundColor: colors.tertiary, // background color of tabs 262 | borderTopColor : colors.tertiary // active tab highlight bottom 263 | }, 264 | }; 265 | 266 | // styling for for DrawerView.Items in contentOptions 267 | // more info - https://goo.gl/d74VUZ 268 | export const drawer = { 269 | activeBackgroundColor : colors.tertiary, 270 | inactiveBackgroundColor: colors.secondary, 271 | inactiveTintColor : colors.text_light, // text color for inactive drawer items 272 | activeTintColor : colors.text_dark, // text color for active drawer items 273 | // style object for text style 274 | labelStyle : { 275 | fontFamily: values.font_body, 276 | fontSize : values.font_title_size, 277 | }, 278 | // style object for the content section 279 | style : { 280 | backgroundColor: colors.secondary, 281 | }, 282 | }; -------------------------------------------------------------------------------- /app/Data.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const listData = [ 4 | { 5 | key : '1', 6 | time : '7:04pm', 7 | place : 'Palo Alto', 8 | icon : { 9 | iconName : 'ios-sunny-outline', 10 | iconFont : 'ionicon', 11 | iconColor: '#FFCF17', 12 | }, 13 | currentTemp : '62', 14 | description : 'Sunny', 15 | dailyForecast : [ 16 | { 17 | key : '1', 18 | time: '8 PM', 19 | icon: { 20 | iconName : 'ios-moon-outline', 21 | iconFont : 'ionicon', 22 | iconColor: '#464646', 23 | }, 24 | temp: '59', 25 | }, 26 | { 27 | key : '2', 28 | time: '9 PM', 29 | icon: { 30 | iconName : 'ios-moon-outline', 31 | iconFont : 'ionicon', 32 | iconColor: '#464646', 33 | }, 34 | temp: '57', 35 | }, 36 | { 37 | key : '3', 38 | time: '10 PM', 39 | icon: { 40 | iconName : 'ios-moon-outline', 41 | iconFont : 'ionicon', 42 | iconColor: '#464646', 43 | }, 44 | temp: '57', 45 | }, 46 | { 47 | key : '4', 48 | time: '11 PM', 49 | icon: { 50 | iconName : 'ios-moon-outline', 51 | iconFont : 'ionicon', 52 | iconColor: '#464646', 53 | }, 54 | temp: '57', 55 | }, 56 | { 57 | key : '5', 58 | time: '12 PM', 59 | icon: { 60 | iconName : 'ios-moon-outline', 61 | iconFont : 'ionicon', 62 | iconColor: '#464646', 63 | }, 64 | temp: '57', 65 | }, 66 | { 67 | key : '6', 68 | time: '1 AM', 69 | icon: { 70 | iconName : 'ios-moon-outline', 71 | iconFont : 'ionicon', 72 | iconColor: '#464646', 73 | }, 74 | temp: '56', 75 | }, 76 | { 77 | key : '7', 78 | time: '2 AM', 79 | icon: { 80 | iconName : 'ios-moon-outline', 81 | iconFont : 'ionicon', 82 | iconColor: '#464646', 83 | }, 84 | temp: '55', 85 | }, 86 | ], 87 | weeklyForecast: [ 88 | { 89 | key : '1', 90 | day : 'TUE', 91 | temp: '62', 92 | icon: { 93 | iconName : 'ios-sunny-outline', 94 | iconFont : 'ionicon', 95 | iconColor: '#FFCF17', 96 | }, 97 | }, 98 | { 99 | key : '2', 100 | day : 'WED', 101 | temp: '68', 102 | icon: { 103 | iconName : 'ios-partly-sunny-outline', 104 | iconFont : 'ionicon', 105 | iconColor: '#48B247', 106 | }, 107 | }, 108 | { 109 | key : '3', 110 | day : 'THU', 111 | temp: '57', 112 | icon: { 113 | iconName : 'ios-partly-sunny-outline', 114 | iconFont : 'ionicon', 115 | iconColor: '#48B247', 116 | }, 117 | }, 118 | { 119 | key : '4', 120 | day : 'FRI', 121 | temp: '73', 122 | icon: { 123 | iconName : 'ios-sunny-outline', 124 | iconFont : 'ionicon', 125 | iconColor: '#FFCF17', 126 | }, 127 | }, 128 | { 129 | key : '5', 130 | day : 'SAT', 131 | temp: '70', 132 | icon: { 133 | iconName : 'ios-partly-sunny-outline', 134 | iconFont : 'ionicon', 135 | iconColor: '#48B247', 136 | }, 137 | }, 138 | ], 139 | }, 140 | { 141 | key : '2', 142 | time : '7:04pm', 143 | place : 'San Francisco', 144 | icon : { 145 | iconName : 'ios-sunny-outline', 146 | iconFont : 'ionicon', 147 | iconColor: '#FFCF17', 148 | }, 149 | currentTemp : '60', 150 | description : 'Sunny', 151 | dailyForecast : [ 152 | { 153 | key : '1', 154 | time: '8 PM', 155 | icon: { 156 | iconName : 'ios-moon-outline', 157 | iconFont : 'ionicon', 158 | iconColor: '#FFCF17', 159 | }, 160 | temp: '59', 161 | }, 162 | { 163 | key : '2', 164 | time: '9 PM', 165 | icon: { 166 | iconName : 'ios-moon-outline', 167 | iconFont : 'ionicon', 168 | iconColor: '#FFCF17', 169 | }, 170 | temp: '57', 171 | }, 172 | { 173 | key : '3', 174 | time: '10 PM', 175 | icon: { 176 | iconName : 'ios-moon-outline', 177 | iconFont : 'ionicon', 178 | iconColor: '#FFCF17', 179 | }, 180 | temp: '60', 181 | }, 182 | ], 183 | weeklyForecast: [ 184 | { 185 | key : '1', 186 | day : 'TUE', 187 | temp: '62', 188 | icon: { 189 | iconName : 'ios-sunny-outline', 190 | iconFont : 'ionicon', 191 | iconColor: '#FFCF17', 192 | }, 193 | }, 194 | { 195 | key : '2', 196 | day : 'WED', 197 | temp: '68', 198 | icon: { 199 | iconName : 'ios-partly-sunny-outline', 200 | iconFont : 'ionicon', 201 | iconColor: '#48B247', 202 | }, 203 | }, 204 | { 205 | key : '3', 206 | day : 'THU', 207 | temp: '57', 208 | icon: { 209 | iconName : 'ios-partly-sunny-outline', 210 | iconFont : 'ionicon', 211 | iconColor: '#48B247', 212 | }, 213 | }, 214 | { 215 | key : '4', 216 | day : 'FRI', 217 | temp: '73', 218 | icon: { 219 | iconName : 'ios-sunny-outline', 220 | iconFont : 'ionicon', 221 | iconColor: '#FFCF17', 222 | }, 223 | }, 224 | { 225 | key : '5', 226 | day : 'SAT', 227 | temp: '70', 228 | icon: { 229 | iconName : 'ios-partly-sunny-outline', 230 | iconFont : 'ionicon', 231 | iconColor: '#48B247', 232 | }, 233 | }, 234 | ], 235 | }, 236 | { 237 | key : '3', 238 | time : '7:04pm', 239 | place : 'San Jose', 240 | icon : { 241 | iconName : 'ios-sunny-outline', 242 | iconFont : 'ionicon', 243 | iconColor: '#FFCF17', 244 | }, 245 | currentTemp : '66', 246 | description : 'Sunny', 247 | dailyForecast : [ 248 | { 249 | key : '1', 250 | time: '8 PM', 251 | icon: { 252 | iconName : 'ios-moon-outline', 253 | iconFont : 'ionicon', 254 | iconColor: '#FFCF17', 255 | }, 256 | temp: '59', 257 | }, 258 | { 259 | key : '2', 260 | time: '9 PM', 261 | icon: { 262 | iconName : 'ios-moon-outline', 263 | iconFont : 'ionicon', 264 | iconColor: '#FFCF17', 265 | }, 266 | temp: '57', 267 | }, 268 | { 269 | key : '3', 270 | time: '10 PM', 271 | icon: { 272 | iconName : 'ios-moon-outline', 273 | iconFont : 'ionicon', 274 | iconColor: '#FFCF17', 275 | }, 276 | temp: '60', 277 | }, 278 | ], 279 | weeklyForecast: [ 280 | { 281 | key : '1', 282 | day : 'TUE', 283 | temp: '62', 284 | icon: { 285 | iconName : 'ios-sunny-outline', 286 | iconFont : 'ionicon', 287 | iconColor: '#FFCF17', 288 | }, 289 | }, 290 | { 291 | key : '2', 292 | day : 'WED', 293 | temp: '68', 294 | icon: { 295 | iconName : 'ios-partly-sunny-outline', 296 | iconFont : 'ionicon', 297 | iconColor: '#48B247', 298 | }, 299 | }, 300 | { 301 | key : '3', 302 | day : 'THU', 303 | temp: '57', 304 | icon: { 305 | iconName : 'ios-partly-sunny-outline', 306 | iconFont : 'ionicon', 307 | iconColor: '#48B247', 308 | }, 309 | }, 310 | { 311 | key : '4', 312 | day : 'FRI', 313 | temp: '73', 314 | icon: { 315 | iconName : 'ios-sunny-outline', 316 | iconFont : 'ionicon', 317 | iconColor: '#FFCF17', 318 | }, 319 | }, 320 | { 321 | key : '5', 322 | day : 'SAT', 323 | temp: '70', 324 | icon: { 325 | iconName : 'ios-partly-sunny-outline', 326 | iconFont : 'ionicon', 327 | iconColor: '#48B247', 328 | }, 329 | }, 330 | ], 331 | }, 332 | { 333 | key : '4', 334 | time : '7:04pm', 335 | place : 'Los Angeles', 336 | icon : { 337 | iconName : 'ios-sunny-outline', 338 | iconFont : 'ionicon', 339 | iconColor: '#FFCF17', 340 | }, 341 | currentTemp : '66', 342 | description : 'sunny', 343 | dailyForecast : [ 344 | { 345 | key : '1', 346 | time: '8 PM', 347 | icon: { 348 | iconName : 'ios-moon-outline', 349 | iconFont : 'ionicon', 350 | iconColor: '#FFCF17', 351 | }, 352 | temp: '59', 353 | }, 354 | { 355 | key : '2', 356 | time: '9 PM', 357 | icon: { 358 | iconName : 'ios-moon-outline', 359 | iconFont : 'ionicon', 360 | iconColor: '#FFCF17', 361 | }, 362 | temp: '57', 363 | }, 364 | { 365 | key : '3', 366 | time: '10 PM', 367 | icon: { 368 | iconName : 'ios-moon-outline', 369 | iconFont : 'ionicon', 370 | iconColor: '#FFCF17', 371 | }, 372 | temp: '60', 373 | }, 374 | ], 375 | weeklyForecast: [ 376 | { 377 | key : '1', 378 | day : 'TUE', 379 | temp: '62', 380 | icon: { 381 | iconName : 'ios-sunny-outline', 382 | iconFont : 'ionicon', 383 | iconColor: '#FFCF17', 384 | }, 385 | }, 386 | { 387 | key : '2', 388 | day : 'WED', 389 | temp: '68', 390 | icon: { 391 | iconName : 'ios-partly-sunny-outline', 392 | iconFont : 'ionicon', 393 | iconColor: '#48B247', 394 | }, 395 | }, 396 | { 397 | key : '3', 398 | day : 'THU', 399 | temp: '57', 400 | icon: { 401 | iconName : 'ios-partly-sunny-outline', 402 | iconFont : 'ionicon', 403 | iconColor: '#48B247', 404 | }, 405 | }, 406 | { 407 | key : '4', 408 | day : 'FRI', 409 | temp: '73', 410 | icon: { 411 | iconName : 'ios-sunny-outline', 412 | iconFont : 'ionicon', 413 | iconColor: '#FFCF17', 414 | }, 415 | }, 416 | { 417 | key : '5', 418 | day : 'SAT', 419 | temp: '70', 420 | icon: { 421 | iconName : 'ios-partly-sunny-outline', 422 | iconFont : 'ionicon', 423 | iconColor: '#48B247', 424 | }, 425 | }, 426 | ], 427 | }, 428 | { 429 | key : '5', 430 | time : '3:04am', 431 | place : 'London', 432 | icon : { 433 | iconName : 'ios-cloudy-night-outline', 434 | iconFont : 'ionicon', 435 | iconColor: '#464646', 436 | }, 437 | currentTemp : '50', 438 | description : 'Cloudy', 439 | dailyForecast : [ 440 | { 441 | key : '1', 442 | time: '8 PM', 443 | icon: { 444 | iconName : 'ios-moon-outline', 445 | iconFont : 'ionicon', 446 | iconColor: '#FFCF17', 447 | }, 448 | temp: '59', 449 | }, 450 | { 451 | key : '2', 452 | time: '9 PM', 453 | icon: { 454 | iconName : 'ios-moon-outline', 455 | iconFont : 'ionicon', 456 | iconColor: '#FFCF17', 457 | }, 458 | temp: '57', 459 | }, 460 | { 461 | key : '3', 462 | time: '10 PM', 463 | icon: { 464 | iconName : 'ios-moon-outline', 465 | iconFont : 'ionicon', 466 | iconColor: '#FFCF17', 467 | }, 468 | temp: '60', 469 | }, 470 | ], 471 | weeklyForecast: [ 472 | { 473 | key : '1', 474 | day : 'TUE', 475 | temp: '62', 476 | icon: { 477 | iconName : 'ios-sunny-outline', 478 | iconFont : 'ionicon', 479 | iconColor: '#FFCF17', 480 | }, 481 | }, 482 | { 483 | key : '2', 484 | day : 'WED', 485 | temp: '68', 486 | icon: { 487 | iconName : 'ios-partly-sunny-outline', 488 | iconFont : 'ionicon', 489 | iconColor: '#48B247', 490 | }, 491 | }, 492 | { 493 | key : '3', 494 | day : 'THU', 495 | temp: '57', 496 | icon: { 497 | iconName : 'ios-partly-sunny-outline', 498 | iconFont : 'ionicon', 499 | iconColor: '#48B247', 500 | }, 501 | }, 502 | { 503 | key : '4', 504 | day : 'FRI', 505 | temp: '73', 506 | icon: { 507 | iconName : 'ios-sunny-outline', 508 | iconFont : 'ionicon', 509 | iconColor: '#FFCF17', 510 | }, 511 | }, 512 | { 513 | key : '5', 514 | day : 'SAT', 515 | temp: '70', 516 | icon: { 517 | iconName : 'ios-partly-sunny-outline', 518 | iconFont : 'ionicon', 519 | iconColor: '#48B247', 520 | }, 521 | }, 522 | ], 523 | }, 524 | ]; 525 | -------------------------------------------------------------------------------- /ios/WeatherApp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | /* Begin PBXBuildFile section */ 9 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 10 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 11 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 12 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 13 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 14 | 00E356F31AD99517003FC87E /* WeatherAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* WeatherAppTests.m */; }; 15 | 0B4CD0D181EB4B67BF8FBCD1 /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 739BD91DCB904230ACB918C1 /* MaterialCommunityIcons.ttf */; }; 16 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 17 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 18 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 19 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 20 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 21 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 22 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 23 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 24 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 25 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 26 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 27 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 28 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */; }; 29 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 30 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 31 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; 32 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 33 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 34 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 35 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 36 | 2DCD954D1E0B4F2C00145EB5 /* WeatherAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* WeatherAppTests.m */; }; 37 | 3CB645AB166B4964BD32EE3F /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0ACB15272BFD4F768E01DB46 /* Ionicons.ttf */; }; 38 | 5A1D0C2B687541C8B615FA24 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D5B7BBDC12940EDBE992D00 /* Foundation.ttf */; }; 39 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 40 | 664D0FF3D8DD48A7855FC570 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 44DBE3616EA54C189DE8F64D /* Zocial.ttf */; }; 41 | 70A6D1C094924BC699743535 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D6FFE2CA07A243F58E98DD70 /* libRNVectorIcons.a */; }; 42 | 794F160DA7C44B3381FFAD79 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A95F769713E449A99574406B /* MaterialIcons.ttf */; }; 43 | 81CA827C440B496087248EA2 /* NotoSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8CE73CB028674267BA15FA2A /* NotoSans-Regular.ttf */; }; 44 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 45 | 8816DC3F09024E5AB254BF47 /* NotoSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9F9BA0E80AA64A68894C8ACE /* NotoSans-Italic.ttf */; }; 46 | 8DF2257948DF4FEFB62EA403 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4F654866B3B44C52B9B01245 /* EvilIcons.ttf */; }; 47 | A3667C42E8D4469A83F1F7D2 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3811EA76C9D24F52A0F87B3D /* Octicons.ttf */; }; 48 | B5FB29C6021049BA9F6ECB54 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0CEE379B977443D8AA3735D2 /* SimpleLineIcons.ttf */; }; 49 | BEAE0084C68247F5BAD4EE7B /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 450935FB9B7E43F4AAECEFF0 /* FontAwesome.ttf */; }; 50 | CAD1B6A7747C460A80CF2AB0 /* NotoSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EA45ABF33F4B42389F974E7E /* NotoSans-BoldItalic.ttf */; }; 51 | D25327E663B241CDA46BDA8D /* NotoSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D676DAE1E7014F3BB4E28B44 /* NotoSans-Bold.ttf */; }; 52 | F3ACD21CE7E2470EBE5286F6 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AD7BCB75E97D49B9A15EF640 /* Entypo.ttf */; }; 53 | /* End PBXBuildFile section */ 54 | 55 | /* Begin PBXContainerItemProxy section */ 56 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 57 | isa = PBXContainerItemProxy; 58 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 59 | proxyType = 2; 60 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 61 | remoteInfo = RCTActionSheet; 62 | }; 63 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 64 | isa = PBXContainerItemProxy; 65 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 66 | proxyType = 2; 67 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 68 | remoteInfo = RCTGeolocation; 69 | }; 70 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 71 | isa = PBXContainerItemProxy; 72 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 73 | proxyType = 2; 74 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 75 | remoteInfo = RCTImage; 76 | }; 77 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 78 | isa = PBXContainerItemProxy; 79 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 80 | proxyType = 2; 81 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 82 | remoteInfo = RCTNetwork; 83 | }; 84 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 85 | isa = PBXContainerItemProxy; 86 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 87 | proxyType = 2; 88 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 89 | remoteInfo = RCTVibration; 90 | }; 91 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 92 | isa = PBXContainerItemProxy; 93 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 94 | proxyType = 1; 95 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 96 | remoteInfo = WeatherApp; 97 | }; 98 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 99 | isa = PBXContainerItemProxy; 100 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 101 | proxyType = 2; 102 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 103 | remoteInfo = RCTSettings; 104 | }; 105 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 106 | isa = PBXContainerItemProxy; 107 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 108 | proxyType = 2; 109 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 110 | remoteInfo = RCTWebSocket; 111 | }; 112 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 113 | isa = PBXContainerItemProxy; 114 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 115 | proxyType = 2; 116 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 117 | remoteInfo = React; 118 | }; 119 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { 120 | isa = PBXContainerItemProxy; 121 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 122 | proxyType = 1; 123 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; 124 | remoteInfo = "WeatherApp-tvOS"; 125 | }; 126 | 38B30FBA1EA17B1C009A1102 /* PBXContainerItemProxy */ = { 127 | isa = PBXContainerItemProxy; 128 | containerPortal = 97157826F9A74A9EB5421498 /* RNVectorIcons.xcodeproj */; 129 | proxyType = 2; 130 | remoteGlobalIDString = 5DBEB1501B18CEA900B34395; 131 | remoteInfo = RNVectorIcons; 132 | }; 133 | 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { 134 | isa = PBXContainerItemProxy; 135 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 136 | proxyType = 2; 137 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 138 | remoteInfo = "RCTImage-tvOS"; 139 | }; 140 | 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { 141 | isa = PBXContainerItemProxy; 142 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 143 | proxyType = 2; 144 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 145 | remoteInfo = "RCTLinking-tvOS"; 146 | }; 147 | 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 148 | isa = PBXContainerItemProxy; 149 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 150 | proxyType = 2; 151 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 152 | remoteInfo = "RCTNetwork-tvOS"; 153 | }; 154 | 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 155 | isa = PBXContainerItemProxy; 156 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 157 | proxyType = 2; 158 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 159 | remoteInfo = "RCTSettings-tvOS"; 160 | }; 161 | 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { 162 | isa = PBXContainerItemProxy; 163 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 164 | proxyType = 2; 165 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 166 | remoteInfo = "RCTText-tvOS"; 167 | }; 168 | 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { 169 | isa = PBXContainerItemProxy; 170 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 171 | proxyType = 2; 172 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 173 | remoteInfo = "RCTWebSocket-tvOS"; 174 | }; 175 | 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { 176 | isa = PBXContainerItemProxy; 177 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 178 | proxyType = 2; 179 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 180 | remoteInfo = "React-tvOS"; 181 | }; 182 | 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { 183 | isa = PBXContainerItemProxy; 184 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 185 | proxyType = 2; 186 | remoteGlobalIDString = 3D3C059A1DE3340900C268FA; 187 | remoteInfo = yoga; 188 | }; 189 | 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { 190 | isa = PBXContainerItemProxy; 191 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 192 | proxyType = 2; 193 | remoteGlobalIDString = 3D3C06751DE3340C00C268FA; 194 | remoteInfo = "yoga-tvOS"; 195 | }; 196 | 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { 197 | isa = PBXContainerItemProxy; 198 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 199 | proxyType = 2; 200 | remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; 201 | remoteInfo = cxxreact; 202 | }; 203 | 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 204 | isa = PBXContainerItemProxy; 205 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 206 | proxyType = 2; 207 | remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; 208 | remoteInfo = "cxxreact-tvOS"; 209 | }; 210 | 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 211 | isa = PBXContainerItemProxy; 212 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 213 | proxyType = 2; 214 | remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; 215 | remoteInfo = jschelpers; 216 | }; 217 | 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 218 | isa = PBXContainerItemProxy; 219 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 220 | proxyType = 2; 221 | remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; 222 | remoteInfo = "jschelpers-tvOS"; 223 | }; 224 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 225 | isa = PBXContainerItemProxy; 226 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 227 | proxyType = 2; 228 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 229 | remoteInfo = RCTAnimation; 230 | }; 231 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 232 | isa = PBXContainerItemProxy; 233 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 234 | proxyType = 2; 235 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 236 | remoteInfo = "RCTAnimation-tvOS"; 237 | }; 238 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 239 | isa = PBXContainerItemProxy; 240 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 241 | proxyType = 2; 242 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 243 | remoteInfo = RCTLinking; 244 | }; 245 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 246 | isa = PBXContainerItemProxy; 247 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 248 | proxyType = 2; 249 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 250 | remoteInfo = RCTText; 251 | }; 252 | /* End PBXContainerItemProxy section */ 253 | 254 | /* Begin PBXFileReference section */ 255 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 256 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 257 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 258 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 259 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 260 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 261 | 00E356EE1AD99517003FC87E /* WeatherAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WeatherAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 262 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 263 | 00E356F21AD99517003FC87E /* WeatherAppTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeatherAppTests.m; sourceTree = ""; }; 264 | 0ACB15272BFD4F768E01DB46 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; 265 | 0CEE379B977443D8AA3735D2 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; 266 | 0D5B7BBDC12940EDBE992D00 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; 267 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 268 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 269 | 13B07F961A680F5B00A75B9A /* WeatherApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WeatherApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 270 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = WeatherApp/AppDelegate.h; sourceTree = ""; }; 271 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = WeatherApp/AppDelegate.m; sourceTree = ""; }; 272 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 273 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = WeatherApp/Images.xcassets; sourceTree = ""; }; 274 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = WeatherApp/Info.plist; sourceTree = ""; }; 275 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = WeatherApp/main.m; sourceTree = ""; }; 276 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 277 | 2D02E47B1E0B4A5D006451C7 /* WeatherApp-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "WeatherApp-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 278 | 2D02E4901E0B4A5D006451C7 /* WeatherApp-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "WeatherApp-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 279 | 3811EA76C9D24F52A0F87B3D /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; 280 | 44DBE3616EA54C189DE8F64D /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; 281 | 450935FB9B7E43F4AAECEFF0 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; 282 | 4F654866B3B44C52B9B01245 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; 283 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 284 | 739BD91DCB904230ACB918C1 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; 285 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 286 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 287 | 8CE73CB028674267BA15FA2A /* NotoSans-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Regular.ttf"; path = "../fonts/NotoSans-Regular.ttf"; sourceTree = ""; }; 288 | 97157826F9A74A9EB5421498 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; 289 | 9F9BA0E80AA64A68894C8ACE /* NotoSans-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Italic.ttf"; path = "../fonts/NotoSans-Italic.ttf"; sourceTree = ""; }; 290 | A95F769713E449A99574406B /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; 291 | AD7BCB75E97D49B9A15EF640 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; 292 | D676DAE1E7014F3BB4E28B44 /* NotoSans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Bold.ttf"; path = "../fonts/NotoSans-Bold.ttf"; sourceTree = ""; }; 293 | D6FFE2CA07A243F58E98DD70 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 294 | EA45ABF33F4B42389F974E7E /* NotoSans-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-BoldItalic.ttf"; path = "../fonts/NotoSans-BoldItalic.ttf"; sourceTree = ""; }; 295 | /* End PBXFileReference section */ 296 | 297 | /* Begin PBXFrameworksBuildPhase section */ 298 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 299 | isa = PBXFrameworksBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 307 | isa = PBXFrameworksBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 311 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 312 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 313 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 314 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 315 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 316 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 317 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 318 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 319 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 320 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 321 | 70A6D1C094924BC699743535 /* libRNVectorIcons.a in Frameworks */, 322 | ); 323 | runOnlyForDeploymentPostprocessing = 0; 324 | }; 325 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { 326 | isa = PBXFrameworksBuildPhase; 327 | buildActionMask = 2147483647; 328 | files = ( 329 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, 330 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */, 331 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 332 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 333 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, 334 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, 335 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, 336 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, 337 | ); 338 | runOnlyForDeploymentPostprocessing = 0; 339 | }; 340 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { 341 | isa = PBXFrameworksBuildPhase; 342 | buildActionMask = 2147483647; 343 | files = ( 344 | ); 345 | runOnlyForDeploymentPostprocessing = 0; 346 | }; 347 | /* End PBXFrameworksBuildPhase section */ 348 | 349 | /* Begin PBXGroup section */ 350 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 351 | isa = PBXGroup; 352 | children = ( 353 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 354 | ); 355 | name = Products; 356 | sourceTree = ""; 357 | }; 358 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 359 | isa = PBXGroup; 360 | children = ( 361 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 362 | ); 363 | name = Products; 364 | sourceTree = ""; 365 | }; 366 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 367 | isa = PBXGroup; 368 | children = ( 369 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 370 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, 371 | ); 372 | name = Products; 373 | sourceTree = ""; 374 | }; 375 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 376 | isa = PBXGroup; 377 | children = ( 378 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 379 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, 380 | ); 381 | name = Products; 382 | sourceTree = ""; 383 | }; 384 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 385 | isa = PBXGroup; 386 | children = ( 387 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 388 | ); 389 | name = Products; 390 | sourceTree = ""; 391 | }; 392 | 00E356EF1AD99517003FC87E /* WeatherAppTests */ = { 393 | isa = PBXGroup; 394 | children = ( 395 | 00E356F21AD99517003FC87E /* WeatherAppTests.m */, 396 | 00E356F01AD99517003FC87E /* Supporting Files */, 397 | ); 398 | path = WeatherAppTests; 399 | sourceTree = ""; 400 | }; 401 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 402 | isa = PBXGroup; 403 | children = ( 404 | 00E356F11AD99517003FC87E /* Info.plist */, 405 | ); 406 | name = "Supporting Files"; 407 | sourceTree = ""; 408 | }; 409 | 139105B71AF99BAD00B5F7CC /* Products */ = { 410 | isa = PBXGroup; 411 | children = ( 412 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 413 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, 414 | ); 415 | name = Products; 416 | sourceTree = ""; 417 | }; 418 | 139FDEE71B06529A00C62182 /* Products */ = { 419 | isa = PBXGroup; 420 | children = ( 421 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 422 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 423 | ); 424 | name = Products; 425 | sourceTree = ""; 426 | }; 427 | 13B07FAE1A68108700A75B9A /* WeatherApp */ = { 428 | isa = PBXGroup; 429 | children = ( 430 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 431 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 432 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 433 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 434 | 13B07FB61A68108700A75B9A /* Info.plist */, 435 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 436 | 13B07FB71A68108700A75B9A /* main.m */, 437 | ); 438 | name = WeatherApp; 439 | sourceTree = ""; 440 | }; 441 | 146834001AC3E56700842450 /* Products */ = { 442 | isa = PBXGroup; 443 | children = ( 444 | 146834041AC3E56700842450 /* libReact.a */, 445 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 446 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 447 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 448 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 449 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 450 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, 451 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, 452 | ); 453 | name = Products; 454 | sourceTree = ""; 455 | }; 456 | 38B30F9E1EA17B1A009A1102 /* Products */ = { 457 | isa = PBXGroup; 458 | children = ( 459 | 38B30FBB1EA17B1C009A1102 /* libRNVectorIcons.a */, 460 | ); 461 | name = Products; 462 | sourceTree = ""; 463 | }; 464 | 3F22169F9FB04AA3B7F4F45C /* Resources */ = { 465 | isa = PBXGroup; 466 | children = ( 467 | D676DAE1E7014F3BB4E28B44 /* NotoSans-Bold.ttf */, 468 | EA45ABF33F4B42389F974E7E /* NotoSans-BoldItalic.ttf */, 469 | 9F9BA0E80AA64A68894C8ACE /* NotoSans-Italic.ttf */, 470 | 8CE73CB028674267BA15FA2A /* NotoSans-Regular.ttf */, 471 | AD7BCB75E97D49B9A15EF640 /* Entypo.ttf */, 472 | 4F654866B3B44C52B9B01245 /* EvilIcons.ttf */, 473 | 450935FB9B7E43F4AAECEFF0 /* FontAwesome.ttf */, 474 | 0D5B7BBDC12940EDBE992D00 /* Foundation.ttf */, 475 | 0ACB15272BFD4F768E01DB46 /* Ionicons.ttf */, 476 | 739BD91DCB904230ACB918C1 /* MaterialCommunityIcons.ttf */, 477 | A95F769713E449A99574406B /* MaterialIcons.ttf */, 478 | 3811EA76C9D24F52A0F87B3D /* Octicons.ttf */, 479 | 0CEE379B977443D8AA3735D2 /* SimpleLineIcons.ttf */, 480 | 44DBE3616EA54C189DE8F64D /* Zocial.ttf */, 481 | ); 482 | name = Resources; 483 | sourceTree = ""; 484 | }; 485 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 486 | isa = PBXGroup; 487 | children = ( 488 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 489 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, 490 | ); 491 | name = Products; 492 | sourceTree = ""; 493 | }; 494 | 78C398B11ACF4ADC00677621 /* Products */ = { 495 | isa = PBXGroup; 496 | children = ( 497 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 498 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, 499 | ); 500 | name = Products; 501 | sourceTree = ""; 502 | }; 503 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 504 | isa = PBXGroup; 505 | children = ( 506 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 507 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 508 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 509 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 510 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 511 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 512 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 513 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 514 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 515 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 516 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 517 | 97157826F9A74A9EB5421498 /* RNVectorIcons.xcodeproj */, 518 | ); 519 | name = Libraries; 520 | sourceTree = ""; 521 | }; 522 | 832341B11AAA6A8300B99B32 /* Products */ = { 523 | isa = PBXGroup; 524 | children = ( 525 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 526 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, 527 | ); 528 | name = Products; 529 | sourceTree = ""; 530 | }; 531 | 83CBB9F61A601CBA00E9B192 = { 532 | isa = PBXGroup; 533 | children = ( 534 | 13B07FAE1A68108700A75B9A /* WeatherApp */, 535 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 536 | 00E356EF1AD99517003FC87E /* WeatherAppTests */, 537 | 83CBBA001A601CBA00E9B192 /* Products */, 538 | 3F22169F9FB04AA3B7F4F45C /* Resources */, 539 | ); 540 | indentWidth = 2; 541 | sourceTree = ""; 542 | tabWidth = 2; 543 | }; 544 | 83CBBA001A601CBA00E9B192 /* Products */ = { 545 | isa = PBXGroup; 546 | children = ( 547 | 13B07F961A680F5B00A75B9A /* WeatherApp.app */, 548 | 00E356EE1AD99517003FC87E /* WeatherAppTests.xctest */, 549 | 2D02E47B1E0B4A5D006451C7 /* WeatherApp-tvOS.app */, 550 | 2D02E4901E0B4A5D006451C7 /* WeatherApp-tvOSTests.xctest */, 551 | ); 552 | name = Products; 553 | sourceTree = ""; 554 | }; 555 | /* End PBXGroup section */ 556 | 557 | /* Begin PBXNativeTarget section */ 558 | 00E356ED1AD99517003FC87E /* WeatherAppTests */ = { 559 | isa = PBXNativeTarget; 560 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "WeatherAppTests" */; 561 | buildPhases = ( 562 | 00E356EA1AD99517003FC87E /* Sources */, 563 | 00E356EB1AD99517003FC87E /* Frameworks */, 564 | 00E356EC1AD99517003FC87E /* Resources */, 565 | ); 566 | buildRules = ( 567 | ); 568 | dependencies = ( 569 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 570 | ); 571 | name = WeatherAppTests; 572 | productName = WeatherAppTests; 573 | productReference = 00E356EE1AD99517003FC87E /* WeatherAppTests.xctest */; 574 | productType = "com.apple.product-type.bundle.unit-test"; 575 | }; 576 | 13B07F861A680F5B00A75B9A /* WeatherApp */ = { 577 | isa = PBXNativeTarget; 578 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "WeatherApp" */; 579 | buildPhases = ( 580 | 13B07F871A680F5B00A75B9A /* Sources */, 581 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 582 | 13B07F8E1A680F5B00A75B9A /* Resources */, 583 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 584 | ); 585 | buildRules = ( 586 | ); 587 | dependencies = ( 588 | ); 589 | name = WeatherApp; 590 | productName = "Hello World"; 591 | productReference = 13B07F961A680F5B00A75B9A /* WeatherApp.app */; 592 | productType = "com.apple.product-type.application"; 593 | }; 594 | 2D02E47A1E0B4A5D006451C7 /* WeatherApp-tvOS */ = { 595 | isa = PBXNativeTarget; 596 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "WeatherApp-tvOS" */; 597 | buildPhases = ( 598 | 2D02E4771E0B4A5D006451C7 /* Sources */, 599 | 2D02E4781E0B4A5D006451C7 /* Frameworks */, 600 | 2D02E4791E0B4A5D006451C7 /* Resources */, 601 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, 602 | ); 603 | buildRules = ( 604 | ); 605 | dependencies = ( 606 | ); 607 | name = "WeatherApp-tvOS"; 608 | productName = "WeatherApp-tvOS"; 609 | productReference = 2D02E47B1E0B4A5D006451C7 /* WeatherApp-tvOS.app */; 610 | productType = "com.apple.product-type.application"; 611 | }; 612 | 2D02E48F1E0B4A5D006451C7 /* WeatherApp-tvOSTests */ = { 613 | isa = PBXNativeTarget; 614 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "WeatherApp-tvOSTests" */; 615 | buildPhases = ( 616 | 2D02E48C1E0B4A5D006451C7 /* Sources */, 617 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 618 | 2D02E48E1E0B4A5D006451C7 /* Resources */, 619 | ); 620 | buildRules = ( 621 | ); 622 | dependencies = ( 623 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, 624 | ); 625 | name = "WeatherApp-tvOSTests"; 626 | productName = "WeatherApp-tvOSTests"; 627 | productReference = 2D02E4901E0B4A5D006451C7 /* WeatherApp-tvOSTests.xctest */; 628 | productType = "com.apple.product-type.bundle.unit-test"; 629 | }; 630 | /* End PBXNativeTarget section */ 631 | 632 | /* Begin PBXProject section */ 633 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 634 | isa = PBXProject; 635 | attributes = { 636 | LastUpgradeCheck = 610; 637 | ORGANIZATIONNAME = Facebook; 638 | TargetAttributes = { 639 | 00E356ED1AD99517003FC87E = { 640 | CreatedOnToolsVersion = 6.2; 641 | TestTargetID = 13B07F861A680F5B00A75B9A; 642 | }; 643 | 2D02E47A1E0B4A5D006451C7 = { 644 | CreatedOnToolsVersion = 8.2.1; 645 | ProvisioningStyle = Automatic; 646 | }; 647 | 2D02E48F1E0B4A5D006451C7 = { 648 | CreatedOnToolsVersion = 8.2.1; 649 | ProvisioningStyle = Automatic; 650 | TestTargetID = 2D02E47A1E0B4A5D006451C7; 651 | }; 652 | }; 653 | }; 654 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "WeatherApp" */; 655 | compatibilityVersion = "Xcode 3.2"; 656 | developmentRegion = English; 657 | hasScannedForEncodings = 0; 658 | knownRegions = ( 659 | en, 660 | Base, 661 | ); 662 | mainGroup = 83CBB9F61A601CBA00E9B192; 663 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 664 | projectDirPath = ""; 665 | projectReferences = ( 666 | { 667 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 668 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 669 | }, 670 | { 671 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 672 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 673 | }, 674 | { 675 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 676 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 677 | }, 678 | { 679 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 680 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 681 | }, 682 | { 683 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 684 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 685 | }, 686 | { 687 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 688 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 689 | }, 690 | { 691 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 692 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 693 | }, 694 | { 695 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 696 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 697 | }, 698 | { 699 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 700 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 701 | }, 702 | { 703 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 704 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 705 | }, 706 | { 707 | ProductGroup = 146834001AC3E56700842450 /* Products */; 708 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 709 | }, 710 | { 711 | ProductGroup = 38B30F9E1EA17B1A009A1102 /* Products */; 712 | ProjectRef = 97157826F9A74A9EB5421498 /* RNVectorIcons.xcodeproj */; 713 | }, 714 | ); 715 | projectRoot = ""; 716 | targets = ( 717 | 13B07F861A680F5B00A75B9A /* WeatherApp */, 718 | 00E356ED1AD99517003FC87E /* WeatherAppTests */, 719 | 2D02E47A1E0B4A5D006451C7 /* WeatherApp-tvOS */, 720 | 2D02E48F1E0B4A5D006451C7 /* WeatherApp-tvOSTests */, 721 | ); 722 | }; 723 | /* End PBXProject section */ 724 | 725 | /* Begin PBXReferenceProxy section */ 726 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 727 | isa = PBXReferenceProxy; 728 | fileType = archive.ar; 729 | path = libRCTActionSheet.a; 730 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 731 | sourceTree = BUILT_PRODUCTS_DIR; 732 | }; 733 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 734 | isa = PBXReferenceProxy; 735 | fileType = archive.ar; 736 | path = libRCTGeolocation.a; 737 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 738 | sourceTree = BUILT_PRODUCTS_DIR; 739 | }; 740 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 741 | isa = PBXReferenceProxy; 742 | fileType = archive.ar; 743 | path = libRCTImage.a; 744 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 745 | sourceTree = BUILT_PRODUCTS_DIR; 746 | }; 747 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 748 | isa = PBXReferenceProxy; 749 | fileType = archive.ar; 750 | path = libRCTNetwork.a; 751 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 752 | sourceTree = BUILT_PRODUCTS_DIR; 753 | }; 754 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 755 | isa = PBXReferenceProxy; 756 | fileType = archive.ar; 757 | path = libRCTVibration.a; 758 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 759 | sourceTree = BUILT_PRODUCTS_DIR; 760 | }; 761 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 762 | isa = PBXReferenceProxy; 763 | fileType = archive.ar; 764 | path = libRCTSettings.a; 765 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 766 | sourceTree = BUILT_PRODUCTS_DIR; 767 | }; 768 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 769 | isa = PBXReferenceProxy; 770 | fileType = archive.ar; 771 | path = libRCTWebSocket.a; 772 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 773 | sourceTree = BUILT_PRODUCTS_DIR; 774 | }; 775 | 146834041AC3E56700842450 /* libReact.a */ = { 776 | isa = PBXReferenceProxy; 777 | fileType = archive.ar; 778 | path = libReact.a; 779 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 780 | sourceTree = BUILT_PRODUCTS_DIR; 781 | }; 782 | 38B30FBB1EA17B1C009A1102 /* libRNVectorIcons.a */ = { 783 | isa = PBXReferenceProxy; 784 | fileType = archive.ar; 785 | path = libRNVectorIcons.a; 786 | remoteRef = 38B30FBA1EA17B1C009A1102 /* PBXContainerItemProxy */; 787 | sourceTree = BUILT_PRODUCTS_DIR; 788 | }; 789 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { 790 | isa = PBXReferenceProxy; 791 | fileType = archive.ar; 792 | path = "libRCTImage-tvOS.a"; 793 | remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; 794 | sourceTree = BUILT_PRODUCTS_DIR; 795 | }; 796 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { 797 | isa = PBXReferenceProxy; 798 | fileType = archive.ar; 799 | path = "libRCTLinking-tvOS.a"; 800 | remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; 801 | sourceTree = BUILT_PRODUCTS_DIR; 802 | }; 803 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { 804 | isa = PBXReferenceProxy; 805 | fileType = archive.ar; 806 | path = "libRCTNetwork-tvOS.a"; 807 | remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; 808 | sourceTree = BUILT_PRODUCTS_DIR; 809 | }; 810 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { 811 | isa = PBXReferenceProxy; 812 | fileType = archive.ar; 813 | path = "libRCTSettings-tvOS.a"; 814 | remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; 815 | sourceTree = BUILT_PRODUCTS_DIR; 816 | }; 817 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { 818 | isa = PBXReferenceProxy; 819 | fileType = archive.ar; 820 | path = "libRCTText-tvOS.a"; 821 | remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; 822 | sourceTree = BUILT_PRODUCTS_DIR; 823 | }; 824 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { 825 | isa = PBXReferenceProxy; 826 | fileType = archive.ar; 827 | path = "libRCTWebSocket-tvOS.a"; 828 | remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; 829 | sourceTree = BUILT_PRODUCTS_DIR; 830 | }; 831 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { 832 | isa = PBXReferenceProxy; 833 | fileType = archive.ar; 834 | path = libReact.a; 835 | remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; 836 | sourceTree = BUILT_PRODUCTS_DIR; 837 | }; 838 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { 839 | isa = PBXReferenceProxy; 840 | fileType = archive.ar; 841 | path = libyoga.a; 842 | remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; 843 | sourceTree = BUILT_PRODUCTS_DIR; 844 | }; 845 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { 846 | isa = PBXReferenceProxy; 847 | fileType = archive.ar; 848 | path = libyoga.a; 849 | remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; 850 | sourceTree = BUILT_PRODUCTS_DIR; 851 | }; 852 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { 853 | isa = PBXReferenceProxy; 854 | fileType = archive.ar; 855 | path = libcxxreact.a; 856 | remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; 857 | sourceTree = BUILT_PRODUCTS_DIR; 858 | }; 859 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { 860 | isa = PBXReferenceProxy; 861 | fileType = archive.ar; 862 | path = libcxxreact.a; 863 | remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; 864 | sourceTree = BUILT_PRODUCTS_DIR; 865 | }; 866 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { 867 | isa = PBXReferenceProxy; 868 | fileType = archive.ar; 869 | path = libjschelpers.a; 870 | remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; 871 | sourceTree = BUILT_PRODUCTS_DIR; 872 | }; 873 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { 874 | isa = PBXReferenceProxy; 875 | fileType = archive.ar; 876 | path = libjschelpers.a; 877 | remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; 878 | sourceTree = BUILT_PRODUCTS_DIR; 879 | }; 880 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 881 | isa = PBXReferenceProxy; 882 | fileType = archive.ar; 883 | path = libRCTAnimation.a; 884 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 885 | sourceTree = BUILT_PRODUCTS_DIR; 886 | }; 887 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { 888 | isa = PBXReferenceProxy; 889 | fileType = archive.ar; 890 | path = "libRCTAnimation-tvOS.a"; 891 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 892 | sourceTree = BUILT_PRODUCTS_DIR; 893 | }; 894 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 895 | isa = PBXReferenceProxy; 896 | fileType = archive.ar; 897 | path = libRCTLinking.a; 898 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 899 | sourceTree = BUILT_PRODUCTS_DIR; 900 | }; 901 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 902 | isa = PBXReferenceProxy; 903 | fileType = archive.ar; 904 | path = libRCTText.a; 905 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 906 | sourceTree = BUILT_PRODUCTS_DIR; 907 | }; 908 | /* End PBXReferenceProxy section */ 909 | 910 | /* Begin PBXResourcesBuildPhase section */ 911 | 00E356EC1AD99517003FC87E /* Resources */ = { 912 | isa = PBXResourcesBuildPhase; 913 | buildActionMask = 2147483647; 914 | files = ( 915 | ); 916 | runOnlyForDeploymentPostprocessing = 0; 917 | }; 918 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 919 | isa = PBXResourcesBuildPhase; 920 | buildActionMask = 2147483647; 921 | files = ( 922 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 923 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 924 | D25327E663B241CDA46BDA8D /* NotoSans-Bold.ttf in Resources */, 925 | CAD1B6A7747C460A80CF2AB0 /* NotoSans-BoldItalic.ttf in Resources */, 926 | 8816DC3F09024E5AB254BF47 /* NotoSans-Italic.ttf in Resources */, 927 | 81CA827C440B496087248EA2 /* NotoSans-Regular.ttf in Resources */, 928 | F3ACD21CE7E2470EBE5286F6 /* Entypo.ttf in Resources */, 929 | 8DF2257948DF4FEFB62EA403 /* EvilIcons.ttf in Resources */, 930 | BEAE0084C68247F5BAD4EE7B /* FontAwesome.ttf in Resources */, 931 | 5A1D0C2B687541C8B615FA24 /* Foundation.ttf in Resources */, 932 | 3CB645AB166B4964BD32EE3F /* Ionicons.ttf in Resources */, 933 | 0B4CD0D181EB4B67BF8FBCD1 /* MaterialCommunityIcons.ttf in Resources */, 934 | 794F160DA7C44B3381FFAD79 /* MaterialIcons.ttf in Resources */, 935 | A3667C42E8D4469A83F1F7D2 /* Octicons.ttf in Resources */, 936 | B5FB29C6021049BA9F6ECB54 /* SimpleLineIcons.ttf in Resources */, 937 | 664D0FF3D8DD48A7855FC570 /* Zocial.ttf in Resources */, 938 | ); 939 | runOnlyForDeploymentPostprocessing = 0; 940 | }; 941 | 2D02E4791E0B4A5D006451C7 /* Resources */ = { 942 | isa = PBXResourcesBuildPhase; 943 | buildActionMask = 2147483647; 944 | files = ( 945 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, 946 | ); 947 | runOnlyForDeploymentPostprocessing = 0; 948 | }; 949 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = { 950 | isa = PBXResourcesBuildPhase; 951 | buildActionMask = 2147483647; 952 | files = ( 953 | ); 954 | runOnlyForDeploymentPostprocessing = 0; 955 | }; 956 | /* End PBXResourcesBuildPhase section */ 957 | 958 | /* Begin PBXShellScriptBuildPhase section */ 959 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 960 | isa = PBXShellScriptBuildPhase; 961 | buildActionMask = 2147483647; 962 | files = ( 963 | ); 964 | inputPaths = ( 965 | ); 966 | name = "Bundle React Native code and images"; 967 | outputPaths = ( 968 | ); 969 | runOnlyForDeploymentPostprocessing = 0; 970 | shellPath = /bin/sh; 971 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 972 | }; 973 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { 974 | isa = PBXShellScriptBuildPhase; 975 | buildActionMask = 2147483647; 976 | files = ( 977 | ); 978 | inputPaths = ( 979 | ); 980 | name = "Bundle React Native Code And Images"; 981 | outputPaths = ( 982 | ); 983 | runOnlyForDeploymentPostprocessing = 0; 984 | shellPath = /bin/sh; 985 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 986 | }; 987 | /* End PBXShellScriptBuildPhase section */ 988 | 989 | /* Begin PBXSourcesBuildPhase section */ 990 | 00E356EA1AD99517003FC87E /* Sources */ = { 991 | isa = PBXSourcesBuildPhase; 992 | buildActionMask = 2147483647; 993 | files = ( 994 | 00E356F31AD99517003FC87E /* WeatherAppTests.m in Sources */, 995 | ); 996 | runOnlyForDeploymentPostprocessing = 0; 997 | }; 998 | 13B07F871A680F5B00A75B9A /* Sources */ = { 999 | isa = PBXSourcesBuildPhase; 1000 | buildActionMask = 2147483647; 1001 | files = ( 1002 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 1003 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 1004 | ); 1005 | runOnlyForDeploymentPostprocessing = 0; 1006 | }; 1007 | 2D02E4771E0B4A5D006451C7 /* Sources */ = { 1008 | isa = PBXSourcesBuildPhase; 1009 | buildActionMask = 2147483647; 1010 | files = ( 1011 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 1012 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, 1013 | ); 1014 | runOnlyForDeploymentPostprocessing = 0; 1015 | }; 1016 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = { 1017 | isa = PBXSourcesBuildPhase; 1018 | buildActionMask = 2147483647; 1019 | files = ( 1020 | 2DCD954D1E0B4F2C00145EB5 /* WeatherAppTests.m in Sources */, 1021 | ); 1022 | runOnlyForDeploymentPostprocessing = 0; 1023 | }; 1024 | /* End PBXSourcesBuildPhase section */ 1025 | 1026 | /* Begin PBXTargetDependency section */ 1027 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 1028 | isa = PBXTargetDependency; 1029 | target = 13B07F861A680F5B00A75B9A /* WeatherApp */; 1030 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 1031 | }; 1032 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { 1033 | isa = PBXTargetDependency; 1034 | target = 2D02E47A1E0B4A5D006451C7 /* WeatherApp-tvOS */; 1035 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; 1036 | }; 1037 | /* End PBXTargetDependency section */ 1038 | 1039 | /* Begin PBXVariantGroup section */ 1040 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 1041 | isa = PBXVariantGroup; 1042 | children = ( 1043 | 13B07FB21A68108700A75B9A /* Base */, 1044 | ); 1045 | name = LaunchScreen.xib; 1046 | path = WeatherApp; 1047 | sourceTree = ""; 1048 | }; 1049 | /* End PBXVariantGroup section */ 1050 | 1051 | /* Begin XCBuildConfiguration section */ 1052 | 00E356F61AD99517003FC87E /* Debug */ = { 1053 | isa = XCBuildConfiguration; 1054 | buildSettings = { 1055 | BUNDLE_LOADER = "$(TEST_HOST)"; 1056 | GCC_PREPROCESSOR_DEFINITIONS = ( 1057 | "DEBUG=1", 1058 | "$(inherited)", 1059 | ); 1060 | HEADER_SEARCH_PATHS = ( 1061 | "$(inherited)", 1062 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1063 | ); 1064 | INFOPLIST_FILE = WeatherAppTests/Info.plist; 1065 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1066 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1067 | LIBRARY_SEARCH_PATHS = ( 1068 | "$(inherited)", 1069 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1070 | ); 1071 | OTHER_LDFLAGS = ( 1072 | "-ObjC", 1073 | "-lc++", 1074 | ); 1075 | PRODUCT_NAME = "$(TARGET_NAME)"; 1076 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherApp.app/WeatherApp"; 1077 | }; 1078 | name = Debug; 1079 | }; 1080 | 00E356F71AD99517003FC87E /* Release */ = { 1081 | isa = XCBuildConfiguration; 1082 | buildSettings = { 1083 | BUNDLE_LOADER = "$(TEST_HOST)"; 1084 | COPY_PHASE_STRIP = NO; 1085 | HEADER_SEARCH_PATHS = ( 1086 | "$(inherited)", 1087 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1088 | ); 1089 | INFOPLIST_FILE = WeatherAppTests/Info.plist; 1090 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1091 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1092 | LIBRARY_SEARCH_PATHS = ( 1093 | "$(inherited)", 1094 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1095 | ); 1096 | OTHER_LDFLAGS = ( 1097 | "-ObjC", 1098 | "-lc++", 1099 | ); 1100 | PRODUCT_NAME = "$(TARGET_NAME)"; 1101 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherApp.app/WeatherApp"; 1102 | }; 1103 | name = Release; 1104 | }; 1105 | 13B07F941A680F5B00A75B9A /* Debug */ = { 1106 | isa = XCBuildConfiguration; 1107 | buildSettings = { 1108 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1109 | CURRENT_PROJECT_VERSION = 1; 1110 | DEAD_CODE_STRIPPING = NO; 1111 | HEADER_SEARCH_PATHS = ( 1112 | "$(inherited)", 1113 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1114 | ); 1115 | INFOPLIST_FILE = WeatherApp/Info.plist; 1116 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1117 | OTHER_LDFLAGS = ( 1118 | "$(inherited)", 1119 | "-ObjC", 1120 | "-lc++", 1121 | ); 1122 | PRODUCT_NAME = WeatherApp; 1123 | VERSIONING_SYSTEM = "apple-generic"; 1124 | }; 1125 | name = Debug; 1126 | }; 1127 | 13B07F951A680F5B00A75B9A /* Release */ = { 1128 | isa = XCBuildConfiguration; 1129 | buildSettings = { 1130 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1131 | CURRENT_PROJECT_VERSION = 1; 1132 | HEADER_SEARCH_PATHS = ( 1133 | "$(inherited)", 1134 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1135 | ); 1136 | INFOPLIST_FILE = WeatherApp/Info.plist; 1137 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1138 | OTHER_LDFLAGS = ( 1139 | "$(inherited)", 1140 | "-ObjC", 1141 | "-lc++", 1142 | ); 1143 | PRODUCT_NAME = WeatherApp; 1144 | VERSIONING_SYSTEM = "apple-generic"; 1145 | }; 1146 | name = Release; 1147 | }; 1148 | 2D02E4971E0B4A5E006451C7 /* Debug */ = { 1149 | isa = XCBuildConfiguration; 1150 | buildSettings = { 1151 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1152 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1153 | CLANG_ANALYZER_NONNULL = YES; 1154 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1155 | CLANG_WARN_INFINITE_RECURSION = YES; 1156 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1157 | DEBUG_INFORMATION_FORMAT = dwarf; 1158 | ENABLE_TESTABILITY = YES; 1159 | GCC_NO_COMMON_BLOCKS = YES; 1160 | HEADER_SEARCH_PATHS = ( 1161 | "$(inherited)", 1162 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1163 | ); 1164 | INFOPLIST_FILE = "WeatherApp-tvOS/Info.plist"; 1165 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1166 | LIBRARY_SEARCH_PATHS = ( 1167 | "$(inherited)", 1168 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1169 | ); 1170 | OTHER_LDFLAGS = ( 1171 | "-ObjC", 1172 | "-lc++", 1173 | ); 1174 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.WeatherApp-tvOS"; 1175 | PRODUCT_NAME = "$(TARGET_NAME)"; 1176 | SDKROOT = appletvos; 1177 | TARGETED_DEVICE_FAMILY = 3; 1178 | TVOS_DEPLOYMENT_TARGET = 9.2; 1179 | }; 1180 | name = Debug; 1181 | }; 1182 | 2D02E4981E0B4A5E006451C7 /* Release */ = { 1183 | isa = XCBuildConfiguration; 1184 | buildSettings = { 1185 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1186 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1187 | CLANG_ANALYZER_NONNULL = YES; 1188 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1189 | CLANG_WARN_INFINITE_RECURSION = YES; 1190 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1191 | COPY_PHASE_STRIP = NO; 1192 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1193 | GCC_NO_COMMON_BLOCKS = YES; 1194 | HEADER_SEARCH_PATHS = ( 1195 | "$(inherited)", 1196 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 1197 | ); 1198 | INFOPLIST_FILE = "WeatherApp-tvOS/Info.plist"; 1199 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1200 | LIBRARY_SEARCH_PATHS = ( 1201 | "$(inherited)", 1202 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1203 | ); 1204 | OTHER_LDFLAGS = ( 1205 | "-ObjC", 1206 | "-lc++", 1207 | ); 1208 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.WeatherApp-tvOS"; 1209 | PRODUCT_NAME = "$(TARGET_NAME)"; 1210 | SDKROOT = appletvos; 1211 | TARGETED_DEVICE_FAMILY = 3; 1212 | TVOS_DEPLOYMENT_TARGET = 9.2; 1213 | }; 1214 | name = Release; 1215 | }; 1216 | 2D02E4991E0B4A5E006451C7 /* Debug */ = { 1217 | isa = XCBuildConfiguration; 1218 | buildSettings = { 1219 | BUNDLE_LOADER = "$(TEST_HOST)"; 1220 | CLANG_ANALYZER_NONNULL = YES; 1221 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1222 | CLANG_WARN_INFINITE_RECURSION = YES; 1223 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1224 | DEBUG_INFORMATION_FORMAT = dwarf; 1225 | ENABLE_TESTABILITY = YES; 1226 | GCC_NO_COMMON_BLOCKS = YES; 1227 | INFOPLIST_FILE = "WeatherApp-tvOSTests/Info.plist"; 1228 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1229 | LIBRARY_SEARCH_PATHS = ( 1230 | "$(inherited)", 1231 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1232 | ); 1233 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.WeatherApp-tvOSTests"; 1234 | PRODUCT_NAME = "$(TARGET_NAME)"; 1235 | SDKROOT = appletvos; 1236 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherApp-tvOS.app/WeatherApp-tvOS"; 1237 | TVOS_DEPLOYMENT_TARGET = 10.1; 1238 | }; 1239 | name = Debug; 1240 | }; 1241 | 2D02E49A1E0B4A5E006451C7 /* Release */ = { 1242 | isa = XCBuildConfiguration; 1243 | buildSettings = { 1244 | BUNDLE_LOADER = "$(TEST_HOST)"; 1245 | CLANG_ANALYZER_NONNULL = YES; 1246 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1247 | CLANG_WARN_INFINITE_RECURSION = YES; 1248 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1249 | COPY_PHASE_STRIP = NO; 1250 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1251 | GCC_NO_COMMON_BLOCKS = YES; 1252 | INFOPLIST_FILE = "WeatherApp-tvOSTests/Info.plist"; 1253 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1254 | LIBRARY_SEARCH_PATHS = ( 1255 | "$(inherited)", 1256 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1257 | ); 1258 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.WeatherApp-tvOSTests"; 1259 | PRODUCT_NAME = "$(TARGET_NAME)"; 1260 | SDKROOT = appletvos; 1261 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherApp-tvOS.app/WeatherApp-tvOS"; 1262 | TVOS_DEPLOYMENT_TARGET = 10.1; 1263 | }; 1264 | name = Release; 1265 | }; 1266 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 1267 | isa = XCBuildConfiguration; 1268 | buildSettings = { 1269 | ALWAYS_SEARCH_USER_PATHS = NO; 1270 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1271 | CLANG_CXX_LIBRARY = "libc++"; 1272 | CLANG_ENABLE_MODULES = YES; 1273 | CLANG_ENABLE_OBJC_ARC = YES; 1274 | CLANG_WARN_BOOL_CONVERSION = YES; 1275 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1276 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1277 | CLANG_WARN_EMPTY_BODY = YES; 1278 | CLANG_WARN_ENUM_CONVERSION = YES; 1279 | CLANG_WARN_INT_CONVERSION = YES; 1280 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1281 | CLANG_WARN_UNREACHABLE_CODE = YES; 1282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1283 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1284 | COPY_PHASE_STRIP = NO; 1285 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1286 | GCC_C_LANGUAGE_STANDARD = gnu99; 1287 | GCC_DYNAMIC_NO_PIC = NO; 1288 | GCC_OPTIMIZATION_LEVEL = 0; 1289 | GCC_PREPROCESSOR_DEFINITIONS = ( 1290 | "DEBUG=1", 1291 | "$(inherited)", 1292 | ); 1293 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1296 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1298 | GCC_WARN_UNUSED_FUNCTION = YES; 1299 | GCC_WARN_UNUSED_VARIABLE = YES; 1300 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1301 | MTL_ENABLE_DEBUG_INFO = YES; 1302 | ONLY_ACTIVE_ARCH = YES; 1303 | SDKROOT = iphoneos; 1304 | }; 1305 | name = Debug; 1306 | }; 1307 | 83CBBA211A601CBA00E9B192 /* Release */ = { 1308 | isa = XCBuildConfiguration; 1309 | buildSettings = { 1310 | ALWAYS_SEARCH_USER_PATHS = NO; 1311 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1312 | CLANG_CXX_LIBRARY = "libc++"; 1313 | CLANG_ENABLE_MODULES = YES; 1314 | CLANG_ENABLE_OBJC_ARC = YES; 1315 | CLANG_WARN_BOOL_CONVERSION = YES; 1316 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1317 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1318 | CLANG_WARN_EMPTY_BODY = YES; 1319 | CLANG_WARN_ENUM_CONVERSION = YES; 1320 | CLANG_WARN_INT_CONVERSION = YES; 1321 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1322 | CLANG_WARN_UNREACHABLE_CODE = YES; 1323 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1324 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1325 | COPY_PHASE_STRIP = YES; 1326 | ENABLE_NS_ASSERTIONS = NO; 1327 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1328 | GCC_C_LANGUAGE_STANDARD = gnu99; 1329 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1330 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1331 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1332 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1333 | GCC_WARN_UNUSED_FUNCTION = YES; 1334 | GCC_WARN_UNUSED_VARIABLE = YES; 1335 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1336 | MTL_ENABLE_DEBUG_INFO = NO; 1337 | SDKROOT = iphoneos; 1338 | VALIDATE_PRODUCT = YES; 1339 | }; 1340 | name = Release; 1341 | }; 1342 | /* End XCBuildConfiguration section */ 1343 | 1344 | /* Begin XCConfigurationList section */ 1345 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "WeatherAppTests" */ = { 1346 | isa = XCConfigurationList; 1347 | buildConfigurations = ( 1348 | 00E356F61AD99517003FC87E /* Debug */, 1349 | 00E356F71AD99517003FC87E /* Release */, 1350 | ); 1351 | defaultConfigurationIsVisible = 0; 1352 | defaultConfigurationName = Release; 1353 | }; 1354 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "WeatherApp" */ = { 1355 | isa = XCConfigurationList; 1356 | buildConfigurations = ( 1357 | 13B07F941A680F5B00A75B9A /* Debug */, 1358 | 13B07F951A680F5B00A75B9A /* Release */, 1359 | ); 1360 | defaultConfigurationIsVisible = 0; 1361 | defaultConfigurationName = Release; 1362 | }; 1363 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "WeatherApp-tvOS" */ = { 1364 | isa = XCConfigurationList; 1365 | buildConfigurations = ( 1366 | 2D02E4971E0B4A5E006451C7 /* Debug */, 1367 | 2D02E4981E0B4A5E006451C7 /* Release */, 1368 | ); 1369 | defaultConfigurationIsVisible = 0; 1370 | defaultConfigurationName = Release; 1371 | }; 1372 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "WeatherApp-tvOSTests" */ = { 1373 | isa = XCConfigurationList; 1374 | buildConfigurations = ( 1375 | 2D02E4991E0B4A5E006451C7 /* Debug */, 1376 | 2D02E49A1E0B4A5E006451C7 /* Release */, 1377 | ); 1378 | defaultConfigurationIsVisible = 0; 1379 | defaultConfigurationName = Release; 1380 | }; 1381 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "WeatherApp" */ = { 1382 | isa = XCConfigurationList; 1383 | buildConfigurations = ( 1384 | 83CBBA201A601CBA00E9B192 /* Debug */, 1385 | 83CBBA211A601CBA00E9B192 /* Release */, 1386 | ); 1387 | defaultConfigurationIsVisible = 0; 1388 | defaultConfigurationName = Release; 1389 | }; 1390 | /* End XCConfigurationList section */ 1391 | }; 1392 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 1393 | } 1394 | --------------------------------------------------------------------------------