├── .watchmanconfig ├── .babelrc ├── src ├── package.json ├── utils │ ├── package.json │ └── index.js ├── assets │ ├── package.json │ ├── images │ │ ├── cosmos.jpg │ │ ├── prototype.jpg │ │ ├── photoProfile2.png │ │ ├── photoProfile4.png │ │ ├── photoProfile2@2x.png │ │ ├── photoProfile2@3x.png │ │ ├── photoProfile4@2x.png │ │ ├── photoProfile4@3x.png │ │ └── shape.svg │ └── Montserrat-Regular.otf ├── styles │ ├── package.json │ └── index.js ├── components │ ├── Feed │ │ ├── package.json │ │ ├── components │ │ │ ├── Story │ │ │ │ ├── package.json │ │ │ │ ├── index.js │ │ │ │ ├── StoryHeader.js │ │ │ │ └── StoryFooter.js │ │ │ ├── FeedHeader.js │ │ │ └── StoryInput.js │ │ ├── index.js │ │ ├── FeedContainer.js │ │ └── Feed.js │ ├── package.json │ └── index.js └── index.js ├── screenshot.png ├── 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 │ │ │ ├── assets │ │ │ └── fonts │ │ │ │ ├── Entypo.ttf │ │ │ │ ├── Ionicons.ttf │ │ │ │ ├── Octicons.ttf │ │ │ │ ├── Zocial.ttf │ │ │ │ ├── EvilIcons.ttf │ │ │ │ ├── Foundation.ttf │ │ │ │ ├── FontAwesome.ttf │ │ │ │ ├── MaterialIcons.ttf │ │ │ │ └── SimpleLineIcons.ttf │ │ │ ├── java │ │ │ └── com │ │ │ │ └── feed │ │ │ │ ├── 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 ├── .buckconfig ├── index.android.js ├── index.ios.js ├── __tests__ ├── index.ios.js └── index.android.js ├── ios ├── feed │ ├── AppDelegate.h │ ├── main.m │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.m │ ├── Info.plist │ └── Base.lproj │ │ └── LaunchScreen.xib ├── feedTests │ ├── Info.plist │ └── feedTests.m └── feed.xcodeproj │ ├── xcshareddata │ └── xcschemes │ │ └── feed.xcscheme │ └── project.pbxproj ├── database.sql ├── .gitignore ├── .github └── FUNDING.yml ├── package.json ├── LICENCE.md ├── .flowconfig └── README.md /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } -------------------------------------------------------------------------------- /src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@src" 3 | } 4 | -------------------------------------------------------------------------------- /src/utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@utils" 3 | } 4 | -------------------------------------------------------------------------------- /src/assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@assets" 3 | } 4 | -------------------------------------------------------------------------------- /src/styles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@styles" 3 | } 4 | -------------------------------------------------------------------------------- /src/components/Feed/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Feed" 3 | } 4 | -------------------------------------------------------------------------------- /src/components/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@components" 3 | } 4 | -------------------------------------------------------------------------------- /src/components/Feed/components/Story/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@Story" 3 | } 4 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/screenshot.png -------------------------------------------------------------------------------- /src/assets/images/cosmos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/cosmos.jpg -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | feed 3 | 4 | -------------------------------------------------------------------------------- /src/assets/images/prototype.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/prototype.jpg -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | /* @flow weak */ 2 | import Feed from '@components/Feed' 3 | 4 | export { 5 | Feed 6 | } 7 | -------------------------------------------------------------------------------- /src/assets/Montserrat-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/Montserrat-Regular.otf -------------------------------------------------------------------------------- /src/assets/images/photoProfile2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile2.png -------------------------------------------------------------------------------- /src/assets/images/photoProfile4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile4.png -------------------------------------------------------------------------------- /src/assets/images/photoProfile2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile2@2x.png -------------------------------------------------------------------------------- /src/assets/images/photoProfile2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile2@3x.png -------------------------------------------------------------------------------- /src/assets/images/photoProfile4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile4@2x.png -------------------------------------------------------------------------------- /src/assets/images/photoProfile4@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/src/assets/images/photoProfile4@3x.png -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SimpleLineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/assets/fonts/SimpleLineIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/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/haikyuu/react-native-feed/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haikyuu/react-native-feed/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = 'debug', 3 | store = 'debug.keystore', 4 | properties = 'debug.keystore.properties', 5 | visibility = [ 6 | 'PUBLIC', 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import Root from './src' 4 | 5 | import { 6 | AppRegistry 7 | } from 'react-native' 8 | 9 | AppRegistry.registerComponent('feed', () => Root); 10 | -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import Root from './src' 4 | 5 | import { 6 | AppRegistry 7 | } from 'react-native' 8 | 9 | AppRegistry.registerComponent('feed', () => Root); 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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.4-all.zip 6 | -------------------------------------------------------------------------------- /src/styles/index.js: -------------------------------------------------------------------------------- 1 | const colors = { 2 | text: { 3 | body: '#48565e', 4 | grey: '#8f9fa9' 5 | }, 6 | border: { 7 | lightgrey: '#e4e4e4', 8 | greyblue: '#dce5eb' 9 | }, 10 | icon:{ 11 | 12 | }, 13 | } 14 | 15 | export { 16 | colors 17 | } 18 | -------------------------------------------------------------------------------- /__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 | -------------------------------------------------------------------------------- /src/components/Feed/index.js: -------------------------------------------------------------------------------- 1 | /* @flow weak */ 2 | import FeedContainer from '@components/Feed/FeedContainer' 3 | import FeedHeader from '@components/Feed/components/FeedHeader' 4 | import StoryInput from '@components/Feed/components/StoryInput' 5 | import Story from '@components/Feed/components/Story' 6 | 7 | export default FeedContainer 8 | 9 | export { 10 | FeedHeader, 11 | StoryInput, 12 | Story, 13 | } 14 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'feed' 2 | 3 | include ':app' 4 | include ':react-native-vector-icons' 5 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 6 | include ':react-native-image-picker' 7 | project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android') 8 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/feed/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.feed; 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 "feed"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ios/feed/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 | -------------------------------------------------------------------------------- /database.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE users ( 2 | id serial primary key, 3 | name character varying(40) NOT NULL 4 | ); 5 | 6 | CREATE TABLE post ( 7 | id serial primary key, 8 | body character varying(250), 9 | createdat timestamp without time zone DEFAULT now(), 10 | image text, 11 | userid int NOT NULL REFERENCES users(id) 12 | ); 13 | 14 | CREATE TABLE user_like_post ( 15 | userid integer NOT NULL REFERENCES users, 16 | postid integer NOT NULL REFERENCES post 17 | ); 18 | INSERT INTO users (id, name) VALUES (1, 'abdellah'); 19 | -------------------------------------------------------------------------------- /ios/feed/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 | -------------------------------------------------------------------------------- /.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/IJ 26 | # 27 | *.iml 28 | .idea 29 | .gradle 30 | local.properties 31 | 32 | # node.js 33 | # 34 | node_modules/ 35 | npm-debug.log 36 | 37 | # BUCK 38 | buck-out/ 39 | \.buckd/ 40 | android/app/libs 41 | android/keystores/debug.keystore 42 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* @flow weak */ 2 | 3 | import React, { Component } from 'react'; 4 | import { 5 | Feed 6 | } from '@components' 7 | import ApolloClient, { createNetworkInterface } from 'apollo-client'; 8 | import { ApolloProvider } from 'react-apollo'; 9 | 10 | const client = new ApolloClient({ 11 | networkInterface: createNetworkInterface({ uri: 'http://localhost:5000/graphql' }), 12 | }); 13 | class Root extends React.Component{ 14 | constructor(props){ 15 | super(props) 16 | } 17 | render(){ 18 | return ( 19 | 20 | 21 | 22 | ) 23 | } 24 | } 25 | export default Root 26 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [haikyuu] 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 | -------------------------------------------------------------------------------- /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:1.3.1' 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feed", 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 | }, 9 | "dependencies": { 10 | "apollo-client": "^0.5.18", 11 | "graphql-tag": "^1.1.2", 12 | "moment": "^2.16.0", 13 | "react": "~15.3.1", 14 | "react-apollo": "^0.7.1", 15 | "react-native": "0.37.0", 16 | "react-native-image-picker": "latest", 17 | "react-native-vector-icons": "^3.0.0" 18 | }, 19 | "devDependencies": { 20 | "babel-jest": "17.0.2", 21 | "babel-preset-react-native": "1.9.0", 22 | "jest": "17.0.2", 23 | "jest-react-native": "17.0.2", 24 | "react-test-renderer": "~15.3.1" 25 | }, 26 | "jest": { 27 | "preset": "jest-react-native" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ios/feed/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /src/components/Feed/FeedContainer.js: -------------------------------------------------------------------------------- 1 | /* @flow weak */ 2 | import React, { Component } from 'react'; 3 | import Feed from '@components/Feed/Feed' 4 | import { graphql } from 'react-apollo'; 5 | import gql from 'graphql-tag'; 6 | 7 | const query = gql` 8 | { 9 | allPosts (orderBy: CREATEDAT_DESC){ 10 | nodes{ 11 | __id 12 | id 13 | body 14 | image 15 | createdat 16 | userByUserid{ 17 | id 18 | name 19 | } 20 | userLikePostsByPostid{ 21 | totalCount 22 | nodes{ 23 | userByUserid{ 24 | id 25 | name 26 | } 27 | } 28 | } 29 | } 30 | } 31 | } 32 | ` 33 | const FeedContainer = graphql(query, { 34 | options: { pollInterval: 20000 }, 35 | })(Feed) 36 | 37 | 38 | export default FeedContainer 39 | -------------------------------------------------------------------------------- /ios/feedTests/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 | -------------------------------------------------------------------------------- /LICENCE.md: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/feed/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.feed; 2 | 3 | import android.app.Application; 4 | import android.util.Log; 5 | 6 | import com.facebook.react.ReactApplication; 7 | import com.oblador.vectoricons.VectorIconsPackage; 8 | import com.imagepicker.ImagePickerPackage; 9 | import com.facebook.react.ReactInstanceManager; 10 | import com.facebook.react.ReactNativeHost; 11 | import com.facebook.react.ReactPackage; 12 | import com.facebook.react.shell.MainReactPackage; 13 | 14 | import java.util.Arrays; 15 | import java.util.List; 16 | 17 | public class MainApplication extends Application implements ReactApplication { 18 | 19 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 20 | @Override 21 | protected boolean getUseDeveloperSupport() { 22 | return BuildConfig.DEBUG; 23 | } 24 | 25 | @Override 26 | protected List getPackages() { 27 | return Arrays.asList( 28 | new MainReactPackage(), 29 | new VectorIconsPackage(), 30 | new ImagePickerPackage() 31 | ); 32 | } 33 | }; 34 | 35 | @Override 36 | public ReactNativeHost getReactNativeHost() { 37 | return mReactNativeHost; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /ios/feed/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 "RCTBundleURLProvider.h" 13 | #import "RCTRootView.h" 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:@"feed" 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 | -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | # To learn about Buck see [Docs](https://buckbuild.com/). 4 | # To run your application with Buck: 5 | # - install Buck 6 | # - `npm start` - to start the packager 7 | # - `cd android` 8 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 9 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 10 | # - `buck install -r android/app` - compile, install and run application 11 | # 12 | 13 | lib_deps = [] 14 | for jarfile in glob(['libs/*.jar']): 15 | name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) 16 | lib_deps.append(':' + name) 17 | prebuilt_jar( 18 | name = name, 19 | binary_jar = jarfile, 20 | ) 21 | 22 | for aarfile in glob(['libs/*.aar']): 23 | name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) 24 | lib_deps.append(':' + name) 25 | android_prebuilt_aar( 26 | name = name, 27 | aar = aarfile, 28 | ) 29 | 30 | android_library( 31 | name = 'all-libs', 32 | exported_deps = lib_deps 33 | ) 34 | 35 | android_library( 36 | name = 'app-code', 37 | srcs = glob([ 38 | 'src/main/java/**/*.java', 39 | ]), 40 | deps = [ 41 | ':all-libs', 42 | ':build_config', 43 | ':res', 44 | ], 45 | ) 46 | 47 | android_build_config( 48 | name = 'build_config', 49 | package = 'com.feed', 50 | ) 51 | 52 | android_resource( 53 | name = 'res', 54 | res = 'src/main/res', 55 | package = 'com.feed', 56 | ) 57 | 58 | android_binary( 59 | name = 'app', 60 | package_type = 'debug', 61 | manifest = 'src/main/AndroidManifest.xml', 62 | keystore = '//android/keystores:debug', 63 | deps = [ 64 | ':app-code', 65 | ], 66 | ) 67 | -------------------------------------------------------------------------------- /src/components/Feed/Feed.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import {ScrollView, Text, View, StyleSheet, ActivityIndicator} from 'react-native' 3 | import React from 'react' 4 | 5 | import {FeedHeader, StoryInput, Story} from '@components/Feed' 6 | class Feed extends React.Component { 7 | constructor(props) { 8 | super(props) 9 | } 10 | onRefreshClicked() { 11 | this.props.data.refetch(); 12 | } 13 | renderData() { 14 | if (this.props.data.loading) { 15 | return 16 | } else if(this.props.data.allPosts.nodes.length === 0){ 17 | return Nothing to show ... Try to post something 18 | } else{ 19 | return this.props.data.allPosts.nodes.map((post, index) => { 20 | return 24 | }) 25 | } 26 | } 27 | render() { 28 | return ( 29 | 30 | {/* */} 31 | 32 | 36 | {this.renderData()} 37 | 38 | 39 | ) 40 | } 41 | } 42 | const styles = StyleSheet.create({ 43 | container: { 44 | flex: 1, 45 | marginTop: 20, 46 | backgroundColor: '#f4f3f3' 47 | }, 48 | story: { 49 | marginBottom: 8 50 | }, 51 | emptyFeedMessage:{ 52 | color: '#90a0a9', 53 | alignSelf: 'center', 54 | marginTop: 10 55 | } 56 | }) 57 | export default Feed 58 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | 3 | # We fork some components by platform. 4 | .*/*[.]android.js 5 | 6 | # Ignore templates with `@flow` in header 7 | .*/local-cli/generator.* 8 | 9 | # Ignore malformed json 10 | .*/node_modules/y18n/test/.*\.json 11 | 12 | # Ignore the website subdir 13 | /website/.* 14 | 15 | # Ignore BUCK generated dirs 16 | /\.buckd/ 17 | 18 | # Ignore unexpected extra @providesModule 19 | .*/node_modules/commoner/test/source/widget/share.js 20 | 21 | # Ignore duplicate module providers 22 | # For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root 23 | .*/Libraries/react-native/React.js 24 | .*/Libraries/react-native/ReactNative.js 25 | .*/node_modules/jest-runtime/build/__tests__/.* 26 | 27 | [include] 28 | 29 | [libs] 30 | node_modules/react-native/Libraries/react-native/react-native-interface.js 31 | node_modules/react-native/flow 32 | flow/ 33 | 34 | [options] 35 | module.system=haste 36 | 37 | esproposal.class_static_fields=enable 38 | esproposal.class_instance_fields=enable 39 | 40 | experimental.strict_type_args=true 41 | 42 | munge_underscores=true 43 | 44 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' 45 | 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' 46 | 47 | suppress_type=$FlowIssue 48 | suppress_type=$FlowFixMe 49 | suppress_type=$FixMe 50 | 51 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 52 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-3]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 53 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 54 | 55 | unsafe.enable_getters_and_setters=true 56 | 57 | [version] 58 | ^0.33.0 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React-native Feed 2 | 3 | An experimental feed app built with react-native. 4 | 5 | ## Screenshot 6 | 7 | ![Screenshot](screenshot.png?raw=true "Feed Screenshot") 8 | 9 | ## Getting Started 10 | 11 | These instructions will get you up and running.🏃 12 | 13 | ### Prerequisites 14 | 15 | You'll need a running🏃 [postgresql](https://www.postgresql.org/download/) database 16 | Check this awesome [guide](https://github.com/calebmer/postgraphql/blob/master/examples/forum/TUTORIAL.md#installation) 17 | 18 | ### Installing 19 | Create the database 20 | ``` 21 | createdb feed 22 | psql feed < database.sql 23 | ``` 24 | Install everything. (You should try [yarn](https://yarnpkg.com/)) 25 | ``` 26 | npm install -g postgraphql 27 | npm install 28 | ``` 29 | Ruuun : 🏃🏃🏃 30 | ``` 31 | postgraphql -c postgres://localhost:5432/feed --watch 32 | react-native run-ios 33 | #or 34 | react-native run-android 35 | ``` 36 | 37 | Image upload won't work out of the box (the body parser of the node.js server has a default size limit of `100kb`), you'll need to change that: 38 | - Find where postgraphql was installed : 39 | ``` 40 | npm bin -g 41 | cd to the given location 42 | #you'll find a symlink to postgraphql 43 | cd to the original folder 44 | ``` 45 | 46 | - [Change `src/postgraphql/http/createPostGraphQLHttpRequestHandler.js` ](https://github.com/calebmer/postgraphql/pull/285/files) and include `limit: '50mb'` in the `bodyparser` options. [Check this](https://github.com/calebmer/postgraphql/pull/285/files) 47 | 48 | ## Built With 49 | 50 | * [react-native](https://facebook.github.io/react-native/) 51 | * [apollo-client](http://dev.apollodata.com/) - The **awesome** graphql client 52 | * [graphql](http://graphql.org/) 53 | * [postgresql](https://www.postgresql.org/) 54 | * [postgraphql](https://github.com/calebmer/postgraphql) - The **amazing** Graphql API creator. 55 | 56 | ## License 57 | 58 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details 59 | -------------------------------------------------------------------------------- /ios/feed/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 | NSExceptionDomains 44 | 45 | localhost 46 | 47 | NSExceptionAllowsInsecureHTTPLoads 48 | 49 | 50 | 51 | 52 | UIAppFonts 53 | 54 | Entypo.ttf 55 | EvilIcons.ttf 56 | FontAwesome.ttf 57 | Foundation.ttf 58 | Ionicons.ttf 59 | MaterialIcons.ttf 60 | Octicons.ttf 61 | SimpleLineIcons.ttf 62 | Zocial.ttf 63 | 64 | 65 | -------------------------------------------------------------------------------- /ios/feedTests/feedTests.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 "RCTLog.h" 14 | #import "RCTRootView.h" 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface feedTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation feedTests 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 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import { 3 | Platform, 4 | } from 'react-native' 5 | import moment from 'moment' 6 | import Icon from 'react-native-vector-icons/Ionicons' 7 | 8 | const generateRandomColor = () : string =>{ 9 | const CSS_COLOR_NAMES = ["AliceBlue","AntiqueWhite","Aqua","Aquamarine","Azure","Beige","Bisque","Black","BlanchedAlmond","Blue","BlueViolet","Brown","BurlyWood","CadetBlue","Chartreuse","Chocolate","Coral","CornflowerBlue","Cornsilk","Crimson","Cyan","DarkBlue","DarkCyan","DarkGoldenRod","DarkGray","DarkGrey","DarkGreen","DarkKhaki","DarkMagenta","DarkOliveGreen","Darkorange","DarkOrchid","DarkRed","DarkSalmon","DarkSeaGreen","DarkSlateBlue","DarkSlateGray","DarkSlateGrey","DarkTurquoise","DarkViolet","DeepPink","DeepSkyBlue","DimGray","DimGrey","DodgerBlue","FireBrick","FloralWhite","ForestGreen","Fuchsia","Gainsboro","GhostWhite","Gold","GoldenRod","Gray","Grey","Green","GreenYellow","HoneyDew","HotPink","IndianRed","Indigo","Ivory","Khaki","Lavender","LavenderBlush","LawnGreen","LemonChiffon","LightBlue","LightCoral","LightCyan","LightGoldenRodYellow","LightGray","LightGrey","LightGreen","LightPink","LightSalmon","LightSeaGreen","LightSkyBlue","LightSlateGray","LightSlateGrey","LightSteelBlue","LightYellow","Lime","LimeGreen","Linen","Magenta","Maroon","MediumAquaMarine","MediumBlue","MediumOrchid","MediumPurple","MediumSeaGreen","MediumSlateBlue","MediumSpringGreen","MediumTurquoise","MediumVioletRed","MidnightBlue","MintCream","MistyRose","Moccasin","NavajoWhite","Navy","OldLace","Olive","OliveDrab","Orange","OrangeRed","Orchid","PaleGoldenRod","PaleGreen","PaleTurquoise","PaleVioletRed","PapayaWhip","PeachPuff","Peru","Pink","Plum","PowderBlue","Purple","Red","RosyBrown","RoyalBlue","SaddleBrown","Salmon","SandyBrown","SeaGreen","SeaShell","Sienna","Silver","SkyBlue","SlateBlue","SlateGray","SlateGrey","Snow","SpringGreen","SteelBlue","Tan","Teal","Thistle","Tomato","Turquoise","Violet","Wheat","White","WhiteSmoke","Yellow","YellowGreen"]; 10 | function getRandomIntInclusive(min, max) { 11 | min = Math.ceil(min); 12 | max = Math.floor(max); 13 | return Math.floor(Math.random() * (max - min + 1)) + min; 14 | } 15 | return CSS_COLOR_NAMES[getRandomIntInclusive(0, CSS_COLOR_NAMES.length-1)].toLowerCase() 16 | } 17 | 18 | //get icon depending on platform 19 | let ionicon = (icon:string):string => Platform.OS === 'ios' ? `ios-${icon}` :`md-${icon}` 20 | 21 | ionicon.outline = (icon:string) => Platform.OS === 'ios' ? `ios-${icon}-outline`:`md-${icon}` 22 | 23 | export { 24 | generateRandomColor, 25 | moment, 26 | ionicon, 27 | Icon, 28 | } 29 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /src/components/Feed/components/Story/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import React from 'react' 4 | import { 5 | View, 6 | Text, 7 | StyleSheet, 8 | TouchableOpacity, 9 | Image, 10 | Dimensions, 11 | Animated, 12 | LayoutAnimation, 13 | Easing, 14 | } from 'react-native' 15 | const { width } = Dimensions.get('window') 16 | import StoryHeader from '@components/Feed/components/Story/StoryHeader' 17 | import StoryFooter from '@components/Feed/components/Story/StoryFooter' 18 | import { 19 | generateRandomColor, 20 | Icon, 21 | ionicon, 22 | } from '@utils' 23 | 24 | import { 25 | colors 26 | } from '@styles' 27 | class Story extends React.Component { 28 | constructor(props) { 29 | super(props) 30 | this.state = { 31 | fadeAnim: new Animated.Value(0), // init opacity 0 32 | }; 33 | } 34 | componentDidMount() { 35 | console.log("this.props: ", this.props); 36 | Animated.sequence([ 37 | Animated.delay(this.props.index * 200), 38 | Animated.timing( // Uses easing functions 39 | this.state.fadeAnim, // The value to drive 40 | { 41 | toValue: 1, 42 | easing: Easing.elastic(.5) 43 | } // Configuration 44 | ) 45 | ]).start(); 46 | } 47 | 48 | renderBody(props){ 49 | let imageSource 50 | if (props.image) { 51 | imageSource = { 52 | uri: 'data:image/jpeg;base64,' + props.image, 53 | // isStatic: true 54 | }; 55 | } 56 | return ( 57 | 58 | {props.body} 59 | { 60 | imageSource? 61 | 62 | : 63 | null 64 | // 65 | } 66 | 67 | ) 68 | } 69 | render(){ 70 | return ( 71 | 80 | 81 | {this.renderBody(this.props)} 82 | 83 | 84 | ) 85 | } 86 | } 87 | const styles = StyleSheet.create({ 88 | container: { 89 | flex: 1, 90 | // borderColor: colors.border.greyblue, borderWidth: 2, 91 | backgroundColor: 'white', 92 | borderRadius: 2.1, shadowOpacity: .1, shadowRadius: 1, 93 | shadowOffset: {width:1, height: 1} 94 | }, 95 | textBody: { fontSize: 15, color: colors.text.black, paddingHorizontal: 14,}, 96 | footer: { marginHorizontal: 16, marginTop: 13, }, 97 | postImage: { height: 220, width: width - 22, marginTop:8 }, 98 | }) 99 | export default Story 100 | export { 101 | StoryFooter, 102 | StoryHeader, 103 | } 104 | -------------------------------------------------------------------------------- /src/components/Feed/components/Story/StoryHeader.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* 3 | StoryHeader 4 | 5 | */ 6 | import React from 'react' 7 | import { 8 | View, 9 | Text, 10 | StyleSheet, 11 | TouchableOpacity, 12 | Image, 13 | ActionSheetIOS, 14 | Platform 15 | } from 'react-native' 16 | import { 17 | generateRandomColor, 18 | Icon, 19 | ionicon, 20 | moment 21 | } from '@utils' 22 | 23 | import gql from 'graphql-tag'; 24 | import { graphql } from 'react-apollo'; 25 | 26 | 27 | import { colors } from '@styles' 28 | 29 | const defaultProps: StoryHeaderProps = { 30 | publisher: { 31 | type: 'attendee', 32 | publisher_id: 'id', // NOTE when organizer => no id 33 | publisher_name: 'Christina Hendricks', 34 | }, 35 | created: "2016-11-15T12:53:21.146Z", 36 | avatar: require('@assets/images/photoProfile2.png'), 37 | } 38 | class StoryHeader extends React.Component { 39 | constructor(props:StoryHeaderProps) { 40 | super(props) 41 | this.handleMorePress = this.handleMorePress.bind(this) 42 | } 43 | render(){ 44 | const created = moment(this.props.createdat).fromNow(true) 45 | return ( 46 | 47 | 48 | 49 | {this.props.userByUserid.name} 50 | {created + ' ago'} 51 | 52 | {/*TODO: check if post is mine*/} 53 | 54 | 55 | 56 | 57 | ) 58 | } 59 | handleMorePress = () => { 60 | const BUTTONS = [ 61 | 'Delete', 62 | 'Cancel' 63 | ]; 64 | const DESTRUCTIVE_INDEX = 0; 65 | const CANCEL_INDEX = 1; 66 | if(Platform.OS === 'ios'){ 67 | ActionSheetIOS.showActionSheetWithOptions({ 68 | options: BUTTONS, 69 | cancelButtonIndex: CANCEL_INDEX, 70 | destructiveButtonIndex: DESTRUCTIVE_INDEX, 71 | }, 72 | (buttonIndex) => { 73 | if (buttonIndex === DESTRUCTIVE_INDEX) { 74 | //TODO check if it's the user's post first 75 | //TODO check also in the database 76 | this.props.deletePost() 77 | this.props.refetch() 78 | } 79 | }); 80 | }else{ 81 | //TODO 82 | } 83 | }; 84 | } 85 | const styles = StyleSheet.create({ 86 | container: { 87 | flex: 1, justifyContent: 'center', flexDirection: 'row', 88 | margin: 12, 89 | backgroundColor: 'white', 90 | }, 91 | avatar: { 92 | width: 36, height: 36, 93 | marginRight: 12, borderRadius: 18, 94 | }, 95 | informations: { flex: 1, }, 96 | publisher: { fontSize: 16, color: colors.text.black, }, 97 | publishedDate: { fontSize: 11.7, color: colors.text.grey, }, 98 | moreButton: { alignSelf: 'center'} 99 | }) 100 | StoryHeader.defaultProps = defaultProps 101 | const deletePostQuery = gql` 102 | mutation deletePost ($post: DeletePostByIdInput!){ 103 | deletePostById(input: $post){ 104 | deletedPostId 105 | } 106 | } 107 | ` 108 | export default graphql(deletePostQuery, { 109 | props: ({ ownProps, mutate })=> { 110 | return ({ 111 | deletePost: () => mutate({ variables: { 112 | "post": { 113 | "id": ownProps.id 114 | } 115 | }}) 116 | }) 117 | } 118 | })(StoryHeader) 119 | // export default StoryHeader 120 | -------------------------------------------------------------------------------- /src/components/Feed/components/FeedHeader.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* 3 | Display a header image, and event info 4 | needs to parse the date into a readable format 5 | NOTE: 6 | Edge cases 7 | [x] april 28 - mars 3 might take more space. 8 | TODO: 9 | [x] parse dates using moment.js 10 | [] i18n : 11 | [x] Load moment from @utils folder 12 | [] #i18n 13 | */ 14 | type FeedHeaderProps = { 15 | style?: any, 16 | image: any, 17 | title: string, 18 | location: string, 19 | startDate: number, 20 | endDate: number, 21 | }; 22 | //test props 23 | FeedHeader.defaultProps = { 24 | image: require('@assets/images/cosmos.jpg'), 25 | title: 'React Native App', 26 | location: 'Graphql City', 27 | startDate: 1479227834989, 28 | endDate: 1479227837989, 29 | } 30 | import React from 'react' 31 | import { 32 | View, 33 | Text, 34 | Image, 35 | Dimensions, 36 | StyleSheet, 37 | } from 'react-native' 38 | import { 39 | generateRandomColor, 40 | moment, 41 | ionicon, 42 | Icon, 43 | } from '@utils' 44 | const { width, height } = Dimensions.get('window') 45 | 46 | function parseDateDifference(startDate: number, endDate: number):string{ 47 | /* takes 2 dates 48 | returns April 2 - 7 | April 27 - Mars 2 | 49 | */ 50 | const separator = ' - ' 51 | const parsedStartDate = moment(startDate).format("MMM D"); 52 | if(moment(startDate).isSame(endDate, 'day')){ 53 | return parsedStartDate 54 | }else if (moment(startDate).month === moment(startDate).month) { 55 | return parsedStartDate + separator + moment(endDate).format("D") 56 | } else{ 57 | const parsedEndDate = moment(endDate).format("MMM D"); 58 | return parsedStartDate + separator + parsedEndDate 59 | } 60 | } 61 | function FeedHeader(props:FeedHeaderProps){ 62 | const parsedPeriod = parseDateDifference(props.startDate, props.endDate) 63 | return ( 64 | 65 | 66 | 67 | {props.title} 68 | 69 | 70 | 71 | 72 | {props.location} 73 | 74 | 75 | 76 | 77 | {parsedPeriod} 78 | 79 | 80 | 81 | 82 | ) 83 | } 84 | 85 | const styles = StyleSheet.create({ 86 | container: { flex: 1, height: 210, backgroundColor: 'white', }, 87 | headerImage: { width, height: 154, }, 88 | informationsContainer: { 89 | flexDirection: 'column', justifyContent: 'center', flex: 1, 90 | borderColor: '#dce5eb', borderWidth: 1, 91 | }, 92 | title: { 93 | textAlign: 'center', fontSize: 17, fontWeight: '600', 94 | color: '#525253', marginBottom: 2, 95 | }, 96 | subInformationsContainer: { justifyContent: 'center', flexDirection: 'row' }, 97 | leftInformationsContainer: { marginRight: 13.4, flexDirection: 'row' }, 98 | rightInformationsContainer: { flexDirection: 'row' }, 99 | icon: { width: 18, height: 18 }, 100 | leftIcon: { marginRight: -4 }, 101 | informationsText: {color: '#787878', fontSize: 13.7, fontWeight: '400'}, 102 | }) 103 | export default FeedHeader 104 | -------------------------------------------------------------------------------- /ios/feed/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 | -------------------------------------------------------------------------------- /src/assets/images/shape.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 40DAD7E7-3656-4F9A-8304-07DF709DDF42 5 | Created with sketchtool. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /ios/feed.xcodeproj/xcshareddata/xcschemes/feed.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /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.feed" 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 project(':react-native-image-picker') 131 | compile fileTree(dir: "libs", include: ["*.jar"]) 132 | compile "com.android.support:appcompat-v7:23.0.1" 133 | compile "com.facebook.react:react-native:+" // From node_modules 134 | } 135 | 136 | // Run this once to be able to run the application with BUCK 137 | // puts all compile dependencies into folder libs for BUCK to use 138 | task copyDownloadableDepsToLibs(type: Copy) { 139 | from configurations.compile 140 | into 'libs' 141 | } 142 | -------------------------------------------------------------------------------- /src/components/Feed/components/StoryInput.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | /* 4 | an input that grows up when clicked to show up fullscreen 5 | displays an image on the left and parses mentions and hashtags 6 | accepts images too 7 | NOTE: 8 | - 9 | TODO: 10 | - [] animate to show fullscreen 11 | - [] parse mentions in style 12 | - [] autocomplete users 13 | - [] parse mentions to users: generate an object 14 | - [x] get an image from device storage 15 | - [x] get an image live from camera 16 | - [] get an image from camera roll 17 | - [] display the chosen image in small format under the text (facebook like) 18 | -[x] Maybe next to the input 19 | - [] remove image 20 | */ 21 | import React from 'react' 22 | import { 23 | View, 24 | Text, 25 | Image, 26 | TextInput, 27 | TouchableOpacity, 28 | StyleSheet, 29 | Platform 30 | } from 'react-native' 31 | import {generateRandomColor, Icon, ionicon} from '@utils' 32 | import gql from 'graphql-tag'; 33 | import {graphql} from 'react-apollo'; 34 | import ImagePicker from 'react-native-image-picker' 35 | const defaultAvatar = require('@assets/images/photoProfile4.png') 36 | class StoryInput extends React.Component { 37 | constructor(props) { 38 | super(props) 39 | this.state = { 40 | textValue: '', 41 | avatarSource: defaultAvatar, 42 | data: undefined 43 | } 44 | this.onSubmit = this.onSubmit.bind(this) 45 | } 46 | handleCameraAction() { 47 | var options = { 48 | title: 'Select Avatar', 49 | customButtons: [ 50 | { 51 | name: 'fb', 52 | title: 'Choose Photo from Facebook' 53 | } 54 | ], 55 | storageOptions: { 56 | skipBackup: true, 57 | path: 'images' 58 | }, 59 | allowsEditing: true 60 | }; 61 | 62 | /** 63 | * The first arg is the options object for customization (it can also be null or omitted for default options), 64 | * The second arg is the callback which sends object: response (more info below in README) 65 | */ 66 | ImagePicker.showImagePicker(options, (response) => { 67 | console.log('Response = ', response); 68 | 69 | if (response.didCancel) { 70 | console.log('User cancelled image picker'); 71 | } else if (response.error) { 72 | console.log('ImagePicker Error: ', response.error); 73 | } else if (response.customButton) { 74 | console.log('User tapped custom button: ', response.customButton); 75 | } else { 76 | // You can display the image using either data... 77 | const source = { 78 | uri: 'data:image/jpeg;base64,' + response.data, 79 | isStatic: true 80 | }; 81 | 82 | // or a reference to the platform specific asset location 83 | // if (Platform.OS === 'ios') { 84 | // const source = { 85 | // uri: response.uri.replace('file://', ''), 86 | // isStatic: true 87 | // }; 88 | // } else { 89 | // const source = { 90 | // uri: response.uri, 91 | // isStatic: true 92 | // }; 93 | // } 94 | 95 | this.setState({avatarSource: source, data: response.data}); 96 | } 97 | }, function(err) { 98 | console.log("err: ", err); 99 | }); 100 | } 101 | onSubmit() { 102 | this.props.submit({body: this.state.textValue, image: this.state.data}).then(({data}) => { 103 | console.log('got data', data); 104 | this.props.onRefreshClicked() 105 | this.setState({textValue: '', avatarSource: defaultAvatar, data: undefined}) 106 | }).catch((error) => { 107 | console.log('there was an error sending the query', error); 108 | }); 109 | } 110 | handleTextChange(textValue) { 111 | this.setState({textValue}) 112 | } 113 | render() { 114 | 115 | return ( 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | ) 125 | } 126 | } 127 | const styles = StyleSheet.create({ 128 | container: { 129 | flex: 1, 130 | height: 45, 131 | flexDirection: 'row', 132 | backgroundColor: 'white' 133 | }, 134 | avatar: { 135 | width: 30, 136 | height: 30, 137 | marginVertical: 7.5, 138 | borderRadius: 15, 139 | marginLeft: 11, 140 | marginRight: 16 141 | }, 142 | textInput: { 143 | height: 45, 144 | color: 'black', 145 | flex: 1 146 | }, 147 | cameraButton: { 148 | alignSelf: 'center', 149 | marginRight: 11 150 | } 151 | }) 152 | 153 | const submitPost = gql ` 154 | mutation createPost ($post: CreatePostInput!){ 155 | createPost(input: $post){ 156 | post{ 157 | id 158 | body 159 | } 160 | } 161 | } 162 | ` 163 | export default graphql(submitPost, { 164 | props: ({mutate}) => ({ 165 | submit: ({ 166 | body, 167 | userId = 1, 168 | image 169 | }) => mutate({ 170 | variables: { 171 | post: { 172 | post: { 173 | body, 174 | userid: userId, 175 | image 176 | } 177 | } 178 | } 179 | }) 180 | }) 181 | })(StoryInput) 182 | -------------------------------------------------------------------------------- /src/components/Feed/components/Story/StoryFooter.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* 3 | StoryFooter 4 | Like, Comment and share actions 5 | */ 6 | import React from 'react' 7 | import { 8 | View, 9 | Text, 10 | StyleSheet, 11 | TouchableOpacity, 12 | Share, 13 | Animated, 14 | } from 'react-native' 15 | import { 16 | generateRandomColor, 17 | Icon, 18 | ionicon, 19 | } from '@utils' 20 | import { 21 | colors 22 | } from '@styles' 23 | const IconAnimated = Animated.createAnimatedComponent(Icon) 24 | import gql from 'graphql-tag'; 25 | import { graphql } from 'react-apollo'; 26 | 27 | 28 | class AnimatedIcon extends React.Component{ 29 | constructor(props){ 30 | super(props) 31 | this.state = { 32 | fadeAnim: new Animated.Value(0), // init opacity 0 33 | }; 34 | } 35 | componentDidMount(){ 36 | Animated.timing( // Uses easing functions 37 | this.state.fadeAnim, // The value to drive 38 | {toValue: 1} // Configuration 39 | ).start(); 40 | } 41 | render(){ 42 | return ( 43 | 46 | ) 47 | } 48 | } 49 | type StoryFooterProps = { 50 | style?: any, 51 | likes: number, 52 | comments: number, 53 | liked_by_user: boolean 54 | } 55 | 56 | const defaultProps: StoryFooterProps = { 57 | likes: 0, 58 | comments: 0, 59 | liked_by_user: false, 60 | } 61 | class StoryFooter extends React.Component { 62 | constructor(props:StoryFooterProps) { 63 | super(props) 64 | this.state = { 65 | likedByCurrentUser: 66 | this.props.userLikePostsByPostid.nodes.some(user=>user.userByUserid.id === this.props.userByUserid.id) 67 | && 68 | this.props.userLikePostsByPostid.totalCount !== 0, 69 | } 70 | this.like = this.like.bind(this) 71 | this.unlike = this.unlike.bind(this) 72 | this.onLikePress = this.onLikePress.bind(this) 73 | } 74 | 75 | onLikePress(){ 76 | if (this.state.likedByCurrentUser) { 77 | this.unlike() 78 | }else{ 79 | this.like() 80 | } 81 | } 82 | like(){ 83 | this.setState({ 84 | likedByCurrentUser: !this.state.likedByCurrentUser, 85 | }) 86 | this.props.likePost({userId: 1}) 87 | .then(({ data }) => { 88 | console.log('got data', data); 89 | this.props.refetch().then(data=>{ 90 | 91 | }) 92 | }).catch((error) => { 93 | this.setState({ 94 | likedByCurrentUser: !this.state.likedByCurrentUser, 95 | }) 96 | console.log('there was an error sending the query', error); 97 | }); 98 | } 99 | unlike(){ 100 | this.setState({ 101 | likedByCurrentUser: !this.state.likedByCurrentUser, 102 | }) 103 | this.props.unlikePost({userId: 1}) 104 | .then(({ data }) => { 105 | console.log('got data', data); 106 | this.props.refetch().then(data=>{ 107 | 108 | }) 109 | }).catch((error) => { 110 | this.setState({ 111 | likedByCurrentUser: !this.state.likedByCurrentUser, 112 | }) 113 | console.log('there was an error sending the query', error); 114 | }); 115 | } 116 | share(){ 117 | Share.share({ 118 | message: this.props.body, 119 | title: 'Post by ' + this.props.userByUserid.name, 120 | url: "https://google.com", 121 | }, { 122 | dialogTitle: "Share post", 123 | tintColor: 'papayawhip', 124 | }).then(this.showResult) 125 | } 126 | showResult(result){ 127 | if (result.action === Share.sharedAction) { 128 | if (result.activityType) { 129 | console.log("result.activityType: ", result.activityType); 130 | } else { 131 | console.log("shared"); 132 | } 133 | } else if (result.action === Share.dismissedAction) { 134 | console.log("dismissed"); 135 | } 136 | } 137 | render(){ 138 | //TODO: use yahoo intl 139 | let likes = this.props.userLikePostsByPostid.totalCount 140 | // let likes = rand 141 | let likesText 142 | if (likes === 0) { 143 | likesText = 'Like' 144 | }else if(likes === 1){ 145 | likesText = '1 Like' 146 | }else{ 147 | likesText = likes + ' Likes' 148 | } 149 | let commentsText 150 | if (this.props.comments === 0) { 151 | commentsText = 'Comment' 152 | }else if(this.props.comments === 1){ 153 | commentsText = '1 Comment' 154 | }else{ 155 | commentsText = this.props.comments + ' Comments' 156 | } 157 | 158 | return ( 159 | 160 | 161 | 162 | { 163 | this.state.likedByCurrentUser? 164 | 170 | : 171 | 175 | } 176 | 177 | {likesText} 178 | 179 | {/* 180 | 181 | 182 | 183 | {commentsText} 184 | */} 185 | 186 | 187 | 188 | 189 | Share 190 | 191 | 192 | ) 193 | } 194 | } 195 | const styles = StyleSheet.create({ 196 | container: { 197 | flex: 1, justifyContent: 'space-around', flexDirection: 'row', 198 | padding: 13, 199 | borderTopColor: colors.border.lightgrey, borderTopWidth: .5, 200 | }, 201 | actionContainer: { flexDirection: 'row', alignItems: 'center'}, 202 | actionButton: { marginRight: 8, }, 203 | actionText: { color: colors.text.grey, fontSize: 14, } 204 | }) 205 | StoryFooter.defaultProps = defaultProps 206 | 207 | const likeQuery = gql` 208 | mutation likePost ($userlikepost: CreateUserLikePostInput!){ 209 | createUserLikePost(input: $userlikepost){ 210 | userLikePost { 211 | userid 212 | } 213 | } 214 | } 215 | ` 216 | const unlikeQuery = gql` 217 | mutation unlikePost ($userlikepost: DeleteUserLikePostByUseridAndPostidInput!){ 218 | deleteUserLikePostByUseridAndPostid(input: $userlikepost){ 219 | userLikePost { 220 | userid 221 | } 222 | } 223 | } 224 | ` 225 | export default graphql(likeQuery, { 226 | props: ({ ownProps, mutate })=> ({ 227 | likePost: ({body, userId = 1}) => mutate({ variables: { 228 | "userlikepost": { 229 | "userLikePost": { 230 | "userid": 1, 231 | "postid": ownProps.id 232 | } 233 | } 234 | }}) 235 | }) 236 | })( 237 | graphql(unlikeQuery, { 238 | props: ({ ownProps, mutate })=> { 239 | return ({ 240 | unlikePost: ({body, userId = 1}) => mutate({ variables: { 241 | "userlikepost": { 242 | "userid": 1, 243 | "postid": ownProps.id 244 | } 245 | }}) 246 | }) 247 | } 248 | })(StoryFooter) 249 | ) 250 | // export default StoryFooter 251 | -------------------------------------------------------------------------------- /ios/feed.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 00E356F31AD99517003FC87E /* feedTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* feedTests.m */; }; 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 | 140AB141A94E4BACB6D90A05 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9B0C1ABC0FF1461ABC092A6D /* Octicons.ttf */; }; 24 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 25 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 26 | 160210A5D58F48BA8874EDA6 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F00F92EEE6904396A5584D56 /* Foundation.ttf */; }; 27 | 1839769A091445B4926AA23F /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6C779162BD4D442CBCFE585C /* FontAwesome.ttf */; }; 28 | 51E545F391EA434BA187BA68 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 54EE02DA44CD4870B83A8EE8 /* Entypo.ttf */; }; 29 | 53F5FDEBFA6A44649BF52E25 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D4ADE6D9BFC946ADB48FB29D /* libRNVectorIcons.a */; }; 30 | 5CB13608725147DE98F2F889 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 45AED4C1D84643D18C5A6CA5 /* SimpleLineIcons.ttf */; }; 31 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 32 | A225E67092C64B528CFD2E86 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 38EE7F6E00A34FA8AC0C8D04 /* Zocial.ttf */; }; 33 | A8EA009FAB3A42CEAF11CDF3 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F3C34962D6BD495CA054BD86 /* Ionicons.ttf */; }; 34 | BA5AD6596AFF49D28FC4F221 /* libRNImagePicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 75AC3004D3C946938AFF13E8 /* libRNImagePicker.a */; }; 35 | C8935433CE6848B0B4DB7F09 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9E8ADB3048114FB88993C050 /* MaterialIcons.ttf */; }; 36 | CD7657FBE87842BC8AAD5E2D /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEDA29B6302F4492ABFAECE0 /* EvilIcons.ttf */; }; 37 | /* End PBXBuildFile section */ 38 | 39 | /* Begin PBXContainerItemProxy section */ 40 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 43 | proxyType = 2; 44 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 45 | remoteInfo = RCTActionSheet; 46 | }; 47 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 50 | proxyType = 2; 51 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 52 | remoteInfo = RCTGeolocation; 53 | }; 54 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 55 | isa = PBXContainerItemProxy; 56 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 57 | proxyType = 2; 58 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 59 | remoteInfo = RCTImage; 60 | }; 61 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 62 | isa = PBXContainerItemProxy; 63 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 64 | proxyType = 2; 65 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 66 | remoteInfo = RCTNetwork; 67 | }; 68 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 69 | isa = PBXContainerItemProxy; 70 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 71 | proxyType = 2; 72 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 73 | remoteInfo = RCTVibration; 74 | }; 75 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 76 | isa = PBXContainerItemProxy; 77 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 78 | proxyType = 1; 79 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 80 | remoteInfo = feed; 81 | }; 82 | 0C52A9C41E08119C00BC1C08 /* PBXContainerItemProxy */ = { 83 | isa = PBXContainerItemProxy; 84 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 85 | proxyType = 2; 86 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 87 | remoteInfo = "RCTImage-tvOS"; 88 | }; 89 | 0C52A9C81E08119C00BC1C08 /* PBXContainerItemProxy */ = { 90 | isa = PBXContainerItemProxy; 91 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 92 | proxyType = 2; 93 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 94 | remoteInfo = "RCTLinking-tvOS"; 95 | }; 96 | 0C52A9CC1E08119C00BC1C08 /* PBXContainerItemProxy */ = { 97 | isa = PBXContainerItemProxy; 98 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 99 | proxyType = 2; 100 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 101 | remoteInfo = "RCTNetwork-tvOS"; 102 | }; 103 | 0C52A9D01E08119C00BC1C08 /* PBXContainerItemProxy */ = { 104 | isa = PBXContainerItemProxy; 105 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 106 | proxyType = 2; 107 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 108 | remoteInfo = "RCTSettings-tvOS"; 109 | }; 110 | 0C52A9D41E08119C00BC1C08 /* PBXContainerItemProxy */ = { 111 | isa = PBXContainerItemProxy; 112 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 113 | proxyType = 2; 114 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 115 | remoteInfo = "RCTText-tvOS"; 116 | }; 117 | 0C52A9D91E08119C00BC1C08 /* PBXContainerItemProxy */ = { 118 | isa = PBXContainerItemProxy; 119 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 120 | proxyType = 2; 121 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 122 | remoteInfo = "RCTWebSocket-tvOS"; 123 | }; 124 | 0C52A9DD1E08119C00BC1C08 /* PBXContainerItemProxy */ = { 125 | isa = PBXContainerItemProxy; 126 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 127 | proxyType = 2; 128 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 129 | remoteInfo = "React-tvOS"; 130 | }; 131 | 0C52A9E01E08119C00BC1C08 /* PBXContainerItemProxy */ = { 132 | isa = PBXContainerItemProxy; 133 | containerPortal = 030963DA8A15405B96F81959 /* RNImagePicker.xcodeproj */; 134 | proxyType = 2; 135 | remoteGlobalIDString = 014A3B5C1C6CF33500B6D375; 136 | remoteInfo = RNImagePicker; 137 | }; 138 | 0C52A9E31E08119C00BC1C08 /* PBXContainerItemProxy */ = { 139 | isa = PBXContainerItemProxy; 140 | containerPortal = F20B6C561D8B4D88B67A0392 /* RNVectorIcons.xcodeproj */; 141 | proxyType = 2; 142 | remoteGlobalIDString = 5DBEB1501B18CEA900B34395; 143 | remoteInfo = RNVectorIcons; 144 | }; 145 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 146 | isa = PBXContainerItemProxy; 147 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 148 | proxyType = 2; 149 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 150 | remoteInfo = RCTSettings; 151 | }; 152 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 153 | isa = PBXContainerItemProxy; 154 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 155 | proxyType = 2; 156 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 157 | remoteInfo = RCTWebSocket; 158 | }; 159 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 160 | isa = PBXContainerItemProxy; 161 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 162 | proxyType = 2; 163 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 164 | remoteInfo = React; 165 | }; 166 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 167 | isa = PBXContainerItemProxy; 168 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 169 | proxyType = 2; 170 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 171 | remoteInfo = RCTLinking; 172 | }; 173 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 174 | isa = PBXContainerItemProxy; 175 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 176 | proxyType = 2; 177 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 178 | remoteInfo = RCTText; 179 | }; 180 | /* End PBXContainerItemProxy section */ 181 | 182 | /* Begin PBXFileReference section */ 183 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 184 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 185 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 186 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 187 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 188 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 189 | 00E356EE1AD99517003FC87E /* feedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = feedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 190 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 191 | 00E356F21AD99517003FC87E /* feedTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = feedTests.m; sourceTree = ""; }; 192 | 030963DA8A15405B96F81959 /* RNImagePicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNImagePicker.xcodeproj; path = "../node_modules/react-native-image-picker/ios/RNImagePicker.xcodeproj"; sourceTree = ""; }; 193 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 194 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 195 | 13B07F961A680F5B00A75B9A /* feed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = feed.app; sourceTree = BUILT_PRODUCTS_DIR; }; 196 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = feed/AppDelegate.h; sourceTree = ""; }; 197 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = feed/AppDelegate.m; sourceTree = ""; }; 198 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 199 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = feed/Images.xcassets; sourceTree = ""; }; 200 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = feed/Info.plist; sourceTree = ""; }; 201 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = feed/main.m; sourceTree = ""; }; 202 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 203 | 38EE7F6E00A34FA8AC0C8D04 /* 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 = ""; }; 204 | 45AED4C1D84643D18C5A6CA5 /* 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 = ""; }; 205 | 54EE02DA44CD4870B83A8EE8 /* 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 = ""; }; 206 | 6C779162BD4D442CBCFE585C /* 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 = ""; }; 207 | 75AC3004D3C946938AFF13E8 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; 208 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 209 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 210 | 9B0C1ABC0FF1461ABC092A6D /* 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 = ""; }; 211 | 9E8ADB3048114FB88993C050 /* 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 = ""; }; 212 | AEDA29B6302F4492ABFAECE0 /* 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 = ""; }; 213 | D4ADE6D9BFC946ADB48FB29D /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 214 | F00F92EEE6904396A5584D56 /* 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 = ""; }; 215 | F20B6C561D8B4D88B67A0392 /* 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 = ""; }; 216 | F3C34962D6BD495CA054BD86 /* 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 = ""; }; 217 | /* End PBXFileReference section */ 218 | 219 | /* Begin PBXFrameworksBuildPhase section */ 220 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 221 | isa = PBXFrameworksBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 229 | isa = PBXFrameworksBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 233 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 234 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 235 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 236 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 237 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 238 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 239 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 240 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 241 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 242 | BA5AD6596AFF49D28FC4F221 /* libRNImagePicker.a in Frameworks */, 243 | 53F5FDEBFA6A44649BF52E25 /* libRNVectorIcons.a in Frameworks */, 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | /* End PBXFrameworksBuildPhase section */ 248 | 249 | /* Begin PBXGroup section */ 250 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 254 | ); 255 | name = Products; 256 | sourceTree = ""; 257 | }; 258 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 259 | isa = PBXGroup; 260 | children = ( 261 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 262 | ); 263 | name = Products; 264 | sourceTree = ""; 265 | }; 266 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 267 | isa = PBXGroup; 268 | children = ( 269 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 270 | 0C52A9C51E08119C00BC1C08 /* libRCTImage-tvOS.a */, 271 | ); 272 | name = Products; 273 | sourceTree = ""; 274 | }; 275 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 276 | isa = PBXGroup; 277 | children = ( 278 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 279 | 0C52A9CD1E08119C00BC1C08 /* libRCTNetwork-tvOS.a */, 280 | ); 281 | name = Products; 282 | sourceTree = ""; 283 | }; 284 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 285 | isa = PBXGroup; 286 | children = ( 287 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 288 | ); 289 | name = Products; 290 | sourceTree = ""; 291 | }; 292 | 00E356EF1AD99517003FC87E /* feedTests */ = { 293 | isa = PBXGroup; 294 | children = ( 295 | 00E356F21AD99517003FC87E /* feedTests.m */, 296 | 00E356F01AD99517003FC87E /* Supporting Files */, 297 | ); 298 | path = feedTests; 299 | sourceTree = ""; 300 | }; 301 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 302 | isa = PBXGroup; 303 | children = ( 304 | 00E356F11AD99517003FC87E /* Info.plist */, 305 | ); 306 | name = "Supporting Files"; 307 | sourceTree = ""; 308 | }; 309 | 0C52A9BC1E08119B00BC1C08 /* Products */ = { 310 | isa = PBXGroup; 311 | children = ( 312 | 0C52A9E11E08119C00BC1C08 /* libRNImagePicker.a */, 313 | ); 314 | name = Products; 315 | sourceTree = ""; 316 | }; 317 | 0C52A9BE1E08119B00BC1C08 /* Products */ = { 318 | isa = PBXGroup; 319 | children = ( 320 | 0C52A9E41E08119C00BC1C08 /* libRNVectorIcons.a */, 321 | ); 322 | name = Products; 323 | sourceTree = ""; 324 | }; 325 | 0F4CD6E6E12D4102A9936D69 /* Resources */ = { 326 | isa = PBXGroup; 327 | children = ( 328 | 54EE02DA44CD4870B83A8EE8 /* Entypo.ttf */, 329 | AEDA29B6302F4492ABFAECE0 /* EvilIcons.ttf */, 330 | 6C779162BD4D442CBCFE585C /* FontAwesome.ttf */, 331 | F00F92EEE6904396A5584D56 /* Foundation.ttf */, 332 | F3C34962D6BD495CA054BD86 /* Ionicons.ttf */, 333 | 9E8ADB3048114FB88993C050 /* MaterialIcons.ttf */, 334 | 9B0C1ABC0FF1461ABC092A6D /* Octicons.ttf */, 335 | 45AED4C1D84643D18C5A6CA5 /* SimpleLineIcons.ttf */, 336 | 38EE7F6E00A34FA8AC0C8D04 /* Zocial.ttf */, 337 | ); 338 | name = Resources; 339 | sourceTree = ""; 340 | }; 341 | 139105B71AF99BAD00B5F7CC /* Products */ = { 342 | isa = PBXGroup; 343 | children = ( 344 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 345 | 0C52A9D11E08119C00BC1C08 /* libRCTSettings-tvOS.a */, 346 | ); 347 | name = Products; 348 | sourceTree = ""; 349 | }; 350 | 139FDEE71B06529A00C62182 /* Products */ = { 351 | isa = PBXGroup; 352 | children = ( 353 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 354 | 0C52A9DA1E08119C00BC1C08 /* libRCTWebSocket-tvOS.a */, 355 | ); 356 | name = Products; 357 | sourceTree = ""; 358 | }; 359 | 13B07FAE1A68108700A75B9A /* feed */ = { 360 | isa = PBXGroup; 361 | children = ( 362 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 363 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 364 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 365 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 366 | 13B07FB61A68108700A75B9A /* Info.plist */, 367 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 368 | 13B07FB71A68108700A75B9A /* main.m */, 369 | ); 370 | name = feed; 371 | sourceTree = ""; 372 | }; 373 | 146834001AC3E56700842450 /* Products */ = { 374 | isa = PBXGroup; 375 | children = ( 376 | 146834041AC3E56700842450 /* libReact.a */, 377 | 0C52A9DE1E08119C00BC1C08 /* libReact-tvOS.a */, 378 | ); 379 | name = Products; 380 | sourceTree = ""; 381 | }; 382 | 78C398B11ACF4ADC00677621 /* Products */ = { 383 | isa = PBXGroup; 384 | children = ( 385 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 386 | 0C52A9C91E08119C00BC1C08 /* libRCTLinking-tvOS.a */, 387 | ); 388 | name = Products; 389 | sourceTree = ""; 390 | }; 391 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 392 | isa = PBXGroup; 393 | children = ( 394 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 395 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 396 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 397 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 398 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 399 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 400 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 401 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 402 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 403 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 404 | 030963DA8A15405B96F81959 /* RNImagePicker.xcodeproj */, 405 | F20B6C561D8B4D88B67A0392 /* RNVectorIcons.xcodeproj */, 406 | ); 407 | name = Libraries; 408 | sourceTree = ""; 409 | }; 410 | 832341B11AAA6A8300B99B32 /* Products */ = { 411 | isa = PBXGroup; 412 | children = ( 413 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 414 | 0C52A9D51E08119C00BC1C08 /* libRCTText-tvOS.a */, 415 | ); 416 | name = Products; 417 | sourceTree = ""; 418 | }; 419 | 83CBB9F61A601CBA00E9B192 = { 420 | isa = PBXGroup; 421 | children = ( 422 | 13B07FAE1A68108700A75B9A /* feed */, 423 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 424 | 00E356EF1AD99517003FC87E /* feedTests */, 425 | 83CBBA001A601CBA00E9B192 /* Products */, 426 | 0F4CD6E6E12D4102A9936D69 /* Resources */, 427 | ); 428 | indentWidth = 2; 429 | sourceTree = ""; 430 | tabWidth = 2; 431 | }; 432 | 83CBBA001A601CBA00E9B192 /* Products */ = { 433 | isa = PBXGroup; 434 | children = ( 435 | 13B07F961A680F5B00A75B9A /* feed.app */, 436 | 00E356EE1AD99517003FC87E /* feedTests.xctest */, 437 | ); 438 | name = Products; 439 | sourceTree = ""; 440 | }; 441 | /* End PBXGroup section */ 442 | 443 | /* Begin PBXNativeTarget section */ 444 | 00E356ED1AD99517003FC87E /* feedTests */ = { 445 | isa = PBXNativeTarget; 446 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "feedTests" */; 447 | buildPhases = ( 448 | 00E356EA1AD99517003FC87E /* Sources */, 449 | 00E356EB1AD99517003FC87E /* Frameworks */, 450 | 00E356EC1AD99517003FC87E /* Resources */, 451 | ); 452 | buildRules = ( 453 | ); 454 | dependencies = ( 455 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 456 | ); 457 | name = feedTests; 458 | productName = feedTests; 459 | productReference = 00E356EE1AD99517003FC87E /* feedTests.xctest */; 460 | productType = "com.apple.product-type.bundle.unit-test"; 461 | }; 462 | 13B07F861A680F5B00A75B9A /* feed */ = { 463 | isa = PBXNativeTarget; 464 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "feed" */; 465 | buildPhases = ( 466 | 13B07F871A680F5B00A75B9A /* Sources */, 467 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 468 | 13B07F8E1A680F5B00A75B9A /* Resources */, 469 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 470 | ); 471 | buildRules = ( 472 | ); 473 | dependencies = ( 474 | ); 475 | name = feed; 476 | productName = "Hello World"; 477 | productReference = 13B07F961A680F5B00A75B9A /* feed.app */; 478 | productType = "com.apple.product-type.application"; 479 | }; 480 | /* End PBXNativeTarget section */ 481 | 482 | /* Begin PBXProject section */ 483 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 484 | isa = PBXProject; 485 | attributes = { 486 | LastUpgradeCheck = 610; 487 | ORGANIZATIONNAME = Facebook; 488 | TargetAttributes = { 489 | 00E356ED1AD99517003FC87E = { 490 | CreatedOnToolsVersion = 6.2; 491 | TestTargetID = 13B07F861A680F5B00A75B9A; 492 | }; 493 | }; 494 | }; 495 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "feed" */; 496 | compatibilityVersion = "Xcode 3.2"; 497 | developmentRegion = English; 498 | hasScannedForEncodings = 0; 499 | knownRegions = ( 500 | en, 501 | Base, 502 | ); 503 | mainGroup = 83CBB9F61A601CBA00E9B192; 504 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 505 | projectDirPath = ""; 506 | projectReferences = ( 507 | { 508 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 509 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 510 | }, 511 | { 512 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 513 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 514 | }, 515 | { 516 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 517 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 518 | }, 519 | { 520 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 521 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 522 | }, 523 | { 524 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 525 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 526 | }, 527 | { 528 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 529 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 530 | }, 531 | { 532 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 533 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 534 | }, 535 | { 536 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 537 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 538 | }, 539 | { 540 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 541 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 542 | }, 543 | { 544 | ProductGroup = 146834001AC3E56700842450 /* Products */; 545 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 546 | }, 547 | { 548 | ProductGroup = 0C52A9BC1E08119B00BC1C08 /* Products */; 549 | ProjectRef = 030963DA8A15405B96F81959 /* RNImagePicker.xcodeproj */; 550 | }, 551 | { 552 | ProductGroup = 0C52A9BE1E08119B00BC1C08 /* Products */; 553 | ProjectRef = F20B6C561D8B4D88B67A0392 /* RNVectorIcons.xcodeproj */; 554 | }, 555 | ); 556 | projectRoot = ""; 557 | targets = ( 558 | 13B07F861A680F5B00A75B9A /* feed */, 559 | 00E356ED1AD99517003FC87E /* feedTests */, 560 | ); 561 | }; 562 | /* End PBXProject section */ 563 | 564 | /* Begin PBXReferenceProxy section */ 565 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 566 | isa = PBXReferenceProxy; 567 | fileType = archive.ar; 568 | path = libRCTActionSheet.a; 569 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 570 | sourceTree = BUILT_PRODUCTS_DIR; 571 | }; 572 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 573 | isa = PBXReferenceProxy; 574 | fileType = archive.ar; 575 | path = libRCTGeolocation.a; 576 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 577 | sourceTree = BUILT_PRODUCTS_DIR; 578 | }; 579 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 580 | isa = PBXReferenceProxy; 581 | fileType = archive.ar; 582 | path = libRCTImage.a; 583 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 584 | sourceTree = BUILT_PRODUCTS_DIR; 585 | }; 586 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 587 | isa = PBXReferenceProxy; 588 | fileType = archive.ar; 589 | path = libRCTNetwork.a; 590 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 591 | sourceTree = BUILT_PRODUCTS_DIR; 592 | }; 593 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 594 | isa = PBXReferenceProxy; 595 | fileType = archive.ar; 596 | path = libRCTVibration.a; 597 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 598 | sourceTree = BUILT_PRODUCTS_DIR; 599 | }; 600 | 0C52A9C51E08119C00BC1C08 /* libRCTImage-tvOS.a */ = { 601 | isa = PBXReferenceProxy; 602 | fileType = archive.ar; 603 | path = "libRCTImage-tvOS.a"; 604 | remoteRef = 0C52A9C41E08119C00BC1C08 /* PBXContainerItemProxy */; 605 | sourceTree = BUILT_PRODUCTS_DIR; 606 | }; 607 | 0C52A9C91E08119C00BC1C08 /* libRCTLinking-tvOS.a */ = { 608 | isa = PBXReferenceProxy; 609 | fileType = archive.ar; 610 | path = "libRCTLinking-tvOS.a"; 611 | remoteRef = 0C52A9C81E08119C00BC1C08 /* PBXContainerItemProxy */; 612 | sourceTree = BUILT_PRODUCTS_DIR; 613 | }; 614 | 0C52A9CD1E08119C00BC1C08 /* libRCTNetwork-tvOS.a */ = { 615 | isa = PBXReferenceProxy; 616 | fileType = archive.ar; 617 | path = "libRCTNetwork-tvOS.a"; 618 | remoteRef = 0C52A9CC1E08119C00BC1C08 /* PBXContainerItemProxy */; 619 | sourceTree = BUILT_PRODUCTS_DIR; 620 | }; 621 | 0C52A9D11E08119C00BC1C08 /* libRCTSettings-tvOS.a */ = { 622 | isa = PBXReferenceProxy; 623 | fileType = archive.ar; 624 | path = "libRCTSettings-tvOS.a"; 625 | remoteRef = 0C52A9D01E08119C00BC1C08 /* PBXContainerItemProxy */; 626 | sourceTree = BUILT_PRODUCTS_DIR; 627 | }; 628 | 0C52A9D51E08119C00BC1C08 /* libRCTText-tvOS.a */ = { 629 | isa = PBXReferenceProxy; 630 | fileType = archive.ar; 631 | path = "libRCTText-tvOS.a"; 632 | remoteRef = 0C52A9D41E08119C00BC1C08 /* PBXContainerItemProxy */; 633 | sourceTree = BUILT_PRODUCTS_DIR; 634 | }; 635 | 0C52A9DA1E08119C00BC1C08 /* libRCTWebSocket-tvOS.a */ = { 636 | isa = PBXReferenceProxy; 637 | fileType = archive.ar; 638 | path = "libRCTWebSocket-tvOS.a"; 639 | remoteRef = 0C52A9D91E08119C00BC1C08 /* PBXContainerItemProxy */; 640 | sourceTree = BUILT_PRODUCTS_DIR; 641 | }; 642 | 0C52A9DE1E08119C00BC1C08 /* libReact-tvOS.a */ = { 643 | isa = PBXReferenceProxy; 644 | fileType = archive.ar; 645 | path = "libReact-tvOS.a"; 646 | remoteRef = 0C52A9DD1E08119C00BC1C08 /* PBXContainerItemProxy */; 647 | sourceTree = BUILT_PRODUCTS_DIR; 648 | }; 649 | 0C52A9E11E08119C00BC1C08 /* libRNImagePicker.a */ = { 650 | isa = PBXReferenceProxy; 651 | fileType = archive.ar; 652 | path = libRNImagePicker.a; 653 | remoteRef = 0C52A9E01E08119C00BC1C08 /* PBXContainerItemProxy */; 654 | sourceTree = BUILT_PRODUCTS_DIR; 655 | }; 656 | 0C52A9E41E08119C00BC1C08 /* libRNVectorIcons.a */ = { 657 | isa = PBXReferenceProxy; 658 | fileType = archive.ar; 659 | path = libRNVectorIcons.a; 660 | remoteRef = 0C52A9E31E08119C00BC1C08 /* PBXContainerItemProxy */; 661 | sourceTree = BUILT_PRODUCTS_DIR; 662 | }; 663 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 664 | isa = PBXReferenceProxy; 665 | fileType = archive.ar; 666 | path = libRCTSettings.a; 667 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 668 | sourceTree = BUILT_PRODUCTS_DIR; 669 | }; 670 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 671 | isa = PBXReferenceProxy; 672 | fileType = archive.ar; 673 | path = libRCTWebSocket.a; 674 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 675 | sourceTree = BUILT_PRODUCTS_DIR; 676 | }; 677 | 146834041AC3E56700842450 /* libReact.a */ = { 678 | isa = PBXReferenceProxy; 679 | fileType = archive.ar; 680 | path = libReact.a; 681 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 682 | sourceTree = BUILT_PRODUCTS_DIR; 683 | }; 684 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 685 | isa = PBXReferenceProxy; 686 | fileType = archive.ar; 687 | path = libRCTLinking.a; 688 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 689 | sourceTree = BUILT_PRODUCTS_DIR; 690 | }; 691 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 692 | isa = PBXReferenceProxy; 693 | fileType = archive.ar; 694 | path = libRCTText.a; 695 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 696 | sourceTree = BUILT_PRODUCTS_DIR; 697 | }; 698 | /* End PBXReferenceProxy section */ 699 | 700 | /* Begin PBXResourcesBuildPhase section */ 701 | 00E356EC1AD99517003FC87E /* Resources */ = { 702 | isa = PBXResourcesBuildPhase; 703 | buildActionMask = 2147483647; 704 | files = ( 705 | ); 706 | runOnlyForDeploymentPostprocessing = 0; 707 | }; 708 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 709 | isa = PBXResourcesBuildPhase; 710 | buildActionMask = 2147483647; 711 | files = ( 712 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 713 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 714 | 51E545F391EA434BA187BA68 /* Entypo.ttf in Resources */, 715 | CD7657FBE87842BC8AAD5E2D /* EvilIcons.ttf in Resources */, 716 | 1839769A091445B4926AA23F /* FontAwesome.ttf in Resources */, 717 | 160210A5D58F48BA8874EDA6 /* Foundation.ttf in Resources */, 718 | A8EA009FAB3A42CEAF11CDF3 /* Ionicons.ttf in Resources */, 719 | C8935433CE6848B0B4DB7F09 /* MaterialIcons.ttf in Resources */, 720 | 140AB141A94E4BACB6D90A05 /* Octicons.ttf in Resources */, 721 | 5CB13608725147DE98F2F889 /* SimpleLineIcons.ttf in Resources */, 722 | A225E67092C64B528CFD2E86 /* Zocial.ttf in Resources */, 723 | ); 724 | runOnlyForDeploymentPostprocessing = 0; 725 | }; 726 | /* End PBXResourcesBuildPhase section */ 727 | 728 | /* Begin PBXShellScriptBuildPhase section */ 729 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 730 | isa = PBXShellScriptBuildPhase; 731 | buildActionMask = 2147483647; 732 | files = ( 733 | ); 734 | inputPaths = ( 735 | ); 736 | name = "Bundle React Native code and images"; 737 | outputPaths = ( 738 | ); 739 | runOnlyForDeploymentPostprocessing = 0; 740 | shellPath = /bin/sh; 741 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 742 | }; 743 | /* End PBXShellScriptBuildPhase section */ 744 | 745 | /* Begin PBXSourcesBuildPhase section */ 746 | 00E356EA1AD99517003FC87E /* Sources */ = { 747 | isa = PBXSourcesBuildPhase; 748 | buildActionMask = 2147483647; 749 | files = ( 750 | 00E356F31AD99517003FC87E /* feedTests.m in Sources */, 751 | ); 752 | runOnlyForDeploymentPostprocessing = 0; 753 | }; 754 | 13B07F871A680F5B00A75B9A /* Sources */ = { 755 | isa = PBXSourcesBuildPhase; 756 | buildActionMask = 2147483647; 757 | files = ( 758 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 759 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 760 | ); 761 | runOnlyForDeploymentPostprocessing = 0; 762 | }; 763 | /* End PBXSourcesBuildPhase section */ 764 | 765 | /* Begin PBXTargetDependency section */ 766 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 767 | isa = PBXTargetDependency; 768 | target = 13B07F861A680F5B00A75B9A /* feed */; 769 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 770 | }; 771 | /* End PBXTargetDependency section */ 772 | 773 | /* Begin PBXVariantGroup section */ 774 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 775 | isa = PBXVariantGroup; 776 | children = ( 777 | 13B07FB21A68108700A75B9A /* Base */, 778 | ); 779 | name = LaunchScreen.xib; 780 | path = feed; 781 | sourceTree = ""; 782 | }; 783 | /* End PBXVariantGroup section */ 784 | 785 | /* Begin XCBuildConfiguration section */ 786 | 00E356F61AD99517003FC87E /* Debug */ = { 787 | isa = XCBuildConfiguration; 788 | buildSettings = { 789 | BUNDLE_LOADER = "$(TEST_HOST)"; 790 | GCC_PREPROCESSOR_DEFINITIONS = ( 791 | "DEBUG=1", 792 | "$(inherited)", 793 | ); 794 | INFOPLIST_FILE = feedTests/Info.plist; 795 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 796 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 797 | LIBRARY_SEARCH_PATHS = ( 798 | "$(inherited)", 799 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 800 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 801 | ); 802 | PRODUCT_NAME = "$(TARGET_NAME)"; 803 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/feed.app/feed"; 804 | }; 805 | name = Debug; 806 | }; 807 | 00E356F71AD99517003FC87E /* Release */ = { 808 | isa = XCBuildConfiguration; 809 | buildSettings = { 810 | BUNDLE_LOADER = "$(TEST_HOST)"; 811 | COPY_PHASE_STRIP = NO; 812 | INFOPLIST_FILE = feedTests/Info.plist; 813 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 814 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 815 | LIBRARY_SEARCH_PATHS = ( 816 | "$(inherited)", 817 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 818 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 819 | ); 820 | PRODUCT_NAME = "$(TARGET_NAME)"; 821 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/feed.app/feed"; 822 | }; 823 | name = Release; 824 | }; 825 | 13B07F941A680F5B00A75B9A /* Debug */ = { 826 | isa = XCBuildConfiguration; 827 | buildSettings = { 828 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 829 | CURRENT_PROJECT_VERSION = 1; 830 | DEAD_CODE_STRIPPING = NO; 831 | HEADER_SEARCH_PATHS = ( 832 | "$(inherited)", 833 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 834 | "$(SRCROOT)/../node_modules/react-native/React/**", 835 | "$(SRCROOT)/../node_modules/react-native-image-picker/ios", 836 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 837 | ); 838 | INFOPLIST_FILE = feed/Info.plist; 839 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 840 | OTHER_LDFLAGS = ( 841 | "$(inherited)", 842 | "-ObjC", 843 | "-lc++", 844 | ); 845 | PRODUCT_NAME = feed; 846 | VERSIONING_SYSTEM = "apple-generic"; 847 | }; 848 | name = Debug; 849 | }; 850 | 13B07F951A680F5B00A75B9A /* Release */ = { 851 | isa = XCBuildConfiguration; 852 | buildSettings = { 853 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 854 | CURRENT_PROJECT_VERSION = 1; 855 | HEADER_SEARCH_PATHS = ( 856 | "$(inherited)", 857 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 858 | "$(SRCROOT)/../node_modules/react-native/React/**", 859 | "$(SRCROOT)/../node_modules/react-native-image-picker/ios", 860 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 861 | ); 862 | INFOPLIST_FILE = feed/Info.plist; 863 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 864 | OTHER_LDFLAGS = ( 865 | "$(inherited)", 866 | "-ObjC", 867 | "-lc++", 868 | ); 869 | PRODUCT_NAME = feed; 870 | VERSIONING_SYSTEM = "apple-generic"; 871 | }; 872 | name = Release; 873 | }; 874 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 875 | isa = XCBuildConfiguration; 876 | buildSettings = { 877 | ALWAYS_SEARCH_USER_PATHS = NO; 878 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 879 | CLANG_CXX_LIBRARY = "libc++"; 880 | CLANG_ENABLE_MODULES = YES; 881 | CLANG_ENABLE_OBJC_ARC = YES; 882 | CLANG_WARN_BOOL_CONVERSION = YES; 883 | CLANG_WARN_CONSTANT_CONVERSION = YES; 884 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 885 | CLANG_WARN_EMPTY_BODY = YES; 886 | CLANG_WARN_ENUM_CONVERSION = YES; 887 | CLANG_WARN_INT_CONVERSION = YES; 888 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 889 | CLANG_WARN_UNREACHABLE_CODE = YES; 890 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 891 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 892 | COPY_PHASE_STRIP = NO; 893 | ENABLE_STRICT_OBJC_MSGSEND = YES; 894 | GCC_C_LANGUAGE_STANDARD = gnu99; 895 | GCC_DYNAMIC_NO_PIC = NO; 896 | GCC_OPTIMIZATION_LEVEL = 0; 897 | GCC_PREPROCESSOR_DEFINITIONS = ( 898 | "DEBUG=1", 899 | "$(inherited)", 900 | ); 901 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 902 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 903 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 904 | GCC_WARN_UNDECLARED_SELECTOR = YES; 905 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 906 | GCC_WARN_UNUSED_FUNCTION = YES; 907 | GCC_WARN_UNUSED_VARIABLE = YES; 908 | HEADER_SEARCH_PATHS = ( 909 | "$(inherited)", 910 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 911 | "$(SRCROOT)/../node_modules/react-native/React/**", 912 | "$(SRCROOT)/../node_modules/react-native-image-picker/ios", 913 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 914 | ); 915 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 916 | MTL_ENABLE_DEBUG_INFO = YES; 917 | ONLY_ACTIVE_ARCH = YES; 918 | SDKROOT = iphoneos; 919 | }; 920 | name = Debug; 921 | }; 922 | 83CBBA211A601CBA00E9B192 /* Release */ = { 923 | isa = XCBuildConfiguration; 924 | buildSettings = { 925 | ALWAYS_SEARCH_USER_PATHS = NO; 926 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 927 | CLANG_CXX_LIBRARY = "libc++"; 928 | CLANG_ENABLE_MODULES = YES; 929 | CLANG_ENABLE_OBJC_ARC = YES; 930 | CLANG_WARN_BOOL_CONVERSION = YES; 931 | CLANG_WARN_CONSTANT_CONVERSION = YES; 932 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 933 | CLANG_WARN_EMPTY_BODY = YES; 934 | CLANG_WARN_ENUM_CONVERSION = YES; 935 | CLANG_WARN_INT_CONVERSION = YES; 936 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 937 | CLANG_WARN_UNREACHABLE_CODE = YES; 938 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 939 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 940 | COPY_PHASE_STRIP = YES; 941 | ENABLE_NS_ASSERTIONS = NO; 942 | ENABLE_STRICT_OBJC_MSGSEND = YES; 943 | GCC_C_LANGUAGE_STANDARD = gnu99; 944 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 945 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 946 | GCC_WARN_UNDECLARED_SELECTOR = YES; 947 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 948 | GCC_WARN_UNUSED_FUNCTION = YES; 949 | GCC_WARN_UNUSED_VARIABLE = YES; 950 | HEADER_SEARCH_PATHS = ( 951 | "$(inherited)", 952 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 953 | "$(SRCROOT)/../node_modules/react-native/React/**", 954 | "$(SRCROOT)/../node_modules/react-native-image-picker/ios", 955 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", 956 | ); 957 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 958 | MTL_ENABLE_DEBUG_INFO = NO; 959 | SDKROOT = iphoneos; 960 | VALIDATE_PRODUCT = YES; 961 | }; 962 | name = Release; 963 | }; 964 | /* End XCBuildConfiguration section */ 965 | 966 | /* Begin XCConfigurationList section */ 967 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "feedTests" */ = { 968 | isa = XCConfigurationList; 969 | buildConfigurations = ( 970 | 00E356F61AD99517003FC87E /* Debug */, 971 | 00E356F71AD99517003FC87E /* Release */, 972 | ); 973 | defaultConfigurationIsVisible = 0; 974 | defaultConfigurationName = Release; 975 | }; 976 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "feed" */ = { 977 | isa = XCConfigurationList; 978 | buildConfigurations = ( 979 | 13B07F941A680F5B00A75B9A /* Debug */, 980 | 13B07F951A680F5B00A75B9A /* Release */, 981 | ); 982 | defaultConfigurationIsVisible = 0; 983 | defaultConfigurationName = Release; 984 | }; 985 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "feed" */ = { 986 | isa = XCConfigurationList; 987 | buildConfigurations = ( 988 | 83CBBA201A601CBA00E9B192 /* Debug */, 989 | 83CBBA211A601CBA00E9B192 /* Release */, 990 | ); 991 | defaultConfigurationIsVisible = 0; 992 | defaultConfigurationName = Release; 993 | }; 994 | /* End XCConfigurationList section */ 995 | }; 996 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 997 | } 998 | --------------------------------------------------------------------------------